gtfs-guru 0.1.0__tar.gz → 0.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/Cargo.lock +159 -9
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/Cargo.toml +10 -2
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/PKG-INFO +20 -19
- {gtfs_guru-0.1.0/crates/gtfs_validator_python → gtfs_guru-0.9.0}/README.md +18 -18
- gtfs_guru-0.9.0/crates/gtfs_model/Cargo.toml +13 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_model/src/lib.rs +256 -157
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/Cargo.toml +13 -3
- gtfs_guru-0.9.0/crates/gtfs_validator_core/benches/benchmark_loading.rs +30 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/benches/benchmark_shape_matching.rs +56 -74
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/csv_reader.rs +459 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/csv_schema.rs +7 -2
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/csv_validation.rs +1071 -267
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/engine.rs +33 -22
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/feed.rs +1354 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/geojson.rs +110 -78
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/input.rs +531 -66
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/lib.rs +17 -4
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/notice.rs +12 -12
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/notice_schema.rs +2 -2
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/progress.rs +46 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/agency_consistency.rs +51 -105
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/attribution_without_role.rs +52 -75
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/bidirectional_exit_gate.rs +9 -9
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/bikes_allowance.rs +182 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/block_trips_with_overlapping_stop_times.rs +161 -166
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/booking_rules.rs +53 -42
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/calendar.rs +24 -21
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/calendar_presence.rs +7 -34
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/continuous_pickup_drop_off.rs +102 -39
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/date_trips.rs +64 -27
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/duplicate_fare_media.rs +27 -25
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/duplicate_key.rs +212 -99
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/duplicate_route_name.rs +33 -41
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/duplicate_stop_sequence.rs +66 -27
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/expired_calendar.rs +56 -89
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_attribute_agency_id.rs +26 -24
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_attributes.rs +9 -9
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_leg_join_rule.rs +37 -45
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_leg_rule_network_id_foreign_key.rs +32 -32
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_media_name.rs +11 -14
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_product_default_rider_categories.rs +67 -63
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_rules.rs +61 -38
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_transfer_rule_duration_limit.rs +9 -8
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_transfer_rule_transfer_count.rs +25 -32
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/feed_expiration_date.rs +75 -33
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/feed_info.rs +124 -45
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/feed_service_date.rs +18 -21
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/frequencies.rs +23 -34
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/google_rules.rs +33 -33
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/lat_lon.rs +43 -33
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/location_has_stop_times.rs +53 -49
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/location_id_foreign_key.rs +31 -29
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/location_type.rs +77 -110
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/locations_geojson_notices.rs +7 -34
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/locations_geojson_presence.rs +20 -17
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/matching_feed_and_agency_lang.rs +48 -84
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/missing_level_id.rs +46 -44
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/missing_stops_file.rs +22 -13
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/missing_trip_edge.rs +78 -47
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/network_id_consistency.rs +21 -19
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/overlapping_frequency.rs +24 -21
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/overlapping_pickup_drop_off_zone.rs +304 -0
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/parent_station.rs +327 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathway_dangling_generic_node.rs +42 -39
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathway_endpoint_type.rs +69 -64
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathway_loop.rs +21 -22
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathway_reachable_location.rs +105 -100
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathways.rs +25 -26
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pickup_booking_rule_id.rs +33 -33
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pickup_drop_off_type.rs +22 -22
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pickup_drop_off_window.rs +30 -30
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/referential_integrity.rs +1405 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/required_fields.rs +80 -34
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/required_non_empty.rs +7 -1
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/route_agency_id.rs +21 -23
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/route_color_contrast.rs +15 -15
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/routes.rs +56 -44
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/shape_to_stop_matching.rs +700 -283
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/shape_usage.rs +181 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/shapes.rs +42 -33
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/single_shape_point.rs +11 -10
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/stop_time_increasing_distance.rs +280 -0
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/stop_time_travel_speed.rs +928 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times.rs +29 -20
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times_geography_id_presence.rs +30 -44
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times_record.rs +38 -30
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times_shape_dist_presence.rs +48 -37
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times_time.rs +118 -71
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_zone_id.rs +55 -64
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stops.rs +25 -28
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/timeframe_overlap.rs +25 -29
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/timeframe_service_id_foreign_key.rs +42 -25
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/timeframe_start_and_end_time.rs +38 -36
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfer_distance.rs +41 -60
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers.rs +12 -9
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers_in_seat_transfer_type.rs +104 -114
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers_stop_ids_conditional.rs +55 -42
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers_stop_type.rs +32 -32
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers_trip_reference.rs +111 -127
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/translation_field_and_reference.rs +113 -105
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/trip_service_id_foreign_key.rs +46 -27
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/trip_shape_distance.rs +370 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/trips.rs +49 -33
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/unique_geography_id.rs +44 -49
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/unused_agency.rs +37 -38
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/unused_route.rs +33 -25
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/unused_stop.rs +50 -51
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/url_consistency.rs +94 -84
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/url_syntax.rs +64 -57
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/string_pool.rs +106 -0
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/table_status.rs +15 -0
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/timing.rs +264 -0
- gtfs_guru-0.9.0/crates/gtfs_validator_core/src/validation_context.rs +157 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/validator.rs +136 -13
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/tests/integration_tests.rs +46 -6
- gtfs_guru-0.9.0/crates/gtfs_validator_python/.cargo/config.toml +11 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_python/Cargo.toml +7 -4
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0/crates/gtfs_validator_python}/README.md +18 -18
- {gtfs_guru-0.1.0/crates/gtfs_validator_python/python/gtfs_validator → gtfs_guru-0.9.0/crates/gtfs_validator_python/python/gtfs_guru}/__init__.py +4 -4
- {gtfs_guru-0.1.0/crates/gtfs_validator_python/python/gtfs_validator → gtfs_guru-0.9.0/crates/gtfs_validator_python/python/gtfs_guru}/__init__.pyi +4 -4
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_python/src/lib.rs +65 -51
- gtfs_guru-0.9.0/crates/gtfs_validator_report/Cargo.toml +25 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_report/src/html.rs +414 -236
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_report/src/lib.rs +89 -94
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/pyproject.toml +1 -1
- gtfs_guru-0.9.0/python/gtfs_guru/__init__.py +31 -0
- gtfs_guru-0.9.0/python/gtfs_guru/__init__.pyi +234 -0
- gtfs_guru-0.9.0/python/gtfs_guru/py.typed +0 -0
- gtfs_guru-0.1.0/crates/gtfs_model/Cargo.toml +0 -10
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/csv_reader.rs +0 -234
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/feed.rs +0 -453
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/bikes_allowance.rs +0 -204
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/overlapping_pickup_drop_off_zone.rs +0 -271
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/parent_station.rs +0 -518
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/referential_integrity.rs +0 -843
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/shape_usage.rs +0 -110
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/stop_time_increasing_distance.rs +0 -248
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/stop_time_travel_speed.rs +0 -667
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/trip_shape_distance.rs +0 -339
- gtfs_guru-0.1.0/crates/gtfs_validator_core/src/validation_context.rs +0 -82
- gtfs_guru-0.1.0/crates/gtfs_validator_python/dist/gtfs_guru-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +0 -0
- gtfs_guru-0.1.0/crates/gtfs_validator_report/Cargo.toml +0 -16
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/build.rs +0 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/mod.rs +0 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/test_duplicate_repro.rs +0 -0
- {gtfs_guru-0.1.0/crates/gtfs_validator_python/python/gtfs_validator → gtfs_guru-0.9.0/crates/gtfs_validator_python/python/gtfs_guru}/py.typed +0 -0
- {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_report/src/sarif.rs +0 -0
|
@@ -414,6 +414,15 @@ version = "0.3.0"
|
|
|
414
414
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
415
415
|
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
|
416
416
|
|
|
417
|
+
[[package]]
|
|
418
|
+
name = "castaway"
|
|
419
|
+
version = "0.2.4"
|
|
420
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
421
|
+
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
|
422
|
+
dependencies = [
|
|
423
|
+
"rustversion",
|
|
424
|
+
]
|
|
425
|
+
|
|
417
426
|
[[package]]
|
|
418
427
|
name = "cc"
|
|
419
428
|
version = "1.2.50"
|
|
@@ -560,6 +569,21 @@ dependencies = [
|
|
|
560
569
|
"memchr",
|
|
561
570
|
]
|
|
562
571
|
|
|
572
|
+
[[package]]
|
|
573
|
+
name = "compact_str"
|
|
574
|
+
version = "0.9.0"
|
|
575
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
576
|
+
checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a"
|
|
577
|
+
dependencies = [
|
|
578
|
+
"castaway",
|
|
579
|
+
"cfg-if",
|
|
580
|
+
"itoa",
|
|
581
|
+
"rustversion",
|
|
582
|
+
"ryu",
|
|
583
|
+
"serde",
|
|
584
|
+
"static_assertions",
|
|
585
|
+
]
|
|
586
|
+
|
|
563
587
|
[[package]]
|
|
564
588
|
name = "concurrent-queue"
|
|
565
589
|
version = "2.5.0"
|
|
@@ -569,6 +593,19 @@ dependencies = [
|
|
|
569
593
|
"crossbeam-utils",
|
|
570
594
|
]
|
|
571
595
|
|
|
596
|
+
[[package]]
|
|
597
|
+
name = "console"
|
|
598
|
+
version = "0.16.2"
|
|
599
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
600
|
+
checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4"
|
|
601
|
+
dependencies = [
|
|
602
|
+
"encode_unicode",
|
|
603
|
+
"libc",
|
|
604
|
+
"once_cell",
|
|
605
|
+
"unicode-width",
|
|
606
|
+
"windows-sys 0.61.2",
|
|
607
|
+
]
|
|
608
|
+
|
|
572
609
|
[[package]]
|
|
573
610
|
name = "console_error_panic_hook"
|
|
574
611
|
version = "0.1.7"
|
|
@@ -842,6 +879,20 @@ dependencies = [
|
|
|
842
879
|
"syn 2.0.111",
|
|
843
880
|
]
|
|
844
881
|
|
|
882
|
+
[[package]]
|
|
883
|
+
name = "dashmap"
|
|
884
|
+
version = "6.1.0"
|
|
885
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
886
|
+
checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf"
|
|
887
|
+
dependencies = [
|
|
888
|
+
"cfg-if",
|
|
889
|
+
"crossbeam-utils",
|
|
890
|
+
"hashbrown 0.14.5",
|
|
891
|
+
"lock_api",
|
|
892
|
+
"once_cell",
|
|
893
|
+
"parking_lot_core",
|
|
894
|
+
]
|
|
895
|
+
|
|
845
896
|
[[package]]
|
|
846
897
|
name = "deranged"
|
|
847
898
|
version = "0.5.5"
|
|
@@ -1025,6 +1076,12 @@ version = "1.2.2"
|
|
|
1025
1076
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1026
1077
|
checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
|
|
1027
1078
|
|
|
1079
|
+
[[package]]
|
|
1080
|
+
name = "encode_unicode"
|
|
1081
|
+
version = "1.0.0"
|
|
1082
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1083
|
+
checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
|
|
1084
|
+
|
|
1028
1085
|
[[package]]
|
|
1029
1086
|
name = "encoding_rs"
|
|
1030
1087
|
version = "0.8.35"
|
|
@@ -1572,14 +1629,16 @@ dependencies = [
|
|
|
1572
1629
|
]
|
|
1573
1630
|
|
|
1574
1631
|
[[package]]
|
|
1575
|
-
name = "gtfs-guru
|
|
1576
|
-
version = "0.
|
|
1632
|
+
name = "gtfs-guru"
|
|
1633
|
+
version = "0.9.0"
|
|
1577
1634
|
dependencies = [
|
|
1578
1635
|
"anyhow",
|
|
1579
1636
|
"chrono",
|
|
1580
1637
|
"clap",
|
|
1581
1638
|
"gtfs-guru-core",
|
|
1582
1639
|
"gtfs-guru-report",
|
|
1640
|
+
"indicatif",
|
|
1641
|
+
"mimalloc",
|
|
1583
1642
|
"reqwest 0.12.28",
|
|
1584
1643
|
"serde_json",
|
|
1585
1644
|
"tracing",
|
|
@@ -1588,15 +1647,19 @@ dependencies = [
|
|
|
1588
1647
|
|
|
1589
1648
|
[[package]]
|
|
1590
1649
|
name = "gtfs-guru-core"
|
|
1591
|
-
version = "0.
|
|
1650
|
+
version = "0.9.0"
|
|
1592
1651
|
dependencies = [
|
|
1593
1652
|
"anyhow",
|
|
1594
1653
|
"chrono",
|
|
1654
|
+
"compact_str",
|
|
1595
1655
|
"criterion",
|
|
1596
1656
|
"csv",
|
|
1657
|
+
"dashmap",
|
|
1597
1658
|
"gtfs-guru-model",
|
|
1598
1659
|
"rayon",
|
|
1599
1660
|
"regex",
|
|
1661
|
+
"rstar",
|
|
1662
|
+
"rustc-hash",
|
|
1600
1663
|
"serde",
|
|
1601
1664
|
"serde_json",
|
|
1602
1665
|
"thiserror 1.0.69",
|
|
@@ -1607,7 +1670,7 @@ dependencies = [
|
|
|
1607
1670
|
|
|
1608
1671
|
[[package]]
|
|
1609
1672
|
name = "gtfs-guru-gui"
|
|
1610
|
-
version = "0.
|
|
1673
|
+
version = "0.9.0"
|
|
1611
1674
|
dependencies = [
|
|
1612
1675
|
"anyhow",
|
|
1613
1676
|
"chrono",
|
|
@@ -1620,25 +1683,28 @@ dependencies = [
|
|
|
1620
1683
|
"tauri-build",
|
|
1621
1684
|
"tauri-plugin-dialog",
|
|
1622
1685
|
"tauri-plugin-shell",
|
|
1686
|
+
"url",
|
|
1623
1687
|
"uuid",
|
|
1624
1688
|
]
|
|
1625
1689
|
|
|
1626
1690
|
[[package]]
|
|
1627
1691
|
name = "gtfs-guru-model"
|
|
1628
|
-
version = "0.
|
|
1692
|
+
version = "0.9.0"
|
|
1629
1693
|
dependencies = [
|
|
1630
1694
|
"chrono",
|
|
1695
|
+
"compact_str",
|
|
1631
1696
|
"serde",
|
|
1632
1697
|
"thiserror 1.0.69",
|
|
1633
1698
|
]
|
|
1634
1699
|
|
|
1635
1700
|
[[package]]
|
|
1636
1701
|
name = "gtfs-guru-python"
|
|
1637
|
-
version = "0.
|
|
1702
|
+
version = "0.9.0"
|
|
1638
1703
|
dependencies = [
|
|
1639
1704
|
"chrono",
|
|
1640
1705
|
"gtfs-guru-core",
|
|
1641
1706
|
"gtfs-guru-report",
|
|
1707
|
+
"mimalloc",
|
|
1642
1708
|
"pyo3",
|
|
1643
1709
|
"pyo3-async-runtimes",
|
|
1644
1710
|
"serde_json",
|
|
@@ -1647,22 +1713,26 @@ dependencies = [
|
|
|
1647
1713
|
|
|
1648
1714
|
[[package]]
|
|
1649
1715
|
name = "gtfs-guru-report"
|
|
1650
|
-
version = "0.
|
|
1716
|
+
version = "0.9.0"
|
|
1651
1717
|
dependencies = [
|
|
1652
1718
|
"anyhow",
|
|
1653
1719
|
"chrono",
|
|
1720
|
+
"compact_str",
|
|
1654
1721
|
"gtfs-guru-core",
|
|
1655
1722
|
"gtfs-guru-model",
|
|
1723
|
+
"rustc-hash",
|
|
1656
1724
|
"serde",
|
|
1657
1725
|
"serde_json",
|
|
1658
1726
|
]
|
|
1659
1727
|
|
|
1660
1728
|
[[package]]
|
|
1661
1729
|
name = "gtfs-guru-wasm"
|
|
1662
|
-
version = "0.
|
|
1730
|
+
version = "0.9.0"
|
|
1663
1731
|
dependencies = [
|
|
1732
|
+
"chrono",
|
|
1664
1733
|
"console_error_panic_hook",
|
|
1665
1734
|
"gtfs-guru-core",
|
|
1735
|
+
"gtfs-guru-report",
|
|
1666
1736
|
"js-sys",
|
|
1667
1737
|
"serde",
|
|
1668
1738
|
"serde_json",
|
|
@@ -1672,7 +1742,7 @@ dependencies = [
|
|
|
1672
1742
|
|
|
1673
1743
|
[[package]]
|
|
1674
1744
|
name = "gtfs-guru-web"
|
|
1675
|
-
version = "0.
|
|
1745
|
+
version = "0.9.0"
|
|
1676
1746
|
dependencies = [
|
|
1677
1747
|
"anyhow",
|
|
1678
1748
|
"axum",
|
|
@@ -1769,18 +1839,43 @@ dependencies = [
|
|
|
1769
1839
|
"zerocopy",
|
|
1770
1840
|
]
|
|
1771
1841
|
|
|
1842
|
+
[[package]]
|
|
1843
|
+
name = "hash32"
|
|
1844
|
+
version = "0.3.1"
|
|
1845
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1846
|
+
checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
|
|
1847
|
+
dependencies = [
|
|
1848
|
+
"byteorder",
|
|
1849
|
+
]
|
|
1850
|
+
|
|
1772
1851
|
[[package]]
|
|
1773
1852
|
name = "hashbrown"
|
|
1774
1853
|
version = "0.12.3"
|
|
1775
1854
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1776
1855
|
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
|
1777
1856
|
|
|
1857
|
+
[[package]]
|
|
1858
|
+
name = "hashbrown"
|
|
1859
|
+
version = "0.14.5"
|
|
1860
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1861
|
+
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
|
1862
|
+
|
|
1778
1863
|
[[package]]
|
|
1779
1864
|
name = "hashbrown"
|
|
1780
1865
|
version = "0.16.1"
|
|
1781
1866
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1782
1867
|
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
|
1783
1868
|
|
|
1869
|
+
[[package]]
|
|
1870
|
+
name = "heapless"
|
|
1871
|
+
version = "0.8.0"
|
|
1872
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1873
|
+
checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
|
|
1874
|
+
dependencies = [
|
|
1875
|
+
"hash32",
|
|
1876
|
+
"stable_deref_trait",
|
|
1877
|
+
]
|
|
1878
|
+
|
|
1784
1879
|
[[package]]
|
|
1785
1880
|
name = "heck"
|
|
1786
1881
|
version = "0.4.1"
|
|
@@ -2163,6 +2258,19 @@ dependencies = [
|
|
|
2163
2258
|
"serde_core",
|
|
2164
2259
|
]
|
|
2165
2260
|
|
|
2261
|
+
[[package]]
|
|
2262
|
+
name = "indicatif"
|
|
2263
|
+
version = "0.18.3"
|
|
2264
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2265
|
+
checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88"
|
|
2266
|
+
dependencies = [
|
|
2267
|
+
"console",
|
|
2268
|
+
"portable-atomic",
|
|
2269
|
+
"unicode-width",
|
|
2270
|
+
"unit-prefix",
|
|
2271
|
+
"web-time",
|
|
2272
|
+
]
|
|
2273
|
+
|
|
2166
2274
|
[[package]]
|
|
2167
2275
|
name = "indoc"
|
|
2168
2276
|
version = "2.0.7"
|
|
@@ -2410,6 +2518,16 @@ version = "0.2.15"
|
|
|
2410
2518
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2411
2519
|
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
|
|
2412
2520
|
|
|
2521
|
+
[[package]]
|
|
2522
|
+
name = "libmimalloc-sys"
|
|
2523
|
+
version = "0.1.44"
|
|
2524
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2525
|
+
checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870"
|
|
2526
|
+
dependencies = [
|
|
2527
|
+
"cc",
|
|
2528
|
+
"libc",
|
|
2529
|
+
]
|
|
2530
|
+
|
|
2413
2531
|
[[package]]
|
|
2414
2532
|
name = "libredox"
|
|
2415
2533
|
version = "0.1.12"
|
|
@@ -2511,6 +2629,15 @@ dependencies = [
|
|
|
2511
2629
|
"autocfg",
|
|
2512
2630
|
]
|
|
2513
2631
|
|
|
2632
|
+
[[package]]
|
|
2633
|
+
name = "mimalloc"
|
|
2634
|
+
version = "0.1.48"
|
|
2635
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2636
|
+
checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8"
|
|
2637
|
+
dependencies = [
|
|
2638
|
+
"libmimalloc-sys",
|
|
2639
|
+
]
|
|
2640
|
+
|
|
2514
2641
|
[[package]]
|
|
2515
2642
|
name = "mime"
|
|
2516
2643
|
version = "0.3.17"
|
|
@@ -3871,6 +3998,17 @@ dependencies = [
|
|
|
3871
3998
|
"windows-sys 0.52.0",
|
|
3872
3999
|
]
|
|
3873
4000
|
|
|
4001
|
+
[[package]]
|
|
4002
|
+
name = "rstar"
|
|
4003
|
+
version = "0.12.2"
|
|
4004
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
4005
|
+
checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb"
|
|
4006
|
+
dependencies = [
|
|
4007
|
+
"heapless",
|
|
4008
|
+
"num-traits",
|
|
4009
|
+
"smallvec",
|
|
4010
|
+
]
|
|
4011
|
+
|
|
3874
4012
|
[[package]]
|
|
3875
4013
|
name = "rustc-hash"
|
|
3876
4014
|
version = "2.1.1"
|
|
@@ -5471,12 +5609,24 @@ version = "1.12.0"
|
|
|
5471
5609
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
5472
5610
|
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
|
|
5473
5611
|
|
|
5612
|
+
[[package]]
|
|
5613
|
+
name = "unicode-width"
|
|
5614
|
+
version = "0.2.2"
|
|
5615
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
5616
|
+
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
|
|
5617
|
+
|
|
5474
5618
|
[[package]]
|
|
5475
5619
|
name = "unindent"
|
|
5476
5620
|
version = "0.2.4"
|
|
5477
5621
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
5478
5622
|
checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
|
5479
5623
|
|
|
5624
|
+
[[package]]
|
|
5625
|
+
name = "unit-prefix"
|
|
5626
|
+
version = "0.5.2"
|
|
5627
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
5628
|
+
checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3"
|
|
5629
|
+
|
|
5480
5630
|
[[package]]
|
|
5481
5631
|
name = "untrusted"
|
|
5482
5632
|
version = "0.9.0"
|
|
@@ -14,6 +14,7 @@ serde_json = "1.0"
|
|
|
14
14
|
chrono = "0.4"
|
|
15
15
|
csv = "1.3"
|
|
16
16
|
zip = { version = "0.6", default-features = false, features = ["deflate"] }
|
|
17
|
+
flate2 = { version = "1.0", default-features = false, features = ["rust_backend"] }
|
|
17
18
|
clap = { version = "4.5", features = ["derive"] }
|
|
18
19
|
reqwest = { version = "0.12", default-features = false, features = ["blocking", "rustls-tls"] }
|
|
19
20
|
regex = "1.10"
|
|
@@ -25,9 +26,16 @@ tower = "0.4"
|
|
|
25
26
|
tracing = "0.1"
|
|
26
27
|
tracing-subscriber = "0.3"
|
|
27
28
|
|
|
28
|
-
#
|
|
29
|
+
# Release profile tuned for CLI speed; use release-wasm for size.
|
|
29
30
|
[profile.release]
|
|
31
|
+
lto = "thin"
|
|
32
|
+
opt-level = 3
|
|
33
|
+
codegen-units = 1
|
|
34
|
+
debug = true # Enable symbols for profiling (flamegraph)
|
|
35
|
+
|
|
36
|
+
# WASM profile optimized for minimal binary size.
|
|
37
|
+
[profile.release-wasm]
|
|
38
|
+
inherits = "release"
|
|
30
39
|
lto = true
|
|
31
40
|
opt-level = 'z'
|
|
32
|
-
codegen-units = 1
|
|
33
41
|
strip = true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gtfs-guru
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
@@ -14,20 +14,21 @@ Classifier: Programming Language :: Rust
|
|
|
14
14
|
Classifier: Topic :: Scientific/Engineering :: GIS
|
|
15
15
|
Summary: Fast GTFS validator written in Rust
|
|
16
16
|
Keywords: gtfs,transit,validator,public-transit
|
|
17
|
+
Home-Page: https://github.com/abasis-ltd/gtfs.guru
|
|
17
18
|
License: Apache-2.0
|
|
18
19
|
Requires-Python: >=3.8
|
|
19
20
|
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
20
21
|
Project-URL: Homepage, https://github.com/abasis-ltd/gtfs.guru
|
|
21
22
|
Project-URL: Repository, https://github.com/abasis-ltd/gtfs.guru
|
|
22
23
|
|
|
23
|
-
# GTFS
|
|
24
|
+
# GTFS Guru Python
|
|
24
25
|
|
|
25
26
|
High-performance GTFS feed validator with Python bindings. Written in Rust, exposed via PyO3.
|
|
26
27
|
|
|
27
28
|
## Installation
|
|
28
29
|
|
|
29
30
|
```bash
|
|
30
|
-
pip install gtfs-
|
|
31
|
+
pip install gtfs-guru
|
|
31
32
|
```
|
|
32
33
|
|
|
33
34
|
### From Source
|
|
@@ -35,16 +36,16 @@ pip install gtfs-validator
|
|
|
35
36
|
```bash
|
|
36
37
|
pip install maturin
|
|
37
38
|
maturin build --release
|
|
38
|
-
pip install target/wheels/
|
|
39
|
+
pip install target/wheels/gtfs_guru-*.whl
|
|
39
40
|
```
|
|
40
41
|
|
|
41
42
|
## Quick Start
|
|
42
43
|
|
|
43
44
|
```python
|
|
44
|
-
import
|
|
45
|
+
import gtfs_guru
|
|
45
46
|
|
|
46
47
|
# Validate a GTFS feed
|
|
47
|
-
result =
|
|
48
|
+
result = gtfs_guru.validate("/path/to/gtfs.zip")
|
|
48
49
|
|
|
49
50
|
print(f"Valid: {result.is_valid}")
|
|
50
51
|
print(f"Errors: {result.error_count}")
|
|
@@ -72,7 +73,7 @@ Validate a GTFS feed.
|
|
|
72
73
|
|
|
73
74
|
**Example:**
|
|
74
75
|
```python
|
|
75
|
-
result =
|
|
76
|
+
result = gtfs_guru.validate(
|
|
76
77
|
"/path/to/gtfs.zip",
|
|
77
78
|
country_code="US",
|
|
78
79
|
date="2025-01-15"
|
|
@@ -97,7 +98,7 @@ async def main():
|
|
|
97
98
|
def on_progress(info):
|
|
98
99
|
print(f"{info.stage}: {info.current}/{info.total}")
|
|
99
100
|
|
|
100
|
-
result = await
|
|
101
|
+
result = await gtfs_guru.validate_async(
|
|
101
102
|
"/path/to/gtfs.zip",
|
|
102
103
|
on_progress=on_progress
|
|
103
104
|
)
|
|
@@ -110,8 +111,8 @@ asyncio.run(main())
|
|
|
110
111
|
Get validator version.
|
|
111
112
|
|
|
112
113
|
```python
|
|
113
|
-
>>>
|
|
114
|
-
'0.
|
|
114
|
+
>>> gtfs_guru.version()
|
|
115
|
+
'0.9.0'
|
|
115
116
|
```
|
|
116
117
|
|
|
117
118
|
#### `notice_codes() -> list[str]`
|
|
@@ -119,9 +120,9 @@ Get validator version.
|
|
|
119
120
|
Get list of all available notice codes.
|
|
120
121
|
|
|
121
122
|
```python
|
|
122
|
-
>>> len(
|
|
123
|
+
>>> len(gtfs_guru.notice_codes())
|
|
123
124
|
164
|
|
124
|
-
>>>
|
|
125
|
+
>>> gtfs_guru.notice_codes()[:3]
|
|
125
126
|
['attribution_without_role', 'bidirectional_exit_gate', 'block_trips_with_overlapping_stop_times']
|
|
126
127
|
```
|
|
127
128
|
|
|
@@ -130,7 +131,7 @@ Get list of all available notice codes.
|
|
|
130
131
|
Get schema for all notice types with descriptions and severity levels.
|
|
131
132
|
|
|
132
133
|
```python
|
|
133
|
-
>>> schema =
|
|
134
|
+
>>> schema = gtfs_guru.notice_schema()
|
|
134
135
|
>>> schema['missing_required_field']
|
|
135
136
|
{'severity': 'ERROR', 'description': '...'}
|
|
136
137
|
```
|
|
@@ -198,9 +199,9 @@ ctx = notice.context() # dict[str, Any]
|
|
|
198
199
|
### Basic Validation
|
|
199
200
|
|
|
200
201
|
```python
|
|
201
|
-
import
|
|
202
|
+
import gtfs_guru
|
|
202
203
|
|
|
203
|
-
result =
|
|
204
|
+
result = gtfs_guru.validate("/path/to/gtfs.zip")
|
|
204
205
|
|
|
205
206
|
if result.is_valid:
|
|
206
207
|
print("Feed is valid!")
|
|
@@ -215,7 +216,7 @@ else:
|
|
|
215
216
|
```python
|
|
216
217
|
from collections import Counter
|
|
217
218
|
|
|
218
|
-
result =
|
|
219
|
+
result = gtfs_guru.validate("/path/to/gtfs.zip")
|
|
219
220
|
|
|
220
221
|
# Count notices by code
|
|
221
222
|
error_counts = Counter(e.code for e in result.errors())
|
|
@@ -233,7 +234,7 @@ for notice in result.by_code("missing_required_field"):
|
|
|
233
234
|
### Save Reports
|
|
234
235
|
|
|
235
236
|
```python
|
|
236
|
-
result =
|
|
237
|
+
result = gtfs_guru.validate("/path/to/gtfs.zip")
|
|
237
238
|
|
|
238
239
|
# Save JSON report (same format as Java validator)
|
|
239
240
|
result.save_json("report.json")
|
|
@@ -252,13 +253,13 @@ print(f"Routes: {summary.get('routes', {}).get('count', 0)}")
|
|
|
252
253
|
|
|
253
254
|
```python
|
|
254
255
|
# Validate for specific country (affects some rules)
|
|
255
|
-
result =
|
|
256
|
+
result = gtfs_guru.validate(
|
|
256
257
|
"/path/to/gtfs.zip",
|
|
257
258
|
country_code="DE"
|
|
258
259
|
)
|
|
259
260
|
|
|
260
261
|
# Validate as of specific date
|
|
261
|
-
result =
|
|
262
|
+
result = gtfs_guru.validate(
|
|
262
263
|
"/path/to/gtfs.zip",
|
|
263
264
|
date="2025-06-01"
|
|
264
265
|
)
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# GTFS
|
|
1
|
+
# GTFS Guru Python
|
|
2
2
|
|
|
3
3
|
High-performance GTFS feed validator with Python bindings. Written in Rust, exposed via PyO3.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
pip install gtfs-
|
|
8
|
+
pip install gtfs-guru
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
### From Source
|
|
@@ -13,16 +13,16 @@ pip install gtfs-validator
|
|
|
13
13
|
```bash
|
|
14
14
|
pip install maturin
|
|
15
15
|
maturin build --release
|
|
16
|
-
pip install target/wheels/
|
|
16
|
+
pip install target/wheels/gtfs_guru-*.whl
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
## Quick Start
|
|
20
20
|
|
|
21
21
|
```python
|
|
22
|
-
import
|
|
22
|
+
import gtfs_guru
|
|
23
23
|
|
|
24
24
|
# Validate a GTFS feed
|
|
25
|
-
result =
|
|
25
|
+
result = gtfs_guru.validate("/path/to/gtfs.zip")
|
|
26
26
|
|
|
27
27
|
print(f"Valid: {result.is_valid}")
|
|
28
28
|
print(f"Errors: {result.error_count}")
|
|
@@ -50,7 +50,7 @@ Validate a GTFS feed.
|
|
|
50
50
|
|
|
51
51
|
**Example:**
|
|
52
52
|
```python
|
|
53
|
-
result =
|
|
53
|
+
result = gtfs_guru.validate(
|
|
54
54
|
"/path/to/gtfs.zip",
|
|
55
55
|
country_code="US",
|
|
56
56
|
date="2025-01-15"
|
|
@@ -75,7 +75,7 @@ async def main():
|
|
|
75
75
|
def on_progress(info):
|
|
76
76
|
print(f"{info.stage}: {info.current}/{info.total}")
|
|
77
77
|
|
|
78
|
-
result = await
|
|
78
|
+
result = await gtfs_guru.validate_async(
|
|
79
79
|
"/path/to/gtfs.zip",
|
|
80
80
|
on_progress=on_progress
|
|
81
81
|
)
|
|
@@ -88,8 +88,8 @@ asyncio.run(main())
|
|
|
88
88
|
Get validator version.
|
|
89
89
|
|
|
90
90
|
```python
|
|
91
|
-
>>>
|
|
92
|
-
'0.
|
|
91
|
+
>>> gtfs_guru.version()
|
|
92
|
+
'0.9.0'
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
#### `notice_codes() -> list[str]`
|
|
@@ -97,9 +97,9 @@ Get validator version.
|
|
|
97
97
|
Get list of all available notice codes.
|
|
98
98
|
|
|
99
99
|
```python
|
|
100
|
-
>>> len(
|
|
100
|
+
>>> len(gtfs_guru.notice_codes())
|
|
101
101
|
164
|
|
102
|
-
>>>
|
|
102
|
+
>>> gtfs_guru.notice_codes()[:3]
|
|
103
103
|
['attribution_without_role', 'bidirectional_exit_gate', 'block_trips_with_overlapping_stop_times']
|
|
104
104
|
```
|
|
105
105
|
|
|
@@ -108,7 +108,7 @@ Get list of all available notice codes.
|
|
|
108
108
|
Get schema for all notice types with descriptions and severity levels.
|
|
109
109
|
|
|
110
110
|
```python
|
|
111
|
-
>>> schema =
|
|
111
|
+
>>> schema = gtfs_guru.notice_schema()
|
|
112
112
|
>>> schema['missing_required_field']
|
|
113
113
|
{'severity': 'ERROR', 'description': '...'}
|
|
114
114
|
```
|
|
@@ -176,9 +176,9 @@ ctx = notice.context() # dict[str, Any]
|
|
|
176
176
|
### Basic Validation
|
|
177
177
|
|
|
178
178
|
```python
|
|
179
|
-
import
|
|
179
|
+
import gtfs_guru
|
|
180
180
|
|
|
181
|
-
result =
|
|
181
|
+
result = gtfs_guru.validate("/path/to/gtfs.zip")
|
|
182
182
|
|
|
183
183
|
if result.is_valid:
|
|
184
184
|
print("Feed is valid!")
|
|
@@ -193,7 +193,7 @@ else:
|
|
|
193
193
|
```python
|
|
194
194
|
from collections import Counter
|
|
195
195
|
|
|
196
|
-
result =
|
|
196
|
+
result = gtfs_guru.validate("/path/to/gtfs.zip")
|
|
197
197
|
|
|
198
198
|
# Count notices by code
|
|
199
199
|
error_counts = Counter(e.code for e in result.errors())
|
|
@@ -211,7 +211,7 @@ for notice in result.by_code("missing_required_field"):
|
|
|
211
211
|
### Save Reports
|
|
212
212
|
|
|
213
213
|
```python
|
|
214
|
-
result =
|
|
214
|
+
result = gtfs_guru.validate("/path/to/gtfs.zip")
|
|
215
215
|
|
|
216
216
|
# Save JSON report (same format as Java validator)
|
|
217
217
|
result.save_json("report.json")
|
|
@@ -230,13 +230,13 @@ print(f"Routes: {summary.get('routes', {}).get('count', 0)}")
|
|
|
230
230
|
|
|
231
231
|
```python
|
|
232
232
|
# Validate for specific country (affects some rules)
|
|
233
|
-
result =
|
|
233
|
+
result = gtfs_guru.validate(
|
|
234
234
|
"/path/to/gtfs.zip",
|
|
235
235
|
country_code="DE"
|
|
236
236
|
)
|
|
237
237
|
|
|
238
238
|
# Validate as of specific date
|
|
239
|
-
result =
|
|
239
|
+
result = gtfs_guru.validate(
|
|
240
240
|
"/path/to/gtfs.zip",
|
|
241
241
|
date="2025-06-01"
|
|
242
242
|
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "gtfs-guru-model"
|
|
3
|
+
version = "0.9.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
license = "Apache-2.0"
|
|
6
|
+
description = "Data models for GTFS (General Transit Feed Specification)"
|
|
7
|
+
repository = "https://github.com/abasis-ltd/gtfs.guru"
|
|
8
|
+
homepage = "https://github.com/abasis-ltd/gtfs.guru"
|
|
9
|
+
[dependencies]
|
|
10
|
+
chrono = { workspace = true }
|
|
11
|
+
compact_str = { version = "0.9.0", features = ["serde"] }
|
|
12
|
+
serde = { workspace = true }
|
|
13
|
+
thiserror = { workspace = true }
|