activerecord-typedstore 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/gemfiles/Gemfile.ar-4.0 +0 -1
- data/gemfiles/Gemfile.ar-4.1 +0 -1
- data/lib/active_record/typed_store/dsl.rb +1 -1
- data/lib/active_record/typed_store/extension.rb +9 -1
- data/lib/active_record/typed_store/version.rb +1 -1
- data/spec/active_record/typed_store_spec.rb +68 -32
- data/spec/spec_helper.rb +0 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 805a07504ab5ed0b6a41983d945f5a0bdd649726
|
4
|
+
data.tar.gz: c09ffc9348aa4256c439645b7d36edb0b3951705
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c033c463261169f42b5ab7e1a4c0dade01d101c1f084695124b5e018131bbce84a389b34bfc9aedeec224383def213cd6cf4c78b609d820cffbf8fd1cdaf695
|
7
|
+
data.tar.gz: 6ed412a72266d529d32401c6ef99a7bfc85fd5d38cf7716f8e44035cc1b1250099b67e3aa9e153a5eab1e97e4a2669fa1f7596fa2fb271aa1404274fabf94020
|
data/gemfiles/Gemfile.ar-4.0
CHANGED
data/gemfiles/Gemfile.ar-4.1
CHANGED
@@ -14,7 +14,7 @@ module ActiveRecord::TypedStore
|
|
14
14
|
@columns.select(&:accessor?).map(&:name)
|
15
15
|
end
|
16
16
|
|
17
|
-
[:string, :integer, :float, :decimal, :datetime, :date, :boolean, :any].each do |type|
|
17
|
+
[:string, :text, :integer, :float, :decimal, :datetime, :date, :boolean, :any].each do |type|
|
18
18
|
define_method(type) do |name, options={}|
|
19
19
|
@columns << Column.new(name, type, options.reverse_merge(accessor: @accessors))
|
20
20
|
end
|
@@ -61,10 +61,17 @@ module ActiveRecord::TypedStore
|
|
61
61
|
return if @typed_store_attribute_methods_generated
|
62
62
|
store_accessors.each do |attribute|
|
63
63
|
define_virtual_attribute_method(attribute)
|
64
|
+
undefine_before_type_cast_method(attribute)
|
64
65
|
end
|
65
66
|
@typed_store_attribute_methods_generated = true
|
66
67
|
end
|
67
68
|
|
69
|
+
def undefine_before_type_cast_method(attribute)
|
70
|
+
# because it mess with ActionView forms, see #14.
|
71
|
+
method = "#{attribute}_before_type_cast"
|
72
|
+
undef_method(method) if method_defined?(method)
|
73
|
+
end
|
74
|
+
|
68
75
|
def store_accessors
|
69
76
|
return [] unless typed_store_attributes
|
70
77
|
typed_store_attributes.values.select(&:accessor?).map(&:name).map(&:to_s)
|
@@ -92,7 +99,8 @@ module ActiveRecord::TypedStore
|
|
92
99
|
end
|
93
100
|
|
94
101
|
previous_value = read_store_attribute(store_attribute, key)
|
95
|
-
|
102
|
+
new_value = column ? column.type_cast(value) : value
|
103
|
+
attribute_will_change!(key.to_s) if new_value != previous_value
|
96
104
|
super
|
97
105
|
end
|
98
106
|
|
@@ -27,7 +27,7 @@ shared_examples 'any model' do
|
|
27
27
|
|
28
28
|
it 'assign attributes received by #initialize' do
|
29
29
|
model = described_class.new(public: true)
|
30
|
-
expect(model.public).to
|
30
|
+
expect(model.public).to be true
|
31
31
|
end
|
32
32
|
|
33
33
|
end
|
@@ -65,6 +65,38 @@ shared_examples 'any model' do
|
|
65
65
|
}.to change { model.age }.from(24).to(12)
|
66
66
|
end
|
67
67
|
|
68
|
+
it 'does not dirty track assigning the same boolean' do
|
69
|
+
expect(model.enabled).to be true
|
70
|
+
expect {
|
71
|
+
model.enabled = true
|
72
|
+
}.to_not change { model.enabled_changed? }
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'dirty tracks when the boolean changes' do
|
76
|
+
expect(model.enabled).to be true
|
77
|
+
expect {
|
78
|
+
model.enabled = false
|
79
|
+
}.to change { model.enabled_changed? }.from(false).to(true)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'does not dirty track assigning the same boolean even if it is a string' do
|
83
|
+
expect(model.enabled).to be true
|
84
|
+
expect {
|
85
|
+
model.enabled = "true"
|
86
|
+
}.to_not change { model.enabled_changed? }
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'dirty tracks when the string changes' do
|
90
|
+
expect {
|
91
|
+
model.name = "Smith"
|
92
|
+
}.to change { model.name_changed? }.from(false).to(true)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'does not dirty track assigning the same string' do
|
96
|
+
expect {
|
97
|
+
model.name = ""
|
98
|
+
}.to_not change { model.name_changed? }
|
99
|
+
end
|
68
100
|
end
|
69
101
|
|
70
102
|
describe 'unknown attribute' do
|
@@ -108,15 +140,15 @@ shared_examples 'any model' do
|
|
108
140
|
|
109
141
|
it 'any string is considered present' do
|
110
142
|
model.name = 'Peter Gibbons'
|
111
|
-
expect(model.name?).to
|
143
|
+
expect(model.name?).to be true
|
112
144
|
end
|
113
145
|
|
114
146
|
it 'empty string is not considered present' do
|
115
|
-
expect(model.name?).to
|
147
|
+
expect(model.name?).to be false
|
116
148
|
end
|
117
149
|
|
118
150
|
it 'nil is not considered present' do
|
119
|
-
expect(model.cell_phone?).to
|
151
|
+
expect(model.cell_phone?).to be false
|
120
152
|
end
|
121
153
|
|
122
154
|
it 'not define the attributes more than one time' do
|
@@ -129,14 +161,14 @@ shared_examples 'any model' do
|
|
129
161
|
describe 'boolean attribute' do
|
130
162
|
|
131
163
|
it 'has the defined :default as initial value' do
|
132
|
-
expect(model.public).to
|
164
|
+
expect(model.public).to be false
|
133
165
|
end
|
134
166
|
|
135
167
|
[true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON'].each do |value|
|
136
168
|
|
137
169
|
it "cast `#{value.inspect}` as `true`" do
|
138
170
|
model.public = value
|
139
|
-
expect(model.public).to
|
171
|
+
expect(model.public).to be true
|
140
172
|
end
|
141
173
|
|
142
174
|
end
|
@@ -145,22 +177,22 @@ shared_examples 'any model' do
|
|
145
177
|
|
146
178
|
it "cast `#{value.inspect}` as `false`" do
|
147
179
|
model.public = value
|
148
|
-
expect(model.public).to
|
180
|
+
expect(model.public).to be false
|
149
181
|
end
|
150
182
|
|
151
183
|
end
|
152
184
|
|
153
185
|
it 'properly persit the value' do
|
154
186
|
model.update_attributes(public: false)
|
155
|
-
expect(model.reload.public).to
|
187
|
+
expect(model.reload.public).to be false
|
156
188
|
model.update_attributes(public: true)
|
157
|
-
expect(model.reload.public).to
|
189
|
+
expect(model.reload.public).to be true
|
158
190
|
end
|
159
191
|
|
160
192
|
it 'initialize with default value if the column is not nullable' do
|
161
|
-
expect(model.public).to
|
193
|
+
expect(model.public).to be false
|
162
194
|
model.save
|
163
|
-
expect(model.reload.public).to
|
195
|
+
expect(model.reload.public).to be false
|
164
196
|
end
|
165
197
|
|
166
198
|
it 'can store nil if the column is nullable' do
|
@@ -170,20 +202,20 @@ shared_examples 'any model' do
|
|
170
202
|
|
171
203
|
it 'save the default value if the column is nullable but the value not explictly set' do
|
172
204
|
model.save
|
173
|
-
expect(model.reload.enabled).to
|
205
|
+
expect(model.reload.enabled).to be true
|
174
206
|
end
|
175
207
|
|
176
208
|
it 'true is considered present' do
|
177
|
-
expect(model.enabled?).to
|
209
|
+
expect(model.enabled?).to be true
|
178
210
|
end
|
179
211
|
|
180
212
|
it 'false is not considered present' do
|
181
|
-
expect(model.public?).to
|
213
|
+
expect(model.public?).to be false
|
182
214
|
end
|
183
215
|
|
184
216
|
it 'nil is not considered present' do
|
185
217
|
model.update_attributes(enabled: nil)
|
186
|
-
expect(model.enabled?).to
|
218
|
+
expect(model.enabled?).to be false
|
187
219
|
end
|
188
220
|
|
189
221
|
end
|
@@ -210,22 +242,22 @@ shared_examples 'any model' do
|
|
210
242
|
end
|
211
243
|
|
212
244
|
it 'positive values are considered present' do
|
213
|
-
expect(model.age?).to
|
245
|
+
expect(model.age?).to be true
|
214
246
|
end
|
215
247
|
|
216
248
|
it 'negative values are considered present' do
|
217
249
|
model.age = -42
|
218
|
-
expect(model.age?).to
|
250
|
+
expect(model.age?).to be true
|
219
251
|
end
|
220
252
|
|
221
253
|
it '0 is not considered present' do
|
222
254
|
model.age = 0
|
223
|
-
expect(model.age?).to
|
255
|
+
expect(model.age?).to be false
|
224
256
|
end
|
225
257
|
|
226
258
|
it 'nil is not considered present' do
|
227
259
|
model.max_length = nil
|
228
|
-
expect(model.max_length?).to
|
260
|
+
expect(model.max_length?).to be false
|
229
261
|
end
|
230
262
|
|
231
263
|
end
|
@@ -253,20 +285,20 @@ shared_examples 'any model' do
|
|
253
285
|
|
254
286
|
it 'positive values are considered present' do
|
255
287
|
model.rate = 4.2
|
256
|
-
expect(model.rate?).to
|
288
|
+
expect(model.rate?).to be true
|
257
289
|
end
|
258
290
|
|
259
291
|
it 'negative values are considered present' do
|
260
292
|
model.rate = -4.2
|
261
|
-
expect(model.rate?).to
|
293
|
+
expect(model.rate?).to be true
|
262
294
|
end
|
263
295
|
|
264
296
|
it '0 is not considered present' do
|
265
|
-
expect(model.rate?).to
|
297
|
+
expect(model.rate?).to be false
|
266
298
|
end
|
267
299
|
|
268
300
|
it 'nil is not considered present' do
|
269
|
-
expect(model.price?).to
|
301
|
+
expect(model.price?).to be false
|
270
302
|
end
|
271
303
|
|
272
304
|
end
|
@@ -303,21 +335,21 @@ shared_examples 'any model' do
|
|
303
335
|
|
304
336
|
it 'positive values are considered present' do
|
305
337
|
model.shipping_cost = BigDecimal.new('4.2')
|
306
|
-
expect(model.shipping_cost?).to
|
338
|
+
expect(model.shipping_cost?).to be true
|
307
339
|
end
|
308
340
|
|
309
341
|
it 'negative values are considered present' do
|
310
342
|
model.shipping_cost = BigDecimal.new('-4.2')
|
311
|
-
expect(model.shipping_cost?).to
|
343
|
+
expect(model.shipping_cost?).to be true
|
312
344
|
end
|
313
345
|
|
314
346
|
it '0 is not considered present' do
|
315
347
|
model.shipping_cost = BigDecimal.new('0')
|
316
|
-
expect(model.shipping_cost?).to
|
348
|
+
expect(model.shipping_cost?).to be false
|
317
349
|
end
|
318
350
|
|
319
351
|
it 'nil is not considered present' do
|
320
|
-
expect(model.shipping_cost?).to
|
352
|
+
expect(model.shipping_cost?).to be false
|
321
353
|
end
|
322
354
|
|
323
355
|
end
|
@@ -352,11 +384,11 @@ shared_examples 'any model' do
|
|
352
384
|
|
353
385
|
it 'any non-nil value is considered present' do
|
354
386
|
model.remind_on = Date.new
|
355
|
-
expect(model.remind_on?).to
|
387
|
+
expect(model.remind_on?).to be true
|
356
388
|
end
|
357
389
|
|
358
390
|
it 'nil is not considered present' do
|
359
|
-
expect(model.remind_on?).to
|
391
|
+
expect(model.remind_on?).to be false
|
360
392
|
end
|
361
393
|
|
362
394
|
end
|
@@ -437,11 +469,11 @@ shared_examples 'any model' do
|
|
437
469
|
|
438
470
|
it 'any non-nil value is considered present' do
|
439
471
|
model.remind_at = DateTime.new
|
440
|
-
expect(model.remind_at?).to
|
472
|
+
expect(model.remind_at?).to be true
|
441
473
|
end
|
442
474
|
|
443
475
|
it 'nil is not considered present' do
|
444
|
-
expect(model.remind_at?).to
|
476
|
+
expect(model.remind_at?).to be false
|
445
477
|
end
|
446
478
|
|
447
479
|
end
|
@@ -489,6 +521,10 @@ shared_examples 'a store' do |retain_type=true|
|
|
489
521
|
|
490
522
|
end
|
491
523
|
|
524
|
+
it 'do not respond to <attribute>_before_type_cast' do
|
525
|
+
expect(model).to_not respond_to :nickname_before_type_cast
|
526
|
+
end
|
527
|
+
|
492
528
|
end
|
493
529
|
|
494
530
|
describe 'attributes without accessors' do
|
@@ -538,7 +574,7 @@ shared_examples 'a store' do |retain_type=true|
|
|
538
574
|
begin
|
539
575
|
model.class::SettingsHash.columns['brand_new'] = new_column
|
540
576
|
model.reload
|
541
|
-
expect(model.settings[:brand_new]).to
|
577
|
+
expect(model.settings[:brand_new]).to be true
|
542
578
|
ensure
|
543
579
|
model.class::SettingsHash.columns.delete('brand_new')
|
544
580
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -16,8 +16,5 @@ require 'activerecord-typedstore'
|
|
16
16
|
Dir[File.expand_path(File.join(File.dirname(__FILE__), 'support', '**', '*.rb'))].each { |f| require f }
|
17
17
|
|
18
18
|
RSpec.configure do |config|
|
19
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
20
|
-
config.run_all_when_everything_filtered = true
|
21
|
-
config.filter_run :focus
|
22
19
|
config.order = 'random'
|
23
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-typedstore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean Boussier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -189,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
189
|
version: '0'
|
190
190
|
requirements: []
|
191
191
|
rubyforge_project:
|
192
|
-
rubygems_version: 2.2.
|
192
|
+
rubygems_version: 2.2.2
|
193
193
|
signing_key:
|
194
194
|
specification_version: 4
|
195
195
|
summary: ActiveRecord::Store but with type definition
|