active_attr 0.2.0 → 0.2.1
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.
- data/.travis.yml +1 -0
- data/{.document → .yardopts} +0 -0
- data/CHANGELOG.md +10 -0
- data/README.md +17 -3
- data/lib/active_attr/attribute_definition.rb +23 -11
- data/lib/active_attr/attributes.rb +36 -15
- data/lib/active_attr/matchers/have_attribute_matcher.rb +1 -1
- data/lib/active_attr/version.rb +1 -1
- data/spec/active_attr/attribute_definition_spec.rb +32 -2
- data/spec/active_attr/attributes_spec.rb +123 -62
- data/spec/active_attr/basic_model_spec.rb +1 -1
- metadata +15 -15
data/.travis.yml
CHANGED
data/{.document → .yardopts}
RENAMED
File without changes
|
data/CHANGELOG.md
CHANGED
@@ -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
|
-
##
|
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
|
-
|
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
|
-
|
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
|
-
#
|
15
|
+
# Compare attribute definitions
|
14
16
|
#
|
15
|
-
# @example
|
16
|
-
# attribute_definition
|
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 [
|
22
|
+
# @return [-1, 0, 1, nil]
|
21
23
|
#
|
22
|
-
# @since 0.2.
|
23
|
-
def
|
24
|
-
return
|
25
|
-
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
|
-
#
|
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}
|
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
|
-
|
106
|
-
|
107
|
-
|
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
|
-
|
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
|
data/lib/active_attr/version.rb
CHANGED
@@ -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 ==
|
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
|
-
|
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
|
-
|
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
|
-
|
45
|
+
model_class.attributes.should include(AttributeDefinition.new(:name))
|
30
46
|
end
|
31
47
|
|
32
|
-
it "
|
33
|
-
|
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
|
38
|
-
|
39
|
-
|
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
|
-
|
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
|
-
|
83
|
+
model_class.inspect.should match /^Foo\(.*\)$/
|
60
84
|
end
|
61
85
|
|
62
|
-
it "renders the attribute
|
63
|
-
|
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
|
-
|
74
|
-
|
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
|
-
|
110
|
+
attributeless.new.attributes.should == {}
|
96
111
|
end
|
97
112
|
end
|
98
|
-
end
|
99
113
|
|
100
|
-
|
101
|
-
|
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
|
-
|
104
|
-
|
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 "#
|
109
|
-
|
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 "
|
113
|
-
subject.
|
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 "
|
117
|
-
|
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
|
-
|
122
|
-
|
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
|
-
|
125
|
-
expect { subject.write_attribute(:name) }.to raise_error(ArgumentError)
|
126
|
-
end
|
169
|
+
before { subject.write_attribute(:name, name) }
|
127
170
|
|
128
|
-
|
129
|
-
|
130
|
-
|
171
|
+
it "returns the attribute using a Symbol" do
|
172
|
+
subject.send(method, :name).should == name
|
173
|
+
end
|
131
174
|
|
132
|
-
|
133
|
-
|
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
|
-
|
137
|
-
|
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
|
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.
|
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-
|
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: &
|
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: *
|
26
|
+
version_requirements: *70255008815760
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
|
-
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: *
|
37
|
+
version_requirements: *70255008814840
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: bundler
|
40
|
-
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: *
|
48
|
+
version_requirements: *70255008813600
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: rake
|
51
|
-
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: *
|
59
|
+
version_requirements: *70255008812200
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
61
|
name: rspec
|
62
|
-
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: *
|
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:
|
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:
|
139
|
+
hash: -3746970680425630982
|
140
140
|
requirements: []
|
141
141
|
rubyforge_project: active_attr
|
142
142
|
rubygems_version: 1.5.2
|