summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2023-12-09 13:10:17 +0000
committerdakkar <dakkar@thenautilus.net>2023-12-09 13:10:17 +0000
commit8bd30555a18dcab02dc95ea8b3701cdc7adbabb6 (patch)
tree4a2351d6111c8231fb04db72391ea2da5d60dbf3 /lib
parentwe can use the new weather api (diff)
downloadHomePanel-8bd30555a18dcab02dc95ea8b3701cdc7adbabb6.tar.gz
HomePanel-8bd30555a18dcab02dc95ea8b3701cdc7adbabb6.tar.bz2
HomePanel-8bd30555a18dcab02dc95ea8b3701cdc7adbabb6.zip
new bus api
Diffstat (limited to 'lib')
-rw-r--r--lib/HomePanel/Driver.pm14
-rw-r--r--lib/Types/DateTime.pm20
-rw-r--r--lib/Types/URI.pm15
-rw-r--r--lib/WebService/ForecastIo.pm4
-rw-r--r--lib/WebService/ForecastIo/DataPoint.pm6
-rw-r--r--lib/WebService/ForecastIo/DataSpan.pm10
-rw-r--r--lib/WebService/TFL/Bus.pm23
-rw-r--r--lib/WebService/TFL/Bus/Fields.pm77
-rw-r--r--lib/WebService/TFL/Bus/Prediction.pm26
-rw-r--r--lib/WebService/TFL/Bus/Request.pm38
-rw-r--r--lib/WebService/TFL/Bus/Response.pm59
-rw-r--r--lib/WebService/TFL/Bus/Response/BaseVersion.pm15
-rw-r--r--lib/WebService/TFL/Bus/Response/FlexibleMessage.pm7
-rw-r--r--lib/WebService/TFL/Bus/Response/Prediction.pm7
-rw-r--r--lib/WebService/TFL/Bus/Response/Stop.pm7
-rw-r--r--lib/WebService/TFL/Bus/Response/URAVersion.pm17
-rw-r--r--lib/WebService/TFL/Bus/ResponseTypeRole.pm38
-rw-r--r--lib/WebService/TFL/Bus/Types.pm14
18 files changed, 67 insertions, 330 deletions
diff --git a/lib/HomePanel/Driver.pm b/lib/HomePanel/Driver.pm
index f5a253d..8b6c755 100644
--- a/lib/HomePanel/Driver.pm
+++ b/lib/HomePanel/Driver.pm
@@ -6,7 +6,6 @@ use IO::Async::Timer::Periodic;
use HomePanel::AsyncUA;
use WebService::ForecastIo;
use WebService::TFL::Bus;
-use WebService::TFL::Bus::Request;
use WebService::TFL::TubeStatus;
use HomePanel::Render;
use Types::Path::Tiny qw(AbsFile AbsPath);
@@ -63,16 +62,7 @@ sub forecast_timer_cb {
);
}
-has bus_request => (
- is => 'ro',
- default => sub {
- WebService::TFL::Bus::Request->new({
- StopPointName => 'Hotspur Road',
- #Towards => 'Islip Manor',
- ReturnList => [qw(StopID StopCode1 VisitNumber TripID VehicleID LineID LineName DirectionID DestinationText DestinationName EstimatedTime)],
-});
- },
-);
+has bus_stop_id => ( is => 'ro', required => 1 );
has bus_response => ( is => 'rw' );
has bus => (
is => 'lazy',
@@ -94,7 +84,7 @@ sub bus_timer_cb {
my ($self) = @_;
$self->bus_response(
$self->bus->request(
- $self->bus_request
+ $self->bus_stop_id
)
);
};
diff --git a/lib/Types/DateTime.pm b/lib/Types/DateTime.pm
deleted file mode 100644
index d13f0d5..0000000
--- a/lib/Types/DateTime.pm
+++ /dev/null
@@ -1,20 +0,0 @@
-package Types::DateTime;
-use strict;
-use warnings;
-use namespace::autoclean;
-use Type::Library -base, -declare => 'DateTimeT';
-use Type::Utils -all;
-use Types::Standard -types;
-
-class_type DateTimeT, { class => 'DateTime' };
-coerce DateTimeT, from Num, via {
- require DateTime;
- DateTime->from_epoch(epoch => $_ );
-};
-coerce DateTimeT, from Str, via {
- require DateTime::Format::ISO8601;
- s{([+-])(\d\d)(\d\d)\z}{$1$2:$3};
- DateTime::Format::ISO8601->new->parse_datetime($_)
-};
-
-1;
diff --git a/lib/Types/URI.pm b/lib/Types/URI.pm
deleted file mode 100644
index 0bb4ae5..0000000
--- a/lib/Types/URI.pm
+++ /dev/null
@@ -1,15 +0,0 @@
-package Types::URI;
-use strict;
-use warnings;
-use namespace::autoclean;
-use Type::Library -base, -declare => 'Uri';
-use Type::Utils -all;
-use Types::Standard -types;
-
-class_type Uri, { class => 'URI' };
-coerce Uri, from Str, via {
- require URI;
- URI->new($_);
-};
-
-1;
diff --git a/lib/WebService/ForecastIo.pm b/lib/WebService/ForecastIo.pm
index 84f9867..6d37519 100644
--- a/lib/WebService/ForecastIo.pm
+++ b/lib/WebService/ForecastIo.pm
@@ -4,7 +4,7 @@ use 5.10.0;
use Types::Standard -types,'slurpy';
use Type::Utils qw(duck_type enum);
use Types::URI 'Uri';
-use Types::DateTime 'DateTimeT';
+use Types::DateTime -all;
use Type::Params;
use WebService::ForecastIo::Response;
use DateTime::TimeZone;
@@ -82,7 +82,7 @@ sub request {
Object, Dict[
latitude => Num,
longitude => Num,
- time => Optional[DateTimeT],
+ time => Optional[DateTimeUTC],
units => Optional[$units_type],
exclude => Optional[ArrayRef[$block_type]],
raw => Optional[Bool],
diff --git a/lib/WebService/ForecastIo/DataPoint.pm b/lib/WebService/ForecastIo/DataPoint.pm
index 47ef659..db9fb77 100644
--- a/lib/WebService/ForecastIo/DataPoint.pm
+++ b/lib/WebService/ForecastIo/DataPoint.pm
@@ -1,7 +1,7 @@
package WebService::ForecastIo::DataPoint;
use Moo;
use namespace::autoclean;
-use Types::DateTime 'DateTimeT';
+use Types::DateTime -all;
use Types::Standard -all;
has [qw( time
@@ -9,8 +9,8 @@ has [qw( time
precipIntensityMaxTime
temperatureMinTime temperatureMaxTime )] => (
is => 'ro',
- isa => DateTimeT,
- coerce => DateTimeT->coercion,
+ isa => DateTimeUTC,
+ coerce => 1,
);
has [qw(summary icon precipType)] => (
diff --git a/lib/WebService/ForecastIo/DataSpan.pm b/lib/WebService/ForecastIo/DataSpan.pm
index 4911442..930f3e5 100644
--- a/lib/WebService/ForecastIo/DataSpan.pm
+++ b/lib/WebService/ForecastIo/DataSpan.pm
@@ -1,20 +1,20 @@
package WebService::ForecastIo::DataSpan;
use Moo;
use namespace::autoclean;
-use Types::DateTime 'DateTimeT';
+use Types::DateTime -all;
has start_time => (
is => 'ro',
- isa => DateTimeT,
- coerce => DateTimeT->coercion,
+ isa => DateTimeUTC,
+ coerce => 1,
required => 1,
);
has stop_time => (
is => 'ro',
writer => '_set_stop_time',
- isa => DateTimeT,
- coerce => DateTimeT->coercion,
+ isa => DateTimeUTC,
+ coerce => 1,
required => 1,
);
diff --git a/lib/WebService/TFL/Bus.pm b/lib/WebService/TFL/Bus.pm
index 3559755..31bd9c3 100644
--- a/lib/WebService/TFL/Bus.pm
+++ b/lib/WebService/TFL/Bus.pm
@@ -1,9 +1,9 @@
package WebService::TFL::Bus;
use Moo;
-use namespace::autoclean;
use Types::URI 'Uri';
use Type::Utils 'duck_type';
use WebService::TFL::Bus::Response;
+use namespace::clean;
has user_agent => (
isa => duck_type(['get']),
@@ -21,21 +21,28 @@ has uri => (
isa => Uri,
is => 'ro',
coerce => Uri->coercion,
- default => 'http://countdown.api.tfl.gov.uk/interfaces/ura/instant_V1',
+ default => 'https://api.tfl.gov.uk/StopPoint/__/Arrivals',
+);
+
+has parser => (
+ is => 'lazy',
+ builder => sub { JSON->new->utf8 },
);
sub request {
- my ($self,$request) = @_;
+ my ($self,$stop_id) = @_;
- my $http_response = $self->user_agent->get(
- $request->request_uri($self->uri)
+ my $uri = $self->uri->clone;
+ $uri->path_segments(
+ map { $_ eq '__' ? $stop_id : $_ } $uri->path_segments
);
+
+ my $http_response = $self->user_agent->get($uri);
if ($http_response->is_success) {
my $json = $http_response->content;
- return WebService::TFL::Bus::Response->new_from_json(
- $request->ReturnList,
- $json
+ return WebService::TFL::Bus::Response->new_from_response(
+ $self->parser->decode($json)
);
}
else {
diff --git a/lib/WebService/TFL/Bus/Fields.pm b/lib/WebService/TFL/Bus/Fields.pm
deleted file mode 100644
index b3d555f..0000000
--- a/lib/WebService/TFL/Bus/Fields.pm
+++ /dev/null
@@ -1,77 +0,0 @@
-package WebService::TFL::Bus::Fields;
-use strict;
-use warnings;
-
-sub stop_return_fields {
- qw(
- StopPointName
- StopID
- StopCode1
- StopCode2
- StopPointType
- Towards
- Bearing
- StopPointIndicator
- StopPointState
- Latitude
- Longitude
- );
-}
-
-sub prediction_return_fields {
- stop_return_fields(),
- qw(
- VisitNumber
- LineID
- LineName
- DirectionID
- DestinationText
- DestinationName
- VehicleID
- TripID
- RegistrationNumber
- EstimatedTime
- ExpireTime
- ),
-}
-
-sub flexible_return_fields {
- stop_return_fields,
- qw(
- MessageUUID
- MessageType
- MessagePriority
- MessageText
- StartTime
- ExpireTime
- ),
-}
-
-sub query_fields {
- qw(
- StopAlso
- Circle
- StopPointName
- StopID
- StopCode1
- StopCode2
- StopPointType
- Towards
- Bearing
- StopPointIndicator
- StopPointState
- VisitNumber
- LineID
- LineName
- DirectionID
- DestinationText
- DestinationName
- VehicleID
- TripID
- RegistrationNumber
- MessageType
- MessagePriority
- );
-}
-
-1;
diff --git a/lib/WebService/TFL/Bus/Prediction.pm b/lib/WebService/TFL/Bus/Prediction.pm
new file mode 100644
index 0000000..670baf7
--- /dev/null
+++ b/lib/WebService/TFL/Bus/Prediction.pm
@@ -0,0 +1,26 @@
+package WebService::TFL::Bus::Prediction;
+use Moo;
+use Types::Standard -all;
+use Types::DateTime -all;
+use namespace::clean;
+
+has [qw(stationName lineName towards)] => (
+ is => 'ro',
+ isa => Str,
+ required => 1,
+);
+
+has 'expectedArrival' => (
+ is => 'ro',
+ isa => DateTimeUTC->plus_coercions( Format['ISO8601'] ),
+ required => 1,
+ coerce => 1,
+);
+
+sub new_from_response {
+ my ($class,$response_data) = @_;
+
+ return $class->new($response_data);
+}
+
+1;
diff --git a/lib/WebService/TFL/Bus/Request.pm b/lib/WebService/TFL/Bus/Request.pm
deleted file mode 100644
index dda6586..0000000
--- a/lib/WebService/TFL/Bus/Request.pm
+++ /dev/null
@@ -1,38 +0,0 @@
-package WebService::TFL::Bus::Request;
-use Moo;
-use Types::Standard -all;
-use WebService::TFL::Bus::Fields;
-use namespace::autoclean;
-
-for my $field (WebService::TFL::Bus::Fields->query_fields) {
- has $field => (
- is => 'rw',
- predicate => "has_$field",
- );
-}
-
-has ReturnList => (
- is => 'rw',
- isa => ArrayRef,
- predicate => 'has_ReturnList',
-);
-
-sub request_uri {
- my ($self,$base_uri) = @_;
-
- my $uri = $base_uri->clone;
- my %form;
- for my $field (WebService::TFL::Bus::Fields->query_fields) {
- my $pred = "has_$field";
- if ($self->$pred) {
- $form{$field} = $self->$field;
- }
- }
- if ($self->has_ReturnList) {
- $form{ReturnList}=join ',',@{$self->ReturnList}
- }
- $uri->query_form(\%form);
- return $uri;
-}
-
-1;
diff --git a/lib/WebService/TFL/Bus/Response.pm b/lib/WebService/TFL/Bus/Response.pm
index e05d49d..6cba172 100644
--- a/lib/WebService/TFL/Bus/Response.pm
+++ b/lib/WebService/TFL/Bus/Response.pm
@@ -1,55 +1,24 @@
package WebService::TFL::Bus::Response;
use Moo;
-use Class::Load 'load_class';
-use Type::Utils 'class_type';
use Types::Standard -all;
-use JSON;
-use namespace::autoclean;
+use WebService::TFL::Bus::Prediction;
+use namespace::clean;
-sub line_class {
- "WebService::TFL::Bus::Response::$_[0]";
-}
-
-my %line_map = (
- 0 => 'Stop',
- 1 => 'Prediction',
- 2 => 'FlexibleMessage',
- 3 => 'BaseVersion',
- 4 => 'URAVersion',
+has predictions => (
+ is => 'ro',
+ isa => ArrayRef[InstanceOf['WebService::TFL::Bus::Prediction']],
);
-for my $field (values %line_map) {
- my $class = line_class($field);
- load_class($class);
- has $field => (
- is => 'ro',
- isa => ArrayRef[class_type { class => $class }],
- );
-}
-
-sub new_from_json {
- my ($class,$return_list,$json) = @_;
-
- my $parser = JSON->new->utf8;
-
- my %return_set;@return_set{@$return_list}=();
- unless (%return_set) {
- @return_set{qw(StopPointName LineName EstimatedTime)}=();
- }
- my %args;
-
- while ($json) {
- my ($array,$consumed) = $parser->decode_prefix($json);
-
- my $array_type = $line_map{$array->[0]};
- my $line_class = line_class($array_type);
- push @{$args{$array_type}},
- $line_class->new_from_array(\%return_set,$array);
-
- substr($json,0,$consumed)='';
- }
+sub new_from_response {
+ my ($class,$response_data) = @_;
- return $class->new(\%args);
+ return $class->new({
+ predictions => [
+ map { WebService::TFL::Bus::Prediction->new_from_response($_) }
+ grep { $_->{'$type'} =~ /\bPrediction\b/ }
+ $response_data->@*
+ ],
+ });
}
1;
diff --git a/lib/WebService/TFL/Bus/Response/BaseVersion.pm b/lib/WebService/TFL/Bus/Response/BaseVersion.pm
deleted file mode 100644
index 07edbcb..0000000
--- a/lib/WebService/TFL/Bus/Response/BaseVersion.pm
+++ /dev/null
@@ -1,15 +0,0 @@
-package WebService::TFL::Bus::Response::BaseVersion;
-use Moo;
-use namespace::autoclean;
-
-has Version => (
- is => 'ro',
-);
-
-sub new_from_array {
- my ($class,$return_set,$array) = @_;
-
- return $class->new({Version => $array->[1]});
-}
-
-1;
diff --git a/lib/WebService/TFL/Bus/Response/FlexibleMessage.pm b/lib/WebService/TFL/Bus/Response/FlexibleMessage.pm
deleted file mode 100644
index 603ef6b..0000000
--- a/lib/WebService/TFL/Bus/Response/FlexibleMessage.pm
+++ /dev/null
@@ -1,7 +0,0 @@
-package WebService::TFL::Bus::Response::FlexibleMessage;
-use Moo;
-use namespace::autoclean;
-use WebService::TFL::Bus::ResponseTypeRole;
-with ResponseTypeRole('flexible');
-
-1;
diff --git a/lib/WebService/TFL/Bus/Response/Prediction.pm b/lib/WebService/TFL/Bus/Response/Prediction.pm
deleted file mode 100644
index 49a4b76..0000000
--- a/lib/WebService/TFL/Bus/Response/Prediction.pm
+++ /dev/null
@@ -1,7 +0,0 @@
-package WebService::TFL::Bus::Response::Prediction;
-use Moo;
-use namespace::autoclean;
-use WebService::TFL::Bus::ResponseTypeRole;
-with ResponseTypeRole('prediction');
-
-1;
diff --git a/lib/WebService/TFL/Bus/Response/Stop.pm b/lib/WebService/TFL/Bus/Response/Stop.pm
deleted file mode 100644
index 30f2f91..0000000
--- a/lib/WebService/TFL/Bus/Response/Stop.pm
+++ /dev/null
@@ -1,7 +0,0 @@
-package WebService::TFL::Bus::Response::Stop;
-use Moo;
-use namespace::autoclean;
-use WebService::TFL::Bus::ResponseTypeRole;
-with ResponseTypeRole('stop');
-
-1;
diff --git a/lib/WebService/TFL/Bus/Response/URAVersion.pm b/lib/WebService/TFL/Bus/Response/URAVersion.pm
deleted file mode 100644
index fc0b41f..0000000
--- a/lib/WebService/TFL/Bus/Response/URAVersion.pm
+++ /dev/null
@@ -1,17 +0,0 @@
-package WebService::TFL::Bus::Response::URAVersion;
-use Moo;
-use namespace::autoclean;
-
-for my $field (qw(Version TimeStamp)) {
- has $field => (
- is => 'ro',
- );
-}
-
-sub new_from_array {
- my ($class,$return_set,$array) = @_;
-
- return $class->new({Version => $array->[1],TimeStamp => $array->[2]});
-}
-
-1;
diff --git a/lib/WebService/TFL/Bus/ResponseTypeRole.pm b/lib/WebService/TFL/Bus/ResponseTypeRole.pm
deleted file mode 100644
index 7f48419..0000000
--- a/lib/WebService/TFL/Bus/ResponseTypeRole.pm
+++ /dev/null
@@ -1,38 +0,0 @@
-package WebService::TFL::Bus::ResponseTypeRole;
-use Package::Variant
- importing => [ 'Moo::Role'],
- subs => [ 'has' ];
-use WebService::TFL::Bus::Fields;
-use WebService::TFL::Bus::Types 'DateTimeMillis';
-
-sub make_variant {
- my ($class,$target_package,$type) = @_;
-
- my $method = $type . '_return_fields';
- my @fields = WebService::TFL::Bus::Fields->$method;
-
- for my $field (@fields) {
- has $field => (
- is => 'ro',
- ( $field =~ /Time$/ ? (
- isa => DateTimeMillis,
- coerce => DateTimeMillis->coercion,
- ) : () ),
- );
- }
-
- install new_from_array => sub {
- my ($class,$return_set,$array) = @_;
-
- my %args;
- my $i=1;
- for my $field (@fields) {
- next unless exists $return_set->{$field};
- $args{$field}=$array->[$i];
- ++$i;
- }
- return $class->new(\%args);
- }
-}
-
-1;
diff --git a/lib/WebService/TFL/Bus/Types.pm b/lib/WebService/TFL/Bus/Types.pm
deleted file mode 100644
index e67fe32..0000000
--- a/lib/WebService/TFL/Bus/Types.pm
+++ /dev/null
@@ -1,14 +0,0 @@
-package WebService::TFL::Bus::Types;
-use Type::Library -base, -declare => 'DateTimeMillis';
-use Types::Standard -all;
-use Type::Utils -all;
-use Types::DateTime 'DateTimeT';
-use namespace::autoclean;
-
-declare DateTimeMillis, as DateTimeT;
-coerce DateTimeMillis, from Num, via {
- require DateTime;
- DateTime->from_epoch( epoch => $_ / 1000 )
-};
-
-1;