gtfs-realtime-translators
translates custom arrivals formats to GTFS-realtime. It uses the Google gtfs-realtime-bindings
for Python, supplemented by Intersection extensions.
Following the GTFS-realtime spec, its three pillars are:
TripUpdate
VehiclePosition
Alert
A FeedMessage
is a list of entities, each of which is one of the types above. A FeedMessage
may have entities of different types.
As of 2024-11-20, only TripUpdate
and Alert
are supported.
pip install -e git+https://github.com/Intersection/gtfs-realtime-translators.git@<TAG>#egg=gtfs-realtime-translators
The registry is used to return a translator for a given translator key. This is useful to decouple the translator lookup via external systems from its implementation.
from gtfs_realtime_translators.registry import TranslatorRegistry
translator_klass = TranslatorRegistry.get('la-metro')
translator = translator_klass(**kwargs)
from gtfs_realtime_translators.translators import LaMetroGtfsRealtimeTranslator
translator = LaMetroGtfsRealtimeTranslator(stop_id='80122')
feed_message = translator(la_metro_rail_input_data)
At this point, feed_message
is a standard protocol buffer object and adheres to the normal Python Protocol Buffer interface.
feed_bytes = feed_message.SerializeToString()
New translators should be contributed back to this library.
from gtfs_realtime_translators.factories import TripUpdate, FeedMessage
trip_update = TripUpdate.create(entity_id=entity_id,
arrival_time=arrival_time,
departure_time=departure_time,
trip_id=trip_id,
stop_id=stop_id,
route_id=route_id)
entities = [ trip_update ]
feed_message = FeedMessage.create(entities=entities)
The GTFS-realtime spec is maintained in the google/transit repository. Currently, since there is no versioned way to programmatically include this in our projects, we must clone it as a manual dependency.
git clone https://github.com/google/transit.git ../google-transit
cp ../google-transit/gtfs-realtime/proto/gtfs-realtime.proto gtfs_realtime_translators/bindings/
For our Python libraries to understand the interface specified by the GTFS-realtime spec, we must generate language bindings.
virtualenv ~/.env/gtfs-realtime-bindings
source ~/.env/gtfs-realtime-bindings/bin/activate
pip install grpcio-tools
python3 -m grpc_tools.protoc -I gtfs_realtime_translators/bindings/ --python_out=gtfs_realtime_translators/bindings/ gtfs_realtime_translators/bindings/gtfs-realtime.proto
python3 -m grpc_tools.protoc -I gtfs_realtime_translators/bindings/ --python_out=gtfs_realtime_translators/bindings/ gtfs_realtime_translators/bindings/intersection.proto
Since we are using the published spec bindings, we must do one more step. Inside the generated file, gtfs_realtime_translators/bindings/intersection_pb2.py
, change the following line
import gtfs_realtime_pb2 as gtfs__realtime__pb2
to
from google.transit import gtfs_realtime_pb2 as gtfs__realtime__pb2
pip install -r requirements.txt
pip install -e .
pytest