json_schema 0.13.6 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad178e92388beab0aa3fb7711c8302cc2b82e28d
4
- data.tar.gz: 4b49ae2eb3984d02e2fe22d2cf64850cf0ca1a47
3
+ metadata.gz: c0bf452530b4b54246e04aae4fb36c02222c9631
4
+ data.tar.gz: e04f230e83d2da306a5c2462eda95a12f1b579cf
5
5
  SHA512:
6
- metadata.gz: 19a0ecfe134501cd724985385611a5bb9b04613f6cc25f81f5163fb228c757555bfb363fe1dacae7e7a420235e46d6034eed0c5177d29ffd40c2f9b0c382db1d
7
- data.tar.gz: 28db95313452012277f5ce37426e15f04e342c30c7c637f72dc58763a3d6f66e419534c25782ee72ebe22e92a4f17b9af86c4aab401590babf27be695f94de8c
6
+ metadata.gz: 0dd9c714bcbdb4d882c2e4a931aabacf1b57ed5cb5c0af409c18b1fcc5700d6ec821276a593175d6af8ca5a2cb91ef06c8a5e58cd40bc82056450210f2f5d883
7
+ data.tar.gz: a0aef6c2277dd70609a723aa8e23b8b955baf1f98538e98dd645c2530ddd1ddcac7da36b1ba13d258bb1f9a47f922355e5e6b76a441fada5cadafb5e46b3fb15
@@ -1,4 +1,9 @@
1
1
  module JsonPointer
2
+ # Evaluates a JSON pointer within a JSON document.
3
+ #
4
+ # Note that this class is designed to evaluate references across a plain JSON
5
+ # data object _or_ an instance of `JsonSchema::Schema`, so the constructor's
6
+ # `data` argument can be of either type.
2
7
  class Evaluator
3
8
  def initialize(data)
4
9
  @data = data
@@ -139,10 +139,10 @@ module JsonSchema
139
139
  ref = ref_schema.reference
140
140
 
141
141
  if !(new_schema = lookup_pointer(ref.uri, ref.pointer))
142
- data = JsonPointer.evaluate(resolved_schema.data, ref.pointer)
142
+ new_schema = JsonPointer.evaluate(resolved_schema, ref.pointer)
143
143
 
144
144
  # couldn't resolve pointer within known schema; that's an error
145
- if data.nil?
145
+ if new_schema.nil?
146
146
  message = %{Couldn't resolve pointer "#{ref.pointer}".}
147
147
  @errors << SchemaError.new(resolved_schema, message, :unresolved_pointer)
148
148
  return
@@ -153,14 +153,13 @@ module JsonSchema
153
153
  #
154
154
  # https://github.com/brandur/json_schema/issues/50
155
155
  #
156
- if new_schema = lookup_pointer(ref.uri, data["$ref"])
157
- new_schema.clones << ref_schema
156
+ if new_schema.reference &&
157
+ new_new_schema = lookup_pointer(ref.uri, new_schema.reference.pointer)
158
+ new_new_schema.clones << ref_schema
158
159
  else
159
160
  # Parse a new schema and use the same parent node. Basically this is
160
161
  # exclusively for the case of a reference that needs to be
161
162
  # de-referenced again to be resolved.
162
- # TODO: Fix to never parse.
163
- new_schema = Parser.new.parse(data, ref_schema.parent)
164
163
  build_schema_paths(ref.uri, resolved_schema)
165
164
  end
166
165
  else
@@ -2,13 +2,26 @@ require "json"
2
2
 
3
3
  module JsonSchema
4
4
  class Schema
5
- @@copyable = []
5
+ @@copyable_attrs = []
6
+
7
+ # Attributes that are part of the JSON schema and hyper-schema
8
+ # specifications. These are allowed to be accessed with the [] operator.
9
+ #
10
+ # Hash contains the access key mapped to the name of the method that should
11
+ # be invoked to retrieve a value. For example, `type` maps to `type` and
12
+ # `additionalItems` maps to `additional_items`.
13
+ @@schema_attrs = {}
6
14
 
7
15
  # identical to attr_accessible, but allows us to copy in values from a
8
16
  # target schema to help preserve our hierarchy during reference expansion
9
17
  def self.attr_copyable(attr)
10
18
  attr_accessor(attr)
11
- @@copyable << "@#{attr}".to_sym
19
+ @@copyable_attrs << "@#{attr}".to_sym
20
+ end
21
+
22
+ def self.attr_schema(attr, options = {})
23
+ attr_copyable(attr)
24
+ @@schema_attrs[options[:schema_name] || attr] = attr
12
25
  end
13
26
 
14
27
  def self.attr_reader_default(attr, default)
@@ -71,22 +84,22 @@ module JsonSchema
71
84
  # the parent, and absolute URI's will replace it.
72
85
  #
73
86
  # Type: String
74
- attr_copyable :id
87
+ attr_schema :id
75
88
 
76
89
  # Short title of the schema.
77
90
  #
78
91
  # Type: String
79
- attr_copyable :title
92
+ attr_schema :title
80
93
 
81
94
  # More detailed description of the schema.
82
95
  #
83
96
  # Type: String
84
- attr_copyable :description
97
+ attr_schema :description
85
98
 
86
99
  # Default JSON value for this particular schema
87
100
  #
88
101
  # Type: [any]
89
- attr_copyable :default
102
+ attr_schema :default
90
103
 
91
104
  #
92
105
  # Validation: Any
@@ -96,79 +109,79 @@ module JsonSchema
96
109
  # set of to be valid.
97
110
  #
98
111
  # Type: Array[Schema]
99
- attr_copyable :all_of
112
+ attr_schema :all_of, :schema_name => :allOf
100
113
 
101
114
  # A collection of subschemas of which data must validate against any schema
102
115
  # in the set to be be valid.
103
116
  #
104
117
  # Type: Array[Schema]
105
- attr_copyable :any_of
118
+ attr_schema :any_of, :schema_name => :anyOf
106
119
 
107
120
  # A collection of inlined subschemas. Standard convention is to subschemas
108
121
  # here and reference them from elsewhere.
109
122
  #
110
123
  # Type: Hash[String => Schema]
111
- attr_copyable :definitions
124
+ attr_schema :definitions
112
125
 
113
126
  # A collection of objects that must include the data for it to be valid.
114
127
  #
115
128
  # Type: Array
116
- attr_copyable :enum
129
+ attr_schema :enum
117
130
 
118
131
  # A collection of subschemas of which data must validate against exactly
119
132
  # one of to be valid.
120
133
  #
121
134
  # Type: Array[Schema]
122
- attr_copyable :one_of
135
+ attr_schema :one_of, :schema_name => :oneOf
123
136
 
124
137
  # A subschema which data must not validate against to be valid.
125
138
  #
126
139
  # Type: Schema
127
- attr_copyable :not
140
+ attr_schema :not
128
141
 
129
142
  # An array of types that data is allowed to be. The spec allows this to be
130
143
  # a string as well, but the parser will always normalize this to an array
131
144
  # of strings.
132
145
  #
133
146
  # Type: Array[String]
134
- attr_copyable :type
147
+ attr_schema :type
135
148
 
136
149
  # validation: array
137
- attr_copyable :additional_items
138
- attr_copyable :items
139
- attr_copyable :max_items
140
- attr_copyable :min_items
141
- attr_copyable :unique_items
150
+ attr_schema :additional_items, :schema_name => :additionalItems
151
+ attr_schema :items
152
+ attr_schema :max_items, :schema_name => :maxItems
153
+ attr_schema :min_items, :schema_name => :minItems
154
+ attr_schema :unique_items, :schema_name => :uniqueItems
142
155
 
143
156
  # validation: number/integer
144
- attr_copyable :max
145
- attr_copyable :max_exclusive
146
- attr_copyable :min
147
- attr_copyable :min_exclusive
148
- attr_copyable :multiple_of
157
+ attr_schema :max
158
+ attr_schema :max_exclusive, :schema_name => :maxExclusive
159
+ attr_schema :min
160
+ attr_schema :min_exclusive, :schema_name => :minExclusive
161
+ attr_schema :multiple_of, :schema_name => :multipleOf
149
162
 
150
163
  # validation: object
151
- attr_copyable :additional_properties
152
- attr_copyable :dependencies
153
- attr_copyable :max_properties
154
- attr_copyable :min_properties
155
- attr_copyable :pattern_properties
156
- attr_copyable :properties
157
- attr_copyable :required
164
+ attr_schema :additional_properties, :schema_name => :additionalProperties
165
+ attr_schema :dependencies
166
+ attr_schema :max_properties, :schema_name => :maxProperties
167
+ attr_schema :min_properties, :schema_name => :minProperties
168
+ attr_schema :pattern_properties, :schema_name => :patternProperties
169
+ attr_schema :properties
170
+ attr_schema :required
158
171
  # warning: strictProperties is technically V5 spec (but I needed it now)
159
- attr_copyable :strict_properties
172
+ attr_schema :strict_properties, :schema_name => :strictProperties
160
173
 
161
174
  # validation: string
162
- attr_copyable :format
163
- attr_copyable :max_length
164
- attr_copyable :min_length
165
- attr_copyable :pattern
175
+ attr_schema :format
176
+ attr_schema :max_length, :schema_name => :maxLength
177
+ attr_schema :min_length, :schema_name => :minLength
178
+ attr_schema :pattern
166
179
 
167
180
  # hyperschema
168
- attr_copyable :links
169
- attr_copyable :media
170
- attr_copyable :path_start
171
- attr_copyable :read_only
181
+ attr_schema :links
182
+ attr_schema :media
183
+ attr_schema :path_start, :schema_name => :pathStart
184
+ attr_schema :read_only, :schema_name => :readOnly
172
185
 
173
186
  # Give these properties reader defaults for particular behavior so that we
174
187
  # can preserve the `nil` nature of their instance variables. Knowing that
@@ -197,8 +210,25 @@ module JsonSchema
197
210
  alias :read_only? :read_only
198
211
  alias :unique_items? :unique_items
199
212
 
213
+ # Allows the values of schema attributes to be accessed with a symbol or a
214
+ # string. So for example, the value of `schema.additional_items` could be
215
+ # procured with `schema[:additionalItems]`. This only works for attributes
216
+ # that are part of the JSON schema specification; other methods on the
217
+ # class are not available (e.g. `expanded`.)
218
+ #
219
+ # This is implemented so that `JsonPointer::Evaluator` can evaluate a
220
+ # reference on an sintance of this class (as well as plain JSON data).
221
+ def [](name)
222
+ name = name.to_sym
223
+ if @@schema_attrs.key?(name)
224
+ send(@@schema_attrs[name])
225
+ else
226
+ raise NoMethodError, "Schema does not respond to ##{name}"
227
+ end
228
+ end
229
+
200
230
  def copy_from(schema)
201
- @@copyable.each do |copyable|
231
+ @@copyable_attrs.each do |copyable|
202
232
  instance_variable_set(copyable, schema.instance_variable_get(copyable))
203
233
  end
204
234
  end
@@ -229,7 +259,7 @@ module JsonSchema
229
259
  str
230
260
  else
231
261
  hash = {}
232
- @@copyable.each do |copyable|
262
+ @@copyable_attrs.each do |copyable|
233
263
  next if [:@clones, :@data, :@parent, :@uri].include?(copyable)
234
264
  if value = instance_variable_get(copyable)
235
265
  if value.is_a?(Array)
@@ -43,6 +43,14 @@ describe JsonPointer::Evaluator do
43
43
  e.message
44
44
  end
45
45
 
46
+ it "can evaluate on a schema object" do
47
+ schema = JsonSchema.parse!(DataScaffold.schema_sample)
48
+ evaluator = JsonPointer::Evaluator.new(schema)
49
+ res = evaluator.evaluate("#/definitions/app/definitions/contrived/allOf/0")
50
+ assert_kind_of JsonSchema::Schema, res
51
+ assert 30, res.max_length
52
+ end
53
+
46
54
  def data
47
55
  {
48
56
  "foo" => ["bar", "baz"],
@@ -0,0 +1,37 @@
1
+ require "test_helper"
2
+
3
+ require "json_schema"
4
+
5
+ describe JsonSchema::Schema do
6
+ it "allows schema attribute access with #[]" do
7
+ schema = JsonSchema::Schema.new
8
+ schema.properties = { "foo" => nil }
9
+ assert_equal({ "foo" => nil }, schema[:properties])
10
+ end
11
+
12
+ it "allows schema attribute access with #[] and overridden name" do
13
+ schema = JsonSchema::Schema.new
14
+ schema.additional_properties = { "foo" => nil }
15
+ assert_equal({ "foo" => nil }, schema[:additionalProperties])
16
+ end
17
+
18
+ it "allows schema attribute access with #[] as string" do
19
+ schema = JsonSchema::Schema.new
20
+ schema.properties = { "foo" => nil }
21
+ assert_equal({ "foo" => nil }, schema["properties"])
22
+ end
23
+
24
+ it "raises if attempting to access #[] with bad method" do
25
+ schema = JsonSchema::Schema.new
26
+ assert_raises NoMethodError do
27
+ schema[:wat]
28
+ end
29
+ end
30
+
31
+ it "raises if attempting to access #[] with non-schema attribute" do
32
+ schema = JsonSchema::Schema.new
33
+ assert_raises NoMethodError do
34
+ schema[:expanded]
35
+ end
36
+ end
37
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.6
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-05 00:00:00.000000000 Z
11
+ date: 2016-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ecma-re-validator
@@ -128,6 +128,7 @@ files:
128
128
  - test/json_schema/error_test.rb
129
129
  - test/json_schema/parser_test.rb
130
130
  - test/json_schema/reference_expander_test.rb
131
+ - test/json_schema/schema_test.rb
131
132
  - test/json_schema/validator_test.rb
132
133
  - test/json_schema_test.rb
133
134
  - test/test_helper.rb