Filename | /Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm |
Statements | Executed 41945 statements in 72.8ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
2220 | 1 | 1 | 48.5ms | 440ms | _eval_keyword_format | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1380 | 1 | 1 | 14.1ms | 276ms | __ANON__[:124] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
2220 | 1 | 1 | 5.51ms | 5.51ms | _get_default_format_validation | JSON::Schema::Modern::Vocabulary::FormatAssertion::
151 | 1 | 1 | 2.94ms | 29.7ms | __ANON__[:121] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
73 | 11 | 1 | 2.15ms | 2.15ms | CORE:regcomp (opcode) | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1531 | 2 | 1 | 962µs | 962µs | CORE:match (opcode) | JSON::Schema::Modern::Vocabulary::FormatAssertion::
63 | 1 | 1 | 921µs | 2.95ms | __ANON__[:132] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
74 | 12 | 1 | 101µs | 101µs | CORE:qr (opcode) | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 31µs | 35µs | BEGIN@1.313 | Module::Runtime::
1 | 1 | 1 | 15µs | 604µs | BEGIN@11 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 10µs | 33µs | BEGIN@13 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 10µs | 10µs | BEGIN@9 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 8µs | 20µs | BEGIN@14 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 8µs | 16µs | BEGIN@16 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 8µs | 45µs | BEGIN@17 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 7µs | 19µs | BEGIN@15 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 7µs | 39µs | BEGIN@2.314 | Module::Runtime::
1 | 1 | 1 | 6µs | 203µs | BEGIN@10 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 6µs | 88µs | BEGIN@12 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 6µs | 20µs | BEGIN@18 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 5µs | 161µs | BEGIN@19 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 3µs | 3µs | keywords | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 2µs | 2µs | vocabulary | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:101] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:117] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:125] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:126] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:127] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:128] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:130] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:134] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:135] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:38] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:41] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:44] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:47] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:51] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:77] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:78] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:96] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:97] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:98] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | _traverse_keyword_format | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | evaluation_order | JSON::Schema::Modern::Vocabulary::FormatAssertion::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | 2 | 31µs | 2 | 39µs | # spent 35µs (31+4) within Module::Runtime::BEGIN@1.313 which was called:
# once (31µs+4µs) by Module::Runtime::require_module at line 1 # spent 35µs making 1 call to Module::Runtime::BEGIN@1.313
# spent 4µs making 1 call to strict::import |
2 | 2 | 41µs | 2 | 71µs | # spent 39µs (7+32) within Module::Runtime::BEGIN@2.314 which was called:
# once (7µs+32µs) by Module::Runtime::require_module at line 2 # spent 39µs making 1 call to Module::Runtime::BEGIN@2.314
# spent 32µs making 1 call to warnings::import |
3 | package 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 | |||||
7 | 1 | 0s | our $VERSION = '0.559'; | ||
8 | |||||
9 | 2 | 29µs | 1 | 10µ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 # spent 10µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@9 |
10 | 2 | 22µs | 2 | 400µs | # spent 203µs (6+197) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10 which was called:
# once (6µs+197µs) by Module::Runtime::require_module at line 10 # spent 203µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10
# spent 197µs making 1 call to Moo::import |
11 | 3 | 33µs | 3 | 1.19ms | # spent 604µs (15+589) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11 which was called:
# once (15µs+589µs) by Module::Runtime::require_module at line 11 # spent 604µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11
# spent 574µs making 1 call to strictures::import
# spent 15µs making 1 call to strictures::VERSION |
12 | 2 | 28µs | 2 | 170µs | # spent 88µs (6+82) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12 which was called:
# once (6µs+82µs) by Module::Runtime::require_module at line 12 # spent 88µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12
# spent 82µs making 1 call to experimental::import |
13 | 2 | 24µs | 2 | 36µs | # spent 33µs (10+23) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13 which was called:
# once (10µs+23µs) by Module::Runtime::require_module at line 13 # spent 33µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13
# spent 3µs making 1 call to if::import |
14 | 2 | 19µs | 2 | 20µs | # spent 20µs (8+12) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14 which was called:
# once (8µs+12µs) by Module::Runtime::require_module at line 14 # spent 20µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14
# spent 0s making 1 call to if::unimport |
15 | 2 | 18µs | 2 | 21µs | # spent 19µs (7+12) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15 which was called:
# once (7µs+12µs) by Module::Runtime::require_module at line 15 # spent 19µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15
# spent 2µs making 1 call to if::unimport |
16 | 2 | 16µs | 2 | 17µs | # spent 16µs (8+8) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16 which was called:
# once (8µs+8µs) by Module::Runtime::require_module at line 16 # spent 16µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16
# spent 1µs making 1 call to if::unimport |
17 | 2 | 16µs | 2 | 82µs | # spent 45µs (8+37) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17 which was called:
# once (8µs+37µs) by Module::Runtime::require_module at line 17 # spent 45µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17
# spent 37µs making 1 call to Exporter::import |
18 | 2 | 15µs | 2 | 34µs | # spent 20µs (6+14) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18 which was called:
# once (6µs+14µs) by Module::Runtime::require_module at line 18 # spent 20µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18
# spent 14µs making 1 call to Feature::Compat::Try::import |
19 | 2 | 1.89ms | 2 | 317µs | # spent 161µs (5+156) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19 which was called:
# once (5µs+156µs) by Module::Runtime::require_module at line 19 # spent 161µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19
# spent 156µs making 1 call to namespace::clean::import |
20 | |||||
21 | 1 | 3µs | 1 | 437µs | with 'JSON::Schema::Modern::Vocabulary'; # spent 437µ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/git/JSON-Schema-Modern/lib/JSON/Schema/Modern.pm:709] at line 705 of /Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern.pm | ||||
24 | 1 | 3µs | 'https://json-schema.org/draft/2020-12/vocab/format-assertion' => 'draft2020-12'; | ||
25 | } | ||||
26 | |||||
27 | sub evaluation_order { 3 } | ||||
28 | |||||
29 | # spent 3µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::keywords which was called:
# once (3µs+0s) by JSON::Schema::Modern::_eval_subschema at line 572 of /Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern.pm | ||||
30 | 1 | 3µ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, | ||||
38 | 1 | 2µs | }; | ||
39 | my $is_email = sub { | ||||
40 | Email::Address::XS->parse($_[0])->is_valid; | ||||
41 | 1 | 1µs | }; | ||
42 | my $is_hostname = sub { | ||||
43 | Data::Validate::Domain::is_domain($_[0]); | ||||
44 | 1 | 1µs | }; | ||
45 | my $idn_decode = sub { | ||||
46 | try { return Net::IDN::Encode::domain_to_ascii($_[0]) } catch ($e) { return $_[0]; } | ||||
47 | 1 | 8µ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; | ||||
51 | 1 | 1µ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 | ||||
54 | 1 | 3µs | my $duration_re = do { | ||
55 | 1 | 8µs | 1 | 3µs | my $num = qr{[0-9]+(?:[.,][0-9]+)?}; # spent 3µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
56 | 1 | 47µs | 2 | 25µs | my $second = qr{${num}S}; # spent 24µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
57 | 1 | 38µs | 2 | 31µs | my $minute = qr{${num}M}; # spent 29µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 2µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
58 | 1 | 14µs | 2 | 12µs | my $hour = qr{${num}H}; # spent 11µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
59 | 1 | 28µs | 2 | 23µs | my $time = qr{T(?=[0-9])(?:$hour)?(?:$minute)?(?:$second)?}; # spent 23µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
60 | 1 | 11µs | 2 | 8µs | my $day = qr{${num}D}; # spent 8µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
61 | 1 | 18µs | 2 | 16µs | my $month = qr{${num}M}; # spent 15µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
62 | 1 | 10µs | 2 | 7µs | my $year = qr{${num}Y}; # spent 6µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
63 | 1 | 10µs | 2 | 5µs | my $week = qr{${num}W}; # spent 5µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
64 | 1 | 32µs | 2 | 26µs | my $date = qr{(?=[0-9])(?:$year)?(?:$month)?(?:$day)?}; # spent 25µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
65 | 1 | 89µs | 2 | 71µs | qr{^P(?:(?=.)(?:$date)?(?:$time)?|$week)$}; # spent 70µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
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 | # spent 29.7ms (2.94+26.8) within JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:121] which was called 151 times, avg 197µs/call:
# 151 times (2.94ms+26.8ms) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 182, avg 197µs/call | ||||
119 | 151 | 280µs | 151 | 11.3ms | my $uri = Mojo::URL->new($_[0]); # spent 11.3ms making 151 calls to Mojo::URL::new, avg 75µs/call |
120 | 151 | 2.43ms | 453 | 15.5ms | fc($uri->to_unsafe_string) eq fc($_[0]) && $uri->is_abs && $_[0] !~ /[^[:ascii:]]/; # spent 14.9ms making 151 calls to Mojo::URL::to_unsafe_string, avg 99µs/call
# spent 483µs making 151 calls to Mojo::URL::is_abs, avg 3µs/call
# spent 79µs making 151 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:match, avg 523ns/call |
121 | }, | ||||
122 | # spent 276ms (14.1+262) within JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:124] which was called 1380 times, avg 200µs/call:
# 1380 times (14.1ms+262ms) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 182, avg 200µs/call | ||||
123 | 1380 | 12.6ms | 4140 | 262ms | fc(Mojo::URL->new($_[0])->to_unsafe_string) eq fc($_[0]) && $_[0] !~ /[^[:ascii:]]/; # spent 160ms making 1380 calls to Mojo::URL::new, avg 116µs/call
# spent 101ms making 1380 calls to Mojo::URL::to_unsafe_string, avg 73µs/call
# spent 883µs making 1380 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:match, avg 640ns/call |
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 2.95ms (921µs+2.03) within JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132] which was called 63 times, avg 47µs/call:
# 63 times (921µs+2.03ms) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 182, avg 47µs/call | ||||
130 | 63 | 288µs | local $SIG{__WARN__} = sub { die @_ }; | ||
131 | 189 | 2.65ms | 126 | 2.03ms | eval { qr/$_[0]/; 1 ? 1 : 0 }; # spent 1.94ms making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp, avg 31µs/call
# spent 90µs making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr, avg 1µs/call |
132 | }, | ||||
133 | |||||
134 | 'iri-reference' => sub { 1 }, | ||||
135 | 'uri-template' => sub { 1 }, | ||||
136 | 1 | 30µs | }; | ||
137 | |||||
138 | 6660 | 1.79ms | # spent 5.51ms within JSON::Schema::Modern::Vocabulary::FormatAssertion::_get_default_format_validation which was called 2220 times, avg 2µs/call:
# 2220 times (5.51ms+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 173, avg 2µs/call | ||
139 | 2220 | 5.23ms | return $formats->{$format}; | ||
140 | } | ||||
141 | } | ||||
142 | |||||
143 | 1 | 1µs | sub _traverse_keyword_format ($self, $schema, $state) { | ||
144 | return if not assert_keyword_type($state, $schema, 'string'); | ||||
145 | return 1; | ||||
146 | } | ||||
147 | |||||
148 | 11100 | 2.63ms | # spent 440ms (48.5+391) within JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format which was called 2220 times, avg 198µs/call:
# 2220 times (48.5ms+391ms) by JSON::Schema::Modern::_eval_subschema at line 587 of /Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern.pm, avg 198µs/call | ||
149 | abort($state, 'unimplemented format "%s"', $schema->{format}) | ||||
150 | 2220 | 1.46ms | if $schema->{format} eq 'uri-template'; | ||
151 | |||||
152 | 2220 | 1.55ms | try { | ||
153 | 2220 | 6.17ms | 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 | ||||
172 | 2220 | 6.59ms | 2220 | 59.6ms | my $evaluator_spec = $state->{evaluator}->_get_format_validation($schema->{format}); # spent 59.6ms making 2220 calls to JSON::Schema::Modern::_get_format_validation, avg 27µs/call |
173 | 2220 | 5.35ms | 2220 | 5.51ms | my $default_spec = $self->_get_default_format_validation($schema->{format}); # spent 5.51ms making 2220 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::_get_default_format_validation, avg 2µs/call |
174 | |||||
175 | 2220 | 2.89ms | 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 | |||||
180 | 2220 | 3.59ms | 2220 | 5.28ms | A($state, $schema->{format}); # spent 5.28ms making 2220 calls to JSON::Schema::Modern::Utilities::A, avg 2µs/call |
181 | return E($state, 'not a%s %s', $schema->{format} =~ /^[aeio]/ ? 'n' : '', $schema->{format}) | ||||
182 | 2220 | 8.10ms | 3188 | 321ms | if $spec and is_type($spec->{type}, $data) and not $spec->{sub}->($data); # spent 276ms making 1380 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:124], avg 200µs/call
# spent 29.7ms making 151 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:121], avg 197µs/call
# spent 12.4ms making 1594 calls to JSON::Schema::Modern::Utilities::is_type, avg 8µs/call
# spent 2.95ms making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132], avg 47µs/call |
183 | |||||
184 | 2220 | 6.50ms | return 1; | ||
185 | } | ||||
186 | |||||
187 | 1 | 45µs | 1; | ||
188 | 1 | 52µs | 1 | 319µs | __END__ # spent 319µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__[B/Hooks/EndOfScope/XS.pm:26] |
# spent 962µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:match which was called 1531 times, avg 628ns/call:
# 1380 times (883µs+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:124] at line 123, avg 640ns/call
# 151 times (79µs+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:121] at line 120, avg 523ns/call | |||||
# spent 101µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr which was called 74 times, avg 1µs/call:
# 63 times (90µs+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132] at line 131, avg 1µs/call
# once (3µs+0s) by Module::Runtime::require_module at line 55
# once (2µs+0s) by Module::Runtime::require_module at line 57
# once (1µs+0s) by Module::Runtime::require_module at line 58
# once (1µs+0s) by Module::Runtime::require_module at line 62
# once (1µs+0s) by Module::Runtime::require_module at line 61
# once (1µs+0s) by Module::Runtime::require_module at line 65
# once (1µs+0s) by Module::Runtime::require_module at line 64
# once (1µs+0s) by Module::Runtime::require_module at line 56
# once (0s+0s) by Module::Runtime::require_module at line 60
# once (0s+0s) by Module::Runtime::require_module at line 59
# once (0s+0s) by Module::Runtime::require_module at line 63 | |||||
# spent 2.15ms within JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp which was called 73 times, avg 30µs/call:
# 63 times (1.94ms+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/git/JSON-Schema-Modern/lib/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132] at line 131, avg 31µs/call
# once (70µs+0s) by Module::Runtime::require_module at line 65
# once (29µs+0s) by Module::Runtime::require_module at line 57
# once (25µs+0s) by Module::Runtime::require_module at line 64
# once (24µs+0s) by Module::Runtime::require_module at line 56
# once (23µs+0s) by Module::Runtime::require_module at line 59
# once (15µs+0s) by Module::Runtime::require_module at line 61
# once (11µs+0s) by Module::Runtime::require_module at line 58
# once (8µs+0s) by Module::Runtime::require_module at line 60
# once (6µs+0s) by Module::Runtime::require_module at line 62
# once (5µs+0s) by Module::Runtime::require_module at line 63 |