diff --git a/update-agenda-link/index.html b/update-agenda-link/index.html index 779d5823..ef2b6636 100644 --- a/update-agenda-link/index.html +++ b/update-agenda-link/index.html @@ -444,7 +444,7 @@

TIDES specificationData Package

Directories with TIDES data must contain metadata in a datapackage.json file in a format compliant with the tides-datapackage-profile of a frictionless data package.

-

/samples/template/datapackage.json has a template datapackage which can be used.

+

/samples/template/datapackage.json has a template datapackage which can be used.

Sample Data

Sample data can be found in the /samples directory, with one directory for each sample.

Template

diff --git a/update-agenda-link/samples/index.html b/update-agenda-link/samples/index.html index 8c80fa41..0b29e3c3 100644 --- a/update-agenda-link/samples/index.html +++ b/update-agenda-link/samples/index.html @@ -411,11 +411,11 @@

Adding ExamplesData Package

-

TIDES sample data must include a datapackage.json in the format specified by the tides-data-package json schema (an extension of the frictionless data package).

+

TIDES sample data must include a datapackage.json in the format specified by the tides-data-package json schema (an extension of the frictionless data package).

See:

Data validation

Data with a valid datapackage.json can be easily validated using the frictionless framework, which can be installed and invoked as follows:

diff --git a/update-agenda-link/search/search_index.json b/update-agenda-link/search/search_index.json index da556dcb..536b8525 100644 --- a/update-agenda-link/search/search_index.json +++ b/update-agenda-link/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"TIDES","text":"

TIDES is the Transit ITS Data Exchange Specification and is your key to accessing, managing, and using transit operations data.

"},{"location":"#why-tides","title":"Why TIDES?","text":"

TIDES is a data specification for transit operations data including vehicle location data, passenger count data, and fare transaction data.

TIDES frees your transit data and gives you more options to turn operations data into information on ridership, passenger loads, fare revenue, vehicle speed and delay, service reliability, and more!

TIDES is open-source, free for use, and is community governed, developed and supported. This repository provides data schemas and tools to support the access, management, and improvement of historical transit operations data, including vehicle operations, passenger activity, fare collection, and other similar data.

"},{"location":"#tides-specification","title":"TIDES specification","text":"

The TIDES specification is maintained in the /spec sub-directory as a series of JSON tables compatible with the frictionless table schema standards. Human-friendlier documentation is auto-generated and available at:

"},{"location":"#data-package","title":"Data Package","text":"

Directories with TIDES data must contain metadata in a datapackage.json file in a format compliant with the tides-datapackage-profile of a frictionless data package.

/samples/template/datapackage.json has a template datapackage which can be used.

"},{"location":"#sample-data","title":"Sample Data","text":"

Sample data can be found in the /samples directory, with one directory for each sample.

"},{"location":"#template","title":"Template","text":"

Templates of datapackage.json and each TIDES file type are located in the /samples/template directory.

"},{"location":"#validating-tides-data","title":"Validating TIDES data","text":"

TIDES data with a valid datapackage.json can be easily validated using the frictionless framework, which can be installed and invoked as follows:

pip install frictionless\nfrictionless validate --schema-sync path/to/your/datapackage.json\n

Several other validation scripts and tools with more flexibility such as validating to the canonical, named version or a local spec can be found in the /bin directory, with usage available with the --help flag.

bin/validate-datapackage [-v remote_spec_ref | -l local_spec_path] [-d dataset_path]\n
"},{"location":"#contributing-to-tides","title":"Contributing to TIDES","text":"

Those who want to help with the development of the TIDES specification should review the guidance in contributing.

"},{"location":"#issues","title":"Issues","text":"

Please add issues, bugs, and feature requests to GitHub.

"},{"location":"#acknowledgment","title":"Acknowledgment","text":"

These data schemas and tool definitions developed here are based on the results of research conducted by the Transportation Research Board (TRB) of the National Academies of Science, Engineering, and Medicine (NASEM) under the Transit Cooperative Research Program (TCRP). This research is available at the National Academies website.

Note that neither the TIDES Project nor the TIDES-transit repository are associated with TCRP, TRB, or the Academies. The use of the TCRP research results in this repository do not reflect any explicit or implicit endorsement of or participation in this work by the Academies. In addition, the opinions and conclusions expressed or implied in the research are those of the contractor. They are not necessarily those of the Transportation Research Board, the Academies, or the program sponsors.

"},{"location":"architecture/","title":"TIDES Tables Schema","text":"

Schemas for TIDES suite.

"},{"location":"architecture/#files-in-specification","title":"Files in Specification","text":"

TIDES consists of a package of files as defined in the following table.

The following table is automatically generated from [tides.spec.json]

name title description required vehicle-locations Vehicle Locations Timestamped vehicle locations and speeds. False passenger-events Passenger Events Timestamped passenger-related events, including boardings and alightings. False fare-transactions Fare Transactions Timestamped fare transaction, associated with devices. False stop-visits Stop Visits Summarized boarding, alighting, arrival, departure, and other events (kneel engaged, ramp deployed, etc.) by trip and stop for each service date. False trips-performed Trips Performed Trips performed for each service date. False station-activities Station Activities Summarized transactions, entries, and exits by stop or station and time period for each service date (for events not associated with a trip). False devices Devices Measurement devices, such as AVL, APC, and AFC devices, associated with vehicles or stops or stations. False train-cars Train Cars Assets that comprise vehicles, such as train cars, with descriptive information. False vehicle-train-cars Vehicle Train Cars Relationships between assets and vehicles. False vehicles Vehicles Vehicles, including buses and train consists, with descriptive information. False operators Operators Personnel who operate vehicles. False

File components for TIDES are specified in [tides.spec.json] in a format compatible with the frictionless data data package standard.

"},{"location":"architecture/#relationships","title":"Relationships","text":"

Files in the TIDES suite are related to each other and other open standards as follows:

graph LR; avl(((AVL))) --> vehicle_locations[/vehicle_locations/] APC --> passenger_events[/passenger_events/] AFC --> fare_transactions[/fare_transactions/] vehicle_locations --> summary[Summary Process] fare_transactions --> summary passenger_events --> summary summary --> |stop_id,trip_id,vehicle_id|stop_visits[/stop_visits/] summary -->|stop_id| station_activities[/station_activities/] summary --> trips_performed[/trips_performed/] trips.txt[/trips.txt/] --> |trip_id| stop_times.txt[/stop_times.txt/] stops.txt[/stops.txt/] --> |stop_id|stop_times.txt calendar.txt[/calendar.txt/] --> |service_id|stop_times.txt vehicle_train_cars[/vehicle_train_cars/] -.vehicle_id.- vehicles[/vehicles/] vehicle_train_cars -.- |train_car_id| train_cars[/train_cars/] train_cars -.- |train_car_id| devices[/devices/] vehicles --- |vehicle_id| devices vehicles --> |vehicle_id|trips_performed operators[/operators/] -.-> |operator_id| trips_performed stop_times.txt --> |\" stop_times.txt: stop_id,stop_sequence stop_visits: stop_id,scheduled_stop_sequence \"| stop_visits stop_times.txt --> |trips.txt| trips_performed stops.txt --> |stop_id|station_activities stop_times.txt --> |\" stop_times.txt: stop_id,stop_sequence vehicle_locations: stop_id,scheduled_stop_sequence \"| vehicle_locations stop_times.txt --> |\" stop_times.txt: stop_id,stop_sequence passenger_events: stop_id,scheduled_stop_sequence \"| passenger_events stop_times.txt --> |\" stop_times.txt: stop_id,stop_sequence fare_transactions: stop_id,scheduled_stop_sequence \"| fare_transactions subgraph eventf [Event Data] vehicle_locations passenger_events fare_transactions end subgraph summaryf [Summary Files] station_activities stop_visits trips_performed end subgraph gtfs [ GTFS ] stop_times.txt stops.txt trips.txt calendar.txt end subgraph proposedGTFS [ Proposed GTFS ] train_cars vehicle_train_cars vehicles end subgraph additional [ Additional Data ] devices operators end click stops.txt \"https://gtfs.org/schedule/reference/#stopstxt\" click stop_times.txt \"https://gtfs.org/schedule/reference/#stop_timestxt\" click calendar.txt \"https://gtfs.org/schedule/reference/#calendartxt\" click trips.txt \"https://gtfs.org/schedule/reference/#tripstxt\" click station_activities \"../tables/#station-activities\" click stop_visits \"../tables/#stop-visits\" click train_cars \"../tables/#train-cars\" click vehicle_train_cars \"../tables/#vehicle-train-cars\" click vehicles \"../tables/#vehicles\" click devices \"../tables/#devices\" click vehicle_locations \"../tables/#vehicle-locations\" click passenger_events \"../tables/#passenger-events\" click fare_transactions \"../tables/#fare-transactions\"

Relationship of trip_id_scheduled to GTFS Schedule trip_id

trip_id_scheduled in TIDES and trip_id in GTFS Schedule should be consistent when a performed trip exists in the published GTFS Schedule.

If a trip does not exist in the published GTFS Schedule, trip_id_scheduled values in TIDES do not have any assumed relationship with GTFS.

"},{"location":"datapackage/","title":"Data Package","text":"

TIDES data must include a datapackage.json in the format specified by the tides-data-package json schema, which is an extension of the frictionless data package schema.

You may create your own datapackage.json based on the documentaiton or start with the provided template, but don\u2019t forget to validate it to make sure it is in the correct format!

"},{"location":"datapackage/#data-package-format","title":"Data Package Format","text":"name description type requirement title A human-readable title.Example:Make Believe Trolley 1/1/2001-2/1/2001 string required profile The json-schema profile used to validate this datapackage descriptor. Should be https://raw.githubusercontent.com/TIDES-transit/TIDES/<spec-version-or-reference>/spec/tides-datapackage-profile.json. Defaults to https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.jsonExample:https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json nan required resources Array describing the data files included in your package, formated as a tabular-data-resource array required name Short, unique sluggable identifier string.Example:trolley_2001_1 string recommended description Short description of TIDES data package.Example:Raw and processed data from the Neighborhood of Make Believe Trolley recorded 1/1/2001-2/1/2001 string recommended agency Transit agency name.Example:Make Believe Neighborhood Trolley string recommended ntd_id ID for the National Transit Database.Example:0R02-00307 string recommended licenses The license(s) under which this package is published.Example:{'name':'CC-BY-4.0','path':'https://opendefinition.org/licenses/cc-by/','name':'Creative Commons Attribution 4.0'} array recommended contributors Array of data contributors.Example:{'name':'Daniel Tiger','email': 'daniel@makebelievetrolley.gov','organization':'Make Believe Neighborhood Trolley','role':'contributor'} array recommended maintainers Array of data maintainersExample:{'name':'Henrietta Pussycat','email': 'henrietta@makebelievetrolley.gov','organization':'Make Believe Neighborhood Trolley','role':'maintainer'} array recommended"},{"location":"datapackage/#tabular-data-resource","title":"Tabular Data Resource","text":"

Required and recommended fields for each tabluar-data-resource are as follows:

name description type requirement name Short, unique sluggable identifier string for a data table.Example:vehicle_locations_2001_01 string required path A reference to the data for this resource, as a valid URI string.Example:event/2001/vehicle_locations_2001_01.csv string required schema Location of the table schema for this resource.Example:https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/fare_transactions.schema.json string required profile Must be tabular-data-resourceExample:tabular-data-resource string required title A human-readable title for the data resource.Example:Neighborhood Trolley Vehicle Locations: 1/1/2001-2/1/2001 string recommended description DExample:Vehicle location event data from the Neighborhood of Make Believe Trolley recorded 1/1/2001-2/1/2001 string recommended sources The raw sources for this resource which describe where the data came from.Example:[ {'title':'Trolley CAD/AVL System','component':'CAD/AVL','product':'TrolleyMaster','product_version':'3.1.4'} ] array recommended licenses The license(s) under which this package is published.Example:{'name':'CC-BY-4.0','path':'https://opendefinition.org/licenses/cc-by/','name':'Creative Commons Attribution 4.0'} array recommended"},{"location":"datapackage/#template","title":"Template","text":"

The canonical datapackage.json template is available at /data/template/TIDES/datapackage.json.

Warning

This version of tides-data-package template is dependent on the version of the documentation you are viewing and only represents the canonical tides-data-package template if you are viewing the main documentation version.

samples/template/TIDES/datapackage.json
{\n    \"name\": \"template\",\n    \"title\": \"Template TIDES Data Package Example\",\n    \"agency\": \"Transit Agency Name\",\n    \"ntd_id\": \"1234-56\",\n    \"profile\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json\",\n    \"licenses\": [\n        {\n            \"name\": \"CC-BY-4.0\"\n        }\n    ],\n    \"contributors\": [\n        {\n            \"title\": \"My Name\",\n            \"email\": \"me@myself.com\",\n            \"github\": \"myhandle\"\n        }\n    ],\n    \"maintainers\": [\n        {\n            \"title\": \"Another Name\",\n            \"email\": \"another@myself.com\",\n            \"github\": \"myhandle\"\n        }\n    ],\n    \"resources\": [\n        {\n            \"name\": \"devices\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"devices.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/devices.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"vehicle_locations\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"vehicle_locations.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/vehicle_locations.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"fare_transactions\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"fare_transactions.csv\",\n            \"schema\":\"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/fare_transactions.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"train_cars\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"train_cars.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/train_cars.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"operators\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"operators.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/operators.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"stop_visits\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"stop_visits.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/stop_visits.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"vehicle_train_cars\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"vehicle_train_cars.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/vehicle_train_cars.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"vehicles\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"vehicles.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/vehicles.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"trips_performed\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"trips_performed.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/trips_performed.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"station_activities\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"station_activities.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/station_activities.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"passenger_events\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"passenger_events.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/passenger_events.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        }\n    ]\n}\n
"},{"location":"datapackage/#validation","title":"Validation","text":"

There are lots of options for validating your datapackage.json file including:

"},{"location":"datapackage/#cli","title":"CLI","text":"

You can easily validate your data package file with the script provided in /bin/validate-data-package-to-profile

installation requirements

Make sure you have jsonschema-cli installed. You can install it specifically or with all of the other suggested tools using one of the commands below:

MacWindowsLinux
brew install jq # mac\npip install -r requirements.txt\n
curl -L -o /usr/bin/jq.exe https://github.com/stedolan/jq/releases/latest/download/jq-win64.exe #windows\npip install -r requirements.txt\n
sudo apt-get install jq # linux\npip install -r requirements.txt\n
usage
validate-data-package-json -f my-datapackage.json\n
bin/validate-datapackage-to-profile
#!/usr/bin/env bash\n\ndescription=\"Script to validate a local JSON file against a profile for tides-data-package specified in \nprofile field or optionally against a remote or local profile.\"\n\nusage=\"\nUsage: validate-datapackage-to-profile [-r remote_spec_ref | -l local_spec_path] [-f datapackage_file]\n   -r remote_spec_ref: Optional. Specify the ref name of the GitHub repository for validating agianst\n             a remote profile where the profile is in the sub-path /spec/tides-data-package.json. \n             Should not be used with -l option. Example: -r main\n   -l local_spec_path: Optional. Specify the location of the local tides-data-package-json to use.\n             Should not be used with -r option. Example: -l spec\n   -d dataset_path: Optional. Specify the path of the datapackage.json file. \n             Default is datapackage.json. Example: -d samples/template/TIDES/datapackage.json\n\"\n\nexample_usage=\"Example Usage: bin/validate-datapackage-to-profile -d samples/template/TIDES/datapackage.tmp.json\"\n\n################################################################################\n## Help                                                                         #\n################################################################################\n\n## Display help message\nfunction display_help() {\n  echo \"$description\"\n  echo \"$usage\"\n  echo \"$example_usage\"\n}\n\n## Check for help flag\nif [ \"$1\" == \"--help\" ]; then\n  display_help\n  exit 0\nfi\n\n################################################################################\n## MAIN                                                                         #\n################################################################################\n\necho \"$description\"\n\n################################################################################\n## Source utility functions                                                     #\n################################################################################\nsource \"$(dirname \"${BASH_SOURCE[0]}\")/utils\"\nscript_dir=$(dirname \"$0\")\n\n################################################################################\n## Check Requirements                                                           #\n################################################################################\ncheck_jsonschema-cli\ncheck_jq\n\n################################################################################\n## Process the input options.                                                   #\n################################################################################\n## Set default values\nremote_spec_ref=\"\"\nlocal_spec_path=\"\"\ndataset_path=\"datapackage.json\"\n\n## Parse command-line arguments\nwhile getopts \":r:l:d:\" opt; do\n  case $opt in\n    r)\n      remote_spec_ref=$OPTARG\n      ;;\n    l)\n      local_spec_path=$OPTARG\n      ;;\n    d)\n      dataset_path=$OPTARG\n      ;;\n    \\?)\n      echo \"Invalid option: -$OPTARG\" >&2\n      display_help\n      exit 1\n      ;;\n  esac\ndone\n\necho \"validate-datapackage-to-profile configs:\"\necho \"  remote_spec_ref: $remote_profile_ref\"\necho \"  local_spec_path: $local_profile_path\"\necho \"  dataset_path: $dataset_path\"\n\nif [ \"$local_spec_path\" != \"\" ] && [ \"$remote_spec_path\" != \"\" ]; then\n  echo \"Cannot specify both local spec location (-l) and remote spec reference (-r)\" >&2\n  exit 1\nfi\n\n################################################################################\n## Specify datapackage and update if necessary                                  #\n################################################################################\n\n## Set appropriate datapackage_file vs dataset_path\nif [ -f \"$dataset_path\" ]; then\n  datapackage_file=\"$dataset_path\"\n  dataset_path=$(dirname \"$dataset_path\")\nelse \n  datapackage_file=\"$dataset_path/datapackage.json\"\nfi\ncheck_valid_path \"$datapackage_file\"\n\n################################################################################\n## Find and download if necessary the profile file                              #\n################################################################################\n\n[ -n \"$local_spec_path\" ] && spec_prefix=\"$local_spec_path\"\n[ -n \"$remote_spec_ref\" ] && spec_prefix=\"https://raw.githubusercontent.com/TIDES-transit/TIDES/$remote_spec_ref/spec\"\n\nif [ \"$spec_prefix\" != \"\" ]; then\n  profile_file=\"$spec_prefix/tides-datapackage-profile.json\"\nelse\n  profile_file=$(jq -r '.profile' \"$datapackage_file\")\nfi\necho \"...using profile: $profile_file\"\ncheck_valid_path \"$profile_file\"\n\nif [[ \"$profile_file\" =~ ^http ]]; then\n  temp_dir=$(mktemp -d)\n  profile_file=\"$temp_dir/$(basename $profile_file)\"\n  echo \"...downloading profile to: $profile_file\"\n  curl -L \"$profile_file\" -o \"$profile_file\"\nfi\n\n################################################################################\n## Validate Datapackage to Profile                                              #\n################################################################################\necho \"...validating $datapackage_file to $profile_file\"\njsonschema-cli validate \"$profile_file\" \"$datapackage_file\"\n\n################################################################################\n## Cleanup                                                                      #\n################################################################################\nif [ -d \"$temp_dir\" ]; then\n  rm -r \"$temp_dir\"\nfi\n
"},{"location":"datapackage/#point-and-drool","title":"Point-and-Drool","text":"

Because a tides-datapackage-profile is just a json-schema, you can use the myriad of different json-schema validator out there on the web. Use the canonical tides-datapackage-profile or copy and paste the version from below.

Warning

This version of tides-datapackage-profile is dependent on the version of the documentation you are viewing and only represents the canonical tides-datapackage-profile if you are viewing the main documentation version.

spec/tides-datapackage-profile.json
{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"title\": \"TIDES Data Package\",\n  \"description\": \"TIDES Data Package is a simple specification for data access and delivery of tabular TIDES transit data.\",\n  \"type\": \"object\",\n  \"required\": [\n    \"title\",\n    \"profile\",\n    \"resources\"\n\n  ],\n  \"recommended\":[\n    \"name\",\n    \"description\",\n    \"agency\",\n    \"ntd_id\",\n    \"licenses\",\n    \"contributors\",\n    \"maintainers\"\n  ],\n  \"properties\": {\n    \"profile\": {\n      \"default\":  \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json\",\n      \"propertyOrder\": 10,\n      \"title\": \"Profile\",\n      \"description\": \"The json-schema profile used to validate this datapackage descriptor. Should be `https://raw.githubusercontent.com/TIDES-transit/TIDES/<spec-version-or-reference>/spec/tides-datapackage-profile.json`. Defaults to `https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json`\",\n      \"format\": \"uri\",\n      \"examples\": [\n        \"`https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json`\"\n      ]\n    },\n    \"title\": {\n      \"propertyOrder\": 20,\n      \"title\": \"Title\",\n      \"description\": \"A human-readable title.\",\n      \"type\": \"string\",\n      \"examples\": [\n        \"Make Believe Trolley 1/1/2001-2/1/2001\"\n      ]\n    },\n    \"name\": {\n      \"propertyOrder\": 30,\n      \"title\": \"Name\",\n      \"description\": \"Short, unique [sluggable](https://en.wikipedia.org/wiki/Clean_URL#Slug) identifier string.\",\n      \"type\": \"string\",\n      \"pattern\": \"^([-a-z0-9._/])+$\",\n      \"context\": \"This is ideally a url-usable and human-readable name. Name `SHOULD` be invariant, meaning it `SHOULD NOT` change when its parent descriptor is updated.\",\n      \"examples\": [\n        \"trolley_2001_1\"\n      ]\n    },\n    \"description\": {\n      \"propertyOrder\": 40,\n      \"format\": \"textarea\",\n      \"title\": \"Description\",\n      \"description\": \"Short description of TIDES data package.\",\n      \"type\": \"string\",\n      \"examples\": [\n        \"Raw and processed data from the Neighborhood of Make Believe Trolley recorded 1/1/2001-2/1/2001\"\n      ]\n    },\n    \"agency\": {\n      \"propertyOrder\": 50,\n      \"format\": \"textarea\",\n      \"title\": \"Agency\",\n      \"description\": \"Transit agency name.\",\n      \"type\": \"string\",\n      \"examples\": [\n        \"Make Believe Neighborhood Trolley\"\n      ]\n    },\n    \"ntd_id\": {\n      \"propertyOrder\": 60,\n      \"title\": \"NTD ID\",\n      \"description\": \"ID for the National Transit Database.\",\n      \"type\": \"string\",\n      \"pattern\": \"^([-a-z0-9._/])+$\",\n      \"context\": \"Background on NTD available at https://www.transit.dot.gov/ntd\",\n      \"examples\": [\n        \"0R02-00307\"\n      ]\n    },\n    \"contributors\": {\n      \"propertyOrder\": 70,\n      \"title\": \"Contributors\",\n      \"description\": \"Array of data contributors.\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"title\": \"Contributor\",\n        \"description\": \"A contributor to this descriptor.\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"title\": \"Name\",\n            \"description\": \"A human-readable name.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Daniel Tiger\"\n            ]\n          },\n          \"email\": {\n            \"title\": \"Email\",\n            \"description\": \"An email address.\",\n            \"type\": \"string\",\n            \"format\": \"email\",\n            \"examples\": [\n              \"daniel@makebelievetrolley.gov\"\n            ]\n          },\n          \"organization\": {\n            \"title\": \"Organization\",\n            \"description\": \"An organizational affiliation for this contributor.\",\n            \"type\": \"string\",\n            \"example\": \"Make Believe Neighborhood Trolley\"\n          },\n          \"role\": {\n            \"title\": \"Role\",\n            \"description\": \"The contributor's role in the project\",\n            \"type\": \"string\",\n            \"default\": \"contributor\"\n          }\n        },\n        \"required\": [\n          \"title\"\n        ],\n        \"context\": \"Use of this property does not imply that the person was the original creator of, or a contributor to, the data in the descriptor, but refers to the composition of the descriptor itself.\"\n      },\n      \"examples\": [\n       \"{'name':'Daniel Tiger','email': 'daniel@makebelievetrolley.gov','organization':'Make Believe Neighborhood Trolley','role':'contributor'}\"\n      ]\n    },\n    \"maintainers\": {\n      \"propertyOrder\": 80,\n      \"title\": \"Maintainers\",\n      \"description\": \"Array of data maintainers\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"title\": \"Maintainer\",\n        \"description\": \"A maintainer of this descriptor.\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"title\": \"Name\",\n            \"description\": \"A human-readable name.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Henrietta Pussycat\"\n            ]\n          },\n          \"email\": {\n            \"title\": \"Email\",\n            \"description\": \"An email address.\",\n            \"type\": \"string\",\n            \"format\": \"email\",\n            \"examples\": [\n              \"henrietta@makebelievetrolley.gov\"\n            ]\n          },\n          \"organization\": {\n            \"title\": \"Organization\",\n            \"description\": \"An organizational affiliation for this maintainer.\",\n            \"type\": \"string\"\n          },\n          \"role\": {\n            \"title\": \"Role\",\n            \"description\": \"The maintainer's role in the project\",\n            \"type\": \"string\",\n            \"default\": \"maintainer\"\n          }\n        },\n        \"required\": [\n          \"title\"\n        ],\n        \"context\": \"Use of this property does not imply that the person was the original creator of, or a contributor to, the data in the descriptor, but refers to the composition of the descriptor itself.\"\n      },\n      \"examples\": [\n        \"{'name':'Henrietta Pussycat','email': 'henrietta@makebelievetrolley.gov','organization':'Make Believe Neighborhood Trolley','role':'maintainer'}\"\n\n      ]\n    },\n    \"licenses\": {\n      \"propertyOrder\": 90,\n      \"title\": \"Licenses\",\n      \"description\": \"The license(s) under which this package is published.\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"title\": \"License\",\n        \"description\": \"An array of license objects which apply to this data package.  Must include at least a `name` or `path`\",\n        \"type\": \"object\",\n        \"anyOf\": [\n          {\n            \"required\": [\n              \"name\"\n            ]\n          },\n          {\n            \"required\": [\n              \"path\"\n            ]\n          }\n        ],\n        \"properties\": {\n          \"name\": {\n            \"title\": \"Open Definition license identifier\",\n            \"description\": \"MUST be an Open Definition license identifier, see http://licenses.opendefinition.org/\",\n            \"type\": \"string\",\n            \"pattern\": \"^([-a-zA-Z0-9._])+$\",\n            \"examples\": [\"odc-by\",\"CC-BY-4.0\"]\n          },\n          \"path\": {\n            \"title\": \"Path\",\n            \"description\": \"A fully qualified public URL, or a Unix-style relative file path.\",\n            \"type\": \"string\",\n            \"pattern\": \"^(?=^[^./~])(^((?!\\\\.{2}).)*$).*$\",\n            \"examples\": [\n              \"https://opendefinition.org/licenses/odc-by/\",\n              \"license.md\"\n            ],\n            \"context\": \"Implementations need to negotiate the type of path provided, and dereference the data accordingly.\"\n          },\n          \"title\": {\n            \"title\": \"Title\",\n            \"description\": \"A human-readable title of the license.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Creative Commons Attribution 4.0\"\n            ]\n          }\n        }\n      },\n      \"context\": \"This property is not legally binding and does not guarantee that the package is licensed under the terms defined herein.\",\n      \"examples\": [\n        \"{'name':'CC-BY-4.0','path':'https://opendefinition.org/licenses/cc-by/','name':'Creative Commons Attribution 4.0'}\"\n      ]\n    },\n    \"resources\": {\n      \"propertyOrder\": 100,\n      \"title\": \"Tabular Data Resources\",\n      \"description\": \"Array describing the data files included in your package, formated as a [`tabular-data-resource`](#tabular-data-resource)\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"title\": \"Tabular Data Resource\",\n        \"description\": \"A Tabular Data Resource.\",\n        \"type\": \"object\",\n        \"required\": [\n            \"name\",\n            \"path\",\n            \"schema\",\n            \"profile\"\n        ],\n        \"recommended\": [\n          \"title\",\n          \"description\",\n          \"sources\",\n          \"licenses\"\n      ],\n        \"properties\": {\n          \"profile\": {\n            \"default\": \"tabular-data-resource\",\n            \"propertyOrder\": 10,\n            \"title\": \"Profile\",\n            \"description\": \"Must be `tabular-data-resource`\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"tabular-data-resource\"\n            ]\n          },\n          \"name\": {\n            \"propertyOrder\": 20,\n            \"title\": \"Name\",\n            \"description\": \"Short, unique [sluggable](https://en.wikipedia.org/wiki/Clean_URL#Slug) identifier string for a data table.\",\n            \"type\": \"string\",\n            \"pattern\": \"^([-a-z0-9._/])+$\",\n            \"context\": \"This is ideally a url-usable and human-readable name. Name `SHOULD` be invariant, meaning it `SHOULD NOT` change when its parent descriptor is updated.\",\n            \"examples\": [\n              \"vehicle_locations_2001_01\"\n            ]\n          },\n          \"path\": {\n            \"propertyOrder\": 30,\n            \"title\": \"Path\",\n            \"description\": \"A reference to the data for this resource, as a valid URI string.\",\n            \"type\": \"string\",\n            \"pattern\": \"^(?=^[^./~])(^((?!\\\\.{2}).)*$).*$\",\n            \"examples\": [\n              \"event/2001/vehicle_locations_2001_01.csv\"\n            ],\n            \"context\": \"Implementations need to negotiate the type of path provided, and dereference the data accordingly.\"\n          },\n          \"tides-table\": {\n            \"enum\": [\n              \"devices\",\n              \"fare_transactions\",\n              \"operators\",\n              \"station_activities\",\n              \"passenger_events\",\n              \"stop_visits\",\n              \"train_cars\",\n              \"trips_performed\",\n              \"vehicle_locations\",\n              \"vehicle_train_cars\",\n              \"vehicles\"\n            ],\n            \"description\": \"An identifier string corresponding to the name of one of the table specs in the TIDES data package\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"fare_transactions\",\n              \"train_cars\"\n            ]\n          },\n          \"schema\": {\n            \"title\": \"Table Schema\",\n            \"description\": \"Location of the table schema for this resource.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/fare_transactions.schema.json\"\n            ]\n          },\n          \"title\": {\n            \"title\": \"Title\",\n            \"description\": \"A human-readable title for the data resource.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Neighborhood Trolley Vehicle Locations: 1/1/2001-2/1/2001\"\n            ],\n            \"propertyOrder\": 50\n          },\n          \"description\": {\n            \"title\": \"Description\",\n            \"description\": \"D\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Vehicle location event data from the Neighborhood of Make Believe Trolley recorded 1/1/2001-2/1/2001\"\n            ],\n            \"propertyOrder\": 60,\n            \"format\": \"textarea\"\n          },\n          \"homepage\": {\n            \"propertyOrder\": 70,\n            \"title\": \"Home Page\",\n            \"description\": \"The home on the web that is related to this data package.\",\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"examples\": [\n              \"http://example.com\"\n            ]\n          },\n          \"sources\": {\n            \"propertyOrder\": 140,\n            \"options\": {\n              \"hidden\": true\n            },\n            \"title\": \"Sources\",\n            \"description\": \"The raw sources for this resource which describe where the data came from.\",\n            \"type\": \"array\",\n            \"minItems\": 0,\n            \"examples\": [\n              \"[ {'title':'Trolley CAD/AVL System','component':'CAD/AVL','product':'TrolleyMaster','product_version':'3.1.4'} ]\"\n            ],\n            \"items\": {\n              \"title\": \"Source\",\n              \"type\": \"object\",\n              \"required\": [\n                \"title\"\n              ],\n              \"properties\": {\n                \"title\": {\n                  \"title\": \"Title\",\n                  \"description\": \"Human-readable title of the data source.\",\n                  \"type\": \"string\",\n                  \"examples\": [\n                    \"Trolley CAD/AVL System\"\n                  ]\n                },\n                \"component\": {\n                  \"title\": \"Component\",\n                  \"description\": \"The technology component used to generate this data (directly or indirectly)\",\n                  \"type\": \"string\",\n                  \"examples\": [\n                    \"CAD/AVL\",\n                    \"AFC\",\n                    \"APC\"\n                  ]\n                },\n                \"product\": {\n                  \"title\": \"Product\",\n                  \"description\": \"What product was used to generate this data (directly or indirectly)?\",\n                  \"type\": \"string\",\n                  \"examples\": [\n                    \"TrolleyMaster\"\n                  ]\n                },\n                \"product_version\": {\n                  \"title\": \"Product Version\",\n                  \"description\": \"Describe the version of the product was used.\",\n                  \"type\": \"string\"\n                },\n                \"vendor\": {\n                  \"title\": \"Vendor\",\n                  \"description\": \"What company makes this product?\",\n                  \"type\": \"string\"\n                }\n              }\n            }\n          },\n          \"licenses\": {\n            \"propertyOrder\": 90,\n            \"title\": \"Licenses\",\n            \"description\": \"The license(s) under which this package is published.\",\n            \"type\": \"array\",\n            \"minItems\": 1,\n            \"items\": {\n              \"title\": \"License\",\n              \"description\": \"An array of license objects which apply to this data package.  Must include at least a `name` or `path`\",\n              \"type\": \"object\",\n              \"anyOf\": [\n                {\n                  \"required\": [\n                    \"name\"\n                  ]\n                },\n                {\n                  \"required\": [\n                    \"path\"\n                  ]\n                }\n              ],\n              \"properties\": {\n                \"name\": {\n                  \"title\": \"Open Definition license identifier\",\n                  \"description\": \"MUST be an Open Definition license identifier, see http://licenses.opendefinition.org/\",\n                  \"type\": \"string\",\n                  \"pattern\": \"^([-a-zA-Z0-9._])+$\",\n                  \"examples\": [\"odc-by\",\"CC-BY-4.0\"]\n                },\n                \"path\": {\n                  \"title\": \"Path\",\n                  \"description\": \"A fully qualified public URL, or a Unix-style relative file path.\",\n                  \"type\": \"string\",\n                  \"pattern\": \"^(?=^[^./~])(^((?!\\\\.{2}).)*$).*$\",\n                  \"examples\": [\n                    \"https://opendefinition.org/licenses/odc-by/\",\n                    \"license.md\"\n                  ],\n                  \"context\": \"Implementations need to negotiate the type of path provided, and dereference the data accordingly.\"\n                },\n                \"title\": {\n                  \"title\": \"Title\",\n                  \"description\": \"A human-readable title of the license.\",\n                  \"type\": \"string\",\n                  \"examples\": [\n                    \"Creative Commons Attribution 4.0\"\n                  ]\n                }\n              }\n            },\n            \"context\": \"This property is not legally binding and does not guarantee that the package is licensed under the terms defined herein.\",\n            \"examples\": [\n              \"{'name':'CC-BY-4.0','path':'https://opendefinition.org/licenses/cc-by/','name':'Creative Commons Attribution 4.0'}\"\n            ]\n          },\n          \"dialect\": {\n            \"propertyOrder\": 50,\n            \"title\": \"CSV Dialect\",\n            \"description\": \"The CSV dialect descriptor.\",\n            \"type\": [\n              \"string\",\n              \"object\"\n            ],\n            \"required\": [\n              \"delimiter\",\n              \"doubleQuote\"\n            ],\n            \"properties\": {\n              \"csvddfVersion\": {\n                \"title\": \"CSV Dialect schema version\",\n                \"description\": \"A number to indicate the schema version of CSV Dialect. Version 1.0 was named CSV Dialect Description Format and used different field names.\",\n                \"type\": \"number\",\n                \"default\": 1.2,\n                \"examples:\": [\n                  \"1.2\"\n                ]\n              },\n              \"delimiter\": {\n                \"title\": \"Delimiter\",\n                \"description\": \"A character sequence to use as the field separator.\",\n                \"type\": \"string\",\n                \"default\": \",\",\n                \"examples\": [\n                  \"`;`\",\n                  \"`|`\"\n                ]\n              },\n              \"doubleQuote\": {\n                \"title\": \"Double Quote\",\n                \"description\": \"Specifies the handling of quotes inside fields.\",\n                \"context\": \"If Double Quote is set to true, two consecutive quotes must be interpreted as one.\",\n                \"type\": \"boolean\",\n                \"default\": true\n              },\n              \"lineTerminator\": {\n                \"title\": \"Line Terminator\",\n                \"description\": \"Specifies the character sequence that must be used to terminate rows.\",\n                \"type\": \"string\",\n                \"default\": \"\\r\\n\",\n                \"examples\": [\n                  \"`\\r`\",\n                  \"`\\n`\"\n                ]\n              },\n              \"nullSequence\": {\n                \"title\": \"Null Sequence\",\n                \"description\": \"Specifies the null sequence, for example, `\\\\N`.\",\n                \"type\": \"string\",\n                \"examples\": [\n                  \"`\\\\N`\"\n                ]\n              },\n              \"quoteChar\": {\n                \"title\": \"Quote Character\",\n                \"description\": \"Specifies a one-character string to use as the quoting character.\",\n                \"type\": \"string\",\n                \"default\": \"\\\"\",\n                \"examples\": [\n                  \"`'`\"\n                ]\n              },\n              \"escapeChar\": {\n                \"title\": \"Escape Character\",\n                \"description\": \"Specifies a one-character string to use as the escape character.\",\n                \"type\": \"string\",\n                \"examples\": [\n                  \"`\\\\`\"\n                ]\n              },\n              \"skipInitialSpace\": {\n                \"title\": \"Skip Initial Space\",\n                \"description\": \"Specifies the interpretation of whitespace immediately following a delimiter. If false, whitespace immediately after a delimiter should be treated as part of the subsequent field.\",\n                \"type\": \"boolean\",\n                \"default\": false\n              },\n              \"header\": {\n                \"title\": \"Header\",\n                \"description\": \"Specifies if the file includes a header row, always as the first row in the file.\",\n                \"type\": \"boolean\",\n                \"default\": true\n              },\n              \"commentChar\": {\n                \"title\": \"Comment Character\",\n                \"description\": \"Specifies that any row beginning with this one-character string, without preceeding whitespace, causes the entire line to be ignored.\",\n                \"type\": \"string\",\n                \"examples\": [\n                  \"`#`\"\n                ]\n              },\n              \"caseSensitiveHeader\": {\n                \"title\": \"Case Sensitive Header\",\n                \"description\": \"Specifies if the case of headers is meaningful.\",\n                \"context\": \"Use of case in source CSV files is not always an intentional decision. For example, should \\\"CAT\\\" and \\\"Cat\\\" be considered to have the same meaning.\",\n                \"type\": \"boolean\",\n                \"default\": false\n              }\n            },\n            \"examples\": [\n              \"{'delimiter': ';' }\"\n       ]\n          },\n          \"format\": {\n            \"propertyOrder\": 80,\n            \"title\": \"Format\",\n            \"description\": \"The file format of this resource.\",\n            \"context\": \"`csv`, `xls`, `json` are examples of common formats.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"`xls`\"\n            ]\n          },\n          \"mediatype\": {\n            \"propertyOrder\": 90,\n            \"title\": \"Media Type\",\n            \"description\": \"The media type of this resource. Can be any valid media type listed with [IANA](https://www.iana.org/assignments/media-types/media-types.xhtml).\",\n            \"type\": \"string\",\n            \"pattern\": \"^(.+)/(.+)$\",\n            \"examples\": [\n              \"`text/csv`\"\n            ]\n          },\n          \"encoding\": {\n            \"propertyOrder\": 100,\n            \"title\": \"Encoding\",\n            \"description\": \"The file encoding of this resource.\",\n            \"type\": \"string\",\n            \"default\": \"utf-8\",\n            \"examples\": [\n              \"`utf-8`\"\n            ]\n          },\n          \"bytes\": {\n            \"propertyOrder\": 110,\n            \"options\": {\n              \"hidden\": true\n            },\n            \"title\": \"Bytes\",\n            \"description\": \"The size of this resource in bytes.\",\n            \"type\": \"integer\",\n            \"examples\": [\n              \"2082\"\n            ]\n          },\n          \"hash\": {\n            \"propertyOrder\": 120,\n            \"options\": {\n              \"hidden\": true\n            },\n            \"title\": \"Hash\",\n            \"type\": \"string\",\n            \"description\": \"The MD5 hash of this resource. Indicate other hashing algorithms with the {algorithm}:{hash} format.\",\n            \"pattern\": \"^([^:]+:[a-fA-F0-9]+|[a-fA-F0-9]{32}|)$\",\n            \"examples\": [\n              \"d25c9c77f588f5dc32059d2da1136c02\",\n              \"SHA256:5262f12512590031bbcc9a430452bfd75c2791ad6771320bb4b5728bfb78c4d0\"\n            ]\n          }\n        }\n      }\n    },\n    \"sources\": {\n      \"propertyOrder\": 140,\n      \"options\": {\n        \"hidden\": true\n      },\n      \"title\": \"Sources\",\n      \"description\": \"The raw sources for this data package which describe where the data came from. Can be alternatively specified at the individual resource-level.\",\n      \"type\": \"array\",\n      \"minItems\": 0,\n      \"examples\": [\n        \"[ {'title':'Trolley CAD/AVL System','component':'CAD/AVL','product':'TrolleyMaster','product_version':'3.1.4'} ]\"\n      ],\n      \"items\": {\n        \"title\": \"Source\",\n        \"type\": \"object\",\n        \"required\": [\n          \"title\"\n        ],\n        \"properties\": {\n          \"title\": {\n            \"title\": \"Title\",\n            \"description\": \"Human-readable title of the data source.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Trolley CAD/AVL System\"\n            ]\n          },\n          \"component\": {\n            \"title\": \"Component\",\n            \"description\": \"What technology component was used to generate this data (directly or indirectly)? Examples include `AVL`, `APC`, `AFC`, etc.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"CAD/AVL\",\n              \"AFC\",\n              \"APC\"\n            ]\n          },\n          \"product\": {\n            \"title\": \"Product\",\n            \"description\": \"What product was used to generate this data (directly or indirectly)?\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"TrolleyMaster\"\n            ]\n          },\n          \"product_version\": {\n            \"title\": \"Product Version\",\n            \"description\": \"Describe the version of the product was used.\",\n            \"type\": \"string\"\n          },\n          \"vendor\": {\n            \"title\": \"Vendor\",\n            \"description\": \"What company makes this product?\",\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n
"},{"location":"development/","title":"Development","text":""},{"location":"development/#contributing-to-tides","title":"Contributing to TIDES","text":"

Thank you for contributing to the TIDES Project. This document outlines the process for contributing to the project and documents the governance roles and approach for decision-making. Where TIDES Governance and this document differ, the TIDES Governance shall take precedence.

"},{"location":"development/#becoming-a-tides-contributor","title":"Becoming a TIDES Contributor","text":"

As defined in the TIDES Governance, a TIDES-Contributor has the rights to:

These roles and responsibilities are further detailed in the TIDES Governance and documents linked to from it.

Individuals may request to be a Contributor by completing the registration formthat includes acknowledgement of the Contributor Agreement and Code of Conduct.

"},{"location":"development/#how-to-contribute","title":"How to Contribute","text":"
  1. Become a TIDES Contributor
  2. Follow setup instructions if you\u2019d like to contribute code or provide code reviews.
  3. Offer to help research an issue
  4. Offer to help resolve an issue with a pull-request
  5. Offer to review a pull-request

Warning

By making any contribution to the projects, contributors self-certify to the Contributor Agreement.

"},{"location":"development/#setup","title":"Setup","text":"
  1. Make sure you have a GitHub account.
  2. Make sure you have git, a terminal (e.g. Mac Terminal, CygWin, etc.), and a text editor installed on your local machine. Optionally, you will likely find it easier to use GitHub Desktop, an IDE instead of a simple text editor like VSCode, Eclipse, Sublime Text, etc.
  3. Clone the repository locally. Non-registered contributors should fork the repository first, since they will be unable to push branches directly to the main repository.
  4. Install development requirements packages pip install -r requirements.txt or in a virtual environment.

Using a virtual environment

It is often helpful to install requirements for vairous projects inside a virtual environment rather than in your main python installation. Some virtual environments to consider include: conda,pipenv,poetry, and rye.

"},{"location":"development/#contribution-workflow","title":"Contribution Workflow","text":"
  1. Create a feature branch to work on a new issue (or checkout an existing one where the issue is being worked on).
  2. Make your changes.
  3. Run tests/test_local_spec script to check and fix formatting, validate profile and schemas with frictionless and with each other, and confirm that documentation can be built locally.
  4. Run tests/test_samples_to_local script to check if samples conform to any changes to the spec.
  5. Commit your work in git
  6. push your changes to Github and submit a pull request

Create a feature branch on a clone of tides-transit/TIDES, not a fork

If you have the permissions (which you should if you are a TIDE Contributor), you should complete your work on a feature branch from a clone of the main TIDES repository (tides-transit/TIDES) rather than a fork of it (e.g. my-github-handle/TIDES) so that when you submit a pull request the continuous integration tests will have the right permissions to run.

"},{"location":"development/#issues","title":"Issues","text":"

Create issues to start discussion on a new topic. If the issue is associated with a pull request, be sure to link the two. There are shortcuts here

"},{"location":"development/#pull-requests","title":"Pull Requests","text":"

Use the following guidance in creating and responding to pull requests

If you worked from a fork

If you worked from a fork of the TIDES/tides-transit repo instead of a feature branch of a clone of the TIDES/tides-transit repo, you will not have the right permissions to run the continuous integration tests when you submit a pull request. To remedy, please push the branch of your local fork to a feature branch of the main repository:

git remote add upstream git@github.com/TIDES-transit/TIDES.git\ngit push upstream <my-feature-branch-name>\n

\u2026and now you should be able to submit a pull request from that feature branch which should have the permission to run the continuous integration tests.

Run into a permissions issue with that command? Make sure you a registered contributor and that you have accepted the resulting invitation to join the tides-transit team on Github.

"},{"location":"development/#commits","title":"Commits","text":"

Use the following guidance for commits

"},{"location":"development/#continuous-integration-continuous-deployment","title":"Continuous Integration / Continuous Deployment","text":"

We leverage Github Actions workflows to flag potentially erronious contributions and build, preview and deploy documentation that is in sync with the schema definition files.

Workflows are defined in /.github/workflows/ include the following:

File Description validate_package_schema.yml Validates Data Package definition validate_table_schemas.yml Validates Schema Files docs.yml Builds and deploys documentation docs.yml Process flowchart LR setup-python --> pip[\"pip install docs/requirements.txt\"] pip[\"pip install docs/requirements.txt\"] --> gh_mike[\"mike\"] gh_mike[\"mike\"] --> gh-pages/branch-name"},{"location":"development/#documentation","title":"Documentation","text":"

The documentation for the TIDES specification is available at https://tides-transit.github.io/TIDES/ This site is automatically recreated each time a change is made to the specification.

More information about updating and building TIDES documentation\u2026

"},{"location":"development/#tides-contributor-license-agreement","title":"TIDES Contributor License Agreement","text":"

By making any contribution to the projects, contributors self-certify to the the TIDES Contributor Agreement.

"},{"location":"development/#license-to-use","title":"License to Use","text":"

The TIDES specification is licensed under the Apache License 2.0 (code) and Creative Commons Attribution 4.0 (sample data, specification, and documentation) as defined in file."},{"location":"development/#project-governance","title":"Project Governance","text":"

The TIDES Project Governance and the roles within are detailed in the TIDES-governance documentation.

"},{"location":"development/#github-access-levels","title":"GitHub Access Levels","text":"Role Access Level Board Admin Program Manager Admin Board Coordinator Write Manager Write Contributor Group Write Stakeholder Read/Create Issues"},{"location":"development/#review-and-approval-process","title":"Review and Approval Process","text":"

The TIDES Board has final approval of all normative changes changes to the specificaiton and project governance. All Contributors are permitted and encouraged to discuss and comment on issues and pull requests and make recommendations for changes to the specification. Contributions made as a pull request by Contributors which do not make any changes to the /spec or /docs/governance directories may be approved by a another Contributor if it passes the continuous integration tests.

Following v1.0, TIDES will adhere to this change management and versioning policy.

"},{"location":"development/#tides-code-of-conduct","title":"TIDES Code of Conduct","text":"

Contributors to the TIDES Project are expected to read and follow the code of conduct for the project.

"},{"location":"documentation/","title":"Documentation","text":"

The documentation for the TIDES specification is available at https://tides-transit.github.io/TIDES/ This site is automatically recreated each time a change is made to the specification.

When a change is pushed to the TIDES specification repository, Github Actions deployes the workflow docs.yml that rebuilds the files for the TIDES documentation site. When a pull request is opened from a branch on the main repository, a draft version of the docs is built for preview purposes via the same process. For security purposes, documentation is not automatically built on pull requests opened from forks.

Files used in TIDES Documentation Name What it does /.github/workflows/docs.yml /docs/requirements.txt Lists resources needed to generate documentation /mkdocs.yml Controls mkdocs: main.py Defines macros used by mkdocs-macros, which can be referenced in the various markdown documentation files to generate markdown content, including from the Frictionless spec .json files /docs/*.md These markdown files contain the content for the documentation site, either directly or by reference. /docs/index.md Documentation homepage using content from README.me /docs/architecture.md Documents the overall spec architcture using a list of spec tables generated from tides.spec.json and diagrams the relationships between tables with mermaid /docs/tables.md Documents the detailed schemas for each table generated from /spec/*.schema.json /docs/development.md Documents spec development processes using content from CONTRIBUTING.md and CODE_OF_CONDUCT.md Tools Used in TIDES Documentation Name What it does GitHub Actions Runs following workflow on each push to the TIDES github repository: /.github/workflows/docs.yml mike runs mkdocs and puts output in a folder in gh_pages branch which corresponds to the name of the branch (i.e. main, develop, pr-163, etc) For new branches with documentation, adds an entry in versions.json mkdocs Package which generates documentation from markdown and code Overview of Documentation Building Process flowchart LR subgraph mkdocs[\"mkdocs: run on execution of mike\"] md_mike[\"mike\"] -->|runs for current branch| md_mkdocs[\"mkdocs\"] md_mkdocs.yml[\"mkdocs.yml\"] -->|specifieds parameters| md_mkdocs[\"mkdocs\"] md_mkdocs_macros[\"mkdocs-macros\"] -->|\"plugin for\"| md_mkdocs[\"mkdocs\"] main.py[/\"main.py\"/] -->|defines macros in code available for| md_mkdocs_macros[\"mkdocs-macros\"] end subgraph mkdocs-macros[\"mkdocs-macros: run on execution of mkdocs\"] if_spec[\"architecture.md frictionless_spec('spec/tides.spec.json')\"] if_schemas[\"tables.md frictionless_schemas('spec/**.schema.json')\"] if_readme[\"index.md include_file('README.md'}\"] if_contributing[\"development.md include_file('contributing.md'}\"] end subgraph \"/docs\" index.md[/\"index.md\"/] -->|specified in| md_mkdocs.yml[/\"mkdocs.yml\"/] architecture.md[/\"architecture.md\"/] -->|specified in| md_mkdocs.yml tables.md[/\"tables.md\"/] -->|specified in| md_mkdocs.yml development.md[/\"development.md\"/] -->|specified in| md_mkdocs.yml end subgraph site[\"/site: output of mkdocs\"] index.html[/\"index.html\"/] development.html[/\"development.html\"/] architecture.html[/\"architecture.html\"/] tables.html[/\"tables.html\"/] end subgraph \"/spec\" spec[/\"*/schema.json\"/] schemas[/\"tides.spec.json\"/] end README[/\"README.md\"/]-->if_readme index.md-->if_readme if_readme --> index.html CONTRIBUTING[/\"CONTRIBUTING.md\"/]-->if_contributing development.md-->if_contributing if_contributing--> development.html tables.md-->if_schemas schemas-->if_schemas if_schemas--> tables.html architecture.md-->if_spec spec-->if_spec if_spec--> architecture.html"},{"location":"governance/","title":"TIDES Governance","text":"

Governance of the TIDES Project is achieved through the definition and filling of the following roles as defined here and fulfilled by the following individuals as noted:

Role Who TIDES Board TIDES Board Coordinator John Levin, Metro Transit (Minneapolis) TIDES Manager MobilityData TIDES Program Manager TBD TIDES Contributor List of Contributors TIDES Stakeholder Anyone who has an interest in or could be directly affected by the TIDES specification and tools."},{"location":"governance/#definitions","title":"Definitions","text":""},{"location":"governance/#tides-project","title":"TIDES Project","text":"

The TIDES Project is made up of:

"},{"location":"governance/#roles","title":"Roles","text":""},{"location":"governance/#tides-owner","title":"TIDES Owner","text":"

TIDES is collectively owned and governed by a Board of Directors.

"},{"location":"governance/#tides-board-of-directors","title":"TIDES Board of Directors","text":"

TIDES is governed by a Board of Directors. The Board meets roughly one a month and has a public agenda and minutes.

"},{"location":"governance/#board-membership","title":"Board Membership","text":""},{"location":"governance/#board-coordinator","title":"Board Coordinator","text":""},{"location":"governance/#board-decisions","title":"Board Decisions","text":""},{"location":"governance/#board-member-role-and-term","title":"Board Member Role and Term","text":""},{"location":"governance/#board-makeup","title":"Board Makeup","text":""},{"location":"governance/#tides-manager","title":"TIDES Manager","text":""},{"location":"governance/#tides-program-manager","title":"TIDES Program Manager","text":""},{"location":"governance/#management-implementation-and-principles","title":"Management Implementation and Principles","text":""},{"location":"governance/#tides-contributor","title":"TIDES Contributor","text":""},{"location":"governance/#tides-stakeholder","title":"TIDES Stakeholder","text":""},{"location":"governance/#document-history","title":"Document History","text":""},{"location":"governance/#2023-12-04","title":"2023-12-04","text":""},{"location":"governance/#2024-01-04","title":"2024-01-04","text":""},{"location":"governance/#initial-version","title":"Initial Version","text":""},{"location":"samples/","title":"Sample Data","text":"

Sample data can be found in the /samples directory, with one directory for each data sample.

"},{"location":"samples/#samples-directory-organization","title":"Samples Directory Organization","text":"

Each TIDES Data Package example should follow the following directory structure, consistent with the structure of the Frictionless Data Package specification, including:

unique-example-name\n  \\TIDES     # Required. Data to be validated against the TIDES specification\n  \\datapackage.json # Required. [`tides-data-package`](#tides-data-package) metadata\n  \\raw      # Optional. Data which the agency uses to create TIDES data\n  \\scripts  # Optional. Scripts used to transform raw --> TIDES\n
"},{"location":"samples/#adding-examples","title":"Adding Examples","text":"

We encourage the addition of examples, but please follow the following guidelines:

  1. No large files This isn\u2019t the place to store your data, rather to document some minimal examples. The recommended size is 100-1000 records per file, more if absolutely required to reproduce an issue with the spec. All individual files should be well under 50 MB.
  2. Include Metadata as specified in tides-data-package.
  3. Include a README.md in the base folder of your example with an overview so that it can be included in the documentation.
"},{"location":"samples/#data-package","title":"Data Package","text":"

TIDES sample data must include a datapackage.json in the format specified by the tides-data-package json schema (an extension of the frictionless data package).

See:

"},{"location":"samples/#data-validation","title":"Data validation","text":"

Data with a valid datapackage.json can be easily validated using the frictionless framework, which can be installed and invoked as follows:

pip install frictionless\nfrictionless validate --schema-sync path/to/your/datapackage.json\n

Alternatively, we also provide a wrapper script to provide some additional flexibility and options.

Usage: bin/validate-datapackage [-v remote_spec_ref | -l local_spec_path] [-d dataset_path]

Key usage examples:

If you only want to validate your datapackage.json file and not the datapackage as a whole, you can run the script bin/validate-datapackage-to-profile instead with the same options. Note that\u00a0this is also run as a part of validate-datapackage.

"},{"location":"samples/#specific-files","title":"Specific files","text":"

Specific files can be validated by running the frictionless framework against them and their corresponding schemas as follows:

frictionless validate vehicles.csv --schema https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/vehicles.schema.json\n
"},{"location":"samples/#continuous-data-validation","title":"Continuous Data Validation","text":"

Sample data in the \\TIDES subdirectories of each sample is validated upon a push action to the main repository.

"},{"location":"samples/#data-list","title":"Data List","text":"Sample* Agency Resources *Vendors"},{"location":"tables/","title":"Data Table Schemas","text":"

Data table schemas are specified in JSON and are compatible with the frictionless data table schema standards.

"},{"location":"tables/#event-tables","title":"Event Tables","text":""},{"location":"tables/#fare-transactions","title":"Fare Transactions","text":"

fare_transactions.schema.json

Timestamped fare transaction, associated with devices.

Primary key: {transaction_id}

name constraints type description rdfType title transaction_id RequiredUnique string Identifies the fare transaction. service_date Required date Service date. References GTFS event_timestamp Required datetime Recorded event timestamp, including for transactions that may be aggregated values associated with a trip or vehicle. location_ping_id string Identifies the vehicle location where the fare transaction occurred ID referencing vehicle_locations.location_ping_id amount Required number Value of the transaction. currency_type string Currency used for the transaction. References GTFS https://schema.org/currency fare_action RequiredAllowed Values - Unknown action type- Purchase- Enter- Exit- Transfer entrance- Transfer exit- Add- New- Capture- Extend- Combine- Void- Activate- Adjust- Other string Indicates the type of action performed.Unknown action type: the action type is unknown or missingPurchase: purchase a new card, ticket, pass, or other fare productEnter: enter a fare-controlled area or vehicleExit: exit a fare-controlled area or vehicleTransfer entrance: enter a fare-controlled area or vehicle at no charge due to network or fare policy rules, such as a desginated free transfer at two nearby fare-controlled stationsTransfer exit: exit a fare-controlled area or vehicle at no charge due to network or fare policy rules, such as a desginated free transfer at two nearby fare-controlled stationsAdd: add stored value or stored rides to an existing fare instrumentNew: obtain a new fare instrumentCapture: the device confiscated or retained the fare instrumentExtend: extend a fare product\u2019s temporal validityCombine: combine two or more fare instruments or products into oneVoid: void, cancel, negate, or undo a previous fare transactionActivate: make a fare product active for travelAdjust: credit or debit a fare instrument to balance an earlier transactionOther: other action not included in this enumeration trip_id_performed string Identifies the trip performed. May be null if the fare collection device is NOT located on a vehicle. May be null if on a vehicle but trip-level data is unavailable, in which case the data would be associated with the vehicle. ID referencing trips_performed.trip_id_performed trip_id_scheduled string Identifies the scheduled trip. May be null if the fare collection device is NOT located on a vehicle. May be null if on a vehicle but schedule data is unavailable, in which case the data would be associated with the vehicle. ID referencing trips_performed.trip_id_scheduled pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern trip_stop_sequence minimum: 1 integer The actual order of stops visited within a performed trip. The values must start at 1 and must be consecutive along the trip. Example: A bus departs the first stop and detours around the second and third scheduled stops, visiting one unscheduled stop and resuming regular service at the 4th scheduled stop. The scheduled_stop_sequence is [1, null, 4], and the trip_stop_sequence is [1, 2, 3]. Positive integer referencing stop_visits.trip_stop_sequence scheduled_stop_sequence minimum: 0 integer Scheduled order of stops for a particular trip. The values must increase along the trip but do not need to be consecutive. References GTFS positive integer referencing GTFS stop_times.stop_sequence vehicle_id string Identifies the vehicle. May be null if collection device is NOT located on a vehicle. May be null if on a vehicle but vehicle data is unavailable, in which case the data would be associated with a trip and/or stop. ID referencing vehicles.vehicle_id device_id string Identifies the ITS device on which the fare transaction was performed. May be null if only a single device is reporting fare transactions on a vehicle and vehicle_id is provided. May be null if only a single device is reporting fare transactions at a stop and stop_id is provided. ID referencing devices.device_id fare_id string Identifies a fare class, as included in the GTFS Fare_attributes file. References GTFS ID referencing GTFS fare_attributes.fare_id stop_id string Identifies the stop. References GTFS ID referencing GTFS stops.stop_id num_riders minimum: 0 integer The number of riders included in the transaction. fare_media_id Allowed Values - Cash or coins- Smart card or ticket- Magnetic-stripe card or ticket- Bank card- Mobile NFC- Optical scan- Button pressed by driver or operator to indicate a boarding or alighting passenger.- Other type string Indicates the fare medium that was used for the transaction. rider_category string Indicates rider category (categories defined by transit agency). For example:AdultYouthStudentSeniorOther reduced fare_product string Indicates the fare group (fare groups defined by transit agency). For example:Single ridePassEmployer sponsoredOther pass fare_period string Indicates the fare period (fare periods defined by transit agency). For example:All dayPeakOff-peakSummerOther fare_capped Required boolean Indicates if the fare charged in this transaction was modified by a fare capping policy. token_id string Identifies the individual fare instrument used for the transaction. For example, the fare card ID. balance number Stored value remaining on an account after the transaction is made."},{"location":"tables/#passenger-events","title":"Passenger Events","text":"

passenger_events.schema.json

Timestamped passenger-related events, including boardings and alightings.

Primary key: {passenger_event_id}

name constraints type description title passenger_event_id RequiredUnique string Identifies the recorded passenger event. service_date Required date Service date. References GTFS event_timestamp Required datetime Recorded event timestamp. location_ping_id string Identifies the vehicle location where the passenger event occurred ID referencing vehicle_locations.location_ping_id trip_id_performed string Identifies the trip performed. If trips_performed table is used, this must be populated in order to link to it. ID referencing trips_performed.trip_id_performed trip_id_scheduled string Identifies the scheduled trip. ID referencing trips_performed.trip_id_scheduled trip_stop_sequence Required minimum: 1 integer The actual order of stops visited within a performed trip. The values must start at 1 and must be consecutive along the trip. Example: A bus departs the first stop and detours around the second and third scheduled stops, visiting one unscheduled stop and resuming regular service at the 4th scheduled stop. The scheduled_stop_sequence is [1, null, 4], and the trip_stop_sequence is [1, 2, 3]. Positive integer referencing stop_visits.trip_stop_sequence scheduled_stop_sequence minimum: 0 integer Scheduled order of stops for a particular trip. The values must increase along the trip but do not need to be consecutive. References GTFS positive integer referencing GTFS stop_times.stop_sequence event_type RequiredAllowed Values - Vehicle arrived at stop- Vehicle departed stop- Door opened- Door closed- Passenger boarded- Passenger alighted- Kneel was engaged- Kneel was disengaged- Ramp was deployed- Ramp was raised- Ramp deployment failed- Lift was deployed- Lift was raised- Individual bike boarded- Individual bike alighted- Bike rack deployed string Indicates the type of event recorded. vehicle_id Required string Identifies a vehicle. ID referencing vehicles.vehicle_id device_id string Identifies the device that recorded the event. May be null if only a single device is reporting passenger events on a vehicle/ train car and the device_id is not distinct from vehicle_id/train_car_id. ID referencing devices.device_id train_car_id string Identifies the train car. ID referencing train_cars.train_car_id stop_id string Identifies the stop the vehicle is serving. References GTFS ID referencing GTFS stops.stop_id pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern event_count minimum: 0 integer Count for this event, e.g., 3 for a Passenger Boarding event with 3 boardings, default is 1 Event count"},{"location":"tables/#vehicle-locations","title":"Vehicle Locations","text":"

vehicle_locations.schema.json

Timestamped vehicle locations and speeds.

Primary key: {location_ping_id}

name constraints type description title location_ping_id RequiredUnique string Identifies the recorded vehicle location event. service_date date Service date. References GTFS event_timestamp Required datetime Recorded event timestamp. trip_id_performed string Identifies the trip performed. If trips_performed table is used, this must be populated in order to link to it. ID referencing trips_performed.trip_id_performed trip_id_scheduled string Identifies the scheduled trip. ID referencing trips_performed.trip_id_scheduled trip_stop_sequence minimum: 1 integer The actual order of stops visited within a performed trip. The values must start at 1 and must be consecutive along the trip. Example: A bus departs the first stop and detours around the second and third scheduled stops, visiting one unscheduled stop and resuming regular service at the 4th scheduled stop. The scheduled_stop_sequence is [1, null, 4], and the trip_stop_sequence is [1, 2, 3]. Positive integer referencing stop_visits.trip_stop_sequence scheduled_stop_sequence minimum: 0 integer Scheduled order of stops for a particular trip. The values must increase along the trip but do not need to be consecutive. References GTFS positive integer referencing GTFS stop_times.stop_sequence vehicle_id Required string Identifies a vehicle. ID referencing vehicles.vehicle_id device_id string Identifies the device that recorded the vehicle location. May be null if only a single device is reporting vehicle location and the device_id is not distinct from vehicle_id. ID references devices.device_id pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern stop_id string Identifies the stop the vehicle is approaching or serving currently. References GTFS ID referencing GTFS stops.stop_id current_status Allowed Values - Incoming at- Stopped at- In transit to string Indicates the status of the vehicle in reference to a stop. References GTFS-Realtime latitude minimum: -90 maximum: 90 number Degrees North, in the WGS-84 coordinate system. References GTFS-Realtime longitude minimum: -180 maximum: 180 number Degrees East, in the WGS-84 coordinate system. References GTFS-Realtime gps_quality Allowed Values - Excellent- Good- Poor string Indicates the quality of data and communication provided by the GPS. heading minimum: 0 maximum: 360 number Heading, in degrees, clockwise from true north, e.g., 0 would mean north and 90 would mean east. This can be the compass bearing, or the direction towards the next stop or intermediate location. This should not be deduced from the sequence of previous positions, which clients can compute from previous data. References GTFS-Realtime speed minimum: 0 number Momentary speed measured by the vehicle, in meters per second. References GTFS-Realtime odometer minimum: 0 number Odometer value, in meters. References GTFS-Realtime schedule_deviation integer Indicates schedule adherence in seconds. A negative value represents an early vehicle. (An unscheduled trip would not have a scheduled deviation.) headway_deviation integer Indicates headway adherence in seconds. A negative value represents a shorter than scheduled headway. trip_type Allowed Values - In service- Deadhead- Layover- Pullout- Pullin- Extra Pullout- Extra Pullin- Deadhead To Layover- Deadhead From Layover- Other not in service string Indicates status of travel with regard to service. schedule_relationship Allowed Values - Scheduled- Skipped- Added- Missing string Indicates the status of the stop."},{"location":"tables/#summary-tables","title":"Summary Tables","text":""},{"location":"tables/#station-activities","title":"Station Activities","text":"

station_activities.schema.json

Summarized transactions, entries, and exits by stop or station and time period for each service date (for events not associated with a trip).

Primary key: {service_date, time_period_end, time_period_start, stop_id}

name constraints type description title service_date Required date Service date stop_id Required string Identifies stop. References GTFS ID referencing GTFS stops.stop_id time_period_start Required datetime Aggregation period start time. time_period_end Required datetime Aggregation period end time. time_period_category string Indicates a standard time period to aid further aggregation. For example:All dayPeakOff-peakSummerOther total_entries minimum: 0 integer Number of events at the stop considered entries, such as boardings or fare transactions. total_exits minimum: 0 integer Number of events at the stop considered exits, such as alightings. number_of_transactions minimum: 0 integer Number of fare transactions that occurred at a stop. bike_entries minimum: 0 integer Number of bikes that entered the stop. bike_exits minimum: 0 integer Number of bikes that exited the stop. ramp_entries minimum: 0 integer Number of entries that used a ramp or accessible entrance. ramp_exits minimum: 0 integer Number of exits that used a ramp or accessible exit."},{"location":"tables/#stop-visits","title":"Stop Visits","text":"

stop_visits.schema.json

Summarized boarding, alighting, arrival, departure, and other events (kneel engaged, ramp deployed, etc.) by trip and stop for each service date.

Primary key: {trip_id_performed, service_date, trip_stop_sequence}

name constraints type description title service_date Required date Service date. References GTFS indirectly via calendars.txt and calendar_dates.txt trip_id_performed Required string Identifies the trip performed ID referencing trips_performed.trip_id_performed trip_stop_sequence Required minimum: 1 integer The actual order of stops visited within a performed trip. The values must start at 1 and must be consecutive along the trip. Example: A bus departs the first stop and detours around the second and third scheduled stops, visiting one unscheduled stop and resuming regular service at the 4th scheduled stop. The scheduled_stop_sequence is [1, null, 4], and the trip_stop_sequence is [1, 2, 3]. scheduled_stop_sequence minimum: 0 integer Scheduled order of stops for a particular trip. The values must increase along the trip but do not need to be consecutive. References GTFS positive integer referencing GTFS stop_times.stop_sequence pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern vehicle_id string Identifies the vehicle. ID referencing vehicles.vehicle_id dwell minimum: 0 integer Indicates the amount of time a vehicle spent stopped at a stop in seconds. stop_id string Identifies the stop. References GTFS ID referencing GTFS stops.stop_id timepoint boolean Indicates if the stop should be used for evaluating schedule adherence, on-time performance, and other KPIs. This could be populated to match the GTFS \u201ctimepoint\u201d field. schedule_arrival_time datetime Scheduled timestamp at which the vehicle arrives at a stop. References GTFS schedule_departure_time datetime Scheduled timestamp at which the vehicle departs from a stop. References GTFS actual_arrival_time datetime Timestamp at which the vehicle arrives at a stop. actual_departure_time datetime Timestamp at which the vehicle departs from a stop. distance minimum: 0 integer Observed distance in meters from the previous stop traveled by the vehicle. boarding_1 minimum: 0 integer Number of riders who entered through the vehicle\u2019s front doors (in vehicles with doors opening on only one side, or when passengers primarily board through the front, as is typical with buses) or the vehicle\u2019s right doors (in vehicles with doors on both sides, or when passengers board through all doors, as is typical with trains). alighting_1 minimum: 0 integer Number of riders who exited through the vehicle\u2019s front doors (in vehicles with doors opening on only one side, or when passengers primarily board through the front, as is typical with buses) or the vehicle\u2019s right doors (in vehicles with doors on both sides, or when passengers board through all doors, as is typical with trains). boarding_2 minimum: 0 integer Number of riders who entered through other doors, such as a bus\u2019s rear door when boarding_1 captures the front door, or a train\u2019s left doors when boarding_1 captures right doors. alighting_2 minimum: 0 integer Number of riders who exited through other doors, such as a bus\u2019s rear door when alighting_1 captures the front door, or a train\u2019s left doors when alighting_1 captures right doors. departure_load minimum: 0 integer Number of riders on the vehicle when departing the stop. door_open datetime Timestamp at which the doors opened. door_close datetime Timestamp at which the doors closed. door_status Allowed Values - Doors did not open- Front door opened and back doors remain closed- Back doors opened and front door remained closed- All doors opened- Other configuration string Indicates actions of the doors during the stop visit. ramp_deployed_time minimum: 0 number Duration of time a ramp is deployed, in seconds. ramp_failure boolean Indicates if the ramp deployment failed at a stop. kneel_deployed_time minimum: 0 number Duration of time a kneel is deployed in seconds. lift_deployed_time minimum: 0 number Duration of time in seconds of time a lift is deployed. bike_rack_deployed boolean Indicates if the bike rack was deployed at a stop. bike_load minimum: 0 integer Number of bikes on the vehicle when departing the stop. revenue number Amount of revenue collected at the stop. number_of_transactions minimum: 0 integer Number of fare transactions that occurred at a stop. schedule_relationship Allowed Values - Scheduled- Skipped- Added- Missing string Indicates the status of the stop."},{"location":"tables/#trips-performed","title":"Trips Performed","text":"

trips_performed.schema.json

Trips performed for each service date.

Primary key: {trip_id_performed, service_date}

name constraints type description title service_date Required date Service date. References GTFS trip_id_performed Required string Uniquely identifies the trip performed. It must be unique for a service_date (and it can optionally be unique across all time). It does not have to equal trip_id_scheduled. vehicle_id Required string Identifies the vehicle. ID referencing vehicles.vehicle_id trip_id_scheduled string Identifies the scheduled trip associated with the trip performed. One scheduled trip may be associated with multiple operated trips, or an operated trip may not be associated with a scheduled trip. References GTFS. If this trip was published in GTFS Schedule, this value should be consistent with the GTFS trip_id. If this trip was not scheduled, the value should be Null. ID referencing GTFS trips.trip_id route_id string Identifies the route. References GTFS ID referencing GTFS routes.route_id route_type Allowed Values - Tram / Streetcar / Light rail- Subway / Metro- Rail- Bus- Ferry- Cable tram- Aerial lift- Funicular- Trolleybus- Monorail- Railway Service- High Speed Rail Service- Long Distance Trains- Inter Regional Rail Service- Car Transport Rail Service- Sleeper Rail Service- Regional Rail Service- Tourist Railway Service- Rail Shuttle (Within Complex)- Suburban Railway- Replacement Rail Service- Special Rail Service- Lorry Transport Rail Service- All Rail Services- Cross-Country Rail Service- Vehicle Transport Rail Service- Rack and Pinion Railway- Additional Rail Service- Coach Service- International Coach Service- National Coach Service- Shuttle Coach Service- Regional Coach Service- Special Coach Service- Sightseeing Coach Service- Tourist Coach Service- Commuter Coach Service- All Coach Services- Urban Railway Service- Metro Service- Underground Service- All Urban Railway Services- Bus Service- Regional Bus Service- Express Bus Service- Stopping Bus Service- Local Bus Service- Night Bus Service- Post Bus Service- Special Needs Bus- Mobility Bus Service- Mobility Bus for Registered Disabled- Sightseeing Bus- Shuttle Bus- School Bus- School and Public Service Bus- Rail Replacement Bus Service- Demand and Response Bus Service- All Bus Services- Trolleybus Service- Tram Service- City Tram Service- Local Tram Service- Regional Tram Service- Sightseeing Tram Service- Shuttle Tram Service- All Tram Services- Water Transport Service- Air Service- Ferry Service- Aerial Lift Service- Telecabin Service- Cable Car Service- Elevator Service- Chair Lift Service- Drag Lift Service- Small Telecabin Service- All Telecabin Services- Funicular Service- Taxi Service- Communal Taxi Service- Water Taxi Service- Rail Taxi Service- Bike Taxi Service- Licensed Taxi Service- Private Hire Service Vehicle- All Taxi Services- Miscellaneous Service- Horse-drawn Carriage string Indicates the type of transportation used on a route. References GTFS routes.route_type including Google\u2019s Extended Route Types GTFS extension ntd_mode Allowed Values - Aerial Tramway- Alaska Railroad- Bus- Bus Rapid Transit- Cable Car- Commuter Bus- Commuter Rail- Demand Response- Demand Taxi- Ferryboat- Heavy Rail- Hybrid Rail- Inclined Plane- Jitney- Light Rail- Monorail/Automated Guideway- Other- P\u00fablico- Streetcar- Trolleybus- Vanpool string NTD mode, references the Modes and Types of Service section of the Introduction to the NTD Full Reporting Policy Manual https://www.transit.dot.gov/ntd/manuals route_type_agency string Agency specific route type shape_id string Identifies a geospatial shape that describes the vehicle travel path for a trip. References GTFS ID referencing shapes.shape_id pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern direction_id Allowed Values - 0- 1 integer Indicates the direction of travel for a trip. References GTFS operator_id string Identifies the vehicle\u2019s operator. ID referencing operators.operator_id block_id string Identifies the block to which the trip belongs. A block consists of a single trip, or many sequential trips made using the same vehicle, defined by shared service days and block_id. A block_id can have trips with different service days, making distinct blocks. See example in GTFS documentation. References GTFS ID referencing trips.block_id trip_start_stop_id string Origin stop_id. References GTFS ID referencing GTFS stops.stop_id trip_end_stop_id string Destination stop_id. References GTFS ID referencing GTFS stops.stop_id schedule_trip_start datetime Scheduled departure time from the trip\u2019s origin. schedule_trip_end datetime Scheduled end timestamp at the trip\u2019s destination. actual_trip_start datetime Timestamp at which the vehicle departed its origin. actual_trip_end datetime Timestamp at which the vehicle arrived at its destination. trip_type Allowed Values - In service- Deadhead- Layover- Pullout- Pullin- Extra Pullout- Extra Pullin- Deadhead To Layover- Deadhead From Layover- Other not in service string Indicates status of travel with regard to service. schedule_relationship Allowed Values - Scheduled- Added- Unscheduled- Canceled- Duplicated string Indicates the status of the trip. References GTFS-realtime TripUpdate.trip.schedule_relationship"},{"location":"tables/#supporting-tables","title":"Supporting Tables","text":""},{"location":"tables/#devices","title":"Devices","text":"

devices.schema.json

Measurement devices, such as AVL, APC, and AFC devices, associated with vehicles or stops or stations.

Primary key: {device_id}

name constraints type description title device_id RequiredUnique string Identifies a device. If possible, this should match other internal agency device IDs. stop_id string Identifies the stop (or other location) at which the device is located. May be null if the device is on a vehicle. References GTFS ID referencing GTFS stops.stop_id vehicle_id string Identifies the vehicle on which the device is located. May be null if the device is at a stop or station. ID referencing vehicles.vehicle_id train_car_id string Identifies the train car or asset on which the device is located. May be null if the device is at a stop or station or if the Train_cars file is not used. ID referencing train_cars.train_car_id device_type Allowed Values - Farebox- Fare gate- Fare vending machine- Passenger counter- Vehicle location- Other string Indicates the type of device. device_vendor string Vendor of the device. device_model string Model of the device as specified by the vendor. device_location string Indicates the location of a device on the vehicle or at a station. For example:Front door.Back door.Entrance (not located on a vehicle).Exit (not located on a vehicle).Entrance/exit (not located on a vehicle).Other."},{"location":"tables/#operators","title":"Operators","text":"

operators.schema.json

Personnel who operate vehicles.

Primary key: {operator_id}

name constraints type description operator_id RequiredUnique string Identifies an operator. If possible, this should match other internal agency operator IDs."},{"location":"tables/#train-cars","title":"Train Cars","text":"

train_cars.schema.json

Assets that comprise vehicles, such as train cars, with descriptive information.

Primary key: {train_car_id}

name constraints type description train_car_id RequiredUnique string Identifies a train car or asset. If possible, this should match other internal agency asset IDs. model_name string Describes the train car or asset\u2019s model. facility_name string Name or internal agency ID for the facility where the train car or asset is generally held. capacity_seated minimum: 0 integer Number of seats on the train car or asset. capacity_wheelchair minimum: 0 integer Number of wheelchair spaces on the train car or asset. capacity_bike minimum: 0 integer Number of bike spaces on the train car or asset. bike_rack boolean Indicates if the train car or asset has a usable bike rack. capacity_standing minimum: 0 integer Standing capacity of the train car or asset set by the manufacturer. train_car_type Allowed Values - Train car- Trolley- Other string Indicates the type of train car or asset."},{"location":"tables/#vehicle-train-cars","title":"Vehicle Train Cars","text":"

vehicle_train_cars.schema.json

Relationships between assets and vehicles.

Primary key: {train_car_id, vehicle_id}

name constraints type description title vehicle_id Required string Identifies a vehicle, such as a train consist. If possible, this should match other internal agency vehicle IDs. ID referencing vehicles.vehicle_id train_car_id Required string Identifies a train car or an asset that is a component of the vehicle. ID referencing train_cars.train_car_id train_car_order minimum: 0 integer The assigned order of the train car or asset within the vehicle. operator_id string Identifies an operator (person). If possible, this should match other internal agency operator IDs."},{"location":"tables/#vehicles","title":"Vehicles","text":"

vehicles.schema.json

Vehicles, including buses and train consists, with descriptive information.

Primary key: {vehicle_id}

name constraints type description vehicle_id RequiredUnique string Identifies a vehicle, such as a bus or a train consist. If possible, this should match other internal agency vehicle IDs and the GTFS-realtime VehicleDescriptor. vehicle_start datetime The timestamp at which the vehicle or train consist is first in operation (i.e., when the consist has been created). Required if Train_car is used. vehicle_end datetime The timestamp at which the vehicle or train consist no longer exists (i.e., the consist is separated or modified). Only used if Train_car is used. model_name string Describes the vehicle\u2019s model. facility_name string Name or internal agency ID for the facility where the vehicle is generally held. capacity_seated minimum: 0 integer Number of seats on the vehicle. Used if Train_car is not used. capacity_wheelchair minimum: 0 integer Number of wheelchair spaces on the vehicle. Used if Train_car is not used. capacity_bike minimum: 0 integer Number of bike spaces on the vehicle. Used if Train_car is not used. bike_rack boolean Indicates if the vehicle has a useable bike rack. Used if Train_car is not used. capacity_standing minimum: 0 integer Standing capacity of the vehicle set by the manufacturer. Used if Train_car is not used."},{"location":"governance/actions/","title":"Board Actions","text":"

Documentation, documents, and decisions of the Board will be stored in a TIDES-transit GitHub Repository in /docs/governance/actions:

2023-12-06 Designation of Board Coordinator Role to John Levin

Unanimous consent

2023-12-06 Approved by unanimous consent of the TIDES Board as documented in Board Meeting Minutes.

2023-12-06 Execution of MOU assigning TIDES Manager role duties to MobilityData

Unanimous consent full document

2023-12-06 Approved by unanimous consent of the TIDES Board as documented in Board Meeting Minutes.

2024-01-03 Executed via signature of MOU by TIDES Board Coordinator and Mobility Data Executive Director.

2023-11-29 Approved v1.0 of Change Management Policy

Unanimous consent full document

Approved by unanimous consent as documented in github issue #184

2023-11-29 Approved Board Expansion to 5 Members

Unanimous consent full document

Approved by unanimous consent as documented in github issue #189 and signed letter from board chair.

The resulting TIDES board is now:

"},{"location":"governance/meetings/","title":"Board Meetings","text":"

Rolling Agendas + Notes

"},{"location":"governance/meetings/#2024","title":"2024","text":""},{"location":"governance/meetings/#2023","title":"2023","text":""},{"location":"governance/actions/2023-11-29%20approve-change-management-policy/","title":"Approved v1.0 of Change Management Policy","text":"

Approved by unanimous consent as documented in github issue #184

"},{"location":"governance/actions/2023-11-29%20board-expansion/","title":"Approved Board Expansion to 5 Members","text":"

Approved by unanimous consent as documented in github issue #189 and signed letter from board chair.

The resulting TIDES board is now:

"},{"location":"governance/actions/2023-12-06%20designate-tides-board-coordinator/","title":"Designation of Board Coordinator Role to John Levin","text":"

2023-12-06 Approved by unanimous consent of the TIDES Board as documented in Board Meeting Minutes.

"},{"location":"governance/actions/2023-12-06%20designate-tides-manager/","title":"Execution of MOU assigning TIDES Manager role duties to MobilityData","text":"

2023-12-06 Approved by unanimous consent of the TIDES Board as documented in Board Meeting Minutes.

2024-01-03 Executed via signature of MOU by TIDES Board Coordinator and Mobility Data Executive Director.

"},{"location":"governance/policies/CLA/","title":"TIDES Contributor License Agreement","text":"

By making a contribution to this project, I certify that:

a. The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or

b. The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or

c. The contribution was provided directly to me by some other person who certified (a), (b) or \u00a9 and I have not modified it.

d. I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved.

Attribution: This Contributor Agreement is adapted from the node.js project available here: https://github.com/nodejs/node/blob/main/CONTRIBUTING.md.

"},{"location":"governance/policies/change-management/","title":"TIDES Change Management Policy","text":"

Tip

When capitalized in this document, the words \u201cMUST\u201d, \u201cMUST NOT\u201d, \u201cREQUIRED\u201d, \u201cSHALL\u201d, \u201cSHALL NOT\u201d, \u201cSHOULD\u201d, \u201cSHOULD NOT\u201d, \u201cRECOMMENDED\u201d, \u201cMAY\u201d, and \u201cOPTIONAL\u201d refer to their respective definitions in RFC 2119.

Tip

Definitions of various roles such as TIDES Board, TIDES Manager and TIDES Contributor refer to their respective definitions in the TIDES Governance Policy.

Over time, the TIDES data standard will need to evolve to meet stakeholder needs. Changes may include the addition of new tables, new fields to existing tables, or the modification of existing fields. Occasionally this may also include significant structural changes which may not be backwards compatible with existing datasets.

The change management process covers:

"},{"location":"governance/policies/change-management/#principles","title":"Principles","text":"

The revision process is designed with the following principles in mind:

Merit

Openness + Transparency

Efficiency

"},{"location":"governance/policies/change-management/#change-making-process","title":"Change-Making Process","text":"

This change-making process covers all normative content changes to the TIDES specification.

"},{"location":"governance/policies/change-management/#normative-content","title":"Normative Content","text":"

Normative Content is the prescriptive part of a standard**. It sets the rules to be followed in order to be evaluated as compliant with the standard, and from which no deviation is permitted.

Normative Content in TIDES

In the TIDES data schemas, the following properties are considered normative content within any schema.json file:

Similarly, the entirety of the TIDES Data Package Profile is considered normative with the exception of the following properties:

Non-normative content is the non-prescriptive, or \u2018descriptive\u2019, part of a standard. This may include analogies, synonyms, explanations, illustrations, context, and examples. In the event non-normative content contradicts normative content, the normative content is to be followed.

Non-Normative Content in TIDES

Changes outside the /spec are all considered non-normative. Within the /spec folder, non-normative changes to the specification are typically limited to the following properties in the tides-datapackage-profile.json and any ...schema.jsonfile:

"},{"location":"governance/policies/change-management/#change-making-stages","title":"Change-making Stages","text":"

The process by which normative changes are made to the TIDES data specification occurs in the following stages:

Stage When Who (led by) Need Identification Anytime Anyone Prioritization Quarterly (or as determined by TIDES Board or TIDES Manager) Contributors (Manager) Proposal Development Prioritized quarter Working Group (Manager) Review + Adoption Pull request for proposed change submitted after consensus in the Working Group Working Group (Manager) Implementation When decision made to consensus achieved on proposal Working Group (Manager) Released Next quarterly release Manager

Each of these stages is discussed in more detail below.

Need Identification Prioritization Proposal Development Review + Adoption Implementation Release

Any TIDES Contributor identifies a need that should be addressed in the TIDES specification.

Actions:

Resolution: TIDES Manager puts issue into consideration for next quarterly issue prioritization

The TIDES Manager starts a development cycle after or near the end of a quarterly release.

Actions:

Resolution: TIDES Manager will create a Milestone for the next release in GitHub and fill it with the issues the Board prioritized.

TIDES Manager, in consultation with the TIDES Board and TIDES Contributors, convenes an Issue Working Group to address a prioritized issue or set of interrelated issues.

Actions:

Resolution: Working Group submits a pull request to the develop branch.

TIDES Manager invites people outside of the Working Group to review and comment on the proposal

Actions:

Resolution: Change as represented in the pull request from the feature branch is approved and merged into the develop branch.

Final change proposal is approved - although initial work can begin ahead of this.

Actions:

Resolution: Requirements for release are met.

Initiated: On a quarterly schedule maintained by the TIDES Manager.

Actions: See Release Management.

"},{"location":"governance/policies/change-management/#expedited-change-management","title":"Expedited Change Management","text":"

This section outlines an expedited process for implementing changes in response to Urgent Needs which are critical to maintaining the security, compliance, or operational functionality of TIDES balancing rapid response with informed, transparent decision-making.

Urgent Needs

Urgent needs MUST pose significant risks to security, compliance, or the operational integrity of stakeholder systems. These MAY include necessary revisions due to legal mandates, critical security vulnerabilities, or severe technical inaccuracies that directly impair system functionalities. Urgent needs SHOULD necessitate an implementation timeline which is inconsistent with the normal change-making process.

"},{"location":"governance/policies/change-management/#process","title":"Process","text":"Identification Rapid Evaluation Solution Identification Decision-Making Implementation

Stakeholders SHOULD promptly report urgent needs to the TIDES Manager, detailing the problem and its potential impact.

The TIDES Manager MUST convene a group of at least 2 TIDES Contributors of their choosing to swiftly assess the issue\u2019s urgency and validity.

  1. If it meets their threshold for an urgent need, they forward a list of their proposed Urgent Working Group Members to the TIDES Board.
  2. The Urgent Working Group Members SHOULD contain representatives of TIDES Contributors affected stakeholder groups.
  3. The Urgent Working Group size SHOULD be at least three and reflect the scale of the problem and also need for agile decision making.
  4. The TIDES Board MAY object to their characterization of the need as urgent.
  5. The TIDES Board MAY make changes to the Urgent Working Group members.
  6. If the TIDES Board fails to respond within 48 hours, the Urgent Working Group MAY proceed with their implicit approval.

The Urgent Working Group, managed by the TIDES Manager, MUST identify a solution that meets the urgent need and document it as a PR to the main repository branch \u2013\u00a0outside the normal release cycle.

A supermajority of the Urgent Working Group members MUST approve the proposed change to meet the urgent need. If the decision is deadlocked, the decision is escalated to the TIDES Board.

The rest of the implementation and release cycle mirrors the main change-making process.

"},{"location":"governance/policies/change-management/#versions-and-release-management","title":"Versions and Release Management","text":"

A release is an official version of the TIDES data specification which can be referenced in perpetuity by a version number. The process by which a new release is made and determination of a version number is discussed below.

"},{"location":"governance/policies/change-management/#releases","title":"Releases","text":"

What triggers a release?

Each change to normative content in the main branch of the TIDES github repository MUST be considered a new release and assigned a version number.

Requirements:

"},{"location":"governance/policies/change-management/#pre-releases","title":"Pre-releases","text":"

When might we create a pre-release?

Pre-releases MAY be made in order to evaluate and work on incrementally-approved changes.

Each approved change to normative content in the develop branch of the TIDES github repository MAY be considered a pre-release and assigned a pre-release version number.

Requirements:

"},{"location":"governance/policies/change-management/#release-frequency","title":"Release Frequency","text":"

How often do we make new releases?

Barring significant unexpected events:

"},{"location":"governance/policies/change-management/#version-numbering","title":"Version Numbering","text":"

TIDES releases MUST be reflected by an incremental version number based on a semantic versioning policy as detailed below.

ReleasesPre-releases

What is a Major vs Minor version?

Warning

Non-normative changes MUST NOT increment the TIDES version.

"},{"location":"governance/policies/change-management/#version-control","title":"Version Control","text":"

TIDES SHOULD be managed in Github or a similar version-control tool.

The following branches SHOULD always be maintained:

maindevelopFeature Branches

Fully approved and documented versions of TIDES whereby:

Approved and staged versions of TIDES, awaiting full documentation, sample datasets, and next quarterly release cycle whereby:

All development by contributors SHOULD take place on feature branches whereby.

"},{"location":"governance/policies/change-management/#attribution","title":"Attribution","text":"

This change management policy is adapted from:

"},{"location":"governance/policies/change-management/#revision-history","title":"Revision History","text":""},{"location":"governance/policies/change-management/#v10-2023-11-29-initial-version","title":"v1.0 2023-11-29 Initial Version","text":""},{"location":"governance/policies/code-of-conduct/","title":"TIDES Code of Conduct","text":""},{"location":"governance/policies/code-of-conduct/#our-pledge","title":"Our Pledge","text":"

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

"},{"location":"governance/policies/code-of-conduct/#our-standards","title":"Our Standards","text":"

Examples of behavior that contributes to a positive environment for our community include:

Examples of unacceptable behavior include:

"},{"location":"governance/policies/code-of-conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

The community leaders for this effort include project Leadership and the Product Management Team as described in the Project Governance.

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

"},{"location":"governance/policies/code-of-conduct/#scope","title":"Scope","text":"

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

"},{"location":"governance/policies/code-of-conduct/#enforcement","title":"Enforcement","text":"

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at tidestransit@gmail.com.

All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

"},{"location":"governance/policies/code-of-conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

"},{"location":"governance/policies/code-of-conduct/#1-correction","title":"1. Correction","text":"

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

"},{"location":"governance/policies/code-of-conduct/#2-warning","title":"2. Warning","text":"

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

"},{"location":"governance/policies/code-of-conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

"},{"location":"governance/policies/code-of-conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

"},{"location":"governance/policies/code-of-conduct/#attribution","title":"Attribution","text":"

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"TIDES","text":"

TIDES is the Transit ITS Data Exchange Specification and is your key to accessing, managing, and using transit operations data.

"},{"location":"#why-tides","title":"Why TIDES?","text":"

TIDES is a data specification for transit operations data including vehicle location data, passenger count data, and fare transaction data.

TIDES frees your transit data and gives you more options to turn operations data into information on ridership, passenger loads, fare revenue, vehicle speed and delay, service reliability, and more!

TIDES is open-source, free for use, and is community governed, developed and supported. This repository provides data schemas and tools to support the access, management, and improvement of historical transit operations data, including vehicle operations, passenger activity, fare collection, and other similar data.

"},{"location":"#tides-specification","title":"TIDES specification","text":"

The TIDES specification is maintained in the /spec sub-directory as a series of JSON tables compatible with the frictionless table schema standards. Human-friendlier documentation is auto-generated and available at:

"},{"location":"#data-package","title":"Data Package","text":"

Directories with TIDES data must contain metadata in a datapackage.json file in a format compliant with the tides-datapackage-profile of a frictionless data package.

/samples/template/datapackage.json has a template datapackage which can be used.

"},{"location":"#sample-data","title":"Sample Data","text":"

Sample data can be found in the /samples directory, with one directory for each sample.

"},{"location":"#template","title":"Template","text":"

Templates of datapackage.json and each TIDES file type are located in the /samples/template directory.

"},{"location":"#validating-tides-data","title":"Validating TIDES data","text":"

TIDES data with a valid datapackage.json can be easily validated using the frictionless framework, which can be installed and invoked as follows:

pip install frictionless\nfrictionless validate --schema-sync path/to/your/datapackage.json\n

Several other validation scripts and tools with more flexibility such as validating to the canonical, named version or a local spec can be found in the /bin directory, with usage available with the --help flag.

bin/validate-datapackage [-v remote_spec_ref | -l local_spec_path] [-d dataset_path]\n
"},{"location":"#contributing-to-tides","title":"Contributing to TIDES","text":"

Those who want to help with the development of the TIDES specification should review the guidance in contributing.

"},{"location":"#issues","title":"Issues","text":"

Please add issues, bugs, and feature requests to GitHub.

"},{"location":"#acknowledgment","title":"Acknowledgment","text":"

These data schemas and tool definitions developed here are based on the results of research conducted by the Transportation Research Board (TRB) of the National Academies of Science, Engineering, and Medicine (NASEM) under the Transit Cooperative Research Program (TCRP). This research is available at the National Academies website.

Note that neither the TIDES Project nor the TIDES-transit repository are associated with TCRP, TRB, or the Academies. The use of the TCRP research results in this repository do not reflect any explicit or implicit endorsement of or participation in this work by the Academies. In addition, the opinions and conclusions expressed or implied in the research are those of the contractor. They are not necessarily those of the Transportation Research Board, the Academies, or the program sponsors.

"},{"location":"architecture/","title":"TIDES Tables Schema","text":"

Schemas for TIDES suite.

"},{"location":"architecture/#files-in-specification","title":"Files in Specification","text":"

TIDES consists of a package of files as defined in the following table.

The following table is automatically generated from [tides.spec.json]

name title description required vehicle-locations Vehicle Locations Timestamped vehicle locations and speeds. False passenger-events Passenger Events Timestamped passenger-related events, including boardings and alightings. False fare-transactions Fare Transactions Timestamped fare transaction, associated with devices. False stop-visits Stop Visits Summarized boarding, alighting, arrival, departure, and other events (kneel engaged, ramp deployed, etc.) by trip and stop for each service date. False trips-performed Trips Performed Trips performed for each service date. False station-activities Station Activities Summarized transactions, entries, and exits by stop or station and time period for each service date (for events not associated with a trip). False devices Devices Measurement devices, such as AVL, APC, and AFC devices, associated with vehicles or stops or stations. False train-cars Train Cars Assets that comprise vehicles, such as train cars, with descriptive information. False vehicle-train-cars Vehicle Train Cars Relationships between assets and vehicles. False vehicles Vehicles Vehicles, including buses and train consists, with descriptive information. False operators Operators Personnel who operate vehicles. False

File components for TIDES are specified in [tides.spec.json] in a format compatible with the frictionless data data package standard.

"},{"location":"architecture/#relationships","title":"Relationships","text":"

Files in the TIDES suite are related to each other and other open standards as follows:

graph LR; avl(((AVL))) --> vehicle_locations[/vehicle_locations/] APC --> passenger_events[/passenger_events/] AFC --> fare_transactions[/fare_transactions/] vehicle_locations --> summary[Summary Process] fare_transactions --> summary passenger_events --> summary summary --> |stop_id,trip_id,vehicle_id|stop_visits[/stop_visits/] summary -->|stop_id| station_activities[/station_activities/] summary --> trips_performed[/trips_performed/] trips.txt[/trips.txt/] --> |trip_id| stop_times.txt[/stop_times.txt/] stops.txt[/stops.txt/] --> |stop_id|stop_times.txt calendar.txt[/calendar.txt/] --> |service_id|stop_times.txt vehicle_train_cars[/vehicle_train_cars/] -.vehicle_id.- vehicles[/vehicles/] vehicle_train_cars -.- |train_car_id| train_cars[/train_cars/] train_cars -.- |train_car_id| devices[/devices/] vehicles --- |vehicle_id| devices vehicles --> |vehicle_id|trips_performed operators[/operators/] -.-> |operator_id| trips_performed stop_times.txt --> |\" stop_times.txt: stop_id,stop_sequence stop_visits: stop_id,scheduled_stop_sequence \"| stop_visits stop_times.txt --> |trips.txt| trips_performed stops.txt --> |stop_id|station_activities stop_times.txt --> |\" stop_times.txt: stop_id,stop_sequence vehicle_locations: stop_id,scheduled_stop_sequence \"| vehicle_locations stop_times.txt --> |\" stop_times.txt: stop_id,stop_sequence passenger_events: stop_id,scheduled_stop_sequence \"| passenger_events stop_times.txt --> |\" stop_times.txt: stop_id,stop_sequence fare_transactions: stop_id,scheduled_stop_sequence \"| fare_transactions subgraph eventf [Event Data] vehicle_locations passenger_events fare_transactions end subgraph summaryf [Summary Files] station_activities stop_visits trips_performed end subgraph gtfs [ GTFS ] stop_times.txt stops.txt trips.txt calendar.txt end subgraph proposedGTFS [ Proposed GTFS ] train_cars vehicle_train_cars vehicles end subgraph additional [ Additional Data ] devices operators end click stops.txt \"https://gtfs.org/schedule/reference/#stopstxt\" click stop_times.txt \"https://gtfs.org/schedule/reference/#stop_timestxt\" click calendar.txt \"https://gtfs.org/schedule/reference/#calendartxt\" click trips.txt \"https://gtfs.org/schedule/reference/#tripstxt\" click station_activities \"../tables/#station-activities\" click stop_visits \"../tables/#stop-visits\" click train_cars \"../tables/#train-cars\" click vehicle_train_cars \"../tables/#vehicle-train-cars\" click vehicles \"../tables/#vehicles\" click devices \"../tables/#devices\" click vehicle_locations \"../tables/#vehicle-locations\" click passenger_events \"../tables/#passenger-events\" click fare_transactions \"../tables/#fare-transactions\"

Relationship of trip_id_scheduled to GTFS Schedule trip_id

trip_id_scheduled in TIDES and trip_id in GTFS Schedule should be consistent when a performed trip exists in the published GTFS Schedule.

If a trip does not exist in the published GTFS Schedule, trip_id_scheduled values in TIDES do not have any assumed relationship with GTFS.

"},{"location":"datapackage/","title":"Data Package","text":"

TIDES data must include a datapackage.json in the format specified by the tides-data-package json schema, which is an extension of the frictionless data package schema.

You may create your own datapackage.json based on the documentaiton or start with the provided template, but don\u2019t forget to validate it to make sure it is in the correct format!

"},{"location":"datapackage/#data-package-format","title":"Data Package Format","text":"name description type requirement title A human-readable title.Example:Make Believe Trolley 1/1/2001-2/1/2001 string required profile The json-schema profile used to validate this datapackage descriptor. Should be https://raw.githubusercontent.com/TIDES-transit/TIDES/<spec-version-or-reference>/spec/tides-datapackage-profile.json. Defaults to https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.jsonExample:https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json nan required resources Array describing the data files included in your package, formated as a tabular-data-resource array required name Short, unique sluggable identifier string.Example:trolley_2001_1 string recommended description Short description of TIDES data package.Example:Raw and processed data from the Neighborhood of Make Believe Trolley recorded 1/1/2001-2/1/2001 string recommended agency Transit agency name.Example:Make Believe Neighborhood Trolley string recommended ntd_id ID for the National Transit Database.Example:0R02-00307 string recommended licenses The license(s) under which this package is published.Example:{'name':'CC-BY-4.0','path':'https://opendefinition.org/licenses/cc-by/','name':'Creative Commons Attribution 4.0'} array recommended contributors Array of data contributors.Example:{'name':'Daniel Tiger','email': 'daniel@makebelievetrolley.gov','organization':'Make Believe Neighborhood Trolley','role':'contributor'} array recommended maintainers Array of data maintainersExample:{'name':'Henrietta Pussycat','email': 'henrietta@makebelievetrolley.gov','organization':'Make Believe Neighborhood Trolley','role':'maintainer'} array recommended"},{"location":"datapackage/#tabular-data-resource","title":"Tabular Data Resource","text":"

Required and recommended fields for each tabluar-data-resource are as follows:

name description type requirement name Short, unique sluggable identifier string for a data table.Example:vehicle_locations_2001_01 string required path A reference to the data for this resource, as a valid URI string.Example:event/2001/vehicle_locations_2001_01.csv string required schema Location of the table schema for this resource.Example:https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/fare_transactions.schema.json string required profile Must be tabular-data-resourceExample:tabular-data-resource string required title A human-readable title for the data resource.Example:Neighborhood Trolley Vehicle Locations: 1/1/2001-2/1/2001 string recommended description DExample:Vehicle location event data from the Neighborhood of Make Believe Trolley recorded 1/1/2001-2/1/2001 string recommended sources The raw sources for this resource which describe where the data came from.Example:[ {'title':'Trolley CAD/AVL System','component':'CAD/AVL','product':'TrolleyMaster','product_version':'3.1.4'} ] array recommended licenses The license(s) under which this package is published.Example:{'name':'CC-BY-4.0','path':'https://opendefinition.org/licenses/cc-by/','name':'Creative Commons Attribution 4.0'} array recommended"},{"location":"datapackage/#template","title":"Template","text":"

The canonical datapackage.json template is available at /data/template/TIDES/datapackage.json.

Warning

This version of tides-data-package template is dependent on the version of the documentation you are viewing and only represents the canonical tides-data-package template if you are viewing the main documentation version.

samples/template/TIDES/datapackage.json
{\n    \"name\": \"template\",\n    \"title\": \"Template TIDES Data Package Example\",\n    \"agency\": \"Transit Agency Name\",\n    \"ntd_id\": \"1234-56\",\n    \"profile\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json\",\n    \"licenses\": [\n        {\n            \"name\": \"CC-BY-4.0\"\n        }\n    ],\n    \"contributors\": [\n        {\n            \"title\": \"My Name\",\n            \"email\": \"me@myself.com\",\n            \"github\": \"myhandle\"\n        }\n    ],\n    \"maintainers\": [\n        {\n            \"title\": \"Another Name\",\n            \"email\": \"another@myself.com\",\n            \"github\": \"myhandle\"\n        }\n    ],\n    \"resources\": [\n        {\n            \"name\": \"devices\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"devices.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/devices.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"vehicle_locations\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"vehicle_locations.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/vehicle_locations.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"fare_transactions\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"fare_transactions.csv\",\n            \"schema\":\"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/fare_transactions.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"train_cars\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"train_cars.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/train_cars.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"operators\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"operators.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/operators.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"stop_visits\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"stop_visits.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/stop_visits.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"vehicle_train_cars\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"vehicle_train_cars.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/vehicle_train_cars.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"vehicles\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"vehicles.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/vehicles.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"trips_performed\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"trips_performed.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/trips_performed.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"station_activities\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"station_activities.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/station_activities.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        },\n        {\n            \"name\": \"passenger_events\",\n            \"profile\": \"tabular-data-resource\",\n            \"path\": \"passenger_events.csv\",\n            \"schema\": \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/passenger_events.schema.json\",\n            \"sources\": [\n                {\n                    \"title\": \"Where did data come from?\",\n                    \"component\": \"Type of technology component, i.e. `AVL`\",\n                    \"product\": \"Product used.\",\n                    \"vendor\": \"Vendor selling product.\"\n                }\n            ]\n        }\n    ]\n}\n
"},{"location":"datapackage/#validation","title":"Validation","text":"

There are lots of options for validating your datapackage.json file including:

"},{"location":"datapackage/#cli","title":"CLI","text":"

You can easily validate your data package file with the script provided in /bin/validate-data-package-to-profile

installation requirements

Make sure you have jsonschema-cli installed. You can install it specifically or with all of the other suggested tools using one of the commands below:

MacWindowsLinux
brew install jq # mac\npip install -r requirements.txt\n
curl -L -o /usr/bin/jq.exe https://github.com/stedolan/jq/releases/latest/download/jq-win64.exe #windows\npip install -r requirements.txt\n
sudo apt-get install jq # linux\npip install -r requirements.txt\n
usage
validate-data-package-json -f my-datapackage.json\n
bin/validate-datapackage-to-profile
#!/usr/bin/env bash\n\ndescription=\"Script to validate a local JSON file against a profile for tides-data-package specified in \nprofile field or optionally against a remote or local profile.\"\n\nusage=\"\nUsage: validate-datapackage-to-profile [-r remote_spec_ref | -l local_spec_path] [-f datapackage_file]\n   -r remote_spec_ref: Optional. Specify the ref name of the GitHub repository for validating agianst\n             a remote profile where the profile is in the sub-path /spec/tides-data-package.json. \n             Should not be used with -l option. Example: -r main\n   -l local_spec_path: Optional. Specify the location of the local tides-data-package-json to use.\n             Should not be used with -r option. Example: -l spec\n   -d dataset_path: Optional. Specify the path of the datapackage.json file. \n             Default is datapackage.json. Example: -d samples/template/TIDES/datapackage.json\n\"\n\nexample_usage=\"Example Usage: bin/validate-datapackage-to-profile -d samples/template/TIDES/datapackage.tmp.json\"\n\n################################################################################\n## Help                                                                         #\n################################################################################\n\n## Display help message\nfunction display_help() {\n  echo \"$description\"\n  echo \"$usage\"\n  echo \"$example_usage\"\n}\n\n## Check for help flag\nif [ \"$1\" == \"--help\" ]; then\n  display_help\n  exit 0\nfi\n\n################################################################################\n## MAIN                                                                         #\n################################################################################\n\necho \"$description\"\n\n################################################################################\n## Source utility functions                                                     #\n################################################################################\nsource \"$(dirname \"${BASH_SOURCE[0]}\")/utils\"\nscript_dir=$(dirname \"$0\")\n\n################################################################################\n## Check Requirements                                                           #\n################################################################################\ncheck_jsonschema-cli\ncheck_jq\n\n################################################################################\n## Process the input options.                                                   #\n################################################################################\n## Set default values\nremote_spec_ref=\"\"\nlocal_spec_path=\"\"\ndataset_path=\"datapackage.json\"\n\n## Parse command-line arguments\nwhile getopts \":r:l:d:\" opt; do\n  case $opt in\n    r)\n      remote_spec_ref=$OPTARG\n      ;;\n    l)\n      local_spec_path=$OPTARG\n      ;;\n    d)\n      dataset_path=$OPTARG\n      ;;\n    \\?)\n      echo \"Invalid option: -$OPTARG\" >&2\n      display_help\n      exit 1\n      ;;\n  esac\ndone\n\necho \"validate-datapackage-to-profile configs:\"\necho \"  remote_spec_ref: $remote_profile_ref\"\necho \"  local_spec_path: $local_profile_path\"\necho \"  dataset_path: $dataset_path\"\n\nif [ \"$local_spec_path\" != \"\" ] && [ \"$remote_spec_path\" != \"\" ]; then\n  echo \"Cannot specify both local spec location (-l) and remote spec reference (-r)\" >&2\n  exit 1\nfi\n\n################################################################################\n## Specify datapackage and update if necessary                                  #\n################################################################################\n\n## Set appropriate datapackage_file vs dataset_path\nif [ -f \"$dataset_path\" ]; then\n  datapackage_file=\"$dataset_path\"\n  dataset_path=$(dirname \"$dataset_path\")\nelse \n  datapackage_file=\"$dataset_path/datapackage.json\"\nfi\ncheck_valid_path \"$datapackage_file\"\n\n################################################################################\n## Find and download if necessary the profile file                              #\n################################################################################\n\n[ -n \"$local_spec_path\" ] && spec_prefix=\"$local_spec_path\"\n[ -n \"$remote_spec_ref\" ] && spec_prefix=\"https://raw.githubusercontent.com/TIDES-transit/TIDES/$remote_spec_ref/spec\"\n\nif [ \"$spec_prefix\" != \"\" ]; then\n  profile_file=\"$spec_prefix/tides-datapackage-profile.json\"\nelse\n  profile_file=$(jq -r '.profile' \"$datapackage_file\")\nfi\necho \"...using profile: $profile_file\"\ncheck_valid_path \"$profile_file\"\n\nif [[ \"$profile_file\" =~ ^http ]]; then\n  temp_dir=$(mktemp -d)\n  profile_file=\"$temp_dir/$(basename $profile_file)\"\n  echo \"...downloading profile to: $profile_file\"\n  curl -L \"$profile_file\" -o \"$profile_file\"\nfi\n\n################################################################################\n## Validate Datapackage to Profile                                              #\n################################################################################\necho \"...validating $datapackage_file to $profile_file\"\njsonschema-cli validate \"$profile_file\" \"$datapackage_file\"\n\n################################################################################\n## Cleanup                                                                      #\n################################################################################\nif [ -d \"$temp_dir\" ]; then\n  rm -r \"$temp_dir\"\nfi\n
"},{"location":"datapackage/#point-and-drool","title":"Point-and-Drool","text":"

Because a tides-datapackage-profile is just a json-schema, you can use the myriad of different json-schema validator out there on the web. Use the canonical tides-datapackage-profile or copy and paste the version from below.

Warning

This version of tides-datapackage-profile is dependent on the version of the documentation you are viewing and only represents the canonical tides-datapackage-profile if you are viewing the main documentation version.

spec/tides-datapackage-profile.json
{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"title\": \"TIDES Data Package\",\n  \"description\": \"TIDES Data Package is a simple specification for data access and delivery of tabular TIDES transit data.\",\n  \"type\": \"object\",\n  \"required\": [\n    \"title\",\n    \"profile\",\n    \"resources\"\n\n  ],\n  \"recommended\":[\n    \"name\",\n    \"description\",\n    \"agency\",\n    \"ntd_id\",\n    \"licenses\",\n    \"contributors\",\n    \"maintainers\"\n  ],\n  \"properties\": {\n    \"profile\": {\n      \"default\":  \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json\",\n      \"propertyOrder\": 10,\n      \"title\": \"Profile\",\n      \"description\": \"The json-schema profile used to validate this datapackage descriptor. Should be `https://raw.githubusercontent.com/TIDES-transit/TIDES/<spec-version-or-reference>/spec/tides-datapackage-profile.json`. Defaults to `https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json`\",\n      \"format\": \"uri\",\n      \"examples\": [\n        \"`https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/tides-datapackage-profile.json`\"\n      ]\n    },\n    \"title\": {\n      \"propertyOrder\": 20,\n      \"title\": \"Title\",\n      \"description\": \"A human-readable title.\",\n      \"type\": \"string\",\n      \"examples\": [\n        \"Make Believe Trolley 1/1/2001-2/1/2001\"\n      ]\n    },\n    \"name\": {\n      \"propertyOrder\": 30,\n      \"title\": \"Name\",\n      \"description\": \"Short, unique [sluggable](https://en.wikipedia.org/wiki/Clean_URL#Slug) identifier string.\",\n      \"type\": \"string\",\n      \"pattern\": \"^([-a-z0-9._/])+$\",\n      \"context\": \"This is ideally a url-usable and human-readable name. Name `SHOULD` be invariant, meaning it `SHOULD NOT` change when its parent descriptor is updated.\",\n      \"examples\": [\n        \"trolley_2001_1\"\n      ]\n    },\n    \"description\": {\n      \"propertyOrder\": 40,\n      \"format\": \"textarea\",\n      \"title\": \"Description\",\n      \"description\": \"Short description of TIDES data package.\",\n      \"type\": \"string\",\n      \"examples\": [\n        \"Raw and processed data from the Neighborhood of Make Believe Trolley recorded 1/1/2001-2/1/2001\"\n      ]\n    },\n    \"agency\": {\n      \"propertyOrder\": 50,\n      \"format\": \"textarea\",\n      \"title\": \"Agency\",\n      \"description\": \"Transit agency name.\",\n      \"type\": \"string\",\n      \"examples\": [\n        \"Make Believe Neighborhood Trolley\"\n      ]\n    },\n    \"ntd_id\": {\n      \"propertyOrder\": 60,\n      \"title\": \"NTD ID\",\n      \"description\": \"ID for the National Transit Database.\",\n      \"type\": \"string\",\n      \"pattern\": \"^([-a-z0-9._/])+$\",\n      \"context\": \"Background on NTD available at https://www.transit.dot.gov/ntd\",\n      \"examples\": [\n        \"0R02-00307\"\n      ]\n    },\n    \"contributors\": {\n      \"propertyOrder\": 70,\n      \"title\": \"Contributors\",\n      \"description\": \"Array of data contributors.\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"title\": \"Contributor\",\n        \"description\": \"A contributor to this descriptor.\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"title\": \"Name\",\n            \"description\": \"A human-readable name.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Daniel Tiger\"\n            ]\n          },\n          \"email\": {\n            \"title\": \"Email\",\n            \"description\": \"An email address.\",\n            \"type\": \"string\",\n            \"format\": \"email\",\n            \"examples\": [\n              \"daniel@makebelievetrolley.gov\"\n            ]\n          },\n          \"organization\": {\n            \"title\": \"Organization\",\n            \"description\": \"An organizational affiliation for this contributor.\",\n            \"type\": \"string\",\n            \"example\": \"Make Believe Neighborhood Trolley\"\n          },\n          \"role\": {\n            \"title\": \"Role\",\n            \"description\": \"The contributor's role in the project\",\n            \"type\": \"string\",\n            \"default\": \"contributor\"\n          }\n        },\n        \"required\": [\n          \"title\"\n        ],\n        \"context\": \"Use of this property does not imply that the person was the original creator of, or a contributor to, the data in the descriptor, but refers to the composition of the descriptor itself.\"\n      },\n      \"examples\": [\n       \"{'name':'Daniel Tiger','email': 'daniel@makebelievetrolley.gov','organization':'Make Believe Neighborhood Trolley','role':'contributor'}\"\n      ]\n    },\n    \"maintainers\": {\n      \"propertyOrder\": 80,\n      \"title\": \"Maintainers\",\n      \"description\": \"Array of data maintainers\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"title\": \"Maintainer\",\n        \"description\": \"A maintainer of this descriptor.\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"title\": \"Name\",\n            \"description\": \"A human-readable name.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Henrietta Pussycat\"\n            ]\n          },\n          \"email\": {\n            \"title\": \"Email\",\n            \"description\": \"An email address.\",\n            \"type\": \"string\",\n            \"format\": \"email\",\n            \"examples\": [\n              \"henrietta@makebelievetrolley.gov\"\n            ]\n          },\n          \"organization\": {\n            \"title\": \"Organization\",\n            \"description\": \"An organizational affiliation for this maintainer.\",\n            \"type\": \"string\"\n          },\n          \"role\": {\n            \"title\": \"Role\",\n            \"description\": \"The maintainer's role in the project\",\n            \"type\": \"string\",\n            \"default\": \"maintainer\"\n          }\n        },\n        \"required\": [\n          \"title\"\n        ],\n        \"context\": \"Use of this property does not imply that the person was the original creator of, or a contributor to, the data in the descriptor, but refers to the composition of the descriptor itself.\"\n      },\n      \"examples\": [\n        \"{'name':'Henrietta Pussycat','email': 'henrietta@makebelievetrolley.gov','organization':'Make Believe Neighborhood Trolley','role':'maintainer'}\"\n\n      ]\n    },\n    \"licenses\": {\n      \"propertyOrder\": 90,\n      \"title\": \"Licenses\",\n      \"description\": \"The license(s) under which this package is published.\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"title\": \"License\",\n        \"description\": \"An array of license objects which apply to this data package.  Must include at least a `name` or `path`\",\n        \"type\": \"object\",\n        \"anyOf\": [\n          {\n            \"required\": [\n              \"name\"\n            ]\n          },\n          {\n            \"required\": [\n              \"path\"\n            ]\n          }\n        ],\n        \"properties\": {\n          \"name\": {\n            \"title\": \"Open Definition license identifier\",\n            \"description\": \"MUST be an Open Definition license identifier, see http://licenses.opendefinition.org/\",\n            \"type\": \"string\",\n            \"pattern\": \"^([-a-zA-Z0-9._])+$\",\n            \"examples\": [\"odc-by\",\"CC-BY-4.0\"]\n          },\n          \"path\": {\n            \"title\": \"Path\",\n            \"description\": \"A fully qualified public URL, or a Unix-style relative file path.\",\n            \"type\": \"string\",\n            \"pattern\": \"^(?=^[^./~])(^((?!\\\\.{2}).)*$).*$\",\n            \"examples\": [\n              \"https://opendefinition.org/licenses/odc-by/\",\n              \"license.md\"\n            ],\n            \"context\": \"Implementations need to negotiate the type of path provided, and dereference the data accordingly.\"\n          },\n          \"title\": {\n            \"title\": \"Title\",\n            \"description\": \"A human-readable title of the license.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Creative Commons Attribution 4.0\"\n            ]\n          }\n        }\n      },\n      \"context\": \"This property is not legally binding and does not guarantee that the package is licensed under the terms defined herein.\",\n      \"examples\": [\n        \"{'name':'CC-BY-4.0','path':'https://opendefinition.org/licenses/cc-by/','name':'Creative Commons Attribution 4.0'}\"\n      ]\n    },\n    \"resources\": {\n      \"propertyOrder\": 100,\n      \"title\": \"Tabular Data Resources\",\n      \"description\": \"Array describing the data files included in your package, formated as a [`tabular-data-resource`](#tabular-data-resource)\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"title\": \"Tabular Data Resource\",\n        \"description\": \"A Tabular Data Resource.\",\n        \"type\": \"object\",\n        \"required\": [\n            \"name\",\n            \"path\",\n            \"schema\",\n            \"profile\"\n        ],\n        \"recommended\": [\n          \"title\",\n          \"description\",\n          \"sources\",\n          \"licenses\"\n      ],\n        \"properties\": {\n          \"profile\": {\n            \"default\": \"tabular-data-resource\",\n            \"propertyOrder\": 10,\n            \"title\": \"Profile\",\n            \"description\": \"Must be `tabular-data-resource`\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"tabular-data-resource\"\n            ]\n          },\n          \"name\": {\n            \"propertyOrder\": 20,\n            \"title\": \"Name\",\n            \"description\": \"Short, unique [sluggable](https://en.wikipedia.org/wiki/Clean_URL#Slug) identifier string for a data table.\",\n            \"type\": \"string\",\n            \"pattern\": \"^([-a-z0-9._/])+$\",\n            \"context\": \"This is ideally a url-usable and human-readable name. Name `SHOULD` be invariant, meaning it `SHOULD NOT` change when its parent descriptor is updated.\",\n            \"examples\": [\n              \"vehicle_locations_2001_01\"\n            ]\n          },\n          \"path\": {\n            \"propertyOrder\": 30,\n            \"title\": \"Path\",\n            \"description\": \"A reference to the data for this resource, as a valid URI string.\",\n            \"type\": \"string\",\n            \"pattern\": \"^(?=^[^./~])(^((?!\\\\.{2}).)*$).*$\",\n            \"examples\": [\n              \"event/2001/vehicle_locations_2001_01.csv\"\n            ],\n            \"context\": \"Implementations need to negotiate the type of path provided, and dereference the data accordingly.\"\n          },\n          \"tides-table\": {\n            \"enum\": [\n              \"devices\",\n              \"fare_transactions\",\n              \"operators\",\n              \"station_activities\",\n              \"passenger_events\",\n              \"stop_visits\",\n              \"train_cars\",\n              \"trips_performed\",\n              \"vehicle_locations\",\n              \"vehicle_train_cars\",\n              \"vehicles\"\n            ],\n            \"description\": \"An identifier string corresponding to the name of one of the table specs in the TIDES data package\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"fare_transactions\",\n              \"train_cars\"\n            ]\n          },\n          \"schema\": {\n            \"title\": \"Table Schema\",\n            \"description\": \"Location of the table schema for this resource.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/fare_transactions.schema.json\"\n            ]\n          },\n          \"title\": {\n            \"title\": \"Title\",\n            \"description\": \"A human-readable title for the data resource.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Neighborhood Trolley Vehicle Locations: 1/1/2001-2/1/2001\"\n            ],\n            \"propertyOrder\": 50\n          },\n          \"description\": {\n            \"title\": \"Description\",\n            \"description\": \"D\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Vehicle location event data from the Neighborhood of Make Believe Trolley recorded 1/1/2001-2/1/2001\"\n            ],\n            \"propertyOrder\": 60,\n            \"format\": \"textarea\"\n          },\n          \"homepage\": {\n            \"propertyOrder\": 70,\n            \"title\": \"Home Page\",\n            \"description\": \"The home on the web that is related to this data package.\",\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"examples\": [\n              \"http://example.com\"\n            ]\n          },\n          \"sources\": {\n            \"propertyOrder\": 140,\n            \"options\": {\n              \"hidden\": true\n            },\n            \"title\": \"Sources\",\n            \"description\": \"The raw sources for this resource which describe where the data came from.\",\n            \"type\": \"array\",\n            \"minItems\": 0,\n            \"examples\": [\n              \"[ {'title':'Trolley CAD/AVL System','component':'CAD/AVL','product':'TrolleyMaster','product_version':'3.1.4'} ]\"\n            ],\n            \"items\": {\n              \"title\": \"Source\",\n              \"type\": \"object\",\n              \"required\": [\n                \"title\"\n              ],\n              \"properties\": {\n                \"title\": {\n                  \"title\": \"Title\",\n                  \"description\": \"Human-readable title of the data source.\",\n                  \"type\": \"string\",\n                  \"examples\": [\n                    \"Trolley CAD/AVL System\"\n                  ]\n                },\n                \"component\": {\n                  \"title\": \"Component\",\n                  \"description\": \"The technology component used to generate this data (directly or indirectly)\",\n                  \"type\": \"string\",\n                  \"examples\": [\n                    \"CAD/AVL\",\n                    \"AFC\",\n                    \"APC\"\n                  ]\n                },\n                \"product\": {\n                  \"title\": \"Product\",\n                  \"description\": \"What product was used to generate this data (directly or indirectly)?\",\n                  \"type\": \"string\",\n                  \"examples\": [\n                    \"TrolleyMaster\"\n                  ]\n                },\n                \"product_version\": {\n                  \"title\": \"Product Version\",\n                  \"description\": \"Describe the version of the product was used.\",\n                  \"type\": \"string\"\n                },\n                \"vendor\": {\n                  \"title\": \"Vendor\",\n                  \"description\": \"What company makes this product?\",\n                  \"type\": \"string\"\n                }\n              }\n            }\n          },\n          \"licenses\": {\n            \"propertyOrder\": 90,\n            \"title\": \"Licenses\",\n            \"description\": \"The license(s) under which this package is published.\",\n            \"type\": \"array\",\n            \"minItems\": 1,\n            \"items\": {\n              \"title\": \"License\",\n              \"description\": \"An array of license objects which apply to this data package.  Must include at least a `name` or `path`\",\n              \"type\": \"object\",\n              \"anyOf\": [\n                {\n                  \"required\": [\n                    \"name\"\n                  ]\n                },\n                {\n                  \"required\": [\n                    \"path\"\n                  ]\n                }\n              ],\n              \"properties\": {\n                \"name\": {\n                  \"title\": \"Open Definition license identifier\",\n                  \"description\": \"MUST be an Open Definition license identifier, see http://licenses.opendefinition.org/\",\n                  \"type\": \"string\",\n                  \"pattern\": \"^([-a-zA-Z0-9._])+$\",\n                  \"examples\": [\"odc-by\",\"CC-BY-4.0\"]\n                },\n                \"path\": {\n                  \"title\": \"Path\",\n                  \"description\": \"A fully qualified public URL, or a Unix-style relative file path.\",\n                  \"type\": \"string\",\n                  \"pattern\": \"^(?=^[^./~])(^((?!\\\\.{2}).)*$).*$\",\n                  \"examples\": [\n                    \"https://opendefinition.org/licenses/odc-by/\",\n                    \"license.md\"\n                  ],\n                  \"context\": \"Implementations need to negotiate the type of path provided, and dereference the data accordingly.\"\n                },\n                \"title\": {\n                  \"title\": \"Title\",\n                  \"description\": \"A human-readable title of the license.\",\n                  \"type\": \"string\",\n                  \"examples\": [\n                    \"Creative Commons Attribution 4.0\"\n                  ]\n                }\n              }\n            },\n            \"context\": \"This property is not legally binding and does not guarantee that the package is licensed under the terms defined herein.\",\n            \"examples\": [\n              \"{'name':'CC-BY-4.0','path':'https://opendefinition.org/licenses/cc-by/','name':'Creative Commons Attribution 4.0'}\"\n            ]\n          },\n          \"dialect\": {\n            \"propertyOrder\": 50,\n            \"title\": \"CSV Dialect\",\n            \"description\": \"The CSV dialect descriptor.\",\n            \"type\": [\n              \"string\",\n              \"object\"\n            ],\n            \"required\": [\n              \"delimiter\",\n              \"doubleQuote\"\n            ],\n            \"properties\": {\n              \"csvddfVersion\": {\n                \"title\": \"CSV Dialect schema version\",\n                \"description\": \"A number to indicate the schema version of CSV Dialect. Version 1.0 was named CSV Dialect Description Format and used different field names.\",\n                \"type\": \"number\",\n                \"default\": 1.2,\n                \"examples:\": [\n                  \"1.2\"\n                ]\n              },\n              \"delimiter\": {\n                \"title\": \"Delimiter\",\n                \"description\": \"A character sequence to use as the field separator.\",\n                \"type\": \"string\",\n                \"default\": \",\",\n                \"examples\": [\n                  \"`;`\",\n                  \"`|`\"\n                ]\n              },\n              \"doubleQuote\": {\n                \"title\": \"Double Quote\",\n                \"description\": \"Specifies the handling of quotes inside fields.\",\n                \"context\": \"If Double Quote is set to true, two consecutive quotes must be interpreted as one.\",\n                \"type\": \"boolean\",\n                \"default\": true\n              },\n              \"lineTerminator\": {\n                \"title\": \"Line Terminator\",\n                \"description\": \"Specifies the character sequence that must be used to terminate rows.\",\n                \"type\": \"string\",\n                \"default\": \"\\r\\n\",\n                \"examples\": [\n                  \"`\\r`\",\n                  \"`\\n`\"\n                ]\n              },\n              \"nullSequence\": {\n                \"title\": \"Null Sequence\",\n                \"description\": \"Specifies the null sequence, for example, `\\\\N`.\",\n                \"type\": \"string\",\n                \"examples\": [\n                  \"`\\\\N`\"\n                ]\n              },\n              \"quoteChar\": {\n                \"title\": \"Quote Character\",\n                \"description\": \"Specifies a one-character string to use as the quoting character.\",\n                \"type\": \"string\",\n                \"default\": \"\\\"\",\n                \"examples\": [\n                  \"`'`\"\n                ]\n              },\n              \"escapeChar\": {\n                \"title\": \"Escape Character\",\n                \"description\": \"Specifies a one-character string to use as the escape character.\",\n                \"type\": \"string\",\n                \"examples\": [\n                  \"`\\\\`\"\n                ]\n              },\n              \"skipInitialSpace\": {\n                \"title\": \"Skip Initial Space\",\n                \"description\": \"Specifies the interpretation of whitespace immediately following a delimiter. If false, whitespace immediately after a delimiter should be treated as part of the subsequent field.\",\n                \"type\": \"boolean\",\n                \"default\": false\n              },\n              \"header\": {\n                \"title\": \"Header\",\n                \"description\": \"Specifies if the file includes a header row, always as the first row in the file.\",\n                \"type\": \"boolean\",\n                \"default\": true\n              },\n              \"commentChar\": {\n                \"title\": \"Comment Character\",\n                \"description\": \"Specifies that any row beginning with this one-character string, without preceeding whitespace, causes the entire line to be ignored.\",\n                \"type\": \"string\",\n                \"examples\": [\n                  \"`#`\"\n                ]\n              },\n              \"caseSensitiveHeader\": {\n                \"title\": \"Case Sensitive Header\",\n                \"description\": \"Specifies if the case of headers is meaningful.\",\n                \"context\": \"Use of case in source CSV files is not always an intentional decision. For example, should \\\"CAT\\\" and \\\"Cat\\\" be considered to have the same meaning.\",\n                \"type\": \"boolean\",\n                \"default\": false\n              }\n            },\n            \"examples\": [\n              \"{'delimiter': ';' }\"\n       ]\n          },\n          \"format\": {\n            \"propertyOrder\": 80,\n            \"title\": \"Format\",\n            \"description\": \"The file format of this resource.\",\n            \"context\": \"`csv`, `xls`, `json` are examples of common formats.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"`xls`\"\n            ]\n          },\n          \"mediatype\": {\n            \"propertyOrder\": 90,\n            \"title\": \"Media Type\",\n            \"description\": \"The media type of this resource. Can be any valid media type listed with [IANA](https://www.iana.org/assignments/media-types/media-types.xhtml).\",\n            \"type\": \"string\",\n            \"pattern\": \"^(.+)/(.+)$\",\n            \"examples\": [\n              \"`text/csv`\"\n            ]\n          },\n          \"encoding\": {\n            \"propertyOrder\": 100,\n            \"title\": \"Encoding\",\n            \"description\": \"The file encoding of this resource.\",\n            \"type\": \"string\",\n            \"default\": \"utf-8\",\n            \"examples\": [\n              \"`utf-8`\"\n            ]\n          },\n          \"bytes\": {\n            \"propertyOrder\": 110,\n            \"options\": {\n              \"hidden\": true\n            },\n            \"title\": \"Bytes\",\n            \"description\": \"The size of this resource in bytes.\",\n            \"type\": \"integer\",\n            \"examples\": [\n              \"2082\"\n            ]\n          },\n          \"hash\": {\n            \"propertyOrder\": 120,\n            \"options\": {\n              \"hidden\": true\n            },\n            \"title\": \"Hash\",\n            \"type\": \"string\",\n            \"description\": \"The MD5 hash of this resource. Indicate other hashing algorithms with the {algorithm}:{hash} format.\",\n            \"pattern\": \"^([^:]+:[a-fA-F0-9]+|[a-fA-F0-9]{32}|)$\",\n            \"examples\": [\n              \"d25c9c77f588f5dc32059d2da1136c02\",\n              \"SHA256:5262f12512590031bbcc9a430452bfd75c2791ad6771320bb4b5728bfb78c4d0\"\n            ]\n          }\n        }\n      }\n    },\n    \"sources\": {\n      \"propertyOrder\": 140,\n      \"options\": {\n        \"hidden\": true\n      },\n      \"title\": \"Sources\",\n      \"description\": \"The raw sources for this data package which describe where the data came from. Can be alternatively specified at the individual resource-level.\",\n      \"type\": \"array\",\n      \"minItems\": 0,\n      \"examples\": [\n        \"[ {'title':'Trolley CAD/AVL System','component':'CAD/AVL','product':'TrolleyMaster','product_version':'3.1.4'} ]\"\n      ],\n      \"items\": {\n        \"title\": \"Source\",\n        \"type\": \"object\",\n        \"required\": [\n          \"title\"\n        ],\n        \"properties\": {\n          \"title\": {\n            \"title\": \"Title\",\n            \"description\": \"Human-readable title of the data source.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"Trolley CAD/AVL System\"\n            ]\n          },\n          \"component\": {\n            \"title\": \"Component\",\n            \"description\": \"What technology component was used to generate this data (directly or indirectly)? Examples include `AVL`, `APC`, `AFC`, etc.\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"CAD/AVL\",\n              \"AFC\",\n              \"APC\"\n            ]\n          },\n          \"product\": {\n            \"title\": \"Product\",\n            \"description\": \"What product was used to generate this data (directly or indirectly)?\",\n            \"type\": \"string\",\n            \"examples\": [\n              \"TrolleyMaster\"\n            ]\n          },\n          \"product_version\": {\n            \"title\": \"Product Version\",\n            \"description\": \"Describe the version of the product was used.\",\n            \"type\": \"string\"\n          },\n          \"vendor\": {\n            \"title\": \"Vendor\",\n            \"description\": \"What company makes this product?\",\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n
"},{"location":"development/","title":"Development","text":""},{"location":"development/#contributing-to-tides","title":"Contributing to TIDES","text":"

Thank you for contributing to the TIDES Project. This document outlines the process for contributing to the project and documents the governance roles and approach for decision-making. Where TIDES Governance and this document differ, the TIDES Governance shall take precedence.

"},{"location":"development/#becoming-a-tides-contributor","title":"Becoming a TIDES Contributor","text":"

As defined in the TIDES Governance, a TIDES-Contributor has the rights to:

These roles and responsibilities are further detailed in the TIDES Governance and documents linked to from it.

Individuals may request to be a Contributor by completing the registration formthat includes acknowledgement of the Contributor Agreement and Code of Conduct.

"},{"location":"development/#how-to-contribute","title":"How to Contribute","text":"
  1. Become a TIDES Contributor
  2. Follow setup instructions if you\u2019d like to contribute code or provide code reviews.
  3. Offer to help research an issue
  4. Offer to help resolve an issue with a pull-request
  5. Offer to review a pull-request

Warning

By making any contribution to the projects, contributors self-certify to the Contributor Agreement.

"},{"location":"development/#setup","title":"Setup","text":"
  1. Make sure you have a GitHub account.
  2. Make sure you have git, a terminal (e.g. Mac Terminal, CygWin, etc.), and a text editor installed on your local machine. Optionally, you will likely find it easier to use GitHub Desktop, an IDE instead of a simple text editor like VSCode, Eclipse, Sublime Text, etc.
  3. Clone the repository locally. Non-registered contributors should fork the repository first, since they will be unable to push branches directly to the main repository.
  4. Install development requirements packages pip install -r requirements.txt or in a virtual environment.

Using a virtual environment

It is often helpful to install requirements for vairous projects inside a virtual environment rather than in your main python installation. Some virtual environments to consider include: conda,pipenv,poetry, and rye.

"},{"location":"development/#contribution-workflow","title":"Contribution Workflow","text":"
  1. Create a feature branch to work on a new issue (or checkout an existing one where the issue is being worked on).
  2. Make your changes.
  3. Run tests/test_local_spec script to check and fix formatting, validate profile and schemas with frictionless and with each other, and confirm that documentation can be built locally.
  4. Run tests/test_samples_to_local script to check if samples conform to any changes to the spec.
  5. Commit your work in git
  6. push your changes to Github and submit a pull request

Create a feature branch on a clone of tides-transit/TIDES, not a fork

If you have the permissions (which you should if you are a TIDE Contributor), you should complete your work on a feature branch from a clone of the main TIDES repository (tides-transit/TIDES) rather than a fork of it (e.g. my-github-handle/TIDES) so that when you submit a pull request the continuous integration tests will have the right permissions to run.

"},{"location":"development/#issues","title":"Issues","text":"

Create issues to start discussion on a new topic. If the issue is associated with a pull request, be sure to link the two. There are shortcuts here

"},{"location":"development/#pull-requests","title":"Pull Requests","text":"

Use the following guidance in creating and responding to pull requests

If you worked from a fork

If you worked from a fork of the TIDES/tides-transit repo instead of a feature branch of a clone of the TIDES/tides-transit repo, you will not have the right permissions to run the continuous integration tests when you submit a pull request. To remedy, please push the branch of your local fork to a feature branch of the main repository:

git remote add upstream git@github.com/TIDES-transit/TIDES.git\ngit push upstream <my-feature-branch-name>\n

\u2026and now you should be able to submit a pull request from that feature branch which should have the permission to run the continuous integration tests.

Run into a permissions issue with that command? Make sure you a registered contributor and that you have accepted the resulting invitation to join the tides-transit team on Github.

"},{"location":"development/#commits","title":"Commits","text":"

Use the following guidance for commits

"},{"location":"development/#continuous-integration-continuous-deployment","title":"Continuous Integration / Continuous Deployment","text":"

We leverage Github Actions workflows to flag potentially erronious contributions and build, preview and deploy documentation that is in sync with the schema definition files.

Workflows are defined in /.github/workflows/ include the following:

File Description validate_package_schema.yml Validates Data Package definition validate_table_schemas.yml Validates Schema Files docs.yml Builds and deploys documentation docs.yml Process flowchart LR setup-python --> pip[\"pip install docs/requirements.txt\"] pip[\"pip install docs/requirements.txt\"] --> gh_mike[\"mike\"] gh_mike[\"mike\"] --> gh-pages/branch-name"},{"location":"development/#documentation","title":"Documentation","text":"

The documentation for the TIDES specification is available at https://tides-transit.github.io/TIDES/ This site is automatically recreated each time a change is made to the specification.

More information about updating and building TIDES documentation\u2026

"},{"location":"development/#tides-contributor-license-agreement","title":"TIDES Contributor License Agreement","text":"

By making any contribution to the projects, contributors self-certify to the the TIDES Contributor Agreement.

"},{"location":"development/#license-to-use","title":"License to Use","text":"

The TIDES specification is licensed under the Apache License 2.0 (code) and Creative Commons Attribution 4.0 (sample data, specification, and documentation) as defined in file."},{"location":"development/#project-governance","title":"Project Governance","text":"

The TIDES Project Governance and the roles within are detailed in the TIDES-governance documentation.

"},{"location":"development/#github-access-levels","title":"GitHub Access Levels","text":"Role Access Level Board Admin Program Manager Admin Board Coordinator Write Manager Write Contributor Group Write Stakeholder Read/Create Issues"},{"location":"development/#review-and-approval-process","title":"Review and Approval Process","text":"

The TIDES Board has final approval of all normative changes changes to the specificaiton and project governance. All Contributors are permitted and encouraged to discuss and comment on issues and pull requests and make recommendations for changes to the specification. Contributions made as a pull request by Contributors which do not make any changes to the /spec or /docs/governance directories may be approved by a another Contributor if it passes the continuous integration tests.

Following v1.0, TIDES will adhere to this change management and versioning policy.

"},{"location":"development/#tides-code-of-conduct","title":"TIDES Code of Conduct","text":"

Contributors to the TIDES Project are expected to read and follow the code of conduct for the project.

"},{"location":"documentation/","title":"Documentation","text":"

The documentation for the TIDES specification is available at https://tides-transit.github.io/TIDES/ This site is automatically recreated each time a change is made to the specification.

When a change is pushed to the TIDES specification repository, Github Actions deployes the workflow docs.yml that rebuilds the files for the TIDES documentation site. When a pull request is opened from a branch on the main repository, a draft version of the docs is built for preview purposes via the same process. For security purposes, documentation is not automatically built on pull requests opened from forks.

Files used in TIDES Documentation Name What it does /.github/workflows/docs.yml /docs/requirements.txt Lists resources needed to generate documentation /mkdocs.yml Controls mkdocs: main.py Defines macros used by mkdocs-macros, which can be referenced in the various markdown documentation files to generate markdown content, including from the Frictionless spec .json files /docs/*.md These markdown files contain the content for the documentation site, either directly or by reference. /docs/index.md Documentation homepage using content from README.me /docs/architecture.md Documents the overall spec architcture using a list of spec tables generated from tides.spec.json and diagrams the relationships between tables with mermaid /docs/tables.md Documents the detailed schemas for each table generated from /spec/*.schema.json /docs/development.md Documents spec development processes using content from CONTRIBUTING.md and CODE_OF_CONDUCT.md Tools Used in TIDES Documentation Name What it does GitHub Actions Runs following workflow on each push to the TIDES github repository: /.github/workflows/docs.yml mike runs mkdocs and puts output in a folder in gh_pages branch which corresponds to the name of the branch (i.e. main, develop, pr-163, etc) For new branches with documentation, adds an entry in versions.json mkdocs Package which generates documentation from markdown and code Overview of Documentation Building Process flowchart LR subgraph mkdocs[\"mkdocs: run on execution of mike\"] md_mike[\"mike\"] -->|runs for current branch| md_mkdocs[\"mkdocs\"] md_mkdocs.yml[\"mkdocs.yml\"] -->|specifieds parameters| md_mkdocs[\"mkdocs\"] md_mkdocs_macros[\"mkdocs-macros\"] -->|\"plugin for\"| md_mkdocs[\"mkdocs\"] main.py[/\"main.py\"/] -->|defines macros in code available for| md_mkdocs_macros[\"mkdocs-macros\"] end subgraph mkdocs-macros[\"mkdocs-macros: run on execution of mkdocs\"] if_spec[\"architecture.md frictionless_spec('spec/tides.spec.json')\"] if_schemas[\"tables.md frictionless_schemas('spec/**.schema.json')\"] if_readme[\"index.md include_file('README.md'}\"] if_contributing[\"development.md include_file('contributing.md'}\"] end subgraph \"/docs\" index.md[/\"index.md\"/] -->|specified in| md_mkdocs.yml[/\"mkdocs.yml\"/] architecture.md[/\"architecture.md\"/] -->|specified in| md_mkdocs.yml tables.md[/\"tables.md\"/] -->|specified in| md_mkdocs.yml development.md[/\"development.md\"/] -->|specified in| md_mkdocs.yml end subgraph site[\"/site: output of mkdocs\"] index.html[/\"index.html\"/] development.html[/\"development.html\"/] architecture.html[/\"architecture.html\"/] tables.html[/\"tables.html\"/] end subgraph \"/spec\" spec[/\"*/schema.json\"/] schemas[/\"tides.spec.json\"/] end README[/\"README.md\"/]-->if_readme index.md-->if_readme if_readme --> index.html CONTRIBUTING[/\"CONTRIBUTING.md\"/]-->if_contributing development.md-->if_contributing if_contributing--> development.html tables.md-->if_schemas schemas-->if_schemas if_schemas--> tables.html architecture.md-->if_spec spec-->if_spec if_spec--> architecture.html"},{"location":"governance/","title":"TIDES Governance","text":"

Governance of the TIDES Project is achieved through the definition and filling of the following roles as defined here and fulfilled by the following individuals as noted:

Role Who TIDES Board TIDES Board Coordinator John Levin, Metro Transit (Minneapolis) TIDES Manager MobilityData TIDES Program Manager TBD TIDES Contributor List of Contributors TIDES Stakeholder Anyone who has an interest in or could be directly affected by the TIDES specification and tools."},{"location":"governance/#definitions","title":"Definitions","text":""},{"location":"governance/#tides-project","title":"TIDES Project","text":"

The TIDES Project is made up of:

"},{"location":"governance/#roles","title":"Roles","text":""},{"location":"governance/#tides-owner","title":"TIDES Owner","text":"

TIDES is collectively owned and governed by a Board of Directors.

"},{"location":"governance/#tides-board-of-directors","title":"TIDES Board of Directors","text":"

TIDES is governed by a Board of Directors. The Board meets roughly one a month and has a public agenda and minutes.

"},{"location":"governance/#board-membership","title":"Board Membership","text":""},{"location":"governance/#board-coordinator","title":"Board Coordinator","text":""},{"location":"governance/#board-decisions","title":"Board Decisions","text":""},{"location":"governance/#board-member-role-and-term","title":"Board Member Role and Term","text":""},{"location":"governance/#board-makeup","title":"Board Makeup","text":""},{"location":"governance/#tides-manager","title":"TIDES Manager","text":""},{"location":"governance/#tides-program-manager","title":"TIDES Program Manager","text":""},{"location":"governance/#management-implementation-and-principles","title":"Management Implementation and Principles","text":""},{"location":"governance/#tides-contributor","title":"TIDES Contributor","text":""},{"location":"governance/#tides-stakeholder","title":"TIDES Stakeholder","text":""},{"location":"governance/#document-history","title":"Document History","text":""},{"location":"governance/#2023-12-04","title":"2023-12-04","text":""},{"location":"governance/#2024-01-04","title":"2024-01-04","text":""},{"location":"governance/#initial-version","title":"Initial Version","text":""},{"location":"samples/","title":"Sample Data","text":"

Sample data can be found in the /samples directory, with one directory for each data sample.

"},{"location":"samples/#samples-directory-organization","title":"Samples Directory Organization","text":"

Each TIDES Data Package example should follow the following directory structure, consistent with the structure of the Frictionless Data Package specification, including:

unique-example-name\n  \\TIDES     # Required. Data to be validated against the TIDES specification\n  \\datapackage.json # Required. [`tides-data-package`](#tides-data-package) metadata\n  \\raw      # Optional. Data which the agency uses to create TIDES data\n  \\scripts  # Optional. Scripts used to transform raw --> TIDES\n
"},{"location":"samples/#adding-examples","title":"Adding Examples","text":"

We encourage the addition of examples, but please follow the following guidelines:

  1. No large files This isn\u2019t the place to store your data, rather to document some minimal examples. The recommended size is 100-1000 records per file, more if absolutely required to reproduce an issue with the spec. All individual files should be well under 50 MB.
  2. Include Metadata as specified in tides-data-package.
  3. Include a README.md in the base folder of your example with an overview so that it can be included in the documentation.
"},{"location":"samples/#data-package","title":"Data Package","text":"

TIDES sample data must include a datapackage.json in the format specified by the tides-data-package json schema (an extension of the frictionless data package).

See:

"},{"location":"samples/#data-validation","title":"Data validation","text":"

Data with a valid datapackage.json can be easily validated using the frictionless framework, which can be installed and invoked as follows:

pip install frictionless\nfrictionless validate --schema-sync path/to/your/datapackage.json\n

Alternatively, we also provide a wrapper script to provide some additional flexibility and options.

Usage: bin/validate-datapackage [-v remote_spec_ref | -l local_spec_path] [-d dataset_path]

Key usage examples:

If you only want to validate your datapackage.json file and not the datapackage as a whole, you can run the script bin/validate-datapackage-to-profile instead with the same options. Note that\u00a0this is also run as a part of validate-datapackage.

"},{"location":"samples/#specific-files","title":"Specific files","text":"

Specific files can be validated by running the frictionless framework against them and their corresponding schemas as follows:

frictionless validate vehicles.csv --schema https://raw.githubusercontent.com/TIDES-transit/TIDES/main/spec/vehicles.schema.json\n
"},{"location":"samples/#continuous-data-validation","title":"Continuous Data Validation","text":"

Sample data in the \\TIDES subdirectories of each sample is validated upon a push action to the main repository.

"},{"location":"samples/#data-list","title":"Data List","text":"Sample* Agency Resources *Vendors"},{"location":"tables/","title":"Data Table Schemas","text":"

Data table schemas are specified in JSON and are compatible with the frictionless data table schema standards.

"},{"location":"tables/#event-tables","title":"Event Tables","text":""},{"location":"tables/#fare-transactions","title":"Fare Transactions","text":"

fare_transactions.schema.json

Timestamped fare transaction, associated with devices.

Primary key: {transaction_id}

name constraints type description rdfType title transaction_id RequiredUnique string Identifies the fare transaction. service_date Required date Service date. References GTFS event_timestamp Required datetime Recorded event timestamp, including for transactions that may be aggregated values associated with a trip or vehicle. location_ping_id string Identifies the vehicle location where the fare transaction occurred ID referencing vehicle_locations.location_ping_id amount Required number Value of the transaction. currency_type string Currency used for the transaction. References GTFS https://schema.org/currency fare_action RequiredAllowed Values - Unknown action type- Purchase- Enter- Exit- Transfer entrance- Transfer exit- Add- New- Capture- Extend- Combine- Void- Activate- Adjust- Other string Indicates the type of action performed.Unknown action type: the action type is unknown or missingPurchase: purchase a new card, ticket, pass, or other fare productEnter: enter a fare-controlled area or vehicleExit: exit a fare-controlled area or vehicleTransfer entrance: enter a fare-controlled area or vehicle at no charge due to network or fare policy rules, such as a desginated free transfer at two nearby fare-controlled stationsTransfer exit: exit a fare-controlled area or vehicle at no charge due to network or fare policy rules, such as a desginated free transfer at two nearby fare-controlled stationsAdd: add stored value or stored rides to an existing fare instrumentNew: obtain a new fare instrumentCapture: the device confiscated or retained the fare instrumentExtend: extend a fare product\u2019s temporal validityCombine: combine two or more fare instruments or products into oneVoid: void, cancel, negate, or undo a previous fare transactionActivate: make a fare product active for travelAdjust: credit or debit a fare instrument to balance an earlier transactionOther: other action not included in this enumeration trip_id_performed string Identifies the trip performed. May be null if the fare collection device is NOT located on a vehicle. May be null if on a vehicle but trip-level data is unavailable, in which case the data would be associated with the vehicle. ID referencing trips_performed.trip_id_performed trip_id_scheduled string Identifies the scheduled trip. May be null if the fare collection device is NOT located on a vehicle. May be null if on a vehicle but schedule data is unavailable, in which case the data would be associated with the vehicle. ID referencing trips_performed.trip_id_scheduled pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern trip_stop_sequence minimum: 1 integer The actual order of stops visited within a performed trip. The values must start at 1 and must be consecutive along the trip. Example: A bus departs the first stop and detours around the second and third scheduled stops, visiting one unscheduled stop and resuming regular service at the 4th scheduled stop. The scheduled_stop_sequence is [1, null, 4], and the trip_stop_sequence is [1, 2, 3]. Positive integer referencing stop_visits.trip_stop_sequence scheduled_stop_sequence minimum: 0 integer Scheduled order of stops for a particular trip. The values must increase along the trip but do not need to be consecutive. References GTFS positive integer referencing GTFS stop_times.stop_sequence vehicle_id string Identifies the vehicle. May be null if collection device is NOT located on a vehicle. May be null if on a vehicle but vehicle data is unavailable, in which case the data would be associated with a trip and/or stop. ID referencing vehicles.vehicle_id device_id string Identifies the ITS device on which the fare transaction was performed. May be null if only a single device is reporting fare transactions on a vehicle and vehicle_id is provided. May be null if only a single device is reporting fare transactions at a stop and stop_id is provided. ID referencing devices.device_id fare_id string Identifies a fare class, as included in the GTFS Fare_attributes file. References GTFS ID referencing GTFS fare_attributes.fare_id stop_id string Identifies the stop. References GTFS ID referencing GTFS stops.stop_id num_riders minimum: 0 integer The number of riders included in the transaction. fare_media_id Allowed Values - Cash or coins- Smart card or ticket- Magnetic-stripe card or ticket- Bank card- Mobile NFC- Optical scan- Button pressed by driver or operator to indicate a boarding or alighting passenger.- Other type string Indicates the fare medium that was used for the transaction. rider_category string Indicates rider category (categories defined by transit agency). For example:AdultYouthStudentSeniorOther reduced fare_product string Indicates the fare group (fare groups defined by transit agency). For example:Single ridePassEmployer sponsoredOther pass fare_period string Indicates the fare period (fare periods defined by transit agency). For example:All dayPeakOff-peakSummerOther fare_capped Required boolean Indicates if the fare charged in this transaction was modified by a fare capping policy. token_id string Identifies the individual fare instrument used for the transaction. For example, the fare card ID. balance number Stored value remaining on an account after the transaction is made."},{"location":"tables/#passenger-events","title":"Passenger Events","text":"

passenger_events.schema.json

Timestamped passenger-related events, including boardings and alightings.

Primary key: {passenger_event_id}

name constraints type description title passenger_event_id RequiredUnique string Identifies the recorded passenger event. service_date Required date Service date. References GTFS event_timestamp Required datetime Recorded event timestamp. location_ping_id string Identifies the vehicle location where the passenger event occurred ID referencing vehicle_locations.location_ping_id trip_id_performed string Identifies the trip performed. If trips_performed table is used, this must be populated in order to link to it. ID referencing trips_performed.trip_id_performed trip_id_scheduled string Identifies the scheduled trip. ID referencing trips_performed.trip_id_scheduled trip_stop_sequence Required minimum: 1 integer The actual order of stops visited within a performed trip. The values must start at 1 and must be consecutive along the trip. Example: A bus departs the first stop and detours around the second and third scheduled stops, visiting one unscheduled stop and resuming regular service at the 4th scheduled stop. The scheduled_stop_sequence is [1, null, 4], and the trip_stop_sequence is [1, 2, 3]. Positive integer referencing stop_visits.trip_stop_sequence scheduled_stop_sequence minimum: 0 integer Scheduled order of stops for a particular trip. The values must increase along the trip but do not need to be consecutive. References GTFS positive integer referencing GTFS stop_times.stop_sequence event_type RequiredAllowed Values - Vehicle arrived at stop- Vehicle departed stop- Door opened- Door closed- Passenger boarded- Passenger alighted- Kneel was engaged- Kneel was disengaged- Ramp was deployed- Ramp was raised- Ramp deployment failed- Lift was deployed- Lift was raised- Individual bike boarded- Individual bike alighted- Bike rack deployed string Indicates the type of event recorded. vehicle_id Required string Identifies a vehicle. ID referencing vehicles.vehicle_id device_id string Identifies the device that recorded the event. May be null if only a single device is reporting passenger events on a vehicle/ train car and the device_id is not distinct from vehicle_id/train_car_id. ID referencing devices.device_id train_car_id string Identifies the train car. ID referencing train_cars.train_car_id stop_id string Identifies the stop the vehicle is serving. References GTFS ID referencing GTFS stops.stop_id pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern event_count minimum: 0 integer Count for this event, e.g., 3 for a Passenger Boarding event with 3 boardings, default is 1 Event count"},{"location":"tables/#vehicle-locations","title":"Vehicle Locations","text":"

vehicle_locations.schema.json

Timestamped vehicle locations and speeds.

Primary key: {location_ping_id}

name constraints type description title location_ping_id RequiredUnique string Identifies the recorded vehicle location event. service_date date Service date. References GTFS event_timestamp Required datetime Recorded event timestamp. trip_id_performed string Identifies the trip performed. If trips_performed table is used, this must be populated in order to link to it. ID referencing trips_performed.trip_id_performed trip_id_scheduled string Identifies the scheduled trip. ID referencing trips_performed.trip_id_scheduled trip_stop_sequence minimum: 1 integer The actual order of stops visited within a performed trip. The values must start at 1 and must be consecutive along the trip. Example: A bus departs the first stop and detours around the second and third scheduled stops, visiting one unscheduled stop and resuming regular service at the 4th scheduled stop. The scheduled_stop_sequence is [1, null, 4], and the trip_stop_sequence is [1, 2, 3]. Positive integer referencing stop_visits.trip_stop_sequence scheduled_stop_sequence minimum: 0 integer Scheduled order of stops for a particular trip. The values must increase along the trip but do not need to be consecutive. References GTFS positive integer referencing GTFS stop_times.stop_sequence vehicle_id Required string Identifies a vehicle. ID referencing vehicles.vehicle_id device_id string Identifies the device that recorded the vehicle location. May be null if only a single device is reporting vehicle location and the device_id is not distinct from vehicle_id. ID references devices.device_id pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern stop_id string Identifies the stop the vehicle is approaching or serving currently. References GTFS ID referencing GTFS stops.stop_id current_status Allowed Values - Incoming at- Stopped at- In transit to string Indicates the status of the vehicle in reference to a stop. References GTFS-Realtime latitude minimum: -90 maximum: 90 number Degrees North, in the WGS-84 coordinate system. References GTFS-Realtime longitude minimum: -180 maximum: 180 number Degrees East, in the WGS-84 coordinate system. References GTFS-Realtime gps_quality Allowed Values - Excellent- Good- Poor string Indicates the quality of data and communication provided by the GPS. heading minimum: 0 maximum: 360 number Heading, in degrees, clockwise from true north, e.g., 0 would mean north and 90 would mean east. This can be the compass bearing, or the direction towards the next stop or intermediate location. This should not be deduced from the sequence of previous positions, which clients can compute from previous data. References GTFS-Realtime speed minimum: 0 number Momentary speed measured by the vehicle, in meters per second. References GTFS-Realtime odometer minimum: 0 number Odometer value, in meters. References GTFS-Realtime schedule_deviation integer Indicates schedule adherence in seconds. A negative value represents an early vehicle. (An unscheduled trip would not have a scheduled deviation.) headway_deviation integer Indicates headway adherence in seconds. A negative value represents a shorter than scheduled headway. trip_type Allowed Values - In service- Deadhead- Layover- Pullout- Pullin- Extra Pullout- Extra Pullin- Deadhead To Layover- Deadhead From Layover- Other not in service string Indicates status of travel with regard to service. schedule_relationship Allowed Values - Scheduled- Skipped- Added- Missing string Indicates the status of the stop."},{"location":"tables/#summary-tables","title":"Summary Tables","text":""},{"location":"tables/#station-activities","title":"Station Activities","text":"

station_activities.schema.json

Summarized transactions, entries, and exits by stop or station and time period for each service date (for events not associated with a trip).

Primary key: {service_date, time_period_end, time_period_start, stop_id}

name constraints type description title service_date Required date Service date stop_id Required string Identifies stop. References GTFS ID referencing GTFS stops.stop_id time_period_start Required datetime Aggregation period start time. time_period_end Required datetime Aggregation period end time. time_period_category string Indicates a standard time period to aid further aggregation. For example:All dayPeakOff-peakSummerOther total_entries minimum: 0 integer Number of events at the stop considered entries, such as boardings or fare transactions. total_exits minimum: 0 integer Number of events at the stop considered exits, such as alightings. number_of_transactions minimum: 0 integer Number of fare transactions that occurred at a stop. bike_entries minimum: 0 integer Number of bikes that entered the stop. bike_exits minimum: 0 integer Number of bikes that exited the stop. ramp_entries minimum: 0 integer Number of entries that used a ramp or accessible entrance. ramp_exits minimum: 0 integer Number of exits that used a ramp or accessible exit."},{"location":"tables/#stop-visits","title":"Stop Visits","text":"

stop_visits.schema.json

Summarized boarding, alighting, arrival, departure, and other events (kneel engaged, ramp deployed, etc.) by trip and stop for each service date.

Primary key: {service_date, trip_id_performed, trip_stop_sequence}

name constraints type description title service_date Required date Service date. References GTFS indirectly via calendars.txt and calendar_dates.txt trip_id_performed Required string Identifies the trip performed ID referencing trips_performed.trip_id_performed trip_stop_sequence Required minimum: 1 integer The actual order of stops visited within a performed trip. The values must start at 1 and must be consecutive along the trip. Example: A bus departs the first stop and detours around the second and third scheduled stops, visiting one unscheduled stop and resuming regular service at the 4th scheduled stop. The scheduled_stop_sequence is [1, null, 4], and the trip_stop_sequence is [1, 2, 3]. scheduled_stop_sequence minimum: 0 integer Scheduled order of stops for a particular trip. The values must increase along the trip but do not need to be consecutive. References GTFS positive integer referencing GTFS stop_times.stop_sequence pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern vehicle_id string Identifies the vehicle. ID referencing vehicles.vehicle_id dwell minimum: 0 integer Indicates the amount of time a vehicle spent stopped at a stop in seconds. stop_id string Identifies the stop. References GTFS ID referencing GTFS stops.stop_id timepoint boolean Indicates if the stop should be used for evaluating schedule adherence, on-time performance, and other KPIs. This could be populated to match the GTFS \u201ctimepoint\u201d field. schedule_arrival_time datetime Scheduled timestamp at which the vehicle arrives at a stop. References GTFS schedule_departure_time datetime Scheduled timestamp at which the vehicle departs from a stop. References GTFS actual_arrival_time datetime Timestamp at which the vehicle arrives at a stop. actual_departure_time datetime Timestamp at which the vehicle departs from a stop. distance minimum: 0 integer Observed distance in meters from the previous stop traveled by the vehicle. boarding_1 minimum: 0 integer Number of riders who entered through the vehicle\u2019s front doors (in vehicles with doors opening on only one side, or when passengers primarily board through the front, as is typical with buses) or the vehicle\u2019s right doors (in vehicles with doors on both sides, or when passengers board through all doors, as is typical with trains). alighting_1 minimum: 0 integer Number of riders who exited through the vehicle\u2019s front doors (in vehicles with doors opening on only one side, or when passengers primarily board through the front, as is typical with buses) or the vehicle\u2019s right doors (in vehicles with doors on both sides, or when passengers board through all doors, as is typical with trains). boarding_2 minimum: 0 integer Number of riders who entered through other doors, such as a bus\u2019s rear door when boarding_1 captures the front door, or a train\u2019s left doors when boarding_1 captures right doors. alighting_2 minimum: 0 integer Number of riders who exited through other doors, such as a bus\u2019s rear door when alighting_1 captures the front door, or a train\u2019s left doors when alighting_1 captures right doors. departure_load minimum: 0 integer Number of riders on the vehicle when departing the stop. door_open datetime Timestamp at which the doors opened. door_close datetime Timestamp at which the doors closed. door_status Allowed Values - Doors did not open- Front door opened and back doors remain closed- Back doors opened and front door remained closed- All doors opened- Other configuration string Indicates actions of the doors during the stop visit. ramp_deployed_time minimum: 0 number Duration of time a ramp is deployed, in seconds. ramp_failure boolean Indicates if the ramp deployment failed at a stop. kneel_deployed_time minimum: 0 number Duration of time a kneel is deployed in seconds. lift_deployed_time minimum: 0 number Duration of time in seconds of time a lift is deployed. bike_rack_deployed boolean Indicates if the bike rack was deployed at a stop. bike_load minimum: 0 integer Number of bikes on the vehicle when departing the stop. revenue number Amount of revenue collected at the stop. number_of_transactions minimum: 0 integer Number of fare transactions that occurred at a stop. schedule_relationship Allowed Values - Scheduled- Skipped- Added- Missing string Indicates the status of the stop."},{"location":"tables/#trips-performed","title":"Trips Performed","text":"

trips_performed.schema.json

Trips performed for each service date.

Primary key: {service_date, trip_id_performed}

name constraints type description title service_date Required date Service date. References GTFS trip_id_performed Required string Uniquely identifies the trip performed. It must be unique for a service_date (and it can optionally be unique across all time). It does not have to equal trip_id_scheduled. vehicle_id Required string Identifies the vehicle. ID referencing vehicles.vehicle_id trip_id_scheduled string Identifies the scheduled trip associated with the trip performed. One scheduled trip may be associated with multiple operated trips, or an operated trip may not be associated with a scheduled trip. References GTFS. If this trip was published in GTFS Schedule, this value should be consistent with the GTFS trip_id. If this trip was not scheduled, the value should be Null. ID referencing GTFS trips.trip_id route_id string Identifies the route. References GTFS ID referencing GTFS routes.route_id route_type Allowed Values - Tram / Streetcar / Light rail- Subway / Metro- Rail- Bus- Ferry- Cable tram- Aerial lift- Funicular- Trolleybus- Monorail- Railway Service- High Speed Rail Service- Long Distance Trains- Inter Regional Rail Service- Car Transport Rail Service- Sleeper Rail Service- Regional Rail Service- Tourist Railway Service- Rail Shuttle (Within Complex)- Suburban Railway- Replacement Rail Service- Special Rail Service- Lorry Transport Rail Service- All Rail Services- Cross-Country Rail Service- Vehicle Transport Rail Service- Rack and Pinion Railway- Additional Rail Service- Coach Service- International Coach Service- National Coach Service- Shuttle Coach Service- Regional Coach Service- Special Coach Service- Sightseeing Coach Service- Tourist Coach Service- Commuter Coach Service- All Coach Services- Urban Railway Service- Metro Service- Underground Service- All Urban Railway Services- Bus Service- Regional Bus Service- Express Bus Service- Stopping Bus Service- Local Bus Service- Night Bus Service- Post Bus Service- Special Needs Bus- Mobility Bus Service- Mobility Bus for Registered Disabled- Sightseeing Bus- Shuttle Bus- School Bus- School and Public Service Bus- Rail Replacement Bus Service- Demand and Response Bus Service- All Bus Services- Trolleybus Service- Tram Service- City Tram Service- Local Tram Service- Regional Tram Service- Sightseeing Tram Service- Shuttle Tram Service- All Tram Services- Water Transport Service- Air Service- Ferry Service- Aerial Lift Service- Telecabin Service- Cable Car Service- Elevator Service- Chair Lift Service- Drag Lift Service- Small Telecabin Service- All Telecabin Services- Funicular Service- Taxi Service- Communal Taxi Service- Water Taxi Service- Rail Taxi Service- Bike Taxi Service- Licensed Taxi Service- Private Hire Service Vehicle- All Taxi Services- Miscellaneous Service- Horse-drawn Carriage string Indicates the type of transportation used on a route. References GTFS routes.route_type including Google\u2019s Extended Route Types GTFS extension ntd_mode Allowed Values - Aerial Tramway- Alaska Railroad- Bus- Bus Rapid Transit- Cable Car- Commuter Bus- Commuter Rail- Demand Response- Demand Taxi- Ferryboat- Heavy Rail- Hybrid Rail- Inclined Plane- Jitney- Light Rail- Monorail/Automated Guideway- Other- P\u00fablico- Streetcar- Trolleybus- Vanpool string NTD mode, references the Modes and Types of Service section of the Introduction to the NTD Full Reporting Policy Manual https://www.transit.dot.gov/ntd/manuals route_type_agency string Agency specific route type shape_id string Identifies a geospatial shape that describes the vehicle travel path for a trip. References GTFS ID referencing shapes.shape_id pattern_id string Identifies the unique stop-path for a trip, may be distinct from GTFS shapes.shape_id unique identifier for the route-pattern direction_id Allowed Values - 0- 1 integer Indicates the direction of travel for a trip. References GTFS operator_id string Identifies the vehicle\u2019s operator. ID referencing operators.operator_id block_id string Identifies the block to which the trip belongs. A block consists of a single trip, or many sequential trips made using the same vehicle, defined by shared service days and block_id. A block_id can have trips with different service days, making distinct blocks. See example in GTFS documentation. References GTFS ID referencing trips.block_id trip_start_stop_id string Origin stop_id. References GTFS ID referencing GTFS stops.stop_id trip_end_stop_id string Destination stop_id. References GTFS ID referencing GTFS stops.stop_id schedule_trip_start datetime Scheduled departure time from the trip\u2019s origin. schedule_trip_end datetime Scheduled end timestamp at the trip\u2019s destination. actual_trip_start datetime Timestamp at which the vehicle departed its origin. actual_trip_end datetime Timestamp at which the vehicle arrived at its destination. trip_type Allowed Values - In service- Deadhead- Layover- Pullout- Pullin- Extra Pullout- Extra Pullin- Deadhead To Layover- Deadhead From Layover- Other not in service string Indicates status of travel with regard to service. schedule_relationship Allowed Values - Scheduled- Added- Unscheduled- Canceled- Duplicated string Indicates the status of the trip. References GTFS-realtime TripUpdate.trip.schedule_relationship"},{"location":"tables/#supporting-tables","title":"Supporting Tables","text":""},{"location":"tables/#devices","title":"Devices","text":"

devices.schema.json

Measurement devices, such as AVL, APC, and AFC devices, associated with vehicles or stops or stations.

Primary key: {device_id}

name constraints type description title device_id RequiredUnique string Identifies a device. If possible, this should match other internal agency device IDs. stop_id string Identifies the stop (or other location) at which the device is located. May be null if the device is on a vehicle. References GTFS ID referencing GTFS stops.stop_id vehicle_id string Identifies the vehicle on which the device is located. May be null if the device is at a stop or station. ID referencing vehicles.vehicle_id train_car_id string Identifies the train car or asset on which the device is located. May be null if the device is at a stop or station or if the Train_cars file is not used. ID referencing train_cars.train_car_id device_type Allowed Values - Farebox- Fare gate- Fare vending machine- Passenger counter- Vehicle location- Other string Indicates the type of device. device_vendor string Vendor of the device. device_model string Model of the device as specified by the vendor. device_location string Indicates the location of a device on the vehicle or at a station. For example:Front door.Back door.Entrance (not located on a vehicle).Exit (not located on a vehicle).Entrance/exit (not located on a vehicle).Other."},{"location":"tables/#operators","title":"Operators","text":"

operators.schema.json

Personnel who operate vehicles.

Primary key: {operator_id}

name constraints type description operator_id RequiredUnique string Identifies an operator. If possible, this should match other internal agency operator IDs."},{"location":"tables/#train-cars","title":"Train Cars","text":"

train_cars.schema.json

Assets that comprise vehicles, such as train cars, with descriptive information.

Primary key: {train_car_id}

name constraints type description train_car_id RequiredUnique string Identifies a train car or asset. If possible, this should match other internal agency asset IDs. model_name string Describes the train car or asset\u2019s model. facility_name string Name or internal agency ID for the facility where the train car or asset is generally held. capacity_seated minimum: 0 integer Number of seats on the train car or asset. capacity_wheelchair minimum: 0 integer Number of wheelchair spaces on the train car or asset. capacity_bike minimum: 0 integer Number of bike spaces on the train car or asset. bike_rack boolean Indicates if the train car or asset has a usable bike rack. capacity_standing minimum: 0 integer Standing capacity of the train car or asset set by the manufacturer. train_car_type Allowed Values - Train car- Trolley- Other string Indicates the type of train car or asset."},{"location":"tables/#vehicle-train-cars","title":"Vehicle Train Cars","text":"

vehicle_train_cars.schema.json

Relationships between assets and vehicles.

Primary key: {vehicle_id, train_car_id}

name constraints type description title vehicle_id Required string Identifies a vehicle, such as a train consist. If possible, this should match other internal agency vehicle IDs. ID referencing vehicles.vehicle_id train_car_id Required string Identifies a train car or an asset that is a component of the vehicle. ID referencing train_cars.train_car_id train_car_order minimum: 0 integer The assigned order of the train car or asset within the vehicle. operator_id string Identifies an operator (person). If possible, this should match other internal agency operator IDs."},{"location":"tables/#vehicles","title":"Vehicles","text":"

vehicles.schema.json

Vehicles, including buses and train consists, with descriptive information.

Primary key: {vehicle_id}

name constraints type description vehicle_id RequiredUnique string Identifies a vehicle, such as a bus or a train consist. If possible, this should match other internal agency vehicle IDs and the GTFS-realtime VehicleDescriptor. vehicle_start datetime The timestamp at which the vehicle or train consist is first in operation (i.e., when the consist has been created). Required if Train_car is used. vehicle_end datetime The timestamp at which the vehicle or train consist no longer exists (i.e., the consist is separated or modified). Only used if Train_car is used. model_name string Describes the vehicle\u2019s model. facility_name string Name or internal agency ID for the facility where the vehicle is generally held. capacity_seated minimum: 0 integer Number of seats on the vehicle. Used if Train_car is not used. capacity_wheelchair minimum: 0 integer Number of wheelchair spaces on the vehicle. Used if Train_car is not used. capacity_bike minimum: 0 integer Number of bike spaces on the vehicle. Used if Train_car is not used. bike_rack boolean Indicates if the vehicle has a useable bike rack. Used if Train_car is not used. capacity_standing minimum: 0 integer Standing capacity of the vehicle set by the manufacturer. Used if Train_car is not used."},{"location":"governance/actions/","title":"Board Actions","text":"

Documentation, documents, and decisions of the Board will be stored in a TIDES-transit GitHub Repository in /docs/governance/actions:

2023-12-06 Designation of Board Coordinator Role to John Levin

Unanimous consent

2023-12-06 Approved by unanimous consent of the TIDES Board as documented in Board Meeting Minutes.

2023-12-06 Execution of MOU assigning TIDES Manager role duties to MobilityData

Unanimous consent full document

2023-12-06 Approved by unanimous consent of the TIDES Board as documented in Board Meeting Minutes.

2024-01-03 Executed via signature of MOU by TIDES Board Coordinator and Mobility Data Executive Director.

2023-11-29 Approved v1.0 of Change Management Policy

Unanimous consent full document

Approved by unanimous consent as documented in github issue #184

2023-11-29 Approved Board Expansion to 5 Members

Unanimous consent full document

Approved by unanimous consent as documented in github issue #189 and signed letter from board chair.

The resulting TIDES board is now:

"},{"location":"governance/meetings/","title":"Board Meetings","text":"

Rolling Agendas + Notes

"},{"location":"governance/meetings/#2024","title":"2024","text":""},{"location":"governance/meetings/#2023","title":"2023","text":""},{"location":"governance/actions/2023-11-29%20approve-change-management-policy/","title":"Approved v1.0 of Change Management Policy","text":"

Approved by unanimous consent as documented in github issue #184

"},{"location":"governance/actions/2023-11-29%20board-expansion/","title":"Approved Board Expansion to 5 Members","text":"

Approved by unanimous consent as documented in github issue #189 and signed letter from board chair.

The resulting TIDES board is now:

"},{"location":"governance/actions/2023-12-06%20designate-tides-board-coordinator/","title":"Designation of Board Coordinator Role to John Levin","text":"

2023-12-06 Approved by unanimous consent of the TIDES Board as documented in Board Meeting Minutes.

"},{"location":"governance/actions/2023-12-06%20designate-tides-manager/","title":"Execution of MOU assigning TIDES Manager role duties to MobilityData","text":"

2023-12-06 Approved by unanimous consent of the TIDES Board as documented in Board Meeting Minutes.

2024-01-03 Executed via signature of MOU by TIDES Board Coordinator and Mobility Data Executive Director.

"},{"location":"governance/policies/CLA/","title":"TIDES Contributor License Agreement","text":"

By making a contribution to this project, I certify that:

a. The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or

b. The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or

c. The contribution was provided directly to me by some other person who certified (a), (b) or \u00a9 and I have not modified it.

d. I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved.

Attribution: This Contributor Agreement is adapted from the node.js project available here: https://github.com/nodejs/node/blob/main/CONTRIBUTING.md.

"},{"location":"governance/policies/change-management/","title":"TIDES Change Management Policy","text":"

Tip

When capitalized in this document, the words \u201cMUST\u201d, \u201cMUST NOT\u201d, \u201cREQUIRED\u201d, \u201cSHALL\u201d, \u201cSHALL NOT\u201d, \u201cSHOULD\u201d, \u201cSHOULD NOT\u201d, \u201cRECOMMENDED\u201d, \u201cMAY\u201d, and \u201cOPTIONAL\u201d refer to their respective definitions in RFC 2119.

Tip

Definitions of various roles such as TIDES Board, TIDES Manager and TIDES Contributor refer to their respective definitions in the TIDES Governance Policy.

Over time, the TIDES data standard will need to evolve to meet stakeholder needs. Changes may include the addition of new tables, new fields to existing tables, or the modification of existing fields. Occasionally this may also include significant structural changes which may not be backwards compatible with existing datasets.

The change management process covers:

"},{"location":"governance/policies/change-management/#principles","title":"Principles","text":"

The revision process is designed with the following principles in mind:

Merit

Openness + Transparency

Efficiency

"},{"location":"governance/policies/change-management/#change-making-process","title":"Change-Making Process","text":"

This change-making process covers all normative content changes to the TIDES specification.

"},{"location":"governance/policies/change-management/#normative-content","title":"Normative Content","text":"

Normative Content is the prescriptive part of a standard**. It sets the rules to be followed in order to be evaluated as compliant with the standard, and from which no deviation is permitted.

Normative Content in TIDES

In the TIDES data schemas, the following properties are considered normative content within any schema.json file:

Similarly, the entirety of the TIDES Data Package Profile is considered normative with the exception of the following properties:

Non-normative content is the non-prescriptive, or \u2018descriptive\u2019, part of a standard. This may include analogies, synonyms, explanations, illustrations, context, and examples. In the event non-normative content contradicts normative content, the normative content is to be followed.

Non-Normative Content in TIDES

Changes outside the /spec are all considered non-normative. Within the /spec folder, non-normative changes to the specification are typically limited to the following properties in the tides-datapackage-profile.json and any ...schema.jsonfile:

"},{"location":"governance/policies/change-management/#change-making-stages","title":"Change-making Stages","text":"

The process by which normative changes are made to the TIDES data specification occurs in the following stages:

Stage When Who (led by) Need Identification Anytime Anyone Prioritization Quarterly (or as determined by TIDES Board or TIDES Manager) Contributors (Manager) Proposal Development Prioritized quarter Working Group (Manager) Review + Adoption Pull request for proposed change submitted after consensus in the Working Group Working Group (Manager) Implementation When decision made to consensus achieved on proposal Working Group (Manager) Released Next quarterly release Manager

Each of these stages is discussed in more detail below.

Need Identification Prioritization Proposal Development Review + Adoption Implementation Release

Any TIDES Contributor identifies a need that should be addressed in the TIDES specification.

Actions:

Resolution: TIDES Manager puts issue into consideration for next quarterly issue prioritization

The TIDES Manager starts a development cycle after or near the end of a quarterly release.

Actions:

Resolution: TIDES Manager will create a Milestone for the next release in GitHub and fill it with the issues the Board prioritized.

TIDES Manager, in consultation with the TIDES Board and TIDES Contributors, convenes an Issue Working Group to address a prioritized issue or set of interrelated issues.

Actions:

Resolution: Working Group submits a pull request to the develop branch.

TIDES Manager invites people outside of the Working Group to review and comment on the proposal

Actions:

Resolution: Change as represented in the pull request from the feature branch is approved and merged into the develop branch.

Final change proposal is approved - although initial work can begin ahead of this.

Actions:

Resolution: Requirements for release are met.

Initiated: On a quarterly schedule maintained by the TIDES Manager.

Actions: See Release Management.

"},{"location":"governance/policies/change-management/#expedited-change-management","title":"Expedited Change Management","text":"

This section outlines an expedited process for implementing changes in response to Urgent Needs which are critical to maintaining the security, compliance, or operational functionality of TIDES balancing rapid response with informed, transparent decision-making.

Urgent Needs

Urgent needs MUST pose significant risks to security, compliance, or the operational integrity of stakeholder systems. These MAY include necessary revisions due to legal mandates, critical security vulnerabilities, or severe technical inaccuracies that directly impair system functionalities. Urgent needs SHOULD necessitate an implementation timeline which is inconsistent with the normal change-making process.

"},{"location":"governance/policies/change-management/#process","title":"Process","text":"Identification Rapid Evaluation Solution Identification Decision-Making Implementation

Stakeholders SHOULD promptly report urgent needs to the TIDES Manager, detailing the problem and its potential impact.

The TIDES Manager MUST convene a group of at least 2 TIDES Contributors of their choosing to swiftly assess the issue\u2019s urgency and validity.

  1. If it meets their threshold for an urgent need, they forward a list of their proposed Urgent Working Group Members to the TIDES Board.
  2. The Urgent Working Group Members SHOULD contain representatives of TIDES Contributors affected stakeholder groups.
  3. The Urgent Working Group size SHOULD be at least three and reflect the scale of the problem and also need for agile decision making.
  4. The TIDES Board MAY object to their characterization of the need as urgent.
  5. The TIDES Board MAY make changes to the Urgent Working Group members.
  6. If the TIDES Board fails to respond within 48 hours, the Urgent Working Group MAY proceed with their implicit approval.

The Urgent Working Group, managed by the TIDES Manager, MUST identify a solution that meets the urgent need and document it as a PR to the main repository branch \u2013\u00a0outside the normal release cycle.

A supermajority of the Urgent Working Group members MUST approve the proposed change to meet the urgent need. If the decision is deadlocked, the decision is escalated to the TIDES Board.

The rest of the implementation and release cycle mirrors the main change-making process.

"},{"location":"governance/policies/change-management/#versions-and-release-management","title":"Versions and Release Management","text":"

A release is an official version of the TIDES data specification which can be referenced in perpetuity by a version number. The process by which a new release is made and determination of a version number is discussed below.

"},{"location":"governance/policies/change-management/#releases","title":"Releases","text":"

What triggers a release?

Each change to normative content in the main branch of the TIDES github repository MUST be considered a new release and assigned a version number.

Requirements:

"},{"location":"governance/policies/change-management/#pre-releases","title":"Pre-releases","text":"

When might we create a pre-release?

Pre-releases MAY be made in order to evaluate and work on incrementally-approved changes.

Each approved change to normative content in the develop branch of the TIDES github repository MAY be considered a pre-release and assigned a pre-release version number.

Requirements:

"},{"location":"governance/policies/change-management/#release-frequency","title":"Release Frequency","text":"

How often do we make new releases?

Barring significant unexpected events:

"},{"location":"governance/policies/change-management/#version-numbering","title":"Version Numbering","text":"

TIDES releases MUST be reflected by an incremental version number based on a semantic versioning policy as detailed below.

ReleasesPre-releases

What is a Major vs Minor version?

Warning

Non-normative changes MUST NOT increment the TIDES version.

"},{"location":"governance/policies/change-management/#version-control","title":"Version Control","text":"

TIDES SHOULD be managed in Github or a similar version-control tool.

The following branches SHOULD always be maintained:

maindevelopFeature Branches

Fully approved and documented versions of TIDES whereby:

Approved and staged versions of TIDES, awaiting full documentation, sample datasets, and next quarterly release cycle whereby:

All development by contributors SHOULD take place on feature branches whereby.

"},{"location":"governance/policies/change-management/#attribution","title":"Attribution","text":"

This change management policy is adapted from:

"},{"location":"governance/policies/change-management/#revision-history","title":"Revision History","text":""},{"location":"governance/policies/change-management/#v10-2023-11-29-initial-version","title":"v1.0 2023-11-29 Initial Version","text":""},{"location":"governance/policies/code-of-conduct/","title":"TIDES Code of Conduct","text":""},{"location":"governance/policies/code-of-conduct/#our-pledge","title":"Our Pledge","text":"

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

"},{"location":"governance/policies/code-of-conduct/#our-standards","title":"Our Standards","text":"

Examples of behavior that contributes to a positive environment for our community include:

Examples of unacceptable behavior include:

"},{"location":"governance/policies/code-of-conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

The community leaders for this effort include project Leadership and the Product Management Team as described in the Project Governance.

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

"},{"location":"governance/policies/code-of-conduct/#scope","title":"Scope","text":"

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

"},{"location":"governance/policies/code-of-conduct/#enforcement","title":"Enforcement","text":"

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at tidestransit@gmail.com.

All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

"},{"location":"governance/policies/code-of-conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

"},{"location":"governance/policies/code-of-conduct/#1-correction","title":"1. Correction","text":"

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

"},{"location":"governance/policies/code-of-conduct/#2-warning","title":"2. Warning","text":"

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

"},{"location":"governance/policies/code-of-conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

"},{"location":"governance/policies/code-of-conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

"},{"location":"governance/policies/code-of-conduct/#attribution","title":"Attribution","text":"

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

"}]} \ No newline at end of file diff --git a/update-agenda-link/tables/index.html b/update-agenda-link/tables/index.html index c18ffd76..9a6ef3f1 100644 --- a/update-agenda-link/tables/index.html +++ b/update-agenda-link/tables/index.html @@ -1077,7 +1077,7 @@

Station ActivitiesStop Visits

stop_visits.schema.json

Summarized boarding, alighting, arrival, departure, and other events (kneel engaged, ramp deployed, etc.) by trip and stop for each service date.

-

Primary key: {trip_id_performed, service_date, trip_stop_sequence}

+

Primary key: {service_date, trip_id_performed, trip_stop_sequence}

@@ -1311,7 +1311,7 @@

Stop VisitsTrips Performed

trips_performed.schema.json

Trips performed for each service date.

-

Primary key: {trip_id_performed, service_date}

+

Primary key: {service_date, trip_id_performed}

@@ -1641,7 +1641,7 @@

Train CarsVehicle Train Cars

vehicle_train_cars.schema.json

Relationships between assets and vehicles.

-

Primary key: {train_car_id, vehicle_id}

+

Primary key: {vehicle_id, train_car_id}