55
66import argparse
77import json
8+ import toml
89import metadata
910import os
1011import shutil
@@ -37,10 +38,19 @@ def find_motis_asset(asset_name: str):
3738 atlas = transitland .Atlas .load (Path ("transitland-atlas/" ))
3839 mdb = mobilitydatabase .Database .load ()
3940
40- gtfs_feeds : list [dict ] = []
41- gtfsrt_feeds : list [dict ] = []
41+ feeds = []
42+ regions : list [tuple [str , metadata .Region ]] = []
43+ if len (arguments .regions ) == 0 :
44+ feeds = feed_dir .glob ("*.json" )
45+ else :
46+ for region in arguments .regions :
47+ feeds += feed_dir .glob (f"{ region } .json" )
4248
43- with open ("motis/config.yml" ) as f :
49+ for feed in sorted (feeds ):
50+ region_name = feed .name [: feed .name .rfind ("." )]
51+ regions .append ((region_name , metadata .Region (json .load (open (feed , "r" )))))
52+
53+ with open ("configs/motis/config.yml" ) as f :
4454 yaml = YAML (typ = "rt" )
4555
4656 config = yaml .load (f )
@@ -66,90 +76,110 @@ def find_motis_asset(asset_name: str):
6676 config ["timetable" ]["datasets" ] = {}
6777 config ["gbfs" ]["feeds" ] = {}
6878
69- # TODO backward compatibility, remove this in a few months
70- while "full" in arguments .regions :
71- print ("Ignoring legacy option 'full', this is the default now." )
72- arguments .regions .remove ("full" )
73-
74- feeds = []
75- if len (arguments .regions ) == 0 :
76- feeds = feed_dir .glob ("*.json" )
77- else :
78- for region in arguments .regions :
79- feeds += feed_dir .glob (f"{ region } .json" )
80-
81- for feed in sorted (feeds ):
82- with open (feed , "r" ) as f :
83- parsed = json .load (f )
84- region = metadata .Region (parsed )
85-
86- metadata_filename = feed .name
87- region_name = metadata_filename [: metadata_filename .rfind ("." )]
88-
89- for source in region .sources :
90- schedule_name = f"{ region_name } -{ source .name } "
91-
92- if source .skip :
93- continue
94-
95- match source :
96- case metadata .TransitlandSource ():
97- resolved_source = atlas .source_by_id (source )
98- if not resolved_source :
99- eprint ("Error: Could not resolve" , source .transitland_atlas_id )
100- sys .exit (1 )
101- source = resolved_source
102- case metadata .MobilityDatabaseSource ():
103- resolved_source = mdb .source_by_id (source )
104- if not resolved_source :
105- eprint ("Error: Could not resolve" , source .mdb_id )
106- sys .exit (1 )
107- source = resolved_source
108-
109- match source .spec :
110- case source .spec if source .spec in ["gtfs" , "gtfs-flex" ]:
111- schedule_file = \
112- f"{ region_name } _{ source .name } .gtfs.zip"
113- name = f"{ region_name } -{ source .name } "
114- config ["timetable" ]["datasets" ][name ] = \
115- {
116- "path" : schedule_file ,
117- "extend_calendar" : source .extend_calendar
118- }
119- if source .default_timezone is not None :
120- config ["timetable" ]["datasets" ][name ]["default_timezone" ] = source .default_timezone
121-
122- case "gtfs-rt" if isinstance (source , metadata .UrlSource ):
123- name = f"{ region_name } -{ source .name } "
124- if name not in config ["timetable" ]["datasets" ]:
125- eprint (
126- "Error: The name of a realtime (gtfs-rt) "
127- + "feed needs to match the name of its "
128- + "static base feed defined before the "
129- + "realtime feed. Found nothing "
130- + "belonging to" ,
131- source .name ,
132- )
133- sys .exit (1 )
79+ for (region_name , region ) in regions :
80+ for source in region .sources :
81+ schedule_name = f"{ region_name } -{ source .name } "
82+
83+ if source .skip :
84+ continue
85+
86+ match source :
87+ case metadata .TransitlandSource ():
88+ resolved_source = atlas .source_by_id (source )
89+ if not resolved_source :
90+ eprint ("Error: Could not resolve" , source .transitland_atlas_id )
91+ sys .exit (1 )
92+ source = resolved_source
93+ case metadata .MobilityDatabaseSource ():
94+ resolved_source = mdb .source_by_id (source )
95+ if not resolved_source :
96+ eprint ("Error: Could not resolve" , source .mdb_id )
97+ sys .exit (1 )
98+ source = resolved_source
99+
100+ match source .spec :
101+ case source .spec if source .spec in ["gtfs" , "gtfs-flex" ]:
102+ schedule_file = \
103+ f"{ region_name } _{ source .name } .gtfs.zip"
104+ name = f"{ region_name } -{ source .name } "
105+ config ["timetable" ]["datasets" ][name ] = \
106+ {
107+ "path" : schedule_file ,
108+ "extend_calendar" : source .extend_calendar
109+ }
110+ if source .default_timezone is not None :
111+ config ["timetable" ]["datasets" ][name ]["default_timezone" ] = source .default_timezone
134112
113+ if source .enable_crowd_sourced_realtime :
135114 if "rt" not in config ["timetable" ]["datasets" ][name ]:
136115 config ["timetable" ]["datasets" ][name ]["rt" ] = []
137116
138- rt_feed : dict [str , Any ] = {
139- "url" : source .url
140- }
117+ config ["timetable" ]["datasets" ][name ]["rt" ].append ({"url" : f"http://localhost:5002/{ name } /trip-updates.pb" })
118+
119+ case "gtfs-rt" if isinstance (source , metadata .UrlSource ):
120+ name = f"{ region_name } -{ source .name } "
121+ if name not in config ["timetable" ]["datasets" ]:
122+ eprint (
123+ "Error: The name of a realtime (gtfs-rt) "
124+ + "feed needs to match the name of its "
125+ + "static base feed defined before the "
126+ + "realtime feed. Found nothing "
127+ + "belonging to" ,
128+ source .name ,
129+ )
130+ sys .exit (1 )
131+
132+ if "rt" not in config ["timetable" ]["datasets" ][name ]:
133+ config ["timetable" ]["datasets" ][name ]["rt" ] = []
134+
135+ rt_feed : dict [str , Any ] = {
136+ "url" : source .url
137+ }
141138
142- if source .headers :
143- rt_feed ["headers" ] = source .headers
139+ if source .headers :
140+ rt_feed ["headers" ] = source .headers
144141
145- config ["timetable" ]["datasets" ][name ]["rt" ] \
146- .append (rt_feed )
142+ config ["timetable" ]["datasets" ][name ]["rt" ] \
143+ .append (rt_feed )
147144
148- case "gbfs" if isinstance (source , metadata .UrlSource ):
149- name = f"{ region_name } -{ source .name } "
150- config ["gbfs" ]["feeds" ][name ] = {"url" : source .url }
151- if source .headers :
152- config ["gbfs" ]["feeds" ][name ]["headers" ] = source .headers
145+ case "gbfs" if isinstance (source , metadata .UrlSource ):
146+ name = f"{ region_name } -{ source .name } "
147+ config ["gbfs" ]["feeds" ][name ] = {"url" : source .url }
148+ if source .headers :
149+ config ["gbfs" ]["feeds" ][name ]["headers" ] = source .headers
153150
154151 with open ("out/config.yml" , "w" ) as fo :
155152 yaml .dump (config , fo )
153+
154+ with open ("configs/gps-collector/config.toml" , "r" ) as f :
155+ config = toml .load (f )
156+ config ["feeds" ] = {}
157+
158+ for (region_name , region ) in regions :
159+ for source in region .sources :
160+ if source .enable_crowd_sourced_realtime :
161+ config ["feeds" ][f"{ region_name } -{ source .name } " ] = {}
162+
163+ if not os .path .exists ("out/gps-collector/" ):
164+ os .makedirs ("out/gps-collector/" )
165+
166+ with open ("out/gps-collector/config.toml" , "w" ) as fo :
167+ toml .dump (config , fo )
168+
169+ with open ("configs/delay-tracker/config.toml" , "r" ) as f :
170+ config = toml .load (f )
171+ config ["feeds" ] = {}
172+
173+ for (region_name , region ) in regions :
174+ for source in region .sources :
175+ if source .enable_crowd_sourced_realtime : # This can be extended for vehicle-positions feeds later on
176+ config ["feeds" ][f"{ region_name } -{ source .name } " ] = {
177+ "gtfs_url" : f"../{ region_name } _{ source .name } .gtfs.zip" ,
178+ "gtfsrt_url" : f"http://localhost:5001/gtfsrt/{ region_name } -{ source .name } /vehicle-positions.pb"
179+ }
180+
181+ if not os .path .exists ("out/delay-tracker/" ):
182+ os .makedirs ("out/delay-tracker/" )
183+
184+ with open ("out/delay-tracker/config.toml" , "w" ) as fo :
185+ toml .dump (config , fo )
0 commit comments