Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feature] Use PrefixConfiguration in converters #677

Merged
merged 1 commit into from
Jul 28, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
authors = ["Kisio Digital <[email protected]>", "Guillaume Pinot <[email protected]>"]
name = "transit_model"
version = "0.24.0"
version = "0.25.0"
license = "AGPL-3.0-only"
description = "Transit data management"
repository = "https://github.com/CanalTP/transit_model"
Expand Down
25 changes: 15 additions & 10 deletions examples/gtfs_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,23 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>

use serde_json::json;
use std::path::Path;
use transit_model::Result;
use std::collections::BTreeMap;
use transit_model::{
gtfs,
objects::{Contributor, Dataset},
Result,
};

fn run() -> Result<()> {
let configuration: transit_model::gtfs::Configuration<&Path> =
transit_model::gtfs::Configuration {
config_path: None,
prefix: None,
on_demand_transport: false,
on_demand_transport_comment: None,
};
let objects = transit_model::gtfs::read_from_path(".", configuration)?;
let configuration: gtfs::Configuration = gtfs::Configuration {
contributor: Contributor::default(),
dataset: Dataset::default(),
feed_infos: BTreeMap::new(),
prefix_conf: None,
on_demand_transport: false,
on_demand_transport_comment: None,
};
let objects = gtfs::read_from_path(".", configuration)?;
let json_objs = json!(objects);
println!("{:?}", json_objs.to_string());
Ok(())
Expand Down
2 changes: 1 addition & 1 deletion gtfs2netexfr/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ slog-scope = "4.1"
slog-stdlog = "4.0"
slog-term = "2.4"
structopt = "0.3"
transit_model = { version = "0.24", path = "../", features = ["proj"] }
transit_model = { version = "0.25", path = "../", features = ["proj"] }
9 changes: 6 additions & 3 deletions gtfs2netexfr/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use slog::{slog_o, Drain};
use slog_async::OverflowStrategy;
use std::path::PathBuf;
use structopt::StructOpt;
use transit_model::Result;
use transit_model::{read_utils, Result};

#[derive(Debug, StructOpt)]
#[structopt(name = "gtfs2netexfr", about = "Convert a GTFS to NeTEx France.")]
Expand Down Expand Up @@ -96,9 +96,12 @@ fn init_logger() -> slog_scope::GlobalLoggerGuard {
fn run(opt: Opt) -> Result<()> {
info!("Launching gtfs2netexfr...");

let (contributor, dataset, feed_infos) = read_utils::read_config(opt.config)?;
let configuration = transit_model::gtfs::Configuration {
config_path: opt.config,
prefix: None,
contributor,
dataset,
feed_infos,
prefix_conf: None,
on_demand_transport: opt.odt,
on_demand_transport_comment: opt.odt_comment,
};
Expand Down
2 changes: 1 addition & 1 deletion gtfs2ntfs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ slog-scope = "4.1"
slog-stdlog = "4.0"
slog-term = "2.4"
structopt = "0.3"
transit_model = { version = "0.24", path = "../" }
transit_model = { version = "0.25", path = "../" }
14 changes: 11 additions & 3 deletions gtfs2ntfs/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use slog::{slog_o, Drain};
use slog_async::OverflowStrategy;
use std::path::PathBuf;
use structopt::StructOpt;
use transit_model::{transfers::generates_transfers, Result};
use transit_model::{read_utils, transfers::generates_transfers, PrefixConfiguration, Result};

#[derive(Debug, StructOpt)]
#[structopt(name = "gtfs2ntfs", about = "Convert a GTFS to an NTFS.")]
Expand Down Expand Up @@ -99,9 +99,17 @@ fn init_logger() -> slog_scope::GlobalLoggerGuard {
fn run(opt: Opt) -> Result<()> {
info!("Launching gtfs2ntfs...");

let (contributor, dataset, feed_infos) = read_utils::read_config(opt.config)?;
let mut prefix_conf = PrefixConfiguration::default();
if let Some(data_prefix) = opt.prefix {
prefix_conf.set_data_prefix(data_prefix);
}
prefix_conf.set_dataset_id(&dataset.id);
let configuration = transit_model::gtfs::Configuration {
config_path: opt.config,
prefix: opt.prefix,
contributor,
dataset,
feed_infos,
prefix_conf: Some(prefix_conf),
on_demand_transport: opt.odt,
on_demand_transport_comment: opt.odt_comment,
};
Expand Down
2 changes: 1 addition & 1 deletion ntfs2gtfs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ slog-scope = "4.1"
slog-stdlog = "4.0"
slog-term = "2.4"
structopt = "0.3"
transit_model = { version = "0.24", path = "../" }
transit_model = { version = "0.25", path = "../" }
2 changes: 1 addition & 1 deletion ntfs2netexfr/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ slog-scope = "4.1"
slog-stdlog = "4.0"
slog-term = "2.4"
structopt = "0.3"
transit_model = { version = "0.24", path = "../", features = ["proj"] }
transit_model = { version = "0.25", path = "../", features = ["proj"] }
2 changes: 1 addition & 1 deletion ntfs2ntfs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ slog-scope = "4.1"
slog-stdlog = "4.0"
slog-term = "2.4"
structopt = "0.3"
transit_model = { version = "0.24", path = "../" }
transit_model = { version = "0.25", path = "../" }
2 changes: 1 addition & 1 deletion restrict-validity-period/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ slog-scope = "4.1"
slog-stdlog = "4.0"
slog-term = "2.4"
structopt = "0.3"
transit_model = { version = "0.24", path = "../" }
transit_model = { version = "0.25", path = "../" }
55 changes: 27 additions & 28 deletions src/gtfs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,15 @@ use crate::{
calendars::{manage_calendars, write_calendar_dates},
gtfs::read::EquipmentList,
model::{Collections, Model},
objects,
objects::{Availability, StopPoint, StopType, Time},
objects::{self, Availability, Contributor, Dataset, StopPoint, StopType, Time},
read_utils,
utils::*,
validity_period, AddPrefix, PrefixConfiguration, Result,
};
use derivative::Derivative;
use log::info;
use serde::{Deserialize, Serialize};
use std::fmt;
use std::path::Path;
use std::{collections::BTreeMap, fmt, path::Path};
use typed_index_collection::{CollectionWithId, Idx};

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
Expand Down Expand Up @@ -257,33 +255,42 @@ struct Shape {
}

///parameters consolidation
#[derive(Clone)]
pub struct Configuration<P: AsRef<Path>> {
/// path to configuration file
pub config_path: Option<P>,
pub struct Configuration {
/// The Contributor providing the Dataset
pub contributor: Contributor,
/// Describe the Dataset being parsed
pub dataset: Dataset,
/// Additional key-values for the 'feed_infos.txt'
pub feed_infos: BTreeMap<String, String>,
/// used to prefix objects
pub prefix: Option<String>,
pub prefix_conf: Option<PrefixConfiguration>,
/// stop time precision management
pub on_demand_transport: bool,
/// on demand transport comment template
pub on_demand_transport_comment: Option<String>,
}

fn read<H, P: AsRef<Path>>(file_handler: &mut H, configuration: Configuration<P>) -> Result<Model>
fn read<H>(file_handler: &mut H, configuration: Configuration) -> Result<Model>
where
for<'a> &'a mut H: read_utils::FileHandler,
{
let mut collections = Collections::default();
let mut equipments = EquipmentList::default();

manage_calendars(file_handler, &mut collections)?;
let Configuration {
contributor,
mut dataset,
feed_infos,
prefix_conf,
on_demand_transport,
on_demand_transport_comment,
} = configuration;

let (contributor, mut dataset, feed_infos) =
read_utils::read_config(configuration.config_path)?;
manage_calendars(file_handler, &mut collections)?;
validity_period::compute_dataset_validity_period(&mut dataset, &collections.calendars)?;

collections.contributors = CollectionWithId::new(vec![contributor])?;
collections.datasets = CollectionWithId::new(vec![dataset])?;
collections.contributors = CollectionWithId::from(contributor);
collections.datasets = CollectionWithId::from(dataset);
collections.feed_infos = feed_infos;

let (networks, companies) = read::read_agency(file_handler)?;
Expand All @@ -303,17 +310,15 @@ where
read::manage_stop_times(
&mut collections,
file_handler,
configuration.on_demand_transport,
configuration.on_demand_transport_comment,
on_demand_transport,
on_demand_transport_comment,
)?;
read::manage_frequencies(&mut collections, file_handler)?;
read::manage_pathways(&mut collections, file_handler)?;
collections.levels = read_utils::read_opt_collection(file_handler, "levels.txt")?;

//add prefixes
if let Some(prefix) = configuration.prefix {
let mut prefix_conf = PrefixConfiguration::default();
prefix_conf.set_data_prefix(prefix);
if let Some(prefix_conf) = prefix_conf {
collections.prefix(&prefix_conf);
}

Expand All @@ -331,10 +336,7 @@ where
/// The `prefix` argument is a string that will be prepended to every
/// identifiers, allowing to namespace the dataset. By default, no
/// prefix will be added to the identifiers.
pub fn read_from_path<P: AsRef<Path>>(
p: P,
configuration: Configuration<impl AsRef<Path>>,
) -> Result<Model> {
pub fn read_from_path<P: AsRef<Path>>(p: P, configuration: Configuration) -> Result<Model> {
let mut file_handle = read_utils::PathFileHandler::new(p.as_ref().to_path_buf());
read(&mut file_handle, configuration)
}
Expand All @@ -349,10 +351,7 @@ pub fn read_from_path<P: AsRef<Path>>(
/// The `prefix` argument is a string that will be prepended to every
/// identifiers, allowing to namespace the dataset. By default, no
/// prefix will be added to the identifiers.
pub fn read_from_zip<P: AsRef<Path>>(
path: P,
configuration: Configuration<impl AsRef<Path>>,
) -> Result<Model> {
pub fn read_from_zip<P: AsRef<Path>>(path: P, configuration: Configuration) -> Result<Model> {
let mut file_handler = read_utils::ZipHandler::new(path)?;
read(&mut file_handler, configuration)
}
Expand Down
6 changes: 3 additions & 3 deletions tests/fixtures/gtfs2ntfs/full_output/calendar.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
ME:service:1,1,1,1,0,0,0,0,20180101,20180103
ME:service:2,0,0,0,0,1,1,0,20180105,20180106
ME:service:2:+1days,0,0,0,0,0,1,1,20180106,20180107
ME:Defaul:service:1,1,1,1,0,0,0,0,20180101,20180103
ME:Defaul:service:2,0,0,0,0,1,1,0,20180105,20180106
ME:Defaul:service:2:+1days,0,0,0,0,0,1,1,20180106,20180107
4 changes: 2 additions & 2 deletions tests/fixtures/gtfs2ntfs/full_output/comment_links.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
object_id,object_type,comment_id
ME:stoparea:1,stop_area,ME:stop:stoparea:1
ME:stop:11,stop_point,ME:stop:stop:11
ME:stoparea:1,stop_area,ME:Defaul:stop:stoparea:1
ME:stop:11,stop_point,ME:Defaul:stop:stop:11
4 changes: 2 additions & 2 deletions tests/fixtures/gtfs2ntfs/full_output/comments.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
comment_id,comment_type,comment_label,comment_name,comment_url
ME:stop:stoparea:1,information,,stoparea:1_comment,
ME:stop:stop:11,information,,stop:11_comment,
ME:Defaul:stop:stoparea:1,information,,stoparea:1_comment,
ME:Defaul:stop:stop:11,information,,stop:11_comment,
18 changes: 9 additions & 9 deletions tests/fixtures/gtfs2ntfs/full_output/object_codes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ stop_point,ME:stop:53,source,stop:53
stop_point,ME:stop:61,source,stop:61
network,ME:1,source,1
network,ME:2,source,2
trip,ME:trip:3-0,source,trip:3
trip,ME:trip:4-0,source,trip:4
trip,ME:trip:4-1,source,trip:4
trip,ME:trip:4-2,source,trip:4
trip,ME:trip:4-3,source,trip:4
trip,ME:trip:5-0,source,trip:5
trip,ME:trip:5-1,source,trip:5
trip,ME:trip:5-2,source,trip:5
trip,ME:trip:6,source,trip:6
trip,ME:Defaul:trip:3-0,source,trip:3
trip,ME:Defaul:trip:4-0,source,trip:4
trip,ME:Defaul:trip:4-1,source,trip:4
trip,ME:Defaul:trip:4-2,source,trip:4
trip,ME:Defaul:trip:4-3,source,trip:4
trip,ME:Defaul:trip:5-0,source,trip:5
trip,ME:Defaul:trip:5-1,source,trip:5
trip,ME:Defaul:trip:5-2,source,trip:5
trip,ME:Defaul:trip:6,source,trip:6
52 changes: 26 additions & 26 deletions tests/fixtures/gtfs2ntfs/full_output/stop_times.txt
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
stop_id,trip_id,stop_sequence,arrival_time,departure_time,boarding_duration,alighting_duration,pickup_type,drop_off_type,datetime_estimated,local_zone_id,stop_headsign,stop_time_id,stop_time_precision
ME:stop:11,ME:trip:4-0,0,20:00:00,20:00:00,0,0,2,0,1,,,,0
ME:stop:11,ME:trip:4-1,0,20:30:00,20:30:00,0,0,2,0,1,,,,0
ME:stop:11,ME:trip:4-2,0,21:00:00,21:00:00,0,0,2,0,1,,,,0
ME:stop:11,ME:trip:4-3,0,21:30:00,21:30:00,0,0,2,0,1,,,,0
ME:stop:22,ME:trip:4-0,1,20:09:00,20:09:00,0,0,2,0,1,,,,0
ME:stop:22,ME:trip:4-1,1,20:39:00,20:39:00,0,0,2,0,1,,,,0
ME:stop:22,ME:trip:4-2,1,21:09:00,21:09:00,0,0,2,0,1,,,,0
ME:stop:22,ME:trip:4-3,1,21:39:00,21:39:00,0,0,2,0,1,,,,0
ME:stop:31,ME:trip:3-0,0,10:00:00,10:00:00,0,0,0,0,0,,,,0
ME:stop:32,ME:trip:3-0,1,10:13:00,10:15:00,0,0,0,0,0,,,,0
ME:stop:33,ME:trip:3-0,2,10:20:00,10:25:00,0,0,0,0,0,,,,0
ME:stop:33,ME:trip:4-0,2,20:17:00,20:19:00,0,0,2,0,1,,,,0
ME:stop:33,ME:trip:4-1,2,20:47:00,20:49:00,0,0,2,0,1,,,,0
ME:stop:33,ME:trip:4-2,2,21:17:00,21:19:00,0,0,2,0,1,,,,0
ME:stop:33,ME:trip:4-3,2,21:47:00,21:49:00,0,0,2,0,1,,,,0
ME:stop:51,ME:trip:5-0,0,23:00:00,23:00:00,0,0,2,0,0,,,,0
ME:stop:51,ME:trip:5-1,0,23:50:00,23:50:00,0,0,2,0,0,,,,0
ME:stop:51,ME:trip:5-2,0,00:40:00,00:40:00,0,0,2,0,0,,,,0
ME:stop:52,ME:trip:5-0,1,23:47:00,23:47:00,0,0,2,0,0,,,,0
ME:stop:52,ME:trip:5-1,1,24:37:00,24:37:00,0,0,2,0,0,,,,0
ME:stop:52,ME:trip:5-2,1,01:27:00,01:27:00,0,0,2,0,0,,,,0
ME:stop:53,ME:trip:5-0,2,24:17:00,24:17:00,0,0,0,2,0,,,,0
ME:stop:53,ME:trip:5-1,2,25:07:00,25:07:00,0,0,0,2,0,,,,0
ME:stop:53,ME:trip:5-2,2,01:57:00,01:57:00,0,0,0,2,0,,,,0
ME:stop:61,ME:trip:6,0,14:40:00,14:40:00,0,0,2,0,0,,,,0
ME:stop:61,ME:trip:6,1,15:20:00,15:20:00,0,0,2,0,0,,,,0
ME:stop:11,ME:Defaul:trip:4-0,0,20:00:00,20:00:00,0,0,2,0,1,,,,0
ME:stop:11,ME:Defaul:trip:4-1,0,20:30:00,20:30:00,0,0,2,0,1,,,,0
ME:stop:11,ME:Defaul:trip:4-2,0,21:00:00,21:00:00,0,0,2,0,1,,,,0
ME:stop:11,ME:Defaul:trip:4-3,0,21:30:00,21:30:00,0,0,2,0,1,,,,0
ME:stop:22,ME:Defaul:trip:4-0,1,20:09:00,20:09:00,0,0,2,0,1,,,,0
ME:stop:22,ME:Defaul:trip:4-1,1,20:39:00,20:39:00,0,0,2,0,1,,,,0
ME:stop:22,ME:Defaul:trip:4-2,1,21:09:00,21:09:00,0,0,2,0,1,,,,0
ME:stop:22,ME:Defaul:trip:4-3,1,21:39:00,21:39:00,0,0,2,0,1,,,,0
ME:stop:31,ME:Defaul:trip:3-0,0,10:00:00,10:00:00,0,0,0,0,0,,,,0
ME:stop:32,ME:Defaul:trip:3-0,1,10:13:00,10:15:00,0,0,0,0,0,,,,0
ME:stop:33,ME:Defaul:trip:3-0,2,10:20:00,10:25:00,0,0,0,0,0,,,,0
ME:stop:33,ME:Defaul:trip:4-0,2,20:17:00,20:19:00,0,0,2,0,1,,,,0
ME:stop:33,ME:Defaul:trip:4-1,2,20:47:00,20:49:00,0,0,2,0,1,,,,0
ME:stop:33,ME:Defaul:trip:4-2,2,21:17:00,21:19:00,0,0,2,0,1,,,,0
ME:stop:33,ME:Defaul:trip:4-3,2,21:47:00,21:49:00,0,0,2,0,1,,,,0
ME:stop:51,ME:Defaul:trip:5-0,0,23:00:00,23:00:00,0,0,2,0,0,,,,0
ME:stop:51,ME:Defaul:trip:5-1,0,23:50:00,23:50:00,0,0,2,0,0,,,,0
ME:stop:51,ME:Defaul:trip:5-2,0,00:40:00,00:40:00,0,0,2,0,0,,,,0
ME:stop:52,ME:Defaul:trip:5-0,1,23:47:00,23:47:00,0,0,2,0,0,,,,0
ME:stop:52,ME:Defaul:trip:5-1,1,24:37:00,24:37:00,0,0,2,0,0,,,,0
ME:stop:52,ME:Defaul:trip:5-2,1,01:27:00,01:27:00,0,0,2,0,0,,,,0
ME:stop:53,ME:Defaul:trip:5-0,2,24:17:00,24:17:00,0,0,0,2,0,,,,0
ME:stop:53,ME:Defaul:trip:5-1,2,25:07:00,25:07:00,0,0,0,2,0,,,,0
ME:stop:53,ME:Defaul:trip:5-2,2,01:57:00,01:57:00,0,0,0,2,0,,,,0
ME:stop:61,ME:Defaul:trip:6,0,14:40:00,14:40:00,0,0,2,0,0,,,,0
ME:stop:61,ME:Defaul:trip:6,1,15:20:00,15:20:00,0,0,2,0,0,,,,0
4 changes: 2 additions & 2 deletions tests/fixtures/gtfs2ntfs/full_output/trip_properties.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
trip_property_id,wheelchair_accessible,bike_accepted,air_conditioned,visual_announcement,audible_announcement,appropriate_escort,appropriate_signage,school_vehicle_type
ME:1,1,0,0,0,0,0,0,0
ME:2,2,0,0,0,0,0,0,0
ME:Defaul:1,1,0,0,0,0,0,0,0
ME:Defaul:2,2,0,0,0,0,0,0,0
18 changes: 9 additions & 9 deletions tests/fixtures/gtfs2ntfs/full_output/trips.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
trip_id,route_id,physical_mode_id,dataset_id,service_id,trip_headsign,trip_short_name,block_id,company_id,trip_property_id,geometry_id,journey_pattern_id
ME:trip:3-0,ME:route:2,Metro,ME:DefaultDatasetId,ME:service:1,pouet,,,ME:1,ME:1,,
ME:trip:4-0,ME:route:2,Metro,ME:DefaultDatasetId,ME:service:1,pouet,,,ME:1,ME:1,,
ME:trip:4-1,ME:route:2,Metro,ME:DefaultDatasetId,ME:service:1,pouet,,,ME:1,ME:1,,
ME:trip:4-2,ME:route:2,Metro,ME:DefaultDatasetId,ME:service:1,pouet,,,ME:1,ME:1,,
ME:trip:4-3,ME:route:2,Metro,ME:DefaultDatasetId,ME:service:1,pouet,,,ME:1,ME:1,,
ME:trip:5-0,ME:route:3,Metro,ME:DefaultDatasetId,ME:service:2,pouet,,,ME:2,ME:2,,
ME:trip:5-1,ME:route:3,Metro,ME:DefaultDatasetId,ME:service:2,pouet,,,ME:2,ME:2,,
ME:trip:5-2,ME:route:3,Metro,ME:DefaultDatasetId,ME:service:2:+1days,pouet,,,ME:2,ME:2,,
ME:trip:6,ME:route:3,Metro,ME:DefaultDatasetId,ME:service:2,pouet,,,ME:2,,,
ME:Defaul:trip:3-0,ME:route:2,Metro,ME:DefaultDatasetId,ME:Defaul:service:1,pouet,,,ME:1,ME:Defaul:1,,
ME:Defaul:trip:4-0,ME:route:2,Metro,ME:DefaultDatasetId,ME:Defaul:service:1,pouet,,,ME:1,ME:Defaul:1,,
ME:Defaul:trip:4-1,ME:route:2,Metro,ME:DefaultDatasetId,ME:Defaul:service:1,pouet,,,ME:1,ME:Defaul:1,,
ME:Defaul:trip:4-2,ME:route:2,Metro,ME:DefaultDatasetId,ME:Defaul:service:1,pouet,,,ME:1,ME:Defaul:1,,
ME:Defaul:trip:4-3,ME:route:2,Metro,ME:DefaultDatasetId,ME:Defaul:service:1,pouet,,,ME:1,ME:Defaul:1,,
ME:Defaul:trip:5-0,ME:route:3,Metro,ME:DefaultDatasetId,ME:Defaul:service:2,pouet,,,ME:2,ME:Defaul:2,,
ME:Defaul:trip:5-1,ME:route:3,Metro,ME:DefaultDatasetId,ME:Defaul:service:2,pouet,,,ME:2,ME:Defaul:2,,
ME:Defaul:trip:5-2,ME:route:3,Metro,ME:DefaultDatasetId,ME:Defaul:service:2:+1days,pouet,,,ME:2,ME:Defaul:2,,
ME:Defaul:trip:6,ME:route:3,Metro,ME:DefaultDatasetId,ME:Defaul:service:2,pouet,,,ME:2,,,
Loading