attributed_object 0.3.1 → 0.4.0
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 +4 -4
- data/README.md +22 -7
- data/lib/attributed_object.rb +0 -1
- data/lib/attributed_object/base.rb +14 -4
- data/lib/attributed_object/strict.rb +0 -1
- data/lib/attributed_object/version.rb +1 -1
- data/spec/attributed_object_spec.rb +28 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9f8eb05a90b0b2fcf0475c3c006c58b0efeaa33
|
4
|
+
data.tar.gz: 306f1a3c191fbd5b1cb19e311eea12a86b1b2f8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0707b95ee9cf2ffc1d3949086d89925d1c852a8b806779283df2753a3afc4de369077d66e4e14a6e7584b7851a0fee25bc887f2884133d8f905c610c61c7b3a
|
7
|
+
data.tar.gz: c1d84c5717b5152c18330e5fa1013e6066801dc619fbdb5faf222beac2d071bffcf5263cf6df03f8aff3d180403e4cf40fb0c93ec26d0b3cc60adb7d6dfed426
|
data/README.md
CHANGED
@@ -70,13 +70,22 @@ MyAttributedObject.new(
|
|
70
70
|
SimpleFoo.new(bar: 12) == SimpleFoo.new(bar: 12)
|
71
71
|
```
|
72
72
|
|
73
|
+
### Whitelist
|
74
|
+
```ruby
|
75
|
+
class MyAttributedObject
|
76
|
+
include AttributedObject::Strict
|
77
|
+
|
78
|
+
attribute :planet, :string, whitelist: ['Earth', 'Mars']
|
79
|
+
end
|
80
|
+
```
|
81
|
+
|
73
82
|
### Strict Type Checking
|
74
83
|
```ruby
|
75
84
|
class MyTypedAttributedObject
|
76
85
|
include AttributedObject::Strict
|
77
86
|
|
78
87
|
attribute :first, :string, disallow: nil
|
79
|
-
attribute :second, MyAttributedObject, default: nil
|
88
|
+
attribute :second, MyAttributedObject, default: nil
|
80
89
|
end
|
81
90
|
|
82
91
|
# Works
|
@@ -103,7 +112,7 @@ MyTypedAttributedObject.new(
|
|
103
112
|
)
|
104
113
|
)
|
105
114
|
|
106
|
-
# Supported Types:
|
115
|
+
# Supported Types:
|
107
116
|
# :string
|
108
117
|
# :boolean
|
109
118
|
# :integer
|
@@ -115,7 +124,7 @@ MyTypedAttributedObject.new(
|
|
115
124
|
# ArrayOf(:integer)
|
116
125
|
# HashOf(:symbol, :string)
|
117
126
|
# Instances of AttributedObject::Type (example: lib/attributed_object/types/array_of.rb)
|
118
|
-
# any Class
|
127
|
+
# any Class
|
119
128
|
```
|
120
129
|
|
121
130
|
## Coercion
|
@@ -155,7 +164,7 @@ end
|
|
155
164
|
default_to: AttributedObject::Unset, # AttributedObject::Unset | any value | AttributedObject::TypeDefaults
|
156
165
|
ignore_extra_keys: false, # false | true
|
157
166
|
coerce_blanks_to_nil: false, # false | true
|
158
|
-
disallow: AttributedObject::Unset, # AttributedObject::Unset | any value
|
167
|
+
disallow: AttributedObject::Unset, # AttributedObject::Unset | any value
|
159
168
|
}
|
160
169
|
```
|
161
170
|
|
@@ -167,7 +176,7 @@ class Defaulting
|
|
167
176
|
include AttributedObject::Strict
|
168
177
|
attributed_object default_to: nil
|
169
178
|
|
170
|
-
attribute :foo
|
179
|
+
attribute :foo
|
171
180
|
end
|
172
181
|
Defaulting.new.foo # => nil
|
173
182
|
|
@@ -206,7 +215,7 @@ class WithExtraOptions
|
|
206
215
|
include AttributedObject::Strict
|
207
216
|
attributed_object ignore_extra_keys: true
|
208
217
|
|
209
|
-
attribute :foo
|
218
|
+
attribute :foo
|
210
219
|
end
|
211
220
|
WithExtraOptions.new(foo: 'asd', something: 'bar') # this will not throw an error, usually it would
|
212
221
|
```
|
@@ -222,7 +231,7 @@ class WithExtraOptions
|
|
222
231
|
include AttributedObject::Strict
|
223
232
|
attributed_object disallow: nil
|
224
233
|
|
225
|
-
attribute :foo
|
234
|
+
attribute :foo
|
226
235
|
end
|
227
236
|
WithExtraOptions.new(foo: nil) # this will not throw an error
|
228
237
|
```
|
@@ -236,3 +245,9 @@ Result: Attributed Object is quite a bit fast (2-3x) than other gems for the spe
|
|
236
245
|
### keywords
|
237
246
|
|
238
247
|
ruby, AttributedObject, attributed object, attributed_object, value, domain driven design, ddd
|
248
|
+
|
249
|
+
# Release new Version
|
250
|
+
|
251
|
+
- bump Version Number
|
252
|
+
- `gem build attributed_object.gemspec`
|
253
|
+
- `gem push attributed_object-xxx.gem`
|
data/lib/attributed_object.rb
CHANGED
@@ -14,7 +14,8 @@ module AttributedObject
|
|
14
14
|
default_to: Unset,
|
15
15
|
ignore_extra_keys: false,
|
16
16
|
coerce_blanks_to_nil: false,
|
17
|
-
disallow: Unset
|
17
|
+
disallow: Unset,
|
18
|
+
whitelist: Unset
|
18
19
|
}.merge(parent_ops)
|
19
20
|
end
|
20
21
|
|
@@ -25,7 +26,7 @@ module AttributedObject
|
|
25
26
|
@attribute_defs = parent_defs.clone
|
26
27
|
end
|
27
28
|
|
28
|
-
def attribute(attr_name, type_info = Unset, default: Unset, disallow: Unset)
|
29
|
+
def attribute(attr_name, type_info = Unset, default: Unset, disallow: Unset, whitelist: Unset)
|
29
30
|
if default == Unset
|
30
31
|
default_to = attributed_object_options.fetch(:default_to)
|
31
32
|
|
@@ -37,13 +38,18 @@ module AttributedObject
|
|
37
38
|
if disallow == Unset
|
38
39
|
disallow = attributed_object_options.fetch(:disallow)
|
39
40
|
end
|
40
|
-
|
41
|
+
|
42
|
+
if whitelist == Unset
|
43
|
+
whitelist = attributed_object_options.fetch(:whitelist)
|
44
|
+
end
|
45
|
+
|
41
46
|
_attributed_object_check_type_supported!(type_info)
|
42
47
|
|
43
48
|
attribute_defs[attr_name] = {
|
44
49
|
type_info: type_info,
|
45
50
|
default: default,
|
46
51
|
disallow: disallow,
|
52
|
+
whitelist: whitelist
|
47
53
|
}
|
48
54
|
|
49
55
|
attr_writer attr_name
|
@@ -92,6 +98,11 @@ module AttributedObject
|
|
92
98
|
if opts[:type_info] != Unset && symbolized_args[name] != nil
|
93
99
|
symbolized_args[name] = _attributed_object_on_init_attribute(opts[:type_info], symbolized_args[name], name: name, args: args)
|
94
100
|
end
|
101
|
+
|
102
|
+
if opts[:whitelist] != Unset && !opts[:whitelist].include?(symbolized_args[name])
|
103
|
+
raise DisallowedValueError.new(self.class, name, args)
|
104
|
+
end
|
105
|
+
|
95
106
|
self.send("#{name}=", symbolized_args[name])
|
96
107
|
}
|
97
108
|
end
|
@@ -108,4 +119,3 @@ module AttributedObject
|
|
108
119
|
end
|
109
120
|
end
|
110
121
|
end
|
111
|
-
|
@@ -26,6 +26,15 @@ describe AttributedObject do
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
class AttributedObjectWithWhitelist
|
30
|
+
include AttributedObject::Strict
|
31
|
+
|
32
|
+
PLANET_EARTH = 'earth'.freeze
|
33
|
+
PLANET_MARS = 'mars'.freeze
|
34
|
+
|
35
|
+
attribute :planet, :string, whitelist: [PLANET_EARTH, PLANET_MARS]
|
36
|
+
end
|
37
|
+
|
29
38
|
class ChildFoo < DefaultFoo
|
30
39
|
attribute :lollipop, default: "lecker"
|
31
40
|
end
|
@@ -45,6 +54,17 @@ describe AttributedObject do
|
|
45
54
|
end
|
46
55
|
end
|
47
56
|
|
57
|
+
describe 'whitelist' do
|
58
|
+
it 'allows whitelisted values' do
|
59
|
+
object = AttributedObjectWithWhitelist.new(planet: AttributedObjectWithWhitelist::PLANET_EARTH)
|
60
|
+
expect(object.planet).to eq(AttributedObjectWithWhitelist::PLANET_EARTH)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'crashes when provided with not-whitelisted value' do
|
64
|
+
expect { AttributedObjectWithWhitelist.new(planet: 'sun') }.to raise_error(AttributedObject::DisallowedValueError)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
48
68
|
describe 'default value' do
|
49
69
|
before { DefaultFoo.reset }
|
50
70
|
|
@@ -167,7 +187,7 @@ describe AttributedObject do
|
|
167
187
|
attribute :bar, :integer
|
168
188
|
attribute :has_other_disallow, :integer, disallow: 0
|
169
189
|
end
|
170
|
-
|
190
|
+
|
171
191
|
expect { FooWithExtra.new(bar: 1, has_other_disallow: 1) }.not_to raise_error
|
172
192
|
expect { FooWithExtra.new(bar: 1, has_other_disallow: nil) }.not_to raise_error
|
173
193
|
expect { FooWithExtra.new(bar: nil, has_other_disallow: 1) }.to raise_error(AttributedObject::DisallowedValueError)
|
@@ -203,23 +223,23 @@ describe AttributedObject do
|
|
203
223
|
expect(SimpleFoo.new(bar: 77)).to_not eq(SimpleFoo.new(bar: 12))
|
204
224
|
end
|
205
225
|
end
|
206
|
-
|
226
|
+
|
207
227
|
describe 'attribute storage' do
|
208
228
|
class InnerStructureFoo
|
209
229
|
include AttributedObject::Coerce
|
210
230
|
attribute :bar, :string, default: 'default'
|
211
231
|
attribute :foo, :string, default: 'default'
|
212
232
|
attribute :number, :integer, default: 0
|
213
|
-
|
233
|
+
|
214
234
|
def foo=(f)
|
215
235
|
@foo = "prefix-#{f}-suffix"
|
216
236
|
end
|
217
|
-
|
237
|
+
|
218
238
|
def number=(n)
|
219
239
|
@number = n+1
|
220
240
|
end
|
221
241
|
end
|
222
|
-
|
242
|
+
|
223
243
|
describe '#attributes' do
|
224
244
|
it 'returns the attributes as hash' do
|
225
245
|
expect(InnerStructureFoo.new(bar: 'hi').attributes).to eq(
|
@@ -229,15 +249,15 @@ describe AttributedObject do
|
|
229
249
|
)
|
230
250
|
end
|
231
251
|
end
|
232
|
-
|
252
|
+
|
233
253
|
it 'stores the data in instance vars' do
|
234
254
|
expect(InnerStructureFoo.new(bar: 'hi').instance_variable_get('@bar')).to eq('hi')
|
235
255
|
end
|
236
|
-
|
256
|
+
|
237
257
|
it 'uses setters' do
|
238
258
|
expect(InnerStructureFoo.new(foo: 'middel').foo).to eq('prefix-middel-suffix')
|
239
259
|
end
|
240
|
-
|
260
|
+
|
241
261
|
it 'uses setters after coercion' do
|
242
262
|
expect(InnerStructureFoo.new(number: '42').number).to eq(43)
|
243
263
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attributed_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaap Groeneveld
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|