ridgepole 0.8.13 → 0.9.0.beta
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 +3 -1
- data/Appraisals +4 -5
- data/README.md +17 -19
- data/bin/ridgepole +13 -1
- data/gemfiles/{activerecord_5.0.gemfile → activerecord_6.1.gemfile} +1 -2
- data/lib/ridgepole/client.rb +8 -3
- data/lib/ridgepole/delta.rb +16 -1
- data/lib/ridgepole/diff.rb +43 -20
- 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 +1 -1
- data/spec/erb_helper.rb +5 -1
- data/spec/mysql/_migrate/migrate_change_table_option_spec.rb +2 -2
- data/spec/mysql/cli/ridgepole_spec.rb +35 -1
- data/spec/mysql/collation/collation_spec.rb +7 -7
- data/spec/mysql/dump/dump_class_method_spec.rb +3 -3
- data/spec/mysql/dump/dump_spec.rb +3 -3
- data/spec/mysql/dump/dump_unknown_column_type_spec.rb +1 -1
- data/spec/mysql/dump/dump_without_table_options_spec.rb +2 -2
- data/spec/mysql/fk/migrate_create_fk_spec.rb +7 -7
- data/spec/mysql/migrate/migrate_add_column_with_alter_extra_spec.rb +88 -0
- data/spec/mysql/migrate/migrate_change_column8_spec.rb +38 -5
- data/spec/mysql/migrate/migrate_change_index_spec.rb +7 -1
- data/spec/mysql/migrate/migrate_check_relation_column_type_spec.rb +4 -4
- data/spec/mysql/migrate/migrate_primary_key_spec.rb +30 -5
- data/spec/mysql/migrate/migrate_same_spec.rb +3 -3
- data/spec/mysql/text_blob_types/text_blob_types_spec.rb +1 -1
- data/spec/postgresql/dump/dump_spec.rb +1 -1
- data/spec/postgresql/migrate/migrate_same_spec.rb +1 -1
- metadata +10 -15
- data/lib/ridgepole/ext/abstract_mysql_adapter/use_alter_index.rb +0 -31
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df81adabc9afddf2d409c647190e217dd71a3948b8d3b9c3753f36c8519df701
|
4
|
+
data.tar.gz: 3df1478fbdaa3ef5ac2ac192cf1a022901753f1f4adac72f20b93f17b49dcb2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae3fa69120a6ba5103f512092694abd151073ae3e7ed27c23677aa9f617b4a986565c29e6088fbb0f4ae1a0da0cfc425b5c67c8e8b1b19b956164dd8c7fcdf87
|
7
|
+
data.tar.gz: bce34561a3ac8489bbc3466e7d63fd0c4c4a557659e28751bfc06fe3f058d3725493c34426cab2a1171ea86e1e35d4fdde8be3b1e31186599a73748a3a2563a3
|
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
|
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.8)
|
11
11
|
|
12
12
|
<details><summary>ChangeLog</summary>
|
13
13
|
|
@@ -127,10 +127,22 @@ 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.
|
131
|
-
*
|
130
|
+
* `>= 0.9.0`
|
131
|
+
* Remove `--mysql-alter-index` option ([pull#330](https://github.com/winebarrel/ridgepole/pull/330))
|
132
|
+
* Add `--table-hash-options` option ([pull#331](https://github.com/winebarrel/ridgepole/pull/331))
|
133
|
+
* Support Rails 6.1 ([pull#323](https://github.com/winebarrel/ridgepole/pull/323))
|
134
|
+
* Disable Rails 5.0 support([pull#335](https://github.com/winebarrel/ridgepole/pull/335))
|
135
|
+
* Fix PK AUTO_INCREMENT change bug([pull#334](https://github.com/winebarrel/ridgepole/pull/334))
|
132
136
|
</details>
|
133
137
|
|
138
|
+
**Notice**
|
139
|
+
|
140
|
+
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.
|
141
|
+
|
142
|
+
**If you use ActiveRecord 6.1, please modify Schemafile format**.
|
143
|
+
|
144
|
+
cf. https://github.com/winebarrel/ridgepole/pull/323
|
145
|
+
|
134
146
|
## Installation
|
135
147
|
|
136
148
|
Add this line to your application's Gemfile:
|
@@ -176,6 +188,7 @@ Usage: ridgepole [options]
|
|
176
188
|
-f, --file SCHEMAFILE
|
177
189
|
--dry-run
|
178
190
|
--table-options OPTIONS
|
191
|
+
--table-hash-options OPTIONS
|
179
192
|
--alter-extra ALTER_SPEC
|
180
193
|
--external-script SCRIPT
|
181
194
|
--bulk-change
|
@@ -196,7 +209,6 @@ Usage: ridgepole [options]
|
|
196
209
|
-o, --output SCHEMAFILE
|
197
210
|
-t, --tables TABLES
|
198
211
|
--ignore-tables REGEX_LIST
|
199
|
-
--mysql-use-alter
|
200
212
|
--dump-without-table-options
|
201
213
|
--dump-with-default-fk-name
|
202
214
|
--index-removed-drop-column
|
@@ -406,20 +418,6 @@ Apply `Schemafile`
|
|
406
418
|
-> 0.0471s
|
407
419
|
```
|
408
420
|
|
409
|
-
## Use ALTER instead of CREATE/DROP INDEX
|
410
|
-
|
411
|
-
```sh
|
412
|
-
$ ridgepole -a -c database.yml --mysql-use-alter --debug
|
413
|
-
Apply `Schemafile`
|
414
|
-
...
|
415
|
-
-- remove_index("dept_manager", {:name=>"emp_no"})
|
416
|
-
(19.2ms) ALTER TABLE `dept_manager` DROP INDEX `emp_no`
|
417
|
-
-> 0.0200s
|
418
|
-
-- add_index("dept_manager", ["emp_no"], {:name=>"emp_no2", :using=>:btree})
|
419
|
-
(23.4ms) ALTER TABLE `dept_manager` ADD INDEX `emp_no2` USING btree (`emp_no`)
|
420
|
-
-> 0.0243s
|
421
|
-
```
|
422
|
-
|
423
421
|
## Relation column type check
|
424
422
|
|
425
423
|
```ruby
|
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 }
|
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,7 +152,11 @@ 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
162
|
pk_attrs = build_primary_key_attrs_if_changed(from, to, table_name)
|
@@ -177,13 +191,16 @@ 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
|
|
@@ -551,9 +568,15 @@ module Ridgepole
|
|
551
568
|
table_options = parent_table_info.fetch(:options)
|
552
569
|
next if table_options[:id] == false
|
553
570
|
|
571
|
+
options_id = table_options[:id]
|
572
|
+
parent_type, parent_unsigned = if options_id.is_a?(Hash)
|
573
|
+
[options_id[:type], options_id[:unsigned]]
|
574
|
+
else
|
575
|
+
[table_options[:id], table_options[:unsigned]]
|
576
|
+
end
|
554
577
|
parent_column_info = {
|
555
|
-
type:
|
556
|
-
unsigned:
|
578
|
+
type: parent_type || @options[:check_relation_type].to_sym,
|
579
|
+
unsigned: parent_unsigned,
|
557
580
|
}
|
558
581
|
|
559
582
|
child_column_info = {
|
@@ -46,7 +46,16 @@ module Ridgepole
|
|
46
46
|
private
|
47
47
|
|
48
48
|
def append_alter_extra(sql)
|
49
|
-
|
49
|
+
if Ridgepole::ExecuteExpander.alter_extra
|
50
|
+
case sql
|
51
|
+
when /\AALTER\b/i
|
52
|
+
sql += ',' + Ridgepole::ExecuteExpander.alter_extra
|
53
|
+
when /\A(CREATE|DROP)\s+INDEX\b/i
|
54
|
+
# https://dev.mysql.com/doc/refman/5.6/en/create-index.html
|
55
|
+
# https://dev.mysql.com/doc/refman/5.6/en/drop-index.html
|
56
|
+
sql += ' ' + Ridgepole::ExecuteExpander.alter_extra.tr(',', ' ')
|
57
|
+
end
|
58
|
+
end
|
50
59
|
|
51
60
|
sql
|
52
61
|
end
|
@@ -15,7 +15,15 @@ module Ridgepole
|
|
15
15
|
|
16
16
|
def table_options(table_name)
|
17
17
|
options = super
|
18
|
-
|
18
|
+
|
19
|
+
if options && @__without_table_options
|
20
|
+
options.delete(:options)
|
21
|
+
|
22
|
+
# For >= AR 6.1.0
|
23
|
+
options.delete(:charset)
|
24
|
+
options.delete(:collation)
|
25
|
+
end
|
26
|
+
|
19
27
|
options
|
20
28
|
end
|
21
29
|
end
|
@@ -8,7 +8,7 @@ module Ridgepole
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def execute(sql)
|
11
|
-
cmd = Shellwords.join([@script, sql, JSON.dump(
|
11
|
+
cmd = Shellwords.join([@script, sql, JSON.dump(connection_configuration_hash)])
|
12
12
|
@logger.info("Execute #{@script}")
|
13
13
|
script_basename = File.basename(@script)
|
14
14
|
|
@@ -48,5 +48,16 @@ module Ridgepole
|
|
48
48
|
raise "`#{@script}` execution failed" unless wait_thr.value.success?
|
49
49
|
end
|
50
50
|
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def connection_configuration_hash
|
55
|
+
if ActiveRecord.gem_version < Gem::Version.new('6.1.0')
|
56
|
+
# NOTE: Remove code when stopping support for versions below 6.1
|
57
|
+
ActiveRecord::Base.connection_config
|
58
|
+
else
|
59
|
+
ActiveRecord::Base.connection_db_config.configuration_hash
|
60
|
+
end
|
61
|
+
end
|
51
62
|
end
|
52
63
|
end
|
data/lib/ridgepole/version.rb
CHANGED
data/ridgepole.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.2.7') # rubocop:disable Gemspec/RequiredRubyVersion
|
23
23
|
|
24
|
-
spec.add_dependency 'activerecord', '>= 5.
|
24
|
+
spec.add_dependency 'activerecord', '>= 5.1', '< 6.2'
|
25
25
|
spec.add_dependency 'diffy'
|
26
26
|
|
27
27
|
spec.add_development_dependency 'appraisal', '>= 2.2.0'
|
data/spec/erb_helper.rb
CHANGED
@@ -14,7 +14,11 @@ ERBh.define_method(:i) do |obj|
|
|
14
14
|
end
|
15
15
|
|
16
16
|
ERBh.define_method(:cond) do |conds, m, e = nil|
|
17
|
-
if
|
17
|
+
if conds.is_a?(Hash)
|
18
|
+
conds.find do |c, _|
|
19
|
+
condition(c)
|
20
|
+
end&.last || m
|
21
|
+
elsif condition(conds)
|
18
22
|
m
|
19
23
|
else
|
20
24
|
e || (begin
|
@@ -4,7 +4,7 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
4
4
|
context 'when change mysql table options' do
|
5
5
|
let(:actual_dsl) do
|
6
6
|
erbh(<<-ERB)
|
7
|
-
create_table "employees", primary_key: "emp_no", force: :cascade, options: "ENGINE=MyISAM DEFAULT CHARSET=utf8" do |t|
|
7
|
+
create_table "employees", primary_key: "emp_no", force: :cascade, <%= i cond(">= 6.1", { charset: "utf8", options: "ENGINE=MyISAM" }, { options: "ENGINE=MyISAM DEFAULT CHARSET=utf8" }) %> do |t|
|
8
8
|
t.date "birth_date", null: false
|
9
9
|
t.string "first_name", limit: 14, null: false
|
10
10
|
t.string "last_name", limit: 16, null: false
|
@@ -16,7 +16,7 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
16
16
|
|
17
17
|
let(:expected_dsl) do
|
18
18
|
erbh(<<-ERB)
|
19
|
-
create_table "employees", primary_key: "emp_no", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=ascii" do |t|
|
19
|
+
create_table "employees", primary_key: "emp_no", force: :cascade, <%= i cond(">= 6.1", { charset: "ascii" }, { options: "ENGINE=InnoDB DEFAULT CHARSET=ascii" }) %> do |t|
|
20
20
|
t.date "birth_date", null: false
|
21
21
|
t.string "first_name", limit: 14, null: false, <%= i cond('>= 5.2', collation: "utf8_general_ci") %>
|
22
22
|
t.string "last_name", limit: 16, null: false, <%= i cond('>= 5.2', collation: "utf8_general_ci") %>
|
@@ -23,6 +23,7 @@ describe 'ridgepole' do
|
|
23
23
|
-f, --file SCHEMAFILE
|
24
24
|
--dry-run
|
25
25
|
--table-options OPTIONS
|
26
|
+
--table-hash-options OPTIONS
|
26
27
|
--alter-extra ALTER_SPEC
|
27
28
|
--external-script SCRIPT
|
28
29
|
--bulk-change
|
@@ -43,7 +44,6 @@ describe 'ridgepole' do
|
|
43
44
|
-o, --output SCHEMAFILE
|
44
45
|
-t, --tables TABLES
|
45
46
|
--ignore-tables REGEX_LIST
|
46
|
-
--mysql-use-alter
|
47
47
|
--dump-without-table-options
|
48
48
|
--dump-with-default-fk-name
|
49
49
|
--index-removed-drop-column
|
@@ -192,6 +192,40 @@ describe 'ridgepole' do
|
|
192
192
|
end
|
193
193
|
end
|
194
194
|
|
195
|
+
context 'apply with --table-hash-options' do
|
196
|
+
context 'given flatten json' do
|
197
|
+
it 'parses string to hash' do
|
198
|
+
out, status = run_cli(args: ['-c', conf, '-a', '--table-hash-options', %('{ id: "bigint", unsigned: true }')])
|
199
|
+
|
200
|
+
expect(status.success?).to be_truthy
|
201
|
+
expect(out).to match_fuzzy <<-MSG
|
202
|
+
Ridgepole::Client#initialize([#{conn_spec_str('ridgepole_test')}, {:dry_run=>false, :debug=>false, :color=>false, :table_hash_options=>{:id=>:bigint, :unsigned=>true}}])
|
203
|
+
Apply `Schemafile`
|
204
|
+
Ridgepole::Client#diff
|
205
|
+
Ridgepole::Delta#differ?
|
206
|
+
Ridgepole::Delta#migrate
|
207
|
+
No change
|
208
|
+
MSG
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'given nested json' do
|
213
|
+
it 'parses string to nested hash' do
|
214
|
+
out, status = run_cli(args: ['-c', conf, '-a', '--table-hash-options', %('id: { type: "bigint", unsigned: true }')])
|
215
|
+
|
216
|
+
expect(status.success?).to be_truthy
|
217
|
+
expect(out).to match_fuzzy <<-MSG
|
218
|
+
Ridgepole::Client#initialize([#{conn_spec_str('ridgepole_test')}, {:dry_run=>false, :debug=>false, :color=>false, :table_hash_options=>{:id=>{:type=>:bigint, :unsigned=>true}}}])
|
219
|
+
Apply `Schemafile`
|
220
|
+
Ridgepole::Client#diff
|
221
|
+
Ridgepole::Delta#differ?
|
222
|
+
Ridgepole::Delta#migrate
|
223
|
+
No change
|
224
|
+
MSG
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
195
229
|
specify 'dry-run' do
|
196
230
|
out, status = run_cli(args: ['-c', conf, '-a', '--dry-run'])
|
197
231
|
|