| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
38
|
|
|
38
|
|
27526
|
use strict; |
|
|
38
|
|
|
|
|
91
|
|
|
|
38
|
|
|
|
|
1672
|
|
|
2
|
38
|
|
|
38
|
|
211
|
use warnings; |
|
|
38
|
|
|
|
|
81
|
|
|
|
38
|
|
|
|
|
3515
|
|
|
3
|
|
|
|
|
|
|
package JSON::Schema::Modern::Vocabulary; |
|
4
|
|
|
|
|
|
|
# vim: set ts=8 sts=2 sw=2 tw=100 et : |
|
5
|
|
|
|
|
|
|
# ABSTRACT: Base role for JSON Schema vocabulary classes |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
our $VERSION = '0.632'; |
|
8
|
|
|
|
|
|
|
|
|
9
|
38
|
|
|
38
|
|
727
|
use 5.020; |
|
|
38
|
|
|
|
|
169
|
|
|
10
|
38
|
|
|
38
|
|
209
|
use Moo::Role; |
|
|
38
|
|
|
|
|
82
|
|
|
|
38
|
|
|
|
|
328
|
|
|
11
|
38
|
|
|
38
|
|
22423
|
use strictures 2; |
|
|
38
|
|
|
|
|
336
|
|
|
|
38
|
|
|
|
|
1643
|
|
|
12
|
38
|
|
|
38
|
|
19262
|
use stable 0.031 'postderef'; |
|
|
38
|
|
|
|
|
729
|
|
|
|
38
|
|
|
|
|
274
|
|
|
13
|
38
|
|
|
38
|
|
8437
|
use experimental 'signatures'; |
|
|
38
|
|
|
|
|
90
|
|
|
|
38
|
|
|
|
|
188
|
|
|
14
|
38
|
|
|
38
|
|
3378
|
no autovivification warn => qw(fetch store exists delete); |
|
|
38
|
|
|
|
|
86
|
|
|
|
38
|
|
|
|
|
281
|
|
|
15
|
38
|
|
|
38
|
|
3399
|
use if "$]" >= 5.022, experimental => 're_strict'; |
|
|
38
|
|
|
|
|
84
|
|
|
|
38
|
|
|
|
|
985
|
|
|
16
|
38
|
|
|
38
|
|
3803
|
no if "$]" >= 5.031009, feature => 'indirect'; |
|
|
38
|
|
|
|
|
83
|
|
|
|
38
|
|
|
|
|
3079
|
|
|
17
|
38
|
|
|
38
|
|
266
|
no if "$]" >= 5.033001, feature => 'multidimensional'; |
|
|
38
|
|
|
|
|
98
|
|
|
|
38
|
|
|
|
|
2690
|
|
|
18
|
38
|
|
|
38
|
|
225
|
no if "$]" >= 5.033006, feature => 'bareword_filehandles'; |
|
|
38
|
|
|
|
|
125
|
|
|
|
38
|
|
|
|
|
2605
|
|
|
19
|
38
|
|
|
38
|
|
278
|
no if "$]" >= 5.041009, feature => 'smartmatch'; |
|
|
38
|
|
|
|
|
73
|
|
|
|
38
|
|
|
|
|
1951
|
|
|
20
|
38
|
|
|
38
|
|
234
|
no feature 'switch'; |
|
|
38
|
|
|
|
|
100
|
|
|
|
38
|
|
|
|
|
1655
|
|
|
21
|
38
|
|
|
38
|
|
246
|
use JSON::Schema::Modern::Utilities qw(jsonp assert_keyword_type abort); |
|
|
38
|
|
|
|
|
79
|
|
|
|
38
|
|
|
|
|
3308
|
|
|
22
|
38
|
|
|
38
|
|
275
|
use Carp (); |
|
|
38
|
|
|
|
|
72
|
|
|
|
38
|
|
|
|
|
1071
|
|
|
23
|
38
|
|
|
38
|
|
190
|
use namespace::clean; |
|
|
38
|
|
|
|
|
90
|
|
|
|
38
|
|
|
|
|
351
|
|
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
our @CARP_NOT = qw(JSON::Schema::Modern); |
|
26
|
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
requires qw(vocabulary keywords); |
|
28
|
|
|
|
|
|
|
|
|
29
|
3
|
|
|
3
|
1
|
9
|
sub evaluation_order { 999 } # override, if needed |
|
30
|
|
|
|
|
|
|
|
|
31
|
0
|
|
|
0
|
0
|
0
|
sub BUILD { die 'these classes are never instantiated' } |
|
32
|
|
|
|
|
|
|
|
|
33
|
0
|
|
|
0
|
1
|
0
|
sub traverse ($class, $schema, $state) { |
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
34
|
0
|
|
|
|
|
0
|
$state->{evaluator}->_traverse_subschema($schema, $state); |
|
35
|
|
|
|
|
|
|
} |
|
36
|
|
|
|
|
|
|
|
|
37
|
6794
|
|
|
6794
|
1
|
14664
|
sub traverse_subschema ($class, $schema, $state) { |
|
|
6794
|
|
|
|
|
14034
|
|
|
|
6794
|
|
|
|
|
12953
|
|
|
|
6794
|
|
|
|
|
12492
|
|
|
|
6794
|
|
|
|
|
11164
|
|
|
38
|
|
|
|
|
|
|
$state->{evaluator}->_traverse_subschema($schema->{$state->{keyword}}, |
|
39
|
6794
|
|
|
|
|
142247
|
+{ %$state, keyword_path => $state->{keyword_path}.'/'.$state->{keyword} }); |
|
40
|
|
|
|
|
|
|
} |
|
41
|
|
|
|
|
|
|
|
|
42
|
3821
|
|
|
3821
|
1
|
8577
|
sub traverse_array_schemas ($class, $schema, $state) { |
|
|
3821
|
|
|
|
|
8214
|
|
|
|
3821
|
|
|
|
|
7636
|
|
|
|
3821
|
|
|
|
|
7244
|
|
|
|
3821
|
|
|
|
|
6391
|
|
|
43
|
3821
|
50
|
|
|
|
17304
|
return if not assert_keyword_type($state, $schema, 'array'); |
|
44
|
3821
|
50
|
|
|
|
18351
|
return E($state, '%s array is empty', $state->{keyword}) if not $schema->{$state->{keyword}}->@*; |
|
45
|
|
|
|
|
|
|
|
|
46
|
3821
|
|
|
|
|
8282
|
my $valid = 1; |
|
47
|
3821
|
|
|
|
|
21410
|
foreach my $idx (0 .. $schema->{$state->{keyword}}->$#*) { |
|
48
|
|
|
|
|
|
|
$valid = 0 if not $state->{evaluator}->_traverse_subschema($schema->{$state->{keyword}}[$idx], |
|
49
|
6840
|
100
|
|
|
|
152287
|
+{ %$state, keyword_path => $state->{keyword_path}.'/'.$state->{keyword}.'/'.$idx }); |
|
50
|
|
|
|
|
|
|
} |
|
51
|
3821
|
|
|
|
|
18214
|
return $valid; |
|
52
|
|
|
|
|
|
|
} |
|
53
|
|
|
|
|
|
|
|
|
54
|
6983
|
|
|
6983
|
1
|
15578
|
sub traverse_object_schemas ($class, $schema, $state) { |
|
|
6983
|
|
|
|
|
14711
|
|
|
|
6983
|
|
|
|
|
13438
|
|
|
|
6983
|
|
|
|
|
12383
|
|
|
|
6983
|
|
|
|
|
12807
|
|
|
55
|
6983
|
100
|
|
|
|
30323
|
return if not assert_keyword_type($state, $schema, 'object'); |
|
56
|
|
|
|
|
|
|
|
|
57
|
6980
|
|
|
|
|
17324
|
my $valid = 1; |
|
58
|
6980
|
|
|
|
|
49039
|
foreach my $property (sort keys $schema->{$state->{keyword}}->%*) { |
|
59
|
|
|
|
|
|
|
$valid = 0 if not $state->{evaluator}->_traverse_subschema($schema->{$state->{keyword}}{$property}, |
|
60
|
10311
|
100
|
|
|
|
110039
|
+{ %$state, keyword_path => jsonp($state->{keyword_path}, $state->{keyword}, $property) }); |
|
61
|
|
|
|
|
|
|
} |
|
62
|
6980
|
|
|
|
|
33725
|
return $valid; |
|
63
|
|
|
|
|
|
|
} |
|
64
|
|
|
|
|
|
|
|
|
65
|
280
|
|
|
280
|
1
|
569
|
sub traverse_property_schema ($class, $schema, $state, $property) { |
|
|
280
|
|
|
|
|
622
|
|
|
|
280
|
|
|
|
|
552
|
|
|
|
280
|
|
|
|
|
549
|
|
|
|
280
|
|
|
|
|
543
|
|
|
|
280
|
|
|
|
|
491
|
|
|
66
|
280
|
50
|
|
|
|
870
|
return if not assert_keyword_type($state, $schema, 'object'); |
|
67
|
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
$state->{evaluator}->_traverse_subschema($schema->{$state->{keyword}}{$property}, |
|
69
|
280
|
|
|
|
|
3232
|
+{ %$state, keyword_path => jsonp($state->{keyword_path}, $state->{keyword}, $property) }); |
|
70
|
|
|
|
|
|
|
} |
|
71
|
|
|
|
|
|
|
|
|
72
|
13685
|
|
|
13685
|
1
|
31895
|
sub eval ($class, $data, $schema, $state) { |
|
|
13685
|
|
|
|
|
27097
|
|
|
|
13685
|
|
|
|
|
25165
|
|
|
|
13685
|
|
|
|
|
25548
|
|
|
|
13685
|
|
|
|
|
25198
|
|
|
|
13685
|
|
|
|
|
23110
|
|
|
73
|
13685
|
|
|
|
|
80763
|
$state->{evaluator}->_eval_subschema($data, $schema, $state); |
|
74
|
|
|
|
|
|
|
} |
|
75
|
|
|
|
|
|
|
|
|
76
|
3960
|
|
|
3960
|
1
|
10323
|
sub eval_subschema_at_uri ($class, $data, $schema, $state, $uri) { |
|
|
3960
|
|
|
|
|
9853
|
|
|
|
3960
|
|
|
|
|
9041
|
|
|
|
3960
|
|
|
|
|
8513
|
|
|
|
3960
|
|
|
|
|
7714
|
|
|
|
3960
|
|
|
|
|
7885
|
|
|
|
3960
|
|
|
|
|
7550
|
|
|
77
|
3960
|
|
|
|
|
28083
|
my $schema_info = $state->{evaluator}->_fetch_from_uri($uri); |
|
78
|
3960
|
100
|
|
|
|
32141
|
abort($state, 'EXCEPTION: unable to find resource "%s"', $uri) if not $schema_info; |
|
79
|
|
|
|
|
|
|
abort($state, 'EXCEPTION: bad reference to "%s": not a schema', $schema_info->{canonical_uri}) |
|
80
|
3954
|
100
|
|
|
|
27291
|
if $schema_info->{document}->get_entity_at_location($schema_info->{document_path}) ne 'schema'; |
|
81
|
|
|
|
|
|
|
|
|
82
|
3951
|
|
|
|
|
21698
|
my $scope_uri = $schema_info->{canonical_uri}->clone->fragment(undef); |
|
83
|
3951
|
100
|
|
|
|
424640
|
push $state->{dynamic_scope}->@*, $scope_uri if $state->{dynamic_scope}->[-1] ne $scope_uri; |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
return $state->{evaluator}->_eval_subschema($data, $schema_info->{schema}, |
|
86
|
|
|
|
|
|
|
+{ |
|
87
|
|
|
|
|
|
|
%$state, |
|
88
|
|
|
|
|
|
|
# keyword is assumed to be json pointer-encoded (if a suffix path is needed), so we just concat |
|
89
|
|
|
|
|
|
|
traversed_keyword_path => $state->{traversed_keyword_path}.$state->{keyword_path}.'/'.$state->{keyword}, |
|
90
|
|
|
|
|
|
|
initial_schema_uri => $schema_info->{canonical_uri}, |
|
91
|
3951
|
|
|
|
|
1593572
|
$schema_info->%{qw(document specification_version vocabularies)}, |
|
92
|
|
|
|
|
|
|
keyword_path => '', |
|
93
|
|
|
|
|
|
|
}); |
|
94
|
|
|
|
|
|
|
} |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
1; |
|
97
|
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
__END__ |