activerecord-turntable 3.1.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.travis.yml +25 -9
  4. data/CHANGELOG.md +25 -0
  5. data/Gemfile +2 -0
  6. data/Guardfile +1 -1
  7. data/README.md +202 -8
  8. data/Rakefile +42 -67
  9. data/activerecord-turntable.gemspec +3 -2
  10. data/gemfiles/rails5_0_0.gemfile +2 -0
  11. data/gemfiles/rails5_0_1.gemfile +2 -0
  12. data/gemfiles/rails5_0_2.gemfile +2 -0
  13. data/gemfiles/rails5_0_3.gemfile +2 -0
  14. data/gemfiles/rails5_0_4.gemfile +8 -0
  15. data/gemfiles/rails5_0_5.gemfile +8 -0
  16. data/gemfiles/rails5_1_0.gemfile +2 -0
  17. data/gemfiles/rails5_1_1.gemfile +2 -0
  18. data/gemfiles/rails5_1_2.gemfile +9 -0
  19. data/gemfiles/rails5_1_3.gemfile +9 -0
  20. data/gemfiles/rails5_1_4.gemfile +9 -0
  21. data/gemfiles/rails5_1_5.gemfile +9 -0
  22. data/lib/active_record/turntable.rb +10 -20
  23. data/lib/active_record/turntable/active_record_ext.rb +1 -1
  24. data/lib/active_record/turntable/active_record_ext/log_subscriber.rb +5 -1
  25. data/lib/active_record/turntable/active_record_ext/sequencer.rb +11 -11
  26. data/lib/active_record/turntable/active_record_ext/transactions.rb +5 -4
  27. data/lib/active_record/turntable/algorithm.rb +12 -0
  28. data/lib/active_record/turntable/algorithm/base.rb +6 -2
  29. data/lib/active_record/turntable/algorithm/hash_slot_algorithm.rb +35 -0
  30. data/lib/active_record/turntable/algorithm/modulo_algorithm.rb +3 -7
  31. data/lib/active_record/turntable/algorithm/range_algorithm.rb +3 -34
  32. data/lib/active_record/turntable/algorithm/range_bsearch_algorithm.rb +16 -28
  33. data/lib/active_record/turntable/base.rb +43 -39
  34. data/lib/active_record/turntable/cluster.rb +31 -29
  35. data/lib/active_record/turntable/cluster_helper_methods.rb +12 -2
  36. data/lib/active_record/turntable/cluster_registry.rb +7 -0
  37. data/lib/active_record/turntable/configuration.rb +50 -0
  38. data/lib/active_record/turntable/configuration/dsl.rb +79 -0
  39. data/lib/active_record/turntable/configuration/loader.rb +10 -0
  40. data/lib/active_record/turntable/configuration/loader/dsl.rb +23 -0
  41. data/lib/active_record/turntable/configuration/loader/yaml.rb +62 -0
  42. data/lib/active_record/turntable/configuration_methods.rb +26 -0
  43. data/lib/active_record/turntable/connection_proxy.rb +51 -40
  44. data/lib/active_record/turntable/{master_shard.rb → default_shard.rb} +6 -2
  45. data/lib/active_record/turntable/deprecation.rb +8 -0
  46. data/lib/active_record/turntable/error.rb +2 -1
  47. data/lib/active_record/turntable/migration.rb +3 -7
  48. data/lib/active_record/turntable/mixer.rb +10 -10
  49. data/lib/active_record/turntable/mixer/fader.rb +1 -1
  50. data/lib/active_record/turntable/pool_proxy.rb +5 -3
  51. data/lib/active_record/turntable/railtie.rb +11 -4
  52. data/lib/active_record/turntable/seq_shard.rb +8 -9
  53. data/lib/active_record/turntable/sequencer.rb +18 -43
  54. data/lib/active_record/turntable/sequencer/api.rb +3 -5
  55. data/lib/active_record/turntable/sequencer/barrage.rb +1 -2
  56. data/lib/active_record/turntable/sequencer/katsubushi.rb +27 -0
  57. data/lib/active_record/turntable/sequencer/mysql.rb +14 -6
  58. data/lib/active_record/turntable/sequencer_registry.rb +30 -0
  59. data/lib/active_record/turntable/shard.rb +31 -10
  60. data/lib/active_record/turntable/shard_registry.rb +36 -0
  61. data/lib/active_record/turntable/slave_registry.rb +21 -0
  62. data/lib/active_record/turntable/slave_shard.rb +9 -0
  63. data/lib/active_record/turntable/version.rb +1 -1
  64. data/lib/generators/templates/turntable.rb +50 -0
  65. data/lib/generators/templates/turntable.yml +18 -0
  66. metadata +54 -20
  67. data/lib/active_record/turntable/config.rb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 66d31edc8c786999ddb71e35bf5f64e3dd97978a
4
- data.tar.gz: 5cad32e83086caff4e7fdb1ad8c89e0393286c3e
2
+ SHA256:
3
+ metadata.gz: 5bd7f48754157e32eaaf254a518645b9d1cde4e31840dba63b927886bedb74ee
4
+ data.tar.gz: 529f08173f847218298a34ed9832163e1d129b003e8ba0ef201ca63d8333b029
5
5
  SHA512:
6
- metadata.gz: 5ec384d210033d0f2831b9db8381d422a913d8d2d736ecb1422b8870ee12624ff1f0eaadf46b13c3191e2c0f5d28bf6b8fef9ea9c83deaa54866e680ccd8d441
7
- data.tar.gz: 67c6d75b06df8ea9b3c5014d43454f3ec4ef7411123ce76b93fff053e37a2caf60ded5eea3f9eff31bc3d2e5f503514226ef82cc1180e0a01e812df05f3fe075
6
+ metadata.gz: 515cc5103600046d62ea3b91a5695787a2f34d423da084e15aa3dbef8accdba238abd4bb4fb4c4e2659cdbe9ac965f020afb2d6f75a84c4e097cff28e2f1d6cb
7
+ data.tar.gz: '0578e2aff069a944a6b512b04ae19d47fe2591813f9666f7324cb7d592a4febaa61b457dd71b75dfe8b592f1666bdf57880a3f552da0702c1362b64126db401c'
data/.gitignore CHANGED
@@ -1,6 +1,7 @@
1
1
  *.gem
2
2
  .bundle
3
3
  Gemfile.lock
4
+ vendor/bundle
4
5
  pkg/*
5
6
  .DS_Store
6
7
  doc
data/.travis.yml CHANGED
@@ -5,9 +5,10 @@ cache:
5
5
  bundler: true
6
6
 
7
7
  rvm:
8
- - 2.2.7
9
- - 2.3.4
10
- - 2.4.1
8
+ - 2.2.9
9
+ - 2.3.6
10
+ - 2.4.3
11
+ - 2.5.0
11
12
  - ruby-head
12
13
 
13
14
  gemfile:
@@ -15,15 +16,27 @@ gemfile:
15
16
  - gemfiles/rails5_0_1.gemfile
16
17
  - gemfiles/rails5_0_2.gemfile
17
18
  - gemfiles/rails5_0_3.gemfile
19
+ - gemfiles/rails5_0_4.gemfile
20
+ - gemfiles/rails5_0_5.gemfile
18
21
  - gemfiles/rails5_1_0.gemfile
19
22
  - gemfiles/rails5_1_1.gemfile
23
+ - gemfiles/rails5_1_2.gemfile
24
+ - gemfiles/rails5_1_3.gemfile
25
+ - gemfiles/rails5_1_4.gemfile
26
+ - gemfiles/rails5_1_5.gemfile
20
27
  - gemfiles/rails_edge.gemfile
21
28
 
22
29
  env:
23
30
  - SETUP_TASK=turntable:db:reset BUILD_TASK=spec
31
+ - SETUP_TASK=turntable:db:reset BUILD_TASK=spec SPEC_OPTS="--tag with_katsubushi"
24
32
  - SETUP_TASK=turntable:activerecord:setup BUILD_TASK=turntable:activerecord:test
25
33
 
26
- before_install: gem update --system
34
+ services:
35
+ - docker
36
+
37
+ before_install:
38
+ - docker run -d --name turntable-katsubushi -p 11212:11212 katsubushi/katsubushi:latest -worker-id 1
39
+ - gem update --system
27
40
 
28
41
  before_script:
29
42
  - bundle exec rake $SETUP_TASK
@@ -35,14 +48,17 @@ matrix:
35
48
  exclude:
36
49
  - rvm: ruby-head
37
50
  - gemfile: gemfiles/rails_edge.gemfile
38
- - rvm: 2.3.4
51
+ - rvm: 2.3.6
52
+ - rvm: 2.4.3
39
53
  include:
40
- - rvm: ruby-head
54
+ - rvm: 2.3.6
55
+ gemfile: gemfiles/rails5_1_5.gemfile
56
+ - rvm: 2.4.3
57
+ gemfile: gemfiles/rails5_1_5.gemfile
58
+ - rvm: 2.5.0
41
59
  gemfile: gemfiles/rails_edge.gemfile
42
- - rvm: 2.4.1
60
+ - rvm: ruby-head
43
61
  gemfile: gemfiles/rails_edge.gemfile
44
- - rvm: 2.3.4
45
- gemfile: gemfiles/rails5_1_1.gemfile
46
62
  allow_failures:
47
63
  - rvm: ruby-head
48
64
  - gemfile: gemfiles/rails_edge.gemfile
data/CHANGELOG.md CHANGED
@@ -1,3 +1,28 @@
1
+ ## activerecord-turntable 4.0.0 ##
2
+
3
+ ### Major Changes
4
+
5
+ * Supported rails versions are
6
+ * 5.0.0 to 5.0.5
7
+ * 5.1.0 to 5.1.5
8
+ * Configuration
9
+ * Added DSL configuration file: config/turntable.rb
10
+ * Added a new algorithm: `hash_slot`
11
+ * distributes like redis cluster.
12
+ * Added a new sequencer: `katsubushi`
13
+ * Support [katsubushi](https://github.com/kayac/go-katsubushi) as a sequencer backend.
14
+ * Support slave(read replica) connection. (Experimental feature)
15
+
16
+ ### Incompatible changes
17
+
18
+ * `RangeAlgorithm` is integrated to `RangeBsearchAlgorithm`.
19
+ * Changed `ConnectionProxy#with_master` behavior to `Fix connection to primary master database`.
20
+ * Old `ConnectionProxy#with_master` behavior(default model connection) is renamed to `ConnectionProxy#with_default_shard`
21
+
22
+ ### Internal Change
23
+
24
+ * Changed `AR::Base.turntable_configuration` to use `ActiveRecord::Turntable::Configuration` class instead of Hash.
25
+
1
26
  ## activerecord-turntable 3.1.0 ##
2
27
 
3
28
  ### Major Changes
data/Gemfile CHANGED
@@ -4,3 +4,5 @@ gemspec
4
4
 
5
5
  gem "activerecord", "~> 5.1.1"
6
6
  gem "activesupport", "~> 5.1.1"
7
+
8
+ gem "mysql2", "~> 0.4.4"
data/Guardfile CHANGED
@@ -2,7 +2,7 @@
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
4
  guard "rspec",
5
- cmd: "rspec",
5
+ cmd: "bundle exec rspec",
6
6
  all_after_pass: true,
7
7
  all_on_start: true do
8
8
  watch(%r{^spec/.+_spec\.rb$})
data/README.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/activerecord-turntable.svg)](http://badge.fury.io/rb/activerecord-turntable)
4
4
  [![Build Status](https://travis-ci.org/drecom/activerecord-turntable.svg?branch=master)](https://travis-ci.org/drecom/activerecord-turntable)
5
- [![Dependency Status](https://gemnasium.com/drecom/activerecord-turntable.svg)](https://gemnasium.com/drecom/activerecord-turntable)
6
- [![Coverage Status](https://coveralls.io/repos/drecom/activerecord-turntable/badge.png?branch=master)](https://coveralls.io/r/drecom/activerecord-turntable?branch=master)
5
+ [![Coverage Status](https://coveralls.io/repos/github/drecom/activerecord-turntable/badge.svg)](https://coveralls.io/github/drecom/activerecord-turntable)
6
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/drecom/activerecord-turntable/blob/master/LICENSE.txt)
7
7
 
8
8
  ActiveRecord::Turntable is a database sharding extension for ActiveRecord.
9
9
 
@@ -11,21 +11,23 @@ ActiveRecord::Turntable is a database sharding extension for ActiveRecord.
11
11
 
12
12
  activerecord(>=5.0.0, <6.0)
13
13
 
14
+ * Current latest stable branch is [stable branch](https://github.com/drecom/activerecord-turntable/tree/stable).
15
+
14
16
  If you are using with older activerecord versions, use following versions.
15
17
 
16
18
  * activerecord 4.x - use activerecord-turntable version 2.x.([stable-2-x branch](https://github.com/drecom/activerecord-turntable/tree/stable-2-x))
17
19
  * activerecord 3.x - use activerecord-turntable version 1.x.([stable-1-x branch](https://github.com/drecom/activerecord-turntable/tree/stable-1-x))
18
20
 
19
- ## Supported Database
21
+ ## Supported DBMS
20
22
 
21
- Currently supports mysql only.
23
+ MySQL only.
22
24
 
23
25
  ## Installation
24
26
 
25
27
  Add to Gemfile:
26
28
 
27
29
  ```ruby
28
- gem 'activerecord-turntable', '~> 3.0.0'
30
+ gem 'activerecord-turntable', '~> 4.0.0'
29
31
  ```
30
32
 
31
33
  Run a bundle install:
@@ -85,7 +87,33 @@ three user databases sharded by user_id.
85
87
 
86
88
  ### Example Configuration
87
89
 
88
- Edit turntable.yml and database.yml. See below example config.
90
+ Edit DSL type configuration file(config/turntable.rb) or YAML configuration file(turntable.yml).
91
+ And add database connection settings to database.yml.
92
+
93
+ See below example config.
94
+
95
+ * example turntable.rb
96
+
97
+ ```ruby
98
+ cluster :user_cluster do
99
+ # algorithm [algorithm name symbol(range|range_bsearch|modulo)]
100
+ algorithm :range_bsearch
101
+
102
+ # sequencer [sequence name] [sequence type] [*options hash]
103
+ sequencer :user_seq, :mysql, connection: :user_seq
104
+
105
+ # shard [range], to: [connection names in database.yml]
106
+ shard 1...100, to: :user_shard_1
107
+ shard 100...200, to: :user_shard_2
108
+ shard 200...2000000000, to: :user_shard_3
109
+
110
+ # If you are using modulo algorithm, pass integer sequence start with zero.
111
+ #
112
+ # shard 0, to: :user_shard_1
113
+ # shard 1, to: :user_shard_2
114
+ # shard 2, to: :user_shard_3
115
+ end
116
+ ```
89
117
 
90
118
  * example turntable.yml
91
119
 
@@ -139,6 +167,124 @@ Edit turntable.yml and database.yml. See below example config.
139
167
  database: sample_app_user3_development
140
168
  ```
141
169
 
170
+ #### About algorithms
171
+
172
+ * range, range_bsearch - distribute records by key range
173
+
174
+ ```ruby
175
+ algorithm :range_bsearch
176
+
177
+ shard 1...20_000, to: :user_shard_1
178
+ shard 20_000...40_000, to: :user_shard_2
179
+ shard 40_000...60_000, to: :user_shard_1
180
+ shard 60_000...80_000, to: :user_shard_2
181
+ shard 80_000...10_000_000, to: :user_shard_3
182
+ ```
183
+
184
+ * modulo - distribute records by key modulo
185
+
186
+ ```ruby
187
+ algorithm :modulo
188
+
189
+ shard 0, to: :user_shard_1
190
+ shard 1, to: :user_shard_2
191
+ shard 2, to: :user_shard_3
192
+ ```
193
+
194
+ * hash_slot - distribute records by key hashes
195
+
196
+ default hash function is `Zlib.crc32(key.to_s)`
197
+
198
+ ```ruby
199
+ algorithm :hash_slot
200
+ # Or specify hash function
201
+ # algorithm :hash_slot, hash_func: ->(key) { Zlib.adler32(key.to_s) }
202
+
203
+ shard 0...4096, to: :user_shard_1
204
+ shard 4096...8192, to: :user_shard_2
205
+ shard 8192...12288, to: :user_shard_3
206
+ shard 12288...16384, to: :user_shard_4
207
+ ```
208
+
209
+ ### Slave support (experimental)
210
+
211
+ Slave enabled configuration examples:
212
+
213
+ * config/turntable.rb
214
+
215
+ ```ruby
216
+ cluster :user_cluster do
217
+ ...
218
+
219
+ # shard [range], to: [connection names in database.yml]
220
+ shard 1...100, to: :user_shard_1, slaves: [:user_shard_1_1]
221
+ shard 100...200, to: :user_shard_2, slaves: [:user_shard_2_1]
222
+ shard 200...2000000000, to: :user_shard_3, slaves: [:user_shard_3_1]
223
+ end
224
+ ```
225
+
226
+ * config/turntable.yml
227
+
228
+ ```yaml
229
+ development:
230
+ clusters:
231
+ user_cluster: # <-- cluster name
232
+ ...
233
+ shards:
234
+ - connection: user_shard_1
235
+ less_than: 100
236
+ slaves:
237
+ - user_shard_1_1
238
+ - connection: user_shard_2
239
+ less_than: 200
240
+ slaves:
241
+ - user_shard_2_1
242
+ - connection: user_shard_3
243
+ less_than: 2000000000
244
+ slaves:
245
+ - user_shard_3_1
246
+ ```
247
+
248
+ * config/database.yml
249
+
250
+ Add slave connection settings under `shards`.
251
+
252
+ ```yaml
253
+ ...
254
+ shards:
255
+ user_shard_1:
256
+ <<: *default
257
+ database: turntable_user_shard_1_test
258
+ user_shard_1_1:
259
+ <<: *default
260
+ database: turntable_user_shard_1_1_test
261
+ user_shard_2:
262
+ <<: *default
263
+ database: turntable_user_shard_2_test
264
+ user_shard_2_1:
265
+ <<: *default
266
+ database: turntable_user_shard_2_1_test
267
+ user_shard_3:
268
+ <<: *default
269
+ database: turntable_user_shard_3_test
270
+ user_shard_3_1:
271
+ <<: *default
272
+ database: turntable_user_shard_3_1_test
273
+ ```
274
+
275
+ Slave usage:
276
+
277
+ ```ruby
278
+ User.with_slave {
279
+ # `User` model will use slave databases within this block.
280
+ }
281
+
282
+ User.with_master {
283
+ # `User` model will use master database within this block.
284
+ }
285
+ ```
286
+
287
+
142
288
  ### Example Migration
143
289
 
144
290
  Generate a model:
@@ -255,10 +401,11 @@ end
255
401
 
256
402
  Sequencer provides generating global IDs.
257
403
 
258
- Turntable has follow 2 sequencers currently:
404
+ Turntable has follow 3 sequencers currently:
259
405
 
260
406
  * :mysql - Use database table to generate ids.
261
407
  * :barrage - Use [barrage](https://github.com/drecom/barrage) gem to generate ids
408
+ * :katsubushi - [katsubushi](https://github.com/kayac/go-katsubushi) sequencer backend
262
409
 
263
410
  ### Mysql example
264
411
 
@@ -348,6 +495,47 @@ Next, add sequencer definition to the model:
348
495
  end
349
496
  ```
350
497
 
498
+ ### Katsubushi example
499
+
500
+ [katsubushi](https://github.com/kayac/go-katsubushi) is available as a sequence server.
501
+ ActiveRecord::Turntable accesses katsubushi via Dalli.
502
+
503
+ First, add dalli gem to your Gemfile:
504
+
505
+ ```ruby
506
+ gem 'dalli'
507
+ ```
508
+
509
+ Then, add configuration to turntable.yml:
510
+
511
+ * turntable.yml
512
+
513
+ ```yaml
514
+ development:
515
+ clusters:
516
+ user_cluster: # <-- cluster name
517
+ ....
518
+ seq:
519
+ katsubushi_seq: # <-- sequencer name
520
+ seq_type: katsubushi # <-- sequencer type
521
+ options: # <-- options passed to dalli
522
+ servers:
523
+ - host: localhost
524
+ port: 11212
525
+ - host: localhost
526
+ port: 11213
527
+ ```
528
+
529
+ Next, add sequencer definition to the model:
530
+
531
+ ```ruby
532
+ class User < ApplicationRecord
533
+ turntable :id
534
+ sequencer :katsubushi_seq # <-- this line enables sequencer module
535
+ has_one :status
536
+ end
537
+ ```
538
+
351
539
  ## Transactions
352
540
  Turntable has some transaction support methods.
353
541
 
@@ -497,7 +685,7 @@ To notice queries causing performance problem, Turntable has follow options.
497
685
  * raise\_on\_not\_specified\_shard\_update - raises on updates executed on all shards
498
686
 
499
687
 
500
- Add to turntable.yml:
688
+ Add to turntable.yml or turntable.rb:
501
689
 
502
690
  ```yaml
503
691
  development:
@@ -506,6 +694,12 @@ development:
506
694
  raise_on_not_specified_shard_update: true
507
695
  ```
508
696
 
697
+ ```ruby
698
+ # Write on top level
699
+ raise_on_not_specified_shard_query true
700
+ raise_on_not_specified_shard_update true
701
+ ```
702
+
509
703
  ## Thanks
510
704
 
511
705
  ConnectionProxy, Distributed Migration implementation is inspired by Octopus and DataFabric.
data/Rakefile CHANGED
@@ -47,73 +47,7 @@ namespace :turntable do
47
47
 
48
48
  configurations.each do |configuration|
49
49
  ActiveRecord::Base.establish_connection configuration
50
-
51
- ActiveRecord::Base.connection.create_table :users, comment: "comment" do |t|
52
- t.string :nickname
53
- t.string :thumbnail_url
54
- t.binary :blob
55
- t.datetime :joined_at
56
- t.datetime :deleted_at
57
- t.timestamps
58
- end
59
- ActiveRecord::Base.connection.create_sequence_for :users, comment: "comment"
60
-
61
- ActiveRecord::Base.connection.create_table :user_statuses do |t|
62
- t.belongs_to :user, :null => false
63
- t.integer :hp, :null => false, :default => 0
64
- t.integer :mp, :null => false, :default => 0
65
- t.text :data
66
- t.integer :lock_version, :null => false, :default => 0
67
- t.datetime :deleted_at, :default => nil
68
- t.timestamps
69
- end
70
- ActiveRecord::Base.connection.create_sequence_for :user_statuses
71
-
72
- ActiveRecord::Base.connection.create_table :cards do |t|
73
- t.string :name, :null => false
74
- t.integer :hp, :null => false, :default => 0
75
- t.integer :mp, :null => false, :default => 0
76
- t.timestamps
77
- end
78
- ActiveRecord::Base.connection.create_table :archived_cards do |t|
79
- t.string :name, :null => false
80
- t.integer :hp, :null => false, :default => 0
81
- t.integer :mp, :null => false, :default => 0
82
- t.timestamps
83
- t.datetime :deleted_at, :default => nil
84
- end
85
-
86
- ActiveRecord::Base.connection.create_table :cards_users do |t|
87
- t.belongs_to :card, :null => false
88
- t.belongs_to :user, :null => false
89
- t.integer :num, :default => 1, :null => false
90
- t.timestamps
91
- end
92
- ActiveRecord::Base.connection.create_sequence_for :cards_users
93
-
94
- ActiveRecord::Base.connection.create_table :archived_cards_users do |t|
95
- t.belongs_to :card, :null => false
96
- t.belongs_to :user, :null => false
97
- t.timestamps
98
- t.datetime :deleted_at, :default => nil
99
- end
100
- ActiveRecord::Base.connection.create_sequence_for :archived_cards_users
101
-
102
- ActiveRecord::Base.connection.create_table :cards_users_histories do |t|
103
- t.belongs_to :cards_user, :null => false
104
- t.belongs_to :user, :null => false
105
- t.timestamps
106
- end
107
- ActiveRecord::Base.connection.create_sequence_for :cards_users_histories
108
-
109
- ActiveRecord::Base.connection.create_table :events_users_histories do |t|
110
- t.belongs_to :events_user, :null => false
111
- t.belongs_to :cards_user, :null => false
112
- t.belongs_to :user, :null => false
113
- t.string :type, :default => nil
114
- t.timestamps
115
- end
116
- ActiveRecord::Base.connection.create_sequence_for :events_users_histories
50
+ load File.expand_path("spec/migrations/schema.rb", __dir__)
117
51
  end
118
52
  end
119
53
 
@@ -170,6 +104,47 @@ namespace :turntable do
170
104
  EOS
171
105
  end
172
106
  end
107
+
108
+ # Ignore failing migrator test
109
+ if ActiveRecord.gem_version.release <= Gem::Version.new("5.1.5")
110
+ File.open("test/cases/migrator_test.rb", "a") do |f|
111
+ f << <<-EOS.strip_heredoc
112
+ class MigratorTest
113
+ undef_method :test_migrator_verbosity if method_defined?(:test_migrator_verbosity)
114
+ end
115
+ EOS
116
+ end
117
+ end
118
+
119
+ # Ignore some failing tests with ruby 2.5
120
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.5") &&
121
+ ActiveRecord.gem_version.release <= Gem::Version.new("5.1.4")
122
+ ignores = [
123
+ ["aggregations_test.rb", "AggregationsTest", ["test_immutable_value_objects"]],
124
+ ["query_cache_test.rb", "QueryCacheTest", ["test_query_cache_does_not_allow_sql_key_mutation"]],
125
+ ["transactions_test.rb", "TransactionTest", ["test_rollback_when_saving_a_frozen_record"]],
126
+ ["log_subscriber_test.rb", "LogSubscriberTest",
127
+ %w[test_basic_payload_name_logging_coloration_generic_sql
128
+ test_basic_payload_name_logging_coloration_named_sql
129
+ test_query_logging_coloration_with_nested_select
130
+ test_query_logging_coloration_with_multi_line_nested_select
131
+ test_query_logging_coloration_with_lock]],
132
+ ]
133
+
134
+ ignores.each do |file_name, class_name, method_names|
135
+ path = File.join("test/cases", file_name)
136
+ next unless File.exist?(path)
137
+
138
+ File.open(File.join("test/cases", file_name), "a") do |f|
139
+ f << <<-EOS.strip_heredoc
140
+ class #{class_name}
141
+ #{method_names.map { |method_name| "undef_method :#{method_name} if method_defined?(:#{method_name})" }.join("\n") }
142
+
143
+ end
144
+ EOS
145
+ end
146
+ end
147
+ end
173
148
  end
174
149
 
175
150
  task :db => :rails do