File Coverage

blib/lib/JSON/Schema/Modern/Vocabulary.pm
Criterion Covered Total %
statement 106 113 93.8
branch 15 18 83.3
condition n/a
subroutine 24 26 92.3
pod 8 9 88.8
total 153 166 92.1


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__