jsonschema 2.0.1 → 2.0.2

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 (4) hide show
  1. data/README.rdoc +5 -0
  2. data/Rakefile +3 -11
  3. data/lib/jsonschema.rb +49 -39
  4. metadata +21 -29
@@ -41,6 +41,11 @@ if you have json library
41
41
  gem source -a http://gemcutter.org
42
42
  sudo gem install jsonschema
43
43
 
44
+ == CONTRIBUTORS:
45
+
46
+ * Matt Coneybeare
47
+ * hristian Bäuerlein
48
+
44
49
  == LICENSE:
45
50
 
46
51
  Ruby/jsonschema
data/Rakefile CHANGED
@@ -3,9 +3,8 @@ require 'rubygems'
3
3
  require 'rake'
4
4
  require 'rake/clean'
5
5
  require 'rake/testtask'
6
- require 'rake/packagetask'
7
- require 'rake/gempackagetask'
8
- require 'rake/rdoctask'
6
+ require 'rubygems/package_task'
7
+ require 'rake/task'
9
8
  require 'rake/contrib/rubyforgepublisher'
10
9
  require 'rake/contrib/sshpublisher'
11
10
  require 'fileutils'
@@ -58,18 +57,11 @@ spec = Gem::Specification.new do |s|
58
57
  s.files = %w(README.rdoc Rakefile) + Dir["{bin,test,lib}/**/*"]
59
58
  end
60
59
 
61
- Rake::GemPackageTask.new(spec) do |p|
60
+ Gem::PackageTask.new(spec) do |p|
62
61
  p.need_tar = true
63
62
  p.gem_spec = spec
64
63
  end
65
64
 
66
- Rake::RDocTask.new do |rdoc|
67
- rdoc.rdoc_dir = 'doc'
68
- rdoc.options += $rdoc_opts
69
- # rdoc.template = 'resh'
70
- rdoc.rdoc_files.include("README.rdoc", "lib/**/*.rb", "ext/**/*.c")
71
- end
72
-
73
65
  desc "gem spec"
74
66
  task :gemspec do
75
67
  File.open("#{$github_name}.gemspec", "wb") do |f|
@@ -2,7 +2,7 @@
2
2
 
3
3
  module JSON
4
4
  class Schema
5
- VERSION = '2.0.1'
5
+ VERSION = '2.0.2'
6
6
  class ValueError < Exception;end
7
7
  class Undefined;end
8
8
  TypesMap = {
@@ -21,10 +21,19 @@ module JSON
21
21
  @refmap = {}
22
22
  end
23
23
 
24
+ def keys
25
+ @keys ||= []
26
+ end
27
+
28
+ def key_path
29
+ keys.reject{|k| k == 'self'}.join(" > ")
30
+ end
31
+
24
32
  def check_property value, schema, key, parent
25
33
  if schema
34
+ keys.push key
26
35
  # if @interactive && schema['readonly']
27
- # raise ValueError, "#{key} is a readonly field , it can not be changed"
36
+ # raise ValueError, "#{key_path} is a readonly field , it can not be changed"
28
37
  # end
29
38
 
30
39
  if schema['id']
@@ -37,7 +46,7 @@ module JSON
37
46
 
38
47
  if value == Undefined
39
48
  unless schema['optional']
40
- raise ValueError, "#{key}: is missing and it is not optional"
49
+ raise ValueError, "#{key_path}: is missing and it is not optional"
41
50
  end
42
51
 
43
52
  # default
@@ -61,21 +70,21 @@ module JSON
61
70
  rescue ValueError
62
71
  flag = false
63
72
  end
64
- raise ValueError, "#{key}: disallowed value was matched" if flag
73
+ raise ValueError, "#{key_path}: disallowed value was matched" if flag
65
74
  end
66
75
 
67
76
  unless value.nil?
68
- if value.instance_of? Array
77
+ if value.kind_of? Array
69
78
  if schema['items']
70
- if schema['items'].instance_of?(Array)
79
+ if schema['items'].kind_of?(Array)
71
80
  schema['items'].each_with_index {|val, index|
72
81
  check_property(undefined_check(value, index), schema['items'][index], index, value)
73
82
  }
74
83
  if schema.include?('additionalProperties')
75
84
  additional = schema['additionalProperties']
76
- if additional.instance_of?(FalseClass)
85
+ if additional.kind_of?(FalseClass)
77
86
  if schema['items'].size < value.size
78
- raise ValueError, "#{key}: There are more values in the array than are allowed by the items and additionalProperties restrictions."
87
+ raise ValueError, "#{key_path}: There are more values in the array than are allowed by the items and additionalProperties restrictions."
79
88
  end
80
89
  else
81
90
  value.each_with_index {|val, index|
@@ -90,46 +99,46 @@ module JSON
90
99
  end
91
100
  end
92
101
  if schema['minItems'] && value.size < schema['minItems']
93
- raise ValueError, "#{key}: There must be a minimum of #{schema['minItems']} in the array"
102
+ raise ValueError, "#{key_path}: There must be a minimum of #{schema['minItems']} in the array"
94
103
  end
95
104
  if schema['maxItems'] && value.size > schema['maxItems']
96
- raise ValueError, "#{key}: There must be a maximum of #{schema['maxItems']} in the array"
105
+ raise ValueError, "#{key_path}: There must be a maximum of #{schema['maxItems']} in the array"
97
106
  end
98
107
  elsif schema['properties']
99
108
  check_object(value, schema['properties'], schema['additionalProperties'])
100
109
  elsif schema.include?('additionalProperties')
101
110
  additional = schema['additionalProperties']
102
- unless additional.instance_of?(TrueClass)
103
- if additional.instance_of?(Hash) || additional.instance_of?(FalseClass)
111
+ unless additional.kind_of?(TrueClass)
112
+ if additional.kind_of?(Hash) || additional.kind_of?(FalseClass)
104
113
  properties = {}
105
114
  value.each {|k, val|
106
- if additional.instance_of?(FalseClass)
107
- raise ValueError, "#{key}: Additional properties not defined by 'properties' are not allowed in field '#{k}'"
115
+ if additional.kind_of?(FalseClass)
116
+ raise ValueError, "#{key_path}: Additional properties not defined by 'properties' are not allowed in field '#{k}'"
108
117
  else
109
118
  check_property(val, schema['additionalProperties'], k, value)
110
119
  end
111
120
  }
112
121
  else
113
- raise ValueError, "#{key}: additionalProperties schema definition for field '#{}' is not an object"
122
+ raise ValueError, "#{key_path}: additionalProperties schema definition for field '#{}' is not an object"
114
123
  end
115
124
  end
116
125
  end
117
126
 
118
- if value.instance_of?(String)
127
+ if value.kind_of?(String)
119
128
  # pattern
120
129
  if schema['pattern'] && !(value =~ Regexp.new(schema['pattern']))
121
- raise ValueError, "#{key}: does not match the regex pattern #{schema['pattern']}"
130
+ raise ValueError, "#{key_path}: does not match the regex pattern #{schema['pattern']}"
122
131
  end
123
132
 
124
133
  strlen = value.split(//).size
125
134
  # maxLength
126
135
  if schema['maxLength'] && strlen > schema['maxLength']
127
- raise ValueError, "#{key}: may only be #{schema['maxLength']} characters long"
136
+ raise ValueError, "#{key_path}: may only be #{schema['maxLength']} characters long"
128
137
  end
129
138
 
130
139
  # minLength
131
140
  if schema['minLength'] && strlen < schema['minLength']
132
- raise ValueError, "#{key}: must be at least #{schema['minLength']} characters long"
141
+ raise ValueError, "#{key_path}: must be at least #{schema['minLength']} characters long"
133
142
  end
134
143
  end
135
144
 
@@ -140,11 +149,11 @@ module JSON
140
149
  minimumCanEqual = schema.fetch('minimumCanEqual', Undefined)
141
150
  if minimumCanEqual == Undefined || minimumCanEqual
142
151
  if value < schema['minimum']
143
- raise ValueError, "#{key}: must have a minimum value of #{schema['minimum']}"
152
+ raise ValueError, "#{key_path}: must have a minimum value of #{schema['minimum']}"
144
153
  end
145
154
  else
146
155
  if value <= schema['minimum']
147
- raise ValueError, "#{key}: must have a minimum value of #{schema['minimum']}"
156
+ raise ValueError, "#{key_path}: must have a minimum value of #{schema['minimum']}"
148
157
  end
149
158
  end
150
159
  end
@@ -154,11 +163,11 @@ module JSON
154
163
  maximumCanEqual = schema.fetch('maximumCanEqual', Undefined)
155
164
  if maximumCanEqual == Undefined || maximumCanEqual
156
165
  if value > schema['maximum']
157
- raise ValueError, "#{key}: must have a maximum value of #{schema['maximum']}"
166
+ raise ValueError, "#{key_path}: must have a maximum value of #{schema['maximum']}"
158
167
  end
159
168
  else
160
169
  if value >= schema['maximum']
161
- raise ValueError, "#{key}: must have a maximum value of #{schema['maximum']}"
170
+ raise ValueError, "#{key_path}: must have a maximum value of #{schema['maximum']}"
162
171
  end
163
172
  end
164
173
  end
@@ -166,7 +175,7 @@ module JSON
166
175
  # maxDecimal
167
176
  if schema['maxDecimal'] && schema['maxDecimal'].kind_of?(Numeric)
168
177
  if value.to_s =~ /\.\d{#{schema['maxDecimal']+1},}/
169
- raise ValueError, "#{key}: may only have #{schema['maxDecimal']} digits of decimal places"
178
+ raise ValueError, "#{key_path}: may only have #{schema['maxDecimal']} digits of decimal places"
170
179
  end
171
180
  end
172
181
 
@@ -175,18 +184,18 @@ module JSON
175
184
  # enum
176
185
  if schema['enum']
177
186
  unless(schema['enum'].detect{|enum| enum == value })
178
- raise ValueError, "#{key}: does not have a value in the enumeration #{schema['enum'].join(", ")}"
187
+ raise ValueError, "#{key_path}: does not have a value in the enumeration #{schema['enum'].join(", ")}"
179
188
  end
180
189
  end
181
190
 
182
191
  # description
183
- if schema['description'] && !schema['description'].instance_of?(String)
184
- raise ValueError, "#{key}: The description for field '#{value}' must be a string"
192
+ if schema['description'] && !schema['description'].kind_of?(String)
193
+ raise ValueError, "#{key_path}: The description for field '#{value}' must be a string"
185
194
  end
186
195
 
187
196
  # title
188
- if schema['title'] && !schema['title'].instance_of?(String)
189
- raise ValueError, "#{key}: The title for field '#{value}' must be a string"
197
+ if schema['title'] && !schema['title'].kind_of?(String)
198
+ raise ValueError, "#{key_path}: The title for field '#{value}' must be a string"
190
199
  end
191
200
 
192
201
  # format
@@ -195,12 +204,13 @@ module JSON
195
204
 
196
205
  end
197
206
  end
207
+ keys.pop
198
208
  end
199
209
  end
200
210
 
201
211
  def check_object value, object_type_def, additional
202
- if object_type_def.instance_of? Hash
203
- if !value.instance_of?(Hash) || value.instance_of?(Array)
212
+ if object_type_def.kind_of? Hash
213
+ if !value.kind_of?(Hash) || value.kind_of?(Array)
204
214
  raise ValueError, "an object is required"
205
215
  end
206
216
 
@@ -212,13 +222,13 @@ module JSON
212
222
  end
213
223
  value.each {|key, val|
214
224
  if key.index('__') != 0 && object_type_def && !object_type_def[key] && additional == false
215
- raise ValueError, "#{value.class} The property #{key} is not defined in the schema and the schema does not allow additional properties"
225
+ raise ValueError, "The property #{key_path} > #{key} is not defined in the schema and the schema does not allow additional properties"
216
226
  end
217
227
  requires = object_type_def && object_type_def[key] && object_type_def[key]['requires']
218
228
  if requires && !value.include?(requires)
219
- raise ValueError, "the presence of the property #{key} requires that #{requires} also be present"
229
+ raise ValueError, "The presence of the property #{key_path} > #{key} requires that #{requires} also be present"
220
230
  end
221
- if object_type_def && object_type_def.instance_of?(Hash) && !object_type_def.include?(key)
231
+ if object_type_def && object_type_def.kind_of?(Hash) && !object_type_def.include?(key)
222
232
  check_property(val, additional, key, value)
223
233
  end
224
234
  if !@interactive && val && val['$schema']
@@ -230,7 +240,7 @@ module JSON
230
240
  def check_type value, type, key, parent
231
241
  converted_fieldtype = convert_type(type)
232
242
  if converted_fieldtype
233
- if converted_fieldtype.instance_of? Array
243
+ if converted_fieldtype.kind_of? Array
234
244
  datavalid = false
235
245
  converted_fieldtype.each do |t|
236
246
  begin
@@ -242,13 +252,13 @@ module JSON
242
252
  end
243
253
  end
244
254
  unless datavalid
245
- raise ValueError, "#{key}: #{value.class} value found, but a #{type} is required"
255
+ raise ValueError, "#{key_path}: #{value.class} value found, but a #{type} is required"
246
256
  end
247
- elsif converted_fieldtype.instance_of? Hash
257
+ elsif converted_fieldtype.kind_of? Hash
248
258
  check_property(value, type, key, parent)
249
259
  else
250
- unless value.instance_of? converted_fieldtype
251
- raise ValueError, "#{key}: #{value.class} value found, but a #{type} is required"
260
+ unless value.kind_of? converted_fieldtype
261
+ raise ValueError, "#{key_path}: #{value.class} value found, but a #{type} is required"
252
262
  end
253
263
  end
254
264
  end
metadata CHANGED
@@ -1,64 +1,56 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: jsonschema
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.2
4
5
  prerelease:
5
- version: 2.0.1
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Constellation
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-03-02 00:00:00 +09:00
14
- default_executable:
12
+ date: 2012-02-28 00:00:00.000000000Z
15
13
  dependencies: []
16
-
17
14
  description: json schema library ruby porting from http://code.google.com/p/jsonschema/
18
15
  email: utatane.tea@gmail.com
19
16
  executables: []
20
-
21
17
  extensions: []
22
-
23
- extra_rdoc_files:
18
+ extra_rdoc_files:
24
19
  - README.rdoc
25
- files:
20
+ files:
26
21
  - README.rdoc
27
22
  - Rakefile
28
23
  - test/jsonschema_test.rb
29
24
  - lib/jsonschema.rb
30
- has_rdoc: true
31
25
  homepage: http://github.com/Constellation/ruby-jsonchema/tree/master
32
26
  licenses: []
33
-
34
27
  post_install_message:
35
- rdoc_options:
28
+ rdoc_options:
36
29
  - --main
37
30
  - README.rdoc
38
31
  - --charset
39
32
  - utf-8
40
33
  - --line-numbers
41
34
  - --inline-source
42
- require_paths:
35
+ require_paths:
43
36
  - lib
44
- required_ruby_version: !ruby/object:Gem::Requirement
37
+ required_ruby_version: !ruby/object:Gem::Requirement
45
38
  none: false
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: "0"
50
- required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
44
  none: false
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: "0"
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
56
49
  requirements: []
57
-
58
50
  rubyforge_project: jsonschema
59
- rubygems_version: 1.5.0
51
+ rubygems_version: 1.8.15
60
52
  signing_key:
61
53
  specification_version: 3
62
54
  summary: json schema library ruby porting from http://code.google.com/p/jsonschema/
63
- test_files:
55
+ test_files:
64
56
  - test/jsonschema_test.rb