simple_model 1.2.17 → 1.2.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDliYTcyNmJiYmY1YjdkMGRlMTE1ODUwODcyYmNlYTQwNzgxZDIwYg==
4
+ ZGI2YjA2MjE0MTA1YTgyYjQyOTg4ZTk2YjI5MmE1MThlNjY4NDFjOA==
5
5
  data.tar.gz: !binary |-
6
- MmUzNGJhNDg1ZjFmZTc5NDcwZjdlYzY2ODI0ZDI5MzIzNGNjNDYwMA==
6
+ YWIxNDkwOTRkNjhjM2UxN2Q0ODQzY2JlN2VjMGE2ODAzOTQ5YmNjMg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ODNlODE4MGQwNDcxZjZkODI5NzNhYjBmOGVlMGY4NTQ5MjM5NjNjNzkzNTcx
10
- NTA4NGExMzhmNjIyMDAxM2ZjZmNjNDMzNDU4Yjk3YzFkYmJiNDc3NTU2MzNl
11
- MGMyNTY0MmNiYmU2OWU1OTVjYzk3NjA5YWYzODUyZjMzYmM4OWM=
9
+ YzFhZTg3ZGZiNTJhMTkwMjEwZjFlOTIwMzRlNWVlMDExYmY2NjYzYzdjYTk3
10
+ M2IzM2M1NzFjNWU1NGY4ZTk4NDBkMGI2N2FkYzhmN2M2NjRhZDgzMDZlN2Ji
11
+ MzY5MjY0MGQxMjAxYjg4ZWUzMTgzZjYwYWQ4MmU0N2Q1NjJlNjI=
12
12
  data.tar.gz: !binary |-
13
- ZDhlZDhmNzlhMjFlZTBmMDA2MThjYzlkZmFhZjcyZWZmZDU0YzM1NDljNDgx
14
- M2E1YjY0MTE1MjJhZjJiZDcxOWU1YzRkNTZhNzlkNjBiOWRhZjg3ZGVjODIx
15
- MTNlYmIxM2ZkNGJhZDYzMjE0YjBhZDQzZTliNTQ2ZDVkN2EzZmE=
13
+ MGIzMThlMGJlNzZkOGVhNDZlZTgwMTc4MWRmMTVjNzBiYmY0YTZiZDdkNzRh
14
+ M2JhNWI3NmJlODFjNjZiNjgxOWUzMmEyMjA2ZjY0YjM5ODYzNTBlNDJhOTli
15
+ NDg4N2E0ZmI4ZTczNTY4NWQzNTM3ZWY5ODUyOGUyNTgxMmRkM2I=
data/Gemfile CHANGED
@@ -2,6 +2,4 @@ source "https://rubygems.org"
2
2
 
3
3
 
4
4
  # Specify your gem's dependencies in simple_model.gemspec
5
- gemspec
6
-
7
- #gem 'debugger'
5
+ gemspec
data/gemfiles/3.0.gemfile CHANGED
@@ -2,7 +2,5 @@ source "http://rubygems.org"
2
2
 
3
3
  gem 'activesupport','~> 3.0.1'
4
4
  gem 'activemodel','~> 3.0.1'
5
- gem 'debugger', :platform => 'ruby'
6
- gem 'ruby-debug', :platform => 'jruby'
7
5
 
8
6
  gemspec :path => "../"
data/gemfiles/3.1.gemfile CHANGED
@@ -2,7 +2,5 @@ source "http://rubygems.org"
2
2
 
3
3
  gem 'activesupport','~> 3.1.1'
4
4
  gem 'activemodel','~> 3.1.1'
5
- gem 'debugger', :platform => 'ruby'
6
- gem 'ruby-debug', :platform => 'jruby'
7
5
 
8
6
  gemspec :path => "../"
data/gemfiles/3.2.gemfile CHANGED
@@ -2,7 +2,5 @@ source "http://rubygems.org"
2
2
 
3
3
  gem 'activesupport','~> 3.2.1'
4
4
  gem 'activemodel','~> 3.2.1'
5
- gem 'debugger', :platform => 'ruby'
6
- gem 'ruby-debug', :platform => 'jruby'
7
5
 
8
6
  gemspec :path => "../"
@@ -3,7 +3,8 @@ module SimpleModel
3
3
  include ExtendCore
4
4
  extend ActiveSupport::Concern
5
5
  include ActiveModel::AttributeMethods
6
-
6
+ attr_accessor :attributes
7
+
7
8
  def initialize(*attrs)
8
9
  attrs = attrs.extract_options!
9
10
  attrs = attributes_with_for_init(attrs)
@@ -12,17 +13,13 @@ module SimpleModel
12
13
  self.class.after_initialize.call(self) if self.class.after_initialize
13
14
  end
14
15
 
15
- # Returns true if attribute has been initialized
16
- def initialized?(attr)
17
- attributes.key?(attr.to_sym)
18
- end
19
-
20
16
  def attributes
21
17
  @attributes ||= HashWithIndifferentAccess.new
22
18
  end
23
19
 
24
- def attributes=attrs
25
- @attributes = attrs
20
+ # Returns true if attribute has been initialized
21
+ def initialized?(attr)
22
+ self.attributes.key?(attr.to_sym)
26
23
  end
27
24
 
28
25
  def get(attr)
@@ -39,8 +36,47 @@ module SimpleModel
39
36
  end
40
37
  alias :set_attributes :set
41
38
 
39
+ def set_attribute(attr,val)
40
+ options = self.class.defined_attributes[attr] || {}
41
+ if allow_attribute_action?(self,val,options)
42
+ val = fetch_default_value(options[:default]) if (!options[:allow_blank] && options.key?(:default) && val.blank?)
43
+ val = options[:on_set].call(self,val) unless (!options.key?(:on_set) || (val.blank? && !options[:allow_blank]) )
44
+ will_change = "#{attr}_will_change!".to_sym
45
+ self.send(will_change) if (initialized?(attr) && val != self.attributes[attr])
46
+ self.attributes[attr] = val
47
+ options[:after_set].call(self,val) if options[:after_set]
48
+ end
49
+ end
50
+
51
+ def get_attribute(attr)
52
+ val = self.attributes[attr]
53
+ options = self.class.defined_attributes[attr] || {}
54
+ if (options.key?(:default) && (!self.initialized?(attr) || (!options[:allow_blank] && val.blank?)))
55
+ val = self.attributes[attr] = fetch_default_value(options[:default])
56
+ end
57
+ if options[:on_get]
58
+ options[:on_get].call(self,val)
59
+ else
60
+ val
61
+ end
62
+ end
63
+
64
+ def get_attribute?(attr)
65
+ val = get_attribute(attr)
66
+ if val.respond_to?(:to_b)
67
+ val = val.to_b
68
+ else
69
+ val = !val.blank? if val.respond_to?(:blank?)
70
+ end
71
+ val
72
+ end
73
+
42
74
  private
43
75
 
76
+ def attribute_defined?(attr)
77
+ self.class.attribute_defined?(attr)
78
+ end
79
+
44
80
  def fetch_default_value(arg)
45
81
  return self.send(arg) if (arg.is_a?(Symbol) && self.respond_to?(arg))
46
82
  arg
@@ -58,12 +94,12 @@ module SimpleModel
58
94
  d
59
95
  end
60
96
 
97
+ # Only set default if there is a default value, initializing is allow and
98
+ # new attributes do not have a value to set and
61
99
  def allow_set_default?(d,k,v)
62
- (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?)))
100
+ (v[:default] && (v[:initialize] != false) && (!d.key?(k) && !d.key?(self.class.alias_attributes[k])))
63
101
  end
64
102
 
65
- private
66
-
67
103
  def allow_attribute_action?(obj,val,options)
68
104
  return true if (options[:if].blank? && options[:unless].blank?)
69
105
  b = true
@@ -92,6 +128,31 @@ module SimpleModel
92
128
  end
93
129
 
94
130
  module ClassMethods
131
+ DEFAULT_ATTRIBUTE_SETTINGS = {:attributes_method => :attributes,
132
+ :allow_blank => true,
133
+ :initialize => true
134
+ }.freeze
135
+
136
+ AVAILABLE_ATTRIBUTE_METHODS = {
137
+ :has_attribute => {:alias => :has_attributes},
138
+ :has_boolean => {:cast_to => :to_b, :alias => :has_booleans},
139
+ :has_currency => {:cast_to => :to_d, :alias => :has_currencies},
140
+ :has_date => {:cast_to => :to_date, :alias => :has_dates} ,
141
+ :has_decimal => {:cast_to => :to_d, :alias => :has_decimals},
142
+ :has_float => {:cast_to => :to_f, :alias => :has_floats},
143
+ :has_int => {:cast_to => :to_i, :alias => :has_ints},
144
+ :has_time => {:cast_to => :to_time, :alias => :has_times}
145
+ }.freeze
146
+
147
+ AVAILABLE_ATTRIBUTE_METHODS.each do |method,method_options|
148
+ define_method(method) do |*attributes|
149
+ options = default_attribute_settings.merge(attributes.extract_options!)
150
+ options[:on_set] = lambda {|obj,val| val.send(method_options[:cast_to]) } if method_options[:cast_to]
151
+ create_attribute_methods(attributes,options)
152
+ end
153
+ module_eval("alias #{method_options[:alias]} #{method}")
154
+ end
155
+
95
156
  # Creates a new instance where the attributes store is set to object
96
157
  # provided, which allows one to pass a session store hash or any other
97
158
  # hash-like object to be used for persistence. Typically used for modeling
@@ -106,10 +167,10 @@ module SimpleModel
106
167
  # end
107
168
  #
108
169
  def new_with_store(session_hash)
109
- new = self.new()
110
- new.attributes = session_hash
111
- new.set(new.send(:attributes_with_for_init,session_hash))
112
- new
170
+ nw = self.new()
171
+ nw.attributes = session_hash
172
+ nw.set(nw.send(:attributes_with_for_init,session_hash))
173
+ nw
113
174
  end
114
175
 
115
176
  def alias_attributes
@@ -141,12 +202,7 @@ module SimpleModel
141
202
  # ** If :initialize is set to false you must set :allow_blank to false or it will never set the default value
142
203
  # * :allow_blank - when set to false, if an attributes value is blank attempts to set the default value, defaults to true
143
204
  def default_attribute_settings
144
- @default_attribute_settings ||= {:attributes_method => :attributes,
145
- :on_set => lambda {|obj,attr| attr},
146
- :on_get => lambda {|obj,attr| attr},
147
- :allow_blank => true,
148
- :initialize => true
149
- }
205
+ @default_attribute_settings ||= DEFAULT_ATTRIBUTE_SETTINGS
150
206
  end
151
207
 
152
208
  def default_attribute_settings=default_attribute_settings
@@ -159,38 +215,33 @@ module SimpleModel
159
215
  def add_defined_attribute(attr,options)
160
216
  self.defined_attributes[attr] = options
161
217
  @attribute_methods_generated = nil #if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR == 0)
162
- define_attribute_methods(self.defined_attributes.keys)
218
+ define_attribute_methods(defined_attributes_keys)
219
+ end
220
+
221
+ # We don't want to call define_attribute_methods on methods defined in the parent class
222
+ def defined_attributes_keys
223
+ dak = self.defined_attributes.keys
224
+ dak = dak - self.superclass.defined_attributes.keys if self.superclass.respond_to?(:defined_attributes)
225
+ dak
163
226
  end
164
227
 
165
228
  # builds the setter and getter methods
166
229
  def create_attribute_methods(attributes,options)
167
230
  unless attributes.blank?
168
231
  attributes.each do |attr|
169
- define_reader_with_options(attr,options)
170
232
  define_setter_with_options(attr,options)
233
+ define_reader_with_options(attr,options)
234
+ add_defined_attribute(attr,options)
171
235
  end
172
236
  end
173
237
  end
174
238
 
175
239
  def define_reader_with_options(attr,options)
176
- add_defined_attribute(attr,options)
177
- options = default_attribute_settings.merge(options) if options[:on_get].blank?
178
240
  define_method(attr) do
179
- val = self.attributes[attr]
180
- if (options.key?(:default) && (!self.initialized?(attr) || (!options[:allow_blank] && val.blank?)))
181
- val = self.attributes[attr] = fetch_default_value(options[:default])
182
- end
183
- options[:on_get].call(self,val)
241
+ get_attribute(attr)
184
242
  end
185
243
  define_method("#{attr.to_s}?") do
186
- # return false unless initialized?(attr) THIS BROKE STUFF
187
- val = self.send(attr)
188
- if val.respond_to?(:to_b)
189
- val = val.to_b
190
- else
191
- val = !val.blank? if val.respond_to?(:blank?)
192
- end
193
- val
244
+ get_attribute?(attr)
194
245
  end
195
246
  end
196
247
 
@@ -198,38 +249,9 @@ module SimpleModel
198
249
  # On set, it will mark the attribute as changed if the attributes has been
199
250
  # initialized.
200
251
  def define_setter_with_options(attr,options)
201
- add_defined_attribute(attr,options)
202
- options = default_attribute_settings.merge(options) if (options[:on_set].blank? || options[:after_set].blank?)
203
252
  define_method("#{attr.to_s}=") do |val|
204
- if allow_attribute_action?(self,val,options)
205
- val = fetch_default_value(options[:default]) if (!options[:allow_blank] && options.key?(:default) && val.blank?)
206
- val = options[:on_set].call(self,val) unless (val.blank? && !options[:allow_blank] )
207
- will_change = "#{attr}_will_change!".to_sym
208
- self.send(will_change) if (initialized?(attr) && val != self.attributes[attr])
209
- self.attributes[attr] = val
210
- options[:after_set].call(self,val) if options[:after_set]
211
- end
212
- end
213
- end
214
-
215
- AVAILABLE_ATTRIBUTE_METHODS = {
216
- :has_attribute => {:alias => :has_attributes},
217
- :has_boolean => {:cast_to => :to_b, :alias => :has_booleans},
218
- :has_currency => {:cast_to => :to_d, :alias => :has_currencies},
219
- :has_date => {:cast_to => :to_date, :alias => :has_dates} ,
220
- :has_decimal => {:cast_to => :to_d, :alias => :has_decimals},
221
- :has_float => {:cast_to => :to_f, :alias => :has_floats},
222
- :has_int => {:cast_to => :to_i, :alias => :has_ints},
223
- :has_time => {:cast_to => :to_time, :alias => :has_times}
224
- }
225
-
226
- AVAILABLE_ATTRIBUTE_METHODS.each do |method,method_options|
227
- define_method(method) do |*attributes|
228
- options = default_attribute_settings.merge(attributes.extract_options!)
229
- options[:on_set] = lambda {|obj,val| val.send(method_options[:cast_to]) } if method_options[:cast_to]
230
- create_attribute_methods(attributes,options)
253
+ set_attribute(attr,val)
231
254
  end
232
- module_eval("alias #{method_options[:alias]} #{method}")
233
255
  end
234
256
 
235
257
  # Creates alias setter and getter for the supplied attribute using the supplied alias
@@ -239,6 +261,9 @@ module SimpleModel
239
261
  define_method(new_alias) do
240
262
  self.send(attribute)
241
263
  end
264
+ define_method("#{new_alias}?") do
265
+ self.send("#{attribute}?")
266
+ end
242
267
  define_method("#{new_alias.to_s}=") do |*args, &block|
243
268
  self.send("#{attribute.to_s}=",*args, &block)
244
269
  end
@@ -280,7 +305,8 @@ module SimpleModel
280
305
  # hack to keep things working when a class inherits from a super that
281
306
  # has ActiveModel::Dirty included
282
307
  def inherited(base)
283
- base.alias_attributes = self.alias_attributes.merge(base.alias_attributes)
308
+ base.defined_attributes = self.defined_attributes.dup
309
+ base.alias_attributes = self.alias_attributes.dup
284
310
  super
285
311
  # Rails 3.0 Hack
286
312
  if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR == 0)
@@ -288,7 +314,7 @@ module SimpleModel
288
314
  base.attribute_method_affix :prefix => 'reset_', :suffix => '!'
289
315
  end
290
316
  end
291
- end
317
+ end # end ClassMethods
292
318
 
293
319
  # Rails 3.0 does some weird stuff with ActiveModel::Dirty so we need a
294
320
  # hack to keep things working when a class includes a module that has
@@ -60,7 +60,8 @@ module SimpleModel
60
60
 
61
61
  # returns boolean value for common boolean string values
62
62
  def to_b
63
- ['1',"true", "t"].include?(self.downcase)
63
+ return true if self =~ (/^(true|t|yes|y|1)$/i)
64
+ false
64
65
  end
65
66
 
66
67
  # Takes known US formatted date/time strings (MM/DD/YYYY TIME) and converts
@@ -1,3 +1,3 @@
1
1
  module SimpleModel
2
- VERSION = "1.2.17"
2
+ VERSION = "1.2.18"
3
3
  end
@@ -67,10 +67,10 @@ describe SimpleModel::Attributes do
67
67
  context '#new_with_store'do
68
68
  it "should use the provided object as the attribute store" do
69
69
  my_store = {:test1 => 1,:test2 => 2}
70
- new = TestInit.new_with_store(my_store)
71
- new.test1 = 3
72
- new.test1.should eql(3)
73
- my_store[:test1].should eql(new.test1)
70
+ nw = TestInit.new_with_store(my_store)
71
+ nw.test1 = 3
72
+ nw.test1.should eql(3)
73
+ my_store[:test1].should eql(nw.test1)
74
74
  end
75
75
  end
76
76
 
@@ -251,12 +251,10 @@ describe SimpleModel::Attributes do
251
251
  n.respond_to?(:bar_will_change!).should eql(true)
252
252
  end
253
253
 
254
- it "should defaults that were not initialized should work from parent class" do
254
+ it "should set defaults that were not initialized should work from parent class" do
255
255
  n = NewerBase.new
256
- n.some.should eql(Date.today)
257
- n.some = "2012-12-01"
258
- n.some.should be_a(Date)
259
- n.thing.should eql(Date.today)
256
+ n.some.should eql(n.send(:fetch_date))
257
+ n.thing.should eql(n.send(:fetch_date))
260
258
  end
261
259
 
262
260
  it "should allow redefining methods in child classes" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.17
4
+ version: 1.2.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua T Mckinney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-30 00:00:00.000000000 Z
11
+ date: 2014-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport