activerecord-turntable 3.1.0 → 4.0.0

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.
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