Aller au contenu

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

  1. Si la communautĂ© parvient Ă  un consensus (a) sur le fait que le champ proposĂ© semble utile et (b) sur le type de champ (optional vs repeated, string vs int vs bool ), 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 de RESERVED), 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).
  2. 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

  1. 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).
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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 Google 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