Unverified Commit 760af08f authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Stop, Result: Replace date/time string accessors with datetime instances

parent 7a0e702c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ Module::Build->new(
		'perl' => '5.10.1',
		'Carp' => 0,
		'Class::Accessor' => 0,
		'DateTime' => 0,
		'Getopt::Long' => 0,
		'List::Util' => 0,
		'LWP::UserAgent' => 0,
+28 −16
Original line number Diff line number Diff line
@@ -164,22 +164,34 @@ sub format_route {
			say 'BUG';
			next;
		}
		if ( not defined $stop->arr_time ) {
			$output .= sprintf( "        %5s  %40s %s\n",
				$stop->dep_time, $stop->name, $stop->platform, );
		}
		elsif ( not defined $stop->dep_time ) {
			$output .= sprintf( "%5s          %40s %s\n",
				$stop->arr_time, $stop->name, $stop->platform, );
		}
		elsif ( $stop->arr_time eq $stop->dep_time ) {
			$output .= sprintf( "    %5s      %40s %s\n",
				$stop->dep_time, $stop->name, $stop->platform, );
		if ( defined $stop->arr and defined $stop->dep ) {
			if ( $stop->arr->epoch == $stop->dep->epoch ) {
				$output .= sprintf(
					"    %5s      %40s %s\n",
					$stop->arr->strftime('%H:%M'),
					$stop->name, $stop->platform,
				);
			}
			else {
				$output .= sprintf(
					"%5s → %5s  %40s %s\n",
				$stop->arr_time, $stop->dep_time,
					$stop->arr->strftime('%H:%M'),
					$stop->dep->strftime('%H:%M'),
					$stop->name, $stop->platform,
				);
			}
		}
		elsif ( defined $stop->arr ) {
			$output .= sprintf(
				"%5s          %40s %s\n",
				$stop->arr->strftime('%H:%M'),
				$stop->name, $stop->platform,
			);
		}
		elsif ( defined $stop->dep ) {
			$output .= sprintf(
				"        %5s  %40s %s\n",
				$stop->dep->strftime('%H:%M'),
				$stop->name, $stop->platform,
			);
		}
@@ -270,7 +282,7 @@ sub show_results {
		my $dtime    = (
			$relative_times
			? sprintf( '%2d min', $d->countdown )
			: $d->time
			: $d->datetime->strftime('%H:%M')
		);

		if ( $d->platform_db ) {
@@ -301,7 +313,7 @@ sub show_results {
		}
		elsif ($track_via) {
			my $via = first { $_->name =~ m{$filter_via}io } $d->route_post;
			$dtime .= '' . $via->arr_time;
			$dtime .= '' . $via->arr->strftime('%H:%M');
		}
		if ( $d->delay ) {
			$dtime .= ' ' . format_delay( $d->delay, $delay_len );
+82 −60
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ use utf8;
our $VERSION = '1.24';

use Carp qw(confess cluck);
use DateTime;
use Encode qw(encode);
use Travel::Status::DE::EFA::Line;
use Travel::Status::DE::EFA::Result;
@@ -194,33 +195,6 @@ sub place_candidates {
	return;
}

sub sprintf_date {
	my ($e) = @_;

	if ( $e->getAttribute('day') == -1 ) {
		return;
	}

	return sprintf( '%02d.%02d.%d',
		$e->getAttribute('day'),
		$e->getAttribute('month'),
		$e->getAttribute('year'),
	);
}

sub sprintf_time {
	my ($e) = @_;

	if ( $e->getAttribute('minute') == -1 ) {
		return;
	}

	return sprintf( '%02d:%02d',
		$e->getAttribute('hour'),
		$e->getAttribute('minute'),
	);
}

sub check_for_ambiguous {
	my ($self) = @_;

@@ -368,17 +342,45 @@ sub parse_route {
		my @dates = $e->findnodes($xp_routepoint_date);
		my @times = $e->findnodes($xp_routepoint_time);

		my ( $arr, $dep );

		# note that the first stop has an arrival node with an invalid
		# timestamp and the terminal stop has a departure node with an
		# invalid timestamp.  sprintf_{date,time} return undef in these
		# cases.
		# invalid timestamp.

		if ( $dates[0] and $times[0] and $dates[0]->getAttribute('day') != -1 )
		{
			$arr = DateTime->new(
				year      => $dates[0]->getAttribute('year'),
				month     => $dates[0]->getAttribute('month'),
				day       => $dates[0]->getAttribute('day'),
				hour      => $times[0]->getAttribute('hour'),
				minute    => $times[0]->getAttribute('minute'),
				second    => $times[0]->getAttribute('second') // 0,
				time_zone => 'Europe/Berlin'
			);
		}

		if (    $dates[-1]
			and $times[-1]
			and $dates[-1]->getAttribute('day') != -1 )
		{
			$dep = DateTime->new(
				year      => $dates[-1]->getAttribute('year'),
				month     => $dates[-1]->getAttribute('month'),
				day       => $dates[-1]->getAttribute('day'),
				hour      => $times[-1]->getAttribute('hour'),
				minute    => $times[-1]->getAttribute('minute'),
				second    => $times[-1]->getAttribute('second') // 0,
				time_zone => 'Europe/Berlin'
			);
		}

		push(
			@ret,
			Travel::Status::DE::EFA::Stop->new(
				arr_date => scalar sprintf_date( $dates[0] ),
				arr_time => scalar sprintf_time( $times[0] ),
				dep_date => scalar sprintf_date( $dates[-1] ),
				dep_time => scalar sprintf_time( $times[-1] ),
				arr      => $arr,
				dep      => $dep,
				name     => $e->getAttribute('name'),
				name_suf => $e->getAttribute('nameWO'),
				platform => $e->getAttribute('platformName'),
@@ -432,11 +434,31 @@ sub results {
			next;
		}

		my $date = sprintf_date($e_date);
		my $time = sprintf_time($e_time);
		my ( $sched_dt, $real_dt );

		my $rdate = $e_rdate ? sprintf_date($e_rdate) : $date;
		my $rtime = $e_rtime ? sprintf_time($e_rtime) : $time;
		if ( $e_date and $e_time and $e_date->getAttribute('day') != -1 ) {
			$sched_dt = DateTime->new(
				year      => $e_date->getAttribute('year'),
				month     => $e_date->getAttribute('month'),
				day       => $e_date->getAttribute('day'),
				hour      => $e_time->getAttribute('hour'),
				minute    => $e_time->getAttribute('minute'),
				second    => $e_time->getAttribute('second') // 0,
				time_zone => 'Europe/Berlin'
			);
		}

		if ( $e_rdate and $e_rtime and $e_rdate->getAttribute('day') != -1 ) {
			$real_dt = DateTime->new(
				year      => $e_rdate->getAttribute('year'),
				month     => $e_rdate->getAttribute('month'),
				day       => $e_rdate->getAttribute('day'),
				hour      => $e_rtime->getAttribute('hour'),
				minute    => $e_rtime->getAttribute('minute'),
				second    => $e_rtime->getAttribute('second') // 0,
				time_zone => 'Europe/Berlin'
			);
		}

		my $platform      = $e->getAttribute('platform');
		my $platform_name = $e->getAttribute('platformName');
@@ -496,8 +518,7 @@ sub results {
		push(
			@results,
			Travel::Status::DE::EFA::Result->new(
				date          => $rdate,
				time          => $rtime,
				rt_datetime    => $real_dt,
				platform       => $platform,
				platform_db    => $platform_is_db,
				platform_name  => $platform_name,
@@ -512,8 +533,7 @@ sub results {
				countdown      => $countdown,
				info           => $info,
				delay          => $delay,
				sched_date    => $date,
				sched_time    => $time,
				sched_datetime => $sched_dt,
				type           => $type,
				mot            => $mot,
				prev_route     => \@prev_route,
@@ -770,6 +790,8 @@ None.

=item * Class::Accessor(3pm)

=item * DateTime(3pm)

=item * LWP::UserAgent(3pm)

=item * XML::LibXML(3pm)
+17 −18
Original line number Diff line number Diff line
@@ -9,8 +9,9 @@ use parent 'Class::Accessor';
our $VERSION = '1.24';

Travel::Status::DE::EFA::Result->mk_ro_accessors(
	qw(countdown date delay destination is_cancelled info key line lineref
	  mot occupancy operator platform platform_db platform_name sched_date sched_time time train_type train_name train_no type)
	qw(countdown datetime delay destination is_cancelled info key line lineref
	  mot occupancy operator platform platform_db platform_name rt_datetime
	  sched_datetime train_type train_name train_no type)
);

my @mot_mapping = qw{
@@ -31,6 +32,8 @@ sub new {
		$ref->{is_cancelled} = 0;
	}

	$ref->{datetime} = $ref->{rt_datetime} // $ref->{sched_datetime};

	return bless( $ref, $obj );
}

@@ -126,8 +129,8 @@ departure received by Travel::Status::DE::EFA
    for my $departure ($status->results) {
        printf(
            "At %s: %s to %s from platform %d\n",
            $departure->time, $departure->line, $departure->destination,
            $departure->platform
            $departure->datetime->strftime('%H:%M'), $departure->line,
            $departure->destination, $departure->platform
        );
    }

@@ -145,20 +148,19 @@ line number and destination.

=head2 ACCESSORS

"Actual" in the description means that the delay (if available) is already
included in the calculation, "Scheduled" means it isn't.

=over

=item $departure->countdown

Actual time in minutes from now until the tram/bus/train will depart.
Time in minutes from now until the tram/bus/train will depart, including
realtime data if available.

If delay information is available, it is already included.

=item $departure->date
=item $departure->datetime

Actual departure date (DD.MM.YYYY).
DateTime(3pm) object for departure date and time.  Realtime data if available,
schedule data otherwise.

=item $departure->delay

@@ -242,17 +244,14 @@ Each station is a Travel::Status::DE::EFA::Stop(3pm) object.
List of stations the vehicle will pass after this stop.
Each station is a Travel::Status::DE::EFA::Stop(3pm) object.

=item $departure->sched_date

Scheduled departure date (DD.MM.YYYY).

=item $departure->sched_time
=item $departure->rt_datetime

Scheduled departure time (HH:MM).
DateTime(3pm) object holding the departure date and time according to
realtime data. Undef if unknown / unavailable.

=item $departure->time
=item $departure->sched_datetime

Actual departure time (HH:MM).
DateTime(3pm) object holding the scheduled departure date and time.

=item $departure->train_type

+9 −14
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ use parent 'Class::Accessor';
our $VERSION = '1.24';

Travel::Status::DE::EFA::Stop->mk_ro_accessors(
	qw(arr_date arr_time dep_date dep_time name name_suf platform));
	qw(arr dep name name_suf platform));

sub new {
	my ( $obj, %conf ) = @_;
@@ -39,7 +39,8 @@ in a Travel::Status::DE::EFA::Result's route
    for my $stop ($departure->route_post) {
        printf(
            "%s -> %s : %40s %s\n",
            $stop->arr_time // q{     }, $stop->dep_time // q{     },
            $stop->arr ? $stop->arr->strftime('%H:%M') : q{--:--},
            $stop->dep ? $stop->dep->strftime('%H:%M') : q{--:--},
            $stop->name, $stop->platform
        );
    }
@@ -60,21 +61,15 @@ delays or changed platforms are not taken into account.

=over

=item $stop->arr_date
=item $stop->arr

arrival date (DD.MM.YYYY). undef if this is the first scheduled stop.
DateTime(3pm) object holding arrival date and time. undef if this is the
first scheduled stop.

=item $stop->arr_time
=item $stop->dep

arrival time (HH:MM). undef if this is the first scheduled stop.

=item $stop->dep_date

departure date (DD.MM.YYYY). undef if this is the final scehduled stop.

=item $stop->dep_time

departure time (HH:MM). undef if this is the final scehduled stop.
DateTime(3pm) object holding departure date and time. undef if this is the
final scheduled stop.

=item $stop->name

Loading