ridgepole 0.8.11 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +23 -2
- 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 +46 -43
- 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 +20 -20
- data/spec/mysql/fk/migrate_create_fk_spec.rb +22 -22
- data/spec/mysql/fk/migrate_drop_fk_spec.rb +26 -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 +24 -55
- 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_helper.rb +1 -1
- metadata +69 -44
- 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: 3aa2d123eaa04d61f3b9c602714abb2c2b8f8a8c26fe98a4179972a999544781
|
4
|
+
data.tar.gz: 1bed7b6f6caab7b80c86eb885cbe462db3a8970f558cc8a9fbd6bad6d5a728f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2455d86f97127f948c38ff7a86ff436008729defcc560dc81eb05e41647c65f4def830ee2f0f522ba0e235d879ac88876254d0edbab27be0c5b58189e978522f
|
7
|
+
data.tar.gz: 8cfdf0654b03655332dfe06b70cadda456dc9300360342ba4a47c3703d1dca25ca1bf93908c08febc556d8b75820b35198aabed497410e6ab1fa2ad67391fb09
|
data/.github/workflows/test.yml
CHANGED
@@ -20,13 +20,15 @@ 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
|
+
- ruby: 2.4
|
31
|
+
gemfile: gemfiles/activerecord_6.1.gemfile
|
30
32
|
|
31
33
|
steps:
|
32
34
|
- uses: actions/checkout@v2
|
@@ -44,6 +46,7 @@ jobs:
|
|
44
46
|
run: |
|
45
47
|
for i in {1..60}; do docker-compose up -d && break; sleep 1; done
|
46
48
|
|
49
|
+
gem install bundler
|
47
50
|
bundle config path vendor/bundle
|
48
51
|
bundle install --jobs 4 --retry 3
|
49
52
|
|
@@ -57,6 +60,24 @@ jobs:
|
|
57
60
|
env:
|
58
61
|
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
59
62
|
|
60
|
-
-
|
63
|
+
- name: Run tests
|
64
|
+
run: ${{ matrix.env }} bundle exec rake
|
61
65
|
env:
|
62
66
|
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
67
|
+
|
68
|
+
- name: Coveralls Parallel
|
69
|
+
uses: coverallsapp/github-action@v1.1.2
|
70
|
+
with:
|
71
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
72
|
+
flag-name: run-${{ matrix.ruby }}-${{ matrix.env }}-${{ matrix.gemfile }}
|
73
|
+
parallel: true
|
74
|
+
|
75
|
+
finish:
|
76
|
+
needs: build
|
77
|
+
runs-on: ubuntu-latest
|
78
|
+
steps:
|
79
|
+
- name: Coveralls Finished
|
80
|
+
uses: coverallsapp/github-action@v1.1.2
|
81
|
+
with:
|
82
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
83
|
+
parallel-finished: true
|
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
|
[![Gem Version](https://badge.fury.io/rb/ridgepole.svg)](http://badge.fury.io/rb/ridgepole)
|
9
|
-
[![Build Status](https://github.com/winebarrel/ridgepole/workflows/test/badge.svg?branch=0.
|
10
|
-
[![Coverage Status](https://coveralls.io/repos/github/winebarrel/ridgepole/badge.svg?branch=0.
|
9
|
+
[![Build Status](https://github.com/winebarrel/ridgepole/workflows/test/badge.svg?branch=0.9)](https://github.com/winebarrel/ridgepole/actions)
|
10
|
+
[![Coverage Status](https://coveralls.io/repos/github/winebarrel/ridgepole/badge.svg?branch=0.9)](https://coveralls.io/github/winebarrel/ridgepole?branch=0.9)
|
11
11
|
|
12
12
|
<details><summary>ChangeLog</summary>
|
13
13
|
|
@@ -125,8 +125,26 @@ It defines DB schema using [Rails DSL](http://guides.rubyonrails.org/migrations.
|
|
125
125
|
* `>= 0.8.11`
|
126
126
|
* Fix FK index check support multiple PK ([pull#315](https://github.com/winebarrel/ridgepole/pull/315))
|
127
127
|
* Support t.reference() foreign_key option ([pull#316](https://github.com/winebarrel/ridgepole/pull/316))
|
128
|
+
* `>= 0.8.12`
|
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-alter-index` 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))
|
128
138
|
</details>
|
129
139
|
|
140
|
+
**Notice**
|
141
|
+
|
142
|
+
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.
|
143
|
+
|
144
|
+
**If you use ActiveRecord 6.1, please modify Schemafile format**.
|
145
|
+
|
146
|
+
cf. https://github.com/winebarrel/ridgepole/pull/323
|
147
|
+
|
130
148
|
## Installation
|
131
149
|
|
132
150
|
Add this line to your application's Gemfile:
|
@@ -141,26 +159,6 @@ Or install it yourself as:
|
|
141
159
|
|
142
160
|
$ gem install ridgepole
|
143
161
|
|
144
|
-
## Omnibus Package (deb/rpm)
|
145
|
-
|
146
|
-
see https://github.com/winebarrel/ridgepole/releases.
|
147
|
-
|
148
|
-
### Install from deb
|
149
|
-
|
150
|
-
```sh
|
151
|
-
sudo dpkg -i ridgepole_x.x.x+xxx-x_amd64.deb
|
152
|
-
sudo apt install build-essential libmysqlclient-dev
|
153
|
-
sudo /opt/ridgepole/embedded/bin/gem install mysql2
|
154
|
-
```
|
155
|
-
|
156
|
-
### Install from rpm
|
157
|
-
|
158
|
-
```sh
|
159
|
-
sudo yum install ridgepole-x.x.x+xxx-x.el7.x86_64.rpm
|
160
|
-
sudo yum install make gcc mariadb-devel
|
161
|
-
sudo /opt/ridgepole/embedded/bin/gem install mysql2
|
162
|
-
```
|
163
|
-
|
164
162
|
## Help
|
165
163
|
```
|
166
164
|
Usage: ridgepole [options]
|
@@ -172,6 +170,7 @@ Usage: ridgepole [options]
|
|
172
170
|
-f, --file SCHEMAFILE
|
173
171
|
--dry-run
|
174
172
|
--table-options OPTIONS
|
173
|
+
--table-hash-options OPTIONS
|
175
174
|
--alter-extra ALTER_SPEC
|
176
175
|
--external-script SCRIPT
|
177
176
|
--bulk-change
|
@@ -192,7 +191,6 @@ Usage: ridgepole [options]
|
|
192
191
|
-o, --output SCHEMAFILE
|
193
192
|
-t, --tables TABLES
|
194
193
|
--ignore-tables REGEX_LIST
|
195
|
-
--mysql-use-alter
|
196
194
|
--dump-without-table-options
|
197
195
|
--dump-with-default-fk-name
|
198
196
|
--index-removed-drop-column
|
@@ -351,7 +349,7 @@ add_index "books", ["author_id"], name: "idx_author_id", using: :btree
|
|
351
349
|
|
352
350
|
execute("ALTER TABLE books ADD CONSTRAINT fk_author FOREIGN KEY (author_id) REFERENCES authors (id)") do |c|
|
353
351
|
# Execute SQL only if there is no foreign key
|
354
|
-
c.raw_connection.query(<<-SQL).each.
|
352
|
+
c.raw_connection.query(<<-SQL).each.size.zero?
|
355
353
|
SELECT 1 FROM information_schema.key_column_usage
|
356
354
|
WHERE TABLE_SCHEMA = 'bookshelf'
|
357
355
|
AND CONSTRAINT_NAME = 'fk_author' LIMIT 1
|
@@ -402,20 +400,6 @@ Apply `Schemafile`
|
|
402
400
|
-> 0.0471s
|
403
401
|
```
|
404
402
|
|
405
|
-
## Use ALTER instead of CREATE/DROP INDEX
|
406
|
-
|
407
|
-
```sh
|
408
|
-
$ ridgepole -a -c database.yml --mysql-use-alter --debug
|
409
|
-
Apply `Schemafile`
|
410
|
-
...
|
411
|
-
-- remove_index("dept_manager", {:name=>"emp_no"})
|
412
|
-
(19.2ms) ALTER TABLE `dept_manager` DROP INDEX `emp_no`
|
413
|
-
-> 0.0200s
|
414
|
-
-- add_index("dept_manager", ["emp_no"], {:name=>"emp_no2", :using=>:btree})
|
415
|
-
(23.4ms) ALTER TABLE `dept_manager` ADD INDEX `emp_no2` USING btree (`emp_no`)
|
416
|
-
-> 0.0243s
|
417
|
-
```
|
418
|
-
|
419
403
|
## Relation column type check
|
420
404
|
|
421
405
|
```ruby
|
@@ -464,6 +448,3 @@ bundle exec appraisal activerecord-5.1 rake
|
|
464
448
|
* https://github.com/winebarrel/ridgepole-example
|
465
449
|
* https://github.com/winebarrel/ridgepole-example/pull/1
|
466
450
|
* https://github.com/winebarrel/ridgepole-example/pull/2
|
467
|
-
|
468
|
-
## Similar tools
|
469
|
-
* [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 = {
|