activerecord-typedstore 0.3.0 → 0.3.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c3d4b1b4f103d05dc3371d1e8ebeb7f666ac227
4
- data.tar.gz: 33f47581329169894a7c7c9f3b79cec592b62eb4
3
+ metadata.gz: e093bbab4aa7f56fe8b248cbc6b3ffee4c896523
4
+ data.tar.gz: 101fbbb8b13b3687010ce3543e371be6b4561ff1
5
5
  SHA512:
6
- metadata.gz: 6e35186b4dfbc9b54984d4e5a350035ecc8c64136f827ab3762586aeb14477699d2035fcce317d113402c393c068103acdddd23415ec6d69f879040d1831c111
7
- data.tar.gz: b32badf3a634ba1aa2b572129622e9a4a2650bfefef3fbf470ee37f891c0080225d1fdb054aa0089b299dd6d0e051c26b62cb02e061e415e5b9fb3877b6ac228
6
+ metadata.gz: 81ccdf476b884892c67460b9945784d593e50380a7e452452d0a3b54a60f82c3e39cf8a70f64bd154f01337ecac60675866f525aaf6d39a1536ed551c971d10b
7
+ data.tar.gz: da7fc4fc81c1cd22156b78dad835ee14ec788b9cdc69f7d2ccc839dc0e9f77fb5a024cf13dc159db43e297d6251f6e579759a061f2287fd85443bf23fc9b6a6b
data/.travis.yml CHANGED
@@ -8,4 +8,7 @@ gemfile:
8
8
 
9
9
  before_script:
10
10
  - mysql -e 'create database typed_store_test;'
11
- - psql -c 'create database typed_store_test;' -U postgres
11
+
12
+ env:
13
+ - TIMEZONE_AWARE=1 POSTGRES=1 MYSQL=1 POSTGRES_URL=$(curl http://api.postgression.com)
14
+ - TIMEZONE_AWARE=0 POSTGRES=1 MYSQL=1 POSTGRES_URL=$(curl http://api.postgression.com)
data/README.md CHANGED
@@ -36,7 +36,7 @@ class Shop < ActiveRecord::Base
36
36
  s.string :email
37
37
  s.datetime :publish_at
38
38
  s.integer :age, null: false
39
-
39
+
40
40
  # You can define array attributes like in rails 4 and postgres
41
41
  s.string :tags, array: true, default: [], null: false
42
42
 
@@ -92,3 +92,8 @@ If not, please fill an issue.
92
92
  3. Commit your changes (`git commit -am 'Add some feature'`)
93
93
  4. Push to the branch (`git push origin my-new-feature`)
94
94
  5. Create new Pull Request
95
+
96
+ ## TODO
97
+
98
+ - HStore support with ActiveRecord 4.1.0.beta (master)
99
+ - Handle casting and default at the store layer, so accessors are not mandatory anymore. See #4
data/Rakefile CHANGED
@@ -4,3 +4,21 @@ require 'rspec/core/rake_task'
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task :default => :spec
7
+
8
+ namespace :spec do
9
+ task :all do
10
+ %w(3.2 4.0 edge).each do |ar_version|
11
+ [1, 0].each do |timezone_aware|
12
+ command = %W{
13
+ BUNDLE_GEMFILE=gemfiles/Gemfile.ar-#{ar_version}
14
+ TIMEZONE_AWARE=#{timezone_aware}
15
+ MYSQL=1
16
+ POSTGRES=1
17
+ rspec
18
+ }.join(' ')
19
+ puts command
20
+ puts `#{command}`
21
+ end
22
+ end
23
+ end
24
+ end
@@ -10,8 +10,10 @@ module ActiveRecord::TypedStore
10
10
  extend ActiveSupport::Concern
11
11
 
12
12
  included do
13
- class_attribute :stored_typed_attributes, instance_accessor: false
14
- self.stored_typed_attributes = {}
13
+ class_attribute :typed_stores, instance_accessor: false
14
+ class_attribute :typed_store_attributes, instance_accessor: false
15
+ self.typed_stores = {}
16
+ self.typed_store_attributes = {}
15
17
  end
16
18
 
17
19
  module ClassMethods
@@ -19,10 +21,15 @@ module ActiveRecord::TypedStore
19
21
  def typed_store(store_attribute, options={}, &block)
20
22
  dsl = DSL.new(&block)
21
23
 
22
- store(store_attribute, options.merge(accessors: dsl.column_names))
24
+ if hstore?(store_attribute)
25
+ store_accessor(store_attribute, dsl.column_names)
26
+ else
27
+ store(store_attribute, options.merge(accessors: dsl.column_names))
28
+ end
23
29
 
24
- stored_typed_attributes[store_attribute] ||= {}
25
- stored_typed_attributes[store_attribute].merge!(dsl.columns.index_by(&:name))
30
+ typed_stores[store_attribute] ||= {}
31
+ typed_stores[store_attribute].merge!(dsl.columns.index_by(&:name))
32
+ typed_store_attributes.merge!(dsl.columns.index_by { |c| c.name.to_s })
26
33
 
27
34
  dsl.column_names.each { |c| define_virtual_attribute_method(c.to_s) }
28
35
  dsl.column_names.each { |c| define_store_attribute_queries(store_attribute, c) }
@@ -34,6 +41,15 @@ module ActiveRecord::TypedStore
34
41
 
35
42
  private
36
43
 
44
+ def hstore?(store_attribute)
45
+ columns_hash[store_attribute.to_s].try(:type) == :hstore
46
+ end
47
+
48
+ def create_time_zone_conversion_attribute?(name, column)
49
+ column ||= typed_store_attributes[name]
50
+ super(name, column)
51
+ end
52
+
37
53
  def define_store_attribute_queries(store_attribute, column_name)
38
54
  define_method("#{column_name}?") do
39
55
  query_store_attribute(store_attribute, column_name)
@@ -50,6 +66,11 @@ module ActiveRecord::TypedStore
50
66
  protected
51
67
 
52
68
  def write_store_attribute(store_attribute, key, value)
69
+ column = store_column_definition(store_attribute, key)
70
+ if column.try(:type) == :datetime && self.class.time_zone_aware_attributes && value.respond_to?(:in_time_zone)
71
+ value = value.in_time_zone
72
+ end
73
+
53
74
  previous_value = read_store_attribute(store_attribute, key)
54
75
  casted_value = cast_store_attribute(store_attribute, key, value)
55
76
  attribute_will_change!(key.to_s) if casted_value != previous_value
@@ -64,7 +85,7 @@ module ActiveRecord::TypedStore
64
85
  end
65
86
 
66
87
  def store_column_definition(store_attribute, key)
67
- store_definition = self.class.stored_typed_attributes[store_attribute]
88
+ store_definition = self.class.typed_stores[store_attribute]
68
89
  store_definition && store_definition[key]
69
90
  end
70
91
 
@@ -77,7 +98,7 @@ module ActiveRecord::TypedStore
77
98
  end
78
99
 
79
100
  def reload_stores!
80
- self.class.stored_typed_attributes.keys.each do |store_attribute|
101
+ self.class.typed_stores.keys.each do |store_attribute|
81
102
  instance_variable_set("@_#{store_attribute}_initialized", false)
82
103
  end
83
104
  end
@@ -86,7 +107,7 @@ module ActiveRecord::TypedStore
86
107
  store = defined?(super) ? super : send(store_attribute)
87
108
  store.tap do |store|
88
109
  if_store_uninitialized(store_attribute) do
89
- if columns = self.class.stored_typed_attributes[store_attribute]
110
+ if columns = self.class.typed_stores[store_attribute]
90
111
  initialize_store(store, columns.values)
91
112
  end
92
113
  end
@@ -113,14 +134,8 @@ module ActiveRecord::TypedStore
113
134
  when false, nil then false
114
135
  else
115
136
  column = store_column_definition(store_attribute, key)
116
- if column.nil?
117
- if Numeric === value || value !~ /[^0-9]/
118
- !value.to_i.zero?
119
- else
120
- return false if ActiveRecord::ConnectionAdapters::Column::FALSE_VALUES.include?(value)
121
- !value.blank?
122
- end
123
- elsif column.number?
137
+
138
+ if column.number?
124
139
  !value.zero?
125
140
  else
126
141
  !value.blank?
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module TypedStore
3
- VERSION = '0.3.0'
3
+ VERSION = '0.3.1'
4
4
  end
5
5
  end
@@ -1,9 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- ar_version = Gem::Version.new(ActiveRecord::VERSION::STRING)
4
- ar_4_0 = Gem::Version.new('4.0')
5
- ar_4_1 = Gem::Version.new('4.1.0.beta')
6
-
7
3
  shared_examples 'any model' do
8
4
 
9
5
  let(:model) { described_class.new }
@@ -26,19 +22,6 @@ shared_examples 'any model' do
26
22
 
27
23
  end
28
24
 
29
- describe 'attribute presence' do
30
-
31
- it 'return true if present' do
32
- expect(model.age?).to be_true
33
- end
34
-
35
- it 'return false if blank' do
36
- model.age = 0
37
- expect(model.age?).to be_false
38
- end
39
-
40
- end
41
-
42
25
  describe 'dirty tracking' do
43
26
 
44
27
  it 'track changed attributes' do
@@ -113,6 +96,19 @@ shared_examples 'any model' do
113
96
  expect(model.reload.name).to be == '42'
114
97
  end
115
98
 
99
+ it 'any string is considered present' do
100
+ model.name = 'Peter Gibbons'
101
+ expect(model.name?).to be_true
102
+ end
103
+
104
+ it 'empty string is not considered present' do
105
+ expect(model.name?).to be_false
106
+ end
107
+
108
+ it 'nil is not considered present' do
109
+ expect(model.cell_phone?).to be_false
110
+ end
111
+
116
112
  end
117
113
 
118
114
  describe 'boolean attribute' do
@@ -162,6 +158,19 @@ shared_examples 'any model' do
162
158
  expect(model.reload.enabled).to be_true
163
159
  end
164
160
 
161
+ it 'true is considered present' do
162
+ expect(model.enabled?).to be_true
163
+ end
164
+
165
+ it 'false is not considered present' do
166
+ expect(model.public?).to be_false
167
+ end
168
+
169
+ it 'nil is not considered present' do
170
+ model.update_attributes(enabled: nil)
171
+ expect(model.enabled?).to be_false
172
+ end
173
+
165
174
  end
166
175
 
167
176
  describe 'integer attributes' do
@@ -185,6 +194,25 @@ shared_examples 'any model' do
185
194
  expect(model.reload.max_length).to be_nil
186
195
  end
187
196
 
197
+ it 'positive values are considered present' do
198
+ expect(model.age?).to be_true
199
+ end
200
+
201
+ it 'negative values are considered present' do
202
+ model.age = -42
203
+ expect(model.age?).to be_true
204
+ end
205
+
206
+ it '0 is not considered present' do
207
+ model.age = 0
208
+ expect(model.age?).to be_false
209
+ end
210
+
211
+ it 'nil is not considered present' do
212
+ model.max_length = nil
213
+ expect(model.max_length?).to be_false
214
+ end
215
+
188
216
  end
189
217
 
190
218
  describe 'float attributes' do
@@ -208,6 +236,24 @@ shared_examples 'any model' do
208
236
  expect(model.reload.price).to be_nil
209
237
  end
210
238
 
239
+ it 'positive values are considered present' do
240
+ model.rate = 4.2
241
+ expect(model.rate?).to be_true
242
+ end
243
+
244
+ it 'negative values are considered present' do
245
+ model.rate = -4.2
246
+ expect(model.rate?).to be_true
247
+ end
248
+
249
+ it '0 is not considered present' do
250
+ expect(model.rate?).to be_false
251
+ end
252
+
253
+ it 'nil is not considered present' do
254
+ expect(model.price?).to be_false
255
+ end
256
+
211
257
  end
212
258
 
213
259
  describe 'decimal attributes' do
@@ -240,6 +286,25 @@ shared_examples 'any model' do
240
286
  expect(model.reload.shipping_cost).to be_nil
241
287
  end
242
288
 
289
+ it 'positive values are considered present' do
290
+ model.shipping_cost = BigDecimal.new('4.2')
291
+ expect(model.shipping_cost?).to be_true
292
+ end
293
+
294
+ it 'negative values are considered present' do
295
+ model.shipping_cost = BigDecimal.new('-4.2')
296
+ expect(model.shipping_cost?).to be_true
297
+ end
298
+
299
+ it '0 is not considered present' do
300
+ model.shipping_cost = BigDecimal.new('0')
301
+ expect(model.shipping_cost?).to be_false
302
+ end
303
+
304
+ it 'nil is not considered present' do
305
+ expect(model.shipping_cost?).to be_false
306
+ end
307
+
243
308
  end
244
309
 
245
310
  describe 'date attributes' do
@@ -270,17 +335,26 @@ shared_examples 'any model' do
270
335
  expect(model.reload.remind_on).to be_nil
271
336
  end
272
337
 
338
+ it 'any non-nil value is considered present' do
339
+ model.remind_on = Date.new
340
+ expect(model.remind_on?).to be_true
341
+ end
342
+
343
+ it 'nil is not considered present' do
344
+ expect(model.remind_on?).to be_false
345
+ end
346
+
273
347
  end
274
348
 
275
349
  describe 'datetime attributes' do
276
350
 
277
351
  let(:datetime) { DateTime.new(1984, 6, 8, 13, 57, 12) }
278
352
  let(:datetime_string) { '1984-06-08 13:57:12' }
279
- let(:time) { Time.parse(datetime_string) }
353
+ let(:time) { datetime_string.respond_to?(:in_time_zone) ? datetime_string.in_time_zone : Time.parse(datetime_string) }
280
354
 
281
355
  context "with ActiveRecord #{ActiveRecord::VERSION::STRING}" do
282
356
 
283
- if ar_version < ar_4_0
357
+ if AR_VERSION < AR_4_0
284
358
 
285
359
  it 'has the defined default as initial value' do
286
360
  model.save
@@ -316,10 +390,22 @@ shared_examples 'any model' do
316
390
  expect(model.reload.published_at).to be == datetime
317
391
  end
318
392
 
319
- it 'properly cast assigned value to datetime' do
320
- model.remind_at = datetime_string
321
- expect(model.remind_at).to be == datetime
393
+ if ActiveRecord::Base.time_zone_aware_attributes
394
+
395
+ it 'properly cast assigned value to time' do
396
+ model.remind_at = datetime_string
397
+ expect(model.remind_at).to be == time
398
+ end
399
+
400
+ else
401
+
402
+ it 'properly cast assigned value to datetime' do
403
+ model.remind_at = datetime_string
404
+ expect(model.remind_at).to be == datetime
405
+ end
406
+
322
407
  end
408
+
323
409
  end
324
410
 
325
411
  end
@@ -334,11 +420,20 @@ shared_examples 'any model' do
334
420
  expect(model.reload.remind_at).to be_nil
335
421
  end
336
422
 
423
+ it 'any non-nil value is considered present' do
424
+ model.remind_at = DateTime.new
425
+ expect(model.remind_at?).to be_true
426
+ end
427
+
428
+ it 'nil is not considered present' do
429
+ expect(model.remind_at?).to be_false
430
+ end
431
+
337
432
  end
338
433
 
339
434
  end
340
435
 
341
- shared_examples 'a store' do
436
+ shared_examples 'a store' do |retain_type=true|
342
437
 
343
438
  let(:model) { described_class.new }
344
439
 
@@ -396,7 +491,7 @@ shared_examples 'a store' do
396
491
  expect(model.reload.author).to be == 'George'
397
492
 
398
493
  model.update_attributes(author: 42)
399
- expect(model.reload.author).to be == 42
494
+ expect(model.reload.author).to be == (retain_type ? 42 : '42')
400
495
  end
401
496
 
402
497
  it 'still handle default' do
@@ -420,7 +515,7 @@ shared_examples 'a db backed model' do
420
515
 
421
516
  end
422
517
 
423
- shared_examples 'a model supporting arrays' do |regular=false|
518
+ shared_examples 'a model supporting arrays' do |pg_native=false|
424
519
 
425
520
  let(:model) { described_class.new }
426
521
 
@@ -430,7 +525,7 @@ shared_examples 'a model supporting arrays' do |regular=false|
430
525
  end
431
526
 
432
527
  it 'cast values inside the array (integer)' do
433
- pending('ActiveRecord bug: https://github.com/rails/rails/pull/11245') if regular
528
+ pending('ActiveRecord bug: https://github.com/rails/rails/pull/11245') if pg_native
434
529
  model.update_attributes(grades: ['1', 2, 3.4])
435
530
  expect(model.reload.grades).to be == [1, 2, 3]
436
531
  end
@@ -450,14 +545,14 @@ shared_examples 'a model supporting arrays' do |regular=false|
450
545
  expect(model.reload.grades).to be == []
451
546
  end
452
547
 
453
- if !regular || ar_version == ar_4_1
548
+ if !pg_native || AR_VERSION == AR_4_1
454
549
  it 'accept multidimensianl arrays' do
455
550
  model.update_attributes(grades: [[1, 2], [3, 4]])
456
551
  expect(model.reload.grades).to be == [[1, 2], [3, 4]]
457
552
  end
458
553
  end
459
554
 
460
- if regular
555
+ if pg_native
461
556
 
462
557
  it 'raise on non rectangular multidimensianl arrays' do
463
558
  expect{
@@ -487,6 +582,7 @@ shared_examples 'a model supporting arrays' do |regular=false|
487
582
 
488
583
  end
489
584
 
585
+
490
586
  describe Sqlite3RegularARModel do
491
587
  it_should_behave_like 'any model'
492
588
  it_should_behave_like 'a db backed model'
@@ -495,13 +591,28 @@ end
495
591
  describe MysqlRegularARModel do
496
592
  it_should_behave_like 'any model'
497
593
  it_should_behave_like 'a db backed model'
498
- end
594
+ end if defined?(MysqlRegularARModel)
499
595
 
500
596
  describe PostgresqlRegularARModel do
501
597
  it_should_behave_like 'any model'
502
598
  it_should_behave_like 'a db backed model'
503
- it_should_behave_like 'a model supporting arrays', true if ar_version >= ar_4_0
504
- end
599
+ it_should_behave_like 'a model supporting arrays', true if AR_VERSION >= AR_4_0
600
+ end if defined?(PostgresqlRegularARModel)
601
+
602
+ describe PostgresHstoreTypedStoreModel do
603
+ if AR_VERSION >= AR_4_0
604
+ pending('TODO: Rails edge HStore compatibiliy')
605
+ else
606
+ it_should_behave_like 'any model'
607
+ it_should_behave_like 'a store', false
608
+ end
609
+ end if defined?(PostgresHstoreTypedStoreModel)
610
+
611
+ describe PostgresJsonTypedStoreModel do
612
+ it_should_behave_like 'any model'
613
+ it_should_behave_like 'a store'
614
+ it_should_behave_like 'a model supporting arrays'
615
+ end if defined?(PostgresJsonTypedStoreModel)
505
616
 
506
617
  describe YamlTypedStoreModel do
507
618
  it_should_behave_like 'any model'
@@ -2,6 +2,11 @@ require 'active_record'
2
2
  require 'json'
3
3
  require 'yaml'
4
4
 
5
+ AR_VERSION = Gem::Version.new(ActiveRecord::VERSION::STRING)
6
+ AR_4_0 = Gem::Version.new('4.0')
7
+ AR_4_1 = Gem::Version.new('4.1.0.beta')
8
+
9
+ ActiveRecord::Base.time_zone_aware_attributes = ENV['TIMEZONE_AWARE'] != '0'
5
10
  ActiveRecord::Base.configurations = {
6
11
  'test_sqlite3' => {adapter: 'sqlite3', database: "/tmp/typed_store.db"},
7
12
  'test_postgresql' => {adapter: 'postgresql', database: 'typed_store_test', username: 'postgres'},
@@ -53,11 +58,23 @@ class CreateAllTables < ActiveRecord::Migration
53
58
  end
54
59
 
55
60
  def self.up
56
- ActiveRecord::Base.establish_connection('test_mysql')
57
- recreate_table(:mysql_regular_ar_models) { |t| define_columns(t); t.text :untyped_settings }
61
+ if ENV['MYSQL']
62
+ ActiveRecord::Base.establish_connection('test_mysql')
63
+ recreate_table(:mysql_regular_ar_models) { |t| define_columns(t); t.text :untyped_settings }
64
+ end
65
+
66
+ if ENV['POSTGRES']
67
+ ActiveRecord::Base.establish_connection(ENV['POSTGRES_URL'] || 'test_postgresql')
68
+ recreate_table(:postgresql_regular_ar_models) { |t| define_columns(t); t.text :untyped_settings }
58
69
 
59
- ActiveRecord::Base.establish_connection('test_postgresql')
60
- recreate_table(:postgresql_regular_ar_models) { |t| define_columns(t); t.text :untyped_settings }
70
+ if AR_VERSION >= AR_4_0
71
+ execute "create extension if not exists hstore"
72
+ recreate_table(:postgres_hstore_typed_store_models) { |t| t.hstore :settings; t.text :untyped_settings }
73
+
74
+ #execute "create extension if not exists json"
75
+ recreate_table(:postgres_json_typed_store_models) { |t| t.json :settings; t.text :untyped_settings }
76
+ end
77
+ end
61
78
 
62
79
  ActiveRecord::Base.establish_connection('test_sqlite3')
63
80
  recreate_table(:sqlite3_regular_ar_models) { |t| define_columns(t); t.text :untyped_settings }
@@ -69,14 +86,68 @@ end
69
86
  ActiveRecord::Migration.verbose = false
70
87
  CreateAllTables.up
71
88
 
72
- class MysqlRegularARModel < ActiveRecord::Base
73
- establish_connection 'test_mysql'
74
- store :untyped_settings, accessors: [:title]
89
+ class ColumnCoder
90
+
91
+ def initialize(coder)
92
+ @coder = coder
93
+ end
94
+
95
+ def load(data)
96
+ return {} unless data
97
+ @coder.load(data)
98
+ end
99
+
100
+ def dump(data)
101
+ @coder.dump(data || {})
102
+ end
103
+
75
104
  end
76
105
 
77
- class PostgresqlRegularARModel < ActiveRecord::Base
78
- establish_connection 'test_postgresql'
79
- store :untyped_settings, accessors: [:title]
106
+ module AsJson
107
+ extend self
108
+
109
+ def load(value)
110
+ value
111
+ end
112
+
113
+ def dump(value)
114
+ value.as_json
115
+ end
116
+
117
+ end
118
+
119
+ if ENV['MYSQL']
120
+ class MysqlRegularARModel < ActiveRecord::Base
121
+ establish_connection 'test_mysql'
122
+ store :untyped_settings, accessors: [:title]
123
+ end
124
+ end
125
+
126
+ if ENV['POSTGRES']
127
+ class PostgresqlRegularARModel < ActiveRecord::Base
128
+ establish_connection ENV['POSTGRES_URL'] || 'test_postgresql'
129
+ store :untyped_settings, accessors: [:title]
130
+ end
131
+
132
+ if AR_VERSION >= AR_4_0
133
+
134
+ class PostgresHstoreTypedStoreModel < ActiveRecord::Base
135
+ establish_connection ENV['POSTGRES_URL'] || 'test_postgresql'
136
+ store :untyped_settings, accessors: [:title]
137
+ typed_store :settings do |s|
138
+ define_store_columns(s)
139
+ end
140
+ end
141
+
142
+ class PostgresJsonTypedStoreModel < ActiveRecord::Base
143
+ establish_connection ENV['POSTGRES_URL'] || 'test_postgresql'
144
+ store :untyped_settings, accessors: [:title]
145
+ typed_store :settings, coder: ColumnCoder.new(AsJson) do |s|
146
+ define_store_columns(s)
147
+ end
148
+ end
149
+
150
+ end
80
151
  end
81
152
 
82
153
  class Sqlite3RegularARModel < ActiveRecord::Base
@@ -92,23 +163,6 @@ class YamlTypedStoreModel < ActiveRecord::Base
92
163
  end
93
164
  end
94
165
 
95
- class ColumnCoder
96
-
97
- def initialize(coder)
98
- @coder = coder
99
- end
100
-
101
- def load(data)
102
- return {} unless data
103
- @coder.load(data)
104
- end
105
-
106
- def dump(data)
107
- @coder.dump(data || {})
108
- end
109
-
110
- end
111
-
112
166
  class JsonTypedStoreModel < ActiveRecord::Base
113
167
  establish_connection 'test_sqlite3'
114
168
  store :untyped_settings, accessors: [:title]
@@ -124,3 +178,15 @@ class MarshalTypedStoreModel < ActiveRecord::Base
124
178
  define_store_columns(s)
125
179
  end
126
180
  end
181
+
182
+
183
+ Models = [
184
+ Sqlite3RegularARModel,
185
+ YamlTypedStoreModel,
186
+ JsonTypedStoreModel,
187
+ MarshalTypedStoreModel
188
+ ]
189
+ Models << MysqlRegularARModel if defined?(MysqlRegularARModel)
190
+ Models << PostgresqlRegularARModel if defined?(PostgresqlRegularARModel)
191
+ Models << PostgresHstoreTypedStoreModel if defined?(PostgresHstoreTypedStoreModel)
192
+ Models << PostgresJsonTypedStoreModel if defined?(PostgresJsonTypedStoreModel)
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.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-09 00:00:00.000000000 Z
11
+ date: 2013-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord