Business-YQL

 view release on metacpan or  search on metacpan

lib/Business/YQL.pm  view on Meta::CPAN

package Business::YQL;
use Moo;

our $VERSION = '0.0004'; # VERSION

use HTTP::Request::Common qw(GET POST);
use URI;
use URI::QueryParam;
use LWP::UserAgent;
use JSON qw(to_json from_json);
use Carp qw(croak);
use Log::Any qw($log);
use Try::Tiny;

has scheme  => (is => 'ro', default => 'http'                           );
has domain  => (is => 'ro', default => 'query.yahooapis.com'            );
has version => (is => 'ro', default => 'v1'                             );
has timeout => (is => 'ro', default => 10                               );
has retries => (is => 'ro', default => 3                                );

has uri     => (
    is      => 'ro',
    lazy    => 1,
    default => sub {
        my $self = shift;
        return sprintf '%s://%s/%s/public/yql',
            $self->scheme, $self->domain, $self->version;
    },
);

has ua      => (
    is      => 'ro',
    lazy    => 1,
    default => sub {
        my $self = shift;
        my $ua = LWP::UserAgent->new;
        $ua->timeout($self->timeout);
        return $ua
    },
);

sub q {
    my ($self, $query) = @_;
    croak "Invalid query string"
        unless $query;

    my %params = (
        q           => $query,
        format      => 'json',
        env         => 'store://datatables.org/alltableswithkeys',
        jsonCompat  => 'new',
    );

    my $uri = URI->new($self->uri);
    $uri->query_form(%params);

    if ($query =~ m/^insert/i) {
        return $self->_req(POST $uri);
    } else {
        return $self->_req(GET $uri);
    }
}

sub _req {
    my ($self, $req) = @_;
    $self->_log_request($req);
    my $res = $self->ua->request($req);
    $self->_log_response($res);
    my $retries = $self->retries;
    while ($res->code =~ /^5/x and $retries--) {
        sleep 1;
        $res = $self->ua->request($req);
    }



( run in 1.985 second using v1.01-cache-2.11-cpan-5a3173703d6 )