representable 0.10.3 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ h2. 0.11.0
2
+
3
+ * Representer modules can now be injected into objects using @#extend@.
4
+
1
5
  h2. 0.10.3
2
6
 
3
7
  * Added @representable_property :default => ...@ option which is considered for both serialization and deserialization. The default is applied when the value is @nil@. Note that an empty string ain't @nil@.
@@ -9,6 +9,14 @@ module Representable
9
9
  def self.included(base)
10
10
  base.representable_attrs.push(*representable_attrs) # "inherit".
11
11
  end
12
+
13
+ # Copies the representable_attrs to the extended object.
14
+ def self.extended(object)
15
+ attrs = representable_attrs
16
+ object.instance_eval do
17
+ @representable_attrs = attrs
18
+ end
19
+ end
12
20
  end
13
21
  end
14
22
 
@@ -50,6 +58,11 @@ private
50
58
  representable_attrs.map {|attr| binding_for_definition(attr) }
51
59
  end
52
60
 
61
+ # Returns the wrapper for the representation. Mostly used in XML.
62
+ def representation_wrap
63
+ representable_attrs.wrap_for(self.class.name)
64
+ end
65
+
53
66
 
54
67
  module ClassMethods # :nodoc:
55
68
  module Declarations
@@ -57,11 +70,6 @@ private
57
70
  Definition
58
71
  end
59
72
 
60
- # Returns bindings for all properties.
61
- def representable_bindings
62
- representable_attrs.map {|attr| binding_for_definition(attr) }
63
- end
64
-
65
73
  # Declares a represented document node, which is usually a XML tag or a JSON key.
66
74
  #
67
75
  # Examples:
@@ -100,35 +108,31 @@ private
100
108
 
101
109
  module Accessors
102
110
  def representable_attrs
103
- @representable_attrs ||= []
104
- end
105
-
106
- def representable_wrap
107
- @representable_wrap ||= false
108
- end
109
-
110
- def representable_wrap=(name)
111
- @representable_wrap = name
111
+ @representable_attrs ||= Config.new
112
112
  end
113
113
 
114
114
  def representation_wrap=(name)
115
- self.representable_wrap = name
116
- end
117
-
118
- # Returns the wrapper for the representation. Mostly used in XML.
119
- def representation_wrap
120
- return unless representable_wrap
121
- return infer_representation_name if representable_wrap === true
122
- representable_wrap
123
- end
124
-
125
- private
126
- def infer_representation_name
127
- name.split('::').last.
128
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
129
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
130
- downcase
115
+ representable_attrs.wrap = name
131
116
  end
132
117
  end
133
118
  end
119
+
120
+ class Config < Array
121
+ attr_accessor :wrap
122
+
123
+ # Computes the wrap string or returns false.
124
+ def wrap_for(name)
125
+ return unless wrap
126
+ return infer_name_for(name) if wrap === true
127
+ wrap
128
+ end
129
+
130
+ private
131
+ def infer_name_for(name)
132
+ name.to_s.split('::').last.
133
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
134
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
135
+ downcase
136
+ end
137
+ end
134
138
  end
@@ -38,7 +38,7 @@ module Representable
38
38
  end
39
39
 
40
40
  def from_hash(data, options={}, &block)
41
- if wrap = options[:wrap] || self.class.representation_wrap
41
+ if wrap = options[:wrap] || representation_wrap
42
42
  data = data[wrap.to_s]
43
43
  end
44
44
 
@@ -48,7 +48,7 @@ module Representable
48
48
  def to_hash(options={}, &block)
49
49
  hash = create_representation_with({}, &block)
50
50
 
51
- return hash unless wrap = options[:wrap] || self.class.representation_wrap
51
+ return hash unless wrap = options[:wrap] || representation_wrap
52
52
 
53
53
  {wrap => hash}
54
54
  end
@@ -1,3 +1,3 @@
1
1
  module Representable
2
- VERSION = "0.10.3"
2
+ VERSION = "0.11.0"
3
3
  end
@@ -47,7 +47,7 @@ module Representable
47
47
 
48
48
  # Returns a Nokogiri::XML object representing this object.
49
49
  def to_node(options={}, &block)
50
- root_tag = options[:wrap] || self.class.representation_wrap
50
+ root_tag = options[:wrap] || representation_wrap
51
51
 
52
52
  create_representation_with(Nokogiri::XML::Node.new(root_tag.to_s, Nokogiri::XML::Document.new), &block)
53
53
  end
@@ -77,6 +77,23 @@ class RepresentableTest < MiniTest::Spec
77
77
  # assert_equal "{\"name\":\"Van Halen\"}", vd.to_json
78
78
  #end
79
79
  end
80
+
81
+ it "allows adding the representer by using #extend" do
82
+ module BandRepresenter
83
+ include Representable::JSON
84
+ representable_property :name
85
+ end
86
+
87
+ civ = Object.new
88
+ civ.instance_eval do
89
+ def name; "CIV"; end
90
+ end
91
+
92
+ civ.extend(BandRepresenter)
93
+ assert_equal "{\"name\":\"CIV\"}", civ.to_json
94
+ end
95
+
96
+ # TODO: add test for nested setup.
80
97
  end
81
98
 
82
99
 
@@ -123,10 +140,6 @@ class RepresentableTest < MiniTest::Spec
123
140
 
124
141
 
125
142
  describe "#representation_wrap" do
126
- class SoundSystem
127
- include Representable
128
- end
129
-
130
143
  class HardcoreBand
131
144
  include Representable
132
145
  end
@@ -134,23 +147,23 @@ class RepresentableTest < MiniTest::Spec
134
147
  class SoftcoreBand < HardcoreBand
135
148
  end
136
149
 
150
+ before do
151
+ @band = HardcoreBand.new
152
+ end
153
+
154
+
137
155
  it "returns false per default" do
138
- assert_equal nil, SoundSystem.representation_wrap
156
+ assert_equal nil, SoftcoreBand.new.send(:representation_wrap)
139
157
  end
140
158
 
141
159
  it "infers a printable class name if set to true" do
142
160
  HardcoreBand.representation_wrap = true
143
- assert_equal "hardcore_band", HardcoreBand.send(:representation_wrap)
161
+ assert_equal "hardcore_band", @band.send(:representation_wrap)
144
162
  end
145
163
 
146
164
  it "can be set explicitely" do
147
165
  HardcoreBand.representation_wrap = "breach"
148
- assert_equal "breach", HardcoreBand.representation_wrap
149
- end
150
-
151
- it "doesn't inherit correctly" do
152
- HardcoreBand.representation_wrap = "breach"
153
- assert_equal nil, SoftcoreBand.representation_wrap
166
+ assert_equal "breach", @band.send(:representation_wrap)
154
167
  end
155
168
  end
156
169
 
@@ -208,4 +221,27 @@ class RepresentableTest < MiniTest::Spec
208
221
  end
209
222
  end
210
223
 
224
+ describe "Config" do
225
+ before do
226
+ @config = Representable::Config.new
227
+ PunkRock = Class.new
228
+ end
229
+
230
+ describe "wrapping" do
231
+ it "returns false per default" do
232
+ assert_equal nil, @config.wrap_for("Punk")
233
+ end
234
+
235
+ it "infers a printable class name if set to true" do
236
+ @config.wrap = true
237
+ assert_equal "punk_rock", @config.wrap_for(PunkRock)
238
+ end
239
+
240
+ it "can be set explicitely" do
241
+ @config.wrap = "Descendents"
242
+ assert_equal "Descendents", @config.wrap_for(PunkRock)
243
+ end
244
+ end
245
+ end
246
+
211
247
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 10
8
- - 3
9
- version: 0.10.3
7
+ - 11
8
+ - 0
9
+ version: 0.11.0
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-07 00:00:00 +01:00
17
+ date: 2011-12-09 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency