Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/OpenAPI.pm |
Statements | Executed 36 statements in 838µs |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
3 | 3 | 1 | 219µs | 219µs | CORE:regcomp (opcode) | Module::Runtime::
35 | 2 | 1 | 112µs | 112µs | CORE:match (opcode) | Module::Runtime::
30 | 1 | 1 | 64µs | 64µs | CORE:subst (opcode) | Module::Runtime::
1 | 1 | 1 | 48µs | 51µs | BEGIN@1.321 | Module::Runtime::
1 | 1 | 1 | 47µs | 641µs | BEGIN@11 | JSON::Schema::Modern::Vocabulary::OpenAPI::
5 | 1 | 1 | 18µs | 18µs | _traverse_keyword_externalDocs | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 14µs | 33µs | BEGIN@13 | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 11µs | 50µs | BEGIN@17 | JSON::Schema::Modern::Vocabulary::OpenAPI::
6 | 6 | 1 | 11µs | 11µs | CORE:qr (opcode) | Module::Runtime::
1 | 1 | 1 | 10µs | 19µs | BEGIN@15 | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 10µs | 10µs | BEGIN@9 | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 8µs | 24µs | BEGIN@14 | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 7µs | 17µs | BEGIN@16 | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 5µs | 188µs | BEGIN@10 | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 5µs | 144µs | BEGIN@18 | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 5µs | 36µs | BEGIN@2.322 | Module::Runtime::
1 | 1 | 1 | 4µs | 90µs | BEGIN@12 | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 3µs | 3µs | keywords | JSON::Schema::Modern::Vocabulary::OpenAPI::
0 | 0 | 0 | 0s | 0s | _eval_keyword_discriminator | JSON::Schema::Modern::Vocabulary::OpenAPI::
0 | 0 | 0 | 0s | 0s | _eval_keyword_example | JSON::Schema::Modern::Vocabulary::OpenAPI::
0 | 0 | 0 | 0s | 0s | _eval_keyword_externalDocs | JSON::Schema::Modern::Vocabulary::OpenAPI::
0 | 0 | 0 | 0s | 0s | _eval_keyword_xml | JSON::Schema::Modern::Vocabulary::OpenAPI::
0 | 0 | 0 | 0s | 0s | _traverse_keyword_discriminator | JSON::Schema::Modern::Vocabulary::OpenAPI::
0 | 0 | 0 | 0s | 0s | _traverse_keyword_example | JSON::Schema::Modern::Vocabulary::OpenAPI::
0 | 0 | 0 | 0s | 0s | _traverse_keyword_xml | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 0s | 0s | vocabulary | JSON::Schema::Modern::Vocabulary::OpenAPI::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | 2 | 31µs | 2 | 54µs | # spent 51µs (48+3) within Module::Runtime::BEGIN@1.321 which was called:
# once (48µs+3µs) by Module::Runtime::require_module at line 1 # spent 51µs making 1 call to Module::Runtime::BEGIN@1.321
# spent 3µs making 1 call to strict::import |
2 | 2 | 40µs | 2 | 67µs | # spent 36µs (5+31) within Module::Runtime::BEGIN@2.322 which was called:
# once (5µs+31µs) by Module::Runtime::require_module at line 2 # spent 36µs making 1 call to Module::Runtime::BEGIN@2.322
# spent 31µs making 1 call to warnings::import |
3 | package JSON::Schema::Modern::Vocabulary::OpenAPI; | ||||
4 | # vim: set ts=8 sts=2 sw=2 tw=100 et : | ||||
5 | # ABSTRACT: Implementation of the JSON Schema OpenAPI vocabulary | ||||
6 | |||||
7 | 1 | 0s | our $VERSION = '0.037'; | ||
8 | |||||
9 | 2 | 27µs | 1 | 10µs | # spent 10µs within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@9 which was called:
# once (10µs+0s) by Module::Runtime::require_module at line 9 # spent 10µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@9 |
10 | 2 | 21µs | 2 | 371µs | # spent 188µs (5+183) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@10 which was called:
# once (5µs+183µs) by Module::Runtime::require_module at line 10 # spent 188µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@10
# spent 183µs making 1 call to Moo::import |
11 | 3 | 26µs | 3 | 1.23ms | # spent 641µs (47+594) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@11 which was called:
# once (47µs+594µs) by Module::Runtime::require_module at line 11 # spent 641µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@11
# spent 576µs making 1 call to strictures::import
# spent 18µs making 1 call to strictures::VERSION |
12 | 2 | 29µs | 2 | 176µs | # spent 90µs (4+86) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@12 which was called:
# once (4µs+86µs) by Module::Runtime::require_module at line 12 # spent 90µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@12
# spent 86µs making 1 call to experimental::import |
13 | 2 | 23µs | 2 | 35µs | # spent 33µs (14+19) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@13 which was called:
# once (14µs+19µs) by Module::Runtime::require_module at line 13 # spent 33µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@13
# spent 2µs making 1 call to if::import |
14 | 2 | 17µs | 2 | 26µs | # spent 24µs (8+16) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@14 which was called:
# once (8µs+16µs) by Module::Runtime::require_module at line 14 # spent 24µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@14
# spent 2µs making 1 call to if::unimport |
15 | 2 | 16µs | 2 | 19µs | # spent 19µs (10+9) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@15 which was called:
# once (10µs+9µs) by Module::Runtime::require_module at line 15 # spent 19µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@15
# spent 0s making 1 call to if::unimport |
16 | 2 | 17µs | 2 | 17µs | # spent 17µs (7+10) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@16 which was called:
# once (7µs+10µs) by Module::Runtime::require_module at line 16 # spent 17µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@16
# spent 0s making 1 call to if::unimport |
17 | 3 | 27µs | 3 | 89µs | # spent 50µs (11+39) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@17 which was called:
# once (11µs+39µs) by Module::Runtime::require_module at line 17 # spent 50µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@17
# spent 35µs making 1 call to Exporter::import
# spent 4µs making 1 call to UNIVERSAL::VERSION |
18 | 2 | 527µs | 2 | 283µs | # spent 144µs (5+139) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@18 which was called:
# once (5µs+139µs) by Module::Runtime::require_module at line 18 # spent 144µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@18
# spent 139µs making 1 call to namespace::clean::import |
19 | |||||
20 | 1 | 1µs | 1 | 299µs | with 'JSON::Schema::Modern::Vocabulary'; # spent 299µs making 1 call to Moo::with |
21 | |||||
22 | # spent 0s within JSON::Schema::Modern::Vocabulary::OpenAPI::vocabulary which was called:
# once (0s+0s) by JSON::Schema::Modern::add_vocabulary at line 709 of JSON/Schema/Modern.pm | ||||
23 | 1 | 2µs | 'https://spec.openapis.org/oas/3.1/vocab/base' => 'draft2020-12', | ||
24 | } | ||||
25 | |||||
26 | # spent 3µs within JSON::Schema::Modern::Vocabulary::OpenAPI::keywords which was called:
# once (3µs+0s) by JSON::Schema::Modern::_traverse_subschema at line 475 of JSON/Schema/Modern.pm | ||||
27 | 1 | 3µs | qw(discriminator example externalDocs xml); | ||
28 | } | ||||
29 | |||||
30 | sub _traverse_keyword_discriminator ($self, $schema, $state) { | ||||
31 | return if not assert_keyword_type($state, $schema, 'object'); | ||||
32 | |||||
33 | # "the discriminator field MUST be a required field" | ||||
34 | return E($state, 'missing required field propertyName') | ||||
35 | if not exists $schema->{discriminator}{propertyName}; | ||||
36 | return E({ %$state, _schema_path_suffix => 'propertyName' }, 'discriminator propertyName is not a string') | ||||
37 | if not is_type('string', $schema->{discriminator}{propertyName}); | ||||
38 | |||||
39 | my $valid = 1; | ||||
40 | if (exists $schema->{discriminator}{mapping}) { | ||||
41 | return if not assert_keyword_type({ %$state, _schema_path_suffix => 'mapping' }, $schema, 'object'); | ||||
42 | return E({ %$state, _schema_path_suffix => 'mapping' }, 'discriminator mapping is not an object ') | ||||
43 | if not is_type('object', $schema->{discriminator}{mapping}); | ||||
44 | foreach my $mapping_key (sort keys $schema->{discriminator}{mapping}->%*) { | ||||
45 | my $uri = $schema->{discriminator}{mapping}{$mapping_key}; | ||||
46 | $valid = E({ %$state, _schema_path_suffix => [ 'mapping', $mapping_key ] }, 'discriminator mapping value for "%s" is not a string', $mapping_key), next if not is_type('string', $uri); | ||||
47 | } | ||||
48 | } | ||||
49 | |||||
50 | $valid = E($state, 'missing sibling keyword: one of oneOf, anyOf, allOf') | ||||
51 | if not grep exists $schema->{$_}, qw(oneOf anyOf allOf); | ||||
52 | |||||
53 | return 1; | ||||
54 | } | ||||
55 | |||||
56 | sub _eval_keyword_discriminator ($self, $data, $schema, $state) { | ||||
57 | # Note: the spec is unclear of the expected behaviour when the data instance is not an object | ||||
58 | return 1 if not is_type('object', $data); | ||||
59 | |||||
60 | my $discriminator_key = $schema->{discriminator}{propertyName}; | ||||
61 | |||||
62 | # property with name <propertyName> MUST be present in the data payload | ||||
63 | return E($state, 'missing required discriminator field "%s"', $discriminator_key) | ||||
64 | if not exists $data->{$discriminator_key}; | ||||
65 | |||||
66 | my $discriminator_value = $data->{$discriminator_key}; | ||||
67 | |||||
68 | # if /components/$discriminator_value exists, that schema must validate | ||||
69 | my $uri = Mojo::URL->new->fragment(jsonp('', qw(components schemas), $discriminator_value)) | ||||
70 | ->to_abs($state->{initial_schema_uri}); | ||||
71 | if (my $component_schema_info = $state->{evaluator}->_fetch_from_uri($uri)) { | ||||
72 | $state = { %$state, _schema_path_suffix => 'propertyName' }; | ||||
73 | } | ||||
74 | elsif (exists $schema->{discriminator}{mapping} and exists $schema->{discriminator}{mapping}{$discriminator_value}) { | ||||
75 | # use 'mapping' to determine which schema to use. | ||||
76 | $uri = Mojo::URL->new($schema->{discriminator}{mapping}{$discriminator_value}); | ||||
77 | $state = { %$state, _schema_path_suffix => [ 'mapping', $discriminator_value ] }; | ||||
78 | } | ||||
79 | else { | ||||
80 | # If the discriminator value does not match an implicit or explicit mapping, no schema can be | ||||
81 | # determined and validation SHOULD fail. | ||||
82 | return E($state, 'invalid %s: "%s"', $discriminator_key, $discriminator_value); | ||||
83 | } | ||||
84 | |||||
85 | return E($state, 'subschema for %s: %s is invalid', $discriminator_key, $discriminator_value) | ||||
86 | if not $self->eval_subschema_at_uri($data, $schema, $state, $uri); | ||||
87 | return 1; | ||||
88 | } | ||||
89 | |||||
90 | sub _traverse_keyword_example { 1 } | ||||
91 | |||||
92 | sub _eval_keyword_example ($self, $data, $schema, $state) { | ||||
93 | annotate_self($state, $schema); | ||||
94 | } | ||||
95 | |||||
96 | # until we do something with these values, we do not bother checking the structure | ||||
97 | 5 | 13µs | # spent 18µs within JSON::Schema::Modern::Vocabulary::OpenAPI::_traverse_keyword_externalDocs which was called 5 times, avg 4µs/call:
# 5 times (18µs+0s) by JSON::Schema::Modern::_traverse_subschema at line 487 of JSON/Schema/Modern.pm, avg 4µs/call | ||
98 | |||||
99 | sub _eval_keyword_externalDocs { goto \&_eval_keyword_example } | ||||
100 | |||||
101 | # until we do something with these values, we do not bother checking the structure | ||||
102 | sub _traverse_keyword_xml { 1 } | ||||
103 | |||||
104 | sub _eval_keyword_xml { goto \&_eval_keyword_example } | ||||
105 | |||||
106 | 1 | 4µs | 1; | ||
107 | |||||
108 | 1 | 14µs | 1 | 285µs | __END__ # spent 285µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__[B/Hooks/EndOfScope/XS.pm:26] |
# spent 112µs within Module::Runtime::CORE:match which was called 35 times, avg 3µs/call:
# 30 times (107µs+0s) by Module::Runtime::is_module_name at line 219 of Module/Runtime.pm, avg 4µs/call
# 5 times (5µs+0s) by Module::Runtime::import at line 140 of Module/Runtime.pm, avg 1µs/call | |||||
# spent 11µs within Module::Runtime::CORE:qr which was called 6 times, avg 2µs/call:
# once (3µs+0s) by JSON::Schema::Modern::BEGIN@28 at line 185 of Module/Runtime.pm
# once (3µs+0s) by JSON::Schema::Modern::BEGIN@28 at line 176 of Module/Runtime.pm
# once (2µs+0s) by JSON::Schema::Modern::BEGIN@28 at line 191 of Module/Runtime.pm
# once (1µs+0s) by JSON::Schema::Modern::BEGIN@28 at line 200 of Module/Runtime.pm
# once (1µs+0s) by JSON::Schema::Modern::BEGIN@28 at line 188 of Module/Runtime.pm
# once (1µs+0s) by JSON::Schema::Modern::BEGIN@28 at line 202 of Module/Runtime.pm | |||||
# spent 219µs within Module::Runtime::CORE:regcomp which was called 3 times, avg 73µs/call:
# once (142µs+0s) by JSON::Schema::Modern::BEGIN@28 at line 191 of Module/Runtime.pm
# once (57µs+0s) by JSON::Schema::Modern::BEGIN@28 at line 202 of Module/Runtime.pm
# once (20µs+0s) by Module::Runtime::is_module_name at line 219 of Module/Runtime.pm | |||||
# spent 64µs within Module::Runtime::CORE:subst which was called 30 times, avg 2µs/call:
# 30 times (64µs+0s) by Module::Runtime::module_notional_filename at line 263 of Module/Runtime.pm, avg 2µs/call |