← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 15:33:55 2022
Reported on Wed Dec 14 15:40:04 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/OpenAPI.pm
StatementsExecuted 2053 statements in 5.41ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
2018112.46ms2.46msJSON::Schema::Modern::Vocabulary::OpenAPI::::keywordsJSON::Schema::Modern::Vocabulary::OpenAPI::keywords
11147µs51µsModule::Runtime::::BEGIN@1.320 Module::Runtime::BEGIN@1.320
11145µs72µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@13JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@13
11133µs370µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@10JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@10
11116µs16µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@9JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@9
11114µs908µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@11JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@11
11110µs56µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@17JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@17
1119µs24µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@14JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@14
1119µs49µsModule::Runtime::::BEGIN@2.321 Module::Runtime::BEGIN@2.321
1118µs111µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@12JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@12
1118µs16µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@15JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@15
1118µs15µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@16JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@16
1116µs321µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@18JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@18
5115µs5µsJSON::Schema::Modern::Vocabulary::OpenAPI::::_traverse_keyword_externalDocsJSON::Schema::Modern::Vocabulary::OpenAPI::_traverse_keyword_externalDocs
0000s0sJSON::Schema::Modern::Vocabulary::OpenAPI::::_eval_keyword_discriminatorJSON::Schema::Modern::Vocabulary::OpenAPI::_eval_keyword_discriminator
0000s0sJSON::Schema::Modern::Vocabulary::OpenAPI::::_eval_keyword_exampleJSON::Schema::Modern::Vocabulary::OpenAPI::_eval_keyword_example
0000s0sJSON::Schema::Modern::Vocabulary::OpenAPI::::_eval_keyword_externalDocsJSON::Schema::Modern::Vocabulary::OpenAPI::_eval_keyword_externalDocs
0000s0sJSON::Schema::Modern::Vocabulary::OpenAPI::::_eval_keyword_xmlJSON::Schema::Modern::Vocabulary::OpenAPI::_eval_keyword_xml
0000s0sJSON::Schema::Modern::Vocabulary::OpenAPI::::_traverse_keyword_discriminatorJSON::Schema::Modern::Vocabulary::OpenAPI::_traverse_keyword_discriminator
0000s0sJSON::Schema::Modern::Vocabulary::OpenAPI::::_traverse_keyword_exampleJSON::Schema::Modern::Vocabulary::OpenAPI::_traverse_keyword_example
0000s0sJSON::Schema::Modern::Vocabulary::OpenAPI::::_traverse_keyword_xmlJSON::Schema::Modern::Vocabulary::OpenAPI::_traverse_keyword_xml
1110s0sJSON::Schema::Modern::Vocabulary::OpenAPI::::vocabularyJSON::Schema::Modern::Vocabulary::OpenAPI::vocabulary
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1238µs255µs
# spent 51µs (47+4) within Module::Runtime::BEGIN@1.320 which was called: # once (47µs+4µs) by Module::Runtime::require_module at line 1
use strict;
# spent 51µs making 1 call to Module::Runtime::BEGIN@1.320 # spent 4µs making 1 call to strict::import
2288µs289µs
# spent 49µs (9+40) within Module::Runtime::BEGIN@2.321 which was called: # once (9µs+40µs) by Module::Runtime::require_module at line 2
use warnings;
# spent 49µs making 1 call to Module::Runtime::BEGIN@2.321 # spent 40µs making 1 call to warnings::import
3package 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
710sour $VERSION = '0.031';
8
9274µs116µs
# spent 16µs within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@9 which was called: # once (16µs+0s) by Module::Runtime::require_module at line 9
use 5.020;
10227µs2707µs
# spent 370µs (33+337) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@10 which was called: # once (33µs+337µs) by Module::Runtime::require_module at line 10
use Moo;
# spent 370µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@10 # spent 337µs making 1 call to Moo::import
11379µs31.80ms
# spent 908µs (14+894) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@11 which was called: # once (14µs+894µs) by Module::Runtime::require_module at line 11
use strictures 2;
# spent 908µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@11 # spent 875µs making 1 call to strictures::import # spent 19µs making 1 call to strictures::VERSION
12272µs2214µs
# spent 111µs (8+103) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@12 which was called: # once (8µs+103µs) by Module::Runtime::require_module at line 12
use experimental qw(signatures postderef);
# spent 111µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@12 # spent 103µs making 1 call to experimental::import
13226µs276µs
# spent 72µs (45+27) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@13 which was called: # once (45µs+27µs) by Module::Runtime::require_module at line 13
use if "$]" >= 5.022, experimental => 're_strict';
# spent 72µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@13 # spent 4µs making 1 call to if::import
14219µs225µs
# spent 24µs (9+15) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@14 which was called: # once (9µs+15µs) by Module::Runtime::require_module at line 14
no if "$]" >= 5.031009, feature => 'indirect';
# spent 24µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@14 # spent 1µs making 1 call to if::unimport
15258µs216µs
# spent 16µs (8+8) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@15 which was called: # once (8µs+8µs) by Module::Runtime::require_module at line 15
no if "$]" >= 5.033001, feature => 'multidimensional';
# spent 16µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@15 # spent 0s making 1 call to if::unimport
16219µs215µs
# spent 15µs (8+7) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@16 which was called: # once (8µs+7µs) by Module::Runtime::require_module at line 16
no if "$]" >= 5.033006, feature => 'bareword_filehandles';
# spent 15µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@16 # spent 0s making 1 call to if::unimport
17360µs3102µs
# spent 56µs (10+46) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@17 which was called: # once (10µs+46µs) by Module::Runtime::require_module at line 17
use JSON::Schema::Modern::Utilities 0.524 qw(assert_keyword_type annotate_self E is_type jsonp);
# spent 56µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@17 # spent 39µs making 1 call to Exporter::import # spent 7µs making 1 call to UNIVERSAL::VERSION
182830µs2636µs
# spent 321µs (6+315) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@18 which was called: # once (6µs+315µs) by Module::Runtime::require_module at line 18
use namespace::clean;
# spent 321µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@18 # spent 315µs making 1 call to namespace::clean::import
19
2012µs1486µswith 'JSON::Schema::Modern::Vocabulary';
# spent 486µ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 679 of JSON/Schema/Modern.pm
sub vocabulary {
2312µs 'https://spec.openapis.org/oas/3.1/vocab/base' => 'draft2020-12',
24}
25
26
# spent 2.46ms within JSON::Schema::Modern::Vocabulary::OpenAPI::keywords which was called 2018 times, avg 1µs/call: # 2018 times (2.46ms+0s) by JSON::Schema::Modern::_traverse_subschema at line 447 of JSON/Schema/Modern.pm, avg 1µs/call
sub keywords {
2720183.94ms qw(discriminator example externalDocs xml);
28}
29
30sub _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
56sub _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
90sub _traverse_keyword_example { 1 }
91
92sub _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
97516µs
# spent 5µs within JSON::Schema::Modern::Vocabulary::OpenAPI::_traverse_keyword_externalDocs which was called 5 times, avg 1µs/call: # 5 times (5µs+0s) by JSON::Schema::Modern::_traverse_subschema at line 457 of JSON/Schema/Modern.pm, avg 1µs/call
sub _traverse_keyword_externalDocs { 1 }
98
99sub _eval_keyword_externalDocs { goto \&_eval_keyword_example }
100
101# until we do something with these values, we do not bother checking the structure
102sub _traverse_keyword_xml { 1 }
103
104sub _eval_keyword_xml { goto \&_eval_keyword_example }
105
10618µs1;
107
108150µs1360µs__END__