active_attr 0.4.1 → 0.5.0.alpha1

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 (53) hide show
  1. data/.travis.yml +7 -0
  2. data/CHANGELOG.md +14 -0
  3. data/README.md +57 -25
  4. data/Rakefile +2 -0
  5. data/active_attr.gemspec +3 -2
  6. data/gemfiles/rails_3_1.gemfile +6 -0
  7. data/lib/active_attr.rb +3 -2
  8. data/lib/active_attr/attribute_defaults.rb +120 -0
  9. data/lib/active_attr/attribute_definition.rb +25 -2
  10. data/lib/active_attr/attributes.rb +44 -33
  11. data/lib/active_attr/logger.rb +8 -8
  12. data/lib/active_attr/mass_assignment.rb +2 -1
  13. data/lib/active_attr/matchers/have_attribute_matcher.rb +28 -10
  14. data/lib/active_attr/model.rb +2 -0
  15. data/lib/active_attr/query_attributes.rb +2 -5
  16. data/lib/active_attr/typecasted_attributes.rb +77 -0
  17. data/lib/active_attr/typecasting.rb +60 -0
  18. data/lib/active_attr/typecasting/boolean.rb +6 -0
  19. data/lib/active_attr/typecasting/boolean_typecaster.rb +21 -0
  20. data/lib/active_attr/typecasting/date_time_typecaster.rb +14 -0
  21. data/lib/active_attr/typecasting/date_typecaster.rb +14 -0
  22. data/lib/active_attr/typecasting/float_typecaster.rb +11 -0
  23. data/lib/active_attr/typecasting/integer_typecaster.rb +12 -0
  24. data/lib/active_attr/typecasting/object_typecaster.rb +9 -0
  25. data/lib/active_attr/typecasting/string_typecaster.rb +11 -0
  26. data/lib/active_attr/version.rb +1 -1
  27. data/spec/functional/active_attr/attribute_defaults_spec.rb +136 -0
  28. data/spec/functional/active_attr/attributes_spec.rb +19 -5
  29. data/spec/functional/active_attr/model_spec.rb +34 -4
  30. data/spec/functional/active_attr/typecasted_attributes_spec.rb +116 -0
  31. data/spec/support/mass_assignment_shared_examples.rb +1 -1
  32. data/spec/unit/active_attr/attribute_defaults_spec.rb +43 -0
  33. data/spec/unit/active_attr/attribute_definition_spec.rb +12 -8
  34. data/spec/unit/active_attr/attributes_spec.rb +22 -10
  35. data/spec/unit/active_attr/mass_assignment_spec.rb +1 -0
  36. data/spec/unit/active_attr/matchers/have_attribute_matcher_spec.rb +94 -15
  37. data/spec/unit/active_attr/query_attributes_spec.rb +1 -1
  38. data/spec/unit/active_attr/typecasted_attributes_spec.rb +76 -0
  39. data/spec/unit/active_attr/typecasting/boolean_spec.rb +10 -0
  40. data/spec/unit/active_attr/typecasting/boolean_typecaster_spec.rb +147 -0
  41. data/spec/unit/active_attr/typecasting/date_time_typecaster_spec.rb +67 -0
  42. data/spec/unit/active_attr/typecasting/date_typecaster_spec.rb +55 -0
  43. data/spec/unit/active_attr/typecasting/float_typecaster_spec.rb +27 -0
  44. data/spec/unit/active_attr/typecasting/integer_typecaster_spec.rb +35 -0
  45. data/spec/unit/active_attr/typecasting/object_typecaster_spec.rb +15 -0
  46. data/spec/unit/active_attr/typecasting/string_typecaster_spec.rb +24 -0
  47. data/spec/unit/active_attr/typecasting_spec.rb +87 -0
  48. data/spec/unit/active_attr/version_spec.rb +11 -2
  49. metadata +75 -29
  50. data/lib/active_attr/strict_mass_assignment.rb +0 -44
  51. data/lib/active_attr/unknown_attributes_error.rb +0 -18
  52. data/spec/unit/active_attr/strict_mass_assignment_spec.rb +0 -38
  53. data/spec/unit/active_attr/unknown_attributes_error_spec.rb +0 -9
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+ require "active_attr/typecasting/string_typecaster"
3
+ require "active_support/basic_object"
4
+
5
+ module ActiveAttr
6
+ module Typecasting
7
+ describe StringTypecaster do
8
+ describe "#call" do
9
+ it "returns the original string for a String" do
10
+ value = "abc"
11
+ subject.call(value).should equal value
12
+ end
13
+
14
+ it "casts nil to an empty String" do
15
+ subject.call(nil).should eql ""
16
+ end
17
+
18
+ it "returns the string version of a Symbol" do
19
+ subject.call(:value).should eql "value"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,87 @@
1
+ require "spec_helper"
2
+ require "active_attr/typecasting"
3
+
4
+ module ActiveAttr
5
+ describe Typecasting do
6
+ subject { model_class.new }
7
+
8
+ let :model_class do
9
+ Class.new do
10
+ include Typecasting
11
+ end
12
+ end
13
+
14
+ describe "#typecast_attribute" do
15
+ let(:type) { String }
16
+
17
+ it "raises an ArgumentError when a nil type is given" do
18
+ expect { subject.typecast_attribute(nil, "foo") }.to raise_error(ArgumentError, "a Class must be given")
19
+ end
20
+
21
+ context "when there is no way to typecast the value" do
22
+ let(:value) { mock("SomeRandomValue") }
23
+
24
+ it "returns nil" do
25
+ subject.stub(:typecast_value).and_return(nil)
26
+ subject.typecast_attribute(type, value).should be_nil
27
+ end
28
+ end
29
+
30
+ context "when the value is nil" do
31
+ let(:name) { nil }
32
+ let(:model) { model_class.new }
33
+ subject { model.typecast_attribute(type, name) }
34
+
35
+ it "returns the original value" do
36
+ should eql name
37
+ end
38
+
39
+ it "does not call try to convert the value" do
40
+ model.should_not_receive(:typecast_value)
41
+ subject
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "#typecast_value" do
47
+ let(:model) { model_class.new }
48
+ subject { model.typecast_value(type, value) }
49
+ let(:value) { mock }
50
+
51
+ it "calls BooleanTypecaster when typecasting to Boolean" do
52
+ Typecasting::BooleanTypecaster.any_instance.should_receive(:call).with(value)
53
+ model.typecast_value(Typecasting::Boolean, value)
54
+ end
55
+
56
+ it "calls DateTypecaster when typecasting to Date" do
57
+ Typecasting::DateTypecaster.any_instance.should_receive(:call).with(value)
58
+ model.typecast_value(Date, value)
59
+ end
60
+
61
+ it "calls DateTypecaster when typecasting to Date" do
62
+ Typecasting::DateTimeTypecaster.any_instance.should_receive(:call).with(value)
63
+ model.typecast_value(DateTime, value)
64
+ end
65
+
66
+ it "calls FloatTypecaster when typecasting to Float" do
67
+ Typecasting::FloatTypecaster.any_instance.should_receive(:call).with(value)
68
+ model.typecast_value(Float, value)
69
+ end
70
+
71
+ it "calls IntegerTypecaster when typecasting to Integer" do
72
+ Typecasting::IntegerTypecaster.any_instance.should_receive(:call).with(value)
73
+ model.typecast_value(Integer, value)
74
+ end
75
+
76
+ it "calls StringTypecaster when typecasting to String" do
77
+ Typecasting::StringTypecaster.any_instance.should_receive(:call).with(value)
78
+ model.typecast_value(String, value)
79
+ end
80
+
81
+ it "calls ObjectTypecaster when typecasting to Object" do
82
+ Typecasting::ObjectTypecaster.any_instance.should_receive(:call).with(value)
83
+ model.typecast_value(Object, value)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -11,7 +11,8 @@ module ActiveAttr
11
11
  let(:gem_version) { Gem::Version.new VERSION }
12
12
  subject { gem_version }
13
13
 
14
- it { subject.should have(3).segments }
14
+ it { subject.should have_at_least(3).segments }
15
+ it { subject.should have_at_most(5).segments }
15
16
 
16
17
  describe "major version" do
17
18
  subject { gem_version.segments[0] }
@@ -28,7 +29,15 @@ module ActiveAttr
28
29
  describe "patch version" do
29
30
  subject { gem_version.segments[2] }
30
31
 
31
- it { subject.to_s.should =~ /\d+([A-Za-z][0-9A-Za-z-]*)?/ }
32
+ it { should be_a_kind_of Fixnum }
33
+ end
34
+
35
+ describe "pre-release version" do
36
+ subject { VERSION.split(".")[3] }
37
+
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
40
+ end
32
41
  end
33
42
  end
34
43
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_attr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
5
- prerelease:
4
+ version: 0.5.0.alpha1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Chris Griego
@@ -10,33 +10,39 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-11-27 00:00:00.000000000Z
13
+ date: 2012-01-30 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
17
- requirement: &70212854595820 !ruby/object:Gem::Requirement
17
+ requirement: &70156170094480 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ~>
20
+ - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
22
  version: '3.1'
23
+ - - <
24
+ - !ruby/object:Gem::Version
25
+ version: '4.1'
23
26
  type: :runtime
24
27
  prerelease: false
25
- version_requirements: *70212854595820
28
+ version_requirements: *70156170094480
26
29
  - !ruby/object:Gem::Dependency
27
30
  name: activesupport
28
- requirement: &70212854610300 !ruby/object:Gem::Requirement
31
+ requirement: &70156170093260 !ruby/object:Gem::Requirement
29
32
  none: false
30
33
  requirements:
31
- - - ~>
34
+ - - ! '>='
32
35
  - !ruby/object:Gem::Version
33
36
  version: '3.1'
37
+ - - <
38
+ - !ruby/object:Gem::Version
39
+ version: '4.1'
34
40
  type: :runtime
35
41
  prerelease: false
36
- version_requirements: *70212854610300
42
+ version_requirements: *70156170093260
37
43
  - !ruby/object:Gem::Dependency
38
44
  name: bundler
39
- requirement: &70212854618100 !ruby/object:Gem::Requirement
45
+ requirement: &70156170091500 !ruby/object:Gem::Requirement
40
46
  none: false
41
47
  requirements:
42
48
  - - ~>
@@ -44,10 +50,10 @@ dependencies:
44
50
  version: '1.0'
45
51
  type: :development
46
52
  prerelease: false
47
- version_requirements: *70212854618100
53
+ version_requirements: *70156170091500
48
54
  - !ruby/object:Gem::Dependency
49
55
  name: factory_girl
50
- requirement: &70212854630340 !ruby/object:Gem::Requirement
56
+ requirement: &70156170090500 !ruby/object:Gem::Requirement
51
57
  none: false
52
58
  requirements:
53
59
  - - ~>
@@ -55,10 +61,10 @@ dependencies:
55
61
  version: '2.2'
56
62
  type: :development
57
63
  prerelease: false
58
- version_requirements: *70212854630340
64
+ version_requirements: *70156170090500
59
65
  - !ruby/object:Gem::Dependency
60
66
  name: rake
61
- requirement: &70212858706240 !ruby/object:Gem::Requirement
67
+ requirement: &70156170089280 !ruby/object:Gem::Requirement
62
68
  none: false
63
69
  requirements:
64
70
  - - ~>
@@ -66,10 +72,10 @@ dependencies:
66
72
  version: 0.9.0
67
73
  type: :development
68
74
  prerelease: false
69
- version_requirements: *70212858706240
75
+ version_requirements: *70156170089280
70
76
  - !ruby/object:Gem::Dependency
71
77
  name: rspec
72
- requirement: &70212863308060 !ruby/object:Gem::Requirement
78
+ requirement: &70156170087680 !ruby/object:Gem::Requirement
73
79
  none: false
74
80
  requirements:
75
81
  - - ~>
@@ -77,7 +83,18 @@ dependencies:
77
83
  version: '2.6'
78
84
  type: :development
79
85
  prerelease: false
80
- version_requirements: *70212863308060
86
+ version_requirements: *70156170087680
87
+ - !ruby/object:Gem::Dependency
88
+ name: tzinfo
89
+ requirement: &70156170086620 !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: 0.3.29
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: *70156170086620
81
98
  description: Create plain old ruby models without reinventing the wheel.
82
99
  email:
83
100
  - cgriego@gmail.com
@@ -98,8 +115,10 @@ files:
98
115
  - README.md
99
116
  - Rakefile
100
117
  - active_attr.gemspec
118
+ - gemfiles/rails_3_1.gemfile
101
119
  - gemfiles/rails_head.gemfile
102
120
  - lib/active_attr.rb
121
+ - lib/active_attr/attribute_defaults.rb
103
122
  - lib/active_attr/attribute_definition.rb
104
123
  - lib/active_attr/attributes.rb
105
124
  - lib/active_attr/basic_model.rb
@@ -116,18 +135,29 @@ files:
116
135
  - lib/active_attr/query_attributes.rb
117
136
  - lib/active_attr/railtie.rb
118
137
  - lib/active_attr/rspec.rb
119
- - lib/active_attr/strict_mass_assignment.rb
138
+ - lib/active_attr/typecasted_attributes.rb
139
+ - lib/active_attr/typecasting.rb
140
+ - lib/active_attr/typecasting/boolean.rb
141
+ - lib/active_attr/typecasting/boolean_typecaster.rb
142
+ - lib/active_attr/typecasting/date_time_typecaster.rb
143
+ - lib/active_attr/typecasting/date_typecaster.rb
144
+ - lib/active_attr/typecasting/float_typecaster.rb
145
+ - lib/active_attr/typecasting/integer_typecaster.rb
146
+ - lib/active_attr/typecasting/object_typecaster.rb
147
+ - lib/active_attr/typecasting/string_typecaster.rb
120
148
  - lib/active_attr/unknown_attribute_error.rb
121
- - lib/active_attr/unknown_attributes_error.rb
122
149
  - lib/active_attr/version.rb
150
+ - spec/functional/active_attr/attribute_defaults_spec.rb
123
151
  - spec/functional/active_attr/attributes_spec.rb
124
152
  - spec/functional/active_attr/chainable_initialization_spec.rb
125
153
  - spec/functional/active_attr/model_spec.rb
126
154
  - spec/functional/active_attr/query_attributes_spec.rb
155
+ - spec/functional/active_attr/typecasted_attributes_spec.rb
127
156
  - spec/spec_helper.rb
128
157
  - spec/support/active_model_lint.rb
129
158
  - spec/support/initialization_verifier.rb
130
159
  - spec/support/mass_assignment_shared_examples.rb
160
+ - spec/unit/active_attr/attribute_defaults_spec.rb
131
161
  - spec/unit/active_attr/attribute_definition_spec.rb
132
162
  - spec/unit/active_attr/attributes_spec.rb
133
163
  - spec/unit/active_attr/basic_model_spec.rb
@@ -139,9 +169,17 @@ files:
139
169
  - spec/unit/active_attr/mass_assignment_spec.rb
140
170
  - spec/unit/active_attr/matchers/have_attribute_matcher_spec.rb
141
171
  - spec/unit/active_attr/query_attributes_spec.rb
142
- - spec/unit/active_attr/strict_mass_assignment_spec.rb
172
+ - spec/unit/active_attr/typecasted_attributes_spec.rb
173
+ - spec/unit/active_attr/typecasting/boolean_spec.rb
174
+ - spec/unit/active_attr/typecasting/boolean_typecaster_spec.rb
175
+ - spec/unit/active_attr/typecasting/date_time_typecaster_spec.rb
176
+ - spec/unit/active_attr/typecasting/date_typecaster_spec.rb
177
+ - spec/unit/active_attr/typecasting/float_typecaster_spec.rb
178
+ - spec/unit/active_attr/typecasting/integer_typecaster_spec.rb
179
+ - spec/unit/active_attr/typecasting/object_typecaster_spec.rb
180
+ - spec/unit/active_attr/typecasting/string_typecaster_spec.rb
181
+ - spec/unit/active_attr/typecasting_spec.rb
143
182
  - spec/unit/active_attr/unknown_attribute_error_spec.rb
144
- - spec/unit/active_attr/unknown_attributes_error_spec.rb
145
183
  - spec/unit/active_attr/version_spec.rb
146
184
  homepage: https://github.com/cgriego/active_attr
147
185
  licenses: []
@@ -157,16 +195,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
157
195
  version: '0'
158
196
  segments:
159
197
  - 0
160
- hash: 3302118214315982046
198
+ hash: -4291119495453604965
161
199
  required_rubygems_version: !ruby/object:Gem::Requirement
162
200
  none: false
163
201
  requirements:
164
- - - ! '>='
202
+ - - ! '>'
165
203
  - !ruby/object:Gem::Version
166
- version: '0'
167
- segments:
168
- - 0
169
- hash: 3302118214315982046
204
+ version: 1.3.1
170
205
  requirements: []
171
206
  rubyforge_project: active_attr
172
207
  rubygems_version: 1.8.10
@@ -174,14 +209,17 @@ signing_key:
174
209
  specification_version: 3
175
210
  summary: What ActiveModel left out
176
211
  test_files:
212
+ - spec/functional/active_attr/attribute_defaults_spec.rb
177
213
  - spec/functional/active_attr/attributes_spec.rb
178
214
  - spec/functional/active_attr/chainable_initialization_spec.rb
179
215
  - spec/functional/active_attr/model_spec.rb
180
216
  - spec/functional/active_attr/query_attributes_spec.rb
217
+ - spec/functional/active_attr/typecasted_attributes_spec.rb
181
218
  - spec/spec_helper.rb
182
219
  - spec/support/active_model_lint.rb
183
220
  - spec/support/initialization_verifier.rb
184
221
  - spec/support/mass_assignment_shared_examples.rb
222
+ - spec/unit/active_attr/attribute_defaults_spec.rb
185
223
  - spec/unit/active_attr/attribute_definition_spec.rb
186
224
  - spec/unit/active_attr/attributes_spec.rb
187
225
  - spec/unit/active_attr/basic_model_spec.rb
@@ -193,8 +231,16 @@ test_files:
193
231
  - spec/unit/active_attr/mass_assignment_spec.rb
194
232
  - spec/unit/active_attr/matchers/have_attribute_matcher_spec.rb
195
233
  - spec/unit/active_attr/query_attributes_spec.rb
196
- - spec/unit/active_attr/strict_mass_assignment_spec.rb
234
+ - spec/unit/active_attr/typecasted_attributes_spec.rb
235
+ - spec/unit/active_attr/typecasting/boolean_spec.rb
236
+ - spec/unit/active_attr/typecasting/boolean_typecaster_spec.rb
237
+ - spec/unit/active_attr/typecasting/date_time_typecaster_spec.rb
238
+ - spec/unit/active_attr/typecasting/date_typecaster_spec.rb
239
+ - spec/unit/active_attr/typecasting/float_typecaster_spec.rb
240
+ - spec/unit/active_attr/typecasting/integer_typecaster_spec.rb
241
+ - spec/unit/active_attr/typecasting/object_typecaster_spec.rb
242
+ - spec/unit/active_attr/typecasting/string_typecaster_spec.rb
243
+ - spec/unit/active_attr/typecasting_spec.rb
197
244
  - spec/unit/active_attr/unknown_attribute_error_spec.rb
198
- - spec/unit/active_attr/unknown_attributes_error_spec.rb
199
245
  - spec/unit/active_attr/version_spec.rb
200
246
  has_rdoc:
@@ -1,44 +0,0 @@
1
- require "active_attr/mass_assignment"
2
- require "active_attr/unknown_attributes_error"
3
- require "active_support/concern"
4
-
5
- module ActiveAttr
6
- # StrictMassAssignment allows mass assignment of attributes, but raises an
7
- # exception when assigning unknown attributes
8
- #
9
- # Attempting to assign any unknown or private attribute through any of the
10
- # mass assignment methods ({#assign_attributes}, {#attributes=}, and
11
- # {#initialize}) will raise an {ActiveAttr::UnknownAttributesError}
12
- # exception.
13
- #
14
- # @example Usage
15
- # class Person
16
- # include ActiveAttr::StrictMassAssignment
17
- # end
18
- #
19
- # @since 0.2.0
20
- module StrictMassAssignment
21
- extend ActiveSupport::Concern
22
- include MassAssignment
23
-
24
- # Mass update a model's attributes, but raise an error if an attempt is
25
- # made to assign an unknown attribute
26
- #
27
- # @param (see MassAssignment#assign_attributes)
28
- #
29
- # @raise [ActiveAttr::UnknownAttributesError]
30
- #
31
- # @since 0.2.0
32
- def assign_attributes(new_attributes, options={})
33
- unknown_attribute_names = (new_attributes || {}).reject do |name, value|
34
- respond_to? "#{name}="
35
- end.map { |name, value| name.to_s }.sort
36
-
37
- if unknown_attribute_names.any?
38
- raise UnknownAttributesError, "unknown attribute(s): #{unknown_attribute_names.join(", ")}"
39
- else
40
- super
41
- end
42
- end
43
- end
44
- end
@@ -1,18 +0,0 @@
1
- require "active_attr/error"
2
-
3
- module ActiveAttr
4
- # This exception is raised if attempting to mass assign unknown attributes
5
- # when using {StrictMassAssignment}
6
- #
7
- # @example Rescuing an UnknownAttributesError error
8
- # begin
9
- # Person.new(attributes)
10
- # rescue ActiveAttr::UnknownAttributesError
11
- # Person.new
12
- # end
13
- #
14
- # @since 0.2.0
15
- class UnknownAttributesError < NoMethodError
16
- include Error
17
- end
18
- end
@@ -1,38 +0,0 @@
1
- require "spec_helper"
2
- require "active_attr/strict_mass_assignment"
3
-
4
- module ActiveAttr
5
- describe StrictMassAssignment, :mass_assignment do
6
- subject do
7
- model_class.class_eval do
8
- include StrictMassAssignment
9
- end
10
- end
11
-
12
- shared_examples "strict mass assignment method", :strict_mass_assignment_method => true do
13
- include_examples "mass assignment method"
14
-
15
- it "raises when assigning an unknown attribute" do
16
- expect do
17
- mass_assign_attributes(:middle_initial => "J")
18
- end.to raise_error UnknownAttributesError, "unknown attribute(s): middle_initial"
19
- end
20
-
21
- it "raises when trying to assign a private attribute" do
22
- expect do
23
- mass_assign_attributes(:middle_name => "J")
24
- end.to raise_error UnknownAttributesError, "unknown attribute(s): middle_name"
25
- end
26
-
27
- it "raises when assigning multiple unknown attributes with a message referencing both in alphabetical order" do
28
- expect do
29
- mass_assign_attributes(:middle_name => "J", :middle_initial => "J")
30
- end.to raise_error UnknownAttributesError, "unknown attribute(s): middle_initial, middle_name"
31
- end
32
- end
33
-
34
- describe "#assign_attributes", :assign_attributes, :strict_mass_assignment_method
35
- describe "#attributes=", :attributes=, :strict_mass_assignment_method
36
- describe "#initialize", :initialize, :strict_mass_assignment_method
37
- end
38
- end