json_schemer 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/JSON-Schema-Test-Suite/bin/jsonschema_suite +8 -5
  4. data/JSON-Schema-Test-Suite/remotes/folder/folderInteger.json +1 -1
  5. data/JSON-Schema-Test-Suite/remotes/integer.json +1 -1
  6. data/JSON-Schema-Test-Suite/remotes/name-defs.json +6 -2
  7. data/JSON-Schema-Test-Suite/remotes/name.json +6 -2
  8. data/JSON-Schema-Test-Suite/remotes/subSchemas.json +2 -2
  9. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/additionalItems.json +0 -0
  10. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/additionalProperties.json +0 -0
  11. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/allOf.json +0 -0
  12. data/JSON-Schema-Test-Suite/tests/draft2019-09/anchor.json +87 -0
  13. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/anyOf.json +0 -0
  14. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/boolean_schema.json +0 -0
  15. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/const.json +0 -0
  16. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/contains.json +0 -0
  17. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/default.json +0 -0
  18. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/defs.json +2 -2
  19. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/dependencies.json +0 -0
  20. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/enum.json +0 -0
  21. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/exclusiveMaximum.json +0 -0
  22. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/exclusiveMinimum.json +0 -0
  23. data/JSON-Schema-Test-Suite/tests/draft2019-09/format.json +614 -0
  24. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/if-then-else.json +0 -0
  25. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/items.json +0 -0
  26. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/maxItems.json +0 -0
  27. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/maxLength.json +0 -0
  28. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/maxProperties.json +0 -0
  29. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/maximum.json +0 -0
  30. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/minItems.json +0 -0
  31. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/minLength.json +0 -0
  32. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/minProperties.json +0 -0
  33. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/minimum.json +0 -0
  34. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/multipleOf.json +0 -0
  35. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/not.json +0 -0
  36. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/oneOf.json +0 -0
  37. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/bignum.json +0 -0
  38. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/content.json +0 -0
  39. data/JSON-Schema-Test-Suite/tests/draft2019-09/optional/ecmascript-regex.json +213 -0
  40. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/date-time.json +0 -0
  41. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/date.json +0 -0
  42. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/email.json +0 -0
  43. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/hostname.json +0 -0
  44. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/idn-email.json +0 -0
  45. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/idn-hostname.json +0 -0
  46. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/ipv4.json +0 -0
  47. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/ipv6.json +0 -0
  48. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/iri-reference.json +0 -0
  49. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/iri.json +0 -0
  50. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/json-pointer.json +0 -0
  51. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/regex.json +0 -0
  52. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/relative-json-pointer.json +0 -0
  53. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/time.json +0 -0
  54. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/uri-reference.json +0 -0
  55. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/uri-template.json +0 -0
  56. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/format/uri.json +0 -0
  57. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/optional/zeroTerminatedFloats.json +0 -0
  58. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/pattern.json +0 -0
  59. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/patternProperties.json +0 -0
  60. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/properties.json +0 -0
  61. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/propertyNames.json +0 -0
  62. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/ref.json +1 -85
  63. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/refRemote.json +0 -0
  64. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/required.json +0 -0
  65. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/type.json +0 -0
  66. data/JSON-Schema-Test-Suite/tests/{draft2019-08 → draft2019-09}/uniqueItems.json +84 -0
  67. data/JSON-Schema-Test-Suite/tests/draft3/format.json +362 -0
  68. data/JSON-Schema-Test-Suite/tests/draft3/optional/{jsregex.json → ecmascript-regex.json} +0 -0
  69. data/JSON-Schema-Test-Suite/tests/draft3/uniqueItems.json +84 -0
  70. data/JSON-Schema-Test-Suite/tests/draft4/format.json +218 -0
  71. data/JSON-Schema-Test-Suite/tests/draft4/optional/ecmascript-regex.json +200 -0
  72. data/JSON-Schema-Test-Suite/tests/draft4/uniqueItems.json +84 -0
  73. data/JSON-Schema-Test-Suite/tests/draft6/format.json +326 -0
  74. data/JSON-Schema-Test-Suite/tests/draft6/optional/ecmascript-regex.json +200 -0
  75. data/JSON-Schema-Test-Suite/tests/draft6/uniqueItems.json +84 -0
  76. data/JSON-Schema-Test-Suite/tests/draft7/format.json +614 -0
  77. data/JSON-Schema-Test-Suite/tests/draft7/optional/ecmascript-regex.json +200 -0
  78. data/JSON-Schema-Test-Suite/tests/draft7/uniqueItems.json +84 -0
  79. data/JSON-Schema-Test-Suite/tests/latest +1 -0
  80. data/JSON-Schema-Test-Suite/tox.ini +3 -2
  81. data/lib/json_schemer/format.rb +25 -58
  82. data/lib/json_schemer/version.rb +1 -1
  83. metadata +66 -59
  84. data/JSON-Schema-Test-Suite/tests/draft2019-08/optional/ecmascript-regex.json +0 -13
@@ -9,5 +9,205 @@
9
9
  "valid": false
10
10
  }
11
11
  ]
12
+ },
13
+ {
14
+ "description": "ECMA 262 regex $ does not match trailing newline",
15
+ "schema": {
16
+ "type": "string",
17
+ "pattern": "^abc$"
18
+ },
19
+ "tests": [
20
+ {
21
+ "description": "matches in Python, but should not in jsonschema",
22
+ "data": "abc\n",
23
+ "valid": false
24
+ },
25
+ {
26
+ "description": "should match",
27
+ "data": "abc",
28
+ "valid": true
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ "description": "ECMA 262 regex converts \\a to ascii BEL",
34
+ "schema": {
35
+ "type": "string",
36
+ "pattern": "^\\a$"
37
+ },
38
+ "tests": [
39
+ {
40
+ "description": "does not match",
41
+ "data": "\\a",
42
+ "valid": false
43
+ },
44
+ {
45
+ "description": "matches",
46
+ "data": "\u0007",
47
+ "valid": true
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ "description": "ECMA 262 regex escapes control codes with \\c and upper letter",
53
+ "schema": {
54
+ "type": "string",
55
+ "pattern": "^\\cC$"
56
+ },
57
+ "tests": [
58
+ {
59
+ "description": "does not match",
60
+ "data": "\\cC",
61
+ "valid": false
62
+ },
63
+ {
64
+ "description": "matches",
65
+ "data": "\u0003",
66
+ "valid": true
67
+ }
68
+ ]
69
+ },
70
+ {
71
+ "description": "ECMA 262 regex escapes control codes with \\c and lower letter",
72
+ "schema": {
73
+ "type": "string",
74
+ "pattern": "^\\cc$"
75
+ },
76
+ "tests": [
77
+ {
78
+ "description": "does not match",
79
+ "data": "\\cc",
80
+ "valid": false
81
+ },
82
+ {
83
+ "description": "matches",
84
+ "data": "\u0003",
85
+ "valid": true
86
+ }
87
+ ]
88
+ },
89
+ {
90
+ "description": "ECMA 262 \\d matches ascii digits only",
91
+ "schema": {
92
+ "type": "string",
93
+ "pattern": "^\\d$"
94
+ },
95
+ "tests": [
96
+ {
97
+ "description": "ASCII zero matches",
98
+ "data": "0",
99
+ "valid": true
100
+ },
101
+ {
102
+ "description": "NKO DIGIT ZERO does not match (unlike e.g. Python)",
103
+ "data": "߀",
104
+ "valid": false
105
+ },
106
+ {
107
+ "description": "NKO DIGIT ZERO (as \\u escape) does not match",
108
+ "data": "\u07c0",
109
+ "valid": false
110
+ }
111
+ ]
112
+ },
113
+ {
114
+ "description": "ECMA 262 \\D matches everything but ascii digits",
115
+ "schema": {
116
+ "type": "string",
117
+ "pattern": "^\\D$"
118
+ },
119
+ "tests": [
120
+ {
121
+ "description": "ASCII zero does not match",
122
+ "data": "0",
123
+ "valid": false
124
+ },
125
+ {
126
+ "description": "NKO DIGIT ZERO matches (unlike e.g. Python)",
127
+ "data": "߀",
128
+ "valid": true
129
+ },
130
+ {
131
+ "description": "NKO DIGIT ZERO (as \\u escape) matches",
132
+ "data": "\u07c0",
133
+ "valid": true
134
+ }
135
+ ]
136
+ },
137
+ {
138
+ "description": "ECMA 262 \\w matches ascii letters only",
139
+ "schema": {
140
+ "type": "string",
141
+ "pattern": "^\\w$"
142
+ },
143
+ "tests": [
144
+ {
145
+ "description": "ASCII 'a' matches",
146
+ "data": "a",
147
+ "valid": true
148
+ },
149
+ {
150
+ "description": "latin-1 e-acute does not match (unlike e.g. Python)",
151
+ "data": "é",
152
+ "valid": false
153
+ }
154
+ ]
155
+ },
156
+ {
157
+ "description": "ECMA 262 \\w matches everything but ascii letters",
158
+ "schema": {
159
+ "type": "string",
160
+ "pattern": "^\\W$"
161
+ },
162
+ "tests": [
163
+ {
164
+ "description": "ASCII 'a' does not match",
165
+ "data": "a",
166
+ "valid": false
167
+ },
168
+ {
169
+ "description": "latin-1 e-acute matches (unlike e.g. Python)",
170
+ "data": "é",
171
+ "valid": true
172
+ }
173
+ ]
174
+ },
175
+ {
176
+ "description": "ECMA 262 \\s matches ascii whitespace only",
177
+ "schema": {
178
+ "type": "string",
179
+ "pattern": "^\\s$"
180
+ },
181
+ "tests": [
182
+ {
183
+ "description": "ASCII space matches",
184
+ "data": " ",
185
+ "valid": true
186
+ },
187
+ {
188
+ "description": "latin-1 non-breaking-space does not match (unlike e.g. Python)",
189
+ "data": "\u00a0",
190
+ "valid": false
191
+ }
192
+ ]
193
+ },
194
+ {
195
+ "description": "ECMA 262 \\S matches everything but ascii whitespace",
196
+ "schema": {
197
+ "type": "string",
198
+ "pattern": "^\\S$"
199
+ },
200
+ "tests": [
201
+ {
202
+ "description": "ASCII space does not match",
203
+ "data": " ",
204
+ "valid": false
205
+ },
206
+ {
207
+ "description": "latin-1 non-breaking-space matches (unlike e.g. Python)",
208
+ "data": "\u00a0",
209
+ "valid": true
210
+ }
211
+ ]
12
212
  }
13
213
  ]
@@ -85,5 +85,89 @@
85
85
  "valid": false
86
86
  }
87
87
  ]
88
+ },
89
+ {
90
+ "description": "uniqueItems with an array of items",
91
+ "schema": {
92
+ "items": [{"type": "boolean"}, {"type": "boolean"}],
93
+ "uniqueItems": true
94
+ },
95
+ "tests": [
96
+ {
97
+ "description": "[false, true] from items array is valid",
98
+ "data": [false, true],
99
+ "valid": true
100
+ },
101
+ {
102
+ "description": "[true, false] from items array is valid",
103
+ "data": [true, false],
104
+ "valid": true
105
+ },
106
+ {
107
+ "description": "[false, false] from items array is not valid",
108
+ "data": [false, false],
109
+ "valid": false
110
+ },
111
+ {
112
+ "description": "[true, true] from items array is not valid",
113
+ "data": [true, true],
114
+ "valid": false
115
+ },
116
+ {
117
+ "description": "unique array extended from [false, true] is valid",
118
+ "data": [false, true, "foo", "bar"],
119
+ "valid": true
120
+ },
121
+ {
122
+ "description": "unique array extended from [true, false] is valid",
123
+ "data": [true, false, "foo", "bar"],
124
+ "valid": true
125
+ },
126
+ {
127
+ "description": "non-unique array extended from [false, true] is not valid",
128
+ "data": [false, true, "foo", "foo"],
129
+ "valid": false
130
+ },
131
+ {
132
+ "description": "non-unique array extended from [true, false] is not valid",
133
+ "data": [true, false, "foo", "foo"],
134
+ "valid": false
135
+ }
136
+ ]
137
+ },
138
+ {
139
+ "description": "uniqueItems with an array of items and additionalItems=false",
140
+ "schema": {
141
+ "items": [{"type": "boolean"}, {"type": "boolean"}],
142
+ "uniqueItems": true,
143
+ "additionalItems": false
144
+ },
145
+ "tests": [
146
+ {
147
+ "description": "[false, true] from items array is valid",
148
+ "data": [false, true],
149
+ "valid": true
150
+ },
151
+ {
152
+ "description": "[true, false] from items array is valid",
153
+ "data": [true, false],
154
+ "valid": true
155
+ },
156
+ {
157
+ "description": "[false, false] from items array is not valid",
158
+ "data": [false, false],
159
+ "valid": false
160
+ },
161
+ {
162
+ "description": "[true, true] from items array is not valid",
163
+ "data": [true, true],
164
+ "valid": false
165
+ },
166
+ {
167
+ "description": "extra items are invalid even if unique",
168
+ "data": [false, true, null],
169
+ "valid": false
170
+ }
171
+ ]
88
172
  }
89
173
  ]
@@ -0,0 +1 @@
1
+ JSON-Schema-Test-Suite/tests/draft2019-09
@@ -1,8 +1,9 @@
1
1
  [tox]
2
2
  minversion = 1.6
3
- envlist = py27
3
+ envlist = sanity
4
4
  skipsdist = True
5
5
 
6
- [testenv]
6
+ [testenv:sanity]
7
+ # used just for validating the structure of the test case files themselves
7
8
  deps = jsonschema
8
9
  commands = {envpython} bin/jsonschema_suite check
@@ -9,56 +9,7 @@ module JSONSchemer
9
9
  JSON_POINTER_REGEX = /\A#{JSON_POINTER_REGEX_STRING}\z/.freeze
10
10
  RELATIVE_JSON_POINTER_REGEX = /\A(0|[1-9]\d*)(#|#{JSON_POINTER_REGEX_STRING})?\z/.freeze
11
11
  DATE_TIME_OFFSET_REGEX = /(Z|[\+\-]([01][0-9]|2[0-3]):[0-5][0-9])\z/i.freeze
12
-
13
- # https://github.com/ruby-rdf/rdf
14
-
15
- # IRI components
16
- UCSCHAR = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
17
- [\\u00A0-\\uD7FF]|[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFEF]|
18
- [\\u{10000}-\\u{1FFFD}]|[\\u{20000}-\\u{2FFFD}]|[\\u{30000}-\\u{3FFFD}]|
19
- [\\u{40000}-\\u{4FFFD}]|[\\u{50000}-\\u{5FFFD}]|[\\u{60000}-\\u{6FFFD}]|
20
- [\\u{70000}-\\u{7FFFD}]|[\\u{80000}-\\u{8FFFD}]|[\\u{90000}-\\u{9FFFD}]|
21
- [\\u{A0000}-\\u{AFFFD}]|[\\u{B0000}-\\u{BFFFD}]|[\\u{C0000}-\\u{CFFFD}]|
22
- [\\u{D0000}-\\u{DFFFD}]|[\\u{E1000}-\\u{EFFFD}]
23
- EOS
24
- IPRIVATE = Regexp.compile("[\\uE000-\\uF8FF]|[\\u{F0000}-\\u{FFFFD}]|[\\u100000-\\u10FFFD]").freeze
25
- SCHEME = Regexp.compile("[A-Za-z](?:[A-Za-z0-9+-\.])*").freeze
26
- PORT = Regexp.compile("[0-9]*").freeze
27
- IP_LITERAL = Regexp.compile("\\[[0-9A-Fa-f:\\.]*\\]").freeze # Simplified, no IPvFuture
28
- PCT_ENCODED = Regexp.compile("%[0-9A-Fa-f][0-9A-Fa-f]").freeze
29
- GEN_DELIMS = Regexp.compile("[:/\\?\\#\\[\\]@]").freeze
30
- SUB_DELIMS = Regexp.compile("[!\\$&'\\(\\)\\*\\+,;=]").freeze
31
- RESERVED = Regexp.compile("(?:#{GEN_DELIMS}|#{SUB_DELIMS})").freeze
32
- UNRESERVED = Regexp.compile("[A-Za-z0-9\._~-]").freeze
33
-
34
- IUNRESERVED = Regexp.compile("[A-Za-z0-9\._~-]|#{UCSCHAR}").freeze
35
-
36
- IPCHAR = Regexp.compile("(?:#{IUNRESERVED}|#{PCT_ENCODED}|#{SUB_DELIMS}|:|@)").freeze
37
-
38
- IQUERY = Regexp.compile("(?:#{IPCHAR}|#{IPRIVATE}|/|\\?)*").freeze
39
-
40
- IFRAGMENT = Regexp.compile("(?:#{IPCHAR}|/|\\?)*").freeze.freeze
41
-
42
- ISEGMENT = Regexp.compile("(?:#{IPCHAR})*").freeze
43
- ISEGMENT_NZ = Regexp.compile("(?:#{IPCHAR})+").freeze
44
- ISEGMENT_NZ_NC = Regexp.compile("(?:(?:#{IUNRESERVED})|(?:#{PCT_ENCODED})|(?:#{SUB_DELIMS})|@)+").freeze
45
-
46
- IPATH_ABEMPTY = Regexp.compile("(?:/#{ISEGMENT})*").freeze
47
- IPATH_ABSOLUTE = Regexp.compile("/(?:(?:#{ISEGMENT_NZ})(/#{ISEGMENT})*)?").freeze
48
- IPATH_NOSCHEME = Regexp.compile("(?:#{ISEGMENT_NZ_NC})(?:/#{ISEGMENT})*").freeze
49
- IPATH_ROOTLESS = Regexp.compile("(?:#{ISEGMENT_NZ})(?:/#{ISEGMENT})*").freeze
50
- IPATH_EMPTY = Regexp.compile("").freeze
51
-
52
- IREG_NAME = Regexp.compile("(?:(?:#{IUNRESERVED})|(?:#{PCT_ENCODED})|(?:#{SUB_DELIMS}))*").freeze
53
- IHOST = Regexp.compile("(?:#{IP_LITERAL})|(?:#{IREG_NAME})").freeze
54
- IUSERINFO = Regexp.compile("(?:(?:#{IUNRESERVED})|(?:#{PCT_ENCODED})|(?:#{SUB_DELIMS})|:)*").freeze
55
- IAUTHORITY = Regexp.compile("(?:#{IUSERINFO}@)?#{IHOST}(?::#{PORT})?").freeze
56
-
57
- IRELATIVE_PART = Regexp.compile("(?:(?://#{IAUTHORITY}(?:#{IPATH_ABEMPTY}))|(?:#{IPATH_ABSOLUTE})|(?:#{IPATH_NOSCHEME})|(?:#{IPATH_EMPTY}))").freeze
58
- IRELATIVE_REF = Regexp.compile("^#{IRELATIVE_PART}(?:\\?#{IQUERY})?(?:\\##{IFRAGMENT})?$").freeze
59
-
60
- IHIER_PART = Regexp.compile("(?:(?://#{IAUTHORITY}#{IPATH_ABEMPTY})|(?:#{IPATH_ABSOLUTE})|(?:#{IPATH_ROOTLESS})|(?:#{IPATH_EMPTY}))").freeze
61
- IRI = Regexp.compile("^#{SCHEME}:(?:#{IHIER_PART})(?:\\?#{IQUERY})?(?:\\##{IFRAGMENT})?$").freeze
12
+ INVALID_QUERY_REGEX = /[[:space:]]/.freeze
62
13
 
63
14
  def valid_spec_format?(data, format)
64
15
  case format
@@ -81,13 +32,13 @@ module JSONSchemer
81
32
  when 'ipv6'
82
33
  valid_ip?(data, :v6)
83
34
  when 'uri'
84
- data.ascii_only? && valid_iri?(data)
35
+ valid_uri?(data)
85
36
  when 'uri-reference'
86
- data.ascii_only? && (valid_iri?(data) || valid_iri_reference?(data))
37
+ valid_uri_reference?(data)
87
38
  when 'iri'
88
- valid_iri?(data)
39
+ valid_uri?(iri_escape(data))
89
40
  when 'iri-reference'
90
- valid_iri?(data) || valid_iri_reference?(data)
41
+ valid_uri_reference?(iri_escape(data))
91
42
  when 'uri-template'
92
43
  valid_uri_template?(data)
93
44
  when 'json-pointer'
@@ -129,12 +80,28 @@ module JSONSchemer
129
80
  false
130
81
  end
131
82
 
132
- def valid_iri?(data)
133
- IRI.match?(data)
83
+ def parse_uri_scheme(data)
84
+ scheme, _userinfo, _host, _port, _registry, _path, opaque, query, _fragment = URI::RFC3986_PARSER.split(data)
85
+ # URI::RFC3986_PARSER.parse allows spaces in these and I don't think it should
86
+ raise URI::InvalidURIError if INVALID_QUERY_REGEX.match?(query) || INVALID_QUERY_REGEX.match?(opaque)
87
+ scheme
88
+ end
89
+
90
+ def valid_uri?(data)
91
+ !!parse_uri_scheme(data)
92
+ rescue URI::InvalidURIError
93
+ false
94
+ end
95
+
96
+ def valid_uri_reference?(data)
97
+ parse_uri_scheme(data)
98
+ true
99
+ rescue URI::InvalidURIError
100
+ false
134
101
  end
135
102
 
136
- def valid_iri_reference?(data)
137
- IRELATIVE_REF.match?(data)
103
+ def iri_escape(data)
104
+ URI.escape(data, /[^[[:ascii:]]]/)
138
105
  end
139
106
 
140
107
  def valid_uri_template?(data)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module JSONSchemer
3
- VERSION = '0.2.7'
3
+ VERSION = '0.2.8'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schemer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Harsha
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-23 00:00:00.000000000 Z
11
+ date: 2019-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -132,62 +132,64 @@ files:
132
132
  - JSON-Schema-Test-Suite/remotes/name.json
133
133
  - JSON-Schema-Test-Suite/remotes/subSchemas.json
134
134
  - JSON-Schema-Test-Suite/test-schema.json
135
- - JSON-Schema-Test-Suite/tests/draft2019-08/additionalItems.json
136
- - JSON-Schema-Test-Suite/tests/draft2019-08/additionalProperties.json
137
- - JSON-Schema-Test-Suite/tests/draft2019-08/allOf.json
138
- - JSON-Schema-Test-Suite/tests/draft2019-08/anyOf.json
139
- - JSON-Schema-Test-Suite/tests/draft2019-08/boolean_schema.json
140
- - JSON-Schema-Test-Suite/tests/draft2019-08/const.json
141
- - JSON-Schema-Test-Suite/tests/draft2019-08/contains.json
142
- - JSON-Schema-Test-Suite/tests/draft2019-08/default.json
143
- - JSON-Schema-Test-Suite/tests/draft2019-08/defs.json
144
- - JSON-Schema-Test-Suite/tests/draft2019-08/dependencies.json
145
- - JSON-Schema-Test-Suite/tests/draft2019-08/enum.json
146
- - JSON-Schema-Test-Suite/tests/draft2019-08/exclusiveMaximum.json
147
- - JSON-Schema-Test-Suite/tests/draft2019-08/exclusiveMinimum.json
148
- - JSON-Schema-Test-Suite/tests/draft2019-08/if-then-else.json
149
- - JSON-Schema-Test-Suite/tests/draft2019-08/items.json
150
- - JSON-Schema-Test-Suite/tests/draft2019-08/maxItems.json
151
- - JSON-Schema-Test-Suite/tests/draft2019-08/maxLength.json
152
- - JSON-Schema-Test-Suite/tests/draft2019-08/maxProperties.json
153
- - JSON-Schema-Test-Suite/tests/draft2019-08/maximum.json
154
- - JSON-Schema-Test-Suite/tests/draft2019-08/minItems.json
155
- - JSON-Schema-Test-Suite/tests/draft2019-08/minLength.json
156
- - JSON-Schema-Test-Suite/tests/draft2019-08/minProperties.json
157
- - JSON-Schema-Test-Suite/tests/draft2019-08/minimum.json
158
- - JSON-Schema-Test-Suite/tests/draft2019-08/multipleOf.json
159
- - JSON-Schema-Test-Suite/tests/draft2019-08/not.json
160
- - JSON-Schema-Test-Suite/tests/draft2019-08/oneOf.json
161
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/bignum.json
162
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/content.json
163
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/ecmascript-regex.json
164
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/date-time.json
165
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/date.json
166
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/email.json
167
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/hostname.json
168
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/idn-email.json
169
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/idn-hostname.json
170
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/ipv4.json
171
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/ipv6.json
172
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/iri-reference.json
173
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/iri.json
174
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/json-pointer.json
175
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/regex.json
176
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/relative-json-pointer.json
177
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/time.json
178
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/uri-reference.json
179
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/uri-template.json
180
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/format/uri.json
181
- - JSON-Schema-Test-Suite/tests/draft2019-08/optional/zeroTerminatedFloats.json
182
- - JSON-Schema-Test-Suite/tests/draft2019-08/pattern.json
183
- - JSON-Schema-Test-Suite/tests/draft2019-08/patternProperties.json
184
- - JSON-Schema-Test-Suite/tests/draft2019-08/properties.json
185
- - JSON-Schema-Test-Suite/tests/draft2019-08/propertyNames.json
186
- - JSON-Schema-Test-Suite/tests/draft2019-08/ref.json
187
- - JSON-Schema-Test-Suite/tests/draft2019-08/refRemote.json
188
- - JSON-Schema-Test-Suite/tests/draft2019-08/required.json
189
- - JSON-Schema-Test-Suite/tests/draft2019-08/type.json
190
- - JSON-Schema-Test-Suite/tests/draft2019-08/uniqueItems.json
135
+ - JSON-Schema-Test-Suite/tests/draft2019-09/additionalItems.json
136
+ - JSON-Schema-Test-Suite/tests/draft2019-09/additionalProperties.json
137
+ - JSON-Schema-Test-Suite/tests/draft2019-09/allOf.json
138
+ - JSON-Schema-Test-Suite/tests/draft2019-09/anchor.json
139
+ - JSON-Schema-Test-Suite/tests/draft2019-09/anyOf.json
140
+ - JSON-Schema-Test-Suite/tests/draft2019-09/boolean_schema.json
141
+ - JSON-Schema-Test-Suite/tests/draft2019-09/const.json
142
+ - JSON-Schema-Test-Suite/tests/draft2019-09/contains.json
143
+ - JSON-Schema-Test-Suite/tests/draft2019-09/default.json
144
+ - JSON-Schema-Test-Suite/tests/draft2019-09/defs.json
145
+ - JSON-Schema-Test-Suite/tests/draft2019-09/dependencies.json
146
+ - JSON-Schema-Test-Suite/tests/draft2019-09/enum.json
147
+ - JSON-Schema-Test-Suite/tests/draft2019-09/exclusiveMaximum.json
148
+ - JSON-Schema-Test-Suite/tests/draft2019-09/exclusiveMinimum.json
149
+ - JSON-Schema-Test-Suite/tests/draft2019-09/format.json
150
+ - JSON-Schema-Test-Suite/tests/draft2019-09/if-then-else.json
151
+ - JSON-Schema-Test-Suite/tests/draft2019-09/items.json
152
+ - JSON-Schema-Test-Suite/tests/draft2019-09/maxItems.json
153
+ - JSON-Schema-Test-Suite/tests/draft2019-09/maxLength.json
154
+ - JSON-Schema-Test-Suite/tests/draft2019-09/maxProperties.json
155
+ - JSON-Schema-Test-Suite/tests/draft2019-09/maximum.json
156
+ - JSON-Schema-Test-Suite/tests/draft2019-09/minItems.json
157
+ - JSON-Schema-Test-Suite/tests/draft2019-09/minLength.json
158
+ - JSON-Schema-Test-Suite/tests/draft2019-09/minProperties.json
159
+ - JSON-Schema-Test-Suite/tests/draft2019-09/minimum.json
160
+ - JSON-Schema-Test-Suite/tests/draft2019-09/multipleOf.json
161
+ - JSON-Schema-Test-Suite/tests/draft2019-09/not.json
162
+ - JSON-Schema-Test-Suite/tests/draft2019-09/oneOf.json
163
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/bignum.json
164
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/content.json
165
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/ecmascript-regex.json
166
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/date-time.json
167
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/date.json
168
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/email.json
169
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/hostname.json
170
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/idn-email.json
171
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/idn-hostname.json
172
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/ipv4.json
173
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/ipv6.json
174
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/iri-reference.json
175
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/iri.json
176
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/json-pointer.json
177
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/regex.json
178
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/relative-json-pointer.json
179
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/time.json
180
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/uri-reference.json
181
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/uri-template.json
182
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/format/uri.json
183
+ - JSON-Schema-Test-Suite/tests/draft2019-09/optional/zeroTerminatedFloats.json
184
+ - JSON-Schema-Test-Suite/tests/draft2019-09/pattern.json
185
+ - JSON-Schema-Test-Suite/tests/draft2019-09/patternProperties.json
186
+ - JSON-Schema-Test-Suite/tests/draft2019-09/properties.json
187
+ - JSON-Schema-Test-Suite/tests/draft2019-09/propertyNames.json
188
+ - JSON-Schema-Test-Suite/tests/draft2019-09/ref.json
189
+ - JSON-Schema-Test-Suite/tests/draft2019-09/refRemote.json
190
+ - JSON-Schema-Test-Suite/tests/draft2019-09/required.json
191
+ - JSON-Schema-Test-Suite/tests/draft2019-09/type.json
192
+ - JSON-Schema-Test-Suite/tests/draft2019-09/uniqueItems.json
191
193
  - JSON-Schema-Test-Suite/tests/draft3/additionalItems.json
192
194
  - JSON-Schema-Test-Suite/tests/draft3/additionalProperties.json
193
195
  - JSON-Schema-Test-Suite/tests/draft3/default.json
@@ -196,6 +198,7 @@ files:
196
198
  - JSON-Schema-Test-Suite/tests/draft3/divisibleBy.json
197
199
  - JSON-Schema-Test-Suite/tests/draft3/enum.json
198
200
  - JSON-Schema-Test-Suite/tests/draft3/extends.json
201
+ - JSON-Schema-Test-Suite/tests/draft3/format.json
199
202
  - JSON-Schema-Test-Suite/tests/draft3/items.json
200
203
  - JSON-Schema-Test-Suite/tests/draft3/maxItems.json
201
204
  - JSON-Schema-Test-Suite/tests/draft3/maxLength.json
@@ -204,8 +207,8 @@ files:
204
207
  - JSON-Schema-Test-Suite/tests/draft3/minLength.json
205
208
  - JSON-Schema-Test-Suite/tests/draft3/minimum.json
206
209
  - JSON-Schema-Test-Suite/tests/draft3/optional/bignum.json
210
+ - JSON-Schema-Test-Suite/tests/draft3/optional/ecmascript-regex.json
207
211
  - JSON-Schema-Test-Suite/tests/draft3/optional/format.json
208
- - JSON-Schema-Test-Suite/tests/draft3/optional/jsregex.json
209
212
  - JSON-Schema-Test-Suite/tests/draft3/optional/zeroTerminatedFloats.json
210
213
  - JSON-Schema-Test-Suite/tests/draft3/pattern.json
211
214
  - JSON-Schema-Test-Suite/tests/draft3/patternProperties.json
@@ -223,6 +226,7 @@ files:
223
226
  - JSON-Schema-Test-Suite/tests/draft4/definitions.json
224
227
  - JSON-Schema-Test-Suite/tests/draft4/dependencies.json
225
228
  - JSON-Schema-Test-Suite/tests/draft4/enum.json
229
+ - JSON-Schema-Test-Suite/tests/draft4/format.json
226
230
  - JSON-Schema-Test-Suite/tests/draft4/items.json
227
231
  - JSON-Schema-Test-Suite/tests/draft4/maxItems.json
228
232
  - JSON-Schema-Test-Suite/tests/draft4/maxLength.json
@@ -260,6 +264,7 @@ files:
260
264
  - JSON-Schema-Test-Suite/tests/draft6/enum.json
261
265
  - JSON-Schema-Test-Suite/tests/draft6/exclusiveMaximum.json
262
266
  - JSON-Schema-Test-Suite/tests/draft6/exclusiveMinimum.json
267
+ - JSON-Schema-Test-Suite/tests/draft6/format.json
263
268
  - JSON-Schema-Test-Suite/tests/draft6/items.json
264
269
  - JSON-Schema-Test-Suite/tests/draft6/maxItems.json
265
270
  - JSON-Schema-Test-Suite/tests/draft6/maxLength.json
@@ -298,6 +303,7 @@ files:
298
303
  - JSON-Schema-Test-Suite/tests/draft7/enum.json
299
304
  - JSON-Schema-Test-Suite/tests/draft7/exclusiveMaximum.json
300
305
  - JSON-Schema-Test-Suite/tests/draft7/exclusiveMinimum.json
306
+ - JSON-Schema-Test-Suite/tests/draft7/format.json
301
307
  - JSON-Schema-Test-Suite/tests/draft7/if-then-else.json
302
308
  - JSON-Schema-Test-Suite/tests/draft7/items.json
303
309
  - JSON-Schema-Test-Suite/tests/draft7/maxItems.json
@@ -341,6 +347,7 @@ files:
341
347
  - JSON-Schema-Test-Suite/tests/draft7/required.json
342
348
  - JSON-Schema-Test-Suite/tests/draft7/type.json
343
349
  - JSON-Schema-Test-Suite/tests/draft7/uniqueItems.json
350
+ - JSON-Schema-Test-Suite/tests/latest
344
351
  - JSON-Schema-Test-Suite/tox.ini
345
352
  - LICENSE.txt
346
353
  - README.md