File Coverage

blib/lib/WebService/Hatena/Graph.pm
Criterion Covered Total %
statement 18 77 23.3
branch 0 24 0.0
condition 0 3 0.0
subroutine 6 20 30.0
pod 7 12 58.3
total 31 136 22.7


line stmt bran cond sub pod time code
1             package WebService::Hatena::Graph;
2              
3 1     1   5 use strict;
  1         2  
  1         42  
4 1     1   6 use warnings;
  1         1  
  1         38  
5 1     1   6 use Carp qw(croak);
  1         2  
  1         103  
6              
7 1     1   2632 use URI;
  1         13264  
  1         35  
8 1     1   1382 use JSON::Any;
  1         49301  
  1         9  
9 1     1   37803 use LWP::UserAgent;
  1         77397  
  1         1369  
10              
11             our $VERSION = '0.08';
12              
13             our $GraphHost = 'graph.hatena.ne.jp:80';
14              
15             sub new {
16 0     0 1   my ($class, %args) = @_;
17 0           my %param;
18 0 0         if (defined $args{access_token}) {
19 0           @param{qw(
20             access_token access_token_secret
21             consumer_key consumer_secret
22             )} = @args{qw(
23             access_token access_token_secret
24             consumer_key consumer_secret
25             )};
26             } else {
27 0 0 0       croak ('Both username and password are required.')
28             if (!defined $args{username} || !defined $args{password});
29             }
30              
31 0           my $ua = LWP::UserAgent->new(agent => __PACKAGE__."/$VERSION");
32 0           $ua->credentials($GraphHost, '', @args{qw(username password)});
33 0           $param{ua} = $ua;
34              
35 0           return bless \%param, $class;
36             }
37              
38 0     0 1   sub ua { shift->{ua} }
39              
40             sub use_oauth {
41 0     0 0   return defined $_[0]->access_token;
42             }
43              
44 0     0 0   sub consumer_key { $_[0]->{consumer_key} }
45 0     0 0   sub consumer_secret { $_[0]->{consumer_secret} }
46 0     0 0   sub access_token { $_[0]->{access_token} }
47 0     0 0   sub access_token_secret { $_[0]->{access_token_secret} }
48              
49              
50             # This method remains only for backward compatibility (less or equal
51             # version 0.04). Use post_data() method instead.
52             sub post {
53 0     0 1   my ($self, %args) = @_;
54 0           return $self->post_data(%args);
55             }
56              
57             sub post_data {
58 0     0 1   my ($self, %args) = @_;
59              
60 0 0         croak ('Graphname parameter must be passed in.')
61             if !defined $args{graphname};
62              
63 0           my $res = $self->_post('http://'.$GraphHost.'/api/data', %args);
64              
65 0 0         croak (sprintf "%d: %s", $res->code, $res->message)
66             if $res->code != 201;
67              
68 0           return 1;
69             }
70              
71             sub get_data {
72 0     0 1   my ($self, %args) = @_;
73              
74 0 0         croak ('Graphname parameter must be passed in.')
75             if !defined $args{graphname};
76              
77 0           my $res = $self->_get('http://'.$GraphHost.'/api/data', (%args, type => 'json'));
78              
79 0 0         croak (sprintf "%d: %s", $res->code, $res->message)
80             if $res->code != 200;
81              
82 0           return JSON::Any->jsonToObj($res->content);
83             }
84              
85             sub post_config {
86 0     0 1   my ($self, %args) = @_;
87              
88 0 0         croak ('Graphname parameter must be passed in.')
89             if !defined $args{graphname};
90              
91 0           my $res = $self->_post('http://'.$GraphHost.'/api/config', %args);
92              
93 0 0         croak (sprintf "%d: %s", $res->code, $res->message)
94             if $res->code != 201;
95              
96 0           return 1;
97             }
98              
99             sub get_config {
100 0     0 1   my ($self, %args) = @_;
101              
102 0 0         croak ('Graphname parameter must be passed in.')
103             if !defined $args{graphname};
104              
105 0           my $res = $self->_get('http://'.$GraphHost.'/api/config', (%args, type => 'json'));
106              
107 0 0         croak (sprintf "%d: %s", $res->code, $res->message)
108             if $res->code != 200;
109              
110 0           return JSON::Any->jsonToObj($res->content);
111             }
112              
113             sub _get {
114 0     0     my ($self, $url, %params) = @_;
115 0           my $uri;
116              
117 0 0         if ($self->use_oauth) {
118 0           require OAuth::Lite::Consumer;
119 0           require OAuth::Lite::Token;
120 0           require OAuth::Lite::AuthMethod;
121              
122 0           my $consumer = OAuth::Lite::Consumer->new(
123             consumer_key => $self->consumer_key,
124             consumer_secret => $self->consumer_secret,
125             auth_method => OAuth::Lite::AuthMethod::URL_QUERY(),
126             );
127 0           my $access_token = OAuth::Lite::Token->new(
128             token => $self->access_token,
129             secret => $self->access_token_secret,
130             );
131              
132 0           $uri = $url . '?' . $consumer->gen_auth_query('GET', $url, $access_token, \%params);
133             } else {
134 0           $uri = URI->new($url);
135 0           $uri->query_form(%params);
136             }
137              
138 0           return $self->ua->get($uri);
139             }
140              
141             sub _post {
142 0     0     my ($self, $url, %params) = @_;
143              
144 0 0         if ($self->use_oauth) {
145 0           require OAuth::Lite::Consumer;
146 0           require OAuth::Lite::Token;
147 0           require OAuth::Lite::AuthMethod;
148              
149 0           my $consumer = OAuth::Lite::Consumer->new(
150             consumer_key => $self->consumer_key,
151             consumer_secret => $self->consumer_secret,
152             auth_method => OAuth::Lite::AuthMethod::POST_BODY(),
153             );
154 0           my $access_token = OAuth::Lite::Token->new(
155             token => $self->access_token,
156             secret => $self->access_token_secret,
157             );
158 0           my $oauth_req = $consumer->gen_oauth_request(
159             method => 'POST',
160             url => $url,
161             token => $access_token,
162             params => \%params,
163             );
164 0           return $self->ua->post(
165             $url,
166             'Content-Type' => 'application/x-www-form-urlencoded',
167             Content => $oauth_req->content,
168             );
169             } else {
170 0           return $self->ua->post($url, \%params);
171             }
172             }
173              
174             1;
175              
176             __END__