simple_model 1.2.26 → 1.2.27
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/benchmarks/simple_model.rb +68 -13
- data/gemfiles/4.2.gemfile +2 -2
- data/lib/simple_model/attributes.rb +84 -66
- data/lib/simple_model/extend_core.rb +1 -1
- data/lib/simple_model/version.rb +1 -1
- data/spec/attributes_spec.rb +414 -246
- data/spec/base_spec.rb +176 -0
- data/spec/error_helpers_spec.rb +1 -1
- data/spec/extend_core_spec.rb +54 -53
- metadata +4 -4
- data/spec/simple_model_spec.rb +0 -247
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NzIwOThmYzg1NGI0ZGZjN2YwNTdhZTU3NGM2YzNmMDBlMGJkMzA2NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YWEwNDJjZDg4ZjExOTYxODYyMmQ0NjljZjNkY2VkOTg3Y2Q1ZjI5Nw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDkyOTdlMDdmZTczMGI3MGQyZmZlNzliNDkzN2M2ZTY4NGU4MmNjNGZmZWI0
|
10
|
+
M2M3YmMzNWQ3Njg2ZjEwZWY4YTUzYzEwMjkwNDI2NTU5ZDc4MzdhNDdhZjYx
|
11
|
+
MzQ4OWRkZjY3MDczY2Q5Yzc4NTVjN2NiMjdiOWNlOGE4YzFlMGY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzhiNmE4MWU5ZDVhOWYzZTZlZGUyNmI1MzU1YmQxODY5MjdkMGRhNjg2MTJk
|
14
|
+
MWJhZDNiNDQyY2E1YTg1NzlmM2FkODViMmNlZTRiYzhlMWEwOWVjMmRhZDZi
|
15
|
+
ZDBhMzAwODQzYjM1MTBiYWIxNWI2YjNjYzBlM2Y0MGZjYzYyODc=
|
data/benchmarks/simple_model.rb
CHANGED
@@ -1,40 +1,95 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require 'benchmark'
|
3
|
+
require 'simple_model'
|
4
|
+
|
1
5
|
class BenchClass < SimpleModel::Base
|
6
|
+
has_attribute :foo
|
7
|
+
has_boolean :bool
|
2
8
|
has_int :num
|
3
|
-
has_date :date, :default => :today
|
9
|
+
has_date :date, :default => :today, :allow_blank => false
|
10
|
+
has_time :time, :allow_blank => true
|
11
|
+
has_float :float, :default => 0.0
|
4
12
|
has_decimal :dec
|
5
13
|
|
6
14
|
def today
|
7
15
|
Date.today
|
8
16
|
end
|
9
17
|
end
|
10
|
-
|
11
|
-
|
18
|
+
|
19
|
+
puts `ruby -v`
|
20
|
+
Benchmark.bmbm do |b|
|
21
|
+
b.report("init") do
|
12
22
|
30000.times.each do
|
13
23
|
BenchClass.new()
|
14
24
|
end
|
15
25
|
end
|
16
26
|
|
17
|
-
b.report("
|
27
|
+
b.report("init w/attrs") do
|
18
28
|
30000.times.each do
|
19
|
-
BenchClass.new(:
|
29
|
+
BenchClass.new(:foo => nil,
|
30
|
+
:bool => false,
|
31
|
+
:num => 1,
|
32
|
+
:dec => "12.4",
|
33
|
+
:time => Time.now,
|
34
|
+
:float => 1.0
|
35
|
+
)
|
20
36
|
end
|
21
37
|
end
|
22
38
|
|
23
39
|
b.report("get") do
|
24
40
|
30000.times.each do
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
41
|
+
bc = BenchClass.new
|
42
|
+
bc.foo
|
43
|
+
bc.bool
|
44
|
+
bc.num
|
45
|
+
bc.dec
|
46
|
+
bc.date
|
47
|
+
bc.time
|
48
|
+
bc.float
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
b.report("get?") do
|
53
|
+
30000.times.each do
|
54
|
+
bc = BenchClass.new
|
55
|
+
bc.foo?
|
56
|
+
bc.bool?
|
57
|
+
bc.num?
|
58
|
+
bc.dec?
|
59
|
+
bc.date?
|
60
|
+
bc.time?
|
61
|
+
bc.float?
|
29
62
|
end
|
30
63
|
end
|
31
64
|
|
32
65
|
b.report("set") do
|
33
66
|
30000.times.each do
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
67
|
+
bc = BenchClass.new
|
68
|
+
bc.foo = nil
|
69
|
+
bc.bool = true
|
70
|
+
bc.num = 1
|
71
|
+
bc.dec = '12.4'
|
72
|
+
bc.date = "" # check blank
|
73
|
+
bc.time = Time.now
|
74
|
+
bc.float = 10.0
|
38
75
|
end
|
39
76
|
end
|
40
77
|
end
|
78
|
+
|
79
|
+
# ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]
|
80
|
+
|
81
|
+
# Rehearsal ------------------------------------------------
|
82
|
+
# init 1.360000 0.000000 1.360000 ( 1.364654)
|
83
|
+
# init w/attrs 2.510000 0.000000 2.510000 ( 2.512509)
|
84
|
+
# get 1.620000 0.000000 1.620000 ( 1.619021)
|
85
|
+
# get? 1.700000 0.000000 1.700000 ( 1.697857)
|
86
|
+
# set 2.720000 0.000000 2.720000 ( 2.724271)
|
87
|
+
# --------------------------------------- total: 9.910000sec
|
88
|
+
|
89
|
+
# user system total real
|
90
|
+
# init 1.350000 0.000000 1.350000 ( 1.352561)
|
91
|
+
# init w/attrs 2.530000 0.010000 2.540000 ( 2.532518)
|
92
|
+
# get 1.610000 0.000000 1.610000 ( 1.613509)
|
93
|
+
# get? 1.690000 0.000000 1.690000 ( 1.693701)
|
94
|
+
# set 2.700000 0.000000 2.700000 ( 2.698375)
|
95
|
+
|
data/gemfiles/4.2.gemfile
CHANGED
@@ -3,8 +3,26 @@ module SimpleModel
|
|
3
3
|
include ExtendCore
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
include ActiveModel::AttributeMethods
|
6
|
+
include ActiveModel::Dirty
|
7
|
+
|
8
|
+
DEFAULT_ATTRIBUTE_SETTINGS = {:attributes_method => :attributes,
|
9
|
+
:allow_blank => false,
|
10
|
+
:initialize => true
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
AVAILABLE_ATTRIBUTE_METHODS = {
|
14
|
+
:has_attribute => {:alias => :has_attributes, :options => {:allow_blank => true}},
|
15
|
+
:has_boolean => {:cast_to => :to_b, :alias => :has_booleans, :options => {:allow_blank => true, :boolean => true}},
|
16
|
+
:has_currency => {:cast_to => :to_d, :alias => :has_currencies},
|
17
|
+
:has_date => {:cast_to => :to_date, :alias => :has_dates} ,
|
18
|
+
:has_decimal => {:cast_to => :to_d, :alias => :has_decimals},
|
19
|
+
:has_float => {:cast_to => :to_f, :alias => :has_floats},
|
20
|
+
:has_int => {:cast_to => :to_i, :alias => :has_ints},
|
21
|
+
:has_time => {:cast_to => :to_time, :alias => :has_times}
|
22
|
+
}.freeze
|
23
|
+
|
6
24
|
attr_accessor :attributes
|
7
|
-
|
25
|
+
|
8
26
|
def initialize(*attrs)
|
9
27
|
attrs = attrs.extract_options!
|
10
28
|
attrs = attributes_for_init(attrs)
|
@@ -36,50 +54,68 @@ module SimpleModel
|
|
36
54
|
end
|
37
55
|
alias :set_attributes :set
|
38
56
|
|
39
|
-
def set_attribute(attr,val)
|
40
|
-
|
41
|
-
if allow_attribute_action?(val,
|
42
|
-
allow_blank =
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
val = options[:on_set].call(self,val) if options.key?(:on_set)
|
57
|
+
def set_attribute(attr,val,opts=nil)
|
58
|
+
opts ||= fetch_attribute_options(attr)
|
59
|
+
if allow_attribute_action?(val,opts)
|
60
|
+
allow_blank = opts[:allow_blank]
|
61
|
+
val = fetch_default_value(opts[:default]) unless skip_set_default?(attr,opts,val)
|
62
|
+
unless (opts[:boolean] ? (!allow_blank && val.blank? && (val != false)) : (!allow_blank && val.blank?))
|
63
|
+
val = opts[:on_set].call(self,val) if opts.key?(:on_set)
|
47
64
|
send("#{attr}_will_change!") if (initialized?(attr) && val != attributes[attr])
|
48
65
|
attributes[attr] = val
|
49
|
-
|
66
|
+
opts[:after_set].call(self,val) if opts[:after_set]
|
50
67
|
end
|
51
68
|
end
|
52
69
|
end
|
53
70
|
|
54
|
-
def get_attribute(attr)
|
71
|
+
def get_attribute(attr,opts=nil)
|
72
|
+
opts ||= fetch_attribute_options(attr)
|
55
73
|
val = attributes[attr]
|
56
|
-
|
57
|
-
if
|
58
|
-
|
59
|
-
end
|
60
|
-
if options[:on_get]
|
61
|
-
options[:on_get].call(self,val)
|
74
|
+
val = attributes[attr] ||= fetch_default_value(opts[:default]) unless skip_get_default?(attr,opts,val)
|
75
|
+
if opts[:on_get]
|
76
|
+
opts[:on_get].call(self,val)
|
62
77
|
else
|
63
78
|
val
|
64
79
|
end
|
65
80
|
end
|
66
81
|
|
82
|
+
def fetch_attribute_options(attr)
|
83
|
+
self.class.defined_attributes[attr] || {}
|
84
|
+
end
|
85
|
+
|
67
86
|
def get_attribute?(attr)
|
68
|
-
return false unless val =
|
87
|
+
return false unless val = send(attr)
|
69
88
|
if val.respond_to?(:blank?)
|
70
89
|
return !val.blank?
|
71
|
-
elsif val.respond_to?(:to_b)
|
90
|
+
elsif val.respond_to?(:to_b)
|
72
91
|
return val.to_b
|
73
92
|
end
|
74
93
|
!val.nil?
|
75
94
|
end
|
76
95
|
|
77
|
-
private
|
78
|
-
|
79
96
|
def attribute_defined?(attr)
|
80
97
|
self.class.attribute_defined?(attr)
|
81
98
|
end
|
82
99
|
|
100
|
+
# Rails 3.2 + required when searching for attributes in from inherited classes/models
|
101
|
+
def attribute(attr)
|
102
|
+
get_attribute(attr)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def skip_get_default?(attr,opts,val)
|
108
|
+
(val || !opts.key?(:default) || (opts[:boolean] && (val == false)))
|
109
|
+
end
|
110
|
+
|
111
|
+
def skip_set_default?(attr,opts,val)
|
112
|
+
return true if (!opts.key?(:default) ||
|
113
|
+
initialized?(attr) ||
|
114
|
+
(opts[:boolean] && (val == false)))
|
115
|
+
blnk = val.blank?
|
116
|
+
(!blnk || (blnk && opts[:allow_blank]))
|
117
|
+
end
|
118
|
+
|
83
119
|
def fetch_default_value(arg)
|
84
120
|
return send(arg) if (arg.is_a?(Symbol) && self.respond_to?(arg))
|
85
121
|
arg
|
@@ -104,57 +140,40 @@ module SimpleModel
|
|
104
140
|
end
|
105
141
|
|
106
142
|
def attributes_have_alias?(attrs,attr)
|
107
|
-
|
143
|
+
base_meth = self.class.alias_attributes.rassoc(attr.to_sym)
|
144
|
+
base_meth && attrs.key?(base_meth[0])
|
145
|
+
#!(self.class.alias_attributes.select{ |a, m| (m == attr.to_sym && attrs.key?(a)) }).empty?
|
108
146
|
end
|
109
147
|
|
110
148
|
def allow_attribute_action?(val,options)
|
111
149
|
return true unless (options[:if] || options[:unless])
|
112
150
|
b = true
|
113
|
-
opt = options[:if]
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
151
|
+
if opt = options[:if]
|
152
|
+
if opt.is_a?(Symbol)
|
153
|
+
if opt == :blank
|
154
|
+
b = val.blank?
|
155
|
+
else
|
156
|
+
b = send(opt)
|
157
|
+
end
|
158
|
+
elsif opt.is_a?(Proc)
|
159
|
+
b = opt.call(self,val)
|
119
160
|
end
|
120
|
-
elsif opt.is_a?(Proc)
|
121
|
-
b = opt.call(self,val)
|
122
161
|
end
|
123
|
-
opt = options[:unless]
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
162
|
+
if opt = options[:unless]
|
163
|
+
if opt.is_a?(Symbol)
|
164
|
+
if opt == :blank
|
165
|
+
b = !val.blank?
|
166
|
+
else
|
167
|
+
b = !send(opt)
|
168
|
+
end
|
169
|
+
elsif opt.is_a?(Proc)
|
170
|
+
b = !opt.call(self,val)
|
129
171
|
end
|
130
|
-
elsif opt.is_a?(Proc)
|
131
|
-
b = !opt.call(self,val)
|
132
172
|
end
|
133
173
|
b
|
134
174
|
end
|
135
175
|
|
136
|
-
# Rails 3.2 + required when searching for attributes in from inherited classes/models
|
137
|
-
def attribute(attr)
|
138
|
-
get_attribute(attr)
|
139
|
-
end
|
140
|
-
|
141
176
|
module ClassMethods
|
142
|
-
DEFAULT_ATTRIBUTE_SETTINGS = {:attributes_method => :attributes,
|
143
|
-
:allow_blank => false,
|
144
|
-
:initialize => true
|
145
|
-
}.freeze
|
146
|
-
|
147
|
-
AVAILABLE_ATTRIBUTE_METHODS = {
|
148
|
-
:has_attribute => {:alias => :has_attributes, :options => {:allow_blank => true}},
|
149
|
-
:has_boolean => {:cast_to => :to_b, :alias => :has_booleans, :options => {:allow_blank => true}},
|
150
|
-
:has_currency => {:cast_to => :to_d, :alias => :has_currencies},
|
151
|
-
:has_date => {:cast_to => :to_date, :alias => :has_dates} ,
|
152
|
-
:has_decimal => {:cast_to => :to_d, :alias => :has_decimals},
|
153
|
-
:has_float => {:cast_to => :to_f, :alias => :has_floats},
|
154
|
-
:has_int => {:cast_to => :to_i, :alias => :has_ints},
|
155
|
-
:has_time => {:cast_to => :to_time, :alias => :has_times}
|
156
|
-
}.freeze
|
157
|
-
|
158
177
|
AVAILABLE_ATTRIBUTE_METHODS.each do |method,method_options|
|
159
178
|
define_method(method) do |*attributes|
|
160
179
|
options = attributes.extract_options!
|
@@ -163,7 +182,7 @@ module SimpleModel
|
|
163
182
|
options[:on_set] = lambda {|obj,val| val.send(method_options[:cast_to]) } if method_options[:cast_to]
|
164
183
|
create_attribute_methods(attributes,options)
|
165
184
|
end
|
166
|
-
module_eval("alias #{method_options[:alias]} #{method}")
|
185
|
+
module_eval("alias #{method_options[:alias]} #{method}") if method_options[:alias]
|
167
186
|
end
|
168
187
|
|
169
188
|
# Creates a new instance where the attributes store is set to object
|
@@ -251,7 +270,7 @@ module SimpleModel
|
|
251
270
|
|
252
271
|
def define_reader_with_options(attr,options)
|
253
272
|
define_method(attr) do
|
254
|
-
get_attribute(attr)
|
273
|
+
get_attribute(attr,options)
|
255
274
|
end
|
256
275
|
define_method("#{attr}?") do
|
257
276
|
get_attribute?(attr)
|
@@ -263,14 +282,14 @@ module SimpleModel
|
|
263
282
|
# initialized.
|
264
283
|
def define_setter_with_options(attr,options)
|
265
284
|
define_method("#{attr}=") do |val|
|
266
|
-
set_attribute(attr,val)
|
285
|
+
set_attribute(attr,val,options)
|
267
286
|
end
|
268
287
|
end
|
269
288
|
|
270
289
|
# Creates alias setter and getter for the supplied attribute using the supplied alias
|
271
290
|
# See spec for example.
|
272
291
|
def alias_attribute(new_alias,attr)
|
273
|
-
|
292
|
+
|
274
293
|
# get to the base attribute
|
275
294
|
while alias_attributes[attr]
|
276
295
|
attr = alias_attributes[attr]
|
@@ -331,7 +350,7 @@ module SimpleModel
|
|
331
350
|
base.alias_attributes = alias_attributes.merge(base.alias_attributes)
|
332
351
|
super
|
333
352
|
# Rails 3.0 Hack
|
334
|
-
if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR
|
353
|
+
if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR < 1)
|
335
354
|
base.attribute_method_suffix '_changed?', '_change', '_will_change!', '_was'
|
336
355
|
base.attribute_method_affix :prefix => 'reset_', :suffix => '!'
|
337
356
|
end
|
@@ -343,7 +362,6 @@ module SimpleModel
|
|
343
362
|
# ActiveModel::Dirty included
|
344
363
|
def self.included(base)
|
345
364
|
base.extend(Attributes::ClassMethods)
|
346
|
-
base.send(:include, ActiveModel::Dirty)
|
347
365
|
base.send(:include, ActiveModel::Validations)
|
348
366
|
base.send(:include, ActiveModel::Conversion)
|
349
367
|
base.extend ActiveModel::Naming
|
@@ -351,7 +369,7 @@ module SimpleModel
|
|
351
369
|
base.send(:include, ActiveModel::Validations::Callbacks)
|
352
370
|
|
353
371
|
# Rails 3.0 Hack
|
354
|
-
if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR
|
372
|
+
if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR < 1)
|
355
373
|
base.attribute_method_suffix '_changed?', '_change', '_will_change!', '_was'
|
356
374
|
base.attribute_method_affix :prefix => 'reset_', :suffix => '!'
|
357
375
|
end
|
data/lib/simple_model/version.rb
CHANGED
data/spec/attributes_spec.rb
CHANGED
@@ -1,335 +1,503 @@
|
|
1
1
|
require 'spec_helper.rb'
|
2
2
|
|
3
|
+
class AttributesTest
|
4
|
+
include SimpleModel::Attributes
|
5
|
+
end
|
6
|
+
|
3
7
|
describe SimpleModel::Attributes do
|
4
|
-
|
5
|
-
|
8
|
+
|
9
|
+
# We need a clean class for each spec
|
10
|
+
around(:each) do |example|
|
11
|
+
class AttributesTest
|
6
12
|
include SimpleModel::Attributes
|
7
|
-
has_attributes :test1,:test2
|
8
13
|
end
|
9
|
-
@init = TestInit.new(:test1 => "1", :test2 => '2')
|
10
|
-
end
|
11
14
|
|
12
|
-
|
13
|
-
@init.test1.should eql("1")
|
14
|
-
@init.test2.should eql("2")
|
15
|
-
end
|
15
|
+
example.run
|
16
16
|
|
17
|
-
|
18
|
-
@init.attributes.should be_kind_of(ActiveSupport::HashWithIndifferentAccess)
|
19
|
-
@init.attributes[:test1].should eql("1")
|
20
|
-
@init.attributes[:test2].should eql("2")
|
17
|
+
Object.send(:remove_const,:AttributesTest) if defined?(:AttributesTest)
|
21
18
|
end
|
22
19
|
|
23
|
-
context
|
24
|
-
before(:all) do
|
25
|
-
class TestInit
|
26
|
-
include SimpleModel::Attributes
|
27
|
-
# Do not initialize blank attributes
|
28
|
-
self.before_initialize = lambda {|obj,attrs| attrs.select{|k,v| !v.blank?}}
|
29
|
-
has_attribute :far
|
30
|
-
end
|
31
|
-
end
|
20
|
+
context "class methods" do
|
32
21
|
|
33
|
-
|
34
|
-
|
35
|
-
|
22
|
+
describe '#create_attribute_methods' do
|
23
|
+
context "no options" do
|
24
|
+
before(:each) do
|
25
|
+
AttributesTest.create_attribute_methods([:has_foo],{})
|
26
|
+
end
|
36
27
|
|
37
|
-
|
38
|
-
t = TestInit.new(:far => "")
|
39
|
-
t.initialized?(:far).should eql(false)
|
40
|
-
t = TestInit.new(:far => "t")
|
41
|
-
t.initialized?(:far).should eql(true)
|
42
|
-
end
|
28
|
+
let(:attributes_test) { AttributesTest.new() }
|
43
29
|
|
44
|
-
|
30
|
+
it {expect(attributes_test).to respond_to(:has_foo)}
|
31
|
+
it {expect(attributes_test).to respond_to(:has_foo=)}
|
32
|
+
it {expect(attributes_test).to respond_to(:has_foo?)}
|
33
|
+
it "should set the value" do
|
34
|
+
expect(attributes_test.has_foo = "test").to eql("test")
|
35
|
+
end
|
45
36
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
37
|
+
it "should get the value" do
|
38
|
+
attributes_test.has_foo = "test"
|
39
|
+
expect(attributes_test.has_foo).to eql("test")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should get? boolean value" do
|
43
|
+
expect(attributes_test).to_not be_has_foo
|
44
|
+
attributes_test.has_foo = "test"
|
45
|
+
expect(attributes_test).to be_has_foo
|
46
|
+
end
|
53
47
|
end
|
54
|
-
end
|
55
48
|
|
56
|
-
|
57
|
-
lambda {TestInit.after_initialize = "bad stuff"}.should raise_error
|
58
|
-
end
|
49
|
+
context "options set" do
|
59
50
|
|
60
|
-
|
61
|
-
t = TestInit.new(:far => "")
|
62
|
-
t.car.should eql("test")
|
63
|
-
end
|
51
|
+
context "with default" do
|
64
52
|
|
65
|
-
|
53
|
+
context "with initialize == true" do
|
54
|
+
before(:each) do
|
55
|
+
AttributesTest.create_attribute_methods([:with_default], {:default => "foo", :initialize => true})
|
56
|
+
end
|
66
57
|
|
67
|
-
|
68
|
-
it "should use the provided object as the attribute store" do
|
69
|
-
my_store = {:test1 => 1,:test2 => 2}
|
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
|
-
end
|
75
|
-
end
|
58
|
+
let(:attributes_test) { AttributesTest.new() }
|
76
59
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
60
|
+
it "should work" do
|
61
|
+
expect(attributes_test.attributes[:with_default]).to eql('foo')
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with initialize == false" do
|
67
|
+
before(:each) do
|
68
|
+
AttributesTest.create_attribute_methods([:with_default_no_init], {:default => "foo", :initialize => false})
|
69
|
+
end
|
70
|
+
|
71
|
+
let(:attributes_test) { AttributesTest.new() }
|
72
|
+
|
73
|
+
it "should work" do
|
74
|
+
expect(attributes_test.attributes).to_not have_key(:with_default_no_init)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should set on get" do
|
78
|
+
expect(attributes_test.with_default_no_init).to eql('foo')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "set to a symbol for a method" do
|
83
|
+
before(:each) do
|
84
|
+
AttributesTest.send(:define_method, :default_method) do
|
85
|
+
Date.today
|
86
|
+
end
|
87
|
+
|
88
|
+
AttributesTest.create_attribute_methods([:with_default_method], {:default => :default_method})
|
89
|
+
end
|
90
|
+
let(:attributes_test) { AttributesTest.new() }
|
91
|
+
|
92
|
+
it { expect(attributes_test.with_default_method).to eql(Date.today) }
|
93
|
+
end
|
87
94
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
95
|
+
context "set to a non-method symbol" do
|
96
|
+
before(:each) do
|
97
|
+
AttributesTest.create_attribute_methods([:with_default_sym], {:default => :_foo})
|
98
|
+
end
|
99
|
+
|
100
|
+
let(:attributes_test) { AttributesTest.new() }
|
101
|
+
|
102
|
+
it { expect(attributes_test.with_default_sym).to eql(:_foo) }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "with on_set" do
|
107
|
+
before(:each) do
|
108
|
+
AttributesTest.create_attribute_methods([:with_on_set], {:on_set => lambda {|obj,val| val.to_i } })
|
109
|
+
end
|
110
|
+
|
111
|
+
let(:attributes_test) { AttributesTest.new(:with_on_set => "1") }
|
112
|
+
|
113
|
+
it {expect(attributes_test.with_on_set).to eql(1)}
|
114
|
+
end
|
115
|
+
|
116
|
+
context "with allow_blank == false" do
|
117
|
+
before(:each) do
|
118
|
+
AttributesTest.create_attribute_methods([:prevent_blank], {:allow_blank => false})
|
119
|
+
end
|
120
|
+
|
121
|
+
let(:attributes_test) { AttributesTest.new(:prevent_blank => "") }
|
122
|
+
|
123
|
+
it "should not initialize" do
|
124
|
+
expect(attributes_test.attributes).to_not have_key(:prevent_blank)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should allow setting with non-blank value" do
|
128
|
+
attributes_test.prevent_blank = "not blank"
|
129
|
+
expect(attributes_test.prevent_blank).to eql("not blank")
|
130
|
+
attributes_test.prevent_blank = nil
|
131
|
+
expect(attributes_test.prevent_blank).to eql("not blank")
|
132
|
+
attributes_test.prevent_blank = 1
|
133
|
+
expect(attributes_test.prevent_blank).to eql(1)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
context "with allow_blank == false and boolean == true" do
|
138
|
+
before(:each) do
|
139
|
+
AttributesTest.create_attribute_methods([:allow_false_boolean], {:allow_blank => false, :boolean => true})
|
140
|
+
end
|
141
|
+
let(:attributes_test) { AttributesTest.new(:allow_false_boolean => "") }
|
142
|
+
|
143
|
+
it "should not initialize" do
|
144
|
+
expect(attributes_test.attributes).to_not have_key(:allow_false_boolean)
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should allow setting with non-blank value" do
|
148
|
+
attributes_test.allow_false_boolean = 1
|
149
|
+
expect(attributes_test.allow_false_boolean).to eql(1)
|
150
|
+
attributes_test.allow_false_boolean = nil
|
151
|
+
expect(attributes_test.allow_false_boolean).to eql(1)
|
152
|
+
attributes_test.allow_false_boolean = false
|
153
|
+
expect(attributes_test.allow_false_boolean).to eql(false)
|
154
|
+
end
|
101
155
|
end
|
102
156
|
|
103
|
-
|
104
|
-
"
|
157
|
+
context "with :if" do
|
158
|
+
context "set to a proc" do
|
159
|
+
before(:each) do
|
160
|
+
AttributesTest.has_date :if_proc, :if => lambda {|obj,val| !val.blank?}
|
161
|
+
end
|
162
|
+
|
163
|
+
it {expect(AttributesTest.new(:if_proc => nil)).to_not be_initialized(:if_proc)}
|
164
|
+
|
165
|
+
it {expect(AttributesTest.new(:if_proc => "2014-05-01")).to be_initialized(:if_proc)}
|
166
|
+
end
|
167
|
+
|
168
|
+
context "set to a :blank" do
|
169
|
+
before(:each) do
|
170
|
+
AttributesTest.has_attribute :if_blank, :if => :blank
|
171
|
+
end
|
172
|
+
it "init" do
|
173
|
+
init = AttributesTest.new(:if_blank => "")
|
174
|
+
expect(init).to be_initialized(:if_blank)
|
175
|
+
|
176
|
+
end
|
177
|
+
it {expect(AttributesTest.new(:if_blank => nil)).to be_initialized(:if_blank)}
|
178
|
+
it {expect(AttributesTest.new(:if_blank => "foo")).to_not be_initialized(:if_blank)}
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
context "set to a symbol" do
|
183
|
+
before(:each) do
|
184
|
+
AttributesTest.has_attribute :if_attr_1, :if => :if_true
|
185
|
+
AttributesTest.has_attribute :if_attr_2, :if => :if_false
|
186
|
+
|
187
|
+
AttributesTest.send :define_method, :if_true do
|
188
|
+
true
|
189
|
+
end
|
190
|
+
|
191
|
+
AttributesTest.send :define_method, :if_false do
|
192
|
+
false
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
let(:attributes_test) { AttributesTest.new(:if_attr_1 => "test", :if_attr_2 => "test" ) }
|
197
|
+
it {expect(attributes_test).to be_initialized(:if_attr_1)}
|
198
|
+
it {expect(attributes_test).to_not be_initialized(:if_attr_2)}
|
199
|
+
end
|
105
200
|
end
|
201
|
+
|
202
|
+
context "with :unless" do
|
203
|
+
context "set to a proc" do
|
204
|
+
before(:each) do
|
205
|
+
AttributesTest.has_date :unless_proc, :unless => lambda {|obj,val| val.blank?}
|
206
|
+
end
|
207
|
+
|
208
|
+
it {expect(AttributesTest.new(:unless_proc => nil)).to_not be_initialized(:unless_proc)}
|
209
|
+
|
210
|
+
it {expect(AttributesTest.new(:unless_proc => "2014-05-01")).to be_initialized(:unless_proc)}
|
211
|
+
end
|
212
|
+
|
213
|
+
context "set to a :blank" do
|
214
|
+
before(:each) do
|
215
|
+
AttributesTest.has_attribute :unless_blank, :unless => :blank
|
216
|
+
end
|
217
|
+
|
218
|
+
it {expect(AttributesTest.new(:unless_blank => "")).to_not be_initialized(:unless_blank)}
|
219
|
+
it {expect(AttributesTest.new(:unless_blank => nil)).to_not be_initialized(:unless_blank)}
|
220
|
+
it {expect(AttributesTest.new(:unless_blank => "foo")).to be_initialized(:unless_blank)}
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
context "set to a symbol" do
|
225
|
+
before(:each) do
|
226
|
+
AttributesTest.has_attribute :unless_attr_1, :unless => :unless_true
|
227
|
+
AttributesTest.has_attribute :unless_attr_2, :unless => :unless_false
|
228
|
+
|
229
|
+
AttributesTest.send :define_method, :unless_true do
|
230
|
+
true
|
231
|
+
end
|
232
|
+
|
233
|
+
AttributesTest.send :define_method, :unless_false do
|
234
|
+
false
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
let(:attributes_test) { AttributesTest.new(:unless_attr_1 => "test", :unless_attr_2 => "test" ) }
|
239
|
+
it {expect(attributes_test).to_not be_initialized(:unless_attr_1)}
|
240
|
+
it {expect(attributes_test).to be_initialized(:unless_attr_2)}
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end # end with options
|
244
|
+
end # end #create_attribute_methods
|
245
|
+
|
246
|
+
describe '#has_attribute' do
|
247
|
+
it {expect(AttributesTest).to respond_to(:has_attribute)}
|
248
|
+
|
249
|
+
before(:each) do
|
250
|
+
AttributesTest.has_attribute(:test_attr)
|
106
251
|
end
|
107
252
|
|
108
|
-
|
253
|
+
let(:attributes_test) { AttributesTest.new() }
|
109
254
|
|
110
|
-
|
111
|
-
@default = TestDefault.new
|
112
|
-
end
|
255
|
+
it {expect(attributes_test).to respond_to(:test_attr)}
|
113
256
|
|
114
|
-
it "should define setter method" do
|
115
|
-
@default.respond_to?(:foo=).should eql(true)
|
116
257
|
end
|
117
258
|
|
118
|
-
|
119
|
-
|
120
|
-
end
|
259
|
+
describe '#has_boolean' do
|
260
|
+
it {expect(AttributesTest).to respond_to(:has_boolean)}
|
121
261
|
|
122
|
-
|
123
|
-
|
124
|
-
@default.attributes[:tip].should be_nil
|
125
|
-
@default.tip.should eql("2")
|
262
|
+
before(:each) do
|
263
|
+
AttributesTest.has_boolean(:test_bool)
|
126
264
|
end
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
265
|
+
let(:attributes_test) { AttributesTest.new() }
|
266
|
+
|
267
|
+
it {expect(attributes_test).to respond_to(:test_bool)}
|
268
|
+
|
269
|
+
it "should cast to a boolean" do
|
270
|
+
attributes_test.test_bool = "false"
|
271
|
+
expect(attributes_test.test_bool).to eql(false)
|
272
|
+
|
273
|
+
attributes_test.test_bool = "true"
|
274
|
+
expect(attributes_test.test_bool).to eql(true)
|
132
275
|
end
|
133
276
|
end
|
134
277
|
|
135
|
-
|
136
|
-
|
137
|
-
end
|
278
|
+
describe '#has_date' do
|
279
|
+
it {expect(AttributesTest).to respond_to(:has_date)}
|
138
280
|
|
139
|
-
|
140
|
-
|
141
|
-
|
281
|
+
before(:each) do
|
282
|
+
AttributesTest.has_date(:test_date)
|
283
|
+
end
|
142
284
|
|
143
|
-
|
144
|
-
@default.my_array.should eql([])
|
145
|
-
end
|
285
|
+
let(:attributes_test) { AttributesTest.new() }
|
146
286
|
|
147
|
-
|
148
|
-
@default.respond_to?(:foo?).should eql(true)
|
149
|
-
end
|
287
|
+
it {expect(attributes_test).to respond_to(:test_date)}
|
150
288
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
@default.my_array?.should eql(true)
|
289
|
+
it "should cast to a date" do
|
290
|
+
attributes_test.test_date = "2014-12-22"
|
291
|
+
expect(attributes_test.test_date).to be_a(Date)
|
292
|
+
end
|
156
293
|
end
|
157
294
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
end
|
295
|
+
describe '#has_decimal' do
|
296
|
+
it {expect(AttributesTest).to respond_to(:has_decimal)}
|
297
|
+
|
298
|
+
before(:each) do
|
299
|
+
AttributesTest.has_decimal(:test_deci)
|
300
|
+
end
|
165
301
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
302
|
+
let(:attributes_test) { AttributesTest.new() }
|
303
|
+
|
304
|
+
it {expect(attributes_test).to respond_to(:test_deci)}
|
305
|
+
|
306
|
+
it "should cast to a decimal" do
|
307
|
+
attributes_test.test_deci = "1.0"
|
308
|
+
expect(attributes_test.test_deci).to be_a(BigDecimal)
|
309
|
+
end
|
170
310
|
end
|
171
|
-
end
|
172
311
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
312
|
+
describe '#has_float' do
|
313
|
+
it {expect(AttributesTest).to respond_to(:has_float)}
|
314
|
+
|
315
|
+
before(:each) do
|
316
|
+
AttributesTest.has_float(:test_float)
|
317
|
+
end
|
318
|
+
|
319
|
+
let(:attributes_test) { AttributesTest.new() }
|
320
|
+
|
321
|
+
it {expect(attributes_test).to respond_to(:test_float)}
|
322
|
+
|
323
|
+
it "should cast to a float" do
|
324
|
+
attributes_test.test_float = "1.0"
|
325
|
+
expect(attributes_test.test_float).to be_a(Float)
|
186
326
|
end
|
187
327
|
end
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
expect(num_date_time.initialized?(:my_int)).to eql(false)
|
195
|
-
expect(num_date_time.initialized?(:my_decimal)).to eql(false)
|
196
|
-
expect(num_date_time.initialized?(:my_float)).to eql(false)
|
197
|
-
end
|
328
|
+
|
329
|
+
describe '#has_int' do
|
330
|
+
it {expect(AttributesTest).to respond_to(:has_int)}
|
331
|
+
|
332
|
+
before(:each) do
|
333
|
+
AttributesTest.has_int(:test_int)
|
198
334
|
end
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
335
|
+
|
336
|
+
let(:attributes_test) { AttributesTest.new() }
|
337
|
+
|
338
|
+
it {expect(attributes_test).to respond_to(:test_int)}
|
339
|
+
|
340
|
+
it "should cast to a float" do
|
341
|
+
attributes_test.test_int = "1"
|
342
|
+
expect(attributes_test.test_int).to be_a(Fixnum)
|
205
343
|
end
|
206
344
|
end
|
207
345
|
|
208
|
-
|
209
|
-
it
|
210
|
-
|
211
|
-
|
212
|
-
|
346
|
+
describe '#has_time' do
|
347
|
+
it {expect(AttributesTest).to respond_to(:has_time)}
|
348
|
+
|
349
|
+
before(:each) do
|
350
|
+
AttributesTest.has_time(:test_time)
|
351
|
+
end
|
352
|
+
|
353
|
+
let(:attributes_test) { AttributesTest.new() }
|
354
|
+
|
355
|
+
it {expect(attributes_test).to respond_to(:test_time)}
|
356
|
+
|
357
|
+
it "should cast to a date" do
|
358
|
+
attributes_test.test_time = "2014-12-22"
|
359
|
+
expect(attributes_test.test_time).to be_a(Time)
|
213
360
|
end
|
214
361
|
end
|
215
|
-
end
|
216
362
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
363
|
+
describe '#alias_attribute' do
|
364
|
+
before(:each) do
|
365
|
+
AttributesTest.has_attribute :base_foo
|
366
|
+
AttributesTest.alias_attribute :alias_foo, :base_foo
|
367
|
+
end
|
368
|
+
|
369
|
+
context "attribute is not defined" do
|
370
|
+
it { expect {AttributesTest.alias_attribute :alias_foo, :nope}.to raise_error(SimpleModel::UndefinedAttribute) }
|
371
|
+
end
|
372
|
+
|
373
|
+
it "should work" do
|
374
|
+
test_alias = AttributesTest.new(:alias_foo => "foo")
|
375
|
+
expect(test_alias.alias_foo).to eql("foo")
|
376
|
+
expect(test_alias.base_foo).to eql("foo")
|
223
377
|
end
|
224
378
|
end
|
225
|
-
|
226
|
-
|
227
|
-
|
379
|
+
|
380
|
+
end # end class methods
|
381
|
+
|
382
|
+
|
383
|
+
|
384
|
+
context "initializing" do
|
385
|
+
|
386
|
+
before(:each) do
|
387
|
+
AttributesTest.has_attributes :test1,:test2
|
228
388
|
end
|
229
389
|
|
230
|
-
|
231
|
-
|
232
|
-
|
390
|
+
let(:init_test) { AttributesTest.new(:test1 => '1', :test2 => '2') }
|
391
|
+
|
392
|
+
|
393
|
+
it { expect(init_test.test1).to eql('1') }
|
394
|
+
it { expect(init_test.test2).to eql('2') }
|
395
|
+
|
396
|
+
describe '#attributes' do
|
397
|
+
it { expect(init_test).to respond_to(:attributes) }
|
398
|
+
it { expect(init_test.attributes).to be_a(HashWithIndifferentAccess)}
|
233
399
|
end
|
234
|
-
end
|
235
400
|
|
236
|
-
context "on get" do
|
237
|
-
it "should perform on_get when set" do
|
238
|
-
class OnGet
|
239
|
-
include SimpleModel::Attributes
|
240
|
-
has_attribute :foo, :on_get => lambda{|obj,attr| (attr.blank? ? obj.send(:foo_default) : attr)}
|
241
401
|
|
242
|
-
|
243
|
-
|
244
|
-
|
402
|
+
|
403
|
+
describe '#before_initialize' do
|
404
|
+
|
405
|
+
context "before_initialize is not a Proc" do
|
406
|
+
it { expect {AttributesTest.before_initialize = "bad stuff"}.to raise_error }
|
245
407
|
end
|
246
408
|
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
end
|
409
|
+
before(:each) do
|
410
|
+
# Do not initialize blank attributes
|
411
|
+
AttributesTest.before_initialize = lambda {|obj,attrs| attrs.select{|k,v| !v.blank?}}
|
412
|
+
AttributesTest.has_attribute :before_init
|
413
|
+
end
|
253
414
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
include SimpleModel::Attributes
|
258
|
-
has_attribute :foo, :default => "bar"
|
259
|
-
alias_attribute(:bar,:foo)
|
415
|
+
it "should work" do
|
416
|
+
expect(AttributesTest.new(:before_init => "")).to_not be_initialized(:before_init)
|
417
|
+
expect(AttributesTest.new(:before_init => "t")).to be_initialized(:before_init)
|
260
418
|
end
|
419
|
+
|
261
420
|
end
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
t = TestAlias.new(:foo => "foo")
|
268
|
-
t.bar.should eql("foo")
|
269
|
-
t.foo.should eql('foo')
|
421
|
+
|
422
|
+
describe '#after_initialize' do
|
423
|
+
|
424
|
+
context "before_initialize is not a Proc" do
|
425
|
+
it { expect {AttributesTest.after_initialize = "bad stuff"}.to raise_error }
|
270
426
|
end
|
271
|
-
end
|
272
|
-
end
|
273
427
|
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
has_boolean :bar
|
279
|
-
has_attribute :str, :stuff
|
280
|
-
has_currency :amount, :default => BigDecimal("0.0"), :initialize => false
|
281
|
-
has_dates :some, :thing, :default => :fetch_date, :allow_blank => false, :initialize => false
|
282
|
-
alias_attribute :other, :bar
|
283
|
-
alias_attribute :other_amount, :amount
|
284
|
-
|
285
|
-
def fetch_date
|
286
|
-
Date.today
|
287
|
-
end
|
428
|
+
before(:each) do
|
429
|
+
# Do not initialize blank attributes
|
430
|
+
AttributesTest.after_initialize = lambda { |obj| obj.after_init = "test" if obj.after_init.blank?}
|
431
|
+
AttributesTest.has_attribute :after_init
|
288
432
|
end
|
289
433
|
|
290
|
-
|
291
|
-
|
292
|
-
has_int :str
|
434
|
+
it "should work" do
|
435
|
+
expect(AttributesTest.new(:after_init => "").after_init).to eql("test")
|
293
436
|
end
|
294
437
|
|
295
|
-
|
296
|
-
|
438
|
+
end
|
439
|
+
|
440
|
+
describe '#new_with_store'do
|
441
|
+
it "should work" do
|
442
|
+
my_store = {:test1 => 1,:test2 => 2}
|
443
|
+
nw = AttributesTest.new_with_store(my_store)
|
444
|
+
expect(AttributesTest.new_with_store(my_store).attributes.object_id).to eql(my_store.object_id)
|
297
445
|
end
|
446
|
+
end
|
298
447
|
|
448
|
+
end
|
449
|
+
|
450
|
+
context "inheritance" do
|
451
|
+
class MyBase
|
452
|
+
include SimpleModel::Attributes
|
453
|
+
has_boolean :bar
|
454
|
+
has_attribute :str, :stuff
|
455
|
+
has_currency :amount, :default => BigDecimal("0.0"), :initialize => false
|
456
|
+
has_dates :some, :thing, :default => :fetch_date, :allow_blank => false, :initialize => false
|
457
|
+
alias_attribute :other, :bar
|
458
|
+
alias_attribute :other_amount, :amount
|
459
|
+
|
460
|
+
def fetch_date
|
461
|
+
Date.today
|
462
|
+
end
|
299
463
|
end
|
464
|
+
|
465
|
+
class NewerBase < MyBase
|
466
|
+
has_boolean :foo
|
467
|
+
has_int :str
|
468
|
+
end
|
469
|
+
|
470
|
+
class NewestBase < NewerBase
|
471
|
+
alias_attribute :some_amount, :other_amount
|
472
|
+
end
|
473
|
+
|
300
474
|
it "should merge defined attributes when class are inherited" do
|
301
|
-
NewerBase.
|
302
|
-
|
303
|
-
|
475
|
+
expect(NewerBase).to be_attribute_defined(:bar)
|
476
|
+
newer_base = NewerBase.new
|
477
|
+
expect(newer_base).to respond_to(:bar_will_change!)
|
304
478
|
end
|
305
479
|
|
306
480
|
it "should set defaults that were not initialized should work from parent class" do
|
307
|
-
|
308
|
-
|
309
|
-
|
481
|
+
newer_base = NewerBase.new
|
482
|
+
expect(newer_base.some).to eql(newer_base.send(:fetch_date))
|
483
|
+
expect(newer_base.thing).to eql(newer_base.send(:fetch_date))
|
310
484
|
end
|
311
485
|
|
312
486
|
it "should allow redefining methods in child classes" do
|
313
|
-
|
314
|
-
|
315
|
-
|
487
|
+
newer_base = NewerBase.new
|
488
|
+
newer_base.str = '1'
|
489
|
+
expect(newer_base.str).to eql(1)
|
316
490
|
end
|
317
491
|
|
318
492
|
it "should set attribute from alias" do
|
319
|
-
MyBase.new(:other => true).
|
320
|
-
NewerBase.new(:other => true).
|
493
|
+
expect(MyBase.new(:other => true)).to be_bar
|
494
|
+
expect(NewerBase.new(:other => true)).to be_bar
|
321
495
|
end
|
322
496
|
|
323
497
|
it "should properly alias attributes from parent class" do
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
after(:all) do
|
331
|
-
[:OnGet,:TestDefault,:TestInit,:MyBase,:NewerBase].each do |test_klass|
|
332
|
-
Object.send(:remove_const,test_klass) if defined?(test_klass)
|
498
|
+
newer_base = NewestBase.new(:some_amount => 1.0)
|
499
|
+
expect(newer_base.other_amount).to eql(1.0.to_d)
|
500
|
+
expect(newer_base.amount).to eql(1.0.to_d)
|
333
501
|
end
|
334
502
|
end
|
335
503
|
end
|