Geo-Coder-GeocodeFarm
view release on metacpan or search on metacpan
lib/Geo/Coder/GeocodeFarm.pm view on Meta::CPAN
use warnings;
our $VERSION = '0.0500';
use Carp qw(croak);
use Encode;
use HTTP::Tiny;
use URI;
use URI::QueryParam;
use JSON;
use Scalar::Util qw(blessed);
use constant DEBUG => !!$ENV{PERL_GEO_CODER_GEOCODEFARM_DEBUG};
=head1 METHODS
=head2 new
=for markdown ```perl
$geocoder = Geo::Coder::GeocodeFarm->new(
lib/Geo/Coder/GeocodeFarm.pm view on Meta::CPAN
Creates a new geocoding object with optional arguments.
An API key is required and can be obtained at
L<https://geocode.farm/store/api-services/>
=cut
sub new {
my ($class, %args) = @_;
my $self = bless +{
ua => $args{ua} || HTTP::Tiny->new(
agent => __PACKAGE__ . "/$VERSION",
),
url => $args{url} || 'https://api.geocode.farm/',
parser => $args{parser} || JSON->new->utf8,
raise_failure => defined $args{raise_failure} ? $args{raise_failure} : 1,
%args,
} => $class;
croak "API key is required" unless $self->{key};
lib/Geo/Coder/GeocodeFarm.pm view on Meta::CPAN
} else {
croak "Unknown type for request";
}
$url->query_param_append(key => $self->{key});
warn $url if DEBUG;
my $res = $self->{ua}->get($url);
my $content = do {
if (blessed $res and $res->isa('HTTP::Response')) {
croak $res->status_line if $self->{raise_failure} and not $res->is_success;
$res->decoded_content;
} elsif (ref $res eq 'HASH') {
croak "@{[$res->{status}, $res->{reason}]}" if $self->{raise_failure} and not $res->{success};
$res->{content};
} else {
croak "Wrong response $res";
}
};
t/050_geocode.t view on Meta::CPAN
cmp_deeply $result, $expected, '$result matches deeply';
is $ua->{url}, 'https://api.geocode.farm/forward/?addr=530+W+Main+St+Anoka+MN+55303+US&key=xxx',
'url matches';
}
package My::Mock;
sub new {
my ($class) = @_;
return bless +{} => $class;
}
package My::Mock::HTTP::Tiny;
use base 'My::Mock';
sub get {
my ($self, $url) = @_;
$self->{url} = $url;
my $content = <<'END';
t/060_geocode_failure.t view on Meta::CPAN
'result is undef';
is $ua->{url}, 'https://api.geocode.farm/forward/?addr=non-existing+address&key=xxx',
'url matches';
}
package My::Mock;
sub new {
my ($class) = @_;
return bless +{} => $class;
}
package My::Mock::HTTP::Tiny;
use base 'My::Mock';
sub get {
my ($self, $url) = @_;
$self->{url} = $url;
my $res = {
t/065_geocode_utf8.t view on Meta::CPAN
is $result->{address}{full_address}, 'Åask, Poland', '$result full_address';
is $ua->{url}, 'https://api.geocode.farm/forward/?addr=%C5%81ask%2C+Poland&key=xxx',
'url matches';
}
package My::Mock;
sub new {
my ($class) = @_;
return bless +{} => $class;
}
package My::Mock::HTTP::Tiny;
use base 'My::Mock';
sub get {
my ($self, $url) = @_;
$self->{url} = $url;
my $content = <<'END';
t/070_reverse_geocode.t view on Meta::CPAN
cmp_deeply $result, $expected, '$result matches deeply';
is $ua->{url}, 'https://api.geocode.farm/reverse/?lat=45.2040305&lon=-93.3995728&key=xxx', 'url matches';
}
package My::Mock;
sub new {
my ($class) = @_;
return bless +{} => $class;
}
package LWP::UserAgent;
sub _placeholder { }
package HTTP::Response;
sub _placeholder { }
t/080_reverse_geocode_failure.t view on Meta::CPAN
'result is undef';
is $ua->{url}, 'https://api.geocode.farm/reverse/?lat=0.00&lon=0.00&key=xxx',
'url matches';
}
package My::Mock;
sub new {
my ($class) = @_;
return bless +{} => $class;
}
package LWP::UserAgent;
sub _placeholder { }
package HTTP::Response;
sub _placeholder { }
( run in 0.264 second using v1.01-cache-2.11-cpan-73692580452 )