property_sets 0.0.12 → 0.1.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.
- data/Gemfile +4 -2
- data/Gemfile.lock +31 -0
- data/README.rdoc +6 -22
- data/VERSION +1 -1
- data/lib/property_sets/active_record_extension.rb +20 -40
- data/property_sets.gemspec +12 -5
- data/test/helper.rb +1 -0
- data/test/test_property_sets.rb +59 -94
- metadata +48 -15
data/Gemfile
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
# Add dependencies required to use your gem here.
|
3
3
|
# Example:
|
4
|
-
|
4
|
+
|
5
|
+
gem "activesupport", "~> 2.3.5"
|
6
|
+
gem "activerecord", "~> 2.3.5"
|
5
7
|
|
6
8
|
# Add dependencies to develop your gem here.
|
7
9
|
# Include everything needed to run rake, tests, features, etc.
|
@@ -9,5 +11,5 @@ group :development do
|
|
9
11
|
gem "shoulda", ">= 0"
|
10
12
|
gem "bundler", "~> 1.0.0"
|
11
13
|
gem "jeweler", "~> 1.5.1"
|
12
|
-
gem "
|
14
|
+
gem "ruby-debug"
|
13
15
|
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activerecord (2.3.10)
|
5
|
+
activesupport (= 2.3.10)
|
6
|
+
activesupport (2.3.10)
|
7
|
+
columnize (0.3.2)
|
8
|
+
git (1.2.5)
|
9
|
+
jeweler (1.5.2)
|
10
|
+
bundler (~> 1.0.0)
|
11
|
+
git (>= 1.2.5)
|
12
|
+
rake
|
13
|
+
linecache (0.43)
|
14
|
+
rake (0.8.7)
|
15
|
+
ruby-debug (0.10.4)
|
16
|
+
columnize (>= 0.1)
|
17
|
+
ruby-debug-base (~> 0.10.4.0)
|
18
|
+
ruby-debug-base (0.10.4)
|
19
|
+
linecache (>= 0.3)
|
20
|
+
shoulda (2.11.3)
|
21
|
+
|
22
|
+
PLATFORMS
|
23
|
+
ruby
|
24
|
+
|
25
|
+
DEPENDENCIES
|
26
|
+
activerecord (~> 2.3.5)
|
27
|
+
activesupport (~> 2.3.5)
|
28
|
+
bundler (~> 1.0.0)
|
29
|
+
jeweler (~> 1.5.1)
|
30
|
+
ruby-debug
|
31
|
+
shoulda
|
data/README.rdoc
CHANGED
@@ -20,33 +20,17 @@ You configure the allowed stored properties by specifying these in the model:
|
|
20
20
|
|
21
21
|
The declared properties can then be accessed runtime via the defined association:
|
22
22
|
|
23
|
-
# Return the version record for this account
|
23
|
+
# Return the value of the version record for this account, or the default value if not set
|
24
24
|
account.settings.version
|
25
25
|
|
26
|
-
#
|
27
|
-
account.settings.version.
|
26
|
+
# Update the version record with given value
|
27
|
+
account.settings.version = "v1.1"
|
28
28
|
|
29
|
-
#
|
30
|
-
account.settings.version.create(:value => "v1.1")
|
31
|
-
|
32
|
-
# Destroy the version record
|
33
|
-
account.settings.version.destroy
|
34
|
-
|
35
|
-
=== Convenience methods
|
36
|
-
|
37
|
-
On top of the basic access paths, there are some short cuts, mainly convenience methods for dealing with booleans:
|
38
|
-
|
39
|
-
# immediately changes the value of the setting
|
40
|
-
account.settings.version=("v3.0")
|
41
|
-
|
42
|
-
# coerces the setting to boolean AR style
|
29
|
+
# Query the truth value of the property
|
43
30
|
account.settings.featured?
|
44
31
|
|
45
|
-
#
|
46
|
-
account.settings.
|
47
|
-
|
48
|
-
# sets the value of this setting to a false value
|
49
|
-
account.settings.featured.disable
|
32
|
+
# Short hand for setting one or more values
|
33
|
+
account.settings.set(:version => "v1.2", :activated => true)
|
50
34
|
|
51
35
|
=== Bulk operations
|
52
36
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
@@ -3,75 +3,55 @@ require 'delegate'
|
|
3
3
|
module PropertySets
|
4
4
|
module ActiveRecordExtension
|
5
5
|
|
6
|
-
class PropertySetProxy < Delegator
|
7
|
-
attr_accessor :record
|
8
|
-
|
9
|
-
def initialize(record)
|
10
|
-
self.record = record
|
11
|
-
end
|
12
|
-
|
13
|
-
def __getobj__
|
14
|
-
record
|
15
|
-
end
|
16
|
-
|
17
|
-
def id
|
18
|
-
record.id
|
19
|
-
end
|
20
|
-
|
21
|
-
def create(args = {})
|
22
|
-
record.attributes = args
|
23
|
-
record.save
|
24
|
-
record
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
6
|
module ClassMethods
|
29
7
|
def property_set(association, &block)
|
30
8
|
raise "Invalid association name, letters only" unless association.to_s =~ /[a-z]+/
|
31
9
|
property_class = PropertySets.ensure_property_set_class(association, self)
|
32
10
|
property_class.instance_eval(&block)
|
33
11
|
|
34
|
-
has_many association
|
12
|
+
has_many association, :class_name => property_class.name, :dependent => :destroy do
|
35
13
|
|
36
14
|
# Accepts a name value pair hash { :name => 'value', :pairs => true } and builds a property for each key
|
37
|
-
def
|
15
|
+
def set(property_pairs, with_protection = false)
|
38
16
|
property_pairs.keys.each do |name|
|
39
|
-
record = lookup(name)
|
17
|
+
record = lookup(name)
|
40
18
|
if with_protection && record.protected?
|
41
19
|
logger.warn("Someone tried to update the protected #{name} property to #{property_pairs[name]}")
|
42
20
|
else
|
43
|
-
|
44
|
-
self << record
|
21
|
+
send("#{name}=", property_pairs[name])
|
45
22
|
end
|
46
23
|
end
|
47
24
|
end
|
48
25
|
|
49
|
-
# Define the settings query methods, e.g. +account.settings.wiffle?+
|
50
26
|
property_class.keys.each do |key|
|
51
|
-
raise "Invalid key #{key}" if self.respond_to?(key)
|
27
|
+
raise "Invalid property key #{key}" if self.respond_to?(key)
|
52
28
|
|
53
|
-
# Reports the coerced truth
|
29
|
+
# Reports the coerced truth value of the property
|
54
30
|
define_method "#{key}?" do
|
55
31
|
lookup(key).true?
|
56
32
|
end
|
57
33
|
|
34
|
+
# Returns the value of the property
|
35
|
+
define_method "#{key}" do
|
36
|
+
lookup(key).value
|
37
|
+
end
|
38
|
+
|
39
|
+
define_method "protected?" do |arg|
|
40
|
+
lookup(arg).protected?
|
41
|
+
end
|
42
|
+
|
58
43
|
# Assigns a new value to the property
|
59
44
|
define_method "#{key}=" do |value|
|
60
45
|
instance = lookup(key)
|
61
46
|
instance.value = value
|
62
|
-
instance
|
63
|
-
|
64
|
-
|
65
|
-
# Returns the value of the property
|
66
|
-
define_method "#{key}" do
|
67
|
-
lookup(key)
|
47
|
+
@owner.send(association) << instance
|
48
|
+
value
|
68
49
|
end
|
69
50
|
|
70
51
|
# The finder method which returns the property if present, otherwise a new instance with defaults
|
71
52
|
define_method "lookup" do |arg|
|
72
|
-
instance
|
73
|
-
instance ||= property_class.new(
|
74
|
-
PropertySetProxy.new(instance)
|
53
|
+
instance = detect { |property| property.name.to_sym == arg }
|
54
|
+
instance ||= property_class.new(:name => arg.to_s, :value => property_class.default(arg))
|
75
55
|
end
|
76
56
|
end
|
77
57
|
end
|
@@ -92,7 +72,7 @@ module PropertySets
|
|
92
72
|
def update_property_set_attributes(attributes)
|
93
73
|
if attributes && property_sets = attributes.delete(:property_sets)
|
94
74
|
property_sets.each do |property_set, property_set_attributes|
|
95
|
-
send(property_set).
|
75
|
+
send(property_set).set(property_set_attributes, true)
|
96
76
|
end
|
97
77
|
end
|
98
78
|
end
|
data/property_sets.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{property_sets}
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Morten Primdahl"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-18}
|
13
13
|
s.description = %q{This gem is an ActiveRecord extension which provides a convenient interface for managing per row properties}
|
14
14
|
s.email = %q{morten@zendesk.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
21
|
"Gemfile",
|
22
|
+
"Gemfile.lock",
|
22
23
|
"LICENSE.txt",
|
23
24
|
"README.rdoc",
|
24
25
|
"Rakefile",
|
@@ -52,23 +53,29 @@ Gem::Specification.new do |s|
|
|
52
53
|
s.specification_version = 3
|
53
54
|
|
54
55
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
56
|
+
s.add_runtime_dependency(%q<activesupport>, ["~> 2.3.5"])
|
57
|
+
s.add_runtime_dependency(%q<activerecord>, ["~> 2.3.5"])
|
55
58
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
56
59
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
57
60
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
|
58
|
-
s.add_development_dependency(%q<
|
61
|
+
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
59
62
|
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
60
63
|
else
|
64
|
+
s.add_dependency(%q<activesupport>, ["~> 2.3.5"])
|
65
|
+
s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
|
61
66
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
62
67
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
63
68
|
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
64
|
-
s.add_dependency(%q<
|
69
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
65
70
|
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
66
71
|
end
|
67
72
|
else
|
73
|
+
s.add_dependency(%q<activesupport>, ["~> 2.3.5"])
|
74
|
+
s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
|
68
75
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
69
76
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
70
77
|
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
71
|
-
s.add_dependency(%q<
|
78
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
72
79
|
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
73
80
|
end
|
74
81
|
end
|
data/test/helper.rb
CHANGED
@@ -4,6 +4,7 @@ require 'active_support'
|
|
4
4
|
require 'active_record'
|
5
5
|
require 'active_record/fixtures'
|
6
6
|
require 'shoulda'
|
7
|
+
require 'ruby-debug'
|
7
8
|
|
8
9
|
ActiveRecord::Base.configurations = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
9
10
|
ActiveRecord::Base.establish_connection('test')
|
data/test/test_property_sets.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'helper'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
2
2
|
|
3
3
|
class Account < ActiveRecord::Base
|
4
4
|
property_set :settings do
|
@@ -6,8 +6,7 @@ class Account < ActiveRecord::Base
|
|
6
6
|
property :bar
|
7
7
|
property :baz
|
8
8
|
property :hep, :default => 'skep'
|
9
|
-
property :
|
10
|
-
property :bla, :protected => true
|
9
|
+
property :pro, :protected => true
|
11
10
|
end
|
12
11
|
|
13
12
|
property_set :texts do
|
@@ -33,20 +32,25 @@ class TestPropertySets < ActiveSupport::TestCase
|
|
33
32
|
end
|
34
33
|
|
35
34
|
should "support protecting attributes" do
|
36
|
-
assert @account.settings.
|
35
|
+
assert @account.settings.protected?(:pro)
|
36
|
+
assert !@account.settings.protected?(:foo)
|
37
37
|
end
|
38
38
|
|
39
39
|
should "be empty on a new account" do
|
40
40
|
assert @account.settings.empty?
|
41
41
|
assert @account.texts.empty?
|
42
|
+
|
43
|
+
assert !@account.texts.foo?
|
44
|
+
assert !@account.texts.bar?
|
45
|
+
assert @account.texts.foo.nil?
|
46
|
+
assert @account.texts.bar.nil?
|
42
47
|
end
|
43
48
|
|
44
|
-
should "respond
|
49
|
+
should "respond with defaults" do
|
45
50
|
assert_equal false, @account.settings.bar?
|
46
|
-
assert_equal nil, @account.settings.bar
|
51
|
+
assert_equal nil, @account.settings.bar
|
47
52
|
assert_equal true, @account.settings.hep?
|
48
|
-
assert_equal 'skep', @account.settings.hep
|
49
|
-
assert @account.settings.hep.id.nil?
|
53
|
+
assert_equal 'skep', @account.settings.hep
|
50
54
|
end
|
51
55
|
|
52
56
|
should "reject settings with an invalid name" do
|
@@ -64,113 +68,75 @@ class TestPropertySets < ActiveSupport::TestCase
|
|
64
68
|
end
|
65
69
|
|
66
70
|
should "validate uniqueness of settings" do
|
67
|
-
|
71
|
+
@account.settings.create!(:name => "unique")
|
68
72
|
assert_raise ActiveRecord::RecordInvalid do
|
69
|
-
|
73
|
+
@account.settings.create!(:name => "unique")
|
70
74
|
end
|
71
75
|
end
|
72
76
|
|
73
77
|
should "be creatable using the = operator" do
|
74
78
|
assert !@account.settings.foo?
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
assert @account.settings.size == 1
|
81
|
-
assert @account.settings.foo?
|
82
|
-
end
|
79
|
+
[ "1", "2" ].each do |value|
|
80
|
+
assert @account.settings.foo = value
|
81
|
+
assert @account.settings.foo?
|
82
|
+
assert @account.settings.size == 1
|
83
|
+
end
|
83
84
|
|
84
|
-
|
85
|
-
assert @account.settings.foo.create.id
|
86
|
-
@account.settings.foo.destroy
|
87
|
-
@account.reload
|
88
|
-
assert @account.settings.foo.new_record?
|
89
|
-
assert @account.settings.foo.create(:value => 8)
|
90
|
-
assert @account.settings.foo.id
|
91
|
-
assert @account.settings.foo.value == "8"
|
92
|
-
assert @account.settings.hep.create
|
93
|
-
assert_equal @account.settings.hep.value, "skep"
|
85
|
+
assert @account.texts.empty?
|
94
86
|
end
|
95
87
|
|
96
|
-
should "
|
97
|
-
|
98
|
-
assert @account.settings.foo
|
99
|
-
|
100
|
-
assert @account.settings.foo.
|
101
|
-
@account.settings.reload
|
102
|
-
assert !@account.settings.foo?
|
88
|
+
should "coerce everything but nil to string" do
|
89
|
+
@account.settings.foo = 3
|
90
|
+
assert @account.settings.foo == "3"
|
91
|
+
@account.settings.foo = nil
|
92
|
+
assert @account.settings.foo.nil?
|
103
93
|
end
|
104
94
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
assert @account.settings.foo.id.present?
|
110
|
-
assert @account.settings.foo?
|
111
|
-
@account.settings.foo.disable
|
112
|
-
assert !@account.settings.foo?
|
113
|
-
end
|
95
|
+
context "#set" do
|
96
|
+
should "support writing multiple values to the association" do
|
97
|
+
assert !@account.settings.foo?
|
98
|
+
assert !@account.settings.bar?
|
114
99
|
|
115
|
-
|
116
|
-
assert @account.settings.foo.create(:value => 3)
|
117
|
-
assert @account.settings.foo.value == "3"
|
118
|
-
assert @account.settings.foo.create(:value => nil)
|
119
|
-
assert @account.settings.foo.value.nil?
|
120
|
-
end
|
100
|
+
@account.settings.set(:foo => "123", :bar => "456")
|
121
101
|
|
122
|
-
|
123
|
-
|
102
|
+
assert @account.settings.foo?
|
103
|
+
assert @account.settings.bar?
|
104
|
+
end
|
105
|
+
|
106
|
+
should "work identically for new and existing owner objects" do
|
124
107
|
[ @account, Account.new(:name => "Mibble") ].each do |account|
|
125
|
-
account.settings.
|
126
|
-
|
127
|
-
|
128
|
-
assert_equal account.
|
129
|
-
assert_equal account.settings.
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
account.settings.
|
135
|
-
account.
|
136
|
-
|
137
|
-
assert_equal account.reload.settings.size, 3
|
138
|
-
assert_equal account.settings.foo.value, "123"
|
139
|
-
assert_equal account.settings.bar.value, "789"
|
140
|
-
assert_equal account.settings.baz.value, "012"
|
108
|
+
account.settings.set(:foo => "123", :bar => "456")
|
109
|
+
|
110
|
+
assert_equal account.settings.size, 2
|
111
|
+
assert_equal account.settings.foo, "123"
|
112
|
+
assert_equal account.settings.bar, "456"
|
113
|
+
|
114
|
+
account.settings.set(:bar => "789", :baz => "012")
|
115
|
+
|
116
|
+
assert_equal account.settings.size, 3
|
117
|
+
assert_equal account.settings.foo, "123"
|
118
|
+
assert_equal account.settings.bar, "789"
|
119
|
+
assert_equal account.settings.baz, "012"
|
141
120
|
end
|
142
121
|
end
|
143
122
|
|
144
123
|
should "be updateable as AR nested attributes" do
|
145
|
-
assert !@account.texts.foo?
|
146
|
-
assert !@account.texts.bar?
|
147
|
-
assert !@account.texts.foo.id
|
148
|
-
assert !@account.texts.bar.id
|
149
|
-
assert @account.texts.empty?
|
150
|
-
|
151
124
|
assert @account.texts_attributes = [{ :name => "foo", :value => "1" }, { :name => "bar", :value => "0" }]
|
152
125
|
@account.save!
|
153
126
|
|
154
|
-
assert @account.texts.foo
|
155
|
-
assert
|
156
|
-
assert @account.texts.foo.id
|
157
|
-
assert @account.texts.bar.id
|
127
|
+
assert @account.texts.foo == "1"
|
128
|
+
assert @account.texts.bar == "0"
|
158
129
|
|
159
130
|
@account.update_attributes!(:texts_attributes => [
|
160
|
-
{ :id => @account.texts.foo.id, :name => "foo", :value => "0" },
|
161
|
-
{ :id => @account.texts.bar.id, :name => "bar", :value => "1" }
|
131
|
+
{ :id => @account.texts.lookup(:foo).id, :name => "foo", :value => "0" },
|
132
|
+
{ :id => @account.texts.lookup(:bar).id, :name => "bar", :value => "1" }
|
162
133
|
])
|
163
|
-
|
164
|
-
assert @account.texts.
|
134
|
+
|
135
|
+
assert @account.texts.foo == "0"
|
136
|
+
assert @account.texts.bar == "1"
|
165
137
|
end
|
166
138
|
|
167
139
|
should "be updateable as a nested structure" do
|
168
|
-
assert !@account.settings.foo?
|
169
|
-
assert !@account.settings.bar?
|
170
|
-
assert !@account.settings.foo.id
|
171
|
-
assert !@account.settings.bar.id
|
172
|
-
assert @account.settings.empty?
|
173
|
-
|
174
140
|
attribs = {
|
175
141
|
:name => "Kim",
|
176
142
|
:property_sets => {
|
@@ -183,15 +149,14 @@ class TestPropertySets < ActiveSupport::TestCase
|
|
183
149
|
|
184
150
|
assert @account.settings.foo?
|
185
151
|
assert !@account.settings.bar?
|
186
|
-
assert @account.settings.foo
|
187
|
-
assert @account.settings.bar
|
188
|
-
assert
|
189
|
-
assert @account.settings.bar.value == "0"
|
152
|
+
assert @account.settings.foo == "1"
|
153
|
+
assert @account.settings.bar == "0"
|
154
|
+
assert !@account.settings.pro?
|
190
155
|
|
191
156
|
attribs = {
|
192
157
|
:name => "Kim",
|
193
158
|
:property_sets => {
|
194
|
-
:settings => { :foo => "1", :bar => "1", :baz => "1", :
|
159
|
+
:settings => { :foo => "1", :bar => "1", :baz => "1", :pro => "1" }
|
195
160
|
}
|
196
161
|
}
|
197
162
|
|
@@ -200,7 +165,7 @@ class TestPropertySets < ActiveSupport::TestCase
|
|
200
165
|
assert @account.settings.foo?
|
201
166
|
assert @account.settings.bar?
|
202
167
|
assert @account.settings.baz?
|
203
|
-
assert !@account.settings.
|
168
|
+
assert !@account.settings.pro?
|
204
169
|
end
|
205
170
|
end
|
206
171
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: property_sets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.12
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Morten Primdahl
|
@@ -15,14 +15,46 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-18 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
23
|
+
type: :runtime
|
24
|
+
name: activesupport
|
25
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 9
|
31
|
+
segments:
|
32
|
+
- 2
|
33
|
+
- 3
|
34
|
+
- 5
|
35
|
+
version: 2.3.5
|
36
|
+
requirement: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
prerelease: false
|
39
|
+
type: :runtime
|
40
|
+
name: activerecord
|
41
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 9
|
47
|
+
segments:
|
48
|
+
- 2
|
49
|
+
- 3
|
50
|
+
- 5
|
51
|
+
version: 2.3.5
|
52
|
+
requirement: *id002
|
21
53
|
- !ruby/object:Gem::Dependency
|
22
54
|
prerelease: false
|
23
55
|
type: :development
|
24
56
|
name: shoulda
|
25
|
-
version_requirements: &
|
57
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
26
58
|
none: false
|
27
59
|
requirements:
|
28
60
|
- - ">="
|
@@ -31,12 +63,12 @@ dependencies:
|
|
31
63
|
segments:
|
32
64
|
- 0
|
33
65
|
version: "0"
|
34
|
-
requirement: *
|
66
|
+
requirement: *id003
|
35
67
|
- !ruby/object:Gem::Dependency
|
36
68
|
prerelease: false
|
37
69
|
type: :development
|
38
70
|
name: bundler
|
39
|
-
version_requirements: &
|
71
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
40
72
|
none: false
|
41
73
|
requirements:
|
42
74
|
- - ~>
|
@@ -47,12 +79,12 @@ dependencies:
|
|
47
79
|
- 0
|
48
80
|
- 0
|
49
81
|
version: 1.0.0
|
50
|
-
requirement: *
|
82
|
+
requirement: *id004
|
51
83
|
- !ruby/object:Gem::Dependency
|
52
84
|
prerelease: false
|
53
85
|
type: :development
|
54
86
|
name: jeweler
|
55
|
-
version_requirements: &
|
87
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
56
88
|
none: false
|
57
89
|
requirements:
|
58
90
|
- - ~>
|
@@ -63,12 +95,12 @@ dependencies:
|
|
63
95
|
- 5
|
64
96
|
- 1
|
65
97
|
version: 1.5.1
|
66
|
-
requirement: *
|
98
|
+
requirement: *id005
|
67
99
|
- !ruby/object:Gem::Dependency
|
68
100
|
prerelease: false
|
69
101
|
type: :development
|
70
|
-
name:
|
71
|
-
version_requirements: &
|
102
|
+
name: ruby-debug
|
103
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
72
104
|
none: false
|
73
105
|
requirements:
|
74
106
|
- - ">="
|
@@ -77,12 +109,12 @@ dependencies:
|
|
77
109
|
segments:
|
78
110
|
- 0
|
79
111
|
version: "0"
|
80
|
-
requirement: *
|
112
|
+
requirement: *id006
|
81
113
|
- !ruby/object:Gem::Dependency
|
82
114
|
prerelease: false
|
83
115
|
type: :development
|
84
116
|
name: thoughtbot-shoulda
|
85
|
-
version_requirements: &
|
117
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
86
118
|
none: false
|
87
119
|
requirements:
|
88
120
|
- - ">="
|
@@ -91,7 +123,7 @@ dependencies:
|
|
91
123
|
segments:
|
92
124
|
- 0
|
93
125
|
version: "0"
|
94
|
-
requirement: *
|
126
|
+
requirement: *id007
|
95
127
|
description: This gem is an ActiveRecord extension which provides a convenient interface for managing per row properties
|
96
128
|
email: morten@zendesk.com
|
97
129
|
executables: []
|
@@ -104,6 +136,7 @@ extra_rdoc_files:
|
|
104
136
|
files:
|
105
137
|
- .document
|
106
138
|
- Gemfile
|
139
|
+
- Gemfile.lock
|
107
140
|
- LICENSE.txt
|
108
141
|
- README.rdoc
|
109
142
|
- Rakefile
|