gtfs/static/validation

GTFS Static Feed Validation

Validates GTFS feeds for:

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

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 new_context() -> ValidationContext

Create an empty validation context

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

Search Document