GTFS Realtime¶
La spĂ©cification GTFS Realtime nâest pas gravĂ©e dans le marbre. Il sâagit plutĂŽt dâune spĂ©cification ouverte dĂ©veloppĂ©e et maintenue par la communautĂ© des agences de transport en commun, des dĂ©veloppeurs et dâautres parties prenantes qui utilisent GTFS Realtime. On sâattend Ă ce que cette communautĂ© de producteurs et de consommateurs de donnĂ©es GTFS Realtime ait des propositions pour Ă©tendre la spĂ©cification afin de permettre de nouvelles fonctionnalitĂ©s. Pour faciliter la gestion de ce processus, les procĂ©dures et lignes directrices suivantes ont Ă©tĂ© Ă©tablies.
La spĂ©cification officielle, la rĂ©fĂ©rence et la documentation sont rĂ©digĂ©es en anglais. Si une traduction dans une autre langue diffĂšre de lâoriginal anglais, ce dernier prĂ©vaut. Toutes les communications sont effectuĂ©es en anglais.
Ajout de nouveaux champs Ă GTFS Realtime¶
Lorsquâun producteur ou une application rĂ©utilisatrice souhaite ajouter un nouveau champ Ă la spĂ©cification GTFS Realtime, il doit ouvrir une nouvelle issue sur le rĂ©pertoire GTFS Realtime GitHub dĂ©crivant le champ proposĂ© et annoncer ce nouveau champ (y compris un lien vers l'issue) sur la liste de diffusion GTFS Realtime.
Champs expĂ©rimentaux¶
-
Si la communauté parvient à un consensus (a) sur le fait que le champ proposé semble utile et (b) sur le type de champ (
optional
vsrepeated
,string
vsint
vsbool
), alors un numĂ©ro de champ sera allouĂ© dans le message GTFS Realtime et une note sera faite dans le fichier .proto et une documentation indiquant quâil sâagit dâun champ expĂ©rimental qui pourrait changer Ă lâavenir.- Le consensus est atteint via un processus de discussion et de vote qui est le mĂȘme que celui ci-dessous Processus de modification des spĂ©cifications, mais au lieu du consentement unanime, seuls 80 % de votes oui sont requis pour lâapprobation.
- Les producteurs et consommateurs GTFS Realtime qui souhaitent utiliser le nouveau champ expérimental régénéreront leur bibliothÚque en utilisant le fichier .proto avec le nouveau champ (par exemple, Google mettra à jour la bibliothÚque gtfs-realtime-bindings), et commenceront à remplir et à consommer le champ avec des données réelles.
- Une fois que nous sommes convaincus que le champ expérimental en vaut la peine et que les producteurs et les consommateurs utilisent le champ, nous suivrons le processus de modification des spécifications ci-dessous pour ajouter officiellement le champ à la spécification.
- Si le champ expĂ©rimental nâest pas adoptĂ© via le processus de modification des spĂ©cifications dans les 2 ans suivant son approbation en tant que champ expĂ©rimental, il sera obsolĂšte en ajoutant
[deprecated=true]
à cÎté de la valeur du champ dans le fichier .proto. En utilisant[deprecated=true]
(au lieu deRESERVED
), les producteurs et les consommateurs qui ont dĂ©jĂ adoptĂ© le champ nâont pas Ă le retirer de son utilisation. De plus, le champ peut ĂȘtre « non obsolĂšte » Ă lâavenir sâil est approuvĂ© lors dâun vote ultĂ©rieur aprĂšs le processus de modification des spĂ©cifications (par exemple, lorsque des producteurs et/ou des consommateurs supplĂ©mentaires commencent Ă utiliser le champ).
-
Si le nouveau champ est considĂ©rĂ© comme spĂ©cifique Ă un seul producteur ou sâil y a un litige sur le type de donnĂ©es, nous attribuerons une extension personnalisĂ©e au producteur afin quâil puisse utiliser le champ dans son propre flux. Lorsque cela est possible, nous devrions Ă©viter les extensions et plutĂŽt ajouter des champs utiles Ă de nombreuses agences Ă la spĂ©cification principale afin dâĂ©viter la fragmentation et le travail supplĂ©mentaire pour les consommateurs pour prendre en charge diverses extensions de la spĂ©cification.
Processus de modification des spĂ©cifications¶
- Créer une branche git avec les changements dans les fichiers de définition de protocole, de spécification et de documentation (sauf pour les traductions).
- Créez une pull request sur https://github.com/google/transit. La pull request doit contenir une description détaillée du correctif. Le créateur de la pull request devient l'advocate.
- Une fois la pull request enregistrĂ©e, elle doit ĂȘtre annoncĂ©e par son advocate dans la liste de diffusion GTFS Realtime. Une fois annoncĂ©e, la pull request est considĂ©rĂ©e comme une proposition.
- Ătant donnĂ© que lâadvocate est un contributeur, il doit signer le Contrat de licence de contributeur avant que la pull request puisse ĂȘtre acceptĂ©e.
- Une discussion sur la proposition s'en suit. Les commentaires des pull requests doivent ĂȘtre utilisĂ©s comme seul forum de discussion.
- La discussion dure aussi longtemps que lâadvocate lâestime nĂ©cessaire, mais doit durer au moins 7 jours calendaires.
- Lâadvocate est responsable de la mise Ă jour en temps opportun de la proposition (câest-Ă -dire de la pull request) sur la base des commentaires pour lesquels il est d'accord.
- A tout moment, lâadvocate peut rĂ©clamer lâabandon de la proposition.
- Lâadvocate peut demander un vote sur une version de la proposition Ă tout moment aprĂšs lâintervalle initial de 7 jours requis pour la discussion.
- Avant de demander un vote, au moins un producteur GTFS Realtime et une application rĂ©utilisatrice GTFS Realtime doivent mettre en Ćuvre le changement proposĂ©. Il est prĂ©vu que le ou les producteurs GTFS Realtime incluent la modification dans un flux public en GTFS Realtime et fournissent un lien vers ces donnĂ©es dans les commentaires de la pull request, et que le ou les application rĂ©utilisatrice GTFS Realtime fournissent un lien dans les commentaires de la pull request vers une application qui utilise le changement dâune maniĂšre non triviale (câest-Ă -dire quâelle prend en charge des fonctionnalitĂ©s nouvelles ou amĂ©liorĂ©es).
- Lorsquâil appelle Ă un vote, lâadvocate doit clairement indiquer si le vote porte sur lâadoption officielle du champ dans la spĂ©cification ou sur un champ expĂ©rimental.
- Le vote dure la période minimale suffisante pour couvrir 7 jours calendaires complets et 5 jours ouvrables suisses complets. Le vote se termine à 23:59:59 UTC.
- Lâadvocate doit annoncer lâheure prĂ©cise de fin au dĂ©but du vote.
- Pendant la pĂ©riode de vote, seules les modifications rĂ©dactionnelles de la proposition sont autorisĂ©es (fautes de frappe, la formulation peut changer tant quâelle nâen change pas le sens).
- Tout le monde est autorisĂ© Ă voter oui/non sous forme de commentaire sur la pull request, et les votes peuvent ĂȘtre modifiĂ©s jusquâĂ la fin de la pĂ©riode de vote. Si un Ă©lecteur modifie son vote, il est recommandĂ© de le faire en mettant Ă jour le commentaire de vote original en barrant le vote et en Ă©crivant le nouveau vote.
- Les votes avant le début de la période de vote ne sont pas pris en compte.
- Lâouverture et la clĂŽture des votes doivent ĂȘtre annoncĂ©es sur la liste de diffusion GTFS Realtime.
- La proposition est acceptĂ©e sâil y a un consensus unanime oui avec au moins 3 voix.
- Le vote de l'advocate ne compte pas dans le total des 3 voix. Par exemple, si l'advocate X crée une pull request et vote oui, et que les utilisateurs Y et Z votent oui, cela compte pour 2 votes oui au total.
- Les votes contre doivent ĂȘtre justifiĂ©s et, idĂ©alement, fournir des retours constructifs.
- Si le vote Ă©choue, lâadvocate peut alors choisir de poursuivre les travaux sur la proposition ou dâabandonner la proposition. Lâune ou lâautre dĂ©cision de lâadvocate doit ĂȘtre annoncĂ©e dans la liste de diffusion GTFS Realtime.
- Si lâadvocate poursuit le travail sur la proposition, un nouveau vote peut ĂȘtre demandĂ© Ă tout moment.
- Toute pull request restant inactive pendant 30 jours calendaires sera clĂŽturĂ©e. Lorsquâune pull request est fermĂ©e, la proposition correspondante est considĂ©rĂ©e comme abandonnĂ©e. Lâadvocate peut rouvrir la pull request Ă tout moment sâil souhaite poursuivre ou maintenir la conversation.
- Notez que lâadvocate peut choisir dâimplĂ©menter la fonctionnalitĂ© en tant quâextension personnalisĂ©e au lieu de faire partie de la spĂ©cification officielle.
- Si la proposition est acceptée :
- Google sâengage Ă merger la version votĂ©e de la pull request (Ă condition que les contributeurs aient signĂ© la CLA), et en effectuant la pull request dans les 5 jours ouvrables.
- Google sâengage Ă mettre Ă jour en temps opportun le rĂ©pertoire https://github.com/google/gtfs-realtime-bindings. Les commits dans gtfs-realtime-bindings qui sont le rĂ©sultat dâune proposition doivent faire rĂ©fĂ©rence Ă la pull request de la proposition.
- Les traductions ne doivent pas ĂȘtre incluses dans la pull request originale. Google est responsable de la mise Ă jour Ă©ventuelle des traductions pertinentes dans les langues prises en charge, mais les demandes de traduction pure de la communautĂ© sont les bienvenues et seront acceptĂ©es dĂšs que tous les commentaires Ă©ditoriaux auront Ă©tĂ© pris en compte.
Principes directeurs¶
Afin de prĂ©server la vision originale de GTFS Realtime, un certain nombre de principes directeurs sont Ă prendre en considĂ©ration lors de lâextension de la spĂ©cification :
Les flux doivent ĂȘtre efficaces pour produire et consommer en temps rĂ©el.
Lâinformation en temps rĂ©el est un flux continu et dynamique de donnĂ©es qui nĂ©cessite nĂ©cessairement un traitement efficace. Nous avons choisi les Protocol Buffers comme base de la spĂ©cification car ils offrent un bon compromis en termes de facilitĂ© dâutilisation pour les dĂ©veloppeurs et en termes dâefficacitĂ© de transmission des donnĂ©es. Contrairement Ă GTFS, nous nâimaginons pas que de nombreuses agences Ă©diteront manuellement les flux GTFS Realtime. Le choix des tampons de protocole reflĂšte la conclusion selon laquelle la plupart des flux GTFS Realtime seront produits et consommĂ©s automatiquement.
La spécification concerne les informations sur les passagers.
Comme GTFS avant lui, GTFS Realtime sâintĂ©resse principalement aux informations sur les passagers. Autrement dit, la spĂ©cification doit inclure des informations qui peuvent avant tout aider les outils destinĂ©s Ă l'information voyageur. Il existe potentiellement une grande quantitĂ© dâinformations opĂ©rationnelles que les agences de transport en commun pourraient souhaiter transmettre en interne entre les systĂšmes. GTFS Realtime nâest pas destinĂ© Ă cet objectif et il existe potentiellement dâautres normes de donnĂ©es orientĂ©es opĂ©rations qui pourraient ĂȘtre plus appropriĂ©es.
Les modifications apportĂ©es Ă la spĂ©cification doivent ĂȘtre rĂ©trocompatibles.
Lors de lâajout de fonctionnalitĂ©s Ă la spĂ©cification, nous souhaitons Ă©viter dâapporter des modifications qui rendraient les flux existants invalides. Nous ne voulons pas crĂ©er davantage de travail pour les Ă©diteurs de flux existants qui ne souhaiteraient pas ajouter des fonctionnalitĂ©s Ă leurs flux. De plus, dans la mesure du possible, nous souhaitons que les lecteurs de flux existants puissent continuer Ă lire les anciennes parties des flux les plus rĂ©cents. Les conventions dâextension des tampons de protocole imposeront la rĂ©trocompatibilitĂ© dans une certaine mesure. Cependant, nous souhaitons Ă©viter les modifications sĂ©mantiques des champs existants qui pourraient Ă©galement rompre la rĂ©trocompatibilitĂ©.
Les fonctionnalités spéculatives sont déconseillées.
Chaque nouvelle fonctionnalitĂ© ajoute de la complexitĂ© Ă la crĂ©ation et Ă la lecture des flux. Par consĂ©quent, nous voulons veiller Ă nâajouter que des fonctionnalitĂ©s que nous savons utiles. IdĂ©alement, toute proposition aura Ă©tĂ© testĂ©e en gĂ©nĂ©rant des donnĂ©es pour un systĂšme de transport en commun rĂ©el qui utilise la nouvelle fonctionnalitĂ© et en implĂ©mentant un systĂšme pour la lire et lâafficher.
Extensions¶
Pour permettre aux producteurs dâajouter des informations personnalisĂ©es Ă un flux GTFS Realtime, nous profiterons de la fonctionnalitĂ© dâextensions des tampons de protocole. Les extensions nous permettent de dĂ©finir un espace de noms dans un message Protocol Buffer oĂč les dĂ©veloppeurs tiers peuvent dĂ©finir des champs supplĂ©mentaires sans avoir besoin de modifier la dĂ©finition du proto dâorigine.
Lorsque cela est possible, nous devrions Ă©viter les extensions et plutĂŽt ajouter des champs utiles Ă de nombreuses agences Ă la spĂ©cification principale afin dâĂ©viter la fragmentation et le travail supplĂ©mentaire pour les consommateurs pour prendre en charge diverses extensions de la spĂ©cification. Avant de demander un identifiant dâextension, les producteurs doivent proposer dâajouter le champ Ă la spĂ©cification (voir Ajout de nouveaux champs Ă GTFS Realtime)
Les identifiants dâextension dans la plage 9000-9999 sont rĂ©servĂ©s Ă un usage privĂ© par les producteurs GTFS Realtime. Ces identifiants ne doivent ĂȘtre utilisĂ©s que pour transmettre des informations en interne Ă votre organisation. Les extensions de cette plage ne doivent pas ĂȘtre utilisĂ©es dans les flux publics.
Pour crĂ©er une nouvelle extension, nous attribuerons Ă un producteur le prochain identifiant dâextension disponible, choisi progressivement dans une liste de numĂ©ros commençant Ă 1000 et remontant et documentĂ©e dans la section Registre dâextension ci-dessous.
Ces identifiants dâextension attribuĂ©s correspondent aux identifiants de balise disponibles dans lâespace de noms "extension" pour chaque dĂ©finition de message GTFS Realtime. Maintenant que le dĂ©veloppeur dispose dâun identifiant dâextension attribuĂ©, il utilisera cet identifiant lors de lâextension de tous les messages GTFS Realtime. MĂȘme si le dĂ©veloppeur ne prĂ©voit dâĂ©tendre quâun seul message, lâidentifiant dâextension attribuĂ© sera rĂ©servĂ© Ă TOUS les messages.
Pour un dĂ©veloppeur Ă©tendant la spĂ©cification, au lieu dâajouter un seul champ comme une "string" ou "int32" avec son identifiant dâextension, le modĂšle prĂ©fĂ©rĂ© est de dĂ©finir un nouveau message comme " MyTripDescriptorExtension ", dâĂ©tendre le message GTFS Realtime sous-jacent avec votre nouveau message, puis d'y placer tous vos nouveaux champs. Cela a lâavantage de vous permettre de gĂ©rer les champs de votre message dâextension comme vous le souhaitez, sans avoir besoin de rĂ©server un nouvel identifiant dâextension dans la liste principale.
message MyTripDescriptorExtension {
optional string some_string = 1;
optional bool some_bool = 2;
...
}
extend transit_realtime.TripDescriptor {
optional MyTripDescriptorExtension my_trip_descriptor = YOUR_EXTENSION_ID;
}
Lors de la crĂ©ation dâextensions, les dĂ©veloppeurs doivent suivre le Protocol Buffers Language Guide. Une erreur courante consiste Ă rĂ©utiliser un numĂ©ro de champ dâextension. Dans la section Assigning Field Numbers, le guide linguistique indique :
Chaque champ de la dĂ©finition du message possĂšde un numĂ©ro unique. Ces numĂ©ros sont utilisĂ©s pour identifier vos champs au format binaire du message et ne doivent pas ĂȘtre modifiĂ©s une fois que votre type de message est utilisĂ©.
Par exemple, dans le premier exemple, some_string
sâest vu attribuer le numĂ©ro de champ 1
. Lorsque le développeur ne souhaite plus utiliser some_string
, ou lorsque some_string
a Ă©tĂ© adoptĂ© dans la spĂ©cification officielle GTFS Realtime et que lâextension nâest pas nĂ©cessaire, le dĂ©veloppeur ne peut pas rĂ©utiliser le champ numĂ©ro 1
pour un nouveau champ. Au lieu de cela, le développeur doit rendre le champ obsolÚte et utiliser un nouveau numéro pour le nouveau champ :
message MyTripDescriptorExtension {
optional string some_string = 1 [deprecated=true];
optional bool some_bool = 2;
optional string some_new_string = 3;
...
}
Registre dâextension¶
ID dâextension | DĂ©veloppeur | Contact | DĂ©tails |
---|---|---|---|
1000 | OneBusAway | onebusaway-developers | https://github.com/OneBusAway/onebusaway/wiki/GTFS-Realtime-Resources |
1001 | New York City MTA | mtadeveloperresources | http://mta.info/developers/ |
1002 | transit-realtime-partner-support@google.com | Google Maps Live Transit Updates | |
1003 | OVapi | gtfs-rt sur ovapi.nl | http://gtfs.ovapi.nl |
1004 | Metra | William Ashbaugh w.l.ashbaugh@gmail.com | |
1005 | Metro-North Railroad | John Larsen | |
1006 | realCity | David Varga | http://realcity.io |
1007 | Transport for NSW | timetable@transport.nsw.gov.au | Group discussion |
1008 | SEPTA - Southeastern Pennsylvania Transportation Authority | Gregory Apessos | https://github.com/septadev |
1009 | Swiftly | mike@goswift.ly | Group Discussion |
1010 | IBI Group | Ritesh Warade | GitHub proposal for new timestamps in Service Alerts |
1013 | MITFAHR|DE|ZENTRALE (MFDZ) | Holger Bruch | Group discussion |
9000-9999 | RESERVED - INTERNAL USE ONLY | GTFS Community | Group discussion |