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