summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2023-12-09 14:02:41 +0000
committerdakkar <dakkar@thenautilus.net>2023-12-09 14:02:41 +0000
commit4a46c1031aa69e7ba0e309ba9692250f14dba6b8 (patch)
treeb0e5b82f1f763102fb3094904a002d158cc90d7f /lib
parentnew tube api (diff)
downloadHomePanel-4a46c1031aa69e7ba0e309ba9692250f14dba6b8.tar.gz
HomePanel-4a46c1031aa69e7ba0e309ba9692250f14dba6b8.tar.bz2
HomePanel-4a46c1031aa69e7ba0e309ba9692250f14dba6b8.zip
actually async
Diffstat (limited to 'lib')
-rw-r--r--lib/HomePanel/Driver.pm62
-rw-r--r--lib/HomePanel/Render.pm1
-rw-r--r--lib/WebService/ForecastIo.pm36
-rw-r--r--lib/WebService/TFL/Bus.pm20
-rw-r--r--lib/WebService/TFL/TubeStatus.pm20
5 files changed, 61 insertions, 78 deletions
diff --git a/lib/HomePanel/Driver.pm b/lib/HomePanel/Driver.pm
index 8b6c755..ce3026a 100644
--- a/lib/HomePanel/Driver.pm
+++ b/lib/HomePanel/Driver.pm
@@ -1,38 +1,39 @@
package HomePanel::Driver;
use Moo;
-use 5.10.0;
+use v5.36;
use IO::Async::Loop;
use IO::Async::Timer::Periodic;
-use HomePanel::AsyncUA;
+use Net::Async::HTTP;
+use Future::AsyncAwait;
use WebService::ForecastIo;
use WebService::TFL::Bus;
use WebService::TFL::TubeStatus;
use HomePanel::Render;
use Types::Path::Tiny qw(AbsFile AbsPath);
use Try::Tiny;
-#use Devel::Cycle;
use curry::weak;
-use namespace::autoclean;
+use namespace::clean;
+use Data::Dumper;
has loop => ( is => 'lazy' );
sub _build_loop { IO::Async::Loop->new() }
has user_agent => ( is => 'lazy' );
sub _build_user_agent {
- #HomePanel::AsyncUA->new({loop=>$_[0]->loop});
- require LWP::UserAgent;
- return LWP::UserAgent->new(timeout=>20);
+ my ($self) = @_;
+ my $ua = Net::Async::HTTP->new(
+ max_connections_per_host => 1,
+ stall_timeout => 10,
+ decode_content => 1,
+ );
+ $self->loop->add($ua);
+ return $ua;
}
-has forecast_request => (
+has [qw(forecast_latitude forecast_longitude)] => (
is => 'ro',
- default => sub { +{
- latitude => 51.54,
- longitude => -0.37,
- exclude => ['flags','sources'],
- }; },
+ required => 1,
);
-has forecast_response => ( is => 'rw' );
has forecast_key => (
is => 'ro',
required => 1,
@@ -45,6 +46,7 @@ sub _build_forecast {
user_agent => $self->user_agent,
});
}
+has forecast_response => ( is => 'rw' );
has forecast_timer => ( is => 'lazy' );
sub _build_forecast_timer {
my ($self) = @_;
@@ -55,15 +57,15 @@ sub _build_forecast_timer {
}
sub forecast_timer_cb {
my ($self) = @_;
- $self->forecast_response(
- $self->forecast->request(
- $self->forecast_request
- )
- );
+
+ $self->forecast->request({
+ latitude => $self->forecast_latitude,
+ longitude => $self->forecast_longitude,
+ exclude => ['flags','sources'],
+ })->then(sub { $self->forecast_response(shift) })->retain;
}
has bus_stop_id => ( is => 'ro', required => 1 );
-has bus_response => ( is => 'rw' );
has bus => (
is => 'lazy',
);
@@ -72,6 +74,7 @@ sub _build_bus {
user_agent => $_[0]->user_agent,
});
}
+has bus_response => ( is => 'rw' );
has bus_timer => ( is => 'lazy' );
sub _build_bus_timer {
my ($self) = @_;
@@ -82,11 +85,10 @@ sub _build_bus_timer {
}
sub bus_timer_cb {
my ($self) = @_;
- $self->bus_response(
- $self->bus->request(
- $self->bus_stop_id
- )
- );
+
+ $self->bus->request(
+ $self->bus_stop_id
+ )->then(sub { $self->bus_response(shift) })->retain;
};
has tube => (
@@ -108,9 +110,9 @@ sub _build_tube_timer {
}
sub tube_timer_cb {
my ($self) = @_;
- $self->tube_response(
- $self->tube->request()
- );
+
+ $self->tube->request(
+ )->then(sub { $self->tube_response(shift) })->retain;
}
has writer_timer => ( is => 'lazy' );
@@ -160,6 +162,8 @@ sub _build_render {
sub write_page {
my ($self) = @_;
+ return unless $self->forecast_response;
+
my $output = $self->render->render({
forecast => $self->forecast_response,
bus => $self->bus_response,
@@ -167,8 +171,6 @@ sub write_page {
});
$self->output_file->spew_utf8($output);
-
- #find_cycle($self);
}
sub start {
diff --git a/lib/HomePanel/Render.pm b/lib/HomePanel/Render.pm
index fe165e3..34a220b 100644
--- a/lib/HomePanel/Render.pm
+++ b/lib/HomePanel/Render.pm
@@ -6,6 +6,7 @@ use Template::Stash::ForceUTF8;
use Template;
use DateTime;
use DateTime::Format::Duration;
+use namespace::clean;
has [qw(provider stash template)] => (
is => 'lazy',
diff --git a/lib/WebService/ForecastIo.pm b/lib/WebService/ForecastIo.pm
index 6d37519..f3bf109 100644
--- a/lib/WebService/ForecastIo.pm
+++ b/lib/WebService/ForecastIo.pm
@@ -2,13 +2,13 @@ package WebService::ForecastIo;
use Moo;
use 5.10.0;
use Types::Standard -types,'slurpy';
-use Type::Utils qw(duck_type enum);
use Types::URI 'Uri';
use Types::DateTime -all;
use Type::Params;
+use Future::AsyncAwait;
use WebService::ForecastIo::Response;
use DateTime::TimeZone;
-use namespace::autoclean;
+use namespace::clean;
has base_uri => (
is => 'ro',
@@ -24,19 +24,10 @@ has api_key => (
);
has user_agent => (
- is => 'lazy',
- isa => duck_type(['get']),
+ is => 'ro',
+ isa => HasMethods['do_request'],
+ required => 1,
);
-sub _build_user_agent {
- require LWP::UserAgent;
- my $agent = LWP::UserAgent->new(
- agent => __PACKAGE__ . ' version ' . ($WebService::ForecastIo::VERSION // 'devel' ),
- env_proxy => 1,
- keep_alive => 1,
- );
- $agent->default_header( 'Accept-Encoding' => 'gzip' );
- return $agent;
-}
sub _make_request_uri {
my ($self,$opts) = @_;
@@ -74,10 +65,10 @@ sub _make_request_uri {
return $req_uri;
}
-my $units_type = enum [qw(us si ca uk auto)];
-my $block_type = enum [qw(currently minutely hourly daily alerts flags sources)];
+my $units_type = Enum [qw(us si ca uk auto)];
+my $block_type = Enum [qw(currently minutely hourly daily alerts flags sources)];
-sub request {
+async sub request {
state $argcheck = compile(
Object, Dict[
latitude => Num,
@@ -85,25 +76,22 @@ sub request {
time => Optional[DateTimeUTC],
units => Optional[$units_type],
exclude => Optional[ArrayRef[$block_type]],
- raw => Optional[Bool],
],
);
my ($self,$opts) = $argcheck->(@_);
$opts->{units} //= 'si';
$opts->{exclude} //= [];
- $opts->{raw} //= 0;
my $uri = $self->_make_request_uri({%$opts});
- my $response = $self->user_agent->get($uri);
+ my $response = await $self->user_agent->do_request(uri => $uri);
+
if ($response->is_success) {
my $json = $response->decoded_content;
- return $json if $opts->{raw};
- my $res = WebService::ForecastIo::Response->new($json);
- return wantarray ? ($res,$json) : $res
+ return WebService::ForecastIo::Response->new($json);
}
else {
- die $response->status_line
+ die $response->status_line;
}
}
diff --git a/lib/WebService/TFL/Bus.pm b/lib/WebService/TFL/Bus.pm
index 31bd9c3..8f43c0f 100644
--- a/lib/WebService/TFL/Bus.pm
+++ b/lib/WebService/TFL/Bus.pm
@@ -1,21 +1,16 @@
package WebService::TFL::Bus;
use Moo;
use Types::URI 'Uri';
-use Type::Utils 'duck_type';
+use Types::Standard -types;
+use Future::AsyncAwait;
use WebService::TFL::Bus::Response;
use namespace::clean;
has user_agent => (
- isa => duck_type(['get']),
- is => 'lazy',
-
+ isa => HasMethods['do_request'],
+ is => 'ro',
+ required => 1,
);
-sub _build_user_agent {
- require LWP::UserAgent;
- my $ua = LWP::UserAgent->new();
- $ua->env_proxy;
- return $ua;
-}
has uri => (
isa => Uri,
@@ -29,7 +24,7 @@ has parser => (
builder => sub { JSON->new->utf8 },
);
-sub request {
+async sub request {
my ($self,$stop_id) = @_;
my $uri = $self->uri->clone;
@@ -37,7 +32,8 @@ sub request {
map { $_ eq '__' ? $stop_id : $_ } $uri->path_segments
);
- my $http_response = $self->user_agent->get($uri);
+ my $http_response = await $self->user_agent->do_request(uri => $uri);
+
if ($http_response->is_success) {
my $json = $http_response->content;
diff --git a/lib/WebService/TFL/TubeStatus.pm b/lib/WebService/TFL/TubeStatus.pm
index 4166a79..52d573d 100644
--- a/lib/WebService/TFL/TubeStatus.pm
+++ b/lib/WebService/TFL/TubeStatus.pm
@@ -1,20 +1,16 @@
package WebService::TFL::TubeStatus;
use Moo;
-use Type::Utils 'duck_type';
use Types::URI 'Uri';
+use Types::Standard -types;
+use Future::AsyncAwait;
use WebService::TFL::TubeStatus::Response;
-use namespace::autoclean;
+use namespace::clean;
has user_agent => (
- isa => duck_type(['get']),
- is => 'lazy',
+ isa => HasMethods['do_request'],
+ is => 'ro',
+ required => 1,
);
-sub _build_user_agent {
- require LWP::UserAgent;
- my $ua = LWP::UserAgent->new();
- $ua->env_proxy;
- return $ua;
-}
has uri => (
isa => Uri,
@@ -28,11 +24,11 @@ has parser => (
builder => sub { JSON->new->utf8 },
);
-sub request {
+async sub request {
my ($self) = @_;
+ my $http_response = await $self->user_agent->do_request(uri => $self->uri);
- my $http_response = $self->user_agent->get($self->uri);
if ($http_response->is_success) {
my $json = $http_response->content;