departure-76c9880 6.2.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 (48) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +8 -0
  3. data/.gitignore +12 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +60 -0
  6. data/.travis.yml +30 -0
  7. data/CHANGELOG.md +192 -0
  8. data/CODE_OF_CONDUCT.md +50 -0
  9. data/Dockerfile +32 -0
  10. data/Gemfile +6 -0
  11. data/LICENSE.txt +22 -0
  12. data/README.md +227 -0
  13. data/RELEASING.md +17 -0
  14. data/Rakefile +17 -0
  15. data/bin/console +14 -0
  16. data/bin/rspec +16 -0
  17. data/bin/setup +7 -0
  18. data/config.yml.erb +4 -0
  19. data/configuration.rb +16 -0
  20. data/departure.gemspec +35 -0
  21. data/docker-compose.yml +23 -0
  22. data/lib/active_record/connection_adapters/for_alter.rb +91 -0
  23. data/lib/active_record/connection_adapters/percona_adapter.rb +168 -0
  24. data/lib/departure.rb +43 -0
  25. data/lib/departure/alter_argument.rb +49 -0
  26. data/lib/departure/cli_generator.rb +84 -0
  27. data/lib/departure/command.rb +96 -0
  28. data/lib/departure/configuration.rb +20 -0
  29. data/lib/departure/connection_base.rb +9 -0
  30. data/lib/departure/connection_details.rb +96 -0
  31. data/lib/departure/dsn.rb +24 -0
  32. data/lib/departure/errors.rb +39 -0
  33. data/lib/departure/log_sanitizers/password_sanitizer.rb +22 -0
  34. data/lib/departure/logger.rb +42 -0
  35. data/lib/departure/logger_factory.rb +16 -0
  36. data/lib/departure/migration.rb +96 -0
  37. data/lib/departure/null_logger.rb +15 -0
  38. data/lib/departure/option.rb +75 -0
  39. data/lib/departure/railtie.rb +21 -0
  40. data/lib/departure/runner.rb +62 -0
  41. data/lib/departure/user_options.rb +44 -0
  42. data/lib/departure/version.rb +3 -0
  43. data/lib/lhm.rb +23 -0
  44. data/lib/lhm/adapter.rb +107 -0
  45. data/lib/lhm/column_with_sql.rb +96 -0
  46. data/lib/lhm/column_with_type.rb +29 -0
  47. data/test_database.rb +80 -0
  48. metadata +245 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bf36ce3a7bd698221c247f1f71cbcd3a89dbdf06b92f9a2578cf0de97da5645f
4
+ data.tar.gz: caf6bca450a5c7ac055a15531c05409316aef1ea57f959fc36a88930ca764ec0
5
+ SHA512:
6
+ metadata.gz: 753c451b099a1670d49506922cd6ed732aa05c016b7380d1812ac0d0ff012107335ea882bb64c794ba6bc6e84a218134966c9cc560a62685eb68e7de35186baf
7
+ data.tar.gz: 65321b556b5099203333836a989cbe4cf93adb0592a6e30d498d5ba75fea3f0798399b049cb2512f58f2007afece7ad0069eb0cba57c8b25d3363d53334dfc31
@@ -0,0 +1,8 @@
1
+ ---
2
+ engines:
3
+ rubocop:
4
+ enabled: true
5
+ channel: rubocop-0-49
6
+ ratings:
7
+ paths:
8
+ - "**.rb"
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .byebug_history
11
+ tags
12
+ departure_error.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,60 @@
1
+ ---
2
+ Metrics/AbcSize:
3
+ Enabled: false
4
+
5
+ Metrics/BlockLength:
6
+ Max: 20
7
+ Exclude:
8
+ - 'spec/*'
9
+ - 'spec/**/*'
10
+
11
+ Metrics/BlockNesting:
12
+ Max: 4
13
+
14
+ Metrics/ClassLength:
15
+ Max: 250
16
+
17
+ Metrics/LineLength:
18
+ Max: 120
19
+ Exclude:
20
+ - 'departure.gemspec'
21
+ - 'test_database.rb'
22
+
23
+ Metrics/MethodLength:
24
+ Max: 30
25
+
26
+ Metrics/ModuleLength:
27
+ Max: 250
28
+
29
+ Metrics/ParameterLists:
30
+ Max: 5
31
+
32
+ Performance/Casecmp:
33
+ Enabled: false
34
+
35
+ Style/BracesAroundHashParameters:
36
+ Exclude:
37
+ - 'spec/fixtures/migrate/**.rb'
38
+ - 'spec/integration/**.rb'
39
+
40
+ Style/CommandLiteral:
41
+ Exclude:
42
+ - 'test_database.rb'
43
+
44
+ Style/Documentation:
45
+ Enabled: false
46
+
47
+ Style/MultilineBlockChain:
48
+ Exclude:
49
+ - 'spec/integration_spec.rb'
50
+
51
+ Layout/MultilineMethodCallIndentation:
52
+ Enabled: false
53
+
54
+ Style/SymbolArray:
55
+ Enabled: false
56
+
57
+ Style/UnneededPercentQ:
58
+ Exclude:
59
+ - 'departure.gemspec'
60
+
@@ -0,0 +1,30 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.5.5
5
+ - 2.6.3
6
+ - 2.7.0
7
+
8
+ env:
9
+ - RAILS_VERSION="~> 6.0.0"
10
+ - RAILS_VERSION="~> 5.2.0"
11
+
12
+ jobs:
13
+ include:
14
+ - rvm: 2.4.6
15
+ env: RAILS_VERSION="~> 5.2.0"
16
+
17
+ services:
18
+ - mysql
19
+
20
+ before_install:
21
+ - travis_retry sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 8507EFA5
22
+ - echo "deb http://repo.percona.com/apt `lsb_release -cs` main" | sudo tee -a /etc/apt/sources.list
23
+ - sudo apt-get update -qq
24
+ - sudo apt-get install percona-toolkit
25
+ - gem update bundler
26
+
27
+ install: bin/setup
28
+
29
+ after_success:
30
+ - codeclimate-test-reporter
@@ -0,0 +1,192 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ Please follow the format in [Keep a Changelog](http://keepachangelog.com/)
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [6.2.0] - 2020-06-23
10
+
11
+ ### Added
12
+
13
+ - Support for ActiveRecord 6.0
14
+ - Support for ActiveRecord 5.2
15
+ - Relax mysql2 requirement to allow mysql2 0.5.3
16
+ - Support to batch multiple changes at once with #change_table
17
+ - Support for connection to MySQL server over SSL
18
+
19
+ ### Changed
20
+
21
+ - Depend only in railties and activerecord instead of rails gem
22
+
23
+ ### Deprecated
24
+ ### Removed
25
+ ### Fixed
26
+
27
+ - Fix support for removing foreign keys
28
+ - Fix PERCONA_ARGS syntax for critical-load option
29
+ - Make sure quotes in ALTER TABLE get correctly escaped
30
+ - Fixes for regex handling
31
+ - Fix LHM compatibility
32
+
33
+ ## [6.1.0] - 2018-02-27
34
+
35
+ ### Added
36
+ ### Changed
37
+
38
+ - Permit PERCONA_ARGS to be applied to db:migrate tasks
39
+
40
+ ### Deprecated
41
+ ### Removed
42
+ ### Fixed
43
+
44
+ - Output lines are no longer wrapped at 8 chars
45
+
46
+ ## [6.0.0] - 2017-09-25
47
+
48
+ ### Added
49
+
50
+ - Support for ActiveRecord 5.1
51
+
52
+ ### Changed
53
+ ### Deprecated
54
+ ### Removed
55
+ ### Fixed
56
+
57
+ ## [5.0.0] - 2017-09-19
58
+
59
+ ### Added
60
+
61
+ - Support for ActiveRecord 5.0
62
+ - Docker setup to run the spec suite
63
+
64
+ ### Changed
65
+ ### Deprecated
66
+ ### Removed
67
+ ### Fixed
68
+
69
+ - Allow using bash special characters in passwords
70
+
71
+ ## [4.0.1] - 2017-08-01
72
+
73
+ ### Added
74
+
75
+ - Support for all pt-osc command-line options, including short forms and array
76
+ arguments
77
+
78
+ ### Changed
79
+ ### Deprecated
80
+ ### Removed
81
+ ### Fixed
82
+
83
+ ## [4.0.0] - 2017-06-12
84
+
85
+ ### Added
86
+ ### Changed
87
+
88
+ - Rename the gem from percona_migrator to departure.
89
+
90
+ ### Deprecated
91
+ ### Removed
92
+
93
+ - Percona_migrator's deprecation warnings when installing and running the gem.
94
+
95
+ ### Fixed
96
+
97
+ ## [3.0.0] - 2016-04-07
98
+
99
+ ### Added
100
+
101
+ - Support for ActiveRecord 4.2.x
102
+ - Support for Mysql2 4.x
103
+ - Allow passing any `pt-online-schema-change`'s arguments through the
104
+ `PERCONA_ARGS` env var when executing a migration with `rake db:migrate:up`
105
+ or `db:migrate:down`.
106
+ - Allow setting global percona arguments via gem configuration
107
+ - Filter MySQL's password from logs
108
+
109
+ ### Changed
110
+
111
+ - Enable default pt-online-schema-change replicas discovering mechanism.
112
+ So far, this was purposely set to `none`. To keep this same behaviour
113
+ provide the `PERCONA_ARGS=--recursion-method=none` env var when running the
114
+ migration.
115
+
116
+ ## [1.0.0] - 2016-11-30
117
+
118
+ ### Added
119
+
120
+ - Show pt-online-schema-change's stdout while the migration is running instead
121
+ of at then and all at once.
122
+ - Store pt-online-schema-change's stderr to percona_migrator_error.log in the
123
+ default Rails tmp folder.
124
+ - Allow configuring the tmp directory where the error log gets written into,
125
+ with the `tmp_path` configuration setting.
126
+ - Support for ActiveRecord 4.0. Adds the following migration methods:
127
+ - #rename_index, #change_column_null, #add_reference, #remove_reference,
128
+ #set_field_encoding, #add_timestamps, #remove_timestamps, #rename_table,
129
+ #rename_column
130
+
131
+ ## [0.1.0.rc.7] - 2016-09-15
132
+
133
+ ### Added
134
+
135
+ - Toggle pt-online-schema-change's output as well when toggling the migration's
136
+ verbose option.
137
+
138
+ ### Changed
139
+
140
+ - Enabled pt-online-schema-change's output while running the migration, that got
141
+ broken in v0.1.0.rc.2
142
+
143
+ ## [0.1.0.rc.6] - 2016-04-07
144
+
145
+ ### Added
146
+
147
+ - Support non-ddl migrations by implementing the methods for the ActiveRecord
148
+ quering to work.
149
+
150
+ ### Changed
151
+
152
+ - Refactor the PerconaAdapter to use the Runner as connection client, as all the
153
+ other adapters.
154
+
155
+ ## [0.1.0.rc.5] - 2016-03-29
156
+
157
+ ### Changed
158
+
159
+ - Raise a ActiveRecord::StatementInvalid on failed migration. It also provides
160
+ more detailed error message when possible such as pt-onlin-schema-change
161
+ being missing.
162
+
163
+ ## [0.1.0.rc.4] - 2016-03-15
164
+
165
+ ### Added
166
+
167
+ - Support #drop_table
168
+ - Support for foreing keys in db/schema.rb when using [Foreigner
169
+ gem](https://github.com/matthuhiggins/foreigner) in Rails 3 apps. This allows to
170
+ define foreign keys with #execute, but does not provide support for
171
+ add_foreign_key yet.
172
+
173
+ ## [0.1.0.rc.3] - 2016-03-10
174
+
175
+ ### Added
176
+
177
+ - Support #execute. Allows to execute raw SQL from the migration
178
+
179
+ ## [0.1.0.rc.2] - 2016-03-09
180
+
181
+ ### Added
182
+
183
+ - VERBOSE env var in tests. Specially useful for integration tests.
184
+ - Fix #create_table migration method. Now it does create the table.
185
+
186
+ ### Changed
187
+
188
+ - Use ActiveRecord's logger instead of specifying one in the connection data.
189
+
190
+ ## [0.1.0.rc.1] - 2016-03-01
191
+
192
+ - Initial gem version
@@ -0,0 +1,50 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, and in the interest of
4
+ fostering an open and welcoming community, we pledge to respect all people who
5
+ contribute through reporting issues, posting feature requests, updating
6
+ documentation, submitting pull requests or patches, and other activities.
7
+
8
+ We are committed to making participation in this project a harassment-free
9
+ experience for everyone, regardless of level of experience, gender, gender
10
+ identity and expression, sexual orientation, disability, personal appearance,
11
+ body size, race, ethnicity, age, religion, or nationality.
12
+
13
+ Examples of unacceptable behavior by participants include:
14
+
15
+ * The use of sexualized language or imagery
16
+ * Personal attacks
17
+ * Trolling or insulting/derogatory comments
18
+ * Public or private harassment
19
+ * Publishing other's private information, such as physical or electronic
20
+ addresses, without explicit permission
21
+ * Other unethical or unprofessional conduct
22
+
23
+ Project maintainers have the right and responsibility to remove, edit, or
24
+ reject comments, commits, code, wiki edits, issues, and other contributions
25
+ that are not aligned to this Code of Conduct, or to ban temporarily or
26
+ permanently any contributor for other behaviors that they deem inappropriate,
27
+ threatening, offensive, or harmful.
28
+
29
+ By adopting this Code of Conduct, project maintainers commit themselves to
30
+ fairly and consistently applying these principles to every aspect of managing
31
+ this project. Project maintainers who do not follow or enforce the Code of
32
+ Conduct may be permanently removed from the project team.
33
+
34
+ This Code of Conduct applies both within project spaces and in public spaces
35
+ when an individual is representing the project or its community.
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
+ reported by contacting a project maintainer at accounts@redbooth.com. All
39
+ complaints will be reviewed and investigated and will result in a response that
40
+ is deemed necessary and appropriate to the circumstances. Maintainers are
41
+ obligated to maintain confidentiality with regard to the reporter of an
42
+ incident.
43
+
44
+
45
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
46
+ version 1.3.0, available at
47
+ [http://contributor-covenant.org/version/1/3/0/][version]
48
+
49
+ [homepage]: http://contributor-covenant.org
50
+ [version]: http://contributor-covenant.org/version/1/3/0/
@@ -0,0 +1,32 @@
1
+ FROM ruby:2.3.4
2
+ MAINTAINER muffinista@gmail.com
3
+
4
+ # Install apt based dependencies required to run Rails as
5
+ # well as RubyGems. As the Ruby image itself is based on a
6
+ # Debian image, we use apt-get to install those.
7
+ RUN apt-get update && apt-get install -y \
8
+ build-essential \
9
+ percona-toolkit
10
+
11
+ # Configure the main working directory. This is the base
12
+ # directory used in any further RUN, COPY, and ENTRYPOINT
13
+ # commands.
14
+ RUN mkdir -p /app /app/lib/departure
15
+ WORKDIR /app
16
+
17
+ # Copy the Gemfile as well as the Gemfile.lock and install
18
+ # the RubyGems. This is a separate step so the dependencies
19
+ # will be cached unless changes to one of those two files
20
+ # are made.
21
+ COPY departure.gemspec Gemfile ./
22
+ COPY lib/departure/version.rb ./lib/departure/
23
+
24
+ RUN gem install bundler && bundle install --jobs 20 --retry 5
25
+
26
+ # Copy the main application.
27
+ COPY . ./
28
+
29
+ # The main command to run when the container starts. Also
30
+ # tell the Rails dev server to bind to all interfaces by
31
+ # default.
32
+ #CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'codeclimate-test-reporter', '~> 1.0.3', group: :test, require: nil
6
+ gem 'rubocop', '~> 0.49.1', require: false
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright for portions of Departure are held by Redbooth, Inc., 2015-2017. All
4
+ other copyright for Departure are held by Pau Pérez, 2017.
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
@@ -0,0 +1,227 @@
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)
2
+
3
+ Departure is an **ActiveRecord connection adapter** that allows running
4
+ **MySQL online and non-blocking DDL** through `ActiveRecord::Migration` without needing
5
+ to use a different DSL other than Rails' migrations DSL.
6
+
7
+ It uses `pt-online-schema-change` command-line tool of
8
+ [Percona
9
+ Toolkit](https://www.percona.com/doc/percona-toolkit/2.0/pt-online-schema-change.html)
10
+ which runs MySQL alter table statements without downtime.
11
+
12
+ ## Rename from "Percona Migrator"
13
+
14
+ This project was formerly known as "Percona Migrator", but this incurs in an
15
+ infringement of Percona's trade mark policy and thus has to be renamed. Said
16
+ name is likely to cause confusion as to the source of the wrapper.
17
+
18
+ The next major versions will use "Departure" as gem name.
19
+
20
+ ## Installation
21
+
22
+ Departure relies on `pt-online-schema-change` from [Percona
23
+ Toolkit](https://www.percona.com/doc/percona-toolkit/2.0/pt-online-schema-change.html)
24
+
25
+ ### Mac
26
+
27
+ `brew install percona-toolkit`
28
+
29
+ If when running a migration you see an error like:
30
+
31
+ ```
32
+ PerconaMigrator::Error: Cannot connect to MySQL: Cannot connect to MySQL because
33
+ the Perl DBI module is not installed or not found.
34
+ ```
35
+
36
+ You also need to install the DBI and DBD::MySQL modules from `cpan`.
37
+
38
+ ```
39
+ $ sudo cpan
40
+ cpan> install DBI
41
+ cpan> install DBD::mysql
42
+ ```
43
+
44
+ ### Linux
45
+
46
+ #### Ubuntu/Debian based
47
+
48
+ `apt-get install percona-toolkit`
49
+
50
+ #### Arch Linux
51
+
52
+ `pacman -S percona-toolkit perl-dbd-mysql`
53
+
54
+ #### Other distros
55
+
56
+ For other Linux distributions check out the [Percona Toolkit download
57
+ page](https://www.percona.com/downloads/percona-toolkit/) to find the package
58
+ that fits your distribution.
59
+
60
+ You can also get it from [Percona's apt repository](https://www.percona.com/doc/percona-xtradb-cluster/5.5/installation/apt_repo.html)
61
+
62
+ Once installed, add this line to your application's Gemfile:
63
+
64
+ ```ruby
65
+ gem 'departure'
66
+ ```
67
+
68
+ And then execute:
69
+
70
+ $ bundle
71
+
72
+ Or install it yourself as:
73
+
74
+ $ gem install departure
75
+
76
+ ## Usage
77
+
78
+ Once you added it to your app's Gemfile, you can create and run Rails migrations
79
+ as usual.
80
+
81
+ All the `ALTER TABLE` statements will be executed with
82
+ `pt-online-schema-change`, which will provide additional output to the
83
+ migration.
84
+
85
+ ### pt-online-schema-change arguments
86
+
87
+ #### with environment variable
88
+
89
+ You can specify any `pt-online-schema-change` arguments when running the
90
+ migration. All what you pass in the PERCONA_ARGS env var, will be bypassed to the
91
+ binary, overwriting any default values. Note the format is the same as in
92
+ `pt-online-schema-change`. Check the full list in [Percona Toolkit
93
+ documentation](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html#options)
94
+
95
+ ```ruby
96
+ $ PERCONA_ARGS='--chunk-time=1' bundle exec rake db:migrate:up VERSION=xxx
97
+ ```
98
+
99
+ or even mulitple arguments
100
+
101
+ ```ruby
102
+ $ PERCONA_ARGS='--chunk-time=1 --critical-load Threads_running=55' bundle exec rake db:migrate:up VERSION=xxx
103
+ ```
104
+
105
+ Use caution when using PERCONA_ARGS with `db:migrate`, as your args will be applied
106
+ to every call that Departure makes to pt-osc.
107
+
108
+ #### with global configuration
109
+
110
+ You can specify any `pt-online-schema-change` arguments in global gem configuration
111
+ using `global_percona_args` option.
112
+
113
+ ```ruby
114
+ Departure.configure do |config|
115
+ config.global_percona_args = '--chunk-time=1 --critical-load Threads_running=55'
116
+ end
117
+ ```
118
+
119
+ Unlike using `PERCONA_ARGS`, options provided with global configuration will be applied
120
+ every time sql command is executed via `pt-online-schema-change`.
121
+
122
+ Arguments provided in global configuration can be overwritten with `PERCONA_ARGS` env variable.
123
+
124
+ We recommend using this option with caution and only when you understand the consequences.
125
+
126
+ ### LHM support
127
+
128
+ If you moved to Soundcloud's [Lhm](https://github.com/soundcloud/lhm) already,
129
+ we got you covered. Departure overrides Lhm's DSL so that all the alter
130
+ statements also go through `pt-online-schema-change` as well.
131
+
132
+ You can keep your Lhm migrations and start using Rails migration's DSL back
133
+ again in your next migration.
134
+
135
+ ## Configuration
136
+
137
+ You can override any of the default values from an initializer:
138
+
139
+ ```ruby
140
+ Departure.configure do |config|
141
+ config.tmp_path = '/tmp/'
142
+ end
143
+ ```
144
+
145
+ It's strongly recommended to name it after this gems name, such as
146
+ `config/initializers/departure.rb`
147
+
148
+ ### Only enabled on a per-migration basis
149
+
150
+ If you wish to only have Departure enabled per-migration, set `config.enabled_by_default = false` in the configure block of your departure initializer.
151
+
152
+ Then, add a `uses_departure!` statement in migrations where Departure should be used:
153
+
154
+ ```ruby
155
+ class UseDepartureMigration < ActiveRecord::Migration[5.2]
156
+ uses_departure!
157
+
158
+ def up
159
+ # ...
160
+ end
161
+ # ...
162
+ end
163
+ ```
164
+
165
+ ## How it works
166
+
167
+ When booting your Rails app, Departure extends the
168
+ `ActiveRecord::Migration#migrate` method to reset the connection and reestablish
169
+ it using the `DepartureAdapter` instead of the one you defined in your
170
+ `config/database.yml`.
171
+
172
+ Then, when any migration DSL methods such as `add_column` or `create_table` are
173
+ executed, they all go to the
174
+ [DepartureAdapter](https://github.com/departurerb/departure/blob/master/lib/active_record/connection_adapters/departure_adapter.rb).
175
+ There, the methods that require `ALTER TABLE` SQL statements, like `add_column`,
176
+ are overriden to get executed with
177
+ [Departure::Runner](https://github.com/departurerb/departure/blob/master/lib/departure/runner.rb),
178
+ which deals with the `pt-online-schema-change` binary. All the others, like
179
+ `create_table`, are delegated to the ActiveRecord's built in Mysql2Adapter and
180
+ so they follow the regular path.
181
+
182
+ [Departure::Runner](https://github.com/departurerb/departure/blob/master/lib/departure/runner.rb)
183
+ spawns a new process that runs the `pt-online-schema-change` binary present in
184
+ the system, with the appropriate arguments for the generated SQL.
185
+
186
+ When any errors occur, an `ActiveRecord::StatementInvalid` exception is
187
+ raised and the migration is aborted, as all other ActiveRecord connection
188
+ adapters.
189
+
190
+ ## Trouleshooting
191
+
192
+ ### Error creating new table: DBD::mysql::db do failed: Can't write; duplicate key in table (TABLE_NAME)
193
+ There is a [known bug](https://bugs.launchpad.net/percona-toolkit/+bug/1498128) in percona-toolkit version 2.2.15
194
+ that prevents schema changes when a table has constraints. You should upgrade to a version later than 2.2.17 to fix the issue.
195
+
196
+ ## Development
197
+
198
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run
199
+ `rake spec` to run the tests. You can also run `bin/console` for an interactive
200
+ prompt that will allow you to experiment.
201
+
202
+ To install this gem onto your local machine, run `bundle exec rake install`. To
203
+ release a new version, update the version number in `version.rb`, and then run
204
+ `bundle exec rake release`, which will create a git tag for the version, push
205
+ git commits and tags, and push the `.gem` file to
206
+ [rubygems.org](https://rubygems.org).
207
+
208
+ ## Contributing
209
+
210
+ Bug reports and pull requests are welcome on GitHub at
211
+ https://github.com/departurerb/departure. They need to be opened against
212
+ `master` or `v3.2` only if the changes fix a bug in Rails 3.2 apps.
213
+
214
+ Please note that this project is released with a Contributor Code of Conduct. By
215
+ participating in this project you agree to abide by its terms.
216
+
217
+ Check the code of conduct [here](CODE_OF_CONDUCT.md)
218
+
219
+ ## Changelog
220
+
221
+ You can consult the changelog [here](CHANGELOG.md)
222
+
223
+ ## License
224
+
225
+ The gem is available as open source under the terms of the [MIT
226
+ License](http://opensource.org/licenses/MIT).
227
+