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.
Files changed (147) hide show
  1. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/Cargo.lock +159 -9
  2. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/Cargo.toml +10 -2
  3. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/PKG-INFO +20 -19
  4. {gtfs_guru-0.1.0/crates/gtfs_validator_python → gtfs_guru-0.9.0}/README.md +18 -18
  5. gtfs_guru-0.9.0/crates/gtfs_model/Cargo.toml +13 -0
  6. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_model/src/lib.rs +256 -157
  7. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/Cargo.toml +13 -3
  8. gtfs_guru-0.9.0/crates/gtfs_validator_core/benches/benchmark_loading.rs +30 -0
  9. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/benches/benchmark_shape_matching.rs +56 -74
  10. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/csv_reader.rs +459 -0
  11. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/csv_schema.rs +7 -2
  12. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/csv_validation.rs +1071 -267
  13. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/engine.rs +33 -22
  14. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/feed.rs +1354 -0
  15. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/geojson.rs +110 -78
  16. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/input.rs +531 -66
  17. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/lib.rs +17 -4
  18. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/notice.rs +12 -12
  19. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/notice_schema.rs +2 -2
  20. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/progress.rs +46 -0
  21. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/agency_consistency.rs +51 -105
  22. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/attribution_without_role.rs +52 -75
  23. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/bidirectional_exit_gate.rs +9 -9
  24. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/bikes_allowance.rs +182 -0
  25. {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
  26. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/booking_rules.rs +53 -42
  27. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/calendar.rs +24 -21
  28. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/calendar_presence.rs +7 -34
  29. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/continuous_pickup_drop_off.rs +102 -39
  30. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/date_trips.rs +64 -27
  31. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/duplicate_fare_media.rs +27 -25
  32. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/duplicate_key.rs +212 -99
  33. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/duplicate_route_name.rs +33 -41
  34. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/duplicate_stop_sequence.rs +66 -27
  35. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/expired_calendar.rs +56 -89
  36. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_attribute_agency_id.rs +26 -24
  37. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_attributes.rs +9 -9
  38. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_leg_join_rule.rs +37 -45
  39. {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
  40. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_media_name.rs +11 -14
  41. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_product_default_rider_categories.rs +67 -63
  42. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_rules.rs +61 -38
  43. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_transfer_rule_duration_limit.rs +9 -8
  44. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/fare_transfer_rule_transfer_count.rs +25 -32
  45. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/feed_expiration_date.rs +75 -33
  46. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/feed_info.rs +124 -45
  47. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/feed_service_date.rs +18 -21
  48. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/frequencies.rs +23 -34
  49. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/google_rules.rs +33 -33
  50. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/lat_lon.rs +43 -33
  51. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/location_has_stop_times.rs +53 -49
  52. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/location_id_foreign_key.rs +31 -29
  53. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/location_type.rs +77 -110
  54. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/locations_geojson_notices.rs +7 -34
  55. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/locations_geojson_presence.rs +20 -17
  56. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/matching_feed_and_agency_lang.rs +48 -84
  57. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/missing_level_id.rs +46 -44
  58. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/missing_stops_file.rs +22 -13
  59. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/missing_trip_edge.rs +78 -47
  60. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/network_id_consistency.rs +21 -19
  61. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/overlapping_frequency.rs +24 -21
  62. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/overlapping_pickup_drop_off_zone.rs +304 -0
  63. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/parent_station.rs +327 -0
  64. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathway_dangling_generic_node.rs +42 -39
  65. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathway_endpoint_type.rs +69 -64
  66. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathway_loop.rs +21 -22
  67. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathway_reachable_location.rs +105 -100
  68. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pathways.rs +25 -26
  69. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pickup_booking_rule_id.rs +33 -33
  70. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pickup_drop_off_type.rs +22 -22
  71. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/pickup_drop_off_window.rs +30 -30
  72. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/referential_integrity.rs +1405 -0
  73. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/required_fields.rs +80 -34
  74. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/required_non_empty.rs +7 -1
  75. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/route_agency_id.rs +21 -23
  76. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/route_color_contrast.rs +15 -15
  77. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/routes.rs +56 -44
  78. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/shape_to_stop_matching.rs +700 -283
  79. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/shape_usage.rs +181 -0
  80. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/shapes.rs +42 -33
  81. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/single_shape_point.rs +11 -10
  82. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/stop_time_increasing_distance.rs +280 -0
  83. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/stop_time_travel_speed.rs +928 -0
  84. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times.rs +29 -20
  85. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times_geography_id_presence.rs +30 -44
  86. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times_record.rs +38 -30
  87. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times_shape_dist_presence.rs +48 -37
  88. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_times_time.rs +118 -71
  89. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stop_zone_id.rs +55 -64
  90. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/stops.rs +25 -28
  91. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/timeframe_overlap.rs +25 -29
  92. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/timeframe_service_id_foreign_key.rs +42 -25
  93. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/timeframe_start_and_end_time.rs +38 -36
  94. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfer_distance.rs +41 -60
  95. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers.rs +12 -9
  96. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers_in_seat_transfer_type.rs +104 -114
  97. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers_stop_ids_conditional.rs +55 -42
  98. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers_stop_type.rs +32 -32
  99. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/transfers_trip_reference.rs +111 -127
  100. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/translation_field_and_reference.rs +113 -105
  101. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/trip_service_id_foreign_key.rs +46 -27
  102. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/rules/trip_shape_distance.rs +370 -0
  103. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/trips.rs +49 -33
  104. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/unique_geography_id.rs +44 -49
  105. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/unused_agency.rs +37 -38
  106. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/unused_route.rs +33 -25
  107. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/unused_stop.rs +50 -51
  108. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/url_consistency.rs +94 -84
  109. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/url_syntax.rs +64 -57
  110. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/string_pool.rs +106 -0
  111. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/table_status.rs +15 -0
  112. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/timing.rs +264 -0
  113. gtfs_guru-0.9.0/crates/gtfs_validator_core/src/validation_context.rs +157 -0
  114. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/validator.rs +136 -13
  115. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/tests/integration_tests.rs +46 -6
  116. gtfs_guru-0.9.0/crates/gtfs_validator_python/.cargo/config.toml +11 -0
  117. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_python/Cargo.toml +7 -4
  118. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0/crates/gtfs_validator_python}/README.md +18 -18
  119. {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
  120. {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
  121. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_python/src/lib.rs +65 -51
  122. gtfs_guru-0.9.0/crates/gtfs_validator_report/Cargo.toml +25 -0
  123. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_report/src/html.rs +414 -236
  124. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_report/src/lib.rs +89 -94
  125. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/pyproject.toml +1 -1
  126. gtfs_guru-0.9.0/python/gtfs_guru/__init__.py +31 -0
  127. gtfs_guru-0.9.0/python/gtfs_guru/__init__.pyi +234 -0
  128. gtfs_guru-0.9.0/python/gtfs_guru/py.typed +0 -0
  129. gtfs_guru-0.1.0/crates/gtfs_model/Cargo.toml +0 -10
  130. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/csv_reader.rs +0 -234
  131. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/feed.rs +0 -453
  132. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/bikes_allowance.rs +0 -204
  133. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/overlapping_pickup_drop_off_zone.rs +0 -271
  134. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/parent_station.rs +0 -518
  135. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/referential_integrity.rs +0 -843
  136. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/shape_usage.rs +0 -110
  137. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/stop_time_increasing_distance.rs +0 -248
  138. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/stop_time_travel_speed.rs +0 -667
  139. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/rules/trip_shape_distance.rs +0 -339
  140. gtfs_guru-0.1.0/crates/gtfs_validator_core/src/validation_context.rs +0 -82
  141. 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
  142. gtfs_guru-0.1.0/crates/gtfs_validator_report/Cargo.toml +0 -16
  143. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/build.rs +0 -0
  144. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/src/rules/mod.rs +0 -0
  145. {gtfs_guru-0.1.0 → gtfs_guru-0.9.0}/crates/gtfs_validator_core/test_duplicate_repro.rs +0 -0
  146. {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
  147. {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-cli"
1576
- version = "0.1.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.1.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.1.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.1.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.1.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.1.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.1.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.1.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
- # Optimize for size in release builds (especially important for WASM)
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.1.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 Validator Python
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-validator
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/gtfs_validator-*.whl
39
+ pip install target/wheels/gtfs_guru-*.whl
39
40
  ```
40
41
 
41
42
  ## Quick Start
42
43
 
43
44
  ```python
44
- import gtfs_validator
45
+ import gtfs_guru
45
46
 
46
47
  # Validate a GTFS feed
47
- result = gtfs_validator.validate("/path/to/gtfs.zip")
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 = gtfs_validator.validate(
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 gtfs_validator.validate_async(
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
- >>> gtfs_validator.version()
114
- '0.1.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(gtfs_validator.notice_codes())
123
+ >>> len(gtfs_guru.notice_codes())
123
124
  164
124
- >>> gtfs_validator.notice_codes()[:3]
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 = gtfs_validator.notice_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 gtfs_validator
202
+ import gtfs_guru
202
203
 
203
- result = gtfs_validator.validate("/path/to/gtfs.zip")
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 = gtfs_validator.validate("/path/to/gtfs.zip")
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 = gtfs_validator.validate("/path/to/gtfs.zip")
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 = gtfs_validator.validate(
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 = gtfs_validator.validate(
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 Validator Python
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-validator
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/gtfs_validator-*.whl
16
+ pip install target/wheels/gtfs_guru-*.whl
17
17
  ```
18
18
 
19
19
  ## Quick Start
20
20
 
21
21
  ```python
22
- import gtfs_validator
22
+ import gtfs_guru
23
23
 
24
24
  # Validate a GTFS feed
25
- result = gtfs_validator.validate("/path/to/gtfs.zip")
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 = gtfs_validator.validate(
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 gtfs_validator.validate_async(
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
- >>> gtfs_validator.version()
92
- '0.1.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(gtfs_validator.notice_codes())
100
+ >>> len(gtfs_guru.notice_codes())
101
101
  164
102
- >>> gtfs_validator.notice_codes()[:3]
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 = gtfs_validator.notice_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 gtfs_validator
179
+ import gtfs_guru
180
180
 
181
- result = gtfs_validator.validate("/path/to/gtfs.zip")
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 = gtfs_validator.validate("/path/to/gtfs.zip")
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 = gtfs_validator.validate("/path/to/gtfs.zip")
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 = gtfs_validator.validate(
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 = gtfs_validator.validate(
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 }