json_schema_tools 0.2.0 → 0.2.1
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.
- data/CHANGELOG.md +2 -1
- data/README.md +11 -11
- data/lib/schema_tools/modules/hash.rb +31 -15
- data/lib/schema_tools/version.rb +1 -1
- data/spec/schema_tools/hash_spec.rb +24 -2
- metadata +2 -8
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -100,9 +100,9 @@ peter.as_schema_hash
|
|
100
100
|
The AsSchema module is a tiny wrapper for following low level method:
|
101
101
|
|
102
102
|
```ruby
|
103
|
-
paul = Contact.new name: '
|
103
|
+
paul = Contact.new name: 'Paul'
|
104
104
|
contact_hash = SchemaTools::Hash.from_schema(paul)
|
105
|
-
#=> "contact"=>{"id"=>12, "name"=> "
|
105
|
+
#=> "contact"=>{"id"=>12, "name"=> "Paul",..}
|
106
106
|
# to_json is up to you .. or your rails controller
|
107
107
|
```
|
108
108
|
|
@@ -117,12 +117,6 @@ Only use some fields e.g. to save bandwidth
|
|
117
117
|
peter.as_schema_json(fields:['id', 'name'])
|
118
118
|
#=> "client":{"id":12, "name": "Peter"}
|
119
119
|
```
|
120
|
-
Of course the low level hash method also supports all of these options:
|
121
|
-
|
122
|
-
```ruby
|
123
|
-
client_hash = SchemaTools::Hash.from_schema(peter, fields:['id', 'name'])
|
124
|
-
#=> "client"=>{"id"=>12, "name"=> "Peter"}
|
125
|
-
```
|
126
120
|
|
127
121
|
Use a custom schema name e.g. to represent a client as contact. Assumes you also
|
128
122
|
have a schema named contact.json
|
@@ -148,11 +142,17 @@ inline:
|
|
148
142
|
|
149
143
|
peter.as_schema_json( exclude_root: true )
|
150
144
|
|
151
|
-
|
152
|
-
|
153
|
-
# "
|
145
|
+
#=> {"id":12, "name"=> "Peter",
|
146
|
+
# "_class_name":"client",
|
147
|
+
# "_links":[ .. ] }
|
154
148
|
```
|
155
149
|
|
150
|
+
Of course the low level hash method also supports all of these options:
|
151
|
+
|
152
|
+
```ruby
|
153
|
+
client_hash = SchemaTools::Hash.from_schema(peter, fields:['id', 'name'])
|
154
|
+
#=> "client"=>{"id"=>12, "name"=> "Peter"}
|
155
|
+
```
|
156
156
|
## Parameter cleaning
|
157
157
|
|
158
158
|
Hate people spamming your api with wrong object fields? Use the Cleaner to
|
@@ -32,6 +32,7 @@ module SchemaTools
|
|
32
32
|
# @options opts [Array<String>] :fields to return. If not set all schema
|
33
33
|
# properties are used.
|
34
34
|
# @options opts [String] :path of the schema files overriding global one
|
35
|
+
# @options opts [String] :base_url used in all links
|
35
36
|
# @options opts [Boolean] :exclude_root if set objects are not nested under
|
36
37
|
# their class name and the object hash gets _links and _class_name inline.
|
37
38
|
#
|
@@ -39,27 +40,17 @@ module SchemaTools
|
|
39
40
|
# { 'invoice' => {'title'=>'hello world', 'number'=>'4711' } }
|
40
41
|
#
|
41
42
|
def from_schema(obj, opts={})
|
42
|
-
|
43
|
+
|
43
44
|
# get objects class name without inheritance
|
44
45
|
real_class_name = obj.class.name.split('::').last.underscore
|
45
46
|
class_name = opts[:class_name] || real_class_name
|
46
47
|
|
47
|
-
data = {}
|
48
48
|
# get schema
|
49
49
|
schema = SchemaTools::Reader.read(class_name, opts[:path])
|
50
50
|
# iterate over the defined schema fields
|
51
|
-
|
52
|
-
next if fields && !fields.include?(field)
|
53
|
-
if prop['type'] == 'array'
|
54
|
-
data[field] = parse_list(obj, field, prop, opts)
|
55
|
-
elsif prop['type'] == 'object' # a singular related object
|
56
|
-
data[field] = parse_object(obj, field, prop, opts)
|
57
|
-
else # a simple field is only added if the object knows it
|
58
|
-
data[field] = obj.send(field) if obj.respond_to?(field)
|
59
|
-
end
|
60
|
-
end
|
51
|
+
data = parse_properties(obj, schema, opts)
|
61
52
|
#get links if present
|
62
|
-
links = parse_links(obj, schema)
|
53
|
+
links = parse_links(obj, schema, opts)
|
63
54
|
|
64
55
|
if opts[:exclude_root]
|
65
56
|
hsh = data
|
@@ -74,12 +65,37 @@ module SchemaTools
|
|
74
65
|
|
75
66
|
private
|
76
67
|
|
68
|
+
def parse_properties(obj, schema, opts)
|
69
|
+
fields = opts[:fields]
|
70
|
+
data = {}
|
71
|
+
schema['properties'].each do |field, prop|
|
72
|
+
next if fields && !fields.include?(field)
|
73
|
+
if prop['type'] == 'array'
|
74
|
+
data[field] = parse_list(obj, field, prop, opts)
|
75
|
+
elsif prop['type'] == 'object' # a singular related object
|
76
|
+
data[field] = parse_object(obj, field, prop, opts)
|
77
|
+
else # a simple field is only added if the object knows it
|
78
|
+
data[field] = obj.send(field) if obj.respond_to?(field)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
data
|
82
|
+
end
|
83
|
+
|
77
84
|
# Parse the link section of the schema by replacing {id} in urls
|
85
|
+
# @param [Object] obj object being parsed
|
86
|
+
# @param [Hash] schema
|
87
|
+
# @param [Hash] opts
|
88
|
+
# @options opts [String] :base_url prepended to link href, WATCH possible double //
|
78
89
|
# @return [Array<Hash{String=>String}> | Nil]
|
79
|
-
def parse_links(obj, schema)
|
90
|
+
def parse_links(obj, schema, opts={})
|
80
91
|
links = []
|
81
92
|
schema['links'] && schema['links'].each do |link|
|
82
|
-
|
93
|
+
# substitute placeholders
|
94
|
+
href = link['href'].gsub(/\{id\}/, "#{obj.id}")
|
95
|
+
href = "#{opts[:base_url]}/#{href}" if opts[:base_url]
|
96
|
+
|
97
|
+
links << { 'rel' => link['rel'],
|
98
|
+
'href' => href }
|
83
99
|
end
|
84
100
|
links.uniq
|
85
101
|
# return links only if not empty
|
data/lib/schema_tools/version.rb
CHANGED
@@ -51,8 +51,8 @@ describe SchemaTools::Hash do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'should use custom schema' do
|
54
|
-
hash = SchemaTools::Hash.from_schema(contact, class_name: :
|
55
|
-
hash['
|
54
|
+
hash = SchemaTools::Hash.from_schema(contact, class_name: :client)
|
55
|
+
hash['client']['last_name'].should == 'Paul'
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'should use only give fields' do
|
@@ -157,5 +157,27 @@ describe SchemaTools::Hash do
|
|
157
157
|
end
|
158
158
|
|
159
159
|
end
|
160
|
+
|
161
|
+
context 'with links' do
|
162
|
+
let(:client){Client.new}
|
163
|
+
before :each do
|
164
|
+
client.first_name = 'Peter'
|
165
|
+
client.id = 'SomeID'
|
166
|
+
end
|
167
|
+
after :each do
|
168
|
+
SchemaTools::Reader.registry_reset
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should have links' do
|
172
|
+
hash = SchemaTools::Hash.from_schema(client)
|
173
|
+
hash['links'].length.should == 8
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'should prepend base_url' do
|
177
|
+
hash = SchemaTools::Hash.from_schema(client, base_url: 'http://json-hell.com')
|
178
|
+
hash['links'].first['href'].should == 'http://json-hell.com/clients/SomeID'
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
160
182
|
end
|
161
183
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_schema_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
12
|
+
date: 2013-10-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -128,18 +128,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
128
128
|
- - ! '>='
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '0'
|
131
|
-
segments:
|
132
|
-
- 0
|
133
|
-
hash: -1056530391654598731
|
134
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
132
|
none: false
|
136
133
|
requirements:
|
137
134
|
- - ! '>='
|
138
135
|
- !ruby/object:Gem::Version
|
139
136
|
version: '0'
|
140
|
-
segments:
|
141
|
-
- 0
|
142
|
-
hash: -1056530391654598731
|
143
137
|
requirements: []
|
144
138
|
rubyforge_project:
|
145
139
|
rubygems_version: 1.8.24
|