active_attr 0.2.0 → 0.2.1

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.

@@ -1,4 +1,5 @@
1
1
  rvm:
2
2
  - ree
3
3
  - 1.9.2
4
+ - 1.9.3
4
5
  bundler_args: --without development
File without changes
@@ -1,3 +1,13 @@
1
+ # ActiveAttr 0.2.1 (unreleased) #
2
+
3
+ * Added AttributeDefinition#<=>
4
+ * Added AttributeDefinition#to_sym
5
+ * Added Attributes#[]
6
+ * Added Attributes#[]=
7
+ * Attributes#attributes now returns the results of overridden getters
8
+ * Attributes.inspect and Attributes#inspect are now in alphabetical order
9
+ * Overridden attribute getters and setters can now call super
10
+
1
11
  # ActiveAttr 0.2.0 (October 3, 2011) #
2
12
 
3
13
  * ActiveAttr now autoloads nested classes and modules
data/README.md CHANGED
@@ -10,7 +10,9 @@ the wheel.
10
10
  [1]: http://travis-ci.org/cgriego/active_attr
11
11
  [2]: https://secure.travis-ci.org/cgriego/active_attr.png?branch=master
12
12
 
13
- ## Attributes ##
13
+ ## Modules ##
14
+
15
+ ### Attributes ###
14
16
 
15
17
  Including the Attributes module into your class gives you a DSL for defining
16
18
  the attributes of your model.
@@ -27,7 +29,7 @@ the attributes of your model.
27
29
  p.last_name = "Griego"
28
30
  p.attributes #=> {"first_name"=>"Chris", "last_name"=>"Griego"}
29
31
 
30
- ## BasicModel ##
32
+ ### BasicModel ###
31
33
 
32
34
  Including the BasicModel module into your class gives you the bare minimum
33
35
  required for your model to meet the ActiveModel API requirements.
@@ -41,7 +43,7 @@ required for your model to meet the ActiveModel API requirements.
41
43
  p.valid? #=> true
42
44
  p.errors.full_messages #=> []
43
45
 
44
- ## MassAssignment ##
46
+ ### MassAssignment ###
45
47
 
46
48
  Including the MassAssignment module into your class gives you methods for bulk
47
49
  initializing and updating the attributes of your model. Any unknown attributes
@@ -51,9 +53,21 @@ attribute.
51
53
 
52
54
  class Person
53
55
  include ActiveAttr::MassAssignment
56
+ attr_accessor :first_name, :last_name
54
57
  end
55
58
 
56
59
  p = Person.new(:first_name => "Chris")
57
60
  p.attributes = { :last_name => "Griego" }
58
61
  p.first_name #=> "Chris"
59
62
  p.last_name #=> "Griego"
63
+
64
+ ## RSpec Integration ##
65
+
66
+ ActiveAttr comes with matchers and RSpec integration to assist you in testing
67
+ your models.
68
+
69
+ require "active_attr/rspec"
70
+
71
+ describe Person do
72
+ it { should have_attribute(:first_name) }
73
+ end
@@ -6,23 +6,25 @@ module ActiveAttr
6
6
  #
7
7
  # @since 0.2.0
8
8
  class AttributeDefinition
9
+ include Comparable
10
+
9
11
  # The attribute name
10
12
  # @since 0.2.0
11
13
  attr_reader :name
12
14
 
13
- # Performs equality checking of the attribute definition
15
+ # Compare attribute definitions
14
16
  #
15
- # @example Compare for equality.
16
- # attribute_definition == other
17
+ # @example
18
+ # attribute_definition <=> other
17
19
  #
18
- # @param [AttributeDefinition, Object] other The other attribute definition to compare with.
20
+ # @param [ActiveAttr::AttributeDefinition, Object] other The other attribute definition to compare with.
19
21
  #
20
- # @return [true, false] True if attribute name is equal and other is instance of the same Class, false if not.
22
+ # @return [-1, 0, 1, nil]
21
23
  #
22
- # @since 0.2.0
23
- def ==(attribute)
24
- return false unless attribute.instance_of? self.class
25
- name == attribute.name
24
+ # @since 0.2.1
25
+ def <=>(other)
26
+ return nil unless other.instance_of? self.class
27
+ self.name.to_s <=> other.name.to_s
26
28
  end
27
29
 
28
30
  # Creates a new AttributeDefinition
@@ -32,7 +34,7 @@ module ActiveAttr
32
34
  #
33
35
  # @param [Symbol, String, #to_sym] attribute name
34
36
  #
35
- # @return [AttributeDefinition]
37
+ # @return [ActiveAttr::AttributeDefinition]
36
38
  #
37
39
  # @since 0.2.0
38
40
  def initialize(name, options={})
@@ -40,7 +42,7 @@ module ActiveAttr
40
42
  @name = name.to_sym
41
43
  end
42
44
 
43
- # Returns the attribute name
45
+ # The attribute name
44
46
  #
45
47
  # @return [String] the attribute name
46
48
  #
@@ -48,5 +50,15 @@ module ActiveAttr
48
50
  def to_s
49
51
  name.to_s
50
52
  end
53
+ alias_method :inspect, :to_s
54
+
55
+ # The attribute name
56
+ #
57
+ # @return [Symbol] the attribute name
58
+ #
59
+ # @since 0.2.1
60
+ def to_sym
61
+ name
62
+ end
51
63
  end
52
64
  end
@@ -1,4 +1,5 @@
1
1
  require "active_attr/attribute_definition"
2
+ require "active_model"
2
3
  require "active_support/concern"
3
4
 
4
5
  module ActiveAttr
@@ -17,13 +18,19 @@ module ActiveAttr
17
18
  # @since 0.2.0
18
19
  module Attributes
19
20
  extend ActiveSupport::Concern
21
+ include ActiveModel::AttributeMethods
22
+
23
+ included do
24
+ attribute_method_suffix ""
25
+ attribute_method_suffix "="
26
+ end
20
27
 
21
28
  # Performs equality checking on the result of attributes and its type.
22
29
  #
23
30
  # @example Compare for equality.
24
31
  # model == other
25
32
  #
26
- # @param [Attributes, Object] other The other model to compare with.
33
+ # @param [ActiveAttr::Attributes, Object] other The other model to compare with.
27
34
  #
28
35
  # @return [true, false] True if attributes are equal and other is instance of the same Class, false if not.
29
36
  #
@@ -38,10 +45,16 @@ module ActiveAttr
38
45
  # @example Get attributes
39
46
  # person.attributes # => {"name"=>"Ben Poweski"}
40
47
  #
41
- # @return [Hash] The Hash of attributes
48
+ # @return [Hash] The Hash of all attributes
42
49
  #
43
50
  # @since 0.2.0
44
51
  def attributes
52
+ attribute_names = self.class.attributes.map { |definition| definition.name.to_s }
53
+ Hash[attribute_names.map { |key| [key, send(key)] }]
54
+ end
55
+
56
+ # @since 0.2.1
57
+ def initialize(*args)
45
58
  @attributes ||= {}
46
59
  end
47
60
 
@@ -54,11 +67,13 @@ module ActiveAttr
54
67
  #
55
68
  # @since 0.2.0
56
69
  def inspect
57
- attribute_descriptions = self.class.attributes.map do |attribute|
70
+ attribute_descriptions = self.class.attributes.sort.map do |attribute|
58
71
  "#{attribute.name.to_s}: #{read_attribute(attribute.name).inspect}"
59
- end
72
+ end.join(", ")
73
+
74
+ attribute_descriptions = " " + attribute_descriptions unless attribute_descriptions.empty?
60
75
 
61
- "#<#{self.class.name} #{attribute_descriptions.join(", ")}>"
76
+ "#<#{self.class.name}#{attribute_descriptions}>"
62
77
  end
63
78
 
64
79
  # Read a value from the model's attributes. If the value does not exist
@@ -73,8 +88,11 @@ module ActiveAttr
73
88
  #
74
89
  # @since 0.2.0
75
90
  def read_attribute(name)
76
- attributes[name.to_s]
91
+ @attributes[name.to_s]
77
92
  end
93
+ alias_method :[], :read_attribute
94
+ alias_method :attribute, :read_attribute
95
+ private :attribute
78
96
 
79
97
  # Write a single attribute to the model's attribute hash.
80
98
  #
@@ -86,8 +104,11 @@ module ActiveAttr
86
104
  #
87
105
  # @since 0.2.0
88
106
  def write_attribute(name, value)
89
- attributes[name.to_s] = value
107
+ @attributes[name.to_s] = value
90
108
  end
109
+ alias_method :[]=, :write_attribute
110
+ alias_method :attribute=, :write_attribute
111
+ private :attribute=
91
112
 
92
113
  module ClassMethods
93
114
  # Defines all the attributes that are to be returned from the attributes instance method.
@@ -102,12 +123,10 @@ module ActiveAttr
102
123
  #
103
124
  # @since 0.2.0
104
125
  def attribute(name, options={})
105
- attribute_definition = AttributeDefinition.new(name, options)
106
- attributes << attribute_definition
107
- method_name = attribute_definition.name
108
-
109
- define_method("#{method_name}=") { |value| write_attribute(name, value) }
110
- define_method(method_name) { read_attribute(name) }
126
+ AttributeDefinition.new(name, options).tap do |attribute_definition|
127
+ attributes << attribute_definition
128
+ define_attribute_method attribute_definition.name
129
+ end
111
130
  end
112
131
 
113
132
  # Returns an Array of AttributeDefinition instances
@@ -115,7 +134,7 @@ module ActiveAttr
115
134
  # @example Get attribute definitions
116
135
  # Person.attributes
117
136
  #
118
- # @return [Array<AttributeDefinition>] The Array of AttributeDefinition instances
137
+ # @return [Array<ActiveAttr::AttributeDefinition>] The Array of AttributeDefinition instances
119
138
  #
120
139
  # @since 0.2.0
121
140
  def attributes
@@ -131,7 +150,9 @@ module ActiveAttr
131
150
  #
132
151
  # @since 0.2.0
133
152
  def inspect
134
- "#{self.name}(#{attributes.map { |a| a.to_s }.join(", ")})"
153
+ inspected_attributes = attributes.sort.map { |attr| attr.inspect }
154
+ attributes_list = "(#{inspected_attributes.join(", ")})" unless inspected_attributes.empty?
155
+ "#{self.name}#{attributes_list}"
135
156
  end
136
157
  end
137
158
  end
@@ -9,7 +9,7 @@ module ActiveAttr
9
9
  #
10
10
  # @param [Symbol, String, #to_sym] attribute_name
11
11
  #
12
- # @return [HaveAttributeMatcher]
12
+ # @return [ActiveAttr::HaveAttributeMatcher]
13
13
  #
14
14
  # @since 0.2.0
15
15
  def have_attribute(attribute_name)
@@ -1,5 +1,5 @@
1
1
  module ActiveAttr
2
2
  # Complete version string
3
3
  # @since 0.1.0
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.1"
5
5
  end
@@ -5,6 +5,24 @@ module ActiveAttr
5
5
  describe AttributeDefinition do
6
6
  subject { described_class.new(:amount) }
7
7
 
8
+ describe "#<=>" do
9
+ it "is nil if the right side is not an #{described_class}" do
10
+ (subject <=> nil).should be_nil
11
+ end
12
+
13
+ it "prefers neither when both sides use the same attribute name" do
14
+ (subject <=> subject).should == 0
15
+ end
16
+
17
+ it "prefers the left side when the left side name sorts alphabetically before the right side name" do
18
+ (described_class.new(:amount) <=> described_class.new(:quantity)).should == -1
19
+ end
20
+
21
+ it "prefers the right side when the right side name sorts alphabetically before the left side name" do
22
+ (described_class.new(:quantity) <=> described_class.new(:amount)).should == 1
23
+ end
24
+ end
25
+
8
26
  describe "#==" do
9
27
  it "returns true when the attribute name is equal" do
10
28
  described_class.new(:amount).should == described_class.new(:amount)
@@ -33,13 +51,25 @@ module ActiveAttr
33
51
  end
34
52
  end
35
53
 
54
+ describe "#inspect" do
55
+ it "renders the name" do
56
+ subject.inspect.should == "amount"
57
+ end
58
+ end
59
+
36
60
  describe "#name" do
37
61
  it { should respond_to(:name) }
38
62
  end
39
63
 
40
64
  describe "#to_s" do
41
- it "renders the name" do
42
- subject.to_s.should == subject.name.to_s
65
+ it "renders the name as a String" do
66
+ subject.to_s.should == "amount"
67
+ end
68
+ end
69
+
70
+ describe "#to_sym" do
71
+ it "renders the name as a Symbol" do
72
+ subject.to_sym.should == :amount
43
73
  end
44
74
  end
45
75
  end
@@ -3,18 +3,36 @@ require "active_attr/attributes"
3
3
 
4
4
  module ActiveAttr
5
5
  describe Attributes do
6
- let(:model_class) do
6
+ subject { model_class.new }
7
+
8
+ let :model_class do
7
9
  Class.new do
8
10
  include Attributes
9
11
  attribute :name
12
+ attribute :amount
13
+
14
+ def self.name
15
+ "Foo"
16
+ end
17
+
18
+ def amount
19
+ super
20
+ end
21
+
22
+ def amount=(*args)
23
+ super
24
+ end
25
+
26
+ def initialize(name=nil)
27
+ super
28
+ write_attribute(:name, name)
29
+ end
10
30
  end
11
31
  end
12
32
 
13
- subject do
33
+ let :attributeless do
14
34
  Class.new do
15
35
  include Attributes
16
- attribute :name
17
- attribute :amount
18
36
 
19
37
  def self.name
20
38
  "Foo"
@@ -23,59 +41,58 @@ module ActiveAttr
23
41
  end
24
42
 
25
43
  describe ".attribute" do
26
- let(:instance) { subject.new }
27
-
28
44
  it "creates an attribute with no options" do
29
- subject.attributes.should include(AttributeDefinition.new(:name))
45
+ model_class.attributes.should include(AttributeDefinition.new(:name))
30
46
  end
31
47
 
32
- it "defined an attribute reader that calls #read_attribute" do
33
- instance.should_receive(:read_attribute).with(:name)
34
- instance.name
48
+ it "returns the attribute definition" do
49
+ Class.new(model_class).attribute(:address).should == AttributeDefinition.new(:address)
35
50
  end
36
51
 
37
- it "defines an attribute writer method that calls #write_attribute" do
38
- instance.should_receive(:write_attribute).with(:name, "Ben")
39
- instance.name = "Ben"
52
+ it "defines an attribute reader that calls #attribute" do
53
+ subject.should_receive(:attribute).with("name")
54
+ subject.name
55
+ end
56
+
57
+ it "defines an attribute reader that can be called via super" do
58
+ subject.should_receive(:attribute).with("amount")
59
+ subject.amount
60
+ end
61
+
62
+ it "defines an attribute writer that calls #attribute=" do
63
+ subject.should_receive(:attribute=).with("name", "Ben")
64
+ subject.name = "Ben"
65
+ end
66
+
67
+ it "defines an attribute writer that can be called via super" do
68
+ subject.should_receive(:attribute=).with("amount", 1)
69
+ subject.amount = 1
40
70
  end
41
71
  end
42
72
 
43
73
  describe ".attributes" do
44
- it { should respond_to(:attributes) }
74
+ it { model_class.should respond_to(:attributes) }
45
75
 
46
76
  context "when no attributes exist" do
47
- subject do
48
- Class.new { include Attributes }.attributes
49
- end
50
-
51
- it "returns an empty Array" do
52
- should == []
53
- end
77
+ it { attributeless.attributes.should be_empty }
54
78
  end
55
79
  end
56
80
 
57
81
  describe ".inspect" do
58
82
  it "renders the class name" do
59
- subject.inspect.should match "Foo"
83
+ model_class.inspect.should match /^Foo\(.*\)$/
60
84
  end
61
85
 
62
- it "renders the attribute name and type" do
63
- subject.inspect.should match subject.attributes.map { |a| a.name }.join(", ")
86
+ it "renders the attribute names in alphabetical order" do
87
+ model_class.inspect.should match "(amount, name)"
64
88
  end
65
- end
66
-
67
- describe "#==" do
68
- let(:model_class) do
69
- Class.new do
70
- include Attributes
71
- attribute :name
72
89
 
73
- def initialize(name)
74
- write_attribute(:name, name)
75
- end
76
- end
90
+ it "doesn't format the inspection string for attributes if the model does not have any" do
91
+ attributeless.inspect.should == "Foo"
77
92
  end
93
+ end
78
94
 
95
+ describe "#==" do
79
96
  subject { model_class.new("Ben") }
80
97
 
81
98
  it "returns true when all attributes are equal" do
@@ -89,52 +106,96 @@ module ActiveAttr
89
106
 
90
107
  describe "#attributes" do
91
108
  context "when no attributes are defined" do
92
- subject { Class.new { include Attributes } }
93
-
94
109
  it "returns an empty Hash" do
95
- subject.new.attributes.should == {}
110
+ attributeless.new.attributes.should == {}
96
111
  end
97
112
  end
98
- end
99
113
 
100
- describe "#inspect" do
101
- let(:instance) { subject.new.tap { |obj| obj.name = "Ben" } }
114
+ context "when an attribute is defined" do
115
+ it "returns the key value pairs" do
116
+ subject.name = "Ben"
117
+ subject.attributes.should include("name" => "Ben")
118
+ end
119
+
120
+ it "returns a new Hash " do
121
+ subject.attributes.merge!("name" => "Bob")
122
+ subject.attributes.should_not include("name" => "Bob")
123
+ end
102
124
 
103
- it "includes the class name and all attribute values" do
104
- instance.inspect.should == %q{#<Foo name: "Ben", amount: nil>}
125
+ it "returns all attributes" do
126
+ subject.attributes.keys.should =~ %w(amount name)
127
+ end
128
+ end
129
+
130
+ context "when a getter is overridden" do
131
+ before do
132
+ subject.extend Module.new {
133
+ def name
134
+ "Benjamin"
135
+ end
136
+ }
137
+ end
138
+
139
+ it "uses the overridden implementation" do
140
+ subject.name = "Ben"
141
+ subject.attributes.should include("name" => "Benjamin")
142
+ end
105
143
  end
106
144
  end
107
145
 
108
- describe "#read_attribute" do
109
- let(:name) { "Bob" }
110
- subject { model_class.new.tap { |s| s.write_attribute(:name, name) } }
146
+ describe "#inspect" do
147
+ before { subject.name = "Ben" }
111
148
 
112
- it "returns the attribute using a Symbol" do
113
- subject.read_attribute(:name).should == name
149
+ it "includes the class name and all attribute values in alphabetical order by attribute name" do
150
+ subject.inspect.should == %q{#<Foo amount: nil, name: "Ben">}
114
151
  end
115
152
 
116
- it "returns the attribute using a String" do
117
- subject.read_attribute('name').should == name
153
+ it "doesn't format the inspection string for attributes if the model does not have any" do
154
+ attributeless.new.inspect.should == %q{#<Foo>}
118
155
  end
119
156
  end
120
157
 
121
- describe "#write_attribute" do
122
- subject { model_class.new }
158
+ [:[], :read_attribute].each do |method|
159
+ describe "##{method}" do
160
+ context "when an attribute is not set" do
161
+ it "returns nil" do
162
+ subject.send(method, :name).should == nil
163
+ end
164
+ end
165
+
166
+ context "when an attribute is set" do
167
+ let(:name) { "Bob" }
123
168
 
124
- it "raises ArgumentError with one argument" do
125
- expect { subject.write_attribute(:name) }.to raise_error(ArgumentError)
126
- end
169
+ before { subject.write_attribute(:name, name) }
127
170
 
128
- it "raises ArgumentError with no arguments" do
129
- expect { subject.write_attribute }.to raise_error(ArgumentError)
130
- end
171
+ it "returns the attribute using a Symbol" do
172
+ subject.send(method, :name).should == name
173
+ end
131
174
 
132
- it "assigns sets an attribute using a Symbol and value" do
133
- expect { subject.write_attribute(:name, "Ben") }.to change(subject, :attributes).from({}).to("name" => "Ben")
175
+ it "returns the attribute using a String" do
176
+ subject.send(method, 'name').should == name
177
+ end
178
+ end
134
179
  end
180
+ end
135
181
 
136
- it "assigns sets an attribute using a String and value" do
137
- expect { subject.write_attribute('name', "Ben") }.to change(subject, :attributes).from({}).to("name" => "Ben")
182
+ [:[]=, :write_attribute].each do |method|
183
+ describe "##{method}" do
184
+ it "raises ArgumentError with one argument" do
185
+ expect { subject.send(method, :name) }.to raise_error(ArgumentError)
186
+ end
187
+
188
+ it "raises ArgumentError with no arguments" do
189
+ expect { subject.send(method) }.to raise_error(ArgumentError)
190
+ end
191
+
192
+ it "assigns sets an attribute using a Symbol and value" do
193
+ expect { subject.send(method, :name, "Ben") }.to change { subject.attributes["name"] }.from(nil).to("Ben")
194
+ end
195
+
196
+ it "assigns sets an attribute using a String and value" do
197
+ expect { subject.send(method, 'name', "Ben") }.to change { subject.attributes["name"] }.from(nil).to("Ben")
198
+ end
138
199
  end
139
200
  end
140
201
  end
@@ -3,7 +3,7 @@ require "active_attr/basic_model"
3
3
 
4
4
  module ActiveAttr
5
5
  describe BasicModel do
6
- let(:model_class) do
6
+ let :model_class do
7
7
  Class.new do
8
8
  include BasicModel
9
9
 
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.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,12 +10,12 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-10-03 00:00:00.000000000 -05:00
13
+ date: 2011-10-19 00:00:00.000000000 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activemodel
18
- requirement: &70212822508240 !ruby/object:Gem::Requirement
18
+ requirement: &70255008815760 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ~>
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '3.1'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70212822508240
26
+ version_requirements: *70255008815760
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
- requirement: &70212822507140 !ruby/object:Gem::Requirement
29
+ requirement: &70255008814840 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ~>
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: '3.1'
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *70212822507140
37
+ version_requirements: *70255008814840
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: bundler
40
- requirement: &70212822506320 !ruby/object:Gem::Requirement
40
+ requirement: &70255008813600 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ~>
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: '1.0'
46
46
  type: :development
47
47
  prerelease: false
48
- version_requirements: *70212822506320
48
+ version_requirements: *70255008813600
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rake
51
- requirement: &70212822505480 !ruby/object:Gem::Requirement
51
+ requirement: &70255008812200 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ~>
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: 0.9.0
57
57
  type: :development
58
58
  prerelease: false
59
- version_requirements: *70212822505480
59
+ version_requirements: *70255008812200
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: rspec
62
- requirement: &70212822504100 !ruby/object:Gem::Requirement
62
+ requirement: &70255008809320 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ~>
@@ -67,7 +67,7 @@ dependencies:
67
67
  version: '2.6'
68
68
  type: :development
69
69
  prerelease: false
70
- version_requirements: *70212822504100
70
+ version_requirements: *70255008809320
71
71
  description: Create plain old ruby models without reinventing the wheel.
72
72
  email:
73
73
  - cgriego@gmail.com
@@ -76,11 +76,11 @@ executables: []
76
76
  extensions: []
77
77
  extra_rdoc_files: []
78
78
  files:
79
- - .document
80
79
  - .gitignore
81
80
  - .rspec
82
81
  - .rvmrc
83
82
  - .travis.yml
83
+ - .yardopts
84
84
  - CHANGELOG.md
85
85
  - Gemfile
86
86
  - Guardfile
@@ -127,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
127
127
  version: '0'
128
128
  segments:
129
129
  - 0
130
- hash: 4452087611638543141
130
+ hash: -3746970680425630982
131
131
  required_rubygems_version: !ruby/object:Gem::Requirement
132
132
  none: false
133
133
  requirements:
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  version: '0'
137
137
  segments:
138
138
  - 0
139
- hash: 4452087611638543141
139
+ hash: -3746970680425630982
140
140
  requirements: []
141
141
  rubyforge_project: active_attr
142
142
  rubygems_version: 1.5.2