active_attr 0.4.1 → 0.5.0.alpha1

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.

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