ridgepole 0.8.12 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +27 -20
- data/.rubocop.yml +5 -4
- data/.simplecov +6 -0
- data/Appraisals +4 -5
- data/README.md +22 -41
- data/bin/ridgepole +13 -3
- data/gemfiles/{activerecord_5.0.gemfile → activerecord_6.1.gemfile} +1 -2
- data/lib/ridgepole/client.rb +8 -3
- data/lib/ridgepole/default_limit.rb +1 -1
- data/lib/ridgepole/delta.rb +16 -1
- data/lib/ridgepole/diff.rb +50 -31
- data/lib/ridgepole/dsl_parser/table_definition.rb +49 -42
- data/lib/ridgepole/execute_expander.rb +10 -1
- data/lib/ridgepole/ext/abstract_adapter/disable_table_options.rb +9 -1
- data/lib/ridgepole/external_sql_executer.rb +12 -1
- data/lib/ridgepole/version.rb +1 -1
- data/ridgepole.gemspec +6 -3
- data/spec/erb_helper.rb +1 -1
- data/spec/mysql/_migrate/migrate_change_table_option_spec.rb +2 -2
- data/spec/mysql/bigint_pk/int_pk_spec.rb +1 -1
- data/spec/mysql/cli/ridgepole_spec.rb +35 -1
- data/spec/mysql/collation/collation_spec.rb +14 -14
- data/spec/mysql/comment/comment_spec.rb +9 -9
- data/spec/mysql/diff/diff2_spec.rb +5 -5
- data/spec/mysql/diff/diff_spec.rb +3 -3
- data/spec/mysql/dump/dump_class_method_spec.rb +13 -13
- data/spec/mysql/dump/dump_some_tables_spec.rb +4 -4
- data/spec/mysql/dump/dump_spec.rb +13 -13
- data/spec/mysql/dump/dump_unknown_column_type_spec.rb +2 -2
- data/spec/mysql/dump/dump_without_table_options_spec.rb +2 -2
- data/spec/mysql/fk/migrate_change_fk2_spec.rb +2 -2
- data/spec/mysql/fk/migrate_change_fk_spec.rb +88 -20
- data/spec/mysql/fk/migrate_create_fk_spec.rb +77 -22
- data/spec/mysql/fk/migrate_drop_fk_spec.rb +81 -26
- data/spec/mysql/fk/migrate_fk_with_column_spec.rb +16 -16
- data/spec/mysql/fk/migrate_ignore_fk_spec.rb +6 -6
- data/spec/mysql/migrate/migrate_add_column_order_spec.rb +2 -2
- data/spec/mysql/migrate/migrate_add_column_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_add_column_with_alter_extra_spec.rb +106 -18
- data/spec/mysql/migrate/migrate_add_column_with_script_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_change_column2_spec.rb +5 -5
- data/spec/mysql/migrate/migrate_change_column3_spec.rb +10 -10
- data/spec/mysql/migrate/migrate_change_column5_spec.rb +3 -3
- data/spec/mysql/migrate/migrate_change_column6_spec.rb +7 -7
- data/spec/mysql/migrate/migrate_change_column8_spec.rb +38 -5
- data/spec/mysql/migrate/migrate_change_column_default_spec.rb +2 -14
- data/spec/mysql/migrate/migrate_change_column_spec.rb +21 -21
- data/spec/mysql/migrate/migrate_change_index2_spec.rb +5 -5
- data/spec/mysql/migrate/migrate_change_index3_spec.rb +7 -7
- data/spec/mysql/migrate/migrate_change_index4_spec.rb +6 -6
- data/spec/mysql/migrate/migrate_change_index5_spec.rb +4 -4
- data/spec/mysql/migrate/migrate_change_index6_spec.rb +27 -27
- data/spec/mysql/migrate/migrate_change_index7_spec.rb +4 -4
- data/spec/mysql/migrate/migrate_change_index8_spec.rb +4 -4
- data/spec/mysql/migrate/migrate_change_index_spec.rb +34 -28
- data/spec/mysql/migrate/migrate_check_relation_column_type_spec.rb +5 -5
- data/spec/mysql/migrate/migrate_create_index2_spec.rb +24 -24
- data/spec/mysql/migrate/migrate_create_index_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_create_table_spec.rb +16 -16
- data/spec/mysql/migrate/migrate_create_table_with_ignore_spec.rb +4 -4
- data/spec/mysql/migrate/migrate_create_table_with_index_spec.rb +4 -4
- data/spec/mysql/migrate/migrate_create_table_with_script_spec.rb +16 -16
- data/spec/mysql/migrate/migrate_drop_column_and_index2_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_drop_column_and_index_spec.rb +16 -16
- data/spec/mysql/migrate/migrate_drop_column_and_unique_index_spec.rb +1 -1
- data/spec/mysql/migrate/migrate_drop_column_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_drop_index_spec.rb +15 -15
- data/spec/mysql/migrate/migrate_drop_table_spec.rb +16 -16
- data/spec/mysql/migrate/migrate_empty_spec.rb +9 -9
- data/spec/mysql/migrate/migrate_execute_spec.rb +32 -32
- data/spec/mysql/migrate/migrate_ignore_column_spec.rb +4 -4
- data/spec/mysql/migrate/migrate_ignore_index_spec.rb +5 -5
- data/spec/mysql/migrate/migrate_log_file_spec.rb +16 -16
- data/spec/mysql/migrate/migrate_merge_mode_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_noop_spec.rb +12 -12
- data/spec/mysql/migrate/migrate_primary_key_spec.rb +31 -6
- data/spec/mysql/migrate/migrate_rename_column_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_rename_table_spec.rb +22 -22
- data/spec/mysql/migrate/migrate_same_spec.rb +13 -13
- data/spec/mysql/migrate/migrate_skip_column_comment_change_spec.rb +2 -2
- data/spec/mysql/migrate/migrate_skip_drop_table_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_skip_rename_column_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_skip_rename_table_spec.rb +18 -18
- data/spec/mysql/migrate/migrate_with_pre_post_query_spec.rb +18 -18
- data/spec/mysql/text_blob_types/text_blob_types_spec.rb +2 -2
- data/spec/mysql/~default_name_fk/migrate_change_fk_spec.rb +6 -6
- data/spec/mysql/~default_name_fk/migrate_create_fk_spec.rb +9 -9
- data/spec/mysql/~default_name_fk/migrate_drop_fk_spec.rb +8 -8
- data/spec/mysql/~dump_auto_increment/migrate_create_table_with_index_spec.rb +5 -5
- data/spec/mysql57/json/add_json_column_spec.rb +2 -2
- data/spec/mysql57/json/change_json_column_spec.rb +6 -6
- data/spec/mysql57/json/drop_json_column_spec.rb +2 -2
- data/spec/mysql57/virtual/add_virtual_column_spec.rb +1 -1
- data/spec/mysql57/virtual/change_virtual_column_spec.rb +1 -1
- data/spec/mysql57/virtual/drop_virtual_column_spec.rb +1 -1
- data/spec/postgresql/dump/dump_spec.rb +13 -13
- data/spec/postgresql/fk/migrate_change_fk_spec.rb +6 -6
- data/spec/postgresql/fk/migrate_create_fk_spec.rb +5 -5
- data/spec/postgresql/fk/migrate_drop_fk_spec.rb +8 -8
- data/spec/postgresql/migrate/migrate_add_column_spec.rb +27 -20
- data/spec/postgresql/migrate/migrate_add_expression_index_spec.rb +1 -1
- data/spec/postgresql/migrate/migrate_change_column_spec.rb +20 -16
- data/spec/postgresql/migrate/migrate_change_index_spec.rb +18 -18
- data/spec/postgresql/migrate/migrate_check_relation_column_type_spec.rb +1 -1
- data/spec/postgresql/migrate/migrate_create_table_spec.rb +14 -14
- data/spec/postgresql/migrate/migrate_drop_column_spec.rb +29 -22
- data/spec/postgresql/migrate/migrate_drop_column_with_index_spec.rb +17 -17
- data/spec/postgresql/migrate/migrate_drop_expression_index_spec.rb +3 -3
- data/spec/postgresql/migrate/migrate_drop_index_spec.rb +15 -15
- data/spec/postgresql/migrate/migrate_drop_table_spec.rb +16 -16
- data/spec/postgresql/migrate/migrate_primary_key2_spec.rb +1 -1
- data/spec/postgresql/migrate/migrate_primary_key_spec.rb +1 -1
- data/spec/postgresql/migrate/migrate_references_spec.rb +6 -6
- data/spec/postgresql/migrate/migrate_rename_column_spec.rb +18 -18
- data/spec/postgresql/migrate/migrate_rename_table_spec.rb +20 -20
- data/spec/postgresql/migrate/migrate_same_spec.rb +13 -13
- data/spec/postgresql/~default_name_fk/migrate_change_fk_spec.rb +3 -3
- data/spec/postgresql/~default_name_fk/migrate_create_fk_spec.rb +4 -4
- data/spec/postgresql/~default_name_fk/migrate_drop_fk_spec.rb +4 -4
- data/spec/processing_for_ci.rb +13 -0
- data/spec/spec_const.rb +1 -1
- data/spec/spec_helper.rb +2 -1
- metadata +68 -43
- data/lib/ridgepole/ext/abstract_mysql_adapter/use_alter_index.rb +0 -31
- data/omnibus-ridgepole/.gitignore +0 -10
- data/omnibus-ridgepole/Dockerfile.centos +0 -25
- data/omnibus-ridgepole/Dockerfile.ubuntu +0 -21
- data/omnibus-ridgepole/Gemfile +0 -24
- data/omnibus-ridgepole/README.md +0 -15
- data/omnibus-ridgepole/Rakefile +0 -38
- data/omnibus-ridgepole/config/projects/ridgepole.rb +0 -27
- data/omnibus-ridgepole/config/software/ridgepole.rb +0 -13
- data/omnibus-ridgepole/omnibus.rb +0 -54
- data/omnibus-ridgepole/package-scripts/ridgepole/postinst +0 -1
- data/omnibus-ridgepole/package-scripts/ridgepole/postrm +0 -1
- data/spec/mysql/bigint_pk/bigint_pk_spec.rb +0 -47
- data/spec/mysql/migrate_/migrate_create_index_with_alter_spec.rb +0 -141
- data/spec/mysql/migrate_/migrate_drop_index_with_alter_spec.rb +0 -141
- data/spec/processing_for_travis.rb +0 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4f3d6aadf39f73ef720c5f19404e303f98e75919164e51240570472d21c6c14e
|
|
4
|
+
data.tar.gz: 2e494165ba2dbd2c1a700ae3ebda831b43ca4439017a96513756f47d9f64f901
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5b173d5e01ea89b0065dc617989cb89dd000050bf4aa973af74c714b55f7cbe414f932c6a44c1a9cc4dc10cf2e8db4ca590bd68ddc34176901700ab5c1d569e2
|
|
7
|
+
data.tar.gz: 20b1fa9092d28d119d9604ea3ffb7b11abe8080bb2edf6a6f0af88e095cb88724bb40836a59939f1eadee693386c0fbb64cf3876d56c4f3cdd4fd0f123a2b571
|
data/.github/workflows/test.yml
CHANGED
|
@@ -20,44 +20,51 @@ jobs:
|
|
|
20
20
|
- MYSQL57=1
|
|
21
21
|
- POSTGRESQL=1
|
|
22
22
|
gemfile:
|
|
23
|
-
- gemfiles/activerecord_5.0.gemfile
|
|
24
23
|
- gemfiles/activerecord_5.1.gemfile
|
|
25
24
|
- gemfiles/activerecord_5.2.gemfile
|
|
26
25
|
- gemfiles/activerecord_6.0.gemfile
|
|
26
|
+
- gemfiles/activerecord_6.1.gemfile
|
|
27
27
|
exclude:
|
|
28
28
|
- ruby: 2.4
|
|
29
29
|
gemfile: gemfiles/activerecord_6.0.gemfile
|
|
30
|
-
|
|
30
|
+
- ruby: 2.4
|
|
31
|
+
gemfile: gemfiles/activerecord_6.1.gemfile
|
|
32
|
+
env:
|
|
33
|
+
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
|
31
34
|
steps:
|
|
32
35
|
- uses: actions/checkout@v2
|
|
33
|
-
- uses:
|
|
36
|
+
- uses: ruby/setup-ruby@v1
|
|
34
37
|
with:
|
|
35
38
|
ruby-version: ${{ matrix.ruby }}
|
|
36
|
-
|
|
37
|
-
with:
|
|
38
|
-
path: gemfiles/vendor/bundle
|
|
39
|
-
key: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.gemfile }}-${{ hashFiles('ridgepole.gemspec', '**/Gemfile', '${{ matrix.gemfile }}') }}
|
|
40
|
-
restore-keys: |
|
|
41
|
-
${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.gemfile }}-
|
|
42
|
-
|
|
39
|
+
bundler-cache: true
|
|
43
40
|
- name: Setup dependencies
|
|
44
41
|
run: |
|
|
45
42
|
for i in {1..60}; do docker-compose up -d && break; sleep 1; done
|
|
46
|
-
|
|
47
|
-
gem install bundler
|
|
48
|
-
bundle config path vendor/bundle
|
|
49
|
-
bundle install --jobs 4 --retry 3
|
|
50
|
-
|
|
51
43
|
# Wait until database servers start
|
|
52
|
-
function mysql_ping { mysqladmin -u root -h 127.0.0.1 -P 13316 -
|
|
53
|
-
function mysql57_ping { mysqladmin -u root -h 127.0.0.1 -P 13317 -
|
|
44
|
+
function mysql_ping { mysqladmin -u root -h 127.0.0.1 -P 13316 ping --ssl-mode=DISABLED; }
|
|
45
|
+
function mysql57_ping { mysqladmin -u root -h 127.0.0.1 -P 13317 ping --ssl-mode=DISABLED; }
|
|
54
46
|
function pg_ping { PGPASSWORD=password pg_isready -U postgres -h 127.0.0.1 -p 15442; }
|
|
55
47
|
for i in {1..60}; do mysql_ping && break; sleep 1; done
|
|
56
48
|
for i in {1..60}; do mysql57_ping && break; sleep 1; done
|
|
57
49
|
for i in {1..60}; do pg_ping && break; sleep 1; done
|
|
58
50
|
env:
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
MYSQL_PWD: password
|
|
52
|
+
- name: Run tests
|
|
53
|
+
run: ${{ matrix.env }} bundle exec rake
|
|
62
54
|
env:
|
|
63
55
|
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
|
56
|
+
- name: Coveralls Parallel
|
|
57
|
+
uses: coverallsapp/github-action@v1.1.2
|
|
58
|
+
with:
|
|
59
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
60
|
+
flag-name: run-${{ matrix.ruby }}-${{ matrix.env }}-${{ matrix.gemfile }}
|
|
61
|
+
parallel: true
|
|
62
|
+
finish:
|
|
63
|
+
needs: build
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
steps:
|
|
66
|
+
- name: Coveralls Finished
|
|
67
|
+
uses: coverallsapp/github-action@v1.1.2
|
|
68
|
+
with:
|
|
69
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
70
|
+
parallel-finished: true
|
data/.rubocop.yml
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
AllCops:
|
|
2
2
|
Exclude:
|
|
3
|
-
-
|
|
4
|
-
-
|
|
3
|
+
- "gemfiles/**/*"
|
|
4
|
+
- "omnibus-ridgepole/**/*"
|
|
5
|
+
- "vendor/bundle/**/*"
|
|
5
6
|
TargetRubyVersion: 2.4
|
|
6
7
|
NewCops: enable
|
|
7
8
|
Bundler/OrderedGems:
|
|
8
9
|
Include:
|
|
9
|
-
-
|
|
10
|
+
- "Appraisals"
|
|
10
11
|
Layout/HeredocIndentation:
|
|
11
12
|
Enabled: false
|
|
12
13
|
Metrics/AbcSize:
|
|
@@ -33,7 +34,7 @@ Style/GuardClause:
|
|
|
33
34
|
Enabled: false
|
|
34
35
|
Style/MixinUsage:
|
|
35
36
|
Exclude:
|
|
36
|
-
-
|
|
37
|
+
- "spec/**/*"
|
|
37
38
|
Style/TrailingCommaInHashLiteral:
|
|
38
39
|
EnforcedStyleForMultiline: consistent_comma
|
|
39
40
|
Layout/ClosingHeredocIndentation:
|
data/.simplecov
ADDED
data/Appraisals
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
appraise 'activerecord-5.0' do
|
|
4
|
-
gem 'activerecord', '~> 5.0.1'
|
|
5
|
-
gem 'pg', '< 1.0.0'
|
|
6
|
-
end
|
|
7
|
-
|
|
8
3
|
appraise 'activerecord-5.1' do
|
|
9
4
|
gem 'activerecord', '~> 5.1.0'
|
|
10
5
|
end
|
|
@@ -17,3 +12,7 @@ end
|
|
|
17
12
|
appraise 'activerecord-6.0' do
|
|
18
13
|
gem 'activerecord', '~> 6.0.0'
|
|
19
14
|
end
|
|
15
|
+
|
|
16
|
+
appraise 'activerecord-6.1' do
|
|
17
|
+
gem 'activerecord', '~> 6.1.0'
|
|
18
|
+
end
|
data/README.md
CHANGED
|
@@ -6,8 +6,8 @@ It defines DB schema using [Rails DSL](http://guides.rubyonrails.org/migrations.
|
|
|
6
6
|
(like Chef/Puppet)
|
|
7
7
|
|
|
8
8
|
[](http://badge.fury.io/rb/ridgepole)
|
|
9
|
-
[](https://github.com/winebarrel/ridgepole/actions)
|
|
10
|
+
[](https://coveralls.io/github/winebarrel/ridgepole?branch=0.9)
|
|
11
11
|
|
|
12
12
|
<details><summary>ChangeLog</summary>
|
|
13
13
|
|
|
@@ -127,8 +127,26 @@ It defines DB schema using [Rails DSL](http://guides.rubyonrails.org/migrations.
|
|
|
127
127
|
* Support t.reference() foreign_key option ([pull#316](https://github.com/winebarrel/ridgepole/pull/316))
|
|
128
128
|
* `>= 0.8.12`
|
|
129
129
|
* Pluralize column specified by `references` ([pull#317](https://github.com/winebarrel/ridgepole/pull/317))
|
|
130
|
+
* `>= 0.8.13`
|
|
131
|
+
* Support `serial` and `bigserial` column types ([pull#321](https://github.com/winebarrel/ridgepole/pull/321))
|
|
132
|
+
* `>= 0.9.0`
|
|
133
|
+
* Remove `--mysql-use-alter` option ([pull#330](https://github.com/winebarrel/ridgepole/pull/330))
|
|
134
|
+
* Add `--table-hash-options` option ([pull#331](https://github.com/winebarrel/ridgepole/pull/331))
|
|
135
|
+
* Support Rails 6.1 ([pull#323](https://github.com/winebarrel/ridgepole/pull/323))
|
|
136
|
+
* Disable Rails 5.0 support ([pull#335](https://github.com/winebarrel/ridgepole/pull/335))
|
|
137
|
+
* Fix PK AUTO_INCREMENT change bug ([pull#334](https://github.com/winebarrel/ridgepole/pull/334))
|
|
138
|
+
* `>= 0.9.1`
|
|
139
|
+
* Support `t.foreign_key` ([pull#348](https://github.com/winebarrel/ridgepole/pull/348))
|
|
130
140
|
</details>
|
|
131
141
|
|
|
142
|
+
**Notice**
|
|
143
|
+
|
|
144
|
+
ActiveRecord 6.1 is supported in ridgepole v0.9, but the ActiveRecord dump has been changed, so there is a difference between ActiveRecord 5.x/6.0 format.
|
|
145
|
+
|
|
146
|
+
**If you use ActiveRecord 6.1, please modify Schemafile format**.
|
|
147
|
+
|
|
148
|
+
cf. https://github.com/winebarrel/ridgepole/pull/323
|
|
149
|
+
|
|
132
150
|
## Installation
|
|
133
151
|
|
|
134
152
|
Add this line to your application's Gemfile:
|
|
@@ -143,26 +161,6 @@ Or install it yourself as:
|
|
|
143
161
|
|
|
144
162
|
$ gem install ridgepole
|
|
145
163
|
|
|
146
|
-
## Omnibus Package (deb/rpm)
|
|
147
|
-
|
|
148
|
-
see https://github.com/winebarrel/ridgepole/releases.
|
|
149
|
-
|
|
150
|
-
### Install from deb
|
|
151
|
-
|
|
152
|
-
```sh
|
|
153
|
-
sudo dpkg -i ridgepole_x.x.x+xxx-x_amd64.deb
|
|
154
|
-
sudo apt install build-essential libmysqlclient-dev
|
|
155
|
-
sudo /opt/ridgepole/embedded/bin/gem install mysql2
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Install from rpm
|
|
159
|
-
|
|
160
|
-
```sh
|
|
161
|
-
sudo yum install ridgepole-x.x.x+xxx-x.el7.x86_64.rpm
|
|
162
|
-
sudo yum install make gcc mariadb-devel
|
|
163
|
-
sudo /opt/ridgepole/embedded/bin/gem install mysql2
|
|
164
|
-
```
|
|
165
|
-
|
|
166
164
|
## Help
|
|
167
165
|
```
|
|
168
166
|
Usage: ridgepole [options]
|
|
@@ -174,6 +172,7 @@ Usage: ridgepole [options]
|
|
|
174
172
|
-f, --file SCHEMAFILE
|
|
175
173
|
--dry-run
|
|
176
174
|
--table-options OPTIONS
|
|
175
|
+
--table-hash-options OPTIONS
|
|
177
176
|
--alter-extra ALTER_SPEC
|
|
178
177
|
--external-script SCRIPT
|
|
179
178
|
--bulk-change
|
|
@@ -194,7 +193,6 @@ Usage: ridgepole [options]
|
|
|
194
193
|
-o, --output SCHEMAFILE
|
|
195
194
|
-t, --tables TABLES
|
|
196
195
|
--ignore-tables REGEX_LIST
|
|
197
|
-
--mysql-use-alter
|
|
198
196
|
--dump-without-table-options
|
|
199
197
|
--dump-with-default-fk-name
|
|
200
198
|
--index-removed-drop-column
|
|
@@ -353,7 +351,7 @@ add_index "books", ["author_id"], name: "idx_author_id", using: :btree
|
|
|
353
351
|
|
|
354
352
|
execute("ALTER TABLE books ADD CONSTRAINT fk_author FOREIGN KEY (author_id) REFERENCES authors (id)") do |c|
|
|
355
353
|
# Execute SQL only if there is no foreign key
|
|
356
|
-
c.raw_connection.query(<<-SQL).each.
|
|
354
|
+
c.raw_connection.query(<<-SQL).each.size.zero?
|
|
357
355
|
SELECT 1 FROM information_schema.key_column_usage
|
|
358
356
|
WHERE TABLE_SCHEMA = 'bookshelf'
|
|
359
357
|
AND CONSTRAINT_NAME = 'fk_author' LIMIT 1
|
|
@@ -404,20 +402,6 @@ Apply `Schemafile`
|
|
|
404
402
|
-> 0.0471s
|
|
405
403
|
```
|
|
406
404
|
|
|
407
|
-
## Use ALTER instead of CREATE/DROP INDEX
|
|
408
|
-
|
|
409
|
-
```sh
|
|
410
|
-
$ ridgepole -a -c database.yml --mysql-use-alter --debug
|
|
411
|
-
Apply `Schemafile`
|
|
412
|
-
...
|
|
413
|
-
-- remove_index("dept_manager", {:name=>"emp_no"})
|
|
414
|
-
(19.2ms) ALTER TABLE `dept_manager` DROP INDEX `emp_no`
|
|
415
|
-
-> 0.0200s
|
|
416
|
-
-- add_index("dept_manager", ["emp_no"], {:name=>"emp_no2", :using=>:btree})
|
|
417
|
-
(23.4ms) ALTER TABLE `dept_manager` ADD INDEX `emp_no2` USING btree (`emp_no`)
|
|
418
|
-
-> 0.0243s
|
|
419
|
-
```
|
|
420
|
-
|
|
421
405
|
## Relation column type check
|
|
422
406
|
|
|
423
407
|
```ruby
|
|
@@ -466,6 +450,3 @@ bundle exec appraisal activerecord-5.1 rake
|
|
|
466
450
|
* https://github.com/winebarrel/ridgepole-example
|
|
467
451
|
* https://github.com/winebarrel/ridgepole-example/pull/1
|
|
468
452
|
* https://github.com/winebarrel/ridgepole-example/pull/2
|
|
469
|
-
|
|
470
|
-
## Similar tools
|
|
471
|
-
* [Codenize.tools](http://codenize.tools/)
|
data/bin/ridgepole
CHANGED
|
@@ -86,6 +86,19 @@ ARGV.options do |opt|
|
|
|
86
86
|
opt.on('-f', '--file SCHEMAFILE') { |v| file = v }
|
|
87
87
|
opt.on('', '--dry-run') { options[:dry_run] = true }
|
|
88
88
|
opt.on('', '--table-options OPTIONS') { |v| options[:table_options] = v }
|
|
89
|
+
opt.on('', '--table-hash-options OPTIONS') do |v|
|
|
90
|
+
# NOTE: Ruby2.4 doesn't support `symbolize_names: true`
|
|
91
|
+
hash = YAML.safe_load(v).deep_symbolize_keys
|
|
92
|
+
|
|
93
|
+
case hash[:id]
|
|
94
|
+
when String
|
|
95
|
+
hash[:id] = hash[:id].to_sym
|
|
96
|
+
when Hash
|
|
97
|
+
hash[:id][:type] = hash[:id][:type].to_sym if hash[:id][:type]
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
options[:table_hash_options] = hash
|
|
101
|
+
end
|
|
89
102
|
opt.on('', '--alter-extra ALTER_SPEC') { |v| options[:alter_extra] = v }
|
|
90
103
|
opt.on('', '--external-script SCRIPT') { |v| options[:external_script] = v }
|
|
91
104
|
opt.on('', '--bulk-change') do
|
|
@@ -121,7 +134,6 @@ ARGV.options do |opt|
|
|
|
121
134
|
opt.on('-o', '--output SCHEMAFILE') { |v| output_file = v }
|
|
122
135
|
opt.on('-t', '--tables TABLES', Array) { |v| options[:tables] = v }
|
|
123
136
|
opt.on('', '--ignore-tables REGEX_LIST', Array) { |v| options[:ignore_tables] = v.map { |i| Regexp.new(i) } }
|
|
124
|
-
opt.on('', '--mysql-use-alter') { options[:mysql_use_alter] = true }
|
|
125
137
|
opt.on('', '--dump-without-table-options') { options[:dump_without_table_options] = true }
|
|
126
138
|
opt.on('', '--dump-with-default-fk-name') { options[:dump_with_default_fk_name] = true }
|
|
127
139
|
opt.on('', '--index-removed-drop-column') { options[:index_removed_drop_column] = true }
|
|
@@ -135,8 +147,6 @@ ARGV.options do |opt|
|
|
|
135
147
|
opt.on('', '--create-table-with-index') { options[:create_table_with_index] = true }
|
|
136
148
|
|
|
137
149
|
opt.on('', '--mysql-dump-auto-increment') do
|
|
138
|
-
raise OptionParser::InvalidOption, '`mysql-dump-auto-increment` is not available in `activerecord < 5.1`' if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('5.1')
|
|
139
|
-
|
|
140
150
|
options[:mysql_dump_auto_increment] = true
|
|
141
151
|
end
|
|
142
152
|
|
data/lib/ridgepole/client.rb
CHANGED
|
@@ -15,8 +15,6 @@ module Ridgepole
|
|
|
15
15
|
@parser = Ridgepole::DSLParser.new(@options)
|
|
16
16
|
@diff = Ridgepole::Diff.new(@options)
|
|
17
17
|
|
|
18
|
-
require 'ridgepole/ext/abstract_mysql_adapter/use_alter_index' if @options[:mysql_use_alter]
|
|
19
|
-
|
|
20
18
|
require 'ridgepole/ext/abstract_mysql_adapter/dump_auto_increment' if @options[:mysql_dump_auto_increment]
|
|
21
19
|
end
|
|
22
20
|
|
|
@@ -32,7 +30,7 @@ module Ridgepole
|
|
|
32
30
|
logger.verbose_info('# Parse DSL')
|
|
33
31
|
expected_definition, expected_execute = @parser.parse(dsl, opts)
|
|
34
32
|
expected_definition.each do |_table, definition|
|
|
35
|
-
definition
|
|
33
|
+
merge_table_options(definition)
|
|
36
34
|
end
|
|
37
35
|
logger.verbose_info('# Load tables')
|
|
38
36
|
current_definition, _current_execute = @parser.parse(@dumper.dump, opts)
|
|
@@ -40,6 +38,13 @@ module Ridgepole
|
|
|
40
38
|
@diff.diff(current_definition, expected_definition, execute: expected_execute)
|
|
41
39
|
end
|
|
42
40
|
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def merge_table_options(definition)
|
|
44
|
+
definition[:options].reverse_merge!(@options[:table_hash_options]) if @options[:table_hash_options]
|
|
45
|
+
definition[:options][:options] ||= @options[:table_options] if @options[:table_options]
|
|
46
|
+
end
|
|
47
|
+
|
|
43
48
|
class << self
|
|
44
49
|
def diff(dsl_or_config1, dsl_or_config2, options = {})
|
|
45
50
|
logger = Ridgepole::Logger.instance
|
data/lib/ridgepole/delta.rb
CHANGED
|
@@ -292,6 +292,19 @@ execute "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name
|
|
|
292
292
|
buf.puts
|
|
293
293
|
end
|
|
294
294
|
|
|
295
|
+
def append_change_table_raw_options(table_name, raw_table_options, table_charset, table_collation, buf)
|
|
296
|
+
if raw_table_options.blank? && ActiveRecord.gem_version >= Gem::Version.new('6.1.0')
|
|
297
|
+
# Implicit engine is InnoDB in 6.1.0
|
|
298
|
+
# related: https://github.com/rails/rails/pull/39365/files#diff-868f1dccfcbed26a288bf9f3fd8a39c863a4413ab0075e12b6805d9798f556d1R441
|
|
299
|
+
raw_table_options = +'ENGINE=InnoDB'
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
raw_table_options << " DEFAULT CHARSET=#{table_charset}" if table_charset
|
|
303
|
+
raw_table_options << " COLLATE=#{table_collation}" if table_collation
|
|
304
|
+
|
|
305
|
+
append_change_table_options(table_name, raw_table_options, buf)
|
|
306
|
+
end
|
|
307
|
+
|
|
295
308
|
def append_change_table_comment(table_name, table_comment, buf)
|
|
296
309
|
comment_literal = "COMMENT=#{ActiveRecord::Base.connection.quote(table_comment)}"
|
|
297
310
|
append_change_table_options(table_name, comment_literal, buf)
|
|
@@ -303,6 +316,8 @@ execute "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name
|
|
|
303
316
|
indices = attrs[:indices] || {}
|
|
304
317
|
foreign_keys = attrs[:foreign_keys] || {}
|
|
305
318
|
table_options = attrs[:table_options]
|
|
319
|
+
table_charset = attrs[:table_charset]
|
|
320
|
+
table_collation = attrs[:table_collation]
|
|
306
321
|
table_comment = attrs[:table_comment]
|
|
307
322
|
|
|
308
323
|
if !definition.empty? || !indices.empty? || !primary_key_definition.empty?
|
|
@@ -316,7 +331,7 @@ execute "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name
|
|
|
316
331
|
|
|
317
332
|
append_change_foreign_keys(table_name, foreign_keys, pre_buf_for_fk, post_buf_for_fk, @options) unless foreign_keys.empty?
|
|
318
333
|
|
|
319
|
-
|
|
334
|
+
append_change_table_raw_options(table_name, table_options, table_charset, table_collation, buf) if table_options || table_charset || table_collation
|
|
320
335
|
|
|
321
336
|
append_change_table_comment(table_name, table_comment, buf) if table_comment
|
|
322
337
|
|
data/lib/ridgepole/diff.rb
CHANGED
|
@@ -114,23 +114,33 @@ module Ridgepole
|
|
|
114
114
|
|
|
115
115
|
normalize_default_proc_options!(from, to)
|
|
116
116
|
|
|
117
|
-
from_options = from[:options] || {}
|
|
118
|
-
to_options = to[:options] || {}
|
|
119
|
-
|
|
120
117
|
if @options[:ignore_table_comment]
|
|
121
118
|
from.delete(:comment)
|
|
122
119
|
to.delete(:comment)
|
|
123
120
|
end
|
|
124
121
|
|
|
125
|
-
[from, to].each do |table_attrs|
|
|
126
|
-
table_attrs.delete(:default) if table_attrs.key?(:default) && table_attrs[:default].nil?
|
|
127
|
-
end
|
|
128
|
-
|
|
129
122
|
if Ridgepole::ConnectionAdapters.mysql?
|
|
130
|
-
if @options[:mysql_change_table_options]
|
|
131
|
-
from
|
|
132
|
-
to
|
|
133
|
-
|
|
123
|
+
if @options[:mysql_change_table_options]
|
|
124
|
+
from_options = from[:options] || {}
|
|
125
|
+
to_options = to[:options] || {}
|
|
126
|
+
|
|
127
|
+
if from_options != to_options
|
|
128
|
+
table_delta[:table_options] = to_options
|
|
129
|
+
from.delete(:options)
|
|
130
|
+
to.delete(:options)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
if from[:charset] != to[:charset]
|
|
134
|
+
table_delta[:table_charset] = to[:charset]
|
|
135
|
+
from.delete(:charset)
|
|
136
|
+
to.delete(:charset)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
if from[:collation] != to[:collation]
|
|
140
|
+
table_delta[:table_collation] = to[:collation]
|
|
141
|
+
from.delete(:collation)
|
|
142
|
+
to.delete(:collation)
|
|
143
|
+
end
|
|
134
144
|
end
|
|
135
145
|
|
|
136
146
|
if @options[:mysql_change_table_comment] && (from[:comment] != to[:comment])
|
|
@@ -142,10 +152,14 @@ module Ridgepole
|
|
|
142
152
|
|
|
143
153
|
if @options[:dump_without_table_options]
|
|
144
154
|
from.delete(:options)
|
|
155
|
+
from.delete(:charset)
|
|
156
|
+
from.delete(:collation)
|
|
145
157
|
to.delete(:options)
|
|
158
|
+
to.delete(:charset)
|
|
159
|
+
to.delete(:collation)
|
|
146
160
|
end
|
|
147
161
|
|
|
148
|
-
pk_attrs = build_primary_key_attrs_if_changed(from, to
|
|
162
|
+
pk_attrs = build_primary_key_attrs_if_changed(from, to)
|
|
149
163
|
if pk_attrs
|
|
150
164
|
if @options[:allow_pk_change]
|
|
151
165
|
if from[:id] == false
|
|
@@ -177,33 +191,36 @@ module Ridgepole
|
|
|
177
191
|
end
|
|
178
192
|
|
|
179
193
|
def convert_to_primary_key_attrs(column_options)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
194
|
+
type = Ridgepole::DSLParser::TableDefinition::DEFAULT_PRIMARY_KEY_TYPE
|
|
195
|
+
options = column_options.deep_dup
|
|
196
|
+
|
|
197
|
+
if options[:id].is_a?(Hash)
|
|
198
|
+
options_id = options.delete(:id)
|
|
199
|
+
type = options_id.delete(:type) if options_id[:type]
|
|
200
|
+
options.merge!(options_id.slice(*PRIMARY_KEY_OPTIONS))
|
|
201
|
+
elsif options[:id]
|
|
202
|
+
type = options.delete(:id)
|
|
203
|
+
end
|
|
187
204
|
|
|
188
205
|
options[:auto_increment] = true if %i[integer bigint].include?(type) && !options.key?(:default) && !Ridgepole::ConnectionAdapters.postgresql?
|
|
189
206
|
|
|
190
207
|
{ type: type, options: options }
|
|
191
208
|
end
|
|
192
209
|
|
|
193
|
-
def build_attrs_if_changed(to_attrs, from_attrs,
|
|
210
|
+
def build_attrs_if_changed(to_attrs, from_attrs, primary_key: false)
|
|
194
211
|
normalize_column_options!(from_attrs, primary_key)
|
|
195
212
|
normalize_column_options!(to_attrs, primary_key)
|
|
196
213
|
|
|
197
|
-
new_to_attrs = fix_change_column_options(
|
|
214
|
+
new_to_attrs = fix_change_column_options(from_attrs, to_attrs) unless compare_column_attrs(from_attrs, to_attrs)
|
|
198
215
|
new_to_attrs
|
|
199
216
|
end
|
|
200
217
|
|
|
201
|
-
def build_primary_key_attrs_if_changed(from, to
|
|
218
|
+
def build_primary_key_attrs_if_changed(from, to)
|
|
202
219
|
from_column_attrs = convert_to_primary_key_attrs(from.slice(*PRIMARY_KEY_OPTIONS))
|
|
203
220
|
to_column_attrs = convert_to_primary_key_attrs(to.slice(*PRIMARY_KEY_OPTIONS))
|
|
204
221
|
return if from_column_attrs == to_column_attrs
|
|
205
222
|
|
|
206
|
-
build_attrs_if_changed(to_column_attrs, from_column_attrs,
|
|
223
|
+
build_attrs_if_changed(to_column_attrs, from_column_attrs, primary_key: true)
|
|
207
224
|
end
|
|
208
225
|
|
|
209
226
|
def scan_definition_change(from, to, from_indices, table_name, table_options, table_delta)
|
|
@@ -225,7 +242,7 @@ module Ridgepole
|
|
|
225
242
|
next if ignore_column
|
|
226
243
|
|
|
227
244
|
if from_attrs
|
|
228
|
-
to_attrs = build_attrs_if_changed(to_attrs, from_attrs
|
|
245
|
+
to_attrs = build_attrs_if_changed(to_attrs, from_attrs)
|
|
229
246
|
if to_attrs
|
|
230
247
|
definition_delta[:change] ||= {}
|
|
231
248
|
definition_delta[:change][column_name] = to_attrs
|
|
@@ -454,7 +471,7 @@ module Ridgepole
|
|
|
454
471
|
# XXX: MySQL only?
|
|
455
472
|
# https://github.com/rails/rails/blob/v4.2.1/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb#L760
|
|
456
473
|
# https://github.com/rails/rails/blob/v4.2.1/activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb#L102
|
|
457
|
-
def fix_change_column_options(
|
|
474
|
+
def fix_change_column_options(from_attrs, to_attrs)
|
|
458
475
|
# default: 0, null: false -> default: nil, null: false | default: nil
|
|
459
476
|
# default: 0, null: false -> null: false | default: nil
|
|
460
477
|
# default: 0, null: false -> default: nil, null: true | default: nil, null: true
|
|
@@ -469,10 +486,6 @@ module Ridgepole
|
|
|
469
486
|
to_attrs[:options].delete(:null)
|
|
470
487
|
end
|
|
471
488
|
|
|
472
|
-
if Ridgepole::ConnectionAdapters.mysql? && ActiveRecord::VERSION::STRING.start_with?('5.0.')
|
|
473
|
-
Ridgepole::Logger.instance.warn("[WARNING] Table `#{table_name}`: `default: nil` is ignored when `null: false`. Please apply twice") if to_attrs[:options][:default].nil? && (to_attrs[:options][:null] == false)
|
|
474
|
-
end
|
|
475
|
-
|
|
476
489
|
to_attrs
|
|
477
490
|
end
|
|
478
491
|
|
|
@@ -551,9 +564,15 @@ module Ridgepole
|
|
|
551
564
|
table_options = parent_table_info.fetch(:options)
|
|
552
565
|
next if table_options[:id] == false
|
|
553
566
|
|
|
567
|
+
options_id = table_options[:id]
|
|
568
|
+
parent_type, parent_unsigned = if options_id.is_a?(Hash)
|
|
569
|
+
[options_id[:type], options_id[:unsigned]]
|
|
570
|
+
else
|
|
571
|
+
[table_options[:id], table_options[:unsigned]]
|
|
572
|
+
end
|
|
554
573
|
parent_column_info = {
|
|
555
|
-
type:
|
|
556
|
-
unsigned:
|
|
574
|
+
type: parent_type || @options[:check_relation_type].to_sym,
|
|
575
|
+
unsigned: parent_unsigned,
|
|
557
576
|
}
|
|
558
577
|
|
|
559
578
|
child_column_info = {
|