ridgepole 0.8.7 → 0.8.12
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 +63 -0
- data/.rubocop.yml +11 -2
- data/README.md +14 -2
- data/lib/ridgepole/delta.rb +28 -21
- data/lib/ridgepole/diff.rb +12 -0
- data/lib/ridgepole/dsl_parser.rb +3 -4
- data/lib/ridgepole/dsl_parser/context.rb +2 -3
- data/lib/ridgepole/dsl_parser/table_definition.rb +7 -0
- data/lib/ridgepole/ext/abstract_mysql_adapter/use_alter_index.rb +1 -1
- data/lib/ridgepole/external_sql_executer.rb +1 -1
- data/lib/ridgepole/version.rb +1 -1
- data/ridgepole.gemspec +1 -1
- data/spec/erb_helper.rb +4 -4
- data/spec/mysql/collation/collation_spec.rb +6 -0
- data/spec/mysql/diff/diff2_spec.rb +3 -3
- data/spec/mysql/diff/diff_spec.rb +3 -3
- data/spec/mysql/fk/migrate_create_fk_spec.rb +79 -10
- data/spec/mysql/fk/migrate_drop_fk_spec.rb +1 -1
- data/spec/mysql/fk/migrate_fk_with_column_spec.rb +2 -2
- data/spec/mysql/migrate/migrate_add_column_spec.rb +5 -5
- data/spec/mysql/migrate/migrate_change_column3_spec.rb +109 -18
- data/spec/mysql/migrate/migrate_change_column_spec.rb +5 -5
- data/spec/mysql/migrate/migrate_change_index_spec.rb +9 -9
- data/spec/mysql/migrate/migrate_create_index_spec.rb +6 -6
- data/spec/mysql/migrate/migrate_create_table_with_index_spec.rb +7 -7
- data/spec/mysql/migrate/migrate_create_table_with_options_spec.rb +8 -8
- data/spec/mysql/migrate/migrate_drop_column_and_index_spec.rb +4 -4
- data/spec/mysql/migrate/migrate_drop_column_spec.rb +3 -3
- data/spec/mysql/migrate/migrate_drop_index_spec.rb +6 -6
- data/spec/mysql/migrate/migrate_rename_column_spec.rb +3 -3
- data/spec/mysql/migrate/migrate_script_error_spec.rb +1 -1
- data/spec/mysql/text_blob_types/text_blob_types_spec.rb +4 -1
- data/spec/mysql/~default_name_fk/migrate_create_fk_spec.rb +1 -1
- data/spec/mysql/~default_name_fk/migrate_drop_fk_spec.rb +1 -1
- data/spec/mysql/~dump_auto_increment/migrate_create_table_with_index_spec.rb +7 -7
- data/spec/postgresql/diff/diff_spec.rb +2 -2
- data/spec/postgresql/fk/migrate_create_fk_spec.rb +2 -2
- data/spec/postgresql/fk/migrate_drop_fk_spec.rb +1 -1
- data/spec/postgresql/migrate/migrate_add_column_spec.rb +5 -5
- data/spec/postgresql/migrate/migrate_change_column_spec.rb +4 -4
- data/spec/postgresql/migrate/migrate_change_index_spec.rb +9 -9
- data/spec/postgresql/migrate/migrate_drop_column_spec.rb +3 -3
- data/spec/postgresql/migrate/migrate_drop_column_with_index_spec.rb +5 -5
- data/spec/postgresql/migrate/migrate_drop_expression_index_spec.rb +1 -1
- data/spec/postgresql/migrate/migrate_drop_index_spec.rb +6 -6
- data/spec/postgresql/migrate/migrate_rename_column_spec.rb +2 -2
- data/spec/postgresql/~default_name_fk/migrate_create_fk_spec.rb +1 -1
- data/spec/postgresql/~default_name_fk/migrate_drop_fk_spec.rb +1 -1
- data/spec/spec_condition.rb +4 -4
- data/spec/spec_helper.rb +2 -1
- metadata +7 -7
- data/.travis.yml +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91c51bf51596b61eff43704847bd41b9f8035ceafd1f1e05e1cd72fc6632e582
|
4
|
+
data.tar.gz: 32aff893209c48b839286b7efe24d465e3dd808d3b8820f52a5fb4eb9ecbf606
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92c24eca95293b83ab73871c9baaff349e8d28be8ddc5583746d3beecf0b6986eb58127361654fc0742c95b68f9ac2c060ca689af98a9ca6558b78c960b2a35b
|
7
|
+
data.tar.gz: 6864c16bbd8723436219540b7a3ab0f5eccfb32ae5301ac827957b9671c8cf83d7a91ea13a9a364f3b94ef236d2b3334742adce0524f7cb22801d298757cb0cd
|
@@ -0,0 +1,63 @@
|
|
1
|
+
name: test
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
pull_request:
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
build:
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
strategy:
|
11
|
+
fail-fast: false
|
12
|
+
matrix:
|
13
|
+
ruby:
|
14
|
+
- 2.4
|
15
|
+
- 2.5
|
16
|
+
- 2.6
|
17
|
+
- 2.7
|
18
|
+
env:
|
19
|
+
- MYSQL56=1
|
20
|
+
- MYSQL57=1
|
21
|
+
- POSTGRESQL=1
|
22
|
+
gemfile:
|
23
|
+
- gemfiles/activerecord_5.0.gemfile
|
24
|
+
- gemfiles/activerecord_5.1.gemfile
|
25
|
+
- gemfiles/activerecord_5.2.gemfile
|
26
|
+
- gemfiles/activerecord_6.0.gemfile
|
27
|
+
exclude:
|
28
|
+
- ruby: 2.4
|
29
|
+
gemfile: gemfiles/activerecord_6.0.gemfile
|
30
|
+
|
31
|
+
steps:
|
32
|
+
- uses: actions/checkout@v2
|
33
|
+
- uses: actions/setup-ruby@v1
|
34
|
+
with:
|
35
|
+
ruby-version: ${{ matrix.ruby }}
|
36
|
+
- uses: actions/cache@v2
|
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
|
+
|
43
|
+
- name: Setup dependencies
|
44
|
+
run: |
|
45
|
+
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
|
+
# Wait until database servers start
|
52
|
+
function mysql_ping { mysqladmin -u root -h 127.0.0.1 -P 13316 -ppassword ping; }
|
53
|
+
function mysql57_ping { mysqladmin -u root -h 127.0.0.1 -P 13317 -ppassword ping; }
|
54
|
+
function pg_ping { PGPASSWORD=password pg_isready -U postgres -h 127.0.0.1 -p 15442; }
|
55
|
+
for i in {1..60}; do mysql_ping && break; sleep 1; done
|
56
|
+
for i in {1..60}; do mysql57_ping && break; sleep 1; done
|
57
|
+
for i in {1..60}; do pg_ping && break; sleep 1; done
|
58
|
+
env:
|
59
|
+
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
60
|
+
|
61
|
+
- run: ${{ matrix.env }} bundle exec rake
|
62
|
+
env:
|
63
|
+
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
data/.rubocop.yml
CHANGED
@@ -3,6 +3,7 @@ AllCops:
|
|
3
3
|
- 'gemfiles/**/*'
|
4
4
|
- 'omnibus-ridgepole/**/*'
|
5
5
|
TargetRubyVersion: 2.4
|
6
|
+
NewCops: enable
|
6
7
|
Bundler/OrderedGems:
|
7
8
|
Include:
|
8
9
|
- 'Appraisals'
|
@@ -30,8 +31,6 @@ Style/Documentation:
|
|
30
31
|
Enabled: false
|
31
32
|
Style/GuardClause:
|
32
33
|
Enabled: false
|
33
|
-
Style/MethodMissingSuper:
|
34
|
-
Enabled: false
|
35
34
|
Style/MixinUsage:
|
36
35
|
Exclude:
|
37
36
|
- 'spec/**/*'
|
@@ -41,3 +40,13 @@ Layout/ClosingHeredocIndentation:
|
|
41
40
|
Enabled: false
|
42
41
|
Style/NumericPredicate:
|
43
42
|
Enabled: false
|
43
|
+
Lint/MissingSuper:
|
44
|
+
Enabled: false
|
45
|
+
Style/StringConcatenation:
|
46
|
+
Enabled: false
|
47
|
+
Style/SoleNestedConditional:
|
48
|
+
Enabled: false
|
49
|
+
Lint/DuplicateBranch:
|
50
|
+
Enabled: false
|
51
|
+
Style/OptionalBooleanParameter:
|
52
|
+
Enabled: false
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ 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://
|
9
|
+
[![Build Status](https://github.com/winebarrel/ridgepole/workflows/test/badge.svg?branch=0.8)](https://github.com/winebarrel/ridgepole/actions)
|
10
10
|
[![Coverage Status](https://coveralls.io/repos/github/winebarrel/ridgepole/badge.svg?branch=0.8)](https://coveralls.io/github/winebarrel/ridgepole?branch=0.8)
|
11
11
|
|
12
12
|
<details><summary>ChangeLog</summary>
|
@@ -115,6 +115,18 @@ It defines DB schema using [Rails DSL](http://guides.rubyonrails.org/migrations.
|
|
115
115
|
* Support multiple databases feature ([pull#297](https://github.com/winebarrel/ridgepole/pull/297))
|
116
116
|
* `>= 0.8.7`
|
117
117
|
* Support `require_relative` ([pull#298](https://github.com/winebarrel/ridgepole/pull/298))
|
118
|
+
* `>= 0.8.8`
|
119
|
+
* Fix keyword arguments warnings in Ruby 2.7 ([pull#303](https://github.com/winebarrel/ridgepole/pull/303))
|
120
|
+
* `>= 0.8.9`
|
121
|
+
* Fix unexpected differences on text types and blob types on Rails 6 ([pull#306](https://github.com/winebarrel/ridgepole/pull/306))
|
122
|
+
* Fix unexpected warning when a foreign key is added on the primary key ([pull#307](https://github.com/winebarrel/ridgepole/pull/307))
|
123
|
+
* `>= 0.8.10`
|
124
|
+
* Raise an error if an InnoDB column has a foreign key but no index ([pull#310](https://github.com/winebarrel/ridgepole/pull/310))
|
125
|
+
* `>= 0.8.11`
|
126
|
+
* Fix FK index check support multiple PK ([pull#315](https://github.com/winebarrel/ridgepole/pull/315))
|
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))
|
118
130
|
</details>
|
119
131
|
|
120
132
|
## Installation
|
@@ -193,6 +205,7 @@ Usage: ridgepole [options]
|
|
193
205
|
--ignore-table-comment
|
194
206
|
--skip-column-comment-change
|
195
207
|
--create-table-with-index
|
208
|
+
--allow-pk-change
|
196
209
|
--mysql-dump-auto-increment
|
197
210
|
-r, --require LIBS
|
198
211
|
--log-file LOG_FILE
|
@@ -309,7 +322,6 @@ end
|
|
309
322
|
```
|
310
323
|
|
311
324
|
## Collation/Charset
|
312
|
-
You can use the column collation by passing `--enable-mysql-awesome` ([activerecord-mysql-awesome](https://github.com/kamipo/activerecord-mysql-awesome) is required)
|
313
325
|
|
314
326
|
```ruby
|
315
327
|
create_table "articles", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
data/lib/ridgepole/delta.rb
CHANGED
@@ -326,7 +326,7 @@ execute "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name
|
|
326
326
|
end
|
327
327
|
|
328
328
|
def append_change_table(table_name, buf)
|
329
|
-
buf.puts "change_table(#{table_name.inspect},
|
329
|
+
buf.puts "change_table(#{table_name.inspect}, bulk: true) do |t|" if @options[:bulk_change]
|
330
330
|
yield
|
331
331
|
buf.puts 'end' if @options[:bulk_change]
|
332
332
|
end
|
@@ -429,11 +429,11 @@ remove_column(#{table_name.inspect}, #{column_name.inspect})
|
|
429
429
|
|
430
430
|
if force_bulk_change || @options[:bulk_change]
|
431
431
|
buf.puts(<<-RUBY)
|
432
|
-
t.index(#{column_name.inspect},
|
432
|
+
t.index(#{column_name.inspect}, **#{options.inspect})
|
433
433
|
RUBY
|
434
434
|
else
|
435
435
|
buf.puts(<<-RUBY)
|
436
|
-
add_index(#{table_name.inspect}, #{column_name.inspect},
|
436
|
+
add_index(#{table_name.inspect}, #{column_name.inspect}, **#{options.inspect})
|
437
437
|
RUBY
|
438
438
|
end
|
439
439
|
end
|
@@ -441,15 +441,20 @@ add_index(#{table_name.inspect}, #{column_name.inspect}, #{options.inspect})
|
|
441
441
|
def append_remove_index(table_name, _index_name, attrs, buf)
|
442
442
|
column_name = attrs.fetch(:column_name)
|
443
443
|
options = attrs[:options] || {}
|
444
|
-
target =
|
444
|
+
target =
|
445
|
+
if options[:name]
|
446
|
+
"name: #{options[:name].inspect}"
|
447
|
+
else
|
448
|
+
column_name.inspect
|
449
|
+
end
|
445
450
|
|
446
451
|
if @options[:bulk_change]
|
447
452
|
buf.puts(<<-RUBY)
|
448
|
-
t.remove_index(#{target
|
453
|
+
t.remove_index(#{target})
|
449
454
|
RUBY
|
450
455
|
else
|
451
456
|
buf.puts(<<-RUBY)
|
452
|
-
remove_index(#{table_name.inspect}, #{target
|
457
|
+
remove_index(#{table_name.inspect}, #{target})
|
453
458
|
RUBY
|
454
459
|
end
|
455
460
|
end
|
@@ -469,7 +474,7 @@ remove_index(#{table_name.inspect}, #{target.inspect})
|
|
469
474
|
attrs_options = attrs[:options] || {}
|
470
475
|
|
471
476
|
buf.puts(<<-RUBY)
|
472
|
-
add_foreign_key(#{table_name.inspect}, #{to_table.inspect},
|
477
|
+
add_foreign_key(#{table_name.inspect}, #{to_table.inspect}, **#{attrs_options.inspect})
|
473
478
|
RUBY
|
474
479
|
end
|
475
480
|
|
@@ -478,13 +483,13 @@ add_foreign_key(#{table_name.inspect}, #{to_table.inspect}, #{attrs_options.insp
|
|
478
483
|
fk_name = attrs_options[:name]
|
479
484
|
|
480
485
|
target = if fk_name
|
481
|
-
|
486
|
+
"name: #{fk_name.inspect}"
|
482
487
|
else
|
483
|
-
attrs.fetch(:to_table)
|
488
|
+
attrs.fetch(:to_table).inspect
|
484
489
|
end
|
485
490
|
|
486
491
|
buf.puts(<<-RUBY)
|
487
|
-
remove_foreign_key(#{table_name.inspect}, #{target
|
492
|
+
remove_foreign_key(#{table_name.inspect}, #{target})
|
488
493
|
RUBY
|
489
494
|
end
|
490
495
|
|
@@ -500,17 +505,19 @@ remove_foreign_key(#{table_name.inspect}, #{target.inspect})
|
|
500
505
|
def inspect_options_include_default_proc(options)
|
501
506
|
options = options.dup
|
502
507
|
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
508
|
+
kwargs =
|
509
|
+
if options[:default].is_a?(Proc)
|
510
|
+
proc_default = options.delete(:default)
|
511
|
+
proc_default = ":default=>proc{#{proc_default.call.inspect}}"
|
512
|
+
options_inspect = options.inspect
|
513
|
+
options_inspect.sub!(/\}\z/, '')
|
514
|
+
options_inspect << ', ' if options_inspect !~ /\{\z/
|
515
|
+
options_inspect << proc_default << '}'
|
516
|
+
options_inspect
|
517
|
+
else
|
518
|
+
options.inspect
|
519
|
+
end
|
520
|
+
"**#{kwargs}"
|
514
521
|
end
|
515
522
|
end
|
516
523
|
end
|
data/lib/ridgepole/diff.rb
CHANGED
@@ -386,6 +386,18 @@ module Ridgepole
|
|
386
386
|
attrs[:type] = :bigint
|
387
387
|
opts.delete(:limit)
|
388
388
|
end
|
389
|
+
|
390
|
+
if opts[:size] && (attrs[:type] == :text || attrs[:type] == :blob || attrs[:type] == :binary)
|
391
|
+
case opts.delete(:size)
|
392
|
+
when :tiny
|
393
|
+
attrs[:type] = :blob if attrs[:type] == :binary
|
394
|
+
opts[:limit] = 255
|
395
|
+
when :medium
|
396
|
+
opts[:limit] = 16_777_215
|
397
|
+
when :long
|
398
|
+
opts[:limit] = 4_294_967_295
|
399
|
+
end
|
400
|
+
end
|
389
401
|
end
|
390
402
|
end
|
391
403
|
|
data/lib/ridgepole/dsl_parser.rb
CHANGED
@@ -37,11 +37,10 @@ module Ridgepole
|
|
37
37
|
attrs[:foreign_keys].each do |_, foreign_key_attrs|
|
38
38
|
fk_index = foreign_key_attrs[:options][:column] || "#{foreign_key_attrs[:to_table].singularize}_id"
|
39
39
|
next if attrs[:indices]&.any? { |_k, v| v[:column_name].first == fk_index }
|
40
|
+
# NOTE: For composite primary keys, the first column of the primary key is used as the foreign key index
|
41
|
+
next if Array(attrs[:options][:primary_key]).first == fk_index
|
40
42
|
|
41
|
-
|
42
|
-
[WARNING] Table `#{table_name}` has a foreign key on `#{fk_index}` column, but doesn't have any indexes on the column.
|
43
|
-
Although an index will be added automatically by InnoDB, please add an index explicitly for your future operations.
|
44
|
-
MSG
|
43
|
+
raise "The column `#{fk_index}` of the table `#{table_name}` has a foreign key but no index. Although InnoDB creates an index automatically, please add one explicitly in order for ridgepole to manage it."
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end
|
@@ -3,8 +3,7 @@
|
|
3
3
|
module Ridgepole
|
4
4
|
class DSLParser
|
5
5
|
class Context
|
6
|
-
attr_reader :__definition
|
7
|
-
attr_reader :__execute
|
6
|
+
attr_reader :__definition, :__execute
|
8
7
|
|
9
8
|
def initialize(opts = {})
|
10
9
|
@__working_dir = File.expand_path(opts[:path] ? File.dirname(opts[:path]) : Dir.pwd)
|
@@ -28,7 +27,7 @@ module Ridgepole
|
|
28
27
|
table_name = table_name.to_s
|
29
28
|
table_definition = TableDefinition.new(table_name, self)
|
30
29
|
|
31
|
-
options[:primary_key] = options[:primary_key].to_s if options[:primary_key]
|
30
|
+
options[:primary_key] = options[:primary_key].to_s if options[:primary_key].is_a?(Symbol)
|
32
31
|
if options[:id] && TableDefinition::ALIAS_TYPES.key?(options[:id])
|
33
32
|
type, type_default_opts = TableDefinition::ALIAS_TYPES[options[:id]]
|
34
33
|
options[:id] = type
|
@@ -131,6 +131,7 @@ module Ridgepole
|
|
131
131
|
polymorphic_options.merge!(options.slice(:null, :first, :after))
|
132
132
|
index_options = options.key?(:index) ? options.delete(:index) : true
|
133
133
|
type = options.delete(:type) || DEFAULT_PRIMARY_KEY_TYPE
|
134
|
+
foreign_key_options = options.delete(:foreign_key)
|
134
135
|
|
135
136
|
args.each do |col|
|
136
137
|
column("#{col}_id", type, options)
|
@@ -139,6 +140,12 @@ module Ridgepole
|
|
139
140
|
columns = polymorphic ? ["#{col}_type", "#{col}_id"] : ["#{col}_id"]
|
140
141
|
index(columns, index_options.is_a?(Hash) ? index_options : {})
|
141
142
|
end
|
143
|
+
if foreign_key_options # rubocop:disable Style/Next
|
144
|
+
fk_opts = foreign_key_options.is_a?(Hash) ? foreign_key_options.dup : {}
|
145
|
+
fk_opts.update(column: "#{col}_id") if col.to_s.singularize != col.to_s
|
146
|
+
to_table = fk_opts.delete(:to_table) || col.to_s.pluralize
|
147
|
+
@base.add_foreign_key(@table_name, to_table, fk_opts)
|
148
|
+
end
|
142
149
|
end
|
143
150
|
end
|
144
151
|
alias belongs_to references
|
@@ -7,7 +7,7 @@ module Ridgepole
|
|
7
7
|
module AbstractMysqlAdapter
|
8
8
|
module UseAlterIndex
|
9
9
|
def add_index(table_name, column_name, options = {})
|
10
|
-
index_name, index_type, index_columns, index_options, _index_algorithm, index_using = add_index_options(table_name, column_name, options)
|
10
|
+
index_name, index_type, index_columns, index_options, _index_algorithm, index_using = add_index_options(table_name, column_name, **options)
|
11
11
|
|
12
12
|
# cannot specify index_algorithm
|
13
13
|
execute "ALTER TABLE #{quote_table_name(table_name)} ADD #{index_type} INDEX #{quote_column_name(index_name)} #{index_using} (#{index_columns})#{index_options}"
|
data/lib/ridgepole/version.rb
CHANGED
data/ridgepole.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.required_ruby_version = Gem::Requirement.new('>= 2.2.7')
|
22
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.2.7') # rubocop:disable Gemspec/RequiredRubyVersion
|
23
23
|
|
24
24
|
spec.add_dependency 'activerecord', '>= 5.0.1', '< 6.1'
|
25
25
|
spec.add_dependency 'diffy'
|
data/spec/erb_helper.rb
CHANGED
@@ -138,6 +138,12 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
138
138
|
opts = ['--dump-without-table-options']
|
139
139
|
out, status = run_ridgepole('--diff', "'#{JSON.dump(conn_spec)}'", f.path, *opts)
|
140
140
|
|
141
|
+
# v6.0.3 is the oldest version that doesn't produce any kwargs warnings with Ruby 2.7
|
142
|
+
if condition('< 6.0.3')
|
143
|
+
# https://github.com/jeremyevans/ruby-warning/blob/1.1.0/lib/warning.rb#L18
|
144
|
+
out = out.lines.grep_v(/: warning: (?:Using the last argument (?:for `.+' )?as keyword parameters is deprecated; maybe \*\* should be added to the call|Passing the keyword argument (?:for `.+' )?as the last hash parameter is deprecated|Splitting the last argument (?:for `.+' )?into positional and keyword parameters is deprecated|The called method (?:`.+' )?is defined here)\n\z/).join
|
145
|
+
end
|
146
|
+
|
141
147
|
expect(out).to be_empty
|
142
148
|
expect(status.success?).to be_truthy
|
143
149
|
end
|
@@ -175,10 +175,10 @@ describe 'Ridgepole::Client.diff' do
|
|
175
175
|
delta = subject.diff(actual_dsl, expected_dsl)
|
176
176
|
expect(delta.differ?).to be_truthy
|
177
177
|
expect(delta.script).to match_ruby erbh(<<-ERB)
|
178
|
-
change_column("employee_clubs", "club_id", :integer,
|
178
|
+
change_column("employee_clubs", "club_id", :integer, **<%= {:unsigned=>false, :null=>true, :default=>nil} + cond('>= 5.1', comment: nil) %>)
|
179
179
|
|
180
|
-
change_column("employees", "last_name", :string,
|
181
|
-
change_column("employees", "gender", :string,
|
180
|
+
change_column("employees", "last_name", :string, **<%= {:limit=>20, :default=>"XXX", :unsigned=>false} + cond('>= 5.1', comment: nil) %>)
|
181
|
+
change_column("employees", "gender", :string, **<%= {:limit=>2, :null=>false, :default=>nil, :unsigned=>false} + cond('>= 5.1', comment: nil) %>)
|
182
182
|
ERB
|
183
183
|
}
|
184
184
|
|
@@ -149,10 +149,10 @@ describe 'Ridgepole::Client.diff' do
|
|
149
149
|
delta = subject.diff(actual_dsl, expected_dsl)
|
150
150
|
expect(delta.differ?).to be_truthy
|
151
151
|
expect(delta.script).to match_ruby erbh(<<-ERB)
|
152
|
-
change_column("employee_clubs", "club_id", :integer,
|
152
|
+
change_column("employee_clubs", "club_id", :integer, **<%= {:unsigned=>false, :null=>true, :default=>nil} + cond('>= 5.1', comment: nil) %>)
|
153
153
|
|
154
|
-
change_column("employees", "last_name", :string,
|
155
|
-
change_column("employees", "gender", :string,
|
154
|
+
change_column("employees", "last_name", :string, **<%= {:limit=>20, :default=>"XXX", :unsigned=>false} + cond('>= 5.1', comment: nil) %>)
|
155
|
+
change_column("employees", "gender", :string, **<%= {:limit=>2, :null=>false, :default=>nil, :unsigned=>false} + cond('>= 5.1', comment: nil) %>)
|
156
156
|
ERB
|
157
157
|
}
|
158
158
|
end
|
@@ -36,7 +36,7 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
36
36
|
expect(delta.differ?).to be_truthy
|
37
37
|
expect(subject.dump).to match_ruby actual_dsl
|
38
38
|
expect(delta.script).to match_fuzzy <<-RUBY
|
39
|
-
add_foreign_key("child", "parent", {:name=>"child_ibfk_1"})
|
39
|
+
add_foreign_key("child", "parent", **{:name=>"child_ibfk_1"})
|
40
40
|
RUBY
|
41
41
|
delta.migrate
|
42
42
|
expect(subject.dump).to match_ruby expected_dsl
|
@@ -144,7 +144,7 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
144
144
|
expect(delta.differ?).to be_truthy
|
145
145
|
expect(subject.dump).to match_ruby actual_dsl
|
146
146
|
expect(delta.script).to match_fuzzy <<-RUBY
|
147
|
-
add_foreign_key("child", "parent", {})
|
147
|
+
add_foreign_key("child", "parent", **{})
|
148
148
|
RUBY
|
149
149
|
delta.migrate
|
150
150
|
expect(subject.dump).to match_ruby expected_dsl
|
@@ -186,15 +186,9 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
186
186
|
subject { client(dump_without_table_options: false) }
|
187
187
|
|
188
188
|
it {
|
189
|
-
expect(Ridgepole::Logger.instance).to receive(:warn).with(<<-MSG).twice
|
190
|
-
[WARNING] Table `child` has a foreign key on `parent_id` column, but doesn't have any indexes on the column.
|
191
|
-
Although an index will be added automatically by InnoDB, please add an index explicitly for your future operations.
|
192
|
-
MSG
|
193
|
-
subject.diff(dsl).migrate
|
194
|
-
|
195
189
|
expect do
|
196
190
|
subject.diff(dsl).migrate
|
197
|
-
end.to raise_error(
|
191
|
+
end.to raise_error('The column `parent_id` of the table `child` has a foreign key but no index. Although InnoDB creates an index automatically, please add one explicitly in order for ridgepole to manage it.')
|
198
192
|
}
|
199
193
|
end
|
200
194
|
|
@@ -219,7 +213,82 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
219
213
|
expect(Ridgepole::Logger.instance).to_not receive(:warn)
|
220
214
|
subject.diff(dsl).migrate
|
221
215
|
|
222
|
-
expect
|
216
|
+
expect(subject.diff(dsl).differ?).to be_falsey
|
223
217
|
}
|
224
218
|
end
|
219
|
+
|
220
|
+
context 'when create fk on the primary key' do
|
221
|
+
let(:dsl) do
|
222
|
+
erbh(<<-ERB)
|
223
|
+
create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
224
|
+
end
|
225
|
+
|
226
|
+
create_table "icons", primary_key: "user_id", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
227
|
+
end
|
228
|
+
add_foreign_key "icons", "users", name: "fk_icons_users"
|
229
|
+
ERB
|
230
|
+
end
|
231
|
+
|
232
|
+
subject { client(dump_without_table_options: false) }
|
233
|
+
|
234
|
+
it {
|
235
|
+
expect(Ridgepole::Logger.instance).to_not receive(:warn)
|
236
|
+
subject.diff(dsl).migrate
|
237
|
+
|
238
|
+
expect(subject.diff(dsl).differ?).to be_falsey
|
239
|
+
}
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
context 'when create fk on the first primary key' do
|
244
|
+
let(:dsl) do
|
245
|
+
erbh(<<-ERB)
|
246
|
+
create_table "users", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
247
|
+
end
|
248
|
+
|
249
|
+
create_table "employee", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
250
|
+
end
|
251
|
+
|
252
|
+
create_table "icons", primary_key: ["user_id", "employee_id"], force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
253
|
+
t.integer "user_id", null: false
|
254
|
+
t.integer "employee_id", null: false
|
255
|
+
end
|
256
|
+
add_foreign_key "icons", "users", name: "fk_icons_users"
|
257
|
+
ERB
|
258
|
+
end
|
259
|
+
|
260
|
+
subject { client(dump_without_table_options: false) }
|
261
|
+
|
262
|
+
it {
|
263
|
+
expect(Ridgepole::Logger.instance).to_not receive(:warn)
|
264
|
+
subject.diff(dsl).migrate
|
265
|
+
|
266
|
+
expect(subject.diff(dsl).differ?).to be_falsey
|
267
|
+
}
|
268
|
+
end
|
269
|
+
|
270
|
+
context 'when create fk on the second primary key' do
|
271
|
+
let(:dsl) do
|
272
|
+
erbh(<<-ERB)
|
273
|
+
create_table "users", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
274
|
+
end
|
275
|
+
|
276
|
+
create_table "employee", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
277
|
+
end
|
278
|
+
|
279
|
+
create_table "icons", primary_key: ["user_id", "employee_id"], force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
280
|
+
t.integer "user_id", null: false
|
281
|
+
t.integer "employee_id", null: false
|
282
|
+
end
|
283
|
+
add_foreign_key "icons", "employees", name: "fk_icons_employees"
|
284
|
+
ERB
|
285
|
+
end
|
286
|
+
|
287
|
+
subject { client(dump_without_table_options: false) }
|
288
|
+
|
289
|
+
it {
|
290
|
+
expect do
|
291
|
+
subject.diff(dsl).migrate
|
292
|
+
end.to raise_error('The column `employee_id` of the table `icons` has a foreign key but no index. Although InnoDB creates an index automatically, please add one explicitly in order for ridgepole to manage it.')
|
293
|
+
}
|
225
294
|
end
|