json_schema_tools 0.6.3 → 0.6.4

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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZDg0NTQ4YzQwN2QzYjhhYTMzMDM2NmJlMDgzOGM2NDU0MWExOTdlMQ==
5
- data.tar.gz: !binary |-
6
- ZmQ5MTNhYTUwNWY2NWQ5Zjc3ODk1MTQzMjcwNDk0Yzg3NmM0NzZkMw==
2
+ SHA1:
3
+ metadata.gz: c51ac19e559376a0c048f7bed77020978dd9c74d
4
+ data.tar.gz: cf646e960df49539e2b4de0cc30e496f30b2d0f9
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- YzhlNWJhNTJmYTQyMjc5YzQwZWQxMzkzMDQ4MThhNGI0OTNhYmNiNTI0NjQz
10
- ZDU0MjQ3YTExMDlmMGYzZmQzZGNiMmQwNzUzZDlhYjg3MDE5NmI1NmQ1Yjg4
11
- NDY3M2NhNjQ1MjMzNjM3NmRkMmMwMzUwN2VlNzI0MmQxYjE2YWI=
12
- data.tar.gz: !binary |-
13
- OGQ4MTBhYTMzZWI0YTRjYzI5ZWRlOWRiYzBlMWM5ZjYwYzVlM2UyNTVjZTlj
14
- ZjM1YTZmN2I3MjA3OTY0MDcxM2YwNDMyZTVkNzI4MWM4NGU0MDM0N2QwNzYw
15
- NjQ1MDgwYjkzM2UxYjczNTU5Mzk3MWI2Njk0NTYzNzIxNjM4MjY=
6
+ metadata.gz: 8ba8fdab723dc2368b1e90a83fb8a433804c7a5edd1f6a905870ef23e4ed33600286009e85f87259694914b831b896cdbe9d7c47b68dec32482db4ad28005c66
7
+ data.tar.gz: 326ce9672bc078a27f6fb6a3004cab5a3fd370cc60d228a0fd967b23779199e3962db91f02530b761157ef8f3fc3f23ec45b9a15cc055f2aa42fce589130f3d3
data/CHANGELOG.md CHANGED
@@ -6,6 +6,7 @@ Thanks @VidurMalik
6
6
  * use schema definition in nested items array
7
7
  * exclude keys for nil(blank) nested objects
8
8
  * allow arbitrary key/values for a nested object without properties definition in the schema
9
+ * from_hash/from_json creates objects from nested object/array definitions
9
10
 
10
11
  ##2015-03
11
12
 
@@ -84,25 +84,26 @@ module SchemaTools
84
84
  obj ||= new
85
85
  hash.each do |key, val|
86
86
  next unless obj.respond_to?(key)
87
+ conv_val = nil
87
88
  # set values to raw schema attributes, even if there are no setters
88
89
  # assuming this objects comes from a remote site
89
90
  field_props = self.schema['properties']["#{key}"]
90
- conv_val = if val.nil?
91
- val
92
- elsif field_props['type'] == 'string'
93
- if field_props['format'] == 'date'
94
- Date.parse(val) # or be explicit? Date.strptime('2001-02-03', '%Y-%m-%d')
95
- elsif field_props['format'] == 'date-time'
96
- Time.parse(val) # vs Time.strptime
97
- else
98
- "#{val}"
99
- end
100
- elsif field_props['type'] == 'integer'
101
- val.to_i
102
- else # rely on preceding call e.g from_json for boolean, number
103
- val
104
- end
105
- # TODO if val is a hash / array => look for nested class & cast
91
+ field_type = field_props['type']
92
+ unless val.nil?
93
+ case field_type
94
+ when 'string'
95
+ conv_val = process_string_type(field_props['format'], val)
96
+ when 'integer'
97
+ conv_val = val.to_i
98
+ when 'object'
99
+ conv_val = process_object_type(key, val)
100
+ when 'array'
101
+ conv_val = process_array_type(key, val)
102
+ else
103
+ conv_val = val
104
+ end
105
+ end
106
+
106
107
  obj.schema_attrs["#{key}"] = conv_val
107
108
  end
108
109
  obj
@@ -116,6 +117,43 @@ module SchemaTools
116
117
  @schema
117
118
  end
118
119
 
120
+ private
121
+
122
+ def process_string_type(field_format, value)
123
+ if field_format == 'date'
124
+ Date.parse(value) # or be explicit? Date.strptime('2001-02-03', '%Y-%m-%d')
125
+ elsif field_format == 'date-time'
126
+ Time.parse(value) # vs Time.strptime
127
+ else
128
+ value.to_s
129
+ end
130
+ end
131
+
132
+ def process_object_type(field_name, value)
133
+ if nested_class(field_name)
134
+ nested_class(field_name).from_hash(value)
135
+ else
136
+ value
137
+ end
138
+ end
139
+
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)
144
+ end
145
+ else
146
+ value
147
+ end
148
+ end
149
+
150
+ def nested_class(field_name)
151
+ "#{base_class}::#{field_name.to_s.camelize}".safe_constantize
152
+ end
153
+
154
+ def base_class
155
+ self.to_s.deconstantize
156
+ end
119
157
  end
120
158
  end
121
159
  end
@@ -1,3 +1,3 @@
1
1
  module SchemaTools
2
- VERSION = '0.6.3'
2
+ VERSION = '0.6.4'
3
3
  end
@@ -0,0 +1,6 @@
1
+ {
2
+ "type" : "object",
3
+ "properties" : {
4
+ "id" : { "type" : "string" }
5
+ }
6
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "type" : "object",
3
+ "properties" : {
4
+ "items" : {
5
+ "type" : "array",
6
+ "properties" : {
7
+ "$ref" : "item.json#properties"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -15,6 +15,21 @@ class Numbers
15
15
  has_schema_attrs :numbers, :schema => schema_as_ruby_object
16
16
  end
17
17
 
18
+ class WorkAddress
19
+ include SchemaTools::Modules::Attributes
20
+ has_schema_attrs :address
21
+ end
22
+
23
+ class ItemCollection
24
+ include SchemaTools::Modules::Attributes
25
+ has_schema_attrs :item_collection
26
+ end
27
+
28
+ class Item
29
+ include SchemaTools::Modules::Attributes
30
+ has_schema_attrs :item
31
+ end
32
+
18
33
  describe SchemaTools::Modules::Attributes do
19
34
 
20
35
  context 'included' do
@@ -120,6 +135,18 @@ describe SchemaTools::Modules::Attributes do
120
135
  expect(obj.created_at.hour).to eq 10
121
136
  end
122
137
 
138
+ it 'makes nested objects if there are nested hashes' do
139
+ hash = {work_address: {}}
140
+ obj = TestClient.from_hash(hash)
141
+ expect(obj.work_address).to be_an_instance_of(WorkAddress)
142
+ end
143
+
144
+ it 'makes nested array of objects if there are nested arrays of hashes' do
145
+ hash = {items: [{}, {}]}
146
+ obj = ItemCollection.from_hash(hash)
147
+ expect(obj.items.first).to be_an_instance_of(Item)
148
+ end
149
+
123
150
  it 'updates an object' do
124
151
  obj = TestContact.from_hash( {first_name: 'Frieda'} )
125
152
  expect(obj.first_name).to eq 'Frieda'
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.6.4
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-04-07 00:00:00.000000000 Z
11
+ date: 2015-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: simplecov
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ! '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ! '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  description: Want to create or read a JSON Schema powered API? This toolset provides
@@ -75,8 +75,8 @@ executables: []
75
75
  extensions: []
76
76
  extra_rdoc_files: []
77
77
  files:
78
- - .gitignore
79
- - .travis.yml
78
+ - ".gitignore"
79
+ - ".travis.yml"
80
80
  - CHANGELOG.md
81
81
  - Gemfile
82
82
  - README.md
@@ -105,6 +105,8 @@ 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
+ - spec/fixtures/schemata/item_collection.json
108
110
  - spec/fixtures/schemata/lead.json
109
111
  - spec/fixtures/schemata/nested_object_no_properties.json
110
112
  - spec/fixtures/schemata/nested_schemas/person.json
@@ -135,17 +137,17 @@ require_paths:
135
137
  - lib
136
138
  required_ruby_version: !ruby/object:Gem::Requirement
137
139
  requirements:
138
- - - ! '>='
140
+ - - ">="
139
141
  - !ruby/object:Gem::Version
140
142
  version: '0'
141
143
  required_rubygems_version: !ruby/object:Gem::Requirement
142
144
  requirements:
143
- - - ! '>='
145
+ - - ">="
144
146
  - !ruby/object:Gem::Version
145
147
  version: '0'
146
148
  requirements: []
147
149
  rubyforge_project:
148
- rubygems_version: 2.2.2
150
+ rubygems_version: 2.4.6
149
151
  signing_key:
150
152
  specification_version: 4
151
153
  summary: JSON Schema API tools for server and client side