File Coverage

blib/lib/Wikibase/API.pm
Criterion Covered Total %
statement 30 90 33.3
branch 0 20 0.0
condition 0 3 0.0
subroutine 10 17 58.8
pod 3 4 75.0
total 43 134 32.0


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