gtfs/static/validation
GTFS Static Feed Validation
Validates GTFS feeds for:
- Required files presence
- Required fields presence
- Foreign key relationships
- Semantic rules (time sequences, coordinates, etc.)
Types
Context for validation with collected IDs
pub type ValidationContext {
ValidationContext(
agency_ids: set.Set(String),
stop_ids: set.Set(String),
route_ids: set.Set(String),
trip_ids: set.Set(String),
service_ids: set.Set(String),
shape_ids: set.Set(String),
fare_ids: set.Set(String),
level_ids: set.Set(String),
area_ids: set.Set(String),
network_ids: set.Set(String),
zone_ids: set.Set(String),
pathway_ids: set.Set(String),
)
}
Constructors
-
ValidationContext( agency_ids: set.Set(String), stop_ids: set.Set(String), route_ids: set.Set(String), trip_ids: set.Set(String), service_ids: set.Set(String), shape_ids: set.Set(String), fare_ids: set.Set(String), level_ids: set.Set(String), area_ids: set.Set(String), network_ids: set.Set(String), zone_ids: set.Set(String), pathway_ids: set.Set(String), )
Validation errors that can occur during feed validation
pub type ValidationError {
MissingRequiredFile(filename: String)
MissingConditionalFile(filename: String, condition: String)
MissingRequiredField(
file: String,
field: String,
record_id: String,
row: Int,
)
InvalidFieldValue(
file: String,
field: String,
value: String,
expected: String,
row: Int,
)
InvalidForeignKey(
file: String,
field: String,
value: String,
references: String,
row: Int,
)
DuplicatePrimaryKey(
file: String,
key: String,
value: String,
row: Int,
)
InvalidCoordinate(
file: String,
record_id: String,
lat: Float,
lon: Float,
reason: String,
)
InvalidTimeSequence(
file: String,
trip_id: String,
reason: String,
)
CircularReference(file: String, field: String, value: String)
OrphanedRecord(
file: String,
record_id: String,
expected_reference: String,
)
InconsistentTimezone(reason: String)
}
Constructors
-
MissingRequiredFile(filename: String)Missing required file
-
MissingConditionalFile(filename: String, condition: String)Missing conditionally required file
-
MissingRequiredField( file: String, field: String, record_id: String, row: Int, )Missing required field in a record
-
InvalidFieldValue( file: String, field: String, value: String, expected: String, row: Int, )Invalid field value
-
InvalidForeignKey( file: String, field: String, value: String, references: String, row: Int, )Foreign key reference to non-existent record
-
DuplicatePrimaryKey( file: String, key: String, value: String, row: Int, )Duplicate primary key
-
InvalidCoordinate( file: String, record_id: String, lat: Float, lon: Float, reason: String, )Invalid coordinate value
-
InvalidTimeSequence( file: String, trip_id: String, reason: String, )Invalid time sequence
-
CircularReference(file: String, field: String, value: String)Circular reference detected
-
OrphanedRecord( file: String, record_id: String, expected_reference: String, )Orphaned record (referenced by nothing)
-
InconsistentTimezone(reason: String)Inconsistent agency timezones when single agency
Values
pub fn validate_agency_ids(
agencies: List(types.Agency),
) -> #(set.Set(String), List(ValidationError))
Validate that agency_ids are unique (when present)
pub fn validate_required_files(
has_agency: Bool,
has_stops: Bool,
has_routes: Bool,
has_trips: Bool,
has_stop_times: Bool,
has_calendar: Bool,
has_calendar_dates: Bool,
has_locations_geojson: Bool,
) -> List(ValidationError)
Check that required files are present Required: agency.txt, routes.txt, trips.txt, stop_times.txt Conditionally required: stops.txt OR locations.geojson, calendar.txt OR calendar_dates.txt
pub fn validate_route_agency_refs(
routes: List(types.Route),
agency_ids: set.Set(String),
single_agency: Bool,
) -> List(ValidationError)
Validate routes reference valid agency_ids
pub fn validate_route_ids(
routes: List(types.Route),
) -> #(set.Set(String), List(ValidationError))
Validate that route_ids are unique
pub fn validate_service_ids_calendar(
calendars: List(types.Calendar),
) -> #(set.Set(String), List(ValidationError))
Validate that service_ids are unique
pub fn validate_stop_coordinates(
stops: List(types.Stop),
) -> List(ValidationError)
Validate stop coordinates are within valid bounds
pub fn validate_stop_ids(
stops: List(types.Stop),
) -> #(set.Set(String), List(ValidationError))
Validate that stop_ids are unique
pub fn validate_stop_time_refs(
stop_times: List(types.StopTime),
trip_ids: set.Set(String),
stop_ids: set.Set(String),
) -> List(ValidationError)
Validate stop_times reference valid trip_ids and stop_ids
pub fn validate_stop_time_sequences(
stop_times: List(types.StopTime),
) -> List(ValidationError)
Validate that stop times have increasing arrival/departure times
pub fn validate_trip_ids(
trips: List(types.Trip),
) -> #(set.Set(String), List(ValidationError))
Validate that trip_ids are unique
pub fn validate_trip_refs(
trips: List(types.Trip),
route_ids: set.Set(String),
service_ids: set.Set(String),
shape_ids: set.Set(String),
) -> List(ValidationError)
Validate trips reference valid route_ids and service_ids