active_attr 0.1.0 → 0.2.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.

Potentially problematic release.


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

@@ -0,0 +1,103 @@
1
+ require "spec_helper"
2
+ require "active_attr/attributes"
3
+ require "active_attr/matchers/have_attribute_matcher"
4
+
5
+ module ActiveAttr
6
+ describe Matchers do
7
+ let(:dsl) { Object.new.extend described_class }
8
+ subject { dsl }
9
+
10
+ it { should respond_to(:have_attribute).with(1).argument }
11
+
12
+ describe "#have_attribute" do
13
+ subject { dsl.have_attribute(:name) }
14
+
15
+ it "builds a HaveAttributeMatcher with the given attribute name" do
16
+ should be_a_kind_of Matchers::HaveAttributeMatcher
17
+ end
18
+
19
+ it "uses the given attribute name to construct the matcher" do
20
+ subject.attribute_name.should == :name
21
+ end
22
+ end
23
+ end
24
+
25
+ module Matchers
26
+ describe HaveAttributeMatcher do
27
+ let :model_class do
28
+ Class.new do
29
+ include Attributes
30
+ attribute :name
31
+
32
+ def self.to_s
33
+ "Person"
34
+ end
35
+ end
36
+ end
37
+
38
+ subject { positive_matcher }
39
+ let(:positive_matcher) { described_class.new(:name) }
40
+ let(:negative_matcher) { described_class.new(:age) }
41
+
42
+ it { described_class.should respond_to(:new).with(1).argument }
43
+
44
+ describe "#attribute_name" do
45
+ it "returns the value used to initialize the matcher" do
46
+ subject.attribute_name.should == :name
47
+ end
48
+
49
+ it "converts the value used to initialize the matcher to a symbol" do
50
+ described_class.new('name').attribute_name.should == :name
51
+ end
52
+ end
53
+
54
+ describe "#description" do
55
+ it "returns a description appropriate to the expectation" do
56
+ subject.description.should == "have attribute named name"
57
+ end
58
+ end
59
+
60
+ describe "#failure_message" do
61
+ it "returns a failure message appropriate to the expectation and subject" do
62
+ negative_matcher.tap do |matcher|
63
+ matcher.matches? model_class
64
+ end.failure_message.should == "Expected Person to have attribute named age"
65
+ end
66
+ end
67
+
68
+ describe "#initialize" do
69
+ it "raises a TypeError when the attribute name does not respond to #to_sym" do
70
+ expect { described_class.new(Object.new) }.to raise_error(TypeError, "can't convert Object into Symbol")
71
+ end
72
+ end
73
+
74
+ describe "#matches?" do
75
+ let(:model_instance) { model_class.new }
76
+
77
+ it "is true with an instance of a model class that has the attribute" do
78
+ positive_matcher.matches?(model_instance).should be_true
79
+ end
80
+
81
+ it "is true with a model class that has the attribute" do
82
+ positive_matcher.matches?(model_class).should be_true
83
+ end
84
+
85
+ it "is false with an instance of a model class that does not have the attribute" do
86
+ negative_matcher.matches?(model_instance).should be_false
87
+ end
88
+
89
+ it "is false with a model class that does not have the attribute" do
90
+ negative_matcher.matches?(model_class).should be_false
91
+ end
92
+ end
93
+
94
+ describe "#negative_failure_message" do
95
+ it "returns a failure message appropriate to the expectation and subject" do
96
+ positive_matcher.tap do |matcher|
97
+ matcher.matches? model_class
98
+ end.negative_failure_message.should == "Expected Person to not have attribute named name"
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,38 @@
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
@@ -0,0 +1,9 @@
1
+ require "spec_helper"
2
+ require "active_attr/unknown_attributes_error"
3
+
4
+ module ActiveAttr
5
+ describe UnknownAttributesError do
6
+ it { should be_a_kind_of NoMethodError }
7
+ it { should be_a_kind_of Error }
8
+ end
9
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+ require "active_attr/version"
3
+
4
+ module ActiveAttr
5
+ describe "ActiveAttr::VERSION" do
6
+ subject { VERSION }
7
+
8
+ it { should be_a_kind_of String }
9
+
10
+ describe "is compliant with Semantic Versioning <http://semver.org/>" do
11
+ let(:gem_version) { Gem::Version.new VERSION }
12
+ subject { gem_version }
13
+
14
+ it { subject.should have(3).segments }
15
+
16
+ describe "major version" do
17
+ subject { gem_version.segments[0] }
18
+
19
+ it { should be_a_kind_of Fixnum }
20
+ end
21
+
22
+ describe "minor version" do
23
+ subject { gem_version.segments[1] }
24
+
25
+ it { should be_a_kind_of Fixnum }
26
+ end
27
+
28
+ describe "patch version" do
29
+ subject { gem_version.segments[2] }
30
+
31
+ it { subject.to_s.should =~ /\d+([A-Za-z][0-9A-Za-z-]*)?/ }
32
+ end
33
+ end
34
+ end
35
+ end
data/spec/spec_helper.rb CHANGED
@@ -7,4 +7,5 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |file| require file }
7
7
 
8
8
  RSpec.configure do |config|
9
9
  config.mock_framework = :rspec
10
+ config.treat_symbols_as_metadata_keys_with_true_values = true # default in RSpec 3
10
11
  end
@@ -8,7 +8,7 @@ shared_examples_for "ActiveModel" do
8
8
  before { @model = subject }
9
9
 
10
10
  ActiveModel::Lint::Tests.public_instance_methods.map(&:to_s).grep(/^test/).each do |test|
11
- example test.gsub('_',' ') do
11
+ example test.gsub("_", " ") do
12
12
  send test
13
13
  end
14
14
  end
@@ -0,0 +1,95 @@
1
+ shared_examples "mass assignment class", :mass_assignment => true do
2
+ let :model_class do
3
+ Class.new do
4
+ attr_accessor :first_name, :last_name, :middle_name
5
+ private :middle_name=
6
+
7
+ def name=(name)
8
+ self.last_name, self.first_name = name.split(nil, 2).reverse
9
+ end
10
+ end
11
+ end
12
+
13
+ let(:person) { subject.new }
14
+ let(:first_name) { "Chris" }
15
+ let(:last_name) { "Griego" }
16
+
17
+ def should_assign_names_to(person)
18
+ person.first_name.should == first_name
19
+ person.last_name.should == last_name
20
+ end
21
+ end
22
+
23
+ shared_examples "mass assignment method" do
24
+ it "does not raise when assigning nil attributes" do
25
+ expect { mass_assign_attributes nil }.not_to raise_error
26
+ end
27
+
28
+ it "assigns all valid attributes when passed as a hash with string keys" do
29
+ should_assign_names_to mass_assign_attributes('first_name' => first_name, 'last_name' => last_name)
30
+ end
31
+
32
+ it "assigns all valid attributes when passed as a hash with symbol keys" do
33
+ should_assign_names_to mass_assign_attributes(:first_name => first_name, :last_name => last_name)
34
+ end
35
+
36
+ it "uses any available writer methods" do
37
+ should_assign_names_to mass_assign_attributes(:name => "#{first_name} #{last_name}")
38
+ end
39
+ end
40
+
41
+ shared_examples "#assign_attribures", :assign_attributes => true do
42
+ def mass_assign_attributes(attributes)
43
+ person.assign_attributes attributes
44
+ person
45
+ end
46
+
47
+ it "raises ArgumentError when called with three arguments" do
48
+ expect { subject.new.assign_attributes({}, {}, nil) }.to raise_error ArgumentError
49
+ end
50
+
51
+ it "does not raise when called with two arguments" do
52
+ expect { subject.new.assign_attributes({}, {}) }.not_to raise_error
53
+ end
54
+
55
+ it "does not raise when called with a single argument" do
56
+ expect { subject.new.assign_attributes({}) }.not_to raise_error
57
+ end
58
+
59
+ it "raises ArgumentError when called with no arguments" do
60
+ expect { subject.new.assign_attributes }.to raise_error ArgumentError
61
+ end
62
+ end
63
+
64
+ shared_examples "#attributes=", :attributes= => true do
65
+ def mass_assign_attributes(attributes)
66
+ person.attributes = attributes
67
+ person
68
+ end
69
+
70
+ it "raises ArgumentError when called with two arguments" do
71
+ expect { person.send(:attributes=, {}, {}) }.to raise_error ArgumentError
72
+ end
73
+ end
74
+
75
+ shared_examples "#initialize", :initialize => true do
76
+ def mass_assign_attributes(attributes)
77
+ subject.new(attributes)
78
+ end
79
+
80
+ it "raises ArgumentError when called with three arguments" do
81
+ expect { subject.new({}, {}, nil) }.to raise_error ArgumentError
82
+ end
83
+
84
+ it "does not raise when called with two arguments" do
85
+ expect { subject.new({}, {}) }.not_to raise_error
86
+ end
87
+
88
+ it "does not raise when called with a single argument" do
89
+ expect { subject.new({}) }.not_to raise_error
90
+ end
91
+
92
+ it "does not raise when called with no arguments" do
93
+ expect { subject.new }.not_to raise_error
94
+ end
95
+ end
metadata CHANGED
@@ -1,20 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_attr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Chris Griego
9
+ - Ben Poweski
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2011-09-30 00:00:00.000000000 -05:00
13
+ date: 2011-10-03 00:00:00.000000000 -05:00
13
14
  default_executable:
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: activemodel
17
- requirement: &70301304935460 !ruby/object:Gem::Requirement
18
+ requirement: &70212822508240 !ruby/object:Gem::Requirement
18
19
  none: false
19
20
  requirements:
20
21
  - - ~>
@@ -22,10 +23,10 @@ dependencies:
22
23
  version: '3.1'
23
24
  type: :runtime
24
25
  prerelease: false
25
- version_requirements: *70301304935460
26
+ version_requirements: *70212822508240
26
27
  - !ruby/object:Gem::Dependency
27
28
  name: activesupport
28
- requirement: &70301304934380 !ruby/object:Gem::Requirement
29
+ requirement: &70212822507140 !ruby/object:Gem::Requirement
29
30
  none: false
30
31
  requirements:
31
32
  - - ~>
@@ -33,10 +34,10 @@ dependencies:
33
34
  version: '3.1'
34
35
  type: :runtime
35
36
  prerelease: false
36
- version_requirements: *70301304934380
37
+ version_requirements: *70212822507140
37
38
  - !ruby/object:Gem::Dependency
38
39
  name: bundler
39
- requirement: &70301304933700 !ruby/object:Gem::Requirement
40
+ requirement: &70212822506320 !ruby/object:Gem::Requirement
40
41
  none: false
41
42
  requirements:
42
43
  - - ~>
@@ -44,10 +45,10 @@ dependencies:
44
45
  version: '1.0'
45
46
  type: :development
46
47
  prerelease: false
47
- version_requirements: *70301304933700
48
+ version_requirements: *70212822506320
48
49
  - !ruby/object:Gem::Dependency
49
50
  name: rake
50
- requirement: &70301304932520 !ruby/object:Gem::Requirement
51
+ requirement: &70212822505480 !ruby/object:Gem::Requirement
51
52
  none: false
52
53
  requirements:
53
54
  - - ~>
@@ -55,10 +56,10 @@ dependencies:
55
56
  version: 0.9.0
56
57
  type: :development
57
58
  prerelease: false
58
- version_requirements: *70301304932520
59
+ version_requirements: *70212822505480
59
60
  - !ruby/object:Gem::Dependency
60
61
  name: rspec
61
- requirement: &70301304931300 !ruby/object:Gem::Requirement
62
+ requirement: &70212822504100 !ruby/object:Gem::Requirement
62
63
  none: false
63
64
  requirements:
64
65
  - - ~>
@@ -66,14 +67,16 @@ dependencies:
66
67
  version: '2.6'
67
68
  type: :development
68
69
  prerelease: false
69
- version_requirements: *70301304931300
70
+ version_requirements: *70212822504100
70
71
  description: Create plain old ruby models without reinventing the wheel.
71
72
  email:
72
73
  - cgriego@gmail.com
74
+ - bpoweski@gmail.com
73
75
  executables: []
74
76
  extensions: []
75
77
  extra_rdoc_files: []
76
78
  files:
79
+ - .document
77
80
  - .gitignore
78
81
  - .rspec
79
82
  - .rvmrc
@@ -86,11 +89,29 @@ files:
86
89
  - Rakefile
87
90
  - active_attr.gemspec
88
91
  - lib/active_attr.rb
92
+ - lib/active_attr/attribute_definition.rb
93
+ - lib/active_attr/attributes.rb
94
+ - lib/active_attr/basic_model.rb
95
+ - lib/active_attr/error.rb
89
96
  - lib/active_attr/mass_assignment.rb
97
+ - lib/active_attr/matchers.rb
98
+ - lib/active_attr/matchers/have_attribute_matcher.rb
99
+ - lib/active_attr/rspec.rb
100
+ - lib/active_attr/strict_mass_assignment.rb
101
+ - lib/active_attr/unknown_attributes_error.rb
90
102
  - lib/active_attr/version.rb
103
+ - spec/active_attr/attribute_definition_spec.rb
104
+ - spec/active_attr/attributes_spec.rb
105
+ - spec/active_attr/basic_model_spec.rb
106
+ - spec/active_attr/error_spec.rb
91
107
  - spec/active_attr/mass_assignment_spec.rb
108
+ - spec/active_attr/matchers/have_attribute_matcher_spec.rb
109
+ - spec/active_attr/strict_mass_assignment_spec.rb
110
+ - spec/active_attr/unknown_attributes_error_spec.rb
111
+ - spec/active_attr/version_spec.rb
92
112
  - spec/spec_helper.rb
93
113
  - spec/support/active_model_lint.rb
114
+ - spec/support/mass_assignment_shared_examples.rb
94
115
  has_rdoc: true
95
116
  homepage: https://github.com/cgriego/active_attr
96
117
  licenses: []
@@ -106,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
127
  version: '0'
107
128
  segments:
108
129
  - 0
109
- hash: -2511944466975604265
130
+ hash: 4452087611638543141
110
131
  required_rubygems_version: !ruby/object:Gem::Requirement
111
132
  none: false
112
133
  requirements:
@@ -115,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
136
  version: '0'
116
137
  segments:
117
138
  - 0
118
- hash: -2511944466975604265
139
+ hash: 4452087611638543141
119
140
  requirements: []
120
141
  rubyforge_project: active_attr
121
142
  rubygems_version: 1.5.2
@@ -123,6 +144,15 @@ signing_key:
123
144
  specification_version: 3
124
145
  summary: What ActiveModel left out
125
146
  test_files:
147
+ - spec/active_attr/attribute_definition_spec.rb
148
+ - spec/active_attr/attributes_spec.rb
149
+ - spec/active_attr/basic_model_spec.rb
150
+ - spec/active_attr/error_spec.rb
126
151
  - spec/active_attr/mass_assignment_spec.rb
152
+ - spec/active_attr/matchers/have_attribute_matcher_spec.rb
153
+ - spec/active_attr/strict_mass_assignment_spec.rb
154
+ - spec/active_attr/unknown_attributes_error_spec.rb
155
+ - spec/active_attr/version_spec.rb
127
156
  - spec/spec_helper.rb
128
157
  - spec/support/active_model_lint.rb
158
+ - spec/support/mass_assignment_shared_examples.rb