json-schema 2.8.1 → 4.1.1

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +54 -10
  3. data/lib/json-schema/attribute.rb +13 -14
  4. data/lib/json-schema/attributes/additionalitems.rb +1 -0
  5. data/lib/json-schema/attributes/additionalproperties.rb +3 -6
  6. data/lib/json-schema/attributes/allof.rb +6 -4
  7. data/lib/json-schema/attributes/anyof.rb +2 -2
  8. data/lib/json-schema/attributes/const.rb +15 -0
  9. data/lib/json-schema/attributes/dependencies.rb +1 -0
  10. data/lib/json-schema/attributes/disallow.rb +2 -1
  11. data/lib/json-schema/attributes/enum.rb +2 -2
  12. data/lib/json-schema/attributes/extends.rb +6 -6
  13. data/lib/json-schema/attributes/format.rb +2 -1
  14. data/lib/json-schema/attributes/formats/date.rb +1 -0
  15. data/lib/json-schema/attributes/formats/date_time.rb +2 -1
  16. data/lib/json-schema/attributes/formats/date_time_v4.rb +1 -0
  17. data/lib/json-schema/attributes/formats/ip.rb +1 -1
  18. data/lib/json-schema/attributes/formats/uri.rb +1 -0
  19. data/lib/json-schema/attributes/items.rb +1 -0
  20. data/lib/json-schema/attributes/limits/numeric.rb +1 -1
  21. data/lib/json-schema/attributes/maxdecimal.rb +1 -1
  22. data/lib/json-schema/attributes/not.rb +2 -2
  23. data/lib/json-schema/attributes/oneof.rb +2 -4
  24. data/lib/json-schema/attributes/patternproperties.rb +1 -0
  25. data/lib/json-schema/attributes/properties.rb +7 -7
  26. data/lib/json-schema/attributes/properties_v4.rb +1 -1
  27. data/lib/json-schema/attributes/propertynames.rb +23 -0
  28. data/lib/json-schema/attributes/ref.rb +7 -7
  29. data/lib/json-schema/attributes/required.rb +3 -2
  30. data/lib/json-schema/attributes/type.rb +3 -2
  31. data/lib/json-schema/attributes/type_v4.rb +1 -1
  32. data/lib/json-schema/errors/validation_error.rb +4 -5
  33. data/lib/json-schema/schema/reader.rb +3 -1
  34. data/lib/json-schema/schema/validator.rb +3 -3
  35. data/lib/json-schema/schema.rb +3 -4
  36. data/lib/json-schema/util/array_set.rb +1 -1
  37. data/lib/json-schema/util/uri.rb +7 -7
  38. data/lib/json-schema/util/uuid.rb +227 -226
  39. data/lib/json-schema/validator.rb +119 -114
  40. data/lib/json-schema/validators/draft1.rb +21 -23
  41. data/lib/json-schema/validators/draft2.rb +22 -24
  42. data/lib/json-schema/validators/draft3.rb +26 -28
  43. data/lib/json-schema/validators/draft4.rb +34 -36
  44. data/lib/json-schema/validators/draft6.rb +36 -36
  45. data/lib/json-schema/validators/hyper-draft1.rb +2 -3
  46. data/lib/json-schema/validators/hyper-draft2.rb +2 -3
  47. data/lib/json-schema/validators/hyper-draft3.rb +2 -3
  48. data/lib/json-schema/validators/hyper-draft4.rb +2 -3
  49. data/lib/json-schema/validators/hyper-draft6.rb +2 -3
  50. data/lib/json-schema.rb +2 -2
  51. data/resources/draft-06.json +12 -12
  52. metadata +15 -13
@@ -23,262 +23,263 @@
23
23
  # 2009-02-20: Modified by Pablo Lorenzoni <pablo@propus.com.br> to correctly
24
24
  # include the version in the raw_bytes.
25
25
 
26
-
27
26
  require 'digest/md5'
28
27
  require 'digest/sha1'
29
28
  require 'tmpdir'
30
29
 
31
30
  module JSON
32
31
  module Util
33
-
34
32
  # Pure ruby UUID generator, which is compatible with RFC4122
35
33
  UUID = Struct.new :raw_bytes
36
-
34
+
37
35
  class UUID
38
- private_class_method :new
36
+ private_class_method :new
37
+
38
+ class << self
39
+ # :nodoc
40
+ def mask19 v, str
41
+ nstr = str.bytes.to_a
42
+ version = [0, 16, 32, 48, 64, 80][v]
43
+ nstr[6] &= 0b00001111
44
+ nstr[6] |= version
45
+ # nstr[7] &= 0b00001111
46
+ # nstr[7] |= 0b01010000
47
+ nstr[8] &= 0b00111111
48
+ nstr[8] |= 0b10000000
49
+ str = ''
50
+ nstr.each { |s| str << s.chr }
51
+ str
52
+ end
39
53
 
40
- class << self
41
- def mask19 v, str # :nodoc
42
- nstr = str.bytes.to_a
43
- version = [0, 16, 32, 48, 64, 80][v]
44
- nstr[6] &= 0b00001111
45
- nstr[6] |= version
46
- # nstr[7] &= 0b00001111
47
- # nstr[7] |= 0b01010000
48
- nstr[8] &= 0b00111111
49
- nstr[8] |= 0b10000000
50
- str = ''
51
- nstr.each { |s| str << s.chr }
52
- str
53
- end
54
+ # :nodoc
55
+ def mask18 v, str
56
+ version = [0, 16, 32, 48, 64, 80][v]
57
+ str[6] &= 0b00001111
58
+ str[6] |= version
59
+ # str[7] &= 0b00001111
60
+ # str[7] |= 0b01010000
61
+ str[8] &= 0b00111111
62
+ str[8] |= 0b10000000
63
+ str
64
+ end
54
65
 
55
- def mask18 v, str # :nodoc
56
- version = [0, 16, 32, 48, 64, 80][v]
57
- str[6] &= 0b00001111
58
- str[6] |= version
59
- # str[7] &= 0b00001111
60
- # str[7] |= 0b01010000
61
- str[8] &= 0b00111111
62
- str[8] |= 0b10000000
63
- str
64
- end
66
+ def mask v, str
67
+ if RUBY_VERSION >= '1.9.0'
68
+ mask19 v, str
69
+ else
70
+ mask18 v, str
71
+ end
72
+ end
73
+ private :mask, :mask18, :mask19
65
74
 
66
- def mask v, str
67
- if RUBY_VERSION >= "1.9.0"
68
- return mask19 v, str
69
- else
70
- return mask18 v, str
71
- end
72
- end
73
- private :mask, :mask18, :mask19
75
+ # UUID generation using SHA1. Recommended over create_md5.
76
+ # Namespace object is another UUID, some of them are pre-defined below.
77
+ def create_sha1 str, namespace
78
+ sha1 = Digest::SHA1.new
79
+ sha1.update namespace.raw_bytes
80
+ sha1.update str
81
+ sum = sha1.digest
82
+ raw = mask 5, sum[0..15]
83
+ ret = new raw
84
+ ret.freeze
85
+ ret
86
+ end
87
+ alias :create_v5 :create_sha1
74
88
 
75
- # UUID generation using SHA1. Recommended over create_md5.
76
- # Namespace object is another UUID, some of them are pre-defined below.
77
- def create_sha1 str, namespace
78
- sha1 = Digest::SHA1.new
79
- sha1.update namespace.raw_bytes
80
- sha1.update str
81
- sum = sha1.digest
82
- raw = mask 5, sum[0..15]
83
- ret = new raw
84
- ret.freeze
85
- ret
86
- end
87
- alias :create_v5 :create_sha1
89
+ # UUID generation using MD5 (for backward compat.)
90
+ def create_md5 str, namespace
91
+ md5 = Digest::MD5.new
92
+ md5.update namespace.raw_bytes
93
+ md5.update str
94
+ sum = md5.digest
95
+ raw = mask 3, sum[0..16]
96
+ ret = new raw
97
+ ret.freeze
98
+ ret
99
+ end
100
+ alias :create_v3 :create_md5
88
101
 
89
- # UUID generation using MD5 (for backward compat.)
90
- def create_md5 str, namespace
91
- md5 = Digest::MD5.new
92
- md5.update namespace.raw_bytes
93
- md5.update str
94
- sum = md5.digest
95
- raw = mask 3, sum[0..16]
96
- ret = new raw
97
- ret.freeze
98
- ret
99
- end
100
- alias :create_v3 :create_md5
102
+ # UUID generation using random-number generator. From it's random
103
+ # nature, there's no warranty that the created ID is really universaly
104
+ # unique.
105
+ def create_random
106
+ rnd = [
107
+ rand(0x100000000),
108
+ rand(0x100000000),
109
+ rand(0x100000000),
110
+ rand(0x100000000),
111
+ ].pack 'N4'
112
+ raw = mask 4, rnd
113
+ ret = new raw
114
+ ret.freeze
115
+ ret
116
+ end
117
+ alias :create_v4 :create_random
101
118
 
102
- # UUID generation using random-number generator. From it's random
103
- # nature, there's no warranty that the created ID is really universaly
104
- # unique.
105
- def create_random
106
- rnd = [
107
- rand(0x100000000),
108
- rand(0x100000000),
109
- rand(0x100000000),
110
- rand(0x100000000),
111
- ].pack "N4"
112
- raw = mask 4, rnd
113
- ret = new raw
114
- ret.freeze
115
- ret
116
- end
117
- alias :create_v4 :create_random
119
+ def read_state fp # :nodoc:
120
+ fp.rewind
121
+ Marshal.load fp.read
122
+ end
118
123
 
119
- def read_state fp # :nodoc:
120
- fp.rewind
121
- Marshal.load fp.read
122
- end
124
+ def write_state fp, c, m # :nodoc:
125
+ fp.rewind
126
+ str = Marshal.dump [c, m]
127
+ fp.write str
128
+ end
123
129
 
124
- def write_state fp, c, m # :nodoc:
125
- fp.rewind
126
- str = Marshal.dump [c, m]
127
- fp.write str
128
- end
130
+ private :read_state, :write_state
131
+ STATE_FILE = 'ruby-uuid'
129
132
 
130
- private :read_state, :write_state
131
- STATE_FILE = 'ruby-uuid'
133
+ # create the "version 1" UUID with current system clock, current UTC
134
+ # timestamp, and the IEEE 802 address (so-called MAC address).
135
+ #
136
+ # Speed notice: it's slow. It writes some data into hard drive on every
137
+ # invokation. If you want to speed this up, try remounting tmpdir with a
138
+ # memory based filesystem (such as tmpfs). STILL slow? then no way but
139
+ # rewrite it with c :)
140
+ def create clock = nil, time = nil, mac_addr = nil
141
+ c = t = m = nil
142
+ Dir.chdir Dir.tmpdir do
143
+ unless FileTest.exist? STATE_FILE then
144
+ # Generate a pseudo MAC address because we have no pure-ruby way
145
+ # to know the MAC address of the NIC this system uses. Note
146
+ # that cheating with pseudo arresses here is completely legal:
147
+ # see Section 4.5 of RFC4122 for details.
148
+ sha1 = Digest::SHA1.new
149
+ 256.times do
150
+ r = [rand(0x100000000)].pack 'N'
151
+ sha1.update r
152
+ end
153
+ str = sha1.digest
154
+ r = rand 14 # 20-6
155
+ node = str[r, 6] || str
156
+ if RUBY_VERSION >= '1.9.0'
157
+ nnode = node.bytes.to_a
158
+ nnode[0] |= 0x01
159
+ node = ''
160
+ nnode.each { |s| node << s.chr }
161
+ else
162
+ node[0] |= 0x01 # multicast bit
163
+ end
164
+ k = rand 0x40000
165
+ open STATE_FILE, 'w' do |fp|
166
+ fp.flock IO::LOCK_EX
167
+ write_state fp, k, node
168
+ fp.chmod 0o777 # must be world writable
169
+ end
170
+ end
171
+ open STATE_FILE, 'r+' do |fp|
172
+ fp.flock IO::LOCK_EX
173
+ c, m = read_state fp
174
+ c = clock % 0x4000 if clock
175
+ m = mac_addr if mac_addr
176
+ t = time
177
+ if t.nil? then
178
+ # UUID epoch is 1582/Oct/15
179
+ tt = Time.now
180
+ t = tt.to_i * 10000000 + tt.tv_usec * 10 + 0x01B21DD213814000
181
+ end
182
+ c = c.succ # important; increment here
183
+ write_state fp, c, m
184
+ end
185
+ end
132
186
 
133
- # create the "version 1" UUID with current system clock, current UTC
134
- # timestamp, and the IEEE 802 address (so-called MAC address).
135
- #
136
- # Speed notice: it's slow. It writes some data into hard drive on every
137
- # invokation. If you want to speed this up, try remounting tmpdir with a
138
- # memory based filesystem (such as tmpfs). STILL slow? then no way but
139
- # rewrite it with c :)
140
- def create clock=nil, time=nil, mac_addr=nil
141
- c = t = m = nil
142
- Dir.chdir Dir.tmpdir do
143
- unless FileTest.exist? STATE_FILE then
144
- # Generate a pseudo MAC address because we have no pure-ruby way
145
- # to know the MAC address of the NIC this system uses. Note
146
- # that cheating with pseudo arresses here is completely legal:
147
- # see Section 4.5 of RFC4122 for details.
148
- sha1 = Digest::SHA1.new
149
- 256.times do
150
- r = [rand(0x100000000)].pack "N"
151
- sha1.update r
152
- end
153
- str = sha1.digest
154
- r = rand 14 # 20-6
155
- node = str[r, 6] || str
156
- if RUBY_VERSION >= "1.9.0"
157
- nnode = node.bytes.to_a
158
- nnode[0] |= 0x01
159
- node = ''
160
- nnode.each { |s| node << s.chr }
161
- else
162
- node[0] |= 0x01 # multicast bit
163
- end
164
- k = rand 0x40000
165
- open STATE_FILE, 'w' do |fp|
166
- fp.flock IO::LOCK_EX
167
- write_state fp, k, node
168
- fp.chmod 0o777 # must be world writable
169
- end
170
- end
171
- open STATE_FILE, 'r+' do |fp|
172
- fp.flock IO::LOCK_EX
173
- c, m = read_state fp
174
- c = clock % 0x4000 if clock
175
- m = mac_addr if mac_addr
176
- t = time
177
- if t.nil? then
178
- # UUID epoch is 1582/Oct/15
179
- tt = Time.now
180
- t = tt.to_i*10000000 + tt.tv_usec*10 + 0x01B21DD213814000
181
- end
182
- c = c.succ # important; increment here
183
- write_state fp, c, m
184
- end
185
- end
187
+ tl = t & 0xFFFF_FFFF
188
+ tm = t >> 32
189
+ tm = tm & 0xFFFF
190
+ th = t >> 48
191
+ th = th & 0x0FFF
192
+ th = th | 0x1000
193
+ cl = c & 0xFF
194
+ ch = c & 0x3F00
195
+ ch = ch >> 8
196
+ ch = ch | 0x80
197
+ pack tl, tm, th, cl, ch, m
198
+ end
199
+ alias :create_v1 :create
186
200
 
187
- tl = t & 0xFFFF_FFFF
188
- tm = t >> 32
189
- tm = tm & 0xFFFF
190
- th = t >> 48
191
- th = th & 0x0FFF
192
- th = th | 0x1000
193
- cl = c & 0xFF
194
- ch = c & 0x3F00
195
- ch = ch >> 8
196
- ch = ch | 0x80
197
- pack tl, tm, th, cl, ch, m
198
- end
199
- alias :create_v1 :create
201
+ # A simple GUID parser: just ignores unknown characters and convert
202
+ # hexadecimal dump into 16-octet object.
203
+ def parse obj
204
+ str = obj.to_s.sub(/\Aurn:uuid:/, '')
205
+ str.gsub!(/[^0-9A-Fa-f]/, '')
206
+ raw = str[0..31].lines.to_a.pack 'H*'
207
+ ret = new raw
208
+ ret.freeze
209
+ ret
210
+ end
200
211
 
201
- # A simple GUID parser: just ignores unknown characters and convert
202
- # hexadecimal dump into 16-octet object.
203
- def parse obj
204
- str = obj.to_s.sub %r/\Aurn:uuid:/, ''
205
- str.gsub! %r/[^0-9A-Fa-f]/, ''
206
- raw = str[0..31].lines.to_a.pack 'H*'
207
- ret = new raw
208
- ret.freeze
209
- ret
210
- end
212
+ # The 'primitive constructor' of this class
213
+ # Note UUID.pack(uuid.unpack) == uuid
214
+ def pack tl, tm, th, ch, cl, n
215
+ raw = [tl, tm, th, ch, cl, n].pack 'NnnCCa6'
216
+ ret = new raw
217
+ ret.freeze
218
+ ret
219
+ end
220
+ end
211
221
 
212
- # The 'primitive constructor' of this class
213
- # Note UUID.pack(uuid.unpack) == uuid
214
- def pack tl, tm, th, ch, cl, n
215
- raw = [tl, tm, th, ch, cl, n].pack "NnnCCa6"
216
- ret = new raw
217
- ret.freeze
218
- ret
219
- end
220
- end
222
+ # The 'primitive deconstructor', or the dual to pack.
223
+ # Note UUID.pack(uuid.unpack) == uuid
224
+ def unpack
225
+ raw_bytes.unpack 'NnnCCa6'
226
+ end
221
227
 
222
- # The 'primitive deconstructor', or the dual to pack.
223
- # Note UUID.pack(uuid.unpack) == uuid
224
- def unpack
225
- raw_bytes.unpack "NnnCCa6"
226
- end
228
+ # Generate the string representation (a.k.a GUID) of this UUID
229
+ def to_s
230
+ a = unpack
231
+ tmp = a[-1].unpack 'C*'
232
+ a[-1] = format '%02x%02x%02x%02x%02x%02x', *tmp
233
+ '%08x-%04x-%04x-%02x%02x-%s' % a
234
+ end
235
+ alias guid to_s
227
236
 
228
- # Generate the string representation (a.k.a GUID) of this UUID
229
- def to_s
230
- a = unpack
231
- tmp = a[-1].unpack 'C*'
232
- a[-1] = sprintf '%02x%02x%02x%02x%02x%02x', *tmp
233
- "%08x-%04x-%04x-%02x%02x-%s" % a
234
- end
235
- alias guid to_s
237
+ # Convert into a RFC4122-comforming URN representation
238
+ def to_uri
239
+ 'urn:uuid:' + to_s
240
+ end
241
+ alias urn to_uri
236
242
 
237
- # Convert into a RFC4122-comforming URN representation
238
- def to_uri
239
- "urn:uuid:" + self.to_s
240
- end
241
- alias urn to_uri
243
+ # Convert into 128-bit unsigned integer
244
+ def to_int
245
+ tmp = raw_bytes.unpack 'C*'
246
+ tmp.inject do |r, i|
247
+ r * 256 | i
248
+ end
249
+ end
250
+ alias to_i to_int
242
251
 
243
- # Convert into 128-bit unsigned integer
244
- def to_int
245
- tmp = self.raw_bytes.unpack "C*"
246
- tmp.inject do |r, i|
247
- r * 256 | i
248
- end
249
- end
250
- alias to_i to_int
252
+ # Gets the version of this UUID
253
+ # returns nil if bad version
254
+ def version
255
+ a = unpack
256
+ v = (a[2] & 0xF000).to_s(16)[0].chr.to_i
257
+ return v if (1..5).include? v
251
258
 
252
- # Gets the version of this UUID
253
- # returns nil if bad version
254
- def version
255
- a = unpack
256
- v = (a[2] & 0xF000).to_s(16)[0].chr.to_i
257
- return v if (1..5).include? v
258
- return nil
259
- end
259
+ nil
260
+ end
260
261
 
261
- # Two UUIDs are said to be equal if and only if their (byte-order
262
- # canonicalized) integer representations are equivallent. Refer RFC4122 for
263
- # details.
264
- def == other
265
- to_i == other.to_i
266
- end
262
+ # Two UUIDs are said to be equal if and only if their (byte-order
263
+ # canonicalized) integer representations are equivallent. Refer RFC4122 for
264
+ # details.
265
+ def == other
266
+ to_i == other.to_i
267
+ end
267
268
 
268
- include Comparable
269
- # UUIDs are comparable (don't know what benefits are there, though).
270
- def <=> other
271
- to_s <=> other.to_s
272
- end
269
+ include Comparable
270
+ # UUIDs are comparable (don't know what benefits are there, though).
271
+ def <=> other
272
+ to_s <=> other.to_s
273
+ end
273
274
 
274
- # Pre-defined UUID Namespaces described in RFC4122 Appendix C.
275
- NameSpace_DNS = parse "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
276
- NameSpace_URL = parse "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
277
- NameSpace_OID = parse "6ba7b812-9dad-11d1-80b4-00c04fd430c8"
278
- NameSpace_X500 = parse "6ba7b814-9dad-11d1-80b4-00c04fd430c8"
275
+ # Pre-defined UUID Namespaces described in RFC4122 Appendix C.
276
+ NameSpace_DNS = parse '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
277
+ NameSpace_URL = parse '6ba7b811-9dad-11d1-80b4-00c04fd430c8'
278
+ NameSpace_OID = parse '6ba7b812-9dad-11d1-80b4-00c04fd430c8'
279
+ NameSpace_X500 = parse '6ba7b814-9dad-11d1-80b4-00c04fd430c8'
279
280
 
280
- # The Nil UUID in RFC4122 Section 4.1.7
281
- Nil = parse "00000000-0000-0000-0000-000000000000"
281
+ # The Nil UUID in RFC4122 Section 4.1.7
282
+ Nil = parse '00000000-0000-0000-0000-000000000000'
282
283
  end
283
284
  end
284
- end
285
+ end