json_schema_tools 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
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