From 765bf0794a92522d13b75ced092ab0cfd8cdbf64 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Thu, 6 Feb 2014 19:13:35 +0100 Subject: add lookahead option --- Changelog | 4 ++++ bin/db-iris | 21 ++++++++++++++++++--- lib/Travel/Status/DE/IRIS.pm | 17 +++++++++++++++-- t/31-result-basics.t | 20 +++++++++++++++++++- 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/Changelog b/Changelog index 80a0c25..f7c5d33 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,7 @@ +git HEAD + + * IRIS / db-iris: Add lookahead option + Travel::Status::DE::IRIS 0.02 - Mon Feb 03 2014 * Fix warnings when encountering unplanned (fchg-only) trains without diff --git a/bin/db-iris b/bin/db-iris index 35ef783..75aec37 100755 --- a/bin/db-iris +++ b/bin/db-iris @@ -17,7 +17,7 @@ use List::MoreUtils qw(none); use Travel::Status::DE::IRIS; use Travel::Status::DE::IRIS::Stations; -my ( $date, $time ); +my ( $date, $time, $lookahead ); my $datetime = DateTime->now( time_zone => 'Europe/Berlin' ); my $realtime = 0; my ( $filter_via, $track_via, $status_via ); @@ -34,6 +34,7 @@ GetOptions( 'c|class=s@' => \@grep_class, 'd|date=s' => \$date, 'h|help' => sub { show_help(0) }, + 'l|lookahead=i' => \$lookahead, 'o|output=s@' => \@edata_pre, 'p|platform=s@' => \@grep_platform, 'r|realtime' => \$realtime, @@ -93,10 +94,14 @@ for my $efield (@edata_pre) { } my $status = Travel::Status::DE::IRIS->new( - datetime => $datetime, - station => $station, + datetime => $datetime, + lookahead => $lookahead, + station => $station, ); if ($track_via) { + + # lookahead should not be used here - the via stop is reached an unknown + # amount of time later $status_via = Travel::Status::DE::IRIS->new( datetime => $datetime, station => $track_via, @@ -378,6 +383,16 @@ Request results for I in dd.mm. oder dd.mm.YYYY format. Note that only slight (a few hours max) deviations from the current time are supported by the IRIS backend, larger ones will not return data. +=item B<-l>, B<--lookahead> I + +Return only those results which are less than I minutes in the future. +Defaults to 240 (4 hours). + +Note that this is only an upper limit, not a guarantee to get every train +with a departure in less than I minutes. This guarantee holds only for +I below 120. However, any non-negative number is accepted for this +option. + =item B<-o>, B<--output> I For each result, output I in addition to the normal time, delay, diff --git a/lib/Travel/Status/DE/IRIS.pm b/lib/Travel/Status/DE/IRIS.pm index 2d4d068..03aa89c 100644 --- a/lib/Travel/Status/DE/IRIS.pm +++ b/lib/Travel/Status/DE/IRIS.pm @@ -30,7 +30,8 @@ sub new { // DateTime->now( time_zone => 'Europe/Berlin' ), iris_base => $opt{iris_base} // 'http://iris.noncd.db.de/iris-tts/timetable', - station => $opt{station}, + lookahead => $opt{lookahead} // ( 4 * 60 ), + station => $opt{station}, user_agent => $ua, }; @@ -68,7 +69,7 @@ sub new { my $d = ( $_->departure // $_->arrival ) ->subtract_datetime( $self->{datetime} ); - not $d->is_negative and $d->in_units('hours') < 4 + not $d->is_negative and $d->in_units('minutes') < $self->{lookahead} } @{ $self->{results} }; @{ $self->{results} } @@ -303,6 +304,18 @@ current date and time. IRIS base url, defaults to C<< http://iris.noncd.db.de/iris-tts/timetable >>. +=item B => I + +Compute only those results which are less than I minutes in the future. +Default: 240 (4 hours). + +Note that the DeutscheBahn IRIS backend only provides schedules up to four +to five hours into the future, and this module only requests data for up to +three hours. So in most cases, setting this to a value above 180 minutes will +have no effect. However, as the IRIS occasionally contains unscheduled +departures or qos messages known far in advance (e.g. 12 hours from now), any +non-negative integer is accepted. + =item B => I Mandatory: Which station to return departures for. Note that this is not a diff --git a/t/31-result-basics.t b/t/31-result-basics.t index 9a76e91..7f9423b 100644 --- a/t/31-result-basics.t +++ b/t/31-result-basics.t @@ -5,7 +5,7 @@ use 5.014; use utf8; use DateTime; -use Test::More tests => 435; +use Test::More tests => 436; use Test::Fatal; use Travel::Status::DE::IRIS; @@ -87,3 +87,21 @@ $status = Travel::Status::DE::IRIS->new( @results = $status->results; is(@results, 0, 'no data available -> empty result list'); + +$status = Travel::Status::DE::IRIS->new( + iris_base => 'file:t/in', + lookahead => 0, + station => 'EE', + datetime => DateTime->new( + year => 2014, + month => 1, + day => 3, + hour => 20, + minute => 1, + time_zone => 'Europe/Berlin' + ) +); + +@results = $status->results; + +is(@results, 0, 'lookahead 0 -> no results'); -- cgit v1.2.3