departure 6.1.0 → 6.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0ec14bb84716b3492846b14acd70c19f2e242748
4
- data.tar.gz: 138eb9af8dc4c07d4fc5d7f77203f2cb927b7f5d
2
+ SHA256:
3
+ metadata.gz: 8e9b07d68819910b4f867268d8680b65677e6c11fe91b7f5c2f3a4b62cee627a
4
+ data.tar.gz: daf4792210ea603d0732fae6daebe97fcbea253960067d800495b49b6c2aa866
5
5
  SHA512:
6
- metadata.gz: 3ea0b39fa2cb8ca1766ad374f6a1dc33a3214e742930afc94974faade91468e561ef0b21beac179f6209124559264de9b0dfff1b3014378ebcf87c98e60902b4
7
- data.tar.gz: 83b78984ff0ace2b88f0b4fddbe6ccc37daa4f34f49b30f327c9041d5babb82b2d2d4a3d98dd4494f3eb94e8d39590229bd974db9bb1420ca58356c69d803132
6
+ metadata.gz: 1ba37179c249db07bc0770288ff6103ee4502846488319356bb2aad94738dd5727c42fea899e97aaccb974d5e0bd6f06d475ee0f922d460ec0cc2a2a0ad95f4b
7
+ data.tar.gz: 9c5acbc1f3b3064341f371e584c3e3da4f326d9f3bfc9a32d844dccdd12bf50c4c6c4519c5742f086fbb4261e252fc31fa6c5cf5777f1d028da4e4798d127aa8
@@ -0,0 +1,45 @@
1
+ name: Test
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ strategy:
8
+ fail-fast: false
9
+ matrix:
10
+ ruby:
11
+ - 2.5
12
+ - 2.6
13
+ - 2.7
14
+ rails:
15
+ - 5.2.0
16
+ - 6.0.0
17
+ - 6.1.0
18
+ include:
19
+ - ruby: 2.4
20
+ rails: 5.2.0
21
+ - ruby: 2.7
22
+ rails: 7.0.1
23
+ - ruby: 3.0
24
+ rails: 6.1.0
25
+ env:
26
+ PERCONA_DB_USER: root
27
+ PERCONA_DB_PASSWORD: root
28
+ RAILS_VERSION: "~> ${{ matrix.rails }}"
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - uses: actions/checkout@v2
32
+ - uses: ruby/setup-ruby@v1
33
+ with:
34
+ ruby-version: ${{ matrix.ruby }}
35
+ bundler-cache: true
36
+ - name: "Add Percona GPG key"
37
+ run: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 9334A25F8507EFA5
38
+ - name: "Add Percona APT repository"
39
+ run: echo "deb http://repo.percona.com/apt `lsb_release -cs` main" | sudo tee -a /etc/apt/sources.list
40
+ - run: sudo apt-get update -qq
41
+ - run: sudo apt-get install percona-toolkit
42
+ - name: Start MySQL server
43
+ run: sudo systemctl start mysql.service
44
+ - run: bin/setup
45
+ - run: bundle exec rake
data/.gitignore CHANGED
@@ -10,3 +10,5 @@
10
10
  .byebug_history
11
11
  tags
12
12
  departure_error.log
13
+ .ruby-version
14
+ .idea/
data/.pryrc ADDED
@@ -0,0 +1,11 @@
1
+ if defined?(PryByebug)
2
+ Pry.commands.alias_command 'c', 'continue'
3
+ Pry.commands.alias_command 's', 'step'
4
+ Pry.commands.alias_command 'n', 'next'
5
+ Pry.commands.alias_command 'f', 'finish'
6
+ Pry.commands.alias_command 'w', 'pry-backtrace'
7
+
8
+ Pry::Commands.command(/^$/, 'repeat last command') do
9
+ pry_instance.run_command Pry.history.to_a.last
10
+ end
11
+ end
data/.rubocop.yml CHANGED
@@ -48,7 +48,7 @@ Style/MultilineBlockChain:
48
48
  Exclude:
49
49
  - 'spec/integration_spec.rb'
50
50
 
51
- Style/MultilineMethodCallIndentation:
51
+ Layout/MultilineMethodCallIndentation:
52
52
  Enabled: false
53
53
 
54
54
  Style/SymbolArray:
data/CHANGELOG.md CHANGED
@@ -6,6 +6,42 @@ Please follow the format in [Keep a Changelog](http://keepachangelog.com/)
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [6.4.0] - 2020-06-23
10
+
11
+ - Support for ActiveRecord 6.1.4
12
+ - Relax mysql2 requirement to allow mysql2 0.5.4
13
+ - Support Rails 6' #upsert_all
14
+
15
+ ## [6.3.0] - 2020-06-23
16
+
17
+ - Support for ActiveRecord 6.1
18
+
19
+ ## [6.2.0] - 2020-06-23
20
+
21
+ ### Added
22
+
23
+ - Support for ActiveRecord 6.0
24
+ - Support for ActiveRecord 5.2
25
+ - Relax mysql2 requirement to allow mysql2 0.5.3
26
+ - Support to batch multiple changes at once with #change_table
27
+ - Support for connection to MySQL server over SSL
28
+
29
+ ### Changed
30
+
31
+ - Depend only in railties and activerecord instead of rails gem
32
+
33
+ ### Deprecated
34
+ ### Removed
35
+ ### Fixed
36
+
37
+ - Fix support for removing foreign keys
38
+ - Fix PERCONA_ARGS syntax for critical-load option
39
+ - Make sure quotes in ALTER TABLE get correctly escaped
40
+ - Fixes for regex handling
41
+ - Fix LHM compatibility
42
+
43
+ ## [6.1.0] - 2018-02-27
44
+
9
45
  ### Added
10
46
  ### Changed
11
47
 
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # Departure [![Build Status](https://travis-ci.org/departurerb/departure.svg?branch=master)](https://travis-ci.org/departurerb/departure) [![Code Climate](https://codeclimate.com/github/departurerb/departure/badges/gpa.svg)](https://codeclimate.com/github/departurerb/departure)
1
+ # Departure
2
+
3
+ ![Build Status](https://img.shields.io/travis/departurerb/departure?style=for-the-badge) ![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability/departurerb/departure?style=for-the-badge) ![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/departurerb/departure/latest/master?style=for-the-badge)
2
4
 
3
5
  Departure is an **ActiveRecord connection adapter** that allows running
4
6
  **MySQL online and non-blocking DDL** through `ActiveRecord::Migration` without needing
@@ -99,7 +101,7 @@ $ PERCONA_ARGS='--chunk-time=1' bundle exec rake db:migrate:up VERSION=xxx
99
101
  or even mulitple arguments
100
102
 
101
103
  ```ruby
102
- $ PERCONA_ARGS='--chunk-time=1 --critical-load=55' bundle exec rake db:migrate:up VERSION=xxx
104
+ $ PERCONA_ARGS='--chunk-time=1 --critical-load Threads_running=55' bundle exec rake db:migrate:up VERSION=xxx
103
105
  ```
104
106
 
105
107
  Use caution when using PERCONA_ARGS with `db:migrate`, as your args will be applied
@@ -112,7 +114,7 @@ using `global_percona_args` option.
112
114
 
113
115
  ```ruby
114
116
  Departure.configure do |config|
115
- config.global_percona_args = '--chunk-time=1 --critical-load=55'
117
+ config.global_percona_args = '--chunk-time=1 --critical-load Threads_running=55'
116
118
  end
117
119
  ```
118
120
 
@@ -145,6 +147,39 @@ end
145
147
  It's strongly recommended to name it after this gems name, such as
146
148
  `config/initializers/departure.rb`
147
149
 
150
+ ### Disable on per-migration basis
151
+
152
+ Departure gem is enabled by default.
153
+ In order to disable it on a particular migration the method `disable_departure!` should be used.
154
+
155
+ ```ruby
156
+ class UseDepartureMigration < ActiveRecord::Migration[5.2]
157
+ disable_departure!
158
+
159
+ def up
160
+ # ...
161
+ end
162
+ # ...
163
+ end
164
+ ```
165
+
166
+ ### Enable on per-migration basis
167
+
168
+ If you wish to only have Departure enabled per-migration, set `config.enabled_by_default = false` in the configure block of your departure initializer.
169
+
170
+ Then, add a `uses_departure!` statement in migrations where Departure should be used:
171
+
172
+ ```ruby
173
+ class UseDepartureMigration < ActiveRecord::Migration[5.2]
174
+ uses_departure!
175
+
176
+ def up
177
+ # ...
178
+ end
179
+ # ...
180
+ end
181
+ ```
182
+
148
183
  ## How it works
149
184
 
150
185
  When booting your Rails app, Departure extends the
@@ -154,19 +189,19 @@ it using the `DepartureAdapter` instead of the one you defined in your
154
189
 
155
190
  Then, when any migration DSL methods such as `add_column` or `create_table` are
156
191
  executed, they all go to the
157
- [DepartureAdapter](https://github.com/redbooth/departure/blob/master/lib/active_record/connection_adapters/departure_adapter.rb).
192
+ [DepartureAdapter](https://github.com/departurerb/departure/blob/master/lib/active_record/connection_adapters/departure_adapter.rb).
158
193
  There, the methods that require `ALTER TABLE` SQL statements, like `add_column`,
159
194
  are overriden to get executed with
160
- [Departure::Runner](https://github.com/redbooth/departure/blob/master/lib/departure/runner.rb),
195
+ [Departure::Runner](https://github.com/departurerb/departure/blob/master/lib/departure/runner.rb),
161
196
  which deals with the `pt-online-schema-change` binary. All the others, like
162
197
  `create_table`, are delegated to the ActiveRecord's built in Mysql2Adapter and
163
198
  so they follow the regular path.
164
199
 
165
- [Departure::Runner](https://github.com/redbooth/departure/blob/master/lib/departure/runner.rb)
200
+ [Departure::Runner](https://github.com/departurerb/departure/blob/master/lib/departure/runner.rb)
166
201
  spawns a new process that runs the `pt-online-schema-change` binary present in
167
- the system, with the apropriate arguments for the generated SQL.
202
+ the system, with the appropriate arguments for the generated SQL.
168
203
 
169
- When an any error occurs, an `ActiveRecord::StatementInvalid` exception is
204
+ When any errors occur, an `ActiveRecord::StatementInvalid` exception is
170
205
  raised and the migration is aborted, as all other ActiveRecord connection
171
206
  adapters.
172
207
 
@@ -191,7 +226,7 @@ git commits and tags, and push the `.gem` file to
191
226
  ## Contributing
192
227
 
193
228
  Bug reports and pull requests are welcome on GitHub at
194
- https://github.com/redbooth/departure. They need to be opened against
229
+ https://github.com/departurerb/departure. They need to be opened against
195
230
  `master` or `v3.2` only if the changes fix a bug in Rails 3.2 apps.
196
231
 
197
232
  Please note that this project is released with a Contributor Code of Conduct. By
@@ -208,3 +243,6 @@ You can consult the changelog [here](CHANGELOG.md)
208
243
  The gem is available as open source under the terms of the [MIT
209
244
  License](http://opensource.org/licenses/MIT).
210
245
 
246
+ ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/departurerb/departure?style=for-the-badge)
247
+ ![GitHub issues](https://img.shields.io/github/issues/departurerb/departure?style=for-the-badge)
248
+
data/RELEASING.md CHANGED
@@ -1,4 +1,4 @@
1
- # Releasing Percona Migrator
1
+ # Releasing Departure
2
2
 
3
3
  All releases come from the master branch. All other branches won't be maintained
4
4
  and will receive bug fix releases only.
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'bundler/setup'
4
- require 'percona_migrator'
4
+ require 'departure'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
data/departure.gemspec CHANGED
@@ -5,11 +5,15 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  require 'departure/version'
7
7
 
8
+ # This environment variable is set on CI to facilitate testing with multiple
9
+ # versions of Rails.
10
+ RAILS_DEPENDENCY_VERSION = ENV.fetch('RAILS_VERSION', ['>= 5.2.0', '!= 7.0.0', '< 7.1'])
11
+
8
12
  Gem::Specification.new do |spec|
9
13
  spec.name = 'departure'
10
14
  spec.version = Departure::VERSION
11
- spec.authors = ['Ilya Zayats', 'Pau Pérez', 'Fran Casas', 'Jorge Morante', 'Enrico Stano', 'Adrian Serafin', 'Kirk Haines']
12
- spec.email = ['ilya.zayats@redbooth.com', 'pau.perez@redbooth.com', 'fran.casas@redbooth.com', 'jorge.morante@redbooth.com', 'adrian@softmad.pl', 'wyhaines@gmail.com']
15
+ spec.authors = ['Ilya Zayats', 'Pau Pérez', 'Fran Casas', 'Jorge Morante', 'Enrico Stano', 'Adrian Serafin', 'Kirk Haines', 'Guillermo Iguaran']
16
+ spec.email = ['ilya.zayats@redbooth.com', 'pau.perez@redbooth.com', 'nflamel@gmail.com', 'jorge.morante@redbooth.com', 'adrian@softmad.pl', 'wyhaines@gmail.com', 'guilleiguaran@gmail.com']
13
17
 
14
18
  spec.summary = %q(pt-online-schema-change runner for ActiveRecord migrations)
15
19
  spec.description = %q(Execute your ActiveRecord migrations with Percona's pt-online-schema-change. Formerly known as Percona Migrator.)
@@ -19,12 +23,13 @@ Gem::Specification.new do |spec|
19
23
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
24
  spec.require_paths = ['lib']
21
25
 
22
- spec.add_runtime_dependency 'rails', '~> 5.1.0'
23
- spec.add_runtime_dependency 'mysql2', '~> 0.4.0'
26
+ spec.add_runtime_dependency 'railties', *Array(RAILS_DEPENDENCY_VERSION)
27
+ spec.add_runtime_dependency 'activerecord', *Array(RAILS_DEPENDENCY_VERSION)
28
+ spec.add_runtime_dependency 'mysql2', '>= 0.4.0', '<= 0.5.4'
24
29
 
25
- spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'rake', '>= 10.0'
26
31
  spec.add_development_dependency 'rspec', '~> 3.4', '>= 3.4.0'
27
32
  spec.add_development_dependency 'rspec-its', '~> 1.2'
28
- spec.add_development_dependency 'byebug', '~> 8.2', '>= 8.2.1'
33
+ spec.add_development_dependency 'pry-byebug'
29
34
  spec.add_development_dependency 'climate_control', '~> 0.0.3'
30
35
  end
@@ -0,0 +1,97 @@
1
+ require 'active_record/connection_adapters/mysql/schema_statements'
2
+
3
+ module ForAlterStatements
4
+ class << self
5
+ def included(_)
6
+ STDERR.puts 'Including for_alter statements'
7
+ end
8
+ end
9
+
10
+ def bulk_change_table(table_name, operations) #:nodoc:
11
+ sqls = operations.flat_map do |command, args|
12
+ table = args.shift
13
+ arguments = args
14
+
15
+ method = :"#{command}_for_alter"
16
+
17
+ raise "Unknown method called : #{method}(#{arguments.inspect})" unless respond_to?(method, true)
18
+ public_send(method, table, *arguments)
19
+ end.join(', ')
20
+
21
+ execute("ALTER TABLE #{quote_table_name(table_name)} #{sqls}")
22
+ end
23
+
24
+ def change_column_for_alter(table_name, column_name, type, options = {})
25
+ column = column_for(table_name, column_name)
26
+ type ||= column.sql_type
27
+
28
+ options = {
29
+ default: column.default,
30
+ null: column.null,
31
+ comment: column.comment
32
+ }.merge(options)
33
+
34
+ td = create_table_definition(table_name)
35
+ cd = td.new_column_definition(column.name, type, **options)
36
+ schema_creation.accept(ActiveRecord::ConnectionAdapters::ChangeColumnDefinition.new(cd, column.name))
37
+ end
38
+
39
+ def rename_column_for_alter(table_name, column_name, new_column_name)
40
+ column = column_for(table_name, column_name)
41
+ options = {
42
+ default: column.default,
43
+ null: column.null,
44
+ auto_increment: column.auto_increment?
45
+ }
46
+
47
+ columns_sql = "SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE #{quote(column_name)}"
48
+ current_type = exec_query(columns_sql, 'SCHEMA').first['Type']
49
+ td = create_table_definition(table_name)
50
+ cd = td.new_column_definition(new_column_name, current_type, **options)
51
+ schema_creation.accept(ActiveRecord::ConnectionAdapters::ChangeColumnDefinition.new(cd, column.name))
52
+ end
53
+
54
+ def add_index_for_alter(table_name, column_name, options = {})
55
+ if ActiveRecord::VERSION::STRING >= '6.1'
56
+ index_definition, = add_index_options(table_name, column_name, **options)
57
+
58
+ "ADD #{schema_creation.accept(index_definition)}"
59
+ else
60
+ index_name, index_type, index_columns, _,
61
+ index_algorithm, index_using = add_index_options(table_name, column_name, **options)
62
+ index_algorithm[0, 0] = ', ' if index_algorithm.present?
63
+
64
+ "ADD #{index_type} INDEX #{quote_column_name(index_name)} #{index_using} (#{index_columns})#{index_algorithm}"
65
+ end
66
+ end
67
+
68
+ def remove_index_for_alter(table_name, column_name, options = {})
69
+ index_name = index_name_for_remove(table_name, column_name, options)
70
+ "DROP INDEX #{quote_column_name(index_name)}"
71
+ end
72
+
73
+ def add_timestamps_for_alter(table_name, options = {})
74
+ [
75
+ add_column_for_alter(table_name, :created_at, :datetime, options),
76
+ add_column_for_alter(table_name, :updated_at, :datetime, options)
77
+ ]
78
+ end
79
+
80
+ def remove_timestamps_for_alter(table_name, _options = {})
81
+ [remove_column_for_alter(table_name, :updated_at), remove_column_for_alter(table_name, :created_at)]
82
+ end
83
+
84
+ def add_column_for_alter(table_name, column_name, type, options = {})
85
+ td = create_table_definition(table_name)
86
+ cd = td.new_column_definition(column_name, type, **options)
87
+ schema_creation.accept(ActiveRecord::ConnectionAdapters::AddColumnDefinition.new(cd))
88
+ end
89
+
90
+ def remove_column_for_alter(_table_name, column_name, _type = nil, _options = {})
91
+ "DROP COLUMN #{quote_column_name(column_name)}"
92
+ end
93
+
94
+ def remove_columns_for_alter(table_name, *column_names, **options)
95
+ column_names.map { |column_name| remove_column_for_alter(table_name, column_name) }
96
+ end
97
+ end
@@ -1,6 +1,7 @@
1
1
  require 'active_record/connection_adapters/abstract_mysql_adapter'
2
2
  require 'active_record/connection_adapters/statement_pool'
3
3
  require 'active_record/connection_adapters/mysql2_adapter'
4
+ require 'active_support/core_ext/string/filters'
4
5
  require 'departure'
5
6
  require 'forwardable'
6
7
 
@@ -9,7 +10,10 @@ module ActiveRecord
9
10
  # Establishes a connection to the database that's used by all Active
10
11
  # Record objects.
11
12
  def percona_connection(config)
12
- config[:username] = 'root' if config[:username].nil?
13
+ if config[:username].nil?
14
+ config = config.dup if config.frozen?
15
+ config[:username] = 'root'
16
+ end
13
17
  mysql2_connection = mysql2_connection(config)
14
18
 
15
19
  connection_details = Departure::ConnectionDetails.new(config)
@@ -39,18 +43,34 @@ module ActiveRecord
39
43
 
40
44
  module ConnectionAdapters
41
45
  class DepartureAdapter < AbstractMysqlAdapter
42
-
43
46
  class Column < ActiveRecord::ConnectionAdapters::MySQL::Column
44
47
  def adapter
45
48
  DepartureAdapter
46
49
  end
47
50
  end
48
51
 
52
+ class SchemaCreation < ActiveRecord::ConnectionAdapters::MySQL::SchemaCreation
53
+ def visit_DropForeignKey(name) # rubocop:disable Naming/MethodName
54
+ fk_name =
55
+ if name =~ /^__(.+)/
56
+ Regexp.last_match(1)
57
+ else
58
+ "_#{name}"
59
+ end
60
+
61
+ "DROP FOREIGN KEY #{fk_name}"
62
+ end
63
+ end
64
+
49
65
  extend Forwardable
50
66
 
67
+ unless method_defined?(:change_column_for_alter)
68
+ include ForAlterStatements
69
+ end
70
+
51
71
  ADAPTER_NAME = 'Percona'.freeze
52
72
 
53
- def_delegators :mysql_adapter, :last_inserted_id, :each_hash, :set_field_encoding
73
+ def_delegators :mysql_adapter, :each_hash, :set_field_encoding
54
74
 
55
75
  def initialize(connection, _logger, connection_options, _config)
56
76
  @mysql_adapter = connection_options[:mysql_adapter]
@@ -58,6 +78,12 @@ module ActiveRecord
58
78
  @prepared_statements = false
59
79
  end
60
80
 
81
+ def write_query?(sql) # :nodoc:
82
+ !ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
83
+ :desc, :describe, :set, :show, :use
84
+ ).match?(sql)
85
+ end
86
+
61
87
  def exec_delete(sql, name, binds)
62
88
  execute(to_sql(sql, binds), name)
63
89
  @connection.affected_rows
@@ -68,9 +94,10 @@ module ActiveRecord
68
94
  execute(to_sql(sql, binds), name)
69
95
  end
70
96
 
71
- def exec_query(sql, name = 'SQL', _binds = [])
97
+ def exec_query(sql, name = 'SQL', _binds = [], **_kwargs)
72
98
  result = execute(sql, name)
73
- ActiveRecord::Result.new(result.fields, result.to_a)
99
+ fields = result.fields if defined?(result.fields)
100
+ ActiveRecord::Result.new(fields, result.to_a)
74
101
  end
75
102
 
76
103
  # Executes a SELECT query and returns an array of rows. Each row is an
@@ -82,8 +109,8 @@ module ActiveRecord
82
109
 
83
110
  # Executes a SELECT query and returns an array of record hashes with the
84
111
  # column names as keys and column values as values.
85
- def select(sql, name = nil, binds = [])
86
- exec_query(sql, name, binds)
112
+ def select(sql, name = nil, binds = [], **kwargs)
113
+ exec_query(sql, name, binds, **kwargs)
87
114
  end
88
115
 
89
116
  # Returns true, as this adapter supports migrations
@@ -103,27 +130,69 @@ module ActiveRecord
103
130
  # @param column_name [String, Symbol]
104
131
  # @param options [Hash] optional
105
132
  def add_index(table_name, column_name, options = {})
106
- index_name, index_type, index_columns, index_options = add_index_options(table_name, column_name, options)
107
- execute "ALTER TABLE #{quote_table_name(table_name)} ADD #{index_type} INDEX #{quote_column_name(index_name)} (#{index_columns})#{index_options}" # rubocop:disable Metrics/LineLength
133
+ if ActiveRecord::VERSION::STRING >= '6.1'
134
+ index_definition, = add_index_options(table_name, column_name, **options)
135
+ execute <<-SQL.squish
136
+ ALTER TABLE #{quote_table_name(index_definition.table)}
137
+ ADD #{schema_creation.accept(index_definition)}
138
+ SQL
139
+ else
140
+ index_name, index_type, index_columns, index_options = add_index_options(table_name, column_name, **options)
141
+ execute <<-SQL.squish
142
+ ALTER TABLE #{quote_table_name(table_name)}
143
+ ADD #{index_type} INDEX
144
+ #{quote_column_name(index_name)} (#{index_columns})#{index_options}
145
+ SQL
146
+ end
108
147
  end
109
148
 
110
149
  # Remove the given index from the table.
111
150
  #
112
151
  # @param table_name [String, Symbol]
113
152
  # @param options [Hash] optional
114
- def remove_index(table_name, options = {})
115
- index_name = index_name_for_remove(table_name, options)
153
+ def remove_index(table_name, column_name = nil, **options)
154
+ if ActiveRecord::VERSION::STRING >= '6.1'
155
+ return if options[:if_exists] && !index_exists?(table_name, column_name, **options)
156
+ index_name = index_name_for_remove(table_name, column_name, options)
157
+ else
158
+ index_name = index_name_for_remove(table_name, options)
159
+ end
160
+
116
161
  execute "ALTER TABLE #{quote_table_name(table_name)} DROP INDEX #{quote_column_name(index_name)}"
117
162
  end
118
163
 
164
+ def schema_creation
165
+ SchemaCreation.new(self)
166
+ end
167
+
168
+ def change_table(table_name, _options = {})
169
+ recorder = ActiveRecord::Migration::CommandRecorder.new(self)
170
+ yield update_table_definition(table_name, recorder)
171
+ bulk_change_table(table_name, recorder.commands)
172
+ end
173
+
119
174
  # Returns the MySQL error number from the exception. The
120
175
  # AbstractMysqlAdapter requires it to be implemented
121
176
  def error_number(_exception); end
122
177
 
123
178
  def full_version
179
+ if ActiveRecord::VERSION::MAJOR < 6
180
+ get_full_version
181
+ else
182
+ schema_cache.database_version.full_version_string
183
+ end
184
+ end
185
+
186
+ # This is a method defined in Rails 6.0, and we have no control over the
187
+ # naming of this method.
188
+ def get_full_version # rubocop:disable Naming/AccessorMethodName
124
189
  mysql_adapter.raw_connection.server_info[:version]
125
190
  end
126
191
 
192
+ def last_inserted_id(result)
193
+ mysql_adapter.send(:last_inserted_id, result)
194
+ end
195
+
127
196
  private
128
197
 
129
198
  attr_reader :mysql_adapter
@@ -4,7 +4,7 @@ module Departure
4
4
  # Represents the '--alter' argument of Percona's pt-online-schema-change
5
5
  # See https://www.percona.com/doc/percona-toolkit/2.0/pt-online-schema-change.html
6
6
  class AlterArgument
7
- ALTER_TABLE_REGEX = /\AALTER TABLE `(\w+)` /
7
+ ALTER_TABLE_REGEX = /\AALTER TABLE [^\s]*[\n]* /
8
8
 
9
9
  attr_reader :table_name
10
10
 
@@ -17,8 +17,12 @@ module Departure
17
17
 
18
18
  match = statement.match(ALTER_TABLE_REGEX)
19
19
  raise InvalidAlterStatement unless match
20
-
21
- @table_name = match.captures[0]
20
+ # Separates the ALTER TABLE from the table_name
21
+ #
22
+ # Removes the grave marks, if they are there, so we can get the table_name
23
+ @table_name = String(match)
24
+ .split(' ')[2]
25
+ .delete('`')
22
26
  end
23
27
 
24
28
  # Returns the '--alter' pt-online-schema-change argument as a string. See
@@ -38,6 +42,8 @@ module Departure
38
42
  @parsed_statement ||= statement
39
43
  .gsub(ALTER_TABLE_REGEX, '')
40
44
  .gsub('`', '\\\`')
45
+ .gsub(/\\n/, '')
46
+ .gsub('"', '\\\"')
41
47
  end
42
48
  end
43
49
  end
@@ -8,10 +8,11 @@ module Departure
8
8
  # @param command_line [String]
9
9
  # @param error_log_path [String]
10
10
  # @param logger [#write_no_newline]
11
- def initialize(command_line, error_log_path, logger)
11
+ def initialize(command_line, error_log_path, logger, redirect_stderr)
12
12
  @command_line = command_line
13
13
  @error_log_path = error_log_path
14
14
  @logger = logger
15
+ @redirect_stderr = redirect_stderr
15
16
  end
16
17
 
17
18
  # Executes the command returning its status. It also prints its stdout to
@@ -35,7 +36,7 @@ module Departure
35
36
 
36
37
  private
37
38
 
38
- attr_reader :command_line, :error_log_path, :logger, :status
39
+ attr_reader :command_line, :error_log_path, :logger, :status, :redirect_stderr
39
40
 
40
41
  # Runs the command in a separate process, capturing its stdout and
41
42
  # execution status
@@ -56,11 +57,15 @@ module Departure
56
57
  end
57
58
 
58
59
  # Builds the actual command including stderr redirection to the specified
59
- # log file
60
+ # log file or stdout
60
61
  #
61
62
  # @return [String]
62
63
  def full_command
63
- "#{command_line} 2> #{error_log_path}"
64
+ if redirect_stderr
65
+ "#{command_line} 2> #{error_log_path}"
66
+ else
67
+ "#{command_line} 2>&1"
68
+ end
64
69
  end
65
70
 
66
71
  # Validates the status of the execution
@@ -1,11 +1,13 @@
1
1
  module Departure
2
2
  class Configuration
3
- attr_accessor :tmp_path, :global_percona_args
3
+ attr_accessor :tmp_path, :global_percona_args, :enabled_by_default, :redirect_stderr
4
4
 
5
5
  def initialize
6
6
  @tmp_path = '.'.freeze
7
7
  @error_log_filename = 'departure_error.log'.freeze
8
8
  @global_percona_args = nil
9
+ @enabled_by_default = true
10
+ @redirect_stderr = true
9
11
  end
10
12
 
11
13
  def error_log_path
@@ -0,0 +1,11 @@
1
+ module Departure
2
+ class ConnectionBase < ActiveRecord::Base
3
+ def self.establish_connection(config = nil)
4
+ super.tap do
5
+ ActiveRecord::Base.connection_specification_name = connection_specification_name
6
+ end
7
+ end
8
+ end
9
+
10
+ class OriginalAdapterConnection < ConnectionBase; end
11
+ end
@@ -15,7 +15,7 @@ module Departure
15
15
  #
16
16
  # @return [String]
17
17
  def to_s
18
- @to_s ||= "-h #{host} -P #{port} -u #{user} #{password_argument}"
18
+ @to_s ||= "#{host_argument} -P #{port} -u #{user} #{password_argument}"
19
19
  end
20
20
 
21
21
  # TODO: Doesn't the abstract adapter already handle this somehow?
@@ -40,6 +40,17 @@ module Departure
40
40
  end
41
41
  end
42
42
 
43
+ # Returns the host fragment of the details string, adds ssl options if needed
44
+ #
45
+ # @return [String]
46
+ def host_argument
47
+ host_string = host
48
+ if ssl_ca.present?
49
+ host_string += ";mysql_ssl=1;mysql_ssl_client_ca=#{ssl_ca}"
50
+ end
51
+ "-h \"#{host_string}\""
52
+ end
53
+
43
54
  private
44
55
 
45
56
  attr_reader :connection_data
@@ -74,5 +85,12 @@ module Departure
74
85
  def port
75
86
  connection_data.fetch(:port, DEFAULT_PORT)
76
87
  end
88
+
89
+ # Returns the database' SSL CA certificate.
90
+ #
91
+ # @return [String]
92
+ def ssl_ca
93
+ connection_data.fetch(:sslca, nil)
94
+ end
77
95
  end
78
96
  end
@@ -0,0 +1,104 @@
1
+ module Departure
2
+ # Hooks Departure into Rails migrations by replacing the configured database
3
+ # adapter.
4
+ #
5
+ # It also patches ActiveRecord's #migrate method so that it patches LHM
6
+ # first. This will make migrations written with LHM to go through the
7
+ # regular Rails Migration DSL.
8
+ module Migration
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ # Holds the name of the adapter that was configured by the app.
13
+ mattr_accessor :original_adapter
14
+
15
+ # Declare on a per-migration class basis whether or not to use Departure.
16
+ # The default for this attribute is set based on
17
+ # Departure.configuration.enabled_by_default (default true).
18
+ class_attribute :uses_departure
19
+ self.uses_departure = true
20
+
21
+ alias_method :active_record_migrate, :migrate
22
+ remove_method :migrate
23
+ end
24
+
25
+ module ClassMethods
26
+ # Declare `uses_departure!` in the class body of your migration to enable
27
+ # Departure for that migration only when
28
+ # Departure.configuration.enabled_by_default is false.
29
+ def uses_departure!
30
+ self.uses_departure = true
31
+ end
32
+
33
+ # Declare `disable_departure!` in the class body of your migration to
34
+ # disable Departure for that migration only (when
35
+ # Departure.configuration.enabled_by_default is true, the default).
36
+ def disable_departure!
37
+ self.uses_departure = false
38
+ end
39
+ end
40
+
41
+ # Replaces the current connection adapter with the PerconaAdapter and
42
+ # patches LHM, then it continues with the regular migration process.
43
+ #
44
+ # @param direction [Symbol] :up or :down
45
+ def departure_migrate(direction)
46
+ reconnect_with_percona
47
+ include_foreigner if defined?(Foreigner)
48
+
49
+ ::Lhm.migration = self
50
+ active_record_migrate(direction)
51
+ end
52
+
53
+ # Migrate with or without Departure based on uses_departure class
54
+ # attribute.
55
+ def migrate(direction)
56
+ if uses_departure?
57
+ departure_migrate(direction)
58
+ else
59
+ reconnect_without_percona
60
+ active_record_migrate(direction)
61
+ end
62
+ end
63
+
64
+ # Includes the Foreigner's Mysql2Adapter implemention in
65
+ # DepartureAdapter to support foreign keys
66
+ def include_foreigner
67
+ Foreigner::Adapter.safe_include(
68
+ :DepartureAdapter,
69
+ Foreigner::ConnectionAdapters::Mysql2Adapter
70
+ )
71
+ end
72
+
73
+ # Make all connections in the connection pool to use PerconaAdapter
74
+ # instead of the current adapter.
75
+ def reconnect_with_percona
76
+ return if connection_config[:adapter] == 'percona'
77
+ Departure::ConnectionBase.establish_connection(connection_config.merge(adapter: 'percona'))
78
+ end
79
+
80
+ # Reconnect without percona adapter when Departure is disabled but was
81
+ # enabled in a previous migration.
82
+ def reconnect_without_percona
83
+ return unless connection_config[:adapter] == 'percona'
84
+ Departure::OriginalAdapterConnection.establish_connection(connection_config.merge(adapter: original_adapter))
85
+ end
86
+
87
+ private
88
+
89
+ # Capture the type of the adapter configured by the app if not already set.
90
+ def connection_config
91
+ configuration_hash.tap do |config|
92
+ self.class.original_adapter ||= config[:adapter]
93
+ end
94
+ end
95
+
96
+ private def configuration_hash
97
+ if ActiveRecord::VERSION::STRING >= '6.1'
98
+ ActiveRecord::Base.connection_db_config.configuration_hash
99
+ else
100
+ ActiveRecord::Base.connection_config
101
+ end
102
+ end
103
+ end
104
+ end
@@ -6,23 +6,16 @@ module Departure
6
6
  class Railtie < Rails::Railtie
7
7
  railtie_name :departure
8
8
 
9
- # It drops all previous database connections and reconnects using this
10
- # PerconaAdapter. By doing this, all later ActiveRecord methods called in
11
- # the migration will use this adapter instead of Mysql2Adapter.
12
- #
13
- # It also patches ActiveRecord's #migrate method so that it patches LHM
14
- # first. This will make migrations written with LHM to go through the
15
- # regular Rails Migration DSL.
16
- initializer 'departure.configure_rails_initialization' do
17
- ActiveSupport.on_load(:active_record) do
18
- Departure.load
19
- end
20
- end
21
-
22
9
  initializer 'departure.configure' do |app|
23
10
  Departure.configure do |config|
24
11
  config.tmp_path = app.paths['tmp'].first
25
12
  end
26
13
  end
14
+
15
+ config.after_initialize do
16
+ Departure.configure do |dc|
17
+ ActiveRecord::Migration.uses_departure = dc.enabled_by_default
18
+ end
19
+ end
27
20
  end
28
21
  end
@@ -15,6 +15,7 @@ module Departure
15
15
  @cli_generator = cli_generator
16
16
  @mysql_adapter = mysql_adapter
17
17
  @error_log_path = config.error_log_path
18
+ @redirect_stderr = config.redirect_stderr
18
19
  end
19
20
 
20
21
  # Executes the passed sql statement using pt-online-schema-change for ALTER
@@ -44,12 +45,12 @@ module Departure
44
45
  # @param command_line [String]
45
46
  # @return [Boolean]
46
47
  def execute(command_line)
47
- Command.new(command_line, error_log_path, logger).run
48
+ Command.new(command_line, error_log_path, logger, redirect_stderr).run
48
49
  end
49
50
 
50
51
  private
51
52
 
52
- attr_reader :logger, :cli_generator, :mysql_adapter, :error_log_path
53
+ attr_reader :logger, :cli_generator, :mysql_adapter, :error_log_path, :redirect_stderr
53
54
 
54
55
  # Checks whether the sql statement is an ALTER TABLE
55
56
  #
@@ -1,3 +1,3 @@
1
1
  module Departure
2
- VERSION = '6.1.0'.freeze
2
+ VERSION = '6.4.0'.freeze
3
3
  end
data/lib/departure.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'active_record'
2
2
  require 'active_support/all'
3
3
 
4
+ require 'active_record/connection_adapters/for_alter'
5
+
4
6
  require 'departure/version'
5
7
  require 'departure/log_sanitizers/password_sanitizer'
6
8
  require 'departure/runner'
@@ -11,12 +13,20 @@ require 'departure/logger_factory'
11
13
  require 'departure/configuration'
12
14
  require 'departure/errors'
13
15
  require 'departure/command'
16
+ require 'departure/connection_base'
17
+ require 'departure/migration'
14
18
 
15
19
  require 'departure/railtie' if defined?(Rails)
16
20
 
17
21
  # We need the OS not to buffer the IO to see pt-osc's output while migrating
18
22
  $stdout.sync = true
19
23
 
24
+ ActiveSupport.on_load(:active_record) do
25
+ ActiveRecord::Migration.class_eval do
26
+ include Departure::Migration
27
+ end
28
+ end
29
+
20
30
  module Departure
21
31
  class << self
22
32
  attr_accessor :configuration
@@ -27,40 +37,7 @@ module Departure
27
37
  yield(configuration)
28
38
  end
29
39
 
30
- # Hooks Percona Migrator into Rails migrations by replacing the configured
31
- # database adapter
32
40
  def self.load
33
- ActiveRecord::Migration.class_eval do
34
- alias_method :original_migrate, :migrate
35
-
36
- # Replaces the current connection adapter with the PerconaAdapter and
37
- # patches LHM, then it continues with the regular migration process.
38
- #
39
- # @param direction [Symbol] :up or :down
40
- def migrate(direction)
41
- reconnect_with_percona
42
- include_foreigner if defined?(Foreigner)
43
-
44
- ::Lhm.migration = self
45
- original_migrate(direction)
46
- end
47
-
48
- # Includes the Foreigner's Mysql2Adapter implemention in
49
- # DepartureAdapter to support foreign keys
50
- def include_foreigner
51
- Foreigner::Adapter.safe_include(
52
- :DepartureAdapter,
53
- Foreigner::ConnectionAdapters::Mysql2Adapter
54
- )
55
- end
56
-
57
- # Make all connections in the connection pool to use PerconaAdapter
58
- # instead of the current adapter.
59
- def reconnect_with_percona
60
- connection_config = ActiveRecord::Base
61
- .connection_config.merge(adapter: 'percona')
62
- ActiveRecord::Base.establish_connection(connection_config)
63
- end
64
- end
41
+ # No-op left for compatibility
65
42
  end
66
43
  end
@@ -52,7 +52,7 @@ module Lhm
52
52
  #
53
53
  # @return [column_factory]
54
54
  def column
55
- cast_type = ActiveRecord::Base.connection.lookup_cast_type(definition)
55
+ cast_type = ActiveRecord::Base.connection.send(:lookup_cast_type, definition)
56
56
  metadata = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(
57
57
  type: cast_type.type,
58
58
  sql_type: definition,
data/test_database.rb CHANGED
@@ -6,8 +6,6 @@ require 'active_record/connection_adapters/mysql2_adapter'
6
6
  # the tests.
7
7
  #
8
8
  class TestDatabase
9
-
10
-
11
9
  # Constructor
12
10
  #
13
11
  # @param config [Hash]
@@ -33,10 +31,10 @@ class TestDatabase
33
31
  # Creates the ActiveRecord's schema_migrations table required for
34
32
  # migrations to work. Before, it drops the table if it already exists
35
33
  def drop_and_create_schema_migrations_table
36
- sql = [
37
- "USE #{@database}",
38
- "DROP TABLE IF EXISTS schema_migrations",
39
- "CREATE TABLE schema_migrations ( version varchar(255) COLLATE utf8_unicode_ci NOT NULL, UNIQUE KEY unique_schema_migrations (version)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"
34
+ sql = [
35
+ "USE #{@database}",
36
+ 'DROP TABLE IF EXISTS schema_migrations',
37
+ 'CREATE TABLE schema_migrations ( version varchar(255) COLLATE utf8_unicode_ci NOT NULL, UNIQUE KEY unique_schema_migrations (version)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
40
38
  ]
41
39
 
42
40
  run_commands(sql)
@@ -58,19 +56,17 @@ class TestDatabase
58
56
  def drop_and_create_comments_table
59
57
  sql = [
60
58
  "USE #{@database}",
61
- "DROP TABLE IF EXISTS comments",
62
- "CREATE TABLE comments ( id int(12) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"
59
+ 'DROP TABLE IF EXISTS comments',
60
+ 'CREATE TABLE comments ( id bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
63
61
  ]
64
62
 
65
63
  run_commands(sql)
66
64
  end
67
65
 
68
66
  def run_commands(sql)
69
- conn.execute("START TRANSACTION")
70
- sql.each { |str|
71
- conn.execute(str)
72
- }
73
- conn.execute("COMMIT")
67
+ conn.execute('START TRANSACTION')
68
+ sql.each { |str| conn.execute(str) }
69
+ conn.execute('COMMIT')
74
70
  end
75
71
 
76
72
  def conn
@@ -78,6 +74,7 @@ class TestDatabase
78
74
  host: @config['hostname'],
79
75
  username: @config['username'],
80
76
  password: @config['password'],
81
- reconnect: true)
77
+ reconnect: true
78
+ )
82
79
  end
83
80
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: departure
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.0
4
+ version: 6.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Zayats
@@ -11,51 +11,96 @@ authors:
11
11
  - Enrico Stano
12
12
  - Adrian Serafin
13
13
  - Kirk Haines
14
+ - Guillermo Iguaran
14
15
  autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
- date: 2018-02-27 00:00:00.000000000 Z
18
+ date: 2022-08-04 00:00:00.000000000 Z
18
19
  dependencies:
19
20
  - !ruby/object:Gem::Dependency
20
- name: rails
21
+ name: railties
21
22
  requirement: !ruby/object:Gem::Requirement
22
23
  requirements:
23
- - - "~>"
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.0
27
+ - - "!="
24
28
  - !ruby/object:Gem::Version
25
- version: 5.1.0
29
+ version: 7.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7.1'
26
33
  type: :runtime
27
34
  prerelease: false
28
35
  version_requirements: !ruby/object:Gem::Requirement
29
36
  requirements:
30
- - - "~>"
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 5.2.0
40
+ - - "!="
41
+ - !ruby/object:Gem::Version
42
+ version: 7.0.0
43
+ - - "<"
31
44
  - !ruby/object:Gem::Version
32
- version: 5.1.0
45
+ version: '7.1'
46
+ - !ruby/object:Gem::Dependency
47
+ name: activerecord
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 5.2.0
53
+ - - "!="
54
+ - !ruby/object:Gem::Version
55
+ version: 7.0.0
56
+ - - "<"
57
+ - !ruby/object:Gem::Version
58
+ version: '7.1'
59
+ type: :runtime
60
+ prerelease: false
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: 5.2.0
66
+ - - "!="
67
+ - !ruby/object:Gem::Version
68
+ version: 7.0.0
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '7.1'
33
72
  - !ruby/object:Gem::Dependency
34
73
  name: mysql2
35
74
  requirement: !ruby/object:Gem::Requirement
36
75
  requirements:
37
- - - "~>"
76
+ - - ">="
38
77
  - !ruby/object:Gem::Version
39
78
  version: 0.4.0
79
+ - - "<="
80
+ - !ruby/object:Gem::Version
81
+ version: 0.5.4
40
82
  type: :runtime
41
83
  prerelease: false
42
84
  version_requirements: !ruby/object:Gem::Requirement
43
85
  requirements:
44
- - - "~>"
86
+ - - ">="
45
87
  - !ruby/object:Gem::Version
46
88
  version: 0.4.0
89
+ - - "<="
90
+ - !ruby/object:Gem::Version
91
+ version: 0.5.4
47
92
  - !ruby/object:Gem::Dependency
48
93
  name: rake
49
94
  requirement: !ruby/object:Gem::Requirement
50
95
  requirements:
51
- - - "~>"
96
+ - - ">="
52
97
  - !ruby/object:Gem::Version
53
98
  version: '10.0'
54
99
  type: :development
55
100
  prerelease: false
56
101
  version_requirements: !ruby/object:Gem::Requirement
57
102
  requirements:
58
- - - "~>"
103
+ - - ">="
59
104
  - !ruby/object:Gem::Version
60
105
  version: '10.0'
61
106
  - !ruby/object:Gem::Dependency
@@ -93,25 +138,19 @@ dependencies:
93
138
  - !ruby/object:Gem::Version
94
139
  version: '1.2'
95
140
  - !ruby/object:Gem::Dependency
96
- name: byebug
141
+ name: pry-byebug
97
142
  requirement: !ruby/object:Gem::Requirement
98
143
  requirements:
99
- - - "~>"
100
- - !ruby/object:Gem::Version
101
- version: '8.2'
102
144
  - - ">="
103
145
  - !ruby/object:Gem::Version
104
- version: 8.2.1
146
+ version: '0'
105
147
  type: :development
106
148
  prerelease: false
107
149
  version_requirements: !ruby/object:Gem::Requirement
108
150
  requirements:
109
- - - "~>"
110
- - !ruby/object:Gem::Version
111
- version: '8.2'
112
151
  - - ">="
113
152
  - !ruby/object:Gem::Version
114
- version: 8.2.1
153
+ version: '0'
115
154
  - !ruby/object:Gem::Dependency
116
155
  name: climate_control
117
156
  requirement: !ruby/object:Gem::Requirement
@@ -131,19 +170,21 @@ description: Execute your ActiveRecord migrations with Percona's pt-online-schem
131
170
  email:
132
171
  - ilya.zayats@redbooth.com
133
172
  - pau.perez@redbooth.com
134
- - fran.casas@redbooth.com
173
+ - nflamel@gmail.com
135
174
  - jorge.morante@redbooth.com
136
175
  - adrian@softmad.pl
137
176
  - wyhaines@gmail.com
177
+ - guilleiguaran@gmail.com
138
178
  executables: []
139
179
  extensions: []
140
180
  extra_rdoc_files: []
141
181
  files:
142
182
  - ".codeclimate.yml"
183
+ - ".github/workflows/test.yml"
143
184
  - ".gitignore"
185
+ - ".pryrc"
144
186
  - ".rspec"
145
187
  - ".rubocop.yml"
146
- - ".travis.yml"
147
188
  - CHANGELOG.md
148
189
  - CODE_OF_CONDUCT.md
149
190
  - Dockerfile
@@ -159,18 +200,21 @@ files:
159
200
  - configuration.rb
160
201
  - departure.gemspec
161
202
  - docker-compose.yml
203
+ - lib/active_record/connection_adapters/for_alter.rb
162
204
  - lib/active_record/connection_adapters/percona_adapter.rb
163
205
  - lib/departure.rb
164
206
  - lib/departure/alter_argument.rb
165
207
  - lib/departure/cli_generator.rb
166
208
  - lib/departure/command.rb
167
209
  - lib/departure/configuration.rb
210
+ - lib/departure/connection_base.rb
168
211
  - lib/departure/connection_details.rb
169
212
  - lib/departure/dsn.rb
170
213
  - lib/departure/errors.rb
171
214
  - lib/departure/log_sanitizers/password_sanitizer.rb
172
215
  - lib/departure/logger.rb
173
216
  - lib/departure/logger_factory.rb
217
+ - lib/departure/migration.rb
174
218
  - lib/departure/null_logger.rb
175
219
  - lib/departure/option.rb
176
220
  - lib/departure/railtie.rb
@@ -201,8 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
245
  - !ruby/object:Gem::Version
202
246
  version: '0'
203
247
  requirements: []
204
- rubyforge_project:
205
- rubygems_version: 2.4.5.2
248
+ rubygems_version: 3.3.7
206
249
  signing_key:
207
250
  specification_version: 4
208
251
  summary: pt-online-schema-change runner for ActiveRecord migrations
data/.travis.yml DELETED
@@ -1,14 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.2.8
4
- before_install:
5
- - sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 8507EFA5
6
- - echo "deb http://repo.percona.com/apt `lsb_release -cs` main" | sudo tee -a /etc/apt/sources.list
7
- - sudo apt-get update -qq
8
- - sudo apt-get install percona-toolkit
9
- - gem update bundler
10
-
11
- install: bin/setup
12
-
13
- after_success:
14
- - codeclimate-test-reporter