active_attr 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of active_attr might be problematic. Click here for more details.

Files changed (45) hide show
  1. data/.travis.yml +11 -1
  2. data/CHANGELOG.md +9 -0
  3. data/Gemfile +4 -6
  4. data/README.md +29 -11
  5. data/active_attr.gemspec +3 -3
  6. data/gemfiles/rails_3_2.gemfile +11 -0
  7. data/gemfiles/rails_head.gemfile +3 -0
  8. data/lib/active_attr.rb +0 -1
  9. data/lib/active_attr/mass_assignment.rb +30 -2
  10. data/lib/active_attr/matchers/have_attribute_matcher.rb +17 -4
  11. data/lib/active_attr/model.rb +2 -2
  12. data/lib/active_attr/typecasting/big_decimal_typecaster.rb +2 -0
  13. data/lib/active_attr/typecasting/date_typecaster.rb +1 -1
  14. data/lib/active_attr/version.rb +1 -1
  15. data/spec/functional/active_attr/attribute_defaults_spec.rb +12 -12
  16. data/spec/functional/active_attr/attributes_spec.rb +12 -12
  17. data/spec/functional/active_attr/chainable_initialization_spec.rb +3 -3
  18. data/spec/functional/active_attr/mass_assignment_spec.rb +125 -0
  19. data/spec/functional/active_attr/matchers/have_attribute_matcher_spec.rb +147 -66
  20. data/spec/functional/active_attr/model_spec.rb +27 -19
  21. data/spec/functional/active_attr/serialization_spec.rb +5 -5
  22. data/spec/functional/active_attr/typecasted_attributes_spec.rb +45 -45
  23. data/spec/support/mass_assignment_shared_examples.rb +12 -12
  24. data/spec/unit/active_attr/attribute_defaults_spec.rb +6 -6
  25. data/spec/unit/active_attr/attribute_definition_spec.rb +6 -6
  26. data/spec/unit/active_attr/attributes_spec.rb +38 -38
  27. data/spec/unit/active_attr/logger_spec.rb +16 -16
  28. data/spec/unit/active_attr/mass_assignment_spec.rb +1 -1
  29. data/spec/unit/active_attr/matchers_spec.rb +3 -4
  30. data/spec/unit/active_attr/query_attributes_spec.rb +75 -75
  31. data/spec/unit/active_attr/typecasted_attributes_spec.rb +10 -10
  32. data/spec/unit/active_attr/typecasting/big_decimal_typecaster_spec.rb +9 -7
  33. data/spec/unit/active_attr/typecasting/boolean_typecaster_spec.rb +27 -25
  34. data/spec/unit/active_attr/typecasting/date_time_typecaster_spec.rb +12 -10
  35. data/spec/unit/active_attr/typecasting/date_typecaster_spec.rb +14 -12
  36. data/spec/unit/active_attr/typecasting/float_typecaster_spec.rb +6 -4
  37. data/spec/unit/active_attr/typecasting/integer_typecaster_spec.rb +8 -6
  38. data/spec/unit/active_attr/typecasting/object_typecaster_spec.rb +3 -1
  39. data/spec/unit/active_attr/typecasting/string_typecaster_spec.rb +5 -3
  40. data/spec/unit/active_attr/typecasting_spec.rb +3 -5
  41. data/spec/unit/active_attr/version_spec.rb +5 -5
  42. metadata +20 -17
  43. data/lib/active_attr/mass_assignment_security.rb +0 -54
  44. data/spec/functional/active_attr/mass_assignment_security_spec.rb +0 -45
  45. data/spec/unit/active_attr/mass_assignment_security_spec.rb +0 -67
@@ -4,10 +4,12 @@ require "active_attr/typecasting/object_typecaster"
4
4
  module ActiveAttr
5
5
  module Typecasting
6
6
  describe ObjectTypecaster do
7
+ subject(:typecaster) { described_class.new }
8
+
7
9
  describe "#call" do
8
10
  it "returns the original object for any object" do
9
11
  value = mock
10
- subject.call(value).should equal value
12
+ typecaster.call(value).should equal value
11
13
  end
12
14
  end
13
15
  end
@@ -5,18 +5,20 @@ require "active_support/basic_object"
5
5
  module ActiveAttr
6
6
  module Typecasting
7
7
  describe StringTypecaster do
8
+ subject(:typecaster) { described_class.new }
9
+
8
10
  describe "#call" do
9
11
  it "returns the original string for a String" do
10
12
  value = "abc"
11
- subject.call(value).should equal value
13
+ typecaster.call(value).should equal value
12
14
  end
13
15
 
14
16
  it "casts nil to an empty String" do
15
- subject.call(nil).should eql ""
17
+ typecaster.call(nil).should eql ""
16
18
  end
17
19
 
18
20
  it "returns the string version of a Symbol" do
19
- subject.call(:value).should eql "value"
21
+ typecaster.call(:value).should eql "value"
20
22
  end
21
23
  end
22
24
  end
@@ -3,7 +3,7 @@ require "active_attr/typecasting"
3
3
 
4
4
  module ActiveAttr
5
5
  describe Typecasting do
6
- subject { model_class.new }
6
+ subject(:model) { model_class.new }
7
7
 
8
8
  let :model_class do
9
9
  Class.new do
@@ -13,11 +13,11 @@ module ActiveAttr
13
13
 
14
14
  describe "#typecast_attribute" do
15
15
  it "raises an ArgumentError when a nil type is given" do
16
- expect { subject.typecast_attribute(nil, "foo") }.to raise_error(ArgumentError, "a typecaster must be given")
16
+ expect { model.typecast_attribute(nil, "foo") }.to raise_error(ArgumentError, "a typecaster must be given")
17
17
  end
18
18
 
19
19
  it "raises an ArgumentError when the given typecaster argument does not respond to #call" do
20
- expect { subject.typecast_attribute(Object.new, "foo") }.to raise_error(ArgumentError, "a typecaster must be given")
20
+ expect { model.typecast_attribute(Object.new, "foo") }.to raise_error(ArgumentError, "a typecaster must be given")
21
21
  end
22
22
 
23
23
  it "returns the original value when the value is nil" do
@@ -26,8 +26,6 @@ module ActiveAttr
26
26
  end
27
27
 
28
28
  describe "#typecaster_for" do
29
- let(:model) { model_class.new }
30
-
31
29
  it "returns BigDecimalTypecaster for BigDecimal" do
32
30
  model.typecaster_for(BigDecimal).should be_a_kind_of Typecasting::BigDecimalTypecaster
33
31
  end
@@ -9,10 +9,10 @@ module ActiveAttr
9
9
 
10
10
  describe "is compliant with Semantic Versioning <http://semver.org/>" do
11
11
  let(:gem_version) { Gem::Version.new VERSION }
12
- subject { gem_version }
12
+ subject(:version) { gem_version }
13
13
 
14
- it { subject.should have_at_least(3).segments }
15
- it { subject.should have_at_most(5).segments }
14
+ it { version.should have_at_least(3).segments }
15
+ it { version.should have_at_most(5).segments }
16
16
 
17
17
  describe "major version" do
18
18
  subject { gem_version.segments[0] }
@@ -33,10 +33,10 @@ module ActiveAttr
33
33
  end
34
34
 
35
35
  describe "pre-release version" do
36
- subject { VERSION.split(".")[3] }
36
+ subject(:pre_release_version) { VERSION.split(".")[3] }
37
37
 
38
38
  it "is nil or starts with a letter and is alphanumeric" do
39
- (subject.nil? || subject =~ /^[A-Za-z][0-9A-Za-z]*?/).should be_true
39
+ (pre_release_version.nil? || pre_release_version =~ /^[A-Za-z][0-9A-Za-z]*?/).should be_true
40
40
  end
41
41
  end
42
42
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_attr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-12-16 00:00:00.000000000 Z
13
+ date: 2013-05-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -82,7 +82,7 @@ dependencies:
82
82
  version: '2.2'
83
83
  - - <
84
84
  - !ruby/object:Gem::Version
85
- version: '4.0'
85
+ version: '5.0'
86
86
  type: :development
87
87
  prerelease: false
88
88
  version_requirements: !ruby/object:Gem::Requirement
@@ -93,23 +93,29 @@ dependencies:
93
93
  version: '2.2'
94
94
  - - <
95
95
  - !ruby/object:Gem::Version
96
- version: '4.0'
96
+ version: '5.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  none: false
101
101
  requirements:
102
- - - ~>
102
+ - - ! '>='
103
103
  - !ruby/object:Gem::Version
104
104
  version: 0.9.0
105
+ - - <
106
+ - !ruby/object:Gem::Version
107
+ version: '10.1'
105
108
  type: :development
106
109
  prerelease: false
107
110
  version_requirements: !ruby/object:Gem::Requirement
108
111
  none: false
109
112
  requirements:
110
- - - ~>
113
+ - - ! '>='
111
114
  - !ruby/object:Gem::Version
112
115
  version: 0.9.0
116
+ - - <
117
+ - !ruby/object:Gem::Version
118
+ version: '10.1'
113
119
  - !ruby/object:Gem::Dependency
114
120
  name: rspec
115
121
  requirement: !ruby/object:Gem::Requirement
@@ -117,7 +123,7 @@ dependencies:
117
123
  requirements:
118
124
  - - ~>
119
125
  - !ruby/object:Gem::Version
120
- version: '2.6'
126
+ version: '2.11'
121
127
  type: :development
122
128
  prerelease: false
123
129
  version_requirements: !ruby/object:Gem::Requirement
@@ -125,7 +131,7 @@ dependencies:
125
131
  requirements:
126
132
  - - ~>
127
133
  - !ruby/object:Gem::Version
128
- version: '2.6'
134
+ version: '2.11'
129
135
  - !ruby/object:Gem::Dependency
130
136
  name: tzinfo
131
137
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +170,7 @@ files:
164
170
  - active_attr.gemspec
165
171
  - gemfiles/rails_3_0.gemfile
166
172
  - gemfiles/rails_3_1.gemfile
173
+ - gemfiles/rails_3_2.gemfile
167
174
  - gemfiles/rails_head.gemfile
168
175
  - lib/active_attr.rb
169
176
  - lib/active_attr/attribute_defaults.rb
@@ -176,7 +183,6 @@ files:
176
183
  - lib/active_attr/error.rb
177
184
  - lib/active_attr/logger.rb
178
185
  - lib/active_attr/mass_assignment.rb
179
- - lib/active_attr/mass_assignment_security.rb
180
186
  - lib/active_attr/matchers.rb
181
187
  - lib/active_attr/matchers/have_attribute_matcher.rb
182
188
  - lib/active_attr/model.rb
@@ -201,7 +207,7 @@ files:
201
207
  - spec/functional/active_attr/attribute_defaults_spec.rb
202
208
  - spec/functional/active_attr/attributes_spec.rb
203
209
  - spec/functional/active_attr/chainable_initialization_spec.rb
204
- - spec/functional/active_attr/mass_assignment_security_spec.rb
210
+ - spec/functional/active_attr/mass_assignment_spec.rb
205
211
  - spec/functional/active_attr/matchers/have_attribute_matcher_spec.rb
206
212
  - spec/functional/active_attr/model_spec.rb
207
213
  - spec/functional/active_attr/query_attributes_spec.rb
@@ -220,7 +226,6 @@ files:
220
226
  - spec/unit/active_attr/dangerous_attribute_error_spec.rb
221
227
  - spec/unit/active_attr/error_spec.rb
222
228
  - spec/unit/active_attr/logger_spec.rb
223
- - spec/unit/active_attr/mass_assignment_security_spec.rb
224
229
  - spec/unit/active_attr/mass_assignment_spec.rb
225
230
  - spec/unit/active_attr/matchers/have_attribute_matcher_spec.rb
226
231
  - spec/unit/active_attr/matchers_spec.rb
@@ -253,7 +258,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
253
258
  version: '0'
254
259
  segments:
255
260
  - 0
256
- hash: 158822626383359135
261
+ hash: 712620086539529581
257
262
  required_rubygems_version: !ruby/object:Gem::Requirement
258
263
  none: false
259
264
  requirements:
@@ -262,10 +267,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
262
267
  version: '0'
263
268
  segments:
264
269
  - 0
265
- hash: 158822626383359135
270
+ hash: 712620086539529581
266
271
  requirements: []
267
272
  rubyforge_project:
268
- rubygems_version: 1.8.24
273
+ rubygems_version: 1.8.25
269
274
  signing_key:
270
275
  specification_version: 3
271
276
  summary: What ActiveModel left out
@@ -273,7 +278,7 @@ test_files:
273
278
  - spec/functional/active_attr/attribute_defaults_spec.rb
274
279
  - spec/functional/active_attr/attributes_spec.rb
275
280
  - spec/functional/active_attr/chainable_initialization_spec.rb
276
- - spec/functional/active_attr/mass_assignment_security_spec.rb
281
+ - spec/functional/active_attr/mass_assignment_spec.rb
277
282
  - spec/functional/active_attr/matchers/have_attribute_matcher_spec.rb
278
283
  - spec/functional/active_attr/model_spec.rb
279
284
  - spec/functional/active_attr/query_attributes_spec.rb
@@ -292,7 +297,6 @@ test_files:
292
297
  - spec/unit/active_attr/dangerous_attribute_error_spec.rb
293
298
  - spec/unit/active_attr/error_spec.rb
294
299
  - spec/unit/active_attr/logger_spec.rb
295
- - spec/unit/active_attr/mass_assignment_security_spec.rb
296
300
  - spec/unit/active_attr/mass_assignment_spec.rb
297
301
  - spec/unit/active_attr/matchers/have_attribute_matcher_spec.rb
298
302
  - spec/unit/active_attr/matchers_spec.rb
@@ -311,4 +315,3 @@ test_files:
311
315
  - spec/unit/active_attr/typecasting_spec.rb
312
316
  - spec/unit/active_attr/unknown_attribute_error_spec.rb
313
317
  - spec/unit/active_attr/version_spec.rb
314
- has_rdoc:
@@ -1,54 +0,0 @@
1
- require "active_attr/mass_assignment"
2
- require "active_support/concern"
3
- require "active_model"
4
-
5
- module ActiveAttr
6
- # MassAssignmentSecurity allows you to bulk set and update a blacklist or
7
- # whitelist of attributes
8
- #
9
- # Including MassAssignmentSecurity extends all {ActiveAttr::MassAssignment}
10
- # methods to honor any declared attribute permissions.
11
- #
12
- # @example Usage
13
- # class Person
14
- # include ActiveAttr::MassAssignmentSecurity
15
- # end
16
- #
17
- # @since 0.3.0
18
- module MassAssignmentSecurity
19
- extend ActiveSupport::Concern
20
- include MassAssignment
21
- include ActiveModel::MassAssignmentSecurity
22
-
23
- # Mass update a model's attributes, honoring attribute permissions
24
- #
25
- # @param (see MassAssignment#assign_attributes)
26
- # @param [Hash, #[]] options Options that affect mass assignment
27
- #
28
- # @option options [Symbol] :as (:default) Mass assignment role
29
- # @option options [true, false] :without_protection (false) Bypass mass
30
- # assignment security if true
31
- #
32
- # @since 0.3.0
33
- def assign_attributes(new_attributes, options={})
34
- if new_attributes && !options[:without_protection]
35
- mass_assignment_role = options[:as] || :default
36
- new_attributes = sanitize_for_mass_assignment_with_or_without_role new_attributes, mass_assignment_role
37
- end
38
-
39
- super
40
- end
41
-
42
- private
43
-
44
- # Rails 3.0 has no roles support in mass assignment
45
- # @since 0.7.0
46
- def sanitize_for_mass_assignment_with_or_without_role(new_attributes, mass_assignment_role)
47
- if method(:sanitize_for_mass_assignment).arity.abs > 1
48
- sanitize_for_mass_assignment new_attributes, mass_assignment_role
49
- else
50
- sanitize_for_mass_assignment new_attributes
51
- end
52
- end
53
- end
54
- end
@@ -1,45 +0,0 @@
1
- require "spec_helper"
2
- require "active_attr/mass_assignment_security"
3
-
4
- module ActiveAttr
5
- describe MassAssignmentSecurity, :mass_assignment do
6
- context "integrating with strong_parameters", :active_model_version => "~> 3.2.0" do
7
- subject { model_class }
8
-
9
- before do
10
- require "strong_parameters"
11
-
12
- model_class.class_eval do
13
- include ActiveAttr::MassAssignmentSecurity
14
- include ActiveModel::ForbiddenAttributesProtection
15
- attr_accessor :age
16
- end
17
- end
18
-
19
- shared_examples "strong mass assignment method", :strong_mass_assignment_method => true do
20
- it "raises if provided parameters when none are permitted" do
21
- expect { mass_assign_attributes(ActionController::Parameters.new(:age => 21)) }.to raise_error ActiveModel::ForbiddenAttributes
22
- end
23
-
24
- it "sets a permitted parameter" do
25
- person = mass_assign_attributes(ActionController::Parameters.new(:age => 21).permit(:age))
26
- person.age.should == 21
27
- end
28
-
29
- it "does not set forbidden parameters" do
30
- person = mass_assign_attributes(ActionController::Parameters.new(:age => 21).permit(:first_name))
31
- person.age.should be_nil
32
- end
33
-
34
- it "continues to set normal attributes" do
35
- person = mass_assign_attributes(:age => 21)
36
- person.age.should == 21
37
- end
38
- end
39
-
40
- describe "#assign_attributes", :assign_attributes, :strong_mass_assignment_method
41
- describe "#attributes=", :attributes=, :strong_mass_assignment_method
42
- describe "#initialize", :initialize, :strong_mass_assignment_method
43
- end
44
- end
45
- end
@@ -1,67 +0,0 @@
1
- require "spec_helper"
2
- require "active_attr/mass_assignment_security"
3
-
4
- module ActiveAttr
5
- describe MassAssignmentSecurity, :mass_assignment do
6
- subject { model_class }
7
-
8
- before do
9
- model_class.class_eval do
10
- include MassAssignmentSecurity
11
- attr_accessor :age
12
- end
13
- end
14
-
15
- shared_examples "secure mass assignment method", :secure_mass_assignment_method => true do
16
- include_examples "mass assignment method"
17
-
18
- it "ignores assigning an attribute protected by role-based security", :active_model_version => ">= 3.1.0" do
19
- person = mass_assign_attributes(:age => 21)
20
- person.age.should be_nil
21
- end
22
-
23
- it "ignores assigning a protected attribute" do
24
- person = mass_assign_attributes(:first_name => "Chris")
25
- person.age.should be_nil
26
- end
27
- end
28
-
29
- shared_examples "secure mass assignment method with options", :secure_mass_assignment_method_with_options => true do
30
- it "supports role-based mass assignment security", :active_model_version => ">= 3.1.0" do
31
- person = mass_assign_attributes_with_options({ :age => 21 }, :as => :admin)
32
- person.age.should == 21
33
- end
34
-
35
- it "skips security if passed the :without_protection option" do
36
- person = mass_assign_attributes_with_options({ :age => 21 }, :without_protection => true)
37
- person.age.should == 21
38
- end
39
- end
40
-
41
- context "white listing attributes" do
42
- before do
43
- model_class.class_eval do
44
- attr_accessible :first_name, :last_name, :name
45
- attr_accessible :age, :as => :admin
46
- end
47
- end
48
-
49
- describe "#assign_attributes", :assign_attributes, :secure_mass_assignment_method, :secure_mass_assignment_method_with_options
50
- describe "#attributes=", :attributes=, :secure_mass_assignment_method
51
- describe "#initialize", :initialize, :secure_mass_assignment_method, :secure_mass_assignment_method_with_options
52
- end
53
-
54
- context "black listing attributes" do
55
- before do
56
- model_class.class_eval do
57
- attr_protected :age
58
- attr_protected :as => :admin
59
- end
60
- end
61
-
62
- describe "#assign_attributes", :assign_attributes, :secure_mass_assignment_method, :secure_mass_assignment_method_with_options
63
- describe "#attributes=", :attributes=, :secure_mass_assignment_method
64
- describe "#initialize", :initialize, :secure_mass_assignment_method, :secure_mass_assignment_method_with_options
65
- end
66
- end
67
- end