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 +5 -13
- data/CHANGELOG.md +1 -0
- data/lib/schema_tools/modules/attributes.rb +54 -16
- data/lib/schema_tools/version.rb +1 -1
- data/spec/fixtures/schemata/item.json +6 -0
- data/spec/fixtures/schemata/item_collection.json +11 -0
- data/spec/schema_tools/modules/attributes_spec.rb +27 -0
- metadata +17 -15
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZmQ5MTNhYTUwNWY2NWQ5Zjc3ODk1MTQzMjcwNDk0Yzg3NmM0NzZkMw==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c51ac19e559376a0c048f7bed77020978dd9c74d
|
4
|
+
data.tar.gz: cf646e960df49539e2b4de0cc30e496f30b2d0f9
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
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
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
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
|
data/lib/schema_tools/version.rb
CHANGED
@@ -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.
|
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-
|
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.
|
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
|