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 )