Skip to content

Commit 8405a17

Browse files
committed
more common parse fns into lib/util.js
- move parseOperator - extend parseStation
1 parent 7614d9c commit 8405a17

File tree

5 files changed

+68
-21
lines changed

5 files changed

+68
-21
lines changed

lib/journeys.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,10 @@ const {
1515
parseDateTime: formatOutputDate,
1616
normalizeEmpty: m,
1717
parseSparseStation: createStation,
18+
parseOperator: createOperator,
1819
} = require('./util')
1920
const fetch = require('./fetch')
2021

21-
const createOperator = (o) => ({
22-
type: 'operator',
23-
id: o.key,
24-
name: o.label,
25-
url: o.url,
26-
address: o.address
27-
})
28-
2922
const extractLegs = (rawOrigin, rawDestination, rawJourney) => {
3023
let {
3124
departure,

lib/regions.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ const merge = require('lodash/merge')
55
const intoStream = require('into-stream').object
66
const {
77
normalizeEmpty: m,
8+
parseCountry: formatCountry,
89
} = require('./util')
910

1011
const defaults = {
1112
}
1213

13-
const formatCountry = (country) => (country ? { name: m(country.name), code: m(country.alpha2_code) } : null)
14-
1514
const createRegion = (city) => ({
1615
type: 'region',
1716
id: city.id + '',

lib/stations.js

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,16 @@ const intoStream = require('into-stream').object
77
const {
88
normalizeEmpty: m,
99
parseStation,
10+
parseCountry: formatCountry,
1011
} = require('./util')
1112

1213
const defaults = {
1314
}
1415

15-
const formatCountry = (country) => (country ? { name: m(country.name), code: m(country.alpha2_code) } : null)
16-
1716
const createStation = (station) => {
1817
const res = parseStation(station)
1918
return {
20-
...res,
21-
location: {
22-
...res.location,
23-
country: formatCountry(station.country),
24-
zip: station.zip,
25-
},
19+
...parseStation(station),
2620
slug: m(station.slugs),
2721
aliases: (station.aliases ? csv(station.aliases) : null),
2822
regions: [m(station.city_id + '')].filter((x) => !!x),

lib/timetable.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
'use strict'
22

33
const {
4-
parseDateTime,
4+
parseWhen,
55
parseStation,
66
normalizeEmpty,
77
} = require('./util')
88
const fetch = require('./fetch')
99

1010
const parseArrivalDeparture = (dep, station) => {
11+
const cancelled = dep.is_cancelled === true
12+
const {
13+
when,
14+
plannedWhen,
15+
prognosedWhen,
16+
delay,
17+
} = parseWhen({
18+
planned: 'datetime',
19+
// @todo does this route provide realtime data?
20+
}, dep, cancelled)
21+
1122
return {
1223
tripId: dep.trip_uid, // @todo: `dep.ride_id`?
13-
when: parseDateTime(dep.datetime),
14-
cancelled: dep.is_cancelled === true,
24+
when, plannedWhen, prognosedWhen, delay,
25+
cancelled,
1526
direction: dep.direction,
1627
lineName: dep.line_code,
1728
stop: station,

lib/util.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict'
22

33
const moment = require('moment-timezone')
4+
const slug = require('slugg')
45

56
const formatDateTime = (date) => {
67
return moment(date).tz('Europe/Berlin').format('DD.MM.YYYY')
@@ -20,6 +21,14 @@ const parseSparseStation = (s) => ({
2021
name: normalizeEmpty(s.name),
2122
})
2223

24+
const parseCountry = (country) => {
25+
if (!country) return null
26+
return {
27+
name: normalizeEmpty(country.name),
28+
code: normalizeEmpty(country.alpha2_code),
29+
}
30+
}
31+
2332
const parseStation = (s) => ({
2433
...parseSparseStation(s),
2534
location: {
@@ -28,14 +37,55 @@ const parseStation = (s) => ({
2837
latitude: normalizeEmpty(s.coordinates.latitude),
2938
address: normalizeEmpty(s.full_address),
3039
street: normalizeEmpty(s.address),
40+
zip: normalizeEmpty(s.zip),
41+
country: parseCountry(s.country),
42+
notes: normalizeEmpty(s.warnings),
3143
},
3244
importance: Number.isInteger(s.importance_order) ? normalizeEmpty(+s.importance_order) : null,
3345
})
3446

47+
const parseOperator = (o) => ({
48+
type: 'operator',
49+
id: o.key ? o.key : (o.label ? slug(o.label) : null),
50+
name: o.label,
51+
url: normalizeEmpty(o.url),
52+
address: normalizeEmpty(o.address),
53+
})
54+
55+
const parseWhen = (keys, data, cancelled = false) => {
56+
let plannedWhen = keys.planned && data[keys.planned] || null
57+
if (plannedWhen) {
58+
plannedWhen = parseDateTime(plannedWhen)
59+
}
60+
let prognosedWhen = keys.prognosed && data[keys.prognosed] || null
61+
if (prognosedWhen && prognosedWhen.eta) {
62+
prognosedWhen = parseDateTime(prognosedWhen.eta)
63+
}
64+
const delay = plannedWhen && prognosedWhen
65+
? Math.round((new Date(prognosedWhen) - new Date(plannedWhen)) / 1000)
66+
: null
67+
68+
if (cancelled) {
69+
return {
70+
when: null,
71+
plannedWhen,
72+
prognosedWhen,
73+
delay,
74+
}
75+
}
76+
return {
77+
when: prognosedWhen || plannedWhen,
78+
plannedWhen,
79+
delay,
80+
}
81+
}
82+
3583
module.exports = {
3684
formatDateTime,
3785
parseDateTime,
3886
normalizeEmpty,
3987
parseSparseStation,
4088
parseStation,
89+
parseOperator,
90+
parseWhen,
4191
}

0 commit comments

Comments
 (0)