File Coverage

lib/WebService/Qiita/Client/Base.pm
Criterion Covered Total %
statement 62 62 100.0
branch 14 14 100.0
condition 9 12 75.0
subroutine 17 17 100.0
pod 0 5 0.0
total 102 110 92.7


line stmt bran cond sub pod time code
1             package WebService::Qiita::Client::Base;
2 6     6   2453 use strict;
  6         9  
  6         175  
3 6     6   30 use warnings;
  6         8  
  6         123  
4 6     6   26 use utf8;
  6         8  
  6         25  
5              
6 6     6   136 use Carp qw(croak);
  6         13  
  6         519  
7 6     6   6430 use LWP::UserAgent;
  6         122924  
  6         200  
8 6     6   8077 use JSON;
  6         91521  
  6         36  
9 6     6   1066 use HTTP::Request;
  6         14  
  6         185  
10 6     6   31 use URI;
  6         12  
  6         276  
11              
12             use Class::Accessor::Lite (
13 6         45 new => 1,
14             rw => [qw(
15             url_name
16             password
17             token
18             )],
19 6     6   5871 );
  6         5860  
20              
21             use constant {
22 6         3910 ROOT_URL => 'https://qiita.com',
23             PREFIX_PATH => '/api/v1',
24 6     6   591 };
  6         14  
25              
26             sub agent {
27 24     24 0 393 my $self = shift;
28 24         134 my $options = {
29             ssl_opts => { verify_hostname => 0 },
30             timeout => 10,
31             };
32 24   33     309 $self->{agent} ||= LWP::UserAgent->new(%$options);
33             }
34              
35             sub get {
36 16     16 0 44 my ($self, $path, $params) = @_;
37 16         70 $self->_request('GET', $path, $params);
38             }
39              
40             sub post {
41 2     2 0 8 my ($self, $path, $params) = @_;
42 2         19 $self->_request('POST', $path, $params);
43             }
44              
45             sub put {
46 1     1 0 2 my ($self, $path, $params) = @_;
47 1         8 $self->_request('PUT', $path, $params);
48             }
49              
50             sub delete {
51 1     1 0 2 my ($self, $path, $params) = @_;
52 1         30 $self->_request('DELETE', $path, $params);
53             }
54              
55             sub _request {
56 24     24   88 my ($self, $method, $path, $params) = @_;
57              
58 24         60 my $url = ROOT_URL . PREFIX_PATH . $path;
59 24 100       100 $params->{token} = $self->token if $self->token;
60              
61 24         385 my $request = HTTP::Request->new("$method" => $url);
62 24         50627 $request->content_type('application/json');
63              
64 24 100 100     781 if ($method eq 'GET' || $method eq 'DELETE') {
    100 100        
65 20         75 my $uri = URI->new($url);
66 20         1078 $uri->query_form(%$params);
67 20         1367 $request->uri($uri->as_string);
68             } elsif ($method eq 'POST' || $method eq 'PUT') {
69 3         85 $request->content(JSON::encode_json $params);
70             } else {
71 1         199 croak "invalid http method: $method";
72             }
73              
74 23         1332 my $response = agent->request($request);
75 23 100       768 croak _error_message($response, $method, $url) if $response->is_error;
76              
77 20 100       174 $response->content ? JSON::decode_json($response->content) : "";
78             }
79              
80             sub _error_message {
81 3     3   22 my ($response, $method, $url) = @_;
82              
83 3         11 my $content = $response->content;
84 3 100       37 if ($content) {
85 2         4 my $json = eval { JSON::decode_json($content) };
  2         21  
86 2 100 66     125 return $json->{error} if $json && $json->{error};
87             }
88 2         8 sprintf "%s %s: %d", $method, $url, $response->code;
89             }
90              
91             1;