File Coverage

blib/lib/Wikibase/Datatype/Struct/Sense.pm
Criterion Covered Total %
statement 56 56 100.0
branch 6 6 100.0
condition 2 2 100.0
subroutine 10 10 100.0
pod 2 2 100.0
total 76 76 100.0


line stmt bran cond sub pod time code
1             package Wikibase::Datatype::Struct::Sense;
2              
3 8     8   357034 use base qw(Exporter);
  8         61  
  8         1102  
4 8     8   60 use strict;
  8         19  
  8         182  
5 8     8   40 use warnings;
  8         16  
  8         276  
6              
7 8     8   1558 use Error::Pure qw(err);
  8         35698  
  8         339  
8 8     8   202 use Readonly;
  8         25  
  8         346  
9 8     8   4220 use Wikibase::Datatype::Sense;
  8         19519  
  8         244  
10 8     8   1901 use Wikibase::Datatype::Struct::Language;
  8         19  
  8         304  
11 8     8   2051 use Wikibase::Datatype::Struct::Statement;
  8         22  
  8         3936  
12              
13             Readonly::Array our @EXPORT_OK => qw(obj2struct struct2obj);
14              
15             our $VERSION = 0.08;
16              
17             sub obj2struct {
18 4     4 1 8734 my ($obj, $base_uri) = @_;
19              
20 4 100       14 if (! defined $obj) {
21 1         5 err "Object doesn't exist.";
22             }
23 3 100       20 if (! $obj->isa('Wikibase::Datatype::Sense')) {
24 1         5 err "Object isn't 'Wikibase::Datatype::Sense'.";
25             }
26 2 100       7 if (! defined $base_uri) {
27 1         4 err 'Base URI is required.';
28             }
29              
30 1         4 my $struct_hr = {
31             'id' => $obj->id,
32             };
33              
34             # Glosses.
35 1         9 foreach my $glosse (@{$obj->glosses}) {
  1         4  
36 2         19 $struct_hr->{'glosses'}->{$glosse->language}
37             = Wikibase::Datatype::Struct::Language::obj2struct($glosse);
38             }
39              
40             # Statements.
41 1         9 foreach my $statement (@{$obj->statements}) {
  1         5  
42 2   100     14 $struct_hr->{'claims'}->{$statement->snak->property} //= [];
43 2         30 push @{$struct_hr->{'claims'}->{$statement->snak->property}},
  2         5  
44             Wikibase::Datatype::Struct::Statement::obj2struct($statement, $base_uri);
45             }
46              
47 1         4 return $struct_hr;
48             }
49              
50             sub struct2obj {
51 1     1 1 101 my $struct_hr = shift;
52              
53             # Glosses.
54 1         2 my $glosses_ar;
55 1         3 foreach my $lang (keys %{$struct_hr->{'glosses'}}) {
  1         6  
56 2         4 push @{$glosses_ar}, Wikibase::Datatype::Struct::Language::struct2obj($struct_hr->{'glosses'}->{$lang});
  2         8  
57             }
58              
59             # Statements.
60 1         4 my $statements_ar = [];
61 1         2 foreach my $property (keys %{$struct_hr->{'claims'}}) {
  1         6  
62 1         2 foreach my $claim_hr (@{$struct_hr->{'claims'}->{$property}}) {
  1         4  
63 1         3 push @{$statements_ar}, Wikibase::Datatype::Struct::Statement::struct2obj(
  1         5  
64             $claim_hr,
65             );
66             }
67             }
68              
69             my $obj = Wikibase::Datatype::Sense->new(
70             'glosses' => $glosses_ar,
71 1         8 'id' => $struct_hr->{'id'},
72             'statements' => $statements_ar,
73             );
74              
75 1         140 return $obj;
76             }
77              
78             1;
79              
80             __END__
81              
82             =pod
83              
84             =encoding utf8
85              
86             =head1 NAME
87              
88             Wikibase::Datatype::Struct::Sense - Wikibase sense structure serialization.
89              
90             =head1 SYNOPSIS
91              
92             use Wikibase::Datatype::Struct::Sense qw(obj2struct struct2obj);
93              
94             my $struct_hr = obj2struct($obj, $base_uri);
95             my $obj = struct2obj($struct_hr);
96              
97             =head1 DESCRIPTION
98              
99             This conversion is between objects defined in Wikibase::Datatype and structures
100             serialized via JSON to MediaWiki.
101              
102             =head1 SUBROUTINES
103              
104             =head2 C<obj2struct>
105              
106             my $struct_hr = obj2struct($obj, $base_uri);
107              
108             Convert Wikibase::Datatype::Sense instance to structure.
109             C<$base_uri> is base URI of Wikibase system (e.g. http://test.wikidata.org/entity/).
110              
111             Returns reference to hash with structure.
112              
113             =head2 C<struct2obj>
114              
115             my $obj = struct2obj($struct_hr);
116              
117             Convert structure of sense to object.
118              
119             Returns Wikibase::Datatype::Sense instance.
120              
121             =head1 ERRORS
122              
123             obj2struct():
124             Base URI is required.
125             Object doesn't exist.
126             Object isn't 'Wikibase::Datatype::Sense'.
127              
128             =head1 EXAMPLE1
129              
130             use strict;
131             use warnings;
132              
133             use Data::Printer;
134             use Wikibase::Datatype::Sense;
135             use Wikibase::Datatype::Snak;
136             use Wikibase::Datatype::Statement;
137             use Wikibase::Datatype::Struct::Sense qw(obj2struct);
138             use Wikibase::Datatype::Value::Item;
139             use Wikibase::Datatype::Value::Monolingual;
140              
141             # Statement.
142             my $statement = Wikibase::Datatype::Statement->new(
143             # instance of (P31) human (Q5)
144             'snak' => Wikibase::Datatype::Snak->new(
145             'datatype' => 'wikibase-item',
146             'datavalue' => Wikibase::Datatype::Value::Item->new(
147             'value' => 'Q5',
148             ),
149             'property' => 'P31',
150             ),
151             );
152              
153             # Object.
154             my $obj = Wikibase::Datatype::Sense->new(
155             'glosses' => [
156             Wikibase::Datatype::Value::Monolingual->new(
157             'language' => 'en',
158             'value' => 'Glosse en',
159             ),
160             Wikibase::Datatype::Value::Monolingual->new(
161             'language' => 'cs',
162             'value' => 'Glosse cs',
163             ),
164             ],
165             'id' => 'ID',
166             'statements' => [
167             $statement,
168             ],
169             );
170              
171             # Get structure.
172             my $struct_hr = obj2struct($obj, 'http://test.wikidata.org/entity/');
173              
174             # Dump to output.
175             p $struct_hr;
176              
177             # Output:
178             # \ {
179             # glosses {
180             # cs {
181             # language "cs",
182             # value "Glosse cs"
183             # },
184             # en {
185             # language "en",
186             # value "Glosse en"
187             # }
188             # },
189             # id "ID",
190             # claims {
191             # P31 [
192             # [0] {
193             # mainsnak {
194             # datatype "wikibase-item",
195             # datavalue {
196             # type "wikibase-entityid",
197             # value {
198             # entity-type "item",
199             # id "Q5",
200             # numeric-id 5
201             # }
202             # },
203             # property "P31",
204             # snaktype "value"
205             # },
206             # rank "normal",
207             # type "statement"
208             # }
209             # ]
210             # }
211             # }
212              
213             =head1 EXAMPLE2
214              
215             use strict;
216             use warnings;
217              
218             use Data::Printer;
219             use Wikibase::Datatype::Struct::Sense qw(struct2obj);
220              
221             # Item structure.
222             my $struct_hr = {
223             'glosses' => {
224             'cs' => {
225             'language' => 'cs',
226             'value' => 'Glosse cs',
227             },
228             'en' => {
229             'language' => 'en',
230             'value' => 'Glosse en',
231             },
232             },
233             'id' => 'ID',
234             'claims' => {
235             'P31' => [{
236             'mainsnak' => {
237             'datatype' => 'wikibase-item',
238             'datavalue' => {
239             'type' => 'wikibase-entityid',
240             'value' => {
241             'entity-type' => 'item',
242             'id' => 'Q5',
243             'numeric-id' => 5,
244             },
245             },
246             'property' => 'P31',
247             'snaktype' => 'value',
248             },
249             'rank' => 'normal',
250             'type' => 'statement',
251             }],
252             },
253             };
254              
255             # Get object.
256             my $obj = struct2obj($struct_hr);
257              
258             # Dump object.
259             p $obj;
260              
261             # Output:
262             # Wikibase::Datatype::Sense {
263             # Parents Mo::Object
264             # public methods (7) : BUILD, can (UNIVERSAL), DOES (UNIVERSAL), check_array_object (Mo::utils), check_number_of_items (Mo::utils), isa (UNIVERSAL), VERSION (UNIVERSAL)
265             # private methods (1) : __ANON__ (Mo)
266             # internals: {
267             # glosses [
268             # [0] Wikibase::Datatype::Value::Monolingual,
269             # [1] Wikibase::Datatype::Value::Monolingual
270             # ],
271             # id "ID",
272             # statements [
273             # [0] Wikibase::Datatype::Statement
274             # ]
275             # }
276             # }
277              
278             =head1 DEPENDENCIES
279              
280             L<Error::Pure>,
281             L<Exporter>,
282             L<Readonly>,
283             L<Wikibase::Datatype::Sense>,
284             L<Wikibase::Datatype::Struct::Language>,
285             L<Wikibase::Datatype::Struct::Statement>.
286              
287             =head1 SEE ALSO
288              
289             =over
290              
291             =item L<Wikibase::Datatype::Struct>
292              
293             Wikibase structure serialization.
294              
295             =item L<Wikibase::Datatype::Sense>
296              
297             Wikibase sense datatype.
298              
299             =back
300              
301             =head1 REPOSITORY
302              
303             L<https://github.com/michal-josef-spacek/Wikibase-Datatype-Struct>
304              
305             =head1 AUTHOR
306              
307             Michal Josef Špaček L<mailto:skim@cpan.org>
308              
309             L<http://skim.cz>
310              
311             =head1 LICENSE AND COPYRIGHT
312              
313             © Michal Josef Špaček 2020-2021
314              
315             BSD 2-Clause License
316              
317             =head1 VERSION
318              
319             0.08
320              
321             =cut