bound 0.1.3 → 0.1.4
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.
- checksums.yaml +7 -0
- data/lib/bound.rb +36 -17
- data/lib/bound/version.rb +1 -1
- data/spec/bound_spec.rb +20 -0
- metadata +10 -26
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2f7a861be5786e9c63288302cd956278041d4465
|
4
|
+
data.tar.gz: 76a7db28ebbac84fe9596a443e8dda2cdc2dc199
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0eaa78599c10b8719ce5b7953529015877b3b39fab5a2eb1c01f93500c0ddd5b5a92b1f02002e2236254eea9d47dbbdc8f8b1a5865fa4f6df26e87c9a8c637ff
|
7
|
+
data.tar.gz: 486ae7ca380ebb1247f40e4ffe06a5a45e229170b637069dd3d3c1f8f3a1cec7c50ca407762c46d4c9ced2baac67bb4177b67873929020c131fc9b57c41dbb23
|
data/lib/bound.rb
CHANGED
@@ -33,6 +33,8 @@ class Bound
|
|
33
33
|
|
34
34
|
class BoundClass
|
35
35
|
class Attribute
|
36
|
+
NotImplemented = Class.new(RuntimeError)
|
37
|
+
|
36
38
|
attr_reader :name, :value
|
37
39
|
attr_accessor :nested_class
|
38
40
|
|
@@ -59,7 +61,7 @@ class Bound
|
|
59
61
|
if object.respond_to?(method)
|
60
62
|
object.send method
|
61
63
|
else
|
62
|
-
raise
|
64
|
+
raise NotImplemented, "undefined method `#{method}' for #{object}"
|
63
65
|
end
|
64
66
|
end
|
65
67
|
|
@@ -197,9 +199,11 @@ class Bound
|
|
197
199
|
end
|
198
200
|
end
|
199
201
|
|
200
|
-
def initialize(
|
202
|
+
def initialize(*seeds)
|
201
203
|
@attributes = {}
|
202
|
-
seed
|
204
|
+
seeds.reverse.each do |seed|
|
205
|
+
seed_with seed
|
206
|
+
end
|
203
207
|
validate!
|
204
208
|
end
|
205
209
|
|
@@ -220,12 +224,12 @@ class Bound
|
|
220
224
|
get_attributes.map(&:name)
|
221
225
|
end
|
222
226
|
|
223
|
-
private
|
224
|
-
|
225
227
|
def get_attribute(attribute_name)
|
226
228
|
attribute_class = self.class.attrs[attribute_name]
|
227
229
|
nested_class = self.class.nested_attr_classes[attribute_name]
|
228
230
|
|
231
|
+
return nil if attribute_class.nil?
|
232
|
+
|
229
233
|
attribute = @attributes[attribute_name]
|
230
234
|
|
231
235
|
unless attribute
|
@@ -237,21 +241,23 @@ class Bound
|
|
237
241
|
attribute
|
238
242
|
end
|
239
243
|
|
244
|
+
private
|
245
|
+
|
240
246
|
def validate!
|
241
247
|
get_attributes.each do |attribute|
|
242
248
|
raise ArgumentError.new("Missing attribute: #{attribute.name}") unless attribute.valid?
|
243
249
|
end
|
244
250
|
end
|
245
251
|
|
246
|
-
def seed
|
247
|
-
case
|
252
|
+
def seed_with(seed)
|
253
|
+
case seed
|
248
254
|
when Hash
|
249
255
|
seeder = HashSeeder.new(self)
|
250
256
|
else
|
251
257
|
seeder = ObjectSeeder.new(self)
|
252
258
|
end
|
253
259
|
|
254
|
-
seeder.seed(
|
260
|
+
seeder.seed(seed)
|
255
261
|
end
|
256
262
|
end
|
257
263
|
|
@@ -262,6 +268,9 @@ class Bound
|
|
262
268
|
|
263
269
|
def seed(hash)
|
264
270
|
hash.each do |key, value|
|
271
|
+
attribute = @receiver.get_attribute(key)
|
272
|
+
next if attribute && attribute.is_assigned?
|
273
|
+
|
265
274
|
method = "#{key}="
|
266
275
|
@receiver.send method, value
|
267
276
|
end
|
@@ -275,19 +284,29 @@ class Bound
|
|
275
284
|
|
276
285
|
def seed(object)
|
277
286
|
@receiver.get_attributes.each do |attribute|
|
287
|
+
next if attribute.is_assigned?
|
288
|
+
|
278
289
|
begin
|
279
290
|
value = attribute.call_on(object)
|
280
|
-
|
281
|
-
|
282
|
-
|
291
|
+
assign_to_receiver attribute, value
|
292
|
+
rescue BoundClass::Attribute::NotImplemented
|
293
|
+
# no assignment if object hasn't desired method
|
294
|
+
# this prevents null-assignments
|
283
295
|
end
|
296
|
+
end
|
297
|
+
end
|
284
298
|
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
299
|
+
private
|
300
|
+
def assign_to_receiver(attribute, value)
|
301
|
+
method = "#{attribute.name}="
|
302
|
+
send_method @receiver, method, value
|
303
|
+
end
|
304
|
+
|
305
|
+
def send_method(receiver, method, *args)
|
306
|
+
if receiver.respond_to?(method)
|
307
|
+
receiver.send method, *args
|
308
|
+
else
|
309
|
+
raise NoMethodError, "undefined method `#{method}' for #{receiver}"
|
291
310
|
end
|
292
311
|
end
|
293
312
|
end
|
data/lib/bound/version.rb
CHANGED
data/spec/bound_spec.rb
CHANGED
@@ -266,5 +266,25 @@ describe Bound do
|
|
266
266
|
end
|
267
267
|
end
|
268
268
|
|
269
|
+
describe 'seeding with multiple seeds' do
|
270
|
+
FunnyUser = Bound.required(:joke, :nose_color)
|
271
|
+
|
272
|
+
let(:hash) { {:joke => 'Text', :nose_color => 'blue'} }
|
273
|
+
|
274
|
+
it 'overwrites attributes from first to last' do
|
275
|
+
overwriting_hash = {:nose_color => 'RED'}
|
276
|
+
overwriting_object = HashObject.new(overwriting_hash)
|
277
|
+
|
278
|
+
[hash, object].each do |subject|
|
279
|
+
[overwriting_hash, overwriting_object].each do |overwriting_subject|
|
280
|
+
user = FunnyUser.new(subject, overwriting_subject)
|
281
|
+
|
282
|
+
assertion_description = [subject, overwriting_subject].inspect
|
283
|
+
assert_equal 'RED', user.nose_color, assertion_description
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
269
289
|
|
270
290
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bound
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jakob Holderbaum
|
@@ -15,7 +14,6 @@ dependencies:
|
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: bundler
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - ~>
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :development
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - ~>
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -31,23 +28,20 @@ dependencies:
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: rake
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- -
|
32
|
+
- - '>='
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: '0'
|
39
35
|
type: :development
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- -
|
39
|
+
- - '>='
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '0'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: minitest
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
46
|
- - ~>
|
53
47
|
- !ruby/object:Gem::Version
|
@@ -55,7 +49,6 @@ dependencies:
|
|
55
49
|
type: :development
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
53
|
- - ~>
|
61
54
|
- !ruby/object:Gem::Version
|
@@ -63,17 +56,15 @@ dependencies:
|
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: simplecov
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - '>='
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '0'
|
71
63
|
type: :development
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - '>='
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '0'
|
79
70
|
description:
|
@@ -100,33 +91,26 @@ files:
|
|
100
91
|
homepage: ''
|
101
92
|
licenses:
|
102
93
|
- MIT
|
94
|
+
metadata: {}
|
103
95
|
post_install_message:
|
104
96
|
rdoc_options: []
|
105
97
|
require_paths:
|
106
98
|
- lib
|
107
99
|
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
-
none: false
|
109
100
|
requirements:
|
110
|
-
- -
|
101
|
+
- - '>='
|
111
102
|
- !ruby/object:Gem::Version
|
112
103
|
version: '0'
|
113
|
-
segments:
|
114
|
-
- 0
|
115
|
-
hash: -3582315724912543482
|
116
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
-
none: false
|
118
105
|
requirements:
|
119
|
-
- -
|
106
|
+
- - '>='
|
120
107
|
- !ruby/object:Gem::Version
|
121
108
|
version: '0'
|
122
|
-
segments:
|
123
|
-
- 0
|
124
|
-
hash: -3582315724912543482
|
125
109
|
requirements: []
|
126
110
|
rubyforge_project:
|
127
|
-
rubygems_version:
|
111
|
+
rubygems_version: 2.0.0
|
128
112
|
signing_key:
|
129
|
-
specification_version:
|
113
|
+
specification_version: 4
|
130
114
|
summary: Implements a nice helper for fast boundary definitions
|
131
115
|
test_files:
|
132
116
|
- spec/bound_spec.rb
|