← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 16:10:05 2022
Reported on Wed Dec 14 16:12:58 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm
StatementsExecuted 1437 statements in 10.9ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
63111.81ms16.7msJSON::Schema::Modern::Vocabulary::FormatAssertion::::_eval_keyword_formatJSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format
63111.21ms6.38msJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:132]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:132]
6311208µs208µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::_get_default_format_validationJSON::Schema::Modern::Vocabulary::FormatAssertion::_get_default_format_validation
11129µs36µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@16JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16
11126µs29µsModule::Runtime::::BEGIN@1.313 Module::Runtime::BEGIN@1.313
11116µs42µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@13JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13
11112µs784µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@11JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11
11112µs26µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@14JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14
11110µs10µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@9JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@9
1118µs17µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@15JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15
1118µs28µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@18JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18
1117µs214µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@10JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10
1117µs182µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@19JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19
1116µs105µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@12JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12
1116µs77µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::BEGIN@17JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17
1115µs37µsModule::Runtime::::BEGIN@2.314 Module::Runtime::BEGIN@2.314
1112µs2µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::keywordsJSON::Schema::Modern::Vocabulary::FormatAssertion::keywords
1112µs2µsJSON::Schema::Modern::Vocabulary::FormatAssertion::::vocabularyJSON::Schema::Modern::Vocabulary::FormatAssertion::vocabulary
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:101]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:101]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:117]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:117]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:121]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:121]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:124]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:124]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:125]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:125]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:126]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:126]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:127]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:127]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:128]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:128]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:130]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:130]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:134]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:134]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:135]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:135]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:38]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:38]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:41]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:41]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:44]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:44]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:47]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:47]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:51]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:51]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:77]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:77]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:78]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:78]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:96]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:96]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:97]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:97]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::__ANON__[:98]JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[:98]
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::_traverse_keyword_formatJSON::Schema::Modern::Vocabulary::FormatAssertion::_traverse_keyword_format
0000s0sJSON::Schema::Modern::Vocabulary::FormatAssertion::::evaluation_orderJSON::Schema::Modern::Vocabulary::FormatAssertion::evaluation_order
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1226µs232µs
# spent 29µs (26+3) within Module::Runtime::BEGIN@1.313 which was called: # once (26µs+3µs) by Module::Runtime::require_module at line 1
use strict;
# spent 29µs making 1 call to Module::Runtime::BEGIN@1.313 # spent 3µs making 1 call to strict::import
2236µs269µs
# spent 37µs (5+32) within Module::Runtime::BEGIN@2.314 which was called: # once (5µs+32µs) by Module::Runtime::require_module at line 2
use warnings;
# spent 37µs making 1 call to Module::Runtime::BEGIN@2.314 # spent 32µs making 1 call to warnings::import
3package JSON::Schema::Modern::Vocabulary::FormatAssertion;
4# vim: set ts=8 sts=2 sw=2 tw=100 et :
5# ABSTRACT: Implementation of the JSON Schema Format-Assertion vocabulary
6
711µsour $VERSION = '0.558';
8
9226µs110µs
# spent 10µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@9 which was called: # once (10µs+0s) by Module::Runtime::require_module at line 9
use 5.020;
10221µs2421µs
# spent 214µs (7+207) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10 which was called: # once (7µs+207µs) by Module::Runtime::require_module at line 10
use Moo;
# spent 214µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10 # spent 207µs making 1 call to Moo::import
11348µs31.55ms
# spent 784µs (12+772) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11 which was called: # once (12µs+772µs) by Module::Runtime::require_module at line 11
use strictures 2;
# spent 784µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11 # spent 757µs making 1 call to strictures::import # spent 14µs making 1 call to strictures::VERSION
12234µs2204µs
# spent 105µs (6+99) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12 which was called: # once (6µs+99µs) by Module::Runtime::require_module at line 12
use experimental qw(signatures postderef);
# spent 105µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12 # spent 99µs making 1 call to experimental::import
13228µs245µs
# spent 42µs (16+26) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13 which was called: # once (16µs+26µs) by Module::Runtime::require_module at line 13
use if "$]" >= 5.022, experimental => 're_strict';
# spent 42µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13 # spent 3µs making 1 call to if::import
14218µs226µs
# spent 26µs (12+14) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14 which was called: # once (12µs+14µs) by Module::Runtime::require_module at line 14
no if "$]" >= 5.031009, feature => 'indirect';
# spent 26µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14 # spent 0s making 1 call to if::unimport
15215µs218µs
# spent 17µs (8+9) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15 which was called: # once (8µs+9µs) by Module::Runtime::require_module at line 15
no if "$]" >= 5.033001, feature => 'multidimensional';
# spent 17µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15 # spent 1µs making 1 call to if::unimport
16215µs236µs
# spent 36µs (29+7) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16 which was called: # once (29µs+7µs) by Module::Runtime::require_module at line 16
no if "$]" >= 5.033006, feature => 'bareword_filehandles';
# spent 36µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16 # spent 0s making 1 call to if::unimport
17215µs2148µs
# spent 77µs (6+71) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17 which was called: # once (6µs+71µs) by Module::Runtime::require_module at line 17
use JSON::Schema::Modern::Utilities qw(is_type E A assert_keyword_type abort);
# spent 77µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17 # spent 71µs making 1 call to Exporter::import
18217µs248µs
# spent 28µs (8+20) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18 which was called: # once (8µs+20µs) by Module::Runtime::require_module at line 18
use Feature::Compat::Try;
# spent 28µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18 # spent 20µs making 1 call to Feature::Compat::Try::import
1921.80ms2357µs
# spent 182µs (7+175) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19 which was called: # once (7µs+175µs) by Module::Runtime::require_module at line 19
use namespace::clean;
# spent 182µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19 # spent 175µs making 1 call to namespace::clean::import
20
2111µs1396µswith 'JSON::Schema::Modern::Vocabulary';
# spent 396µs making 1 call to Moo::with
22
23
# spent 2µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::vocabulary which was called: # once (2µs+0s) by JSON::Schema::Modern::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern.pm:700] at line 696 of JSON/Schema/Modern.pm
sub vocabulary {
2414µs 'https://json-schema.org/draft/2020-12/vocab/format-assertion' => 'draft2020-12';
25}
26
27sub evaluation_order { 3 }
28
29
# spent 2µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::keywords which was called: # once (2µs+0s) by JSON::Schema::Modern::_eval_subschema at line 563 of JSON/Schema/Modern.pm
sub keywords {
3013µs qw(format);
31}
32
33{
34 # for now, all built-in formats are constrained to the 'string' type
35
36 my $is_datetime = sub {
37 eval { Time::Moment->from_string(uc($_[0])) } ? 1 : 0,
3811µs };
39 my $is_email = sub {
40 Email::Address::XS->parse($_[0])->is_valid;
4110s };
42 my $is_hostname = sub {
43 Data::Validate::Domain::is_domain($_[0]);
4410s };
45 my $idn_decode = sub {
46 try { return Net::IDN::Encode::domain_to_ascii($_[0]) } catch ($e) { return $_[0]; }
4711µs };
48 my $is_ipv4 = sub {
49 my @o = split(/\./, $_[0], 5);
50 @o == 4 && (grep /^(?:0|[1-9][0-9]{0,2})$/, @o) == 4 && (grep $_ < 256, @o) == 4;
5111µs };
52 # https://tools.ietf.org/html/rfc3339#appendix-A with some additions for the 2000 version
53 # as defined in https://en.wikipedia.org/wiki/ISO_8601#Durations
5411µs my $duration_re = do {
5515µs12µs my $num = qr{[0-9]+(?:[.,][0-9]+)?};
56124µs219µs my $second = qr{${num}S};
57111µs27µs my $minute = qr{${num}M};
58142µs238µs my $hour = qr{${num}H};
59127µs223µs my $time = qr{T(?=[0-9])(?:$hour)?(?:$minute)?(?:$second)?};
60111µs28µs my $day = qr{${num}D};
6119µs27µs my $month = qr{${num}M};
62119µs215µs my $year = qr{${num}Y};
63153µs26µs my $week = qr{${num}W};
64126µs222µs my $date = qr{(?=[0-9])(?:$year)?(?:$month)?(?:$day)?};
65157µs249µs qr{^P(?:(?=.)(?:$date)?(?:$time)?|$week)$};
66 };
67
68 my $formats = +{
69 'date-time' => sub {
70 $is_datetime->($_[0]) || (
71 $_[0] =~ m/^(?:\d{4}-\d\d-\d\dT\d\d:\d\d):(\d\d)(?:\.\d+)?(?:[Zz]|[+-]\d\d:\d\d)$/a
72 && $1 eq '60'
73 && do {
74 require DateTime::Format::RFC3339;
75 eval { DateTime::Format::RFC3339->parse_datetime($_[0]) };
76 });
77 },
78 date => sub { $_[0] =~ /^\d{4}-(?:\d\d)-(?:\d\d)$/a && $is_datetime->($_[0].'T00:00:00Z') },
79 time => sub {
80 return if $_[0] !~ /^(\d\d):(\d\d):(\d\d)(?:\.\d+)?([Zz]|([+-])(\d\d):(\d\d))$/a
81 or $1 > 23
82 or $2 > 59
83 or $3 > 60
84 or (defined($6) and $6 > 23)
85 or (defined($7) and $7 > 59);
86
87 return 1 if $3 <= 59;
88 return $1 == 23 && $2 == 59 if uc($4) eq 'Z';
89
90 my $sign = $5 eq '+' ? 1 : -1;
91 my $hour_zulu = $1 - $6*$sign;
92 my $min_zulu = $2 - $7*$sign;
93 $hour_zulu -= 1 if $min_zulu < 0;
94
95 return $hour_zulu%24 == 23 && $min_zulu%60 == 59;
96 },
97 duration => sub { $_[0] =~ $duration_re && $_[0] !~ m{[.,][0-9]+[A-Z].} },
98 email => sub { $is_email->($_[0]) && $_[0] !~ /[^[:ascii:]]/ },
99 'idn-email' => $is_email,
100 hostname => $is_hostname,
101 'idn-hostname' => sub { $is_hostname->($idn_decode->($_[0])) },
102 ipv4 => $is_ipv4,
103 ipv6 => sub {
104 ($_[0] =~ /^(?:[[:xdigit:]]{0,4}:){0,7}[[:xdigit:]]{0,4}$/
105 || $_[0] =~ /^(?:[[:xdigit:]]{0,4}:){1,6}((?:[0-9]{1,3}\.){3}[0-9]{1,3})$/
106 && $is_ipv4->($1))
107 && $_[0] !~ /:::/
108 && $_[0] !~ /^:[^:]/
109 && $_[0] !~ /[^:]:$/
110 && do {
111 my $double_colons = ()= ($_[0] =~ /::/g);
112 my $colon_components = grep length, split(/:+/, $_[0], -1);
113 $double_colons < 2 && ($double_colons > 0
114 || ($colon_components == 8 && !defined $1)
115 || ($colon_components == 7 && defined $1))
116 };
117 },
118 uri => sub {
119 my $uri = Mojo::URL->new($_[0]);
120 fc($uri->to_unsafe_string) eq fc($_[0]) && $uri->is_abs && $_[0] !~ /[^[:ascii:]]/;
121 },
122 'uri-reference' => sub {
123 fc(Mojo::URL->new($_[0])->to_unsafe_string) eq fc($_[0]) && $_[0] !~ /[^[:ascii:]]/;
124 },
125 iri => sub { Mojo::URL->new($_[0])->is_abs },
126 uuid => sub { $_[0] =~ /^[[:xdigit:]]{8}-(?:[[:xdigit:]]{4}-){3}[[:xdigit:]]{12}$/ },
127 'json-pointer' => sub { (!length($_[0]) || $_[0] =~ m{^/}) && $_[0] !~ m{~(?![01])} },
128 'relative-json-pointer' => sub { $_[0] =~ m{^(?:0|[1-9][0-9]*)(?:#$|$|/)} && $_[0] !~ m{~(?![01])} },
129
# spent 6.38ms (1.21+5.17) within JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132] which was called 63 times, avg 101µs/call: # 63 times (1.21ms+5.17ms) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 182, avg 101µs/call
regex => sub {
13063373µs local $SIG{__WARN__} = sub { die @_ };
1311896.10ms1265.17ms eval { qr/$_[0]/; 1 ? 1 : 0 };
# spent 5.07ms making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp, avg 80µs/call # spent 100µs making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr, avg 2µs/call
132 },
133
134 'iri-reference' => sub { 1 },
135 'uri-template' => sub { 1 },
136118µs };
137
13818977µs
# spent 208µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::_get_default_format_validation which was called 63 times, avg 3µs/call: # 63 times (208µs+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 173, avg 3µs/call
sub _get_default_format_validation ($self, $format) {
13963196µs return $formats->{$format};
140 }
141}
142
14310ssub _traverse_keyword_format ($self, $schema, $state) {
144 return if not assert_keyword_type($state, $schema, 'string');
145 return 1;
146}
147
14831595µs
# spent 16.7ms (1.81+14.9) within JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format which was called 63 times, avg 265µs/call: # 63 times (1.81ms+14.9ms) by JSON::Schema::Modern::_eval_subschema at line 578 of JSON/Schema/Modern.pm, avg 265µs/call
sub _eval_keyword_format ($self, $data, $schema, $state) {
149 abort($state, 'unimplemented format "%s"', $schema->{format})
1506342µs if $schema->{format} eq 'uri-template';
151
1526356µs try {
15363242µs if ($schema->{format} eq 'date-time' or $schema->{format} eq 'date') {
154 require Time::Moment;
155 }
156 elsif ($schema->{format} eq 'email' or $schema->{format} eq 'idn-email') {
157 require Email::Address::XS; Email::Address::XS->VERSION(1.04);
158 }
159 elsif ($schema->{format} eq 'hostname' or $schema->{format} eq 'idn-hostname') {
160 require Data::Validate::Domain;
161 }
162 elsif ($schema->{format} eq 'idn-hostname') {
163 require Net::IDN::Encode;
164 }
165 }
166 catch ($e) {
167 return E($state, 'cannot validate format "%s": %s', $schema->{format}, $e);
168 }
169
170 # first check the subrefs from JSON::Schema::Modern->new(format_evaluations => { ... })
171 # and add in the type if needed
17263206µs632.32ms my $evaluator_spec = $state->{evaluator}->_get_format_validation($schema->{format});
# spent 2.32ms making 63 calls to JSON::Schema::Modern::_get_format_validation, avg 37µs/call
17363181µs63208µs my $default_spec = $self->_get_default_format_validation($schema->{format});
174
17563145µs my $spec =
176 $evaluator_spec ? ($default_spec ? +{ type => 'string', sub => $evaluator_spec } : $evaluator_spec)
177 : $default_spec ? +{ type => 'string', sub => $default_spec }
178 : undef;
179
18063109µs635.18ms A($state, $schema->{format});
# spent 5.18ms making 63 calls to JSON::Schema::Modern::Utilities::A, avg 82µs/call
181 return E($state, 'not a%s %s', $schema->{format} =~ /^[aeio]/ ? 'n' : '', $schema->{format})
18263257µs1267.20ms if $spec and is_type($spec->{type}, $data) and not $spec->{sub}->($data);
# spent 6.38ms making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132], avg 101µs/call # spent 820µs making 63 calls to JSON::Schema::Modern::Utilities::is_type, avg 13µs/call
183
18463317µs return 1;
185}
186
187120µs1;
188
189145µs1324µs__END__