File Coverage

blib/lib/AtteanX/Parser/JSONLD.pm
Criterion Covered Total %
statement 77 112 68.7
branch 6 16 37.5
condition 1 3 33.3
subroutine 24 31 77.4
pod 14 17 82.3
total 122 179 68.1


line stmt bran cond sub pod time code
1 1     1   55592 use v5.14;
  1         4  
2 1     1   8 use warnings;
  1         3  
  1         61  
3              
4             =head1 NAME
5              
6             AtteanX::Parser::JSONLD - JSONLD Parser
7              
8             =head1 VERSION
9              
10             This document describes AtteanX::Parser::JSONLD version 0.000_02
11              
12             =head1 SYNOPSIS
13              
14             use Attean;
15             my $parser = Attean->get_parser('JSONLD')->new();
16             $parser->parse_cb_from_io( $fh );
17              
18             =head1 DESCRIPTION
19              
20             ...
21              
22             =head1 METHODS
23              
24             =over 4
25              
26             =cut
27              
28             package AtteanX::Parser::JSONLD::Handler {
29 1     1   13 use v5.18;
  1         3  
30 1     1   8 use autodie;
  1         2  
  1         10  
31 1     1   5565 use Moo;
  1         3  
  1         11  
32 1     1   596 use Attean::RDF;
  1         2  
  1         27  
33 1     1   950 use Encode qw(decode_utf8 encode_utf8);
  1         3  
  1         75  
34             extends 'JSONLD';
35 1     1   25 use namespace::clean;
  1         3  
  1         15  
36            
37             sub default_graph {
38 3     3 1 923 return iri('tag:gwilliams@cpan.org,2010-01-01:Attean:DEFAULT');
39             }
40              
41             sub add_quad {
42 1     1 1 1695 my $self = shift;
43 1         2 my $quad = shift;
44 1         2 my $ds = shift;
45 1         27 $ds->add_quad($quad);
46             }
47              
48             sub new_dataset {
49 2     2 1 3869 my $self = shift;
50 2         19 my $store = Attean->get_store('Memory')->new();
51 2         49691 return $store;
52             }
53            
54             sub new_triple {
55 0     0 1 0 my $self = shift;
56 0         0 foreach my $v (@_) {
57 0 0       0 Carp::confess "not a term object" unless (ref($v));
58             }
59 0         0 return triple(@_);
60             }
61            
62             sub new_quad {
63 1     1 1 305 my $self = shift;
64 1         4 foreach my $v (@_) {
65 4 50 33     78 unless (ref($v) and $v->does('Attean::API::Term')) {
66             # warn "not a term object: $v";
67 0         0 return;
68             }
69             }
70 1         17 return quad(@_);
71             }
72            
73             sub skolem_prefix {
74 1     1 0 3 my $self = shift;
75 1         3 return 'tag:gwilliams@cpan.org,2019-12:JSONLD:skolem:';
76             }
77             sub new_graphname {
78 0     0 1 0 my $self = shift;
79 0         0 my $value = shift;
80 0 0       0 if ($value =~ /^_:(.+)$/) {
81 0         0 $value = $self->skolem_prefix() . $1;
82             }
83 0         0 return $self->new_iri($value);
84             }
85              
86             sub new_iri {
87 2     2 1 6865 my $self = shift;
88 2         9 return iri(shift);
89             }
90            
91             sub new_blank {
92 0     0 1 0 my $self = shift;
93 0         0 return blank(@_);
94             }
95            
96             sub new_lang_literal {
97 0     0 1 0 my $self = shift;
98 0         0 my $value = shift;
99 0         0 my $lang = shift;
100 0         0 return langliteral($value, $lang);
101             }
102            
103             sub canonical_json {
104 0     0 0 0 my $class = shift;
105 0         0 my $value = shift;
106 0         0 my $j = JSON->new->utf8->allow_nonref->canonical(1);
107 0         0 my $v = $j->decode($value);
108 0         0 return $j->encode($v);
109             }
110              
111             sub new_dt_literal {
112 1     1 1 451 my $self = shift;
113 1         3 my $value = shift;
114 1         3 my $dt = shift;
115 1 50       5 if ($dt eq 'http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON') {
116 0         0 $value = decode_utf8($self->canonical_json(encode_utf8($value)));
117             }
118 1         6 return dtliteral($value, $dt);
119             }
120             }
121              
122             package AtteanX::Parser::JSONLD {
123 1     1   5221 use utf8;
  1         2  
  1         10  
124            
125             our $VERSION = '0.000_02';
126              
127 1     1   94 use Attean;
  1         3  
  1         10  
128 1     1   840 use JSON;
  1         8355  
  1         6  
129 1     1   1041 use JSONLD;
  1         75757  
  1         48  
130 1     1   9 use Moo;
  1         3  
  1         8  
131            
132             =item C<< canonical_media_type >>
133              
134             Returns the canonical media type for JSON-LD: application/ld+json.
135              
136             =cut
137              
138 1     1 1 4560 sub canonical_media_type { return "application/ld+json" }
139              
140             =item C<< media_types >>
141              
142             Returns a list of media types that may be parsed with the JSON-LD parser:
143             application/n-quads.
144              
145             =cut
146              
147             sub media_types {
148 0     0 1 0 return [qw(application/ld+json)];
149             }
150            
151             =item C<< file_extensions >>
152              
153             Returns a list of file extensions that may be parsed with the parser.
154              
155             =cut
156              
157 1     1 1 5 sub file_extensions { return [qw(jsonld json)] }
158            
159             with 'Attean::API::MixedStatementParser';
160             with 'Attean::API::AbbreviatingParser';
161             with 'Attean::API::PullParser';
162              
163              
164             =item C<< parse_iter_from_io( $fh ) >>
165              
166             Returns an iterator of L<Attean::API::Binding> objects that result from parsing
167             the data read from the L<IO::Handle> object C<< $fh >>.
168              
169             =cut
170              
171             sub parse_iter_from_io {
172 0     0 1 0 my $self = shift;
173 0         0 my $fh = shift;
174 0         0 my $bytes = do { local($/); <$fh> };
  0         0  
  0         0  
175 0         0 return $self->parse_iter_from_bytes($bytes);
176             }
177              
178             =item C<< parse_cb_from_bytes( $data ) >>
179              
180             Calls the C<< $parser->handler >> function once for each
181             L<Attean::API::Binding> object that result from parsing
182             the data read from the UTF-8 encoded byte string C<< $data >>.
183              
184             =cut
185              
186             sub parse_iter_from_bytes {
187 2     2 0 116093 my $self = shift;
188 2         7 my $bytes = shift;
189 2         36 my $j = JSON->new();
190 2         29 my $data = $j->decode($bytes);
191            
192 2         5 my %args;
193 2 50       19 if ($self->has_base) {
194 0         0 $args{base_iri} = $self->base;
195             }
196 2         44 my $jld = AtteanX::Parser::JSONLD::Handler->new(%args);
197 2         6050 my $qiter = $jld->to_rdf($data)->get_quads();
198              
199 2         11939 my $default_graph = $jld->default_graph();
200             my $iter = Attean::CodeIterator->new(generator => sub {
201 3     3   3270 my $q = $qiter->next;
202 3 100       497 return unless ($q);
203 1         4 my $g = $q->graph;
204 1         6 my $prefix = $jld->skolem_prefix();
205 1 50       6 if ($g->equals($default_graph)) {
    0          
206 1         21 return $q->as_triple;
207             } elsif (substr($g->value, 0, length($prefix)) eq $prefix) {
208 0         0 my $gb = $jld->new_blank(substr($g->value, length($prefix)));
209 0         0 my @terms = $q->values;
210 0         0 $terms[3] = $gb;
211 0         0 return $jld->new_quad(@terms);
212             } else {
213 0         0 return $q;
214             }
215 2         5183 }, item_type => 'Attean::API::TripleOrQuad')->materialize;
216 2         3730 return $iter;
217             }
218             }
219              
220             1;
221              
222             __END__
223              
224             =back
225              
226             =head1 BUGS
227              
228             Please report any bugs or feature requests to through the GitHub web interface
229             at L<https://github.com/kasei/atteanx-parser-jsonld/issues>.
230              
231             =head1 AUTHOR
232              
233             Gregory Todd Williams C<< <gwilliams@cpan.org> >>
234              
235             =head1 COPYRIGHT
236              
237             Copyright (c) 2020--2020 Gregory Todd Williams. This
238             program is free software; you can redistribute it and/or modify it under
239             the same terms as Perl itself.
240              
241             =cut