representable 0.13.0 → 0.13.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/CHANGES.textile +4 -0
- data/lib/representable.rb +6 -6
- data/lib/representable/definition.rb +3 -8
- data/lib/representable/json.rb +6 -9
- data/lib/representable/version.rb +1 -1
- data/lib/representable/xml.rb +7 -10
- data/test/definition_test.rb +2 -2
- data/test/json_test.rb +4 -4
- data/test/representable_test.rb +9 -9
- data/test/xml_test.rb +7 -7
- metadata +3 -3
data/CHANGES.textile
CHANGED
data/lib/representable.rb
CHANGED
@@ -22,8 +22,8 @@ module Representable
|
|
22
22
|
end
|
23
23
|
|
24
24
|
# Reads values from +doc+ and sets properties accordingly.
|
25
|
-
def update_properties_from(doc, options, &block)
|
26
|
-
|
25
|
+
def update_properties_from(doc, options, format, &block)
|
26
|
+
representable_bindings_for(format).each do |bin|
|
27
27
|
next if skip_property?(bin, options)
|
28
28
|
|
29
29
|
value = bin.read(doc) || bin.definition.default
|
@@ -34,8 +34,8 @@ module Representable
|
|
34
34
|
|
35
35
|
private
|
36
36
|
# Compiles the document going through all properties.
|
37
|
-
def create_representation_with(doc, options, &block)
|
38
|
-
|
37
|
+
def create_representation_with(doc, options, format, &block)
|
38
|
+
representable_bindings_for(format).each do |bin|
|
39
39
|
next if skip_property?(bin, options)
|
40
40
|
|
41
41
|
value = send(bin.definition.getter) || bin.definition.default # DISCUSS: eventually move back to Ref.
|
@@ -55,8 +55,8 @@ private
|
|
55
55
|
@representable_attrs ||= self.class.representable_attrs # DISCUSS: copy, or better not?
|
56
56
|
end
|
57
57
|
|
58
|
-
def
|
59
|
-
representable_attrs.map {|attr| binding_for_definition(attr) }
|
58
|
+
def representable_bindings_for(format)
|
59
|
+
representable_attrs.map {|attr| format.binding_for_definition(attr) }
|
60
60
|
end
|
61
61
|
|
62
62
|
# Returns the wrapper for the representation. Mostly used in XML.
|
@@ -1,23 +1,18 @@
|
|
1
1
|
module Representable
|
2
2
|
# Created at class compile time. Keeps configuration options for one property.
|
3
3
|
class Definition
|
4
|
-
attr_reader :name, :sought_type, :from, :default, :representer_module
|
4
|
+
attr_reader :name, :sought_type, :from, :default, :representer_module, :attribute
|
5
5
|
alias_method :getter, :name
|
6
6
|
|
7
7
|
def initialize(sym, options={})
|
8
8
|
@name = sym.to_s
|
9
9
|
@array = options[:collection]
|
10
10
|
@from = (options[:from] || name).to_s
|
11
|
-
@sought_type = options[:class]
|
11
|
+
@sought_type = options[:class]
|
12
12
|
@default = options[:default]
|
13
13
|
@default ||= [] if array?
|
14
14
|
@representer_module = options[:extend] # DISCUSS: move to Representable::DCI?
|
15
|
-
|
16
|
-
# FIXME: move me to xml.
|
17
|
-
if options[:from].to_s =~ /^@/
|
18
|
-
@sought_type = :attr
|
19
|
-
options[:from].sub!('@', '')
|
20
|
-
end
|
15
|
+
@attribute = options[:attribute]
|
21
16
|
end
|
22
17
|
|
23
18
|
def instance_variable_name
|
data/lib/representable/json.rb
CHANGED
@@ -8,9 +8,10 @@ module Representable
|
|
8
8
|
# Note: The authorative methods are #to_hash and #from_hash, if you override #to_json instead,
|
9
9
|
# things might work as expected.
|
10
10
|
module JSON
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def self.binding_for_definition(definition)
|
12
|
+
return ObjectBinding.new(definition) if definition.typed?
|
13
|
+
TextBinding.new(definition)
|
14
|
+
end
|
14
15
|
|
15
16
|
def self.included(base)
|
16
17
|
base.class_eval do
|
@@ -43,11 +44,11 @@ module Representable
|
|
43
44
|
data = data[wrap.to_s]
|
44
45
|
end
|
45
46
|
|
46
|
-
update_properties_from(data, options)
|
47
|
+
update_properties_from(data, options, JSON)
|
47
48
|
end
|
48
49
|
|
49
50
|
def to_hash(options={})
|
50
|
-
hash = create_representation_with({}, options)
|
51
|
+
hash = create_representation_with({}, options, JSON)
|
51
52
|
|
52
53
|
return hash unless wrap = options[:wrap] || representation_wrap
|
53
54
|
|
@@ -58,9 +59,5 @@ module Representable
|
|
58
59
|
def to_json(*args)
|
59
60
|
to_hash(*args).to_json
|
60
61
|
end
|
61
|
-
|
62
|
-
def binding_for_definition(definition)
|
63
|
-
(BINDING_FOR_TYPE[definition.sought_type] or ObjectBinding).new(definition)
|
64
|
-
end
|
65
62
|
end
|
66
63
|
end
|
data/lib/representable/xml.rb
CHANGED
@@ -4,10 +4,11 @@ require 'nokogiri'
|
|
4
4
|
|
5
5
|
module Representable
|
6
6
|
module XML
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def self.binding_for_definition(definition)
|
8
|
+
return ObjectBinding.new(definition) if definition.typed?
|
9
|
+
return AttributeBinding.new(definition) if definition.attribute
|
10
|
+
TextBinding.new(definition)
|
11
|
+
end
|
11
12
|
|
12
13
|
def self.included(base)
|
13
14
|
base.class_eval do
|
@@ -42,22 +43,18 @@ module Representable
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def from_node(node, options={})
|
45
|
-
update_properties_from(node, options)
|
46
|
+
update_properties_from(node, options, XML)
|
46
47
|
end
|
47
48
|
|
48
49
|
# Returns a Nokogiri::XML object representing this object.
|
49
50
|
def to_node(options={})
|
50
51
|
root_tag = options[:wrap] || representation_wrap
|
51
52
|
|
52
|
-
create_representation_with(Nokogiri::XML::Node.new(root_tag.to_s, Nokogiri::XML::Document.new), options)
|
53
|
+
create_representation_with(Nokogiri::XML::Node.new(root_tag.to_s, Nokogiri::XML::Document.new), options, XML)
|
53
54
|
end
|
54
55
|
|
55
56
|
def to_xml(*args)
|
56
57
|
to_node(*args).to_s
|
57
58
|
end
|
58
|
-
|
59
|
-
def binding_for_definition(definition)
|
60
|
-
(BINDING_FOR_TYPE[definition.sought_type] or ObjectBinding).new(definition)
|
61
|
-
end
|
62
59
|
end
|
63
60
|
end
|
data/test/definition_test.rb
CHANGED
@@ -35,7 +35,7 @@ class DefinitionTest < MiniTest::Spec
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "responds to #sought_type" do
|
38
|
-
assert_equal
|
38
|
+
assert_equal nil, @def.sought_type
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -67,7 +67,7 @@ class DefinitionTest < MiniTest::Spec
|
|
67
67
|
end
|
68
68
|
|
69
69
|
it "responds to #sought_type" do
|
70
|
-
assert_equal
|
70
|
+
assert_equal nil, @def.sought_type
|
71
71
|
end
|
72
72
|
|
73
73
|
it "responds to #default" do
|
data/test/json_test.rb
CHANGED
@@ -129,18 +129,18 @@ module JsonTest
|
|
129
129
|
|
130
130
|
describe "#binding_for_definition" do
|
131
131
|
it "returns ObjectBinding" do
|
132
|
-
assert_kind_of Json::ObjectBinding,
|
132
|
+
assert_kind_of Json::ObjectBinding, Json.binding_for_definition(Def.new(:band, :class => Hash))
|
133
133
|
end
|
134
134
|
|
135
135
|
it "returns TextBinding" do
|
136
|
-
assert_kind_of Json::TextBinding,
|
136
|
+
assert_kind_of Json::TextBinding, Json.binding_for_definition(Def.new(:band))
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
140
140
|
describe "#representable_bindings" do
|
141
141
|
it "returns bindings for each property" do
|
142
|
-
assert_equal 2, @band.send(:
|
143
|
-
assert_equal "name", @band.send(:
|
142
|
+
assert_equal 2, @band.send(:representable_bindings_for, Json).size
|
143
|
+
assert_equal "name", @band.send(:representable_bindings_for, Json).first.definition.name
|
144
144
|
end
|
145
145
|
end
|
146
146
|
end
|
data/test/representable_test.rb
CHANGED
@@ -100,13 +100,13 @@ class RepresentableTest < MiniTest::Spec
|
|
100
100
|
band.name = "Bodyjar"
|
101
101
|
|
102
102
|
assert_equal "{\"band\":{\"name\":\"Bodyjar\"}}", band.to_json
|
103
|
-
|
103
|
+
assert_xml_equal "<band><name>Bodyjar</name></band>", band.to_xml
|
104
104
|
end
|
105
105
|
|
106
106
|
it "allows extending with different representers subsequentially" do
|
107
107
|
module SongXmlRepresenter
|
108
108
|
include Representable::XML
|
109
|
-
property :name, :from => "
|
109
|
+
property :name, :from => "name", :attribute => true
|
110
110
|
end
|
111
111
|
|
112
112
|
module SongJsonRepresenter
|
@@ -214,25 +214,25 @@ class RepresentableTest < MiniTest::Spec
|
|
214
214
|
end
|
215
215
|
|
216
216
|
it "copies values from document to object" do
|
217
|
-
@band.update_properties_from({"name"=>"No One's Choice", "groupies"=>2}, {})
|
217
|
+
@band.update_properties_from({"name"=>"No One's Choice", "groupies"=>2}, {}, Representable::JSON)
|
218
218
|
assert_equal "No One's Choice", @band.name
|
219
219
|
assert_equal 2, @band.groupies
|
220
220
|
end
|
221
221
|
|
222
222
|
it "accepts :except option" do
|
223
|
-
@band.update_properties_from({"name"=>"No One's Choice", "groupies"=>2}, :except => [:groupies])
|
223
|
+
@band.update_properties_from({"name"=>"No One's Choice", "groupies"=>2}, {:except => [:groupies]}, Representable::JSON)
|
224
224
|
assert_equal "No One's Choice", @band.name
|
225
225
|
assert_equal nil, @band.groupies
|
226
226
|
end
|
227
227
|
|
228
228
|
it "accepts :include option" do
|
229
|
-
@band.update_properties_from({"name"=>"No One's Choice", "groupies"=>2}, :include => [:groupies])
|
229
|
+
@band.update_properties_from({"name"=>"No One's Choice", "groupies"=>2}, {:include => [:groupies]}, Representable::JSON)
|
230
230
|
assert_equal 2, @band.groupies
|
231
231
|
assert_equal nil, @band.name
|
232
232
|
end
|
233
233
|
|
234
234
|
it "always returns self" do
|
235
|
-
assert_equal @band, @band.update_properties_from({"name"=>"Nofx"}, {})
|
235
|
+
assert_equal @band, @band.update_properties_from({"name"=>"Nofx"}, {}, Representable::JSON)
|
236
236
|
end
|
237
237
|
end
|
238
238
|
|
@@ -244,16 +244,16 @@ class RepresentableTest < MiniTest::Spec
|
|
244
244
|
end
|
245
245
|
|
246
246
|
it "compiles document from properties in object" do
|
247
|
-
assert_equal({"name"=>"No One's Choice", "groupies"=>2}, @band.send(:create_representation_with, {}, {}))
|
247
|
+
assert_equal({"name"=>"No One's Choice", "groupies"=>2}, @band.send(:create_representation_with, {}, {}, Representable::JSON))
|
248
248
|
end
|
249
249
|
|
250
250
|
it "accepts :except option" do
|
251
|
-
hash = @band.send(:create_representation_with, {}, :except => [:groupies])
|
251
|
+
hash = @band.send(:create_representation_with, {}, {:except => [:groupies]}, Representable::JSON)
|
252
252
|
assert_equal({"name"=>"No One's Choice"}, hash)
|
253
253
|
end
|
254
254
|
|
255
255
|
it "accepts :include option" do
|
256
|
-
hash = @band.send(:create_representation_with, {}, :include => [:groupies])
|
256
|
+
hash = @band.send(:create_representation_with, {}, {:include => [:groupies]}, Representable::JSON)
|
257
257
|
assert_equal({"groupies"=>2}, hash)
|
258
258
|
end
|
259
259
|
end
|
data/test/xml_test.rb
CHANGED
@@ -122,17 +122,17 @@ class XmlTest < MiniTest::Spec
|
|
122
122
|
end
|
123
123
|
|
124
124
|
|
125
|
-
describe "#binding_for_definition" do
|
125
|
+
describe "XML#binding_for_definition" do
|
126
126
|
it "returns AttributeBinding" do
|
127
|
-
assert_kind_of XML::AttributeBinding,
|
127
|
+
assert_kind_of XML::AttributeBinding, Representable::XML.binding_for_definition(Def.new(:band, :from => "band", :attribute => true))
|
128
128
|
end
|
129
129
|
|
130
130
|
it "returns ObjectBinding" do
|
131
|
-
assert_kind_of XML::ObjectBinding,
|
131
|
+
assert_kind_of XML::ObjectBinding, Representable::XML.binding_for_definition(Def.new(:band, :class => Hash))
|
132
132
|
end
|
133
133
|
|
134
134
|
it "returns TextBinding" do
|
135
|
-
assert_kind_of XML::TextBinding,
|
135
|
+
assert_kind_of XML::TextBinding, Representable::XML.binding_for_definition(Def.new(:band, :from => :content))
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
@@ -194,11 +194,11 @@ end
|
|
194
194
|
|
195
195
|
|
196
196
|
class AttributesTest < MiniTest::Spec
|
197
|
-
describe ":from =>
|
197
|
+
describe ":from => rel, :attribute => true" do
|
198
198
|
class Link
|
199
199
|
include Representable::XML
|
200
|
-
property :href, :from => "
|
201
|
-
property :title, :from => "
|
200
|
+
property :href, :from => "href", :attribute => true
|
201
|
+
property :title, :from => "title", :attribute => true
|
202
202
|
attr_accessor :href, :title
|
203
203
|
end
|
204
204
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 13
|
8
|
-
-
|
9
|
-
version: 0.13.
|
8
|
+
- 1
|
9
|
+
version: 0.13.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Nick Sutterer
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-12-
|
17
|
+
date: 2011-12-27 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|