json_schema_tools 0.0.5 → 0.0.6
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/lib/schema_tools/modules/hash.rb +22 -6
- data/lib/schema_tools/version.rb +1 -1
- data/spec/fixtures/lead.json +19 -0
- data/spec/schema_tools/hash_spec.rb +36 -1
- metadata +4 -4
@@ -40,9 +40,7 @@ module SchemaTools
|
|
40
40
|
fields = opts[:fields]
|
41
41
|
# get objects class name without inheritance
|
42
42
|
real_class_name = obj.class.name.split('::').last.underscore
|
43
|
-
class_name =
|
44
|
-
# directly return array & hash values
|
45
|
-
return obj if ['array', 'hash'].include? class_name
|
43
|
+
class_name = opts[:class_name] || real_class_name
|
46
44
|
|
47
45
|
data = {}
|
48
46
|
# get schema
|
@@ -50,19 +48,37 @@ module SchemaTools
|
|
50
48
|
# iterate over the defined schema fields
|
51
49
|
schema['properties'].each do |field, prop|
|
52
50
|
next if fields && !fields.include?(field)
|
51
|
+
|
53
52
|
if prop['type'] == 'array'
|
53
|
+
|
54
54
|
data[field] = [] # always set an empty array
|
55
55
|
if obj.respond_to?( field ) && rel_objects = obj.send( field )
|
56
56
|
rel_objects.each do |rel_obj|
|
57
|
-
data[field] <<
|
57
|
+
data[field] << if prop['properties'] && prop['properties']['$ref']
|
58
|
+
#got schema describing the objects
|
59
|
+
from_schema(rel_obj, opts)
|
60
|
+
else
|
61
|
+
rel_obj
|
62
|
+
end
|
58
63
|
end
|
59
64
|
end
|
65
|
+
|
60
66
|
elsif prop['type'] == 'object' # a singular related object
|
67
|
+
|
61
68
|
data[field] = nil # always set empty val
|
62
69
|
if obj.respond_to?( field ) && rel_obj = obj.send( field )
|
63
|
-
|
64
|
-
|
70
|
+
if prop['properties'] && prop['properties']['$ref']
|
71
|
+
data[field] = from_schema(rel_obj, opts)
|
72
|
+
else
|
73
|
+
# NO recursion directly get values from related object. Does
|
74
|
+
# NOT allow deeper nesting so you MUST define an own schema to be save
|
75
|
+
data[field] = {}
|
76
|
+
prop['properties'].each do |fld, prp|
|
77
|
+
data[field][fld] = rel_obj.send(fld) if obj.respond_to?(field)
|
78
|
+
end
|
79
|
+
end
|
65
80
|
end
|
81
|
+
|
66
82
|
else # a simple field is only added if the object knows it
|
67
83
|
data[field] = obj.send(field) if obj.respond_to?(field)
|
68
84
|
end
|
data/lib/schema_tools/version.rb
CHANGED
data/spec/fixtures/lead.json
CHANGED
@@ -8,6 +8,25 @@
|
|
8
8
|
"description": "Where did the person come from",
|
9
9
|
"type":"string",
|
10
10
|
"maxLength": 255
|
11
|
+
},
|
12
|
+
"links_clicked":{
|
13
|
+
"description": "Timestamps of clicks. Just an example to test nested array values without object reference",
|
14
|
+
"type":"array",
|
15
|
+
"properties":{
|
16
|
+
"type": "string"
|
17
|
+
}
|
18
|
+
},
|
19
|
+
"conversion":{
|
20
|
+
"description": "Just an example to test nested object value without object reference",
|
21
|
+
"type":"object",
|
22
|
+
"properties":{
|
23
|
+
"from": {
|
24
|
+
"type": "string"
|
25
|
+
},
|
26
|
+
"to": {
|
27
|
+
"type": "string"
|
28
|
+
}
|
29
|
+
}
|
11
30
|
}
|
12
31
|
}
|
13
32
|
}
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
class Client
|
4
4
|
attr_accessor :first_name, :last_name, :addresses, :id
|
5
|
-
end
|
5
|
+
end
|
6
6
|
|
7
7
|
describe SchemaTools::Hash do
|
8
8
|
|
@@ -41,5 +41,40 @@ describe SchemaTools::Hash do
|
|
41
41
|
hash['client']['first_name'].should be_nil
|
42
42
|
end
|
43
43
|
end
|
44
|
+
|
45
|
+
context 'with plain nested values' do
|
46
|
+
|
47
|
+
class Lead < Client
|
48
|
+
attr_accessor :links_clicked, :conversion
|
49
|
+
end
|
50
|
+
|
51
|
+
class Conversion
|
52
|
+
attr_accessor :from, :to
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
let(:lead){Lead.new}
|
57
|
+
before :each do
|
58
|
+
lead.links_clicked = ['2012-12-12', '2012-12-15', '2012-12-16']
|
59
|
+
conversion = Conversion.new
|
60
|
+
conversion.from = 'whatever'
|
61
|
+
conversion.to = 'whatever'
|
62
|
+
lead.conversion = conversion
|
63
|
+
@hash = SchemaTools::Hash.from_schema(lead)
|
64
|
+
end
|
65
|
+
after :each do
|
66
|
+
SchemaTools::Reader.registry_reset
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should create array with values' do
|
70
|
+
@hash['lead']['links_clicked'].should == lead.links_clicked
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should create object with values' do
|
74
|
+
@hash['lead']['conversion']['from'].should == lead.conversion.from
|
75
|
+
@hash['lead']['conversion']['to'].should == lead.conversion.to
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
44
79
|
end
|
45
80
|
|
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.0.
|
4
|
+
version: 0.0.6
|
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: 2012-12-
|
12
|
+
date: 2012-12-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -140,7 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
140
140
|
version: '0'
|
141
141
|
segments:
|
142
142
|
- 0
|
143
|
-
hash:
|
143
|
+
hash: 77879165624642168
|
144
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
145
|
none: false
|
146
146
|
requirements:
|
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
149
|
version: '0'
|
150
150
|
segments:
|
151
151
|
- 0
|
152
|
-
hash:
|
152
|
+
hash: 77879165624642168
|
153
153
|
requirements: []
|
154
154
|
rubyforge_project:
|
155
155
|
rubygems_version: 1.8.24
|