← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 15:57:08 2022
Reported on Wed Dec 14 16:00:37 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/OpenAPI.pm
StatementsExecuted 36 statements in 830µs
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
11152µs57µsModule::Runtime::::BEGIN@1.320 Module::Runtime::BEGIN@1.320
11116µs630µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@11JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@11
11112µs12µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@9JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@9
11110µs30µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@13JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@13
11110µs50µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@17JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@17
1119µs20µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@16JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@16
1117µs16µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@15JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@15
5117µs7µsJSON::Schema::Modern::Vocabulary::OpenAPI::::_traverse_keyword_externalDocsJSON::Schema::Modern::Vocabulary::OpenAPI::_traverse_keyword_externalDocs
1116µs197µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@10JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@10
1116µs110µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@12JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@12
1116µs19µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@14JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@14
1116µs40µsModule::Runtime::::BEGIN@2.321 Module::Runtime::BEGIN@2.321
1114µs146µsJSON::Schema::Modern::Vocabulary::OpenAPI::::BEGIN@18JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@18
1114µs4µsJSON::Schema::Modern::Vocabulary::OpenAPI::::keywordsJSON::Schema::Modern::Vocabulary::OpenAPI::keywords
1111µs1µsJSON::Schema::Modern::Vocabulary::OpenAPI::::vocabularyJSON::Schema::Modern::Vocabulary::OpenAPI::vocabulary
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
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1234µs262µs
# spent 57µs (52+5) within Module::Runtime::BEGIN@1.320 which was called: # once (52µs+5µs) by Module::Runtime::require_module at line 1
use strict;
# spent 57µs making 1 call to Module::Runtime::BEGIN@1.320 # spent 5µs making 1 call to strict::import
2246µs274µs
# spent 40µs (6+34) within Module::Runtime::BEGIN@2.321 which was called: # once (6µs+34µs) by Module::Runtime::require_module at line 2
use warnings;
# spent 40µs making 1 call to Module::Runtime::BEGIN@2.321 # spent 34µ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.034';
8
9231µs112µs
# spent 12µs within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@9 which was called: # once (12µs+0s) by Module::Runtime::require_module at line 9
use 5.020;
10222µs2388µs
# spent 197µs (6+191) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@10 which was called: # once (6µs+191µs) by Module::Runtime::require_module at line 10
use Moo;
# spent 197µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@10 # spent 191µs making 1 call to Moo::import
11326µs31.24ms
# spent 630µs (16+614) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@11 which was called: # once (16µs+614µs) by Module::Runtime::require_module at line 11
use strictures 2;
# spent 630µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@11 # spent 600µs making 1 call to strictures::import # spent 14µs making 1 call to strictures::VERSION
12229µs2214µs
# spent 110µs (6+104) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@12 which was called: # once (6µs+104µs) by Module::Runtime::require_module at line 12
use experimental qw(signatures postderef);
# spent 110µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@12 # spent 104µs making 1 call to experimental::import
13220µs233µs
# spent 30µs (10+20) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@13 which was called: # once (10µs+20µs) by Module::Runtime::require_module at line 13
use if "$]" >= 5.022, experimental => 're_strict';
# spent 30µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@13 # spent 3µs making 1 call to if::import
14219µs222µs
# spent 19µs (6+13) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@14 which was called: # once (6µs+13µs) by Module::Runtime::require_module at line 14
no if "$]" >= 5.031009, feature => 'indirect';
# spent 19µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@14 # spent 3µs making 1 call to if::unimport
15217µs216µs
# spent 16µs (7+9) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@15 which was called: # once (7µs+9µ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
16218µs221µs
# spent 20µs (9+11) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@16 which was called: # once (9µs+11µs) by Module::Runtime::require_module at line 16
no if "$]" >= 5.033006, feature => 'bareword_filehandles';
# spent 20µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@16 # spent 1µs making 1 call to if::unimport
17325µs390µs
# spent 50µs (10+40) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@17 which was called: # once (10µs+40µ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 50µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@17 # spent 36µs making 1 call to Exporter::import # spent 4µs making 1 call to UNIVERSAL::VERSION
182456µs2288µs
# spent 146µs (4+142) within JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@18 which was called: # once (4µs+142µs) by Module::Runtime::require_module at line 18
use namespace::clean;
# spent 146µs making 1 call to JSON::Schema::Modern::Vocabulary::OpenAPI::BEGIN@18 # spent 142µs making 1 call to namespace::clean::import
19
2011µs1480µswith 'JSON::Schema::Modern::Vocabulary';
# spent 480µs making 1 call to Moo::with
21
22
# spent 1µs within JSON::Schema::Modern::Vocabulary::OpenAPI::vocabulary which was called: # once (1µs+0s) by JSON::Schema::Modern::add_vocabulary at line 705 of JSON/Schema/Modern.pm
sub vocabulary {
2313µs 'https://spec.openapis.org/oas/3.1/vocab/base' => 'draft2020-12',
24}
25
26
# spent 4µs within JSON::Schema::Modern::Vocabulary::OpenAPI::keywords which was called: # once (4µs+0s) by JSON::Schema::Modern::_traverse_subschema at line 471 of JSON/Schema/Modern.pm
sub keywords {
2715µs 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
97514µs
# spent 7µs within JSON::Schema::Modern::Vocabulary::OpenAPI::_traverse_keyword_externalDocs which was called 5 times, avg 1µs/call: # 5 times (7µs+0s) by JSON::Schema::Modern::_traverse_subschema at line 483 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
10615µs1;
107
108159µs1379µs__END__