From 09df2f2773e8ba1ec5de9d31ef58fc29b73e1038 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup Date: Tue, 13 Oct 2026 15:34:41 -0400 Subject: [PATCH] fix(GtfsPlusValidation): Tolerate FaresV2 fields in rider_categories.txt. --- src/main/resources/gtfs/gtfsplus.yml | 25 +++++++++++++++++++ .../gtfsplus/GtfsPlusValidationTest.java | 14 +++++++++-- .../rider_categories.txt | 2 +- .../rider_categories.txt | 3 +++ 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/com/conveyal/datatools/gtfs/rider-categories-faresv2/rider_categories.txt diff --git a/src/main/resources/gtfs/gtfsplus.yml b/src/main/resources/gtfs/gtfsplus.yml index 805cbb723..030e875c5 100644 --- a/src/main/resources/gtfs/gtfsplus.yml +++ b/src/main/resources/gtfs/gtfsplus.yml @@ -243,6 +243,31 @@ maxLength: 256 columnWidth: 6 helpContent: Rider category as it should appear on 511.org, such as Child (ages 5-11), Seniors (Ages 62 & Up) + # Below are Fares V2 fields from the GTFS spec that are not part of GTFS+. + # These fields are marked optional for GTFS+ validation purposes. + # (This file does not cover the GTFS+ editor UI, which uses a separate settings file.) + - name: rider_category_name + required: false + inputType: TEXT + maxLength: 256 + columnWidth: 6 + helpContent: Rider category name for Fares V2 purposes + - name: is_default_fare_category + required: false + inputType: DROPDOWN + options: + - value: '0' + text: Not default + - value: '1' + text: Default + columnWidth: 2 + helpContent: Whether category is default for Fares V2 purposes + - name: eligibility_url + required: false + inputType: TEXT + maxLength: 256 + columnWidth: 6 + helpContent: URL for fare eligibility information - id: route_attributes name: route_attributes.txt diff --git a/src/test/java/com/conveyal/datatools/manager/gtfsplus/GtfsPlusValidationTest.java b/src/test/java/com/conveyal/datatools/manager/gtfsplus/GtfsPlusValidationTest.java index 29de47421..7e7da642c 100644 --- a/src/test/java/com/conveyal/datatools/manager/gtfsplus/GtfsPlusValidationTest.java +++ b/src/test/java/com/conveyal/datatools/manager/gtfsplus/GtfsPlusValidationTest.java @@ -224,12 +224,22 @@ void shouldReportCompleteDirectionsRealtimeRoutesFile() throws Exception { } @Test - void shouldDetectExtraGtfsPlusFields() throws Exception { + void shouldDetectRiderCategoriesNonFaresV2Fields() throws Exception { FeedVersion version = createFeedVersion(goldenGateFerry, zipFolderFiles("rider-categories-extra-fields")); GtfsPlusValidation validation = GtfsPlusValidation.validate(version.id); assertFalse( validation.issues.isEmpty(), - "Should have caught those extra non-GTFS+ fields in rider_category.txt." + "Should have caught those extra non-GTFS+/non-FaresV2 fields in rider_category.txt." + ); + } + + @Test + void shouldPassRiderCategoriesFaresV2Fields() throws Exception { + FeedVersion version = createFeedVersion(goldenGateFerry, zipFolderFiles("rider-categories-faresv2")); + GtfsPlusValidation validation = GtfsPlusValidation.validate(version.id); + assertTrue( + validation.issues.isEmpty(), + "Should pass the FaresV2 fields in rider_category.txt." ); } } diff --git a/src/test/resources/com/conveyal/datatools/gtfs/rider-categories-extra-fields/rider_categories.txt b/src/test/resources/com/conveyal/datatools/gtfs/rider-categories-extra-fields/rider_categories.txt index 5e7c99fc0..7b299a0ce 100644 --- a/src/test/resources/com/conveyal/datatools/gtfs/rider-categories-extra-fields/rider_categories.txt +++ b/src/test/resources/com/conveyal/datatools/gtfs/rider-categories-extra-fields/rider_categories.txt @@ -1,3 +1,3 @@ -rider_category_id,rider_category_description,rider_category_name +rider_category_id,rider_category_description,rider_category_somefield 1,Adult,Adult 2,Eligible Discount (Senior / Disabled / Medicare cardholder),Discounted diff --git a/src/test/resources/com/conveyal/datatools/gtfs/rider-categories-faresv2/rider_categories.txt b/src/test/resources/com/conveyal/datatools/gtfs/rider-categories-faresv2/rider_categories.txt new file mode 100644 index 000000000..0877a6ad8 --- /dev/null +++ b/src/test/resources/com/conveyal/datatools/gtfs/rider-categories-faresv2/rider_categories.txt @@ -0,0 +1,3 @@ +rider_category_id,rider_category_description,rider_category_name,is_default_fare_category,eligibility_url +1,Adult,Adult,1, +2,Eligible Discount (Senior / Disabled / Medicare cardholder),Discounted,0,https://eligibility.example.com