json_schema_tools 0.6.5 → 0.6.6

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: 0d5a291270b106ca221fdc0f91804fdf60cdd614
4
- data.tar.gz: 4a2b44c9bbfe7a4266a61d02429089a88f5e670d
3
+ metadata.gz: 2117356ee68c91b5dc2fab298dd331852f706050
4
+ data.tar.gz: 1871def586732a52a657ce2e703170090f79a3ac
5
5
  SHA512:
6
- metadata.gz: a634c484dcc2aae2faa7db335b47b09f732fd48c13c26e6bf59b4ff9047467c710f6a672f1146a7ba3c109fbd58c9b80783d8ec538b2958fa1f3efb5e549e8e1
7
- data.tar.gz: 1308a7ff3314b2333ce993a353dbd678b579fdb0dccb4c7d0cde62f64d5589152ae25ac5e98f786d3237278e225eb4c9eede30094a323d87f374eaec9413df59
6
+ metadata.gz: 63bb2363a46cb8daae284574050138ae4c33217fa00ecfed11ce08ff1199601b3e5f5fdf9eea08824d105a7e6e2fc42a3e4f8e86e0ece32475dc89ef15cb2285
7
+ data.tar.gz: b51afad29cf08a7dd75d08e2f39dac0b9561b298a7bf7e8143a43abf666486da2522ba3d1369ecb0203a149a70076ea9c99fee880dc7264491e202396a835d83
@@ -37,9 +37,10 @@ module SchemaTools
37
37
 
38
38
  self.schema= reader.read(schema_name, schema_location)
39
39
  self.schema_name(schema_name)
40
- # make getter / setter methods
40
+ # create getter/setter methods, reading/writing to schema_attrs hash
41
41
  self.schema[:properties].each do |key, prop|
42
42
  define_method(key) { schema_attrs[key] }
43
+ # TODO convert string values to int/date/datetime?? or use from_hash for it?
43
44
  define_method("#{key}=") { |value| schema_attrs[key] = value } unless prop['readOnly']
44
45
  end
45
46
  end
@@ -75,7 +76,8 @@ module SchemaTools
75
76
  #
76
77
  # @param [Hash{String=>Mixed}] json string or hash
77
78
  # @param [Object] obj if you want to update an existing objects
78
- # attributes. e.g during an update
79
+ # attributes. e.g during an update beware that this also updates read-only
80
+ # properties
79
81
  def from_hash(hash, obj=nil)
80
82
  # test if hash is nested and shift up
81
83
  if hash.length == 1 && hash["#{schema_name}"]
@@ -98,7 +100,7 @@ module SchemaTools
98
100
  when 'object'
99
101
  conv_val = process_object_type(key, val)
100
102
  when 'array'
101
- conv_val = process_array_type(key, val)
103
+ conv_val = process_array_type(key, val, obj)
102
104
  else
103
105
  conv_val = val
104
106
  end
@@ -137,14 +139,34 @@ module SchemaTools
137
139
  end
138
140
  end
139
141
 
140
- def process_array_type(field_name, value)
141
- if nested_class(field_name.to_s.singularize)
142
- value.map do |element|
143
- nested_class(field_name.to_s.singularize).from_hash(element)
142
+ # @param [Symbol|String] field_name
143
+ # @param [Array<Hash>] values
144
+ # @param [Object] field_name
145
+ # @param [Object] obj the current object containing the nested values
146
+ def process_array_type(field_name, values, obj)
147
+ nested_klass = nested_class(field_name.to_s.singularize)
148
+ return values unless nested_klass
149
+ res = []
150
+ # check for existing nested objects and update them
151
+ if schema['properties']["#{field_name}"]['items'] && schema['properties']["#{field_name}"]['items']['type'] == 'object'
152
+ # detect an update of existing which have an ID
153
+ existing_objs = obj.public_send(field_name)
154
+ values.each do |new_hash|
155
+ if new_hash['id'].present? || new_hash[:id].present?
156
+ # update existing if found
157
+ existing_obj = existing_objs && existing_objs.detect{|i| "#{i.id}" == "#{new_hash[:id] || new_hash['id']}" }
158
+ # existing_obj can be nil in this case a new object is created
159
+ res << nested_klass.from_hash(new_hash, existing_obj)
160
+ else # create new
161
+ res << nested_klass.from_hash(new_hash)
162
+ end
163
+ end
164
+ else #create new
165
+ values.map do |element|
166
+ res << nested_klass.from_hash(element)
144
167
  end
145
- else
146
- value
147
168
  end
169
+ res
148
170
  end
149
171
 
150
172
  def nested_class(field_name)
@@ -19,6 +19,7 @@ module SchemaTools
19
19
  # Runs all the validations within the specified context.
20
20
  # @return [Boolean] true if no errors are found, false otherwise
21
21
  def valid?
22
+ # TODO validate nested objects
22
23
  output = super
23
24
  errors.empty? && output
24
25
  end
@@ -40,6 +41,7 @@ module SchemaTools
40
41
  validates_numericality_of key, validate_number_opts(val, is_required) if val['type'] == 'number' || val['type'] == 'integer'
41
42
  #TODO array minItems, max unique, null, string
42
43
  # format: date-time, regex color style, email,uri, ..
44
+ #TODO validate nested objects, ary of nested objs
43
45
  end
44
46
  end
45
47
 
@@ -1,3 +1,3 @@
1
1
  module SchemaTools
2
- VERSION = '0.6.5'
2
+ VERSION = '0.6.6'
3
3
  end
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "type" : "object",
3
3
  "properties" : {
4
- "items" : {
4
+ "line_items" : {
5
5
  "type" : "array",
6
- "properties" : {
7
- "$ref" : "item.json#properties"
6
+ "items" : {
7
+ "type" : "object",
8
+ "properties":{
9
+ "$ref": "line_item.json#properties"
10
+ }
8
11
  }
9
12
  }
10
13
  }
@@ -0,0 +1,7 @@
1
+ {
2
+ "type" : "object",
3
+ "properties" : {
4
+ "id" : { "type" : "string" },
5
+ "name" : { "type" : "string" }
6
+ }
7
+ }
@@ -25,9 +25,9 @@ class ItemCollection
25
25
  has_schema_attrs :item_collection
26
26
  end
27
27
 
28
- class Item
28
+ class LineItem
29
29
  include SchemaTools::Modules::Attributes
30
- has_schema_attrs :item
30
+ has_schema_attrs :line_item
31
31
  end
32
32
 
33
33
  describe SchemaTools::Modules::Attributes do
@@ -142,9 +142,9 @@ describe SchemaTools::Modules::Attributes do
142
142
  end
143
143
 
144
144
  it 'makes nested array of objects if there are nested arrays of hashes' do
145
- hash = {items: [{}, {}]}
145
+ hash = {line_items: [{}, {}]}
146
146
  obj = ItemCollection.from_hash(hash)
147
- expect(obj.items.first).to be_an_instance_of(Item)
147
+ expect(obj.line_items.first).to be_an_instance_of(LineItem)
148
148
  end
149
149
 
150
150
  it 'updates an object' do
@@ -157,6 +157,37 @@ describe SchemaTools::Modules::Attributes do
157
157
  expect(obj.last_name).to eq 'Hulk'
158
158
  end
159
159
 
160
+ it 'updates nested array of objects' do
161
+ obj = ItemCollection.from_hash(
162
+ {
163
+ line_items:[
164
+ {id: 1},
165
+ {id: '2'}
166
+ ]
167
+ } )
168
+ expect(obj.line_items[0].id).to eq "1"
169
+
170
+ update_params = {
171
+ line_items:[
172
+ {
173
+ id: 1,
174
+ name: 'Item one'
175
+ },
176
+ {
177
+ id: '2',
178
+ name: 'Item two'
179
+ },
180
+ {
181
+ name: 'New item'
182
+ },
183
+ ]
184
+ }
185
+ ItemCollection.from_hash( update_params, obj)
186
+ expect(obj.line_items[0].name).to eq 'Item one'
187
+ expect(obj.line_items[1].name).to eq 'Item two'
188
+ expect(obj.line_items[2].name).to eq 'New item'
189
+ end
190
+
160
191
  end
161
192
 
162
193
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.5
4
+ version: 0.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Georg Leciejewski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-03 00:00:00.000000000 Z
11
+ date: 2015-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -105,9 +105,9 @@ files:
105
105
  - spec/fixtures/schemata/contact.json
106
106
  - spec/fixtures/schemata/includes_basic_definitions.json
107
107
  - spec/fixtures/schemata/includes_deep_nested_refs.json
108
- - spec/fixtures/schemata/item.json
109
108
  - spec/fixtures/schemata/item_collection.json
110
109
  - spec/fixtures/schemata/lead.json
110
+ - spec/fixtures/schemata/line_item.json
111
111
  - spec/fixtures/schemata/nested_object_no_properties.json
112
112
  - spec/fixtures/schemata/nested_schemas/person.json
113
113
  - spec/fixtures/schemata/one_of_definition.json
@@ -1,6 +0,0 @@
1
- {
2
- "type" : "object",
3
- "properties" : {
4
- "id" : { "type" : "string" }
5
- }
6
- }