chozo 0.4.0 → 0.4.1
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.
- data/lib/chozo/varia_model.rb +46 -6
- data/lib/chozo/version.rb +1 -1
- data/spec/unit/chozo/varia_model_spec.rb +46 -0
- metadata +2 -2
data/lib/chozo/varia_model.rb
CHANGED
@@ -6,6 +6,11 @@ module Chozo
|
|
6
6
|
# @author Jamie Winsor <jamie@vialstudios.com>
|
7
7
|
module VariaModel
|
8
8
|
module ClassMethods
|
9
|
+
ASSIGNMENT_MODES = [
|
10
|
+
:whitelist,
|
11
|
+
:carefree
|
12
|
+
]
|
13
|
+
|
9
14
|
# @return [HashWithIndifferentAccess]
|
10
15
|
def attributes
|
11
16
|
@attributes ||= Hashie::Mash.new
|
@@ -16,6 +21,26 @@ module Chozo
|
|
16
21
|
@validations ||= HashWithIndifferentAccess.new
|
17
22
|
end
|
18
23
|
|
24
|
+
# @return [Symbol]
|
25
|
+
def assignment_mode
|
26
|
+
@assignment_mode ||= :whitelist
|
27
|
+
end
|
28
|
+
|
29
|
+
# Set the attribute mass assignment mode
|
30
|
+
# * :whitelist - only attributes defined on the class will have values set
|
31
|
+
# * :carefree - values will be set for attributes that are not explicitly defined
|
32
|
+
# in the class definition
|
33
|
+
#
|
34
|
+
# @param [Symbol] mode
|
35
|
+
# an assignment mode to use @see {ASSIGNMENT_MODES}
|
36
|
+
def set_assignment_mode(mode)
|
37
|
+
unless ASSIGNMENT_MODES.include?(mode)
|
38
|
+
raise ArgumentError, "unknown assignment mode: #{mode}"
|
39
|
+
end
|
40
|
+
|
41
|
+
@assignment_mode = mode
|
42
|
+
end
|
43
|
+
|
19
44
|
# @param [#to_s] name
|
20
45
|
# @option options [Symbol, Array<Symbol>] :type
|
21
46
|
# @option options [Boolean] :required
|
@@ -172,11 +197,11 @@ module Chozo
|
|
172
197
|
end
|
173
198
|
|
174
199
|
def mass_assign(new_attrs = {})
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
200
|
+
case self.class.assignment_mode
|
201
|
+
when :whitelist
|
202
|
+
whitelist_assign(new_attrs)
|
203
|
+
when :carefree
|
204
|
+
carefree_assign(new_attrs)
|
180
205
|
end
|
181
206
|
end
|
182
207
|
alias_method :attributes=, :mass_assign
|
@@ -233,6 +258,21 @@ module Chozo
|
|
233
258
|
def add_error(attribute, message)
|
234
259
|
self.errors[attribute] ||= Array.new
|
235
260
|
self.errors[attribute] << message
|
236
|
-
end
|
261
|
+
end
|
262
|
+
|
263
|
+
private
|
264
|
+
|
265
|
+
def carefree_assign(new_attrs = {})
|
266
|
+
attributes.deep_merge!(new_attrs)
|
267
|
+
end
|
268
|
+
|
269
|
+
def whitelist_assign(new_attrs = {})
|
270
|
+
attributes.dotted_paths.each do |dotted_path|
|
271
|
+
value = new_attrs.dig(dotted_path)
|
272
|
+
next if value.nil?
|
273
|
+
|
274
|
+
set_attribute(dotted_path, value)
|
275
|
+
end
|
276
|
+
end
|
237
277
|
end
|
238
278
|
end
|
data/lib/chozo/version.rb
CHANGED
@@ -90,6 +90,32 @@ describe Chozo::VariaModel do
|
|
90
90
|
validations.should be_empty
|
91
91
|
end
|
92
92
|
end
|
93
|
+
|
94
|
+
describe "#assignment_mode" do
|
95
|
+
it "returns the default assignment mode :whitelist" do
|
96
|
+
subject.assignment_mode.should eql(:whitelist)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe "#set_assignment_mode" do
|
101
|
+
it "sets the assignment_mode to whitelist" do
|
102
|
+
subject.set_assignment_mode(:whitelist)
|
103
|
+
|
104
|
+
subject.assignment_mode.should eql(:whitelist)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "sets the assignment_mode to carefree" do
|
108
|
+
subject.set_assignment_mode(:carefree)
|
109
|
+
|
110
|
+
subject.assignment_mode.should eql(:carefree)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "raises if given an invalid assignment mode" do
|
114
|
+
expect {
|
115
|
+
subject.set_assignment_mode(:not_a_real_mode)
|
116
|
+
}.to raise_error(ArgumentError)
|
117
|
+
end
|
118
|
+
end
|
93
119
|
end
|
94
120
|
|
95
121
|
describe "::validate_kind_of" do
|
@@ -498,8 +524,28 @@ describe Chozo::VariaModel do
|
|
498
524
|
}
|
499
525
|
|
500
526
|
subject.mass_assign(new_attrs)
|
527
|
+
subject.attributes[:undefined_attribute].should be_nil
|
501
528
|
subject.should_not respond_to(:undefined_attribute)
|
502
529
|
end
|
530
|
+
|
531
|
+
context "when in carefree assignment mode" do
|
532
|
+
subject do
|
533
|
+
Class.new do
|
534
|
+
include Chozo::VariaModel
|
535
|
+
|
536
|
+
set_assignment_mode :carefree
|
537
|
+
end.new
|
538
|
+
end
|
539
|
+
|
540
|
+
it "does not ignore values which are not defined" do
|
541
|
+
new_attrs = {
|
542
|
+
undefined_attribute: "value"
|
543
|
+
}
|
544
|
+
|
545
|
+
subject.mass_assign(new_attrs)
|
546
|
+
subject.attributes[:undefined_attribute].should eql("value")
|
547
|
+
end
|
548
|
+
end
|
503
549
|
end
|
504
550
|
|
505
551
|
describe "#from_json" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chozo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
segments:
|
127
127
|
- 0
|
128
|
-
hash:
|
128
|
+
hash: 3156158446945270058
|
129
129
|
requirements: []
|
130
130
|
rubyforge_project:
|
131
131
|
rubygems_version: 1.8.23
|