Module: JSONSchemer::Format
- Includes:
- Duration, Email, Hostname, JSONPointer, URITemplate
- Included in:
- Draft202012::Vocab::FormatAnnotation::Format, Draft202012::Vocab::FormatAssertion::Format
- Defined in:
- lib/json_schemer/format.rb,
lib/json_schemer/format/email.rb,
lib/json_schemer/format/duration.rb,
lib/json_schemer/format/hostname.rb,
lib/json_schemer/format/json_pointer.rb,
lib/json_schemer/format/uri_template.rb
Defined Under Namespace
Modules: Duration, Email, Hostname, JSONPointer, URITemplate
Constant Summary
collapse
- DATE_TIME_OFFSET_REGEX =
/(Z|[\+\-]([01][0-9]|2[0-3]):[0-5][0-9])\z/i.freeze
- HOUR_24_REGEX =
/T24/.freeze
- LEAP_SECOND_REGEX =
/T\d{2}:\d{2}:6/.freeze
- IP_REGEX =
/\A[\h:.]+\z/.freeze
- INVALID_QUERY_REGEX =
/\s/.freeze
- IRI_ESCAPE_REGEX =
/[^[:ascii:]]/
- UUID_REGEX =
/\A\h{8}-\h{4}-\h{4}-[89AB]\h{3}-\h{12}\z/i
- NIL_UUID =
'00000000-0000-0000-0000-000000000000'
- ASCII_8BIT_TO_PERCENT_ENCODED =
256.times.each_with_object({}) do |byte, out|
out[-byte.chr] = -sprintf('%%%02X', byte)
end.freeze
Constants included
from URITemplate
URITemplate::EXPLODE, URITemplate::EXPRESSION, URITemplate::LITERALS, URITemplate::MAX_LENGTH, URITemplate::MODIFIER_LEVEL4, URITemplate::OPERATOR, URITemplate::PCT_ENCODED, URITemplate::PREFIX, URITemplate::URI_TEMPLATE, URITemplate::URI_TEMPLATE_REGEX, URITemplate::VARCHAR, URITemplate::VARIABLE_LIST, URITemplate::VARNAME, URITemplate::VARSPEC
Constants included
from JSONPointer
JSONPointer::JSON_POINTER_REGEX, JSONPointer::JSON_POINTER_REGEX_STRING, JSONPointer::RELATIVE_JSON_POINTER_REGEX
Constants included
from Hostname
Hostname::ARABIC_EXTENDED_DIGITS_REGEX, Hostname::ARABIC_INDIC_DIGITS_REGEX, Hostname::CONTEXT_REGEX, Hostname::EXCEPTIONS_DISALLOWED, Hostname::EXCEPTIONS_PVALID, Hostname::GREEK_LOWER_NUMERAL_SIGN, Hostname::HEBREW_PUNCTUATION, Hostname::HOSTNAME_REGEX, Hostname::JOINING_TYPE_D_CHARACTER_CLASS, Hostname::JOINING_TYPE_L_CHARACTER_CLASS, Hostname::JOINING_TYPE_R_CHARACTER_CLASS, Hostname::JOINING_TYPE_T_CHARACTER_CLASS, Hostname::KATAKANA_MIDDLE_DOT_CONTEXT_REGEX, Hostname::KATAKANA_MIDDLE_DOT_REGEX, Hostname::LABEL_CHARACTER_CLASS, Hostname::LABEL_REGEX_STRING, Hostname::LEADING_CHARACTER_CLASS, Hostname::LETTER_DIGITS, Hostname::MARKS, Hostname::MIDDLE_DOT, Hostname::VIRAMA_CHARACTER_CLASS, Hostname::ZERO_WIDTH_NON_JOINER_JOINING_TYPE, Hostname::ZERO_WIDTH_VIRAMA
Constants included
from Email
Email::ADDRESS_LITERAL, Email::ATOM, Email::A_TEXT, Email::DOT_STRING, Email::EMAIL_REGEX, Email::LOCAL_PART, Email::MAILBOX, Email::QUOTED_PAIR_SMTP, Email::QUOTED_STRING, Email::Q_CONTENT_SMTP, Email::Q_TEXT_SMTP, Email::UTF8_NON_ASCII
Constants included
from Duration
Duration::DURATION, Duration::DURATION_REGEX, Duration::DUR_DATE, Duration::DUR_DAY, Duration::DUR_HOUR, Duration::DUR_MINUTE, Duration::DUR_MONTH, Duration::DUR_SECOND, Duration::DUR_TIME, Duration::DUR_WEEK, Duration::DUR_YEAR
Class Method Summary
collapse
Instance Method Summary
collapse
#valid_uri_template?
#valid_json_pointer?, #valid_relative_json_pointer?
Methods included from Hostname
#valid_hostname?
Methods included from Email
#valid_email?
Methods included from Duration
#valid_duration?
Class Method Details
.decode_content_encoding(data, content_encoding) ⇒ Object
30
31
32
33
34
35
36
37
38
39
40
41
|
# File 'lib/json_schemer/format.rb', line 30
def decode_content_encoding(data, content_encoding)
case content_encoding
when 'base64'
begin
[true, Base64.strict_decode64(data)]
rescue
[false, nil]
end
else
raise UnknownContentEncoding, content_encoding
end
end
|
.parse_content_media_type(data, content_media_type) ⇒ Object
43
44
45
46
47
48
49
50
51
52
53
54
|
# File 'lib/json_schemer/format.rb', line 43
def parse_content_media_type(data, content_media_type)
case content_media_type
when 'application/json'
begin
[true, JSON.parse(data)]
rescue
[false, nil]
end
else
raise UnknownContentMediaType, content_media_type
end
end
|
.percent_encode(data, regexp) ⇒ Object
23
24
25
26
27
28
|
# File 'lib/json_schemer/format.rb', line 23
def percent_encode(data, regexp)
data = data.dup
data.force_encoding(Encoding::ASCII_8BIT)
data.gsub!(regexp, ASCII_8BIT_TO_PERCENT_ENCODED)
data.force_encoding(Encoding::US_ASCII)
end
|
Instance Method Details
#iri_escape(data) ⇒ Object
138
139
140
|
# File 'lib/json_schemer/format.rb', line 138
def iri_escape(data)
Format.percent_encode(data, IRI_ESCAPE_REGEX)
end
|
#parse_uri_scheme(data) ⇒ Object
118
119
120
121
122
123
|
# File 'lib/json_schemer/format.rb', line 118
def parse_uri_scheme(data)
scheme, _userinfo, _host, _port, _registry, _path, opaque, query, _fragment = URI::RFC3986_PARSER.split(data)
raise URI::InvalidURIError if INVALID_QUERY_REGEX.match?(query) || INVALID_QUERY_REGEX.match?(opaque)
scheme
end
|
#valid_date_time?(data) ⇒ Boolean
102
103
104
105
106
107
108
109
|
# File 'lib/json_schemer/format.rb', line 102
def valid_date_time?(data)
return false if HOUR_24_REGEX.match?(data)
datetime = DateTime.rfc3339(data)
return false if LEAP_SECOND_REGEX.match?(data) && datetime.new_offset.strftime('%H:%M') != '23:59'
DATE_TIME_OFFSET_REGEX.match?(data)
rescue ArgumentError
false
end
|
#valid_ip?(data, family) ⇒ Boolean
111
112
113
114
115
116
|
# File 'lib/json_schemer/format.rb', line 111
def valid_ip?(data, family)
IPAddr.new(data, family)
IP_REGEX.match?(data)
rescue IPAddr::Error
false
end
|
#valid_regex?(data) ⇒ Boolean
142
143
144
145
146
|
# File 'lib/json_schemer/format.rb', line 142
def valid_regex?(data)
!!EcmaRegexp.ruby_equivalent(data)
rescue InvalidEcmaRegexp
false
end
|
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
# File 'lib/json_schemer/format.rb', line 57
def valid_spec_format?(data, format)
case format
when 'date-time'
valid_date_time?(data)
when 'date'
valid_date_time?("#{data}T04:05:06.123456789+07:00")
when 'time'
valid_date_time?("2001-02-03T#{data}")
when 'email'
data.ascii_only? && valid_email?(data)
when 'idn-email'
valid_email?(data)
when 'hostname'
data.ascii_only? && valid_hostname?(data)
when 'idn-hostname'
valid_hostname?(data)
when 'ipv4'
valid_ip?(data, Socket::AF_INET)
when 'ipv6'
valid_ip?(data, Socket::AF_INET6)
when 'uri'
valid_uri?(data)
when 'uri-reference'
valid_uri_reference?(data)
when 'iri'
valid_uri?(iri_escape(data))
when 'iri-reference'
valid_uri_reference?(iri_escape(data))
when 'uri-template'
valid_uri_template?(data)
when 'json-pointer'
valid_json_pointer?(data)
when 'relative-json-pointer'
valid_relative_json_pointer?(data)
when 'regex'
valid_regex?(data)
when 'duration'
valid_duration?(data)
when 'uuid'
valid_uuid?(data)
else
raise UnknownFormat, format
end
end
|
#valid_uri?(data) ⇒ Boolean
125
126
127
128
129
|
# File 'lib/json_schemer/format.rb', line 125
def valid_uri?(data)
!!parse_uri_scheme(data)
rescue URI::InvalidURIError
false
end
|
#valid_uri_reference?(data) ⇒ Boolean
131
132
133
134
135
136
|
# File 'lib/json_schemer/format.rb', line 131
def valid_uri_reference?(data)
parse_uri_scheme(data)
true
rescue URI::InvalidURIError
false
end
|
#valid_uuid?(data) ⇒ Boolean
148
149
150
|
# File 'lib/json_schemer/format.rb', line 148
def valid_uuid?(data)
UUID_REGEX.match?(data) || NIL_UUID == data
end
|