File Coverage

blib/lib/JSON/Path.pm
Criterion Covered Total %
statement 80 86 93.0
branch 9 14 64.2
condition 7 9 77.7
subroutine 23 23 100.0
pod 11 11 100.0
total 130 143 90.9


line stmt bran cond sub pod time code
1             package JSON::Path;
2             $JSON::Path::VERSION = '1.0.6';
3 14     14   2909262 use strict;
  14         29  
  14         502  
4 14     14   140 use warnings;
  14         44  
  14         816  
5              
6             # VERSION
7              
8 14     14   6357 use Exporter::Shiny qw/ jpath jpath1 jpath_map /;
  14         91251  
  14         151  
9             our $AUTHORITY = 'cpan:POPEFELIX';
10             our $Safe = 1;
11              
12 14     14   1368 use Carp;
  14         38  
  14         1136  
13 14     14   7284 use JSON::MaybeXS qw/decode_json/;
  14         180980  
  14         1183  
14 14     14   9105 use JSON::Path::Evaluator;
  14         84  
  14         317  
15 14     14   2529 use Scalar::Util qw[blessed];
  14         31  
  14         1068  
16 14     14   7554 use LV ();
  14         72890  
  14         728  
17              
18 14     14   249 use overload '""' => \&to_string;
  14         94  
  14         178  
19              
20             sub jpath {
21 3     3 1 9 my ( $object, $expression ) = @_;
22 3         25 my @return = __PACKAGE__->new($expression)->values($object);
23             }
24              
25             sub jpath1 : lvalue {
26 4     4 1 266647 my ( $object, $expression ) = @_;
27 4         49 __PACKAGE__->new($expression)->value($object);
28             }
29              
30             sub jpath_map (&$$) {
31 1     1 1 224490 my ( $coderef, $object, $expression ) = @_;
32 1         9 return __PACKAGE__->new($expression)->map( $object, $coderef );
33             }
34              
35             sub new {
36 34     34 1 3356686 my ( $class, $expression ) = @_;
37 34 50 33     186 return $expression
38             if blessed($expression) && $expression->isa(__PACKAGE__);
39 34         180 return bless \$expression, $class;
40             }
41              
42             sub to_string {
43 74     74 1 252 my ($self) = @_;
44 74         1000 return $$self;
45             }
46              
47             sub paths {
48 7     7 1 1029 my ( $self, $object ) = @_;
49 7         250 my @paths = JSON::Path::Evaluator::evaluate_jsonpath( $object, "$self", want_path => 1);
50 7         82 return @paths;
51             }
52              
53             sub get {
54 9     9 1 74 my ( $self, $object ) = @_;
55 9         40 my @values = $self->values($object);
56 9 100       45 return wantarray ? @values : $values[0];
57             }
58              
59             sub set {
60 10     10 1 631 my ( $self, $object, $value, $limit ) = @_;
61              
62 10 50       38 if ( !ref $object ) {
63             # warn if not called internally. If called internally (i.e. from value()) we will already have warned.
64 0         0 my @c = caller(0);
65 0 0       0 if ( $c[1] !~ /JSON\/Path\.pm$/ ) {
66 0         0 carp qq{Useless attempt to set a value on a non-reference};
67             }
68             }
69 10         18 my $count = 0;
70 10         133 my @refs = JSON::Path::Evaluator::evaluate_jsonpath( $object, "$self", want_ref => 1 );
71 10         37 for my $ref (@refs) {
72 12         23 ${$ref} = $value;
  12         27  
73 12         25 ++$count;
74 12 100 100     71 last if $limit && ( $count >= $limit );
75             }
76 10         53 return $count;
77             }
78              
79             sub value : lvalue {
80 13     13 1 6654 my ( $self, $object ) = @_;
81             LV::lvalue(
82             get => sub {
83 8     8   477 my ($value) = $self->get($object);
84 8         63 return $value;
85             },
86             set => sub {
87 6     6   90 my $value = shift;
88             # do some caller() magic to warn at the right place
89 6 50       21 if ( !ref $object ) {
90 0         0 my @c = caller(2);
91 0         0 my ( $filename, $line ) = @c[ 1, 2 ];
92 0         0 warn qq{Useless attempt to set a value on a non-reference at $filename line $line\n};
93             }
94 6         21 $self->set( $object, $value, 1 );
95             },
96 13         151 );
97             }
98              
99             sub values {
100 28     28 1 9211 my ( $self, $object ) = @_;
101 28 100 100     491 croak q{non-safe evaluation, died} if "$self" =~ /\?\(/ && $JSON::Path::Safe;
102              
103 27         86 return JSON::Path::Evaluator::evaluate_jsonpath( $object, "$self", script_engine => 'perl' );
104             }
105              
106             sub map {
107 1     1 1 2 my ( $self, $object, $coderef ) = @_;
108 1         2 my $count;
109 1         3 foreach my $path ( $self->paths( $object ) ) {
110 4         8 my ($ref) = JSON::Path::Evaluator::evaluate_jsonpath( $object, $path, want_ref => 1 );
111 4         6 ++$count;
112 4         4 my $value = do {
113 14     14   14457 no warnings 'numeric';
  14         53  
  14         2085  
114 4         5 local $_ = ${$ref};
  4         6  
115 4         10 local $. = $path;
116 4         8 scalar $coderef->();
117             };
118 4         14 ${$ref} = $value;
  4         7  
119             }
120 1         4 return $count;
121             }
122              
123             1;
124              
125             __END__