disposable 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0961ea267a9adeeb55f33da903f0bd85e21070f4
4
- data.tar.gz: f3ff1a24210acaaa96a933d3889ccee74c4db7b2
3
+ metadata.gz: fbd96277db19aa9fdf0cb9d0b46942cb2cbd2983
4
+ data.tar.gz: d3cc09426627c5bcc459b80d1eb90deaf66268f8
5
5
  SHA512:
6
- metadata.gz: bb3cbf404ad41a23dd6b25aa6fc49029a5d0e1ec75d657eed33440c1acb8ee5c2915048ecf1b2bf3c2737d5abf8c285ded7770cff552f3c5205a73e897a307b0
7
- data.tar.gz: c96c0291615cfe64633d8a155b417fcf506eb306b14e968fe36c6001166f2acecce25f9b1f60bc51f1206f71264e75907186c2eb6719e3a09768a96568f82f85
6
+ metadata.gz: df682d54394835e9d682f3a1e2815be97d849640f7c4b0a171dc31cd2ccb431e24e47df3dcbf019c1bc87a93638dc0239afabb0cb63f513feaf3892dafeb20af
7
+ data.tar.gz: f6023c52816ca6ba2636d05b1cd49fe660d68bfd4af1cff88f45142c844e1b29b6da3732ff9dfc805aa4ae1c250d64ab840aaac287215352ecb73c393b7e70e3
data/CHANGES.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.0.8
2
+
3
+ * Introduce the `Twin::Builder` module to easily allow creating a twin in a host object's constructor.
4
+
1
5
  # 0.0.7
2
6
 
3
7
  * Make disposable require representable 2.x.
@@ -3,8 +3,9 @@ require 'representable/decorator'
3
3
  require 'representable/hash'
4
4
  require 'disposable/twin/representer'
5
5
  require 'disposable/twin/option'
6
+ require 'disposable/twin/builder'
6
7
 
7
- # Twin.new(model/composition hash, options)
8
+ # Twin.new(model/composition hash/hash, options)
8
9
  # assign hash to @fields
9
10
  # write: write to @fields
10
11
  # sync/save is the only way to write back to the model.
@@ -17,7 +18,7 @@ module Disposable
17
18
 
18
19
 
19
20
  def self.property(name, options={}, &block)
20
- options[:private_name] = options.delete(:as) || name
21
+ options[:private_name] = options.delete(:as) || name
21
22
  options[:pass_options] = true
22
23
 
23
24
  representer_class.property(name, options, &block).tap do |definition|
@@ -0,0 +1,46 @@
1
+ module Disposable
2
+ class Twin
3
+ # Allows setting a twin class for a host object (e.g. a cell, a form, or a representer) using ::twin
4
+ # and imports a method #build_twin to initialize this twin.
5
+ #
6
+ # Example:
7
+ #
8
+ # class SongTwin < Disposable::Twin
9
+ # properties :id, :title
10
+ # option :is_released
11
+ # end
12
+ #
13
+ # class Cell
14
+ # include Disposable::Twin::Builder
15
+ # twin SongTwin
16
+ #
17
+ # def initialize(model, options)
18
+ # @twin = build_twin(model, options)
19
+ # end
20
+ # end
21
+ #
22
+ # An optional block passed to ::twin will be called per property yielding the Definition instance.
23
+ module Builder
24
+ def self.included(base)
25
+ base.class_eval do
26
+ extend Uber::InheritableAttr
27
+ inheritable_attr :twin_class
28
+ extend ClassMethods
29
+ end
30
+ end
31
+
32
+ module ClassMethods
33
+ def twin(twin_class, &block)
34
+ twin_class.representer_class.representable_attrs.each { |dfn| yield(dfn) } if block_given?
35
+ self.twin_class = twin_class
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def build_twin(*args)
42
+ self.class.twin_class.new(*args)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,3 +1,3 @@
1
1
  module Disposable
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -161,4 +161,56 @@ class TwinOptionTest < TwinTest
161
161
  it { Song.new(song, preview?: true, highlight?: false).preview?.must_equal true }
162
162
  end
163
163
 
164
+
165
+ class TwinBuilderTest < MiniTest::Spec
166
+ class Twin < Disposable::Twin
167
+ property :id
168
+ property :title
169
+ option :is_released
170
+ end
171
+
172
+ describe "without property setup" do
173
+ class Host
174
+ include Disposable::Twin::Builder
175
+
176
+ twin Twin
177
+
178
+ def initialize(*args)
179
+ @model = build_twin(*args)
180
+ end
181
+
182
+ attr_reader :model
183
+ end
184
+
185
+ subject { Host.new(TwinTest::Model::Song.new(1, "Saturday Night"), is_released: true) }
186
+
187
+ # model is simply the twin.
188
+ it { subject.respond_to?(:title).must_equal false }
189
+ it { subject.model.id.must_equal 1 }
190
+ it { subject.model.title.must_equal "Saturday Night" }
191
+ it { subject.model.is_released.must_equal true }
192
+ end
193
+
194
+
195
+ describe "without property setup" do
196
+ class HostWithReaders
197
+ include Disposable::Twin::Builder
198
+
199
+ extend Forwardable
200
+ twin(Twin) { |dfn| def_delegator :@model, dfn.name }
201
+
202
+ def initialize(*args)
203
+ @model = build_twin(*args)
204
+ end
205
+ end
206
+
207
+ subject { HostWithReaders.new(TwinTest::Model::Song.new(1, "Saturday Night"), is_released: true) }
208
+
209
+ # both twin gets created and reader method defined.
210
+ it { subject.id.must_equal 1 }
211
+ it { subject.title.must_equal "Saturday Night" }
212
+ it { subject.is_released.must_equal true }
213
+ end
214
+ end
215
+
164
216
  # TODO: test coercion!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: disposable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
@@ -110,6 +110,7 @@ files:
110
110
  - lib/disposable.rb
111
111
  - lib/disposable/composition.rb
112
112
  - lib/disposable/twin.rb
113
+ - lib/disposable/twin/builder.rb
113
114
  - lib/disposable/twin/composition.rb
114
115
  - lib/disposable/twin/finders.rb
115
116
  - lib/disposable/twin/new.rb
@@ -143,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
144
  version: '0'
144
145
  requirements: []
145
146
  rubyforge_project:
146
- rubygems_version: 2.2.1
147
+ rubygems_version: 2.2.2
147
148
  signing_key:
148
149
  specification_version: 4
149
150
  summary: Domain-Oriented Refactoring Framework.
@@ -152,4 +153,3 @@ test_files:
152
153
  - test/test_helper.rb
153
154
  - test/twin/composition_test.rb
154
155
  - test/twin/twin_test.rb
155
- has_rdoc: