From ed86ad0b5671018e2c6d3e86fdbf415ce0d29ab8 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Sat, 27 Nov 2021 23:41:40 +0100 Subject: [PATCH] =?UTF-8?q?add=20KVB=20profile=20=F0=9F=93=9D=E2=9C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes #250 --- p/kvb/base.json | 15 +++++ p/kvb/example.js | 47 ++++++++++++++ p/kvb/index.js | 63 +++++++++++++++++++ p/kvb/readme.md | 15 +++++ p/readme.md | 1 + .../fixtures/1943a180fe03ac3865c9a8359c3e6668 | 1 + .../1943a180fe03ac3865c9a8359c3e6668.headers | 39 ++++++++++++ test/e2e/kvb.js | 35 +++++++++++ tools/pull-profile-base-data.sh | 1 + tools/transport-apis | 2 +- 10 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 p/kvb/base.json create mode 100644 p/kvb/example.js create mode 100644 p/kvb/index.js create mode 100644 p/kvb/readme.md create mode 100644 test/e2e/fixtures/1943a180fe03ac3865c9a8359c3e6668 create mode 100644 test/e2e/fixtures/1943a180fe03ac3865c9a8359c3e6668.headers create mode 100644 test/e2e/kvb.js diff --git a/p/kvb/base.json b/p/kvb/base.json new file mode 100644 index 00000000..01fab355 --- /dev/null +++ b/p/kvb/base.json @@ -0,0 +1,15 @@ +{ + "auth": { + "type": "AID", + "aid": "Rt6foY5zcTTRXMQs" + }, + "client": { + "type": "WEB", + "id": "HAFAS", + "name": "webapp", + "l": "vs_webapp" + }, + "endpoint": "https://auskunft.kvb.koeln/gate", + "defaultLanguage": "de", + "ver": "1.42" +} diff --git a/p/kvb/example.js b/p/kvb/example.js new file mode 100644 index 00000000..ecdfe5b3 --- /dev/null +++ b/p/kvb/example.js @@ -0,0 +1,47 @@ +'use strict' + +const createClient = require('../..') +const kvbProfile = require('.') + +const client = createClient(kvbProfile, 'hafas-client example') + +const heumarkt = '900000001' +const poststr = '900000003' + +// client.journeys(heumarkt, poststr, { +// results: 1, stopovers: true, +// }) +// .then(({journeys}) => { +// const [journey] = journeys +// return client.refreshJourney(journey.refreshToken, {stopovers: true, remarks: true}) +// }) +// .then(({journeys}) => { +// const [journey] = journeys +// const leg = journey.legs[0] +// return client.trip(leg.tripId, leg.line.name, {polyline: true}) +// }) + +// client.departures(heumarkt, {duration: 1}) +// client.arrivals(heumarkt, {duration: 10, linesOfStops: true}) + +client.locations('heumarkt', {results: 3}) +// client.stop(heumarkt, {linesOfStops: true}) +// client.nearby({ +// type: 'location', +// id: '991023531', +// address: 'An den Dominikanern 27', +// latitude: 50.942454, longitude: 6.954064, +// }, {distance: 500}) +// client.reachableFrom({ +// type: 'location', +// id: '991023531', +// address: 'An den Dominikanern 27', +// latitude: 50.942454, longitude: 6.954064, +// }, { +// maxDuration: 15, +// }) + +.then((data) => { + console.log(require('util').inspect(data, {depth: null, colors: true})) +}) +.catch(console.error) diff --git a/p/kvb/index.js b/p/kvb/index.js new file mode 100644 index 00000000..69ee5b72 --- /dev/null +++ b/p/kvb/index.js @@ -0,0 +1,63 @@ +'use strict' + +const baseProfile = require('./base.json') + +const products = [{ + id: 'stadtbahn', + mode: 'train', + bitmasks: [2], + name: 'Stadtbahn', + short: 'Stadtbahn', + default: true, +}, { + id: 'bus', + mode: 'bus', + bitmasks: [8], + name: 'Bus', + short: 'Bus', + default: true, +}, { + id: 'taxibus', + mode: 'bus', + bitmasks: [256], + name: 'Taxibus', + short: 'Taxibus', + default: true, +}, { + id: 's-bahn', + mode: 'train', + bitmasks: [1], + name: 'S-Bahn', + short: 'S', + default: true, +}, { + id: 'regionalverkehr', + mode: 'train', + bitmasks: [46], + name: 'Regionalverkehr', + short: 'Regionalverkehr', + default: true, +}, { + id: 'fernverkehr', + mode: 'train', + bitmasks: [32], + name: 'Fernverkehr', + short: 'Fernverkehr', + default: true, +}] + +const vosProfile = { + ...baseProfile, + locale: 'de-DE', + timezone: 'Europe/Berlin', + + products, + + departuresGetPasslist: false, + departuresStbFltrEquiv: false, + refreshJourneyUseOutReconL: true, + trip: true, + reachableFrom: true, +} + +module.exports = vosProfile diff --git a/p/kvb/readme.md b/p/kvb/readme.md new file mode 100644 index 00000000..fbfd6aa2 --- /dev/null +++ b/p/kvb/readme.md @@ -0,0 +1,15 @@ +# KVB profile for `hafas-client` + +[*Kölner Verkehrs-Betriebe (KVB)*](https://de.wikipedia.org/wiki/Kölner_Verkehrs-Betriebe) is the local transport provider of [Cologne](https://en.wikipedia.org/wiki/Cologne). This profile adds *KVB* support to `hafas-client`. + +## Usage + +```js +const createClient = require('hafas-client') +const kvbProfile = require('hafas-client/p/kvb') + +// create a client with KVB profile +const client = createClient(kvbProfile, 'my-awesome-program') +``` + +Check out the [code examples](example.js). diff --git a/p/readme.md b/p/readme.md index dbc7d732..f5145257 100644 --- a/p/readme.md +++ b/p/readme.md @@ -38,6 +38,7 @@ HAFAS endpoint | wrapper library | docs | example code | profile name [Verkehrsverbund Mittelthüringen (VMT)](https://en.wikipedia.org/wiki/Verkehrsverbund_Mittelthüringen) | - | [docs](vmt/readme.md) | [example](vmt/example.js) | [`vmt`](vmt) [Verkehrsgemeinschaft Osnabrück (VOS)](https://de.wikipedia.org/wiki/Verkehrsgemeinschaft_Osnabrück) | - | [docs](vos/readme.md) | [example](vos/example.js) | [`vos`](vos) [Aachener Verkehrsverbund (AVV)](https://de.wikipedia.org/wiki/Verkehrsgemeinschaft_Osnabrück) | - | [docs](avv/readme.md) | [example](avv/example.js) | [`avv`](avv) +[Kölner Verkehrs-Betriebe (KVB)](https://de.wikipedia.org/wiki/Kölner_Verkehrs-Betriebe) | - | [docs](kvb/readme.md) | [example](kvb/example.js) | [`kvb`](kvb) [Rejseplanen in Denmark](http://www.rejseplanen.dk) | - | [docs](rejseplanen/readme.md) | [example](rejseplanen/example.js) | [`rejseplanen`](rejseplanen) [Innsbrucker Verkehrsbetriebe (IVB)](https://de.wikipedia.org/wiki/Innsbrucker_Verkehrsbetriebe_und_Stubaitalbahn) | - | [docs](ivb/readme.md) | [example](ivb/example.js) | [`ivb`](ivb) [Oberösterreichischer Verkehrsverbund (OÖVV)](https://de.wikipedia.org/wiki/Oberösterreichischer_Verkehrsverbund) | - | [docs](ooevv/readme.md) | [example](ooevv/example.js) | [`ooevv`](ooevv) diff --git a/test/e2e/fixtures/1943a180fe03ac3865c9a8359c3e6668 b/test/e2e/fixtures/1943a180fe03ac3865c9a8359c3e6668 new file mode 100644 index 00000000..9bb2c992 --- /dev/null +++ b/test/e2e/fixtures/1943a180fe03ac3865c9a8359c3e6668 @@ -0,0 +1 @@ +{"graph":{"id":"standard","index":0},"subGraph":{"id":"global","index":0},"svcResL":[{"meth":"LocMatch","res":{"common":{"graphL":[{"id":"standard","index":0}],"icoL":[{"bg":{"b":255,"g":255,"r":255},"brd":{"b":0,"g":0,"r":0},"fg":{"b":0,"g":0,"r":0},"res":"prod_sub"},{"bg":{"b":255,"g":255,"r":255},"brd":{"b":0,"g":0,"r":0},"fg":{"b":0,"g":0,"r":0},"res":"prod_bus"},{"res":"loc_addr"}],"prodL":[{"prodCtx":{"lineId":"de:vrs:1"},"cls":2,"icoX":0,"name":"1","nameS":"1"},{"prodCtx":{"lineId":"de:vrs:5"},"cls":2,"icoX":0,"name":"5","nameS":"5"},{"prodCtx":{"lineId":"de:vrs:7"},"cls":2,"icoX":0,"name":"7","nameS":"7"},{"prodCtx":{"lineId":"de:vrs:9"},"cls":2,"icoX":0,"name":"9","nameS":"9"},{"prodCtx":{"lineId":"E"},"cls":2,"icoX":0,"name":"E","nameS":"E"},{"prodCtx":{"lineId":"de:vrs:106"},"cls":8,"icoX":1,"name":"106","nameS":"106"},{"prodCtx":{"lineId":"de:vrs:132"},"cls":8,"icoX":1,"name":"132","nameS":"132"},{"prodCtx":{"lineId":"de:vrs:133"},"cls":8,"icoX":1,"name":"133","nameS":"133"},{"prodCtx":{"lineId":"WUPSI__250"},"cls":8,"icoX":1,"name":"250","nameS":"250"},{"prodCtx":{"lineId":"RVK_WK_260"},"cls":8,"icoX":1,"name":"260","nameS":"260"},{"prodCtx":{"lineId":"REVG___978"},"cls":8,"icoX":1,"name":"978","nameS":"978"},{"prodCtx":{"lineId":"RVK_WK_N26"},"cls":8,"icoX":1,"name":"N26","nameS":"N26"},{"prodCtx":{"lineId":"de:vrs:151"},"cls":8,"icoX":1,"name":"151","nameS":"151"},{"prodCtx":{"lineId":"de:vrs:152"},"cls":8,"icoX":1,"name":"152","nameS":"152"},{"prodCtx":{"lineId":"de:vrs:165"},"cls":8,"icoX":1,"name":"165","nameS":"165"},{"prodCtx":{"lineId":"de:vrs:3"},"cls":2,"icoX":0,"name":"3","nameS":"3"},{"prodCtx":{"lineId":"de:vrs:4"},"cls":2,"icoX":0,"name":"4","nameS":"4"},{"prodCtx":{"lineId":"de:vrs:16"},"cls":2,"icoX":0,"name":"16","nameS":"16"},{"prodCtx":{"lineId":"de:vrs:18"},"cls":2,"icoX":0,"name":"18","nameS":"18"},{"prodCtx":{"lineId":"de:vrs:136"},"cls":8,"icoX":1,"name":"136","nameS":"136"},{"prodCtx":{"lineId":"de:vrs:146"},"cls":8,"icoX":1,"name":"146","nameS":"146"}],"subGraphL":[{"id":"Koel_619","index":1159,"name":"Köln Heumarkt"},{"id":"Koel_289","index":294,"name":"Köln Eil Heumarer Str."},{"id":"Koel_620","index":1160,"name":"Köln Neumarkt"}],"viewL":[{"id":"standard","index":0,"type":"WGS84"},{"id":"Koel_619","index":1,"type":"WGS84"},{"id":"Koel_289","index":1,"type":"WGS84"},{"id":"Koel_620","index":1,"type":"WGS84"}]},"match":{"locL":[{"crd":{"viewAlternatives":[{"subGraphNodes":[{"viewNodes":[{"viewX":0},{"viewX":1}],"subGraphX":0}],"graphX":0}],"floor":0,"x":6959269,"y":50935712},"gidL":["A×de:05315:11110"],"pRefL":[0,1,2,3,4,5,6,7,8,9,10,11],"TZOffset":0,"chgTime":"000000","extId":"900000001","icoX":0,"isMainMast":true,"lid":"A=1@O=Köln Heumarkt@X=6959269@Y=50935712@U=1@L=900000001@B=1@p=1637929092@","meta":true,"name":"Köln Heumarkt","pCls":10,"state":"F","type":"S","wt":22316},{"crd":{"x":6960150,"y":50934759},"icoX":2,"lid":"A=2@O=Heumarkt@X=6960150@Y=50934759@U=100@b=991023566@B=1@p=1606316333@","name":"Heumarkt","state":"M","type":"A"},{"crd":{"x":6960518,"y":50934651},"icoX":2,"lid":"A=2@O=Heumarkt, 50667@X=6960518@Y=50934651@U=100@b=991067738@B=1@p=1606316333@","name":"Heumarkt, 50667","state":"M","type":"A"},{"crd":{"viewAlternatives":[{"subGraphNodes":[{"viewNodes":[{"viewX":0},{"viewX":2}],"subGraphX":1}],"graphX":0}],"floor":0,"x":7077891,"y":50897211},"gidL":["A×de:05315:17265"],"pRefL":[12,13,14],"TZOffset":0,"chgTime":"000000","extId":"900000460","icoX":1,"isMainMast":true,"lid":"A=1@O=Köln Eil Heumarer Str.@X=7077891@Y=50897211@U=1@L=900000460@B=1@p=1637929092@","meta":true,"name":"Köln Eil Heumarer Str.","pCls":8,"state":"F","type":"S","wt":2019},{"crd":{"viewAlternatives":[{"subGraphNodes":[{"viewNodes":[{"viewX":0},{"viewX":3}],"subGraphX":2}],"graphX":0}],"floor":0,"x":6948329,"y":50935667},"gidL":["A×de:05315:11111"],"pRefL":[0,15,16,2,3,17,18,4,19,20],"TZOffset":0,"chgTime":"000000","extId":"900000002","icoX":0,"isMainMast":true,"lid":"A=1@O=Köln Neumarkt@X=6948329@Y=50935667@U=1@L=900000002@B=1@p=1637929092@","meta":true,"name":"Köln Neumarkt","pCls":10,"state":"F","type":"S","wt":22316}],"field":"S","state":"L"}},"err":"OK"}],"view":{"id":"standard","index":0,"type":"WGS84"},"err":"OK","id":"m5wejiqikcy3wiwg","lang":"deu","ver":"1.42"} \ No newline at end of file diff --git a/test/e2e/fixtures/1943a180fe03ac3865c9a8359c3e6668.headers b/test/e2e/fixtures/1943a180fe03ac3865c9a8359c3e6668.headers new file mode 100644 index 00000000..4ebcf8c7 --- /dev/null +++ b/test/e2e/fixtures/1943a180fe03ac3865c9a8359c3e6668.headers @@ -0,0 +1,39 @@ +{ + "statusCode": 200, + "headers": { + "date": "Sat, 27 Nov 2021 22:46:26 GMT", + "server": "Apache/2.4.38 (Debian) OpenSSL/1.1.1d", + "content-type": "application/json", + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET,POST,OPTIONS", + "access-control-allow-origin": "*", + "backend-group": "default", + "connection": "close", + "transfer-encoding": "chunked" + }, + "url": "https://auskunft.kvb.koeln/gate", + "time": 195, + "request": { + "method": "POST", + "headers": { + "Content-Type": [ + "application/json" + ], + "Accept-Encoding": [ + "gzip, br, deflate" + ], + "Accept": [ + "application/json" + ], + "user-agent": [ + "public-transpo912a53de656frt/hafas-client:test" + ], + "Content-Length": [ + "279" + ], + "Connection": [ + "close" + ] + } + } +} \ No newline at end of file diff --git a/test/e2e/kvb.js b/test/e2e/kvb.js new file mode 100644 index 00000000..625afadb --- /dev/null +++ b/test/e2e/kvb.js @@ -0,0 +1,35 @@ +'use strict' + +const tap = require('tap') + +const {createWhen} = require('./lib/util') +const createClient = require('../..') +const kvbProfile = require('../../p/kvb') +const createValidate = require('./lib/validate-fptf-with') + +const when = createWhen(kvbProfile.timezone, kvbProfile.locale) +const cfg = { + when, + stationCoordsOptional: false, + products: kvbProfile.products, + maxLatitude: 51.6479, + maxLongitude: 7.8333, + minLatitude: 50.3253, + minLongitude: 6.2320, +} +const validate = createValidate(cfg) + +const client = createClient(kvbProfile, 'public-transport/hafas-client:test') + +const heumarkt = '900000001' + +tap.test('locations named "heumarkt"', async (t) => { + const locations = await client.locations('heumarkt') + + validate(t, locations, 'locations', 'locations') + t.ok(locations.some((l) => { + return l.station && l.station.id === heumarkt || l.id === heumarkt + }), 'Heumarkt not found') + + t.end() +}) diff --git a/tools/pull-profile-base-data.sh b/tools/pull-profile-base-data.sh index 47ca65d7..f6ba5534 100755 --- a/tools/pull-profile-base-data.sh +++ b/tools/pull-profile-base-data.sh @@ -71,3 +71,4 @@ node -p "$query" "$src/ch/bls-hafas-mgate.json" >../p/bls/base.json node -p "$query" "$src/ch/tpg-hafas-mgate.json" >../p/tpg/base.json node -p "$query" "$src/ch/zvv-hafas-mgate.json" >../p/zvv/base.json node -p "$query" "$src/us/dart-hafas-mgate.json" >../p/dart/base.json +node -p "$query" "$src/de/kvb-hafas-mgate.json" >../p/kvb/base.json diff --git a/tools/transport-apis b/tools/transport-apis index 023caad7..fcb5e2f9 160000 --- a/tools/transport-apis +++ b/tools/transport-apis @@ -1 +1 @@ -Subproject commit 023caad70f42e808189a6d3e1b6fcaef47ce870c +Subproject commit fcb5e2f94abc00e718b44e487de11ebe39f6b89f