File Coverage

blib/lib/Wikibase/API.pm
Criterion Covered Total %
statement 30 81 37.0
branch 0 18 0.0
condition 0 3 0.0
subroutine 10 16 62.5
pod 3 4 75.0
total 43 122 35.2


line stmt bran cond sub pod time code
1              
2             use strict;
3 4     4   155657 use warnings;
  4         30  
  4         142  
4 4     4   23  
  4         7  
  4         128  
5             use Class::Utils qw(set_params);
6 4     4   977 use Error::Pure qw(err);
  4         58059  
  4         134  
7 4     4   163 use JSON::XS qw(encode_json);
  4         9  
  4         159  
8 4     4   1373 use MediaWiki::API;
  4         10147  
  4         186  
9 4     4   2265 use Unicode::UTF8 qw(decode_utf8);
  4         289523  
  4         151  
10 4     4   1768 use Wikibase::Datatype::Struct::Item;
  4         1930  
  4         283  
11 4     4   2251 use Wikibase::Datatype::Struct::Lexeme;
  4         184052  
  4         189  
12 4     4   2087 use Wikibase::Datatype::Struct::Mediainfo;
  4         32194  
  4         186  
13 4     4   1858  
  4         36210  
  4         3152  
14             our $VERSION = 0.02;
15              
16             # Constructor.
17             my ($class, @params) = @_;
18              
19 0     0 1   # Create object.
20             my $self = bless {}, $class;
21              
22 0           # MediaWiki::API object.
23             $self->{'mediawiki_api'} = MediaWiki::API->new;
24              
25 0           # MediaWiki site.
26             $self->{'mediawiki_site'} = 'test.wikidata.org';
27              
28 0           # Login name.
29             $self->{'login_name'} = undef;
30              
31 0           # Login password.
32             $self->{'login_password'} = undef;
33              
34 0           # Process parameters.
35             set_params($self, @params);
36              
37 0           $self->{'_mediawiki_base_uri'} = 'https://'.$self->{'mediawiki_site'};
38             # XXX Entity URI has http instead of https.
39 0           $self->{'_mediawiki_entity_uri'} = 'http://'.$self->{'mediawiki_site'}.'/entity/';
40              
41 0           if (ref $self->{'mediawiki_api'} ne 'MediaWiki::API') {
42             err "Parameter 'mediawiki_api' must be a 'MediaWiki::API' instance."
43 0 0         }
44 0           $self->{'mediawiki_api'}->{'config'}->{'api_url'}
45             = $self->{'_mediawiki_base_uri'}.'/w/api.php';
46              
47 0           # Login.
48             if (defined $self->{'login_name'} && defined $self->{'login_password'}) {
49             my $login_ret = $self->{'mediawiki_api'}->login({
50 0 0 0       'lgname' => $self->{'login_name'},
51             'lgpassword' => $self->{'login_password'},
52             });
53 0           $self->_mediawiki_api_error($login_ret, 'Cannot login.');
54             }
55 0            
56             # Token.
57             my $token_hr = $self->{'mediawiki_api'}->api({
58             'action' => 'query',
59 0           'meta' => 'tokens',
60             });
61             $self->_mediawiki_api_error($token_hr, 'Cannot get token.');
62             $self->{'_csrftoken'} = $token_hr->{'query'}->{'tokens'}->{'csrftoken'};
63 0            
64 0           return $self;
65             }
66 0            
67             my ($self, $item_obj) = @_;
68              
69             my $res = $self->{'mediawiki_api'}->api({
70 0     0 1   'action' => 'wbeditentity',
71             'new' => 'item',
72             'data' => $self->_obj2json($item_obj),
73             'token' => $self->{'_csrftoken'},
74             });
75             $self->_mediawiki_api_error($res, 'Cannot create item.');
76 0            
77             return $res;
78 0           }
79              
80 0           my ($self, $id, $opts_hr) = @_;
81              
82             my $struct_hr = $self->get_item_raw($id, $opts_hr);
83             if (! exists $struct_hr->{'type'}) {
84 0     0 1   return;
85             }
86 0            
87 0 0         my $item_obj;
88 0           if ($struct_hr->{'type'} eq 'item') {
89             $item_obj = Wikibase::Datatype::Struct::Item::struct2obj($struct_hr);
90             } elsif ($struct_hr->{'type'} eq 'mediainfo') {
91 0           $item_obj = Wikibase::Datatype::Struct::Mediainfo::struct2obj($struct_hr);
92 0 0         } elsif ($struct_hr->{'type'} eq 'lexeme') {
    0          
    0          
93 0           $item_obj = Wikibase::Datatype::Struct::Lexeme::struct2obj($struct_hr);
94             } else {
95 0           err 'Unsupported type.',
96             'Type', $struct_hr->{'type'},
97 0           ;
98             }
99              
100 0           return $item_obj;
101             }
102              
103             my ($self, $id, $opts_hr) = @_;
104 0            
105             # TODO $opts_hr - Muzu vyfiltrovat jenom claims napr.
106              
107             my $res = $self->{'mediawiki_api'}->api({
108 0     0 0   'action' => 'wbgetentities',
109             'format' => 'json',
110             'ids' => $id,
111             });
112 0           $self->_mediawiki_api_error($res, 'Cannot get item.');
113              
114             my $struct_hr = $res->{'entities'}->{$id};
115              
116             return $struct_hr;
117 0           }
118              
119 0           my ($self, $item_obj) = @_;
120              
121 0           if (! defined $item_obj) {
122             return '{}';
123             } else {
124             if (! $item_obj->isa('Wikibase::Datatype::Item')) {
125 0     0     err "Bad data. Must be 'Wikibase::Datatype::Item' object.";
126             }
127 0 0         }
128 0            
129             my $struct_hr = Wikibase::Datatype::Struct::Item::obj2struct($item_obj,
130 0 0         $self->{'_mediawiki_entity_uri'});
131 0            
132             my $json = decode_utf8(JSON::XS->new->utf8->encode($struct_hr));
133              
134             return $json;
135             }
136 0            
137             my ($self, $res, $message) = @_;
138 0            
139             if (! defined $res) {
140 0           err $message,
141             'Error code' => $self->{'mediawiki_api'}->{'error'}->{'code'},
142             'Error details' => $self->{'mediawiki_api'}->{'error'}->{'details'},
143             ;
144 0     0     }
145              
146 0 0         return;
147             }
148              
149 0           1;
150              
151              
152             =pod
153 0            
154             =encoding utf8
155              
156             =head1 NAME
157              
158             Wikibase::API - Class for API to Wikibase (Wikibase) system.
159              
160             =head1 SYNOPSIS
161              
162             use Wikibase::API;
163              
164             my $obj = Wikibase::API->new(%params);
165             my $res = $obj->create_item($item_obj);
166             my $item_obj = $obj->get_item($id);
167              
168             =head1 METHODS
169              
170             =head2 C<new>
171              
172             my $obj = Wikibase::API->new(%params);
173              
174             Constructor.
175              
176             Returns instance of object.
177              
178             =over 8
179              
180             =item * C<mediawiki_api>
181              
182             MediaWiki::API object.
183              
184             Default value is MediaWiki::API->new.
185              
186             =item * C<mediawiki_site>
187              
188             MediaWiki site.
189              
190             Default value is 'test.wikidata.org'.
191              
192             =item * C<login_name>
193              
194             Login name.
195              
196             Default value is undef.
197              
198             =item * C<login_password>
199              
200             Login password.
201              
202             Default value is undef.
203              
204             =back
205              
206             =head2 C<create_item>
207              
208             my $res = $obj->create_item($item_obj)
209              
210             Create item in system.
211             C<$item_obj> is Wikibase::Datatype::Item instance.
212              
213             Returns reference to hash like this:
214              
215             {
216             'entity' => {
217             ...
218             },
219             'success' => __STATUS_CODE__,
220             }
221              
222             =head2 C<get_item>
223              
224             my $item_obj = $obj->get_item($id);
225              
226             Get item from system.
227              
228             Returns Wikibase::Datatype::Item instance.
229              
230             =head1 ERRORS
231              
232             new():
233             From Class::Utils::set_params():
234             Unknown parameter '%s'.
235             Cannot login.
236             Error code: %s
237             Error details: %s
238             Cannot get token.
239             Error code: %s
240             Error details: %s
241              
242             create_item():
243             Bad data. Must be 'Wikibase::Datatype::Item' object.
244              
245             =head1 EXAMPLE1
246              
247             =for comment filename=create_item_in_test_wikidata.pl
248              
249             use strict;
250             use warnings;
251              
252             use Data::Printer;
253             use Wikibase::API;
254             use Wikibase::Datatype::Item;
255              
256             # API object.
257             my $api = Wikibase::API->new;
258              
259             # Wikibase::Datatype::Item blank object.
260             my $item_obj = Wikibase::Datatype::Item->new;
261              
262             # Create item.
263             my $res = $api->create_item($item_obj);
264              
265             # Dump response structure.
266             p $res;
267              
268             # Output like:
269             # \ {
270             # entity {
271             # aliases {},
272             # claims {},
273             # descriptions {},
274             # id "Q213698",
275             # labels {},
276             # lastrevid 535146,
277             # sitelinks {},
278             # type "item"
279             # },
280             # success 1
281             # }
282              
283             =head1 EXAMPLE2
284              
285             =for comment filename=get_item_from_test_wikidata.pl
286              
287             use strict;
288             use warnings;
289              
290             use Data::Printer;
291             use Wikibase::API;
292              
293             if (@ARGV < 1) {
294             print STDERR "Usage: $0 id\n";
295             exit 1;
296             }
297             my $id = $ARGV[0];
298              
299             # API object.
300             my $api = Wikibase::API->new;
301              
302             # Get item.
303             my $item_obj = $api->get_item($id);
304              
305             # Dump response structure.
306             p $item_obj;
307              
308             # Output for Q213698 argument like:
309             # Wikibase::Datatype::Item {
310             # Parents Mo::Object
311             # public methods (9) : BUILD, can (UNIVERSAL), DOES (UNIVERSAL), err (Error::Pure), check_array_object (Mo::utils), check_number (Mo::utils), check_number_of_items (Mo::utils), isa (UNIVERSAL), VERSION (UNIVERSAL)
312             # private methods (1) : __ANON__ (Mo::is)
313             # internals: {
314             # aliases [],
315             # descriptions [],
316             # id "Q213698",
317             # labels [],
318             # lastrevid 535146,
319             # modified "2020-12-11T22:26:06Z",
320             # ns 0,
321             # page_id 304259,
322             # sitelinks [],
323             # statements [],
324             # title "Q213698"
325             # }
326             # }
327              
328             =head1 DEPENDENCIES
329              
330             L<Class::Utils>,
331             L<Error::Pure>,
332             L<JSON::XS>,
333             L<MediaWiki::API>,
334             L<Unicode::UTF8>,
335             L<Wikibase::Datatype::Item>.
336              
337             =head1 SEE ALSO
338              
339             =over
340              
341             =item L<Wikibase::Datatype>
342              
343             Wikibase datatypes.
344              
345             =item L<Wikibase::Datatype::Struct>
346              
347             Wikibase structure serialization.
348              
349             =back
350              
351             =head1 REPOSITORY
352              
353             L<https://github.com/michal-josef-spacek/Wikibase-API>
354              
355             =head1 AUTHOR
356              
357             Michal Josef Špaček L<mailto:skim@cpan.org>
358              
359             L<http://skim.cz>
360              
361             =head1 LICENSE AND COPYRIGHT
362              
363             © 2020-2022 Michal Josef Špaček
364              
365             BSD 2-Clause License
366              
367             =head1 VERSION
368              
369             0.02
370              
371             =cut