File Coverage

blib/lib/WebService/PivotalTracker/Simple.pm
Criterion Covered Total %
statement 20 46 43.4
branch 0 6 0.0
condition n/a
subroutine 7 12 58.3
pod 4 4 100.0
total 31 68 45.5


line stmt bran cond sub pod time code
1             package WebService::PivotalTracker::Simple;
2 1     1   460 use 5.008005;
  1         2  
3 1     1   361 use Mouse;
  1         18734  
  1         4  
4              
5             our $VERSION = "0.01";
6              
7 1     1   846 use Furl;
  1         17645  
  1         28  
8 1     1   442 use URI;
  1         3196  
  1         21  
9 1     1   4 use Carp ();
  1         1  
  1         14  
10 1     1   3 use JSON qw(decode_json encode_json);
  1         2  
  1         6  
11              
12             my $api_base_uri = 'https://www.pivotaltracker.com/services/v5/';
13              
14             has 'token' => (
15             is => 'ro',
16             isa => 'Str',
17             required => 1,
18             );
19              
20             has 'timeout' => (
21             is => 'ro',
22             isa => 'Int',
23             default => 10,
24             );
25              
26             has 'api_base_uri' => (
27             is => 'ro',
28             isa => 'Str',
29             default => $api_base_uri,
30             );
31              
32             has 'ua' => (
33             is => 'ro',
34             isa => 'Furl',
35             lazy => 1,
36             required => 1,
37             default => sub {
38             my ($self) = @_;
39             Furl->new( timeout => $self->timeout );
40             },
41             );
42              
43 1     1   183 no Mouse;
  1         2  
  1         7  
44              
45             sub _request {
46 0     0     my ($self, $method, $end_point, $data_json, @additional_header) = @_;
47              
48 0           my $ua = $self->ua;
49 0           my $uri = $self->api_base_uri . $end_point;
50 0           my $req = Furl::Request->new($method, $uri, ['X-TrackerToken' => $self->token, @additional_header], $data_json);
51 0           my $res = $ua->request($req);
52 0 0         unless ( $res->is_success ) {
53 0           Carp::croak $res->status_line . $res->content;
54             }
55 0 0         return if ( $res->code eq '204' );# No Content
56 0           return decode_json($res->content);
57             }
58              
59             sub get {
60 0     0 1   my ($self, $end_point, $query_param_href) = @_;
61              
62 0 0         if ( defined $query_param_href ) {
63 0           my $uri = URI->new();
64 0           $uri->query_form( %{ $query_param_href } );
  0            
65 0           $end_point .= $uri->as_string;
66             }
67 0           return $self->_request('GET', $end_point);
68             }
69              
70             sub post {
71 0     0 1   my ($self, $end_point, $data_href) = @_;
72 0           my $data_json = encode_json($data_href);
73 0           my @additional_header = ( 'Content-Type' => 'application/json' );
74 0           return $self->_request('POST', $end_point, $data_json, @additional_header);
75             }
76              
77             sub put {
78 0     0 1   my ($self, $end_point, $data_href) = @_;
79 0           my $data_json = encode_json($data_href);
80 0           my @additional_header = ( 'Content-Type' => 'application/json' );
81 0           return $self->_request('PUT', $end_point, $data_json, @additional_header);
82             }
83              
84             sub delete {
85 0     0 1   my ($self, $end_point) = @_;
86 0           return $self->_request('DELETE', $end_point);
87             }
88              
89              
90             1;
91             __END__