File Coverage

blib/lib/WebService/Prowl.pm
Criterion Covered Total %
statement 22 82 26.8
branch 1 40 2.5
condition 0 8 0.0
subroutine 7 18 38.8
pod 6 7 85.7
total 36 155 23.2


line stmt bran cond sub pod time code
1             package WebService::Prowl;
2              
3 1     1   15335 use warnings;
  1         2  
  1         47  
4 1     1   6 use strict;
  1         1  
  1         34  
5 1     1   32 use 5.008_001; # for utf8::is_utf8()
  1         9  
6             our $VERSION = '0.08';
7              
8 1     1   709 use LWP::UserAgent;
  1         34975  
  1         30  
9 1     1   10 use URI::Escape qw(uri_escape_utf8 uri_escape);
  1         1  
  1         68  
10 1     1   4 use Carp qw(croak);
  1         1  
  1         106  
11              
12             my $API_BASE_URL = 'https://api.prowlapp.com/publicapi/';
13              
14             BEGIN {
15 1     1   3 @WebService::Prowl::EXPORT = qw( LIBXML );
16 1 50       2 if ( eval { require XML::LibXML::Simple } ) {
  1         217  
17 0         0 *{WebService::Prowl::LIBXML} = sub() {1};
18             }
19             else {
20 1         742 require XML::Simple;
21 1         7902 *{WebService::Prowl::LIBXML} = sub() {0};
22             }
23             }
24              
25             sub new {
26 0     0 1   my $class = shift;
27 0           my %params = @_;
28 0           my $apikey = $params{'apikey'};
29             return bless {
30             apikey => $params{'apikey'},
31             ua => LWP::UserAgent->new( agent => __PACKAGE__ . '/' . $VERSION ),
32             error => '',
33 0 0         $params{'providerkey'} ? (providerkey => $params{'providerkey'}) : (),
34             }, $class;
35             }
36              
37 0     0 0   sub ua { $_[0]->{ua} }
38              
39 0     0 1   sub error { $_[0]->{error} }
40              
41             sub _build_url {
42 0     0     my ( $self, $method, %params ) = @_;
43 0 0         if ($method eq 'verify') {
    0          
    0          
    0          
44 0 0         croak("apikey is required") unless $self->{apikey};
45 0           my $url = $API_BASE_URL . 'verify?apikey=' . $self->{apikey};
46 0 0         $url .= '&providerkey=' . $self->{providerkey} if $self->{providerkey};
47 0           return $url;
48             }
49             elsif ($method eq 'add') {
50 0 0         croak("apikey is required") unless $self->{apikey};
51 0           my @params = qw/priority application event description url/;
52 0           my $req_params = +{ map { $_ => delete $params{$_} } @params };
  0            
53              
54 0 0         croak("event name is required") unless $req_params->{event};
55 0 0         croak("application name is required") unless $req_params->{application};
56 0 0         croak("description is required") unless $req_params->{description};
57              
58 0   0       $req_params->{priority} ||= 0;
59              
60             ##XXX: validate url parameter???
61              
62             croak("priority must be an integer value in the range [-2, 2]")
63             if ( $req_params->{priority} !~ /^-?\d+$/
64             || $req_params->{priority} < -2
65 0 0 0       || $req_params->{priority} > 2 );
      0        
66              
67             my %query = (
68             apikey => $self->{apikey},
69             $self->{providerkey} ? (providerkey => $self->{providerkey}) : (),
70 0 0         map { $_ => $req_params->{$_} } @params,
  0            
71             );
72 0           my @out;
73 0           for my $k (keys %query) {
74 0           push @out, sprintf("%s=%s", _uri_escape($k), _uri_escape($query{$k}));
75             }
76 0           my $q = join ('&', @out);
77 0           return $API_BASE_URL . 'add?' . $q;
78             }
79             elsif ($method eq 'retrieve_token') {
80 0 0         croak("providerkey is required") unless $self->{providerkey};
81 0           return $API_BASE_URL . 'retrieve/token?providerkey=' . $self->{providerkey};
82             }
83             elsif ($method eq 'retrieve_apikey') {
84 0 0         croak("providerkey is required") unless $self->{providerkey};
85 0           my $token = $params{'token'};
86 0 0         croak("token is required") unless $token;
87 0           my $url = $API_BASE_URL . 'retrieve/apikey?providerkey=' . $self->{providerkey};
88 0           $url .= '&token=' . $token;
89 0           return $url;
90             }
91             }
92              
93             sub add {
94 0     0 1   my ( $self, %params, $cb ) = @_;
95 0           my $url = $self->_build_url('add', %params);
96 0           $self->_send_request($url, $cb);
97             }
98              
99             sub verify {
100 0     0 1   my ($self) = @_;
101 0           my $url = $self->_build_url('verify');
102 0           $self->_send_request($url);
103             }
104              
105             sub retrieve_token {
106 0     0 1   my ( $self, %params, $cb ) = @_;
107 0           my $url = $self->_build_url('retrieve_token', %params);
108 0           $self->_send_request($url, $cb);
109             }
110              
111             sub retrieve_apikey {
112 0     0 1   my ( $self, %params, $cb ) = @_;
113 0           my $url = $self->_build_url('retrieve_apikey', %params);
114 0           $self->_send_request($url, $cb);
115             }
116              
117             sub _send_request {
118 0     0     my ( $self, $url, $cb ) = @_;
119 0           my $res = $self->{ua}->get($url);
120 0           my $data = $self->_xmlin($res->content);
121 0 0         if ($res->is_error) {
122             $self->{error} =
123             $data->{error}
124             ? $data->{error}{code} . ': ' . $data->{error}{content}
125 0 0         : '';
126 0           return;
127             }
128 0           return $data;
129             }
130              
131             sub _xmlin {
132 0     0     my ( $self, $xml ) = @_;
133 0           if (LIBXML) {
134             return XML::LibXML::Simple->new->XMLin( $xml );
135             }
136             else {
137 0           return XML::Simple->new->XMLin( $xml );
138             }
139             }
140              
141             sub _uri_escape {
142 0 0   0     utf8::is_utf8($_[0]) ? uri_escape_utf8($_[0]) : uri_escape($_[0]);
143             }
144              
145             1;
146             __END__