json_schemer 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
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