simple_model 1.2.2 → 1.2.3
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/lib/simple_model/attributes.rb +44 -7
- data/lib/simple_model/base.rb +18 -22
- data/lib/simple_model/simple_model_railtie.rb +1 -1
- data/lib/simple_model/version.rb +1 -1
- data/spec/attributes_spec.rb +34 -19
- data/spec/simple_model_spec.rb +33 -4
- metadata +2 -2
@@ -60,7 +60,7 @@ module SimpleModel
|
|
60
60
|
(v[:default] && v[:initialize] && (d[k].blank? && (self.class.alias_attributes[k].blank? || d.key?(self.class.alias_attributes[k]) && d[self.class.alias_attributes[k]].blank?)))
|
61
61
|
end
|
62
62
|
|
63
|
-
module ClassMethods
|
63
|
+
module ClassMethods
|
64
64
|
# Creates a new instance where the attributes store is set to object
|
65
65
|
# provided, which allows one to pass a session store hash or any other
|
66
66
|
# hash-like object to be used for persistance. Typically used for modeling
|
@@ -80,11 +80,15 @@ module SimpleModel
|
|
80
80
|
new.set(new.send(:attributes_with_for_init,session_hash))
|
81
81
|
new
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
def alias_attributes
|
85
85
|
@alias_attributes ||= {}.with_indifferent_access
|
86
86
|
end
|
87
87
|
|
88
|
+
def alias_attributes=alias_attributes
|
89
|
+
@alias_attributes = alias_attributes
|
90
|
+
end
|
91
|
+
|
88
92
|
def defined_attributes
|
89
93
|
@defined_attributes ||= {}.with_indifferent_access
|
90
94
|
end
|
@@ -116,7 +120,7 @@ module SimpleModel
|
|
116
120
|
|
117
121
|
def add_defined_attribute(attr,options)
|
118
122
|
self.defined_attributes[attr] = options
|
119
|
-
define_attribute_methods
|
123
|
+
define_attribute_methods [attr]
|
120
124
|
end
|
121
125
|
|
122
126
|
# builds the setter and getter methods
|
@@ -148,7 +152,10 @@ module SimpleModel
|
|
148
152
|
val
|
149
153
|
end
|
150
154
|
end
|
151
|
-
|
155
|
+
|
156
|
+
# Creates setter methods for the provided attributes
|
157
|
+
# On set, it will mark the attribute as changed if the attributes has been
|
158
|
+
# initialized.
|
152
159
|
def define_setter_with_options(attr,options)
|
153
160
|
add_defined_attribute(attr,options)
|
154
161
|
options = default_attribute_settings.merge(options) if (options[:on_set].blank? || options[:after_set].blank?)
|
@@ -160,7 +167,7 @@ module SimpleModel
|
|
160
167
|
raise ArgumentError, "#{val} could not be set for #{attr}: #{e.message}"
|
161
168
|
end
|
162
169
|
will_change = "#{attr}_will_change!".to_sym
|
163
|
-
self.send(will_change) if (
|
170
|
+
self.send(will_change) if (initialized?(attr) && val != self.attributes[attr])
|
164
171
|
self.attributes[attr] = val
|
165
172
|
options[:after_set].call(self,val) if options[:after_set]
|
166
173
|
end
|
@@ -197,11 +204,41 @@ module SimpleModel
|
|
197
204
|
self.send("#{attribute.to_s}=",*args, &block)
|
198
205
|
end
|
199
206
|
end
|
207
|
+
|
208
|
+
# Must inherit super's defined_attributes and alias_attributes
|
209
|
+
# Rails 3.0 does some weird stuff with ActiveModel::Dirty so we need a
|
210
|
+
# hack to keep things working when a class in inherits from a super that
|
211
|
+
# has ActiveModel::Dirty included
|
212
|
+
def inherited(base)
|
213
|
+
# Rails 3.0 Hack
|
214
|
+
if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR == 0)
|
215
|
+
base.send(:include, ActiveModel::Dirty)
|
216
|
+
base.attribute_method_suffix '_changed?', '_change', '_will_change!', '_was'
|
217
|
+
base.attribute_method_affix :prefix => 'reset_', :suffix => '!'
|
218
|
+
end
|
219
|
+
|
220
|
+
base.defined_attributes = self.defined_attributes.merge(base.defined_attributes)
|
221
|
+
base.alias_attributes = self.alias_attributes.merge(base.alias_attributes )
|
222
|
+
end
|
200
223
|
end
|
201
224
|
|
225
|
+
# Rails 3.0 does some weird stuff with ActiveModel::Dirty so we need a
|
226
|
+
# hack to keep things working when a class includes a module that has
|
227
|
+
# ActiveModel::Dirty included
|
202
228
|
def self.included(base)
|
203
|
-
base.extend(Attributes::ClassMethods)
|
204
|
-
base.send(:include, ActiveModel::Dirty)
|
229
|
+
base.extend(Attributes::ClassMethods)
|
230
|
+
base.send(:include, ActiveModel::Dirty)
|
231
|
+
base.send(:include, ActiveModel::Validations)
|
232
|
+
base.send(:include, ActiveModel::Conversion)
|
233
|
+
base.extend ActiveModel::Naming
|
234
|
+
base.extend ActiveModel::Callbacks
|
235
|
+
base.send(:include, ActiveModel::Validations::Callbacks)
|
236
|
+
|
237
|
+
# Rails 3.0 Hack
|
238
|
+
if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR == 0)
|
239
|
+
base.attribute_method_suffix '_changed?', '_change', '_will_change!', '_was'
|
240
|
+
base.attribute_method_affix :prefix => 'reset_', :suffix => '!'
|
241
|
+
end
|
205
242
|
end
|
206
243
|
end
|
207
244
|
end
|
data/lib/simple_model/base.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
module SimpleModel
|
1
|
+
module SimpleModel
|
2
2
|
# Require all that active support we know and love
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
3
|
+
require 'active_support/time'
|
4
|
+
require 'active_support/core_ext/class/attribute'
|
5
|
+
require 'active_support/core_ext/class/attribute_accessors'
|
6
|
+
require 'active_support/core_ext/class/delegating_attributes'
|
7
|
+
require 'active_support/core_ext/class/attribute'
|
8
|
+
require 'active_support/core_ext/array/extract_options'
|
9
|
+
require 'active_support/core_ext/hash/deep_merge'
|
10
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
11
|
+
require 'active_support/core_ext/hash/slice'
|
12
|
+
require 'active_support/core_ext/string/behavior'
|
13
|
+
require 'active_support/core_ext/kernel/singleton_class'
|
14
|
+
require 'active_support/core_ext/module/delegation'
|
15
|
+
require 'active_support/core_ext/module/introspection'
|
16
|
+
require 'active_support/core_ext/object/duplicable'
|
17
|
+
require 'active_support/core_ext/object/blank'
|
18
18
|
|
19
19
|
# == SimpleModel::Base
|
20
20
|
#
|
@@ -76,12 +76,8 @@ module SimpleModel
|
|
76
76
|
include SimpleModel::Attributes
|
77
77
|
include SimpleModel::ErrorHelpers
|
78
78
|
#Use ActiveModel Resources
|
79
|
-
include ActiveModel::Validations
|
80
|
-
include ActiveModel::Conversion
|
81
|
-
extend ActiveModel::Naming
|
82
|
-
extend ActiveModel::Callbacks
|
83
|
-
include ActiveModel::Validations::Callbacks
|
84
79
|
|
80
|
+
|
85
81
|
define_model_callbacks :save, :update, :create, :destroy
|
86
82
|
|
87
83
|
class << self
|
@@ -122,7 +118,7 @@ module SimpleModel
|
|
122
118
|
if completed
|
123
119
|
self.persisted = true
|
124
120
|
@previously_changed = changes
|
125
|
-
@changed_attributes.clear
|
121
|
+
@changed_attributes.clear
|
126
122
|
else
|
127
123
|
self.send(options[:rollback]) unless options[:rollback].blank?
|
128
124
|
end
|
data/lib/simple_model/version.rb
CHANGED
data/spec/attributes_spec.rb
CHANGED
@@ -60,6 +60,7 @@ describe SimpleModel::Attributes do
|
|
60
60
|
"hop" if nap
|
61
61
|
end
|
62
62
|
end
|
63
|
+
|
63
64
|
end
|
64
65
|
|
65
66
|
before(:each) do
|
@@ -154,30 +155,44 @@ describe SimpleModel::Attributes do
|
|
154
155
|
|
155
156
|
lambda{TestThrow.new(:boo => [])}.should raise_error(SimpleModel::ArgumentError)
|
156
157
|
end
|
157
|
-
|
158
|
-
|
159
|
-
|
158
|
+
context '#alias_attribute' do
|
159
|
+
it "should create alias for attribute" do
|
160
|
+
class TestAlias
|
161
|
+
include SimpleModel::Attributes
|
162
|
+
has_attribute :foo, :default => "bar"
|
163
|
+
alias_attribute(:bar,:foo)
|
164
|
+
end
|
165
|
+
|
166
|
+
t = TestAlias.new(:bar => "foo")
|
167
|
+
t.bar.should eql("foo")
|
168
|
+
t.foo.should eql('foo')
|
169
|
+
t = TestAlias.new(:foo => "foo")
|
170
|
+
t.bar.should eql("foo")
|
171
|
+
t.foo.should eql('foo')
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context "regression tests" do
|
177
|
+
it "should merge defined attributes when class are inhereted" do
|
178
|
+
class MyBase
|
160
179
|
include SimpleModel::Attributes
|
161
|
-
|
162
|
-
alias_attribute(:bar,:foo)
|
180
|
+
has_boolean :bar
|
163
181
|
end
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
182
|
+
|
183
|
+
class NewerBase < MyBase
|
184
|
+
has_boolean :foo
|
185
|
+
end
|
186
|
+
|
187
|
+
NewerBase.defined_attributes[:bar].blank?.should be_false
|
188
|
+
n = NewerBase.new
|
189
|
+
n.respond_to?(:bar_will_change!).should be_true
|
171
190
|
end
|
172
191
|
end
|
173
|
-
|
174
|
-
end
|
175
|
-
|
176
192
|
|
177
193
|
after(:all) do
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
Object.send(:remove_const,:TestInit)
|
194
|
+
[:TestThrow,:OnGet,:TestDefault,:TestInit,:MyBase,:NewerBase].each do |test_klass|
|
195
|
+
Object.send(:remove_const,test_klass)
|
196
|
+
end
|
182
197
|
end
|
183
198
|
end
|
data/spec/simple_model_spec.rb
CHANGED
@@ -2,9 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
3
3
|
describe SimpleModel do
|
4
4
|
|
5
|
-
|
6
|
-
Object.send(:remove_const,:TestStuff)
|
7
|
-
end
|
5
|
+
|
8
6
|
|
9
7
|
context 'action methods' do
|
10
8
|
describe "save" do
|
@@ -188,6 +186,7 @@ describe SimpleModel do
|
|
188
186
|
class TestStuff < SimpleModel::Base
|
189
187
|
save :my_save_method
|
190
188
|
has_attributes :foo,:bar, :default => "def"
|
189
|
+
has_boolean :boo,:bad, :default => true
|
191
190
|
def my_save_method
|
192
191
|
true
|
193
192
|
end
|
@@ -196,9 +195,39 @@ describe SimpleModel do
|
|
196
195
|
t = TestStuff.new
|
197
196
|
t.foo = "bar"
|
198
197
|
t.foo_changed?.should be_true
|
198
|
+
t.respond_to?(:foo_will_change!).should be_true
|
199
|
+
t.respond_to?(:boo_will_change!).should be_true
|
199
200
|
t.foo_change.should eql(["def","bar"])
|
200
201
|
t.changed?.should be_true
|
201
202
|
t.save
|
202
203
|
t.changed?.should be_false
|
203
|
-
end
|
204
|
+
end
|
205
|
+
|
206
|
+
context "regression tests" do
|
207
|
+
before(:each) do
|
208
|
+
class TestStuff < SimpleModel::Base
|
209
|
+
has_attribute :bar
|
210
|
+
end
|
211
|
+
|
212
|
+
class NewTestStuff < TestStuff
|
213
|
+
has_boolean :foo
|
214
|
+
end
|
215
|
+
end
|
216
|
+
it "should merge defined attributes when class are inhereted" do
|
217
|
+
NewTestStuff.defined_attributes[:bar].blank?.should be_false
|
218
|
+
NewTestStuff.defined_attributes[:foo].blank?.should be_false
|
219
|
+
end
|
220
|
+
it "should merge defined attributes when class are inhereted" do
|
221
|
+
TestStuff.new.respond_to?(:bar_will_change!).should be_true
|
222
|
+
NewTestStuff.new.respond_to?(:bar_will_change!).should be_true
|
223
|
+
NewTestStuff.new.respond_to?(:foo_will_change!).should be_true
|
224
|
+
end
|
225
|
+
after(:each) do
|
226
|
+
Object.send(:remove_const,:NewTestStuff)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
after(:each) do
|
231
|
+
Object.send(:remove_const,:TestStuff)
|
232
|
+
end
|
204
233
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|