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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 22f705e863b9395e8f0b792f2f59d17f2312e27e
4
- data.tar.gz: e1add90a18faa65ee4d999efce88fd6e63bf57fe
3
+ metadata.gz: b9f8eb05a90b0b2fcf0475c3c006c58b0efeaa33
4
+ data.tar.gz: 306f1a3c191fbd5b1cb19e311eea12a86b1b2f8e
5
5
  SHA512:
6
- metadata.gz: cf49c1c8e060299308df7954879fcc64701bc61f6051164491b771080068a19ca6b2d985b952fa42217906f44c050e4b36aa9d42fd9a5dca35f8a9a63dd67135
7
- data.tar.gz: afd7658ae6f341bbb2b7dbaf9bff5a60690716e6778b902ee745bd3df812083f57fc89fe36bea4c673fe70837869afc4cd7993f51d5a26323182f3a22d4a7ecb
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`
@@ -64,4 +64,3 @@ module AttributedObject
64
64
  class ConfigurationError < Error
65
65
  end
66
66
  end
67
-
@@ -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
-
@@ -25,4 +25,3 @@ module AttributedObject
25
25
  end
26
26
  end
27
27
  end
28
-
@@ -1,3 +1,3 @@
1
1
  module AttributedObject
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -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.3.1
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-06-02 00:00:00.000000000 Z
11
+ date: 2017-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler