Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kitinerary for openSUSE:Factory checked in at 2021-11-06 18:14:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kitinerary (Old) and /work/SRC/openSUSE:Factory/.kitinerary.new.1890 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kitinerary" Sat Nov 6 18:14:10 2021 rev:41 rq:929327 version:21.08.3 Changes: -------- --- /work/SRC/openSUSE:Factory/kitinerary/kitinerary.changes 2021-10-13 18:03:02.754988622 +0200 +++ /work/SRC/openSUSE:Factory/.kitinerary.new.1890/kitinerary.changes 2021-11-06 18:15:28.768805322 +0100 @@ -1,0 +2,10 @@ +Tue Nov 2 21:34:03 UTC 2021 - Christophe Giboudeaux <[email protected]> + +- Update to 21.08.3 + * New bugfix release + * For more details please see: + * https://kde.org/announcements/gear/21.08.3/ +- Too many changes since 21.08.2, only listing bugfixes: + * Handle English language M??V ticket date formats (kde#444550) + +------------------------------------------------------------------- Old: ---- kitinerary-21.08.2.tar.xz kitinerary-21.08.2.tar.xz.sig New: ---- kitinerary-21.08.3.tar.xz kitinerary-21.08.3.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kitinerary.spec ++++++ --- /var/tmp/diff_new_pack.JLwrzj/_old 2021-11-06 18:15:30.480806209 +0100 +++ /var/tmp/diff_new_pack.JLwrzj/_new 2021-11-06 18:15:30.480806209 +0100 @@ -18,7 +18,7 @@ %bcond_without lang Name: kitinerary -Version: 21.08.2 +Version: 21.08.3 Release: 0 Summary: Data model and extraction system for travel reservations License: LGPL-2.1-or-later ++++++ kitinerary-21.08.2.tar.xz -> kitinerary-21.08.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/CMakeLists.txt new/kitinerary-21.08.3/CMakeLists.txt --- old/kitinerary-21.08.2/CMakeLists.txt 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/CMakeLists.txt 2021-11-01 16:12:32.000000000 +0100 @@ -3,7 +3,7 @@ # SPDX-License-Identifier: BSD-3-Clause cmake_minimum_required(VERSION 3.16 FATAL_ERROR) -set(PIM_VERSION "5.18.2") +set(PIM_VERSION "5.18.3") project(KItinerary VERSION ${PIM_VERSION}) set(CMAKE_CXX_STANDARD 17) @@ -37,8 +37,8 @@ find_package(SharedMimeInfo 1.3 REQUIRED) endif() -set(KMIME_VERSION "5.18.2") -set(PIM_PKPASS "5.18.2") +set(KMIME_VERSION "5.18.3") +set(PIM_PKPASS "5.18.3") find_package(KF5Mime ${KMIME_VERSION} CONFIG REQUIRED) find_package(KF5CalendarCore ${KF5_MIN_VERSION} CONFIG) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/autotests/pkpassdata/eurowings.json new/kitinerary-21.08.3/autotests/pkpassdata/eurowings.json --- old/kitinerary-21.08.2/autotests/pkpassdata/eurowings.json 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/autotests/pkpassdata/eurowings.json 2021-11-01 16:12:32.000000000 +0100 @@ -58,7 +58,7 @@ "@type": "Person", "familyName": "KRAUSE", "givenName": "VOLKER", - "name": "VOLKER KRAUSE" + "name": "Volker Krause" } } ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/autotests/pkpassdata/lufthansa-with-timezone.json new/kitinerary-21.08.3/autotests/pkpassdata/lufthansa-with-timezone.json --- old/kitinerary-21.08.2/autotests/pkpassdata/lufthansa-with-timezone.json 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/autotests/pkpassdata/lufthansa-with-timezone.json 2021-11-01 16:12:32.000000000 +0100 @@ -58,7 +58,7 @@ "@type": "Person", "familyName": "JOHN", "givenName": "DOE", - "name": "DOE JOHN" + "name": "Doe, John" } } ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/autotests/pkpassdata/lufthansa.json new/kitinerary-21.08.3/autotests/pkpassdata/lufthansa.json --- old/kitinerary-21.08.2/autotests/pkpassdata/lufthansa.json 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/autotests/pkpassdata/lufthansa.json 2021-11-01 16:12:32.000000000 +0100 @@ -59,7 +59,7 @@ "@type": "Person", "familyName": "DOE", "givenName": "JOHN", - "name": "JOHN DOE" + "name": "Doe, John" } } ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/po/ca/kitinerary.po new/kitinerary-21.08.3/po/ca/kitinerary.po --- old/kitinerary-21.08.2/po/ca/kitinerary.po 2021-10-05 07:46:55.000000000 +0200 +++ new/kitinerary-21.08.3/po/ca/kitinerary.po 2021-11-02 01:19:56.000000000 +0100 @@ -4,7 +4,7 @@ # version 3 or later versions approved by the membership of KDE e.V. # # Antoni Bella P??rez <[email protected]>, 2018, 2020, 2021. -# Josep Ma. Ferrer <[email protected]>, 2018, 2019, 2020. +# Josep M. Ferrer <[email protected]>, 2018, 2019, 2020. msgid "" msgstr "" "Project-Id-Version: kitinerary\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/po/ca@valencia/kitinerary.po new/kitinerary-21.08.3/po/ca@valencia/kitinerary.po --- old/kitinerary-21.08.2/po/ca@valencia/kitinerary.po 2021-10-05 07:46:55.000000000 +0200 +++ new/kitinerary-21.08.3/po/ca@valencia/kitinerary.po 2021-11-02 01:19:56.000000000 +0100 @@ -4,7 +4,7 @@ # version 3 or later versions approved by the membership of KDE e.V. # # Antoni Bella P??rez <[email protected]>, 2018, 2020, 2021. -# Josep Ma. Ferrer <[email protected]>, 2018, 2019, 2020. +# Josep M. Ferrer <[email protected]>, 2018, 2019, 2020. msgid "" msgstr "" "Project-Id-Version: kitinerary\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/po/zh_CN/kitinerary.po new/kitinerary-21.08.3/po/zh_CN/kitinerary.po --- old/kitinerary-21.08.2/po/zh_CN/kitinerary.po 2021-10-05 07:46:55.000000000 +0200 +++ new/kitinerary-21.08.3/po/zh_CN/kitinerary.po 2021-11-02 01:19:56.000000000 +0100 @@ -8,7 +8,7 @@ "Project-Id-Version: kdeorg\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2021-05-24 00:17+0000\n" -"PO-Revision-Date: 2021-09-27 13:10\n" +"PO-Revision-Date: 2021-10-29 13:27\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/cli/org.kde.kitinerary-extractor.appdata.xml new/kitinerary-21.08.3/src/cli/org.kde.kitinerary-extractor.appdata.xml --- old/kitinerary-21.08.2/src/cli/org.kde.kitinerary-extractor.appdata.xml 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/cli/org.kde.kitinerary-extractor.appdata.xml 2021-11-01 16:12:32.000000000 +0100 @@ -101,9 +101,9 @@ <binary>kitinerary-extractor</binary> </provides> <releases> + <release version="5.18.3" date="2021-11-04"/> <release version="5.18.2" date="2021-10-07"/> <release version="5.18.1" date="2021-09-02"/> <release version="5.18.0" date="2021-08-12"/> - <release version="5.17.3" date="2021-07-08"/> </releases> </component> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/mergeutil.cpp new/kitinerary-21.08.3/src/lib/mergeutil.cpp --- old/kitinerary-21.08.2/src/lib/mergeutil.cpp 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/mergeutil.cpp 2021-11-01 16:12:32.000000000 +0100 @@ -320,6 +320,8 @@ if (!lhs.departureTime().isValid() && !rhs.departureTime().isValid()) { qCDebug(CompareLog) << "unbound trip" << lhs.departureStation().name() << rhs.departureStation().name() << lhs.arrivalStation().name() << rhs.arrivalStation().name(); return lhs.departureStation().name() == rhs.departureStation().name() && lhs.arrivalStation().name() == rhs.arrivalStation().name(); + } else if (!equalAndPresent(lhs.departureTime(), rhs.departureTime())) { + return false; } if (lhs.trainNumber().isEmpty() || rhs.trainNumber().isEmpty()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/processors/pkpassdocumentprocessor.cpp new/kitinerary-21.08.3/src/lib/processors/pkpassdocumentprocessor.cpp --- old/kitinerary-21.08.2/src/lib/processors/pkpassdocumentprocessor.cpp 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/processors/pkpassdocumentprocessor.cpp 2021-11-01 16:12:32.000000000 +0100 @@ -215,6 +215,12 @@ // "relevantDate" is the best guess for the start time if (pass->relevantDate().isValid() && !event.startDate().isValid()) { event.setStartDate(pass->relevantDate()); + + // "expirationDate" is the best guess for the end time + if (pass->expirationDate().isValid() && pass->relevantDate().date() == pass->expirationDate().date() && + pass->expirationDate() > pass->relevantDate() && !event.endDate().isValid()) { + event.setEndDate(pass->expirationDate()); + } } // location is the best guess for the venue diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/scripts/eurowings-pkpass.js new/kitinerary-21.08.3/src/lib/scripts/eurowings-pkpass.js --- old/kitinerary-21.08.2/src/lib/scripts/eurowings-pkpass.js 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/scripts/eurowings-pkpass.js 2021-11-01 16:12:32.000000000 +0100 @@ -12,5 +12,17 @@ if (pass.field["operatingcarrier"]) res.reservationFor.airline.name = pass.field["operatingcarrier"].value; + const secondary = pass.secondaryFields; + const nameField = secondary.find(item => item.key === "name"); + if (nameField) { + res.underName = JsonLd.newObject("Person"); + res.underName.name = nameField.value; + } + + const boardingGroup = secondary.find(item => item.key === "boardinggroup"); + if (boardingGroup) { + res.boardingGroup = boardingGroup.value; + } + return res; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/scripts/eurowings.js new/kitinerary-21.08.3/src/lib/scripts/eurowings.js --- old/kitinerary-21.08.2/src/lib/scripts/eurowings.js 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/scripts/eurowings.js 2021-11-01 16:12:32.000000000 +0100 @@ -6,11 +6,11 @@ function main(text) { var reservations = new Array(); - var bookingRef = text.match(/Individual reservation code:\s*\*\* ([A-Z0-9]{6})/); + var bookingRef = text.match(/(?:Individual reservation code|Individueller Buchungscode):\s*\*\* ([A-Z0-9]{6})/); var pos = 0; while (true) { - var flightLine = text.substr(pos).match(/Flight: ([0-9]{2}\.[0-9]{2}\.[0-9]{4})\s*\|\s*([A-Z0-9]{2}) ([0-9]{3,4}).*\n/); + var flightLine = text.substr(pos).match(/(?:Flight|Flug): ([0-9]{2}\.[0-9]{2}\.[0-9]{4})\s*\|\s*([A-Z0-9]{2}) ([0-9]{3,4}).*\n/); if (!flightLine) break; var idx = flightLine.index + flightLine[0].length; @@ -21,20 +21,20 @@ res.reservationFor.airline.iataCode = flightLine[2]; - var opByLine = text.substr(pos + idx).match(/^\s*\* operated by (.*)\n/); + var opByLine = text.substr(pos + idx).match(/^\s*\* (?:operated by|durchgef??hrt von) (.*)\n/); if (opByLine) { idx += opByLine.index + opByLine[0].length; res.reservationFor.airline.name = opByLine[1]; } - var depLine = text.substr(pos + idx).match(/Departure:\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/); + var depLine = text.substr(pos + idx).match(/(?:Departure|Abflug):\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/); if (!depLine) break; idx += depLine.index + depLine[0].length; res.reservationFor.departureTime = JsonLd.toDateTime(flightLine[1] + ' ' + depLine[1], "dd.MM.yyyy hh:mm", "en"); res.reservationFor.departureAirport.name = depLine[2]; - var arrLine = text.substr(pos + idx).match(/Arrival:\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/); + var arrLine = text.substr(pos + idx).match(/(?:Arrival|Ankunft):\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/); if (!arrLine) break; idx += arrLine.index + arrLine[0].length; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/scripts/eventbrite.js new/kitinerary-21.08.3/src/lib/scripts/eventbrite.js --- old/kitinerary-21.08.2/src/lib/scripts/eventbrite.js 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/scripts/eventbrite.js 2021-11-01 16:12:32.000000000 +0100 @@ -7,9 +7,19 @@ if (node.result.length != 1) { return; } + var res = node.result[0]; + // location can be a string rather than a place object + if (typeof res.reservationFor.location === "string") { + var place = JsonLd.newObject("Place"); + place.name = res.reservationFor.location; + res.reservationFor.location = place; + } + // streetAddress duplicates city and zip code without proper separation in // about half their emails... - var res = node.result[0]; + if (!res.reservationFor.location.address) { + return res; + } var addr = res.reservationFor.location.address; if (addr.streetAddress.endsWith(addr.addressLocality)) { addr.streetAddress = addr.streetAddress.substr(0, addr.streetAddress.length - addr.addressLocality.length).trim(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/scripts/extractors.qrc new/kitinerary-21.08.3/src/lib/scripts/extractors.qrc --- old/kitinerary-21.08.2/src/lib/scripts/extractors.qrc 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/scripts/extractors.qrc 2021-11-01 16:12:32.000000000 +0100 @@ -58,6 +58,8 @@ <file>feratel-card.js</file> <file>flixbus.json</file> <file>flixbus.js</file> + <file>gomus.json</file> + <file>gomus.js</file> <file>hertz.js</file> <file>hertz.json</file> <file>hotels.com.json</file> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/scripts/gomus.js new/kitinerary-21.08.3/src/lib/scripts/gomus.js --- old/kitinerary-21.08.2/src/lib/scripts/gomus.js 1970-01-01 01:00:00.000000000 +0100 +++ new/kitinerary-21.08.3/src/lib/scripts/gomus.js 2021-11-01 16:12:32.000000000 +0100 @@ -0,0 +1,14 @@ +/* + SPDX-FileCopyrightText: 2021 Volker Krause <[email protected]> + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +function parsePass(pass, node) { + var event = node.result[0]; + event.reservationFor.name = pass.field['event-name'].value; + event.reservationFor.location.name = pass.field['location'].value; + event.reservationFor.location.address = JsonLd.newObject('PostalAddress'); + event.reservationFor.location.address.streetAddress = pass.locations[0].relevantText.match(/ in (.*)\.$/)[1]; + event.reservedTicket.name = pass.description; + return event; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/scripts/gomus.json new/kitinerary-21.08.3/src/lib/scripts/gomus.json --- old/kitinerary-21.08.2/src/lib/scripts/gomus.json 1970-01-01 01:00:00.000000000 +0100 +++ new/kitinerary-21.08.3/src/lib/scripts/gomus.json 2021-11-01 16:12:32.000000000 +0100 @@ -0,0 +1,13 @@ +{ + "filter": [ + { + "field": "passTypeIdentifier", + "match": "pass.de.gomus", + "mimeType": "application/vnd.apple.pkpass", + "scope": "Current" + } + ], + "function": "parsePass", + "mimeType": "application/vnd.apple.pkpass", + "script": "gomus.js" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/scripts/lufthansa-pkpass.js new/kitinerary-21.08.3/src/lib/scripts/lufthansa-pkpass.js --- old/kitinerary-21.08.2/src/lib/scripts/lufthansa-pkpass.js 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/scripts/lufthansa-pkpass.js 2021-11-01 16:12:32.000000000 +0100 @@ -14,5 +14,22 @@ res.reservationFor.departureAirport.name = pass.field["origin"].label; res.reservationFor.arrivalAirport.name = pass.field["destination"].label; + const secondary = pass.secondaryFields; + const passengerName = secondary.find(item => item.key === "passenger"); + if (passengerName) { + res.underName = JsonLd.newObject("Person"); + res.underName.name = passengerName.value; + } + + const back = pass.backFields; + const cancelLink = back.find(item => item.key === "cancel"); + if (cancelLink) { + const cancelUrl = cancelLink.value.match(/https:\/\/mobile.lufthansa.com\/service\/checkin\?[A-Z0-9=&]*[A-Z0-9=&]/i); + if (cancelUrl) { + res.potentialAction = JsonLd.newObject("CancelAction"); + res.potentialAction.url = cancelUrl[1]; + } + } + return res; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/scripts/mav.js new/kitinerary-21.08.3/src/lib/scripts/mav.js --- old/kitinerary-21.08.2/src/lib/scripts/mav.js 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/scripts/mav.js 2021-11-01 16:12:32.000000000 +0100 @@ -8,7 +8,7 @@ const text = pdf.pages[triggerNode.location].text; var idx = 0; while (true) { - var trip = text.substr(idx).match(/(\d{4}\.\d{2}\.\d{2})\. *(\d{2}:\d{2}) *(.*) *-> *(.*) *(\d{2}:\d{2}) *(.*) *(\d)\./); + var trip = text.substr(idx).match(/(\d{2,4}\.\d{2}\.\d{2,4})\. *(\d{2}:\d{2}) *(.*) *-> *(.*) *(\d{2}:\d{2}) *(.*) *(\d)\./); if (!trip) { break; } @@ -16,8 +16,8 @@ var res = JsonLd.newTrainReservation(); res.reservationFor.departureStation.name = trip[3]; res.reservationFor.arrivalStation.name = trip[4]; - res.reservationFor.departureTime = JsonLd.toDateTime(trip[1] + trip[2], "yyyy.MM.ddhh:mm", "hu"); - res.reservationFor.arrivalTime = JsonLd.toDateTime(trip[1] + trip[5], "yyyy.MM.ddhh:mm", "hu"); + res.reservationFor.departureTime = JsonLd.toDateTime(trip[1] + trip[2], ["yyyy.MM.ddhh:mm", "dd.MM.yyyyhh:mm"], "hu"); + res.reservationFor.arrivalTime = JsonLd.toDateTime(trip[1] + trip[5], ["yyyy.MM.ddhh:mm", "dd.MM.yyyyhh:mm"], "hu"); res.reservationFor.trainNumber = trip[6]; res.reservedTicket.ticketedSeat.seatingType = trip[7]; res.reservedTicket.ticketToken = "pdf417bin:" + Barcode.toBase64(triggerNode.content); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-21.08.2/src/lib/sortutil.cpp new/kitinerary-21.08.3/src/lib/sortutil.cpp --- old/kitinerary-21.08.2/src/lib/sortutil.cpp 2021-10-05 00:32:51.000000000 +0200 +++ new/kitinerary-21.08.3/src/lib/sortutil.cpp 2021-11-01 16:12:32.000000000 +0100 @@ -18,6 +18,8 @@ #include <KItinerary/TrainTrip> #include <KItinerary/Visit> +#include "knowledgedb/airportdb.h" + #include <QDateTime> #include <QTimeZone> @@ -61,7 +63,9 @@ if (flight.boardingTime().isValid()) { return flight.boardingTime(); } - return QDateTime(flight.departureDay(), QTime(23, 59, 59)); + QDateTime dt(flight.departureDay(), QTime(23, 59, 59)); + dt.setTimeZone(KnowledgeDb::timezoneForAirport(KnowledgeDb::IataCode{flight.departureAirport().iataCode()})); + return dt; } if (JsonLd::isA<TrainTrip>(elem)) { const auto trip = elem.value<TrainTrip>(); @@ -119,7 +123,9 @@ if (flight.arrivalTime().isValid()) { return flight.arrivalTime(); } - return QDateTime(flight.departureDay(), QTime(23, 59, 59)); + QDateTime dt(flight.departureDay(), QTime(23, 59, 59)); + dt.setTimeZone(KnowledgeDb::timezoneForAirport(KnowledgeDb::IataCode{flight.arrivalAirport().iataCode()})); + return dt; } if (JsonLd::isA<TrainTrip>(elem)) { const auto trip = elem.value<TrainTrip>();
