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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +3 -1
  3. data/Appraisals +4 -5
  4. data/README.md +17 -19
  5. data/bin/ridgepole +13 -1
  6. data/gemfiles/{activerecord_5.0.gemfile → activerecord_6.1.gemfile} +1 -2
  7. data/lib/ridgepole/client.rb +8 -3
  8. data/lib/ridgepole/delta.rb +16 -1
  9. data/lib/ridgepole/diff.rb +43 -20
  10. data/lib/ridgepole/execute_expander.rb +10 -1
  11. data/lib/ridgepole/ext/abstract_adapter/disable_table_options.rb +9 -1
  12. data/lib/ridgepole/external_sql_executer.rb +12 -1
  13. data/lib/ridgepole/version.rb +1 -1
  14. data/ridgepole.gemspec +1 -1
  15. data/spec/erb_helper.rb +5 -1
  16. data/spec/mysql/_migrate/migrate_change_table_option_spec.rb +2 -2
  17. data/spec/mysql/cli/ridgepole_spec.rb +35 -1
  18. data/spec/mysql/collation/collation_spec.rb +7 -7
  19. data/spec/mysql/dump/dump_class_method_spec.rb +3 -3
  20. data/spec/mysql/dump/dump_spec.rb +3 -3
  21. data/spec/mysql/dump/dump_unknown_column_type_spec.rb +1 -1
  22. data/spec/mysql/dump/dump_without_table_options_spec.rb +2 -2
  23. data/spec/mysql/fk/migrate_create_fk_spec.rb +7 -7
  24. data/spec/mysql/migrate/migrate_add_column_with_alter_extra_spec.rb +88 -0
  25. data/spec/mysql/migrate/migrate_change_column8_spec.rb +38 -5
  26. data/spec/mysql/migrate/migrate_change_index_spec.rb +7 -1
  27. data/spec/mysql/migrate/migrate_check_relation_column_type_spec.rb +4 -4
  28. data/spec/mysql/migrate/migrate_primary_key_spec.rb +30 -5
  29. data/spec/mysql/migrate/migrate_same_spec.rb +3 -3
  30. data/spec/mysql/text_blob_types/text_blob_types_spec.rb +1 -1
  31. data/spec/postgresql/dump/dump_spec.rb +1 -1
  32. data/spec/postgresql/migrate/migrate_same_spec.rb +1 -1
  33. metadata +10 -15
  34. data/lib/ridgepole/ext/abstract_mysql_adapter/use_alter_index.rb +0 -31
  35. data/spec/mysql/migrate_/migrate_create_index_with_alter_spec.rb +0 -141
  36. 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: 4c68b630030e34fb6e399e053d7d5c43245487c81d0869f9783b05e1135b5e2e
4
- data.tar.gz: b7061e1c9c0bdf8e7509ab3601e397031edd2d9397975b178bac12ddb669c413
3
+ metadata.gz: df81adabc9afddf2d409c647190e217dd71a3948b8d3b9c3753f36c8519df701
4
+ data.tar.gz: 3df1478fbdaa3ef5ac2ac192cf1a022901753f1f4adac72f20b93f17b49dcb2d
5
5
  SHA512:
6
- metadata.gz: 8bbfcabaad944ad5ed18c5b809e06243582c9f3977890e499c2b400af7f268206876174d0cd3b6184e67b33ef67d5bd6226b63c88c13d820c9ed4fab5f5bdbdc
7
- data.tar.gz: 7ed62d44a593d40b8c3d8b91b6d0ea7c10ae99337789db4ffbdffc9bf43cfb6b2e2fc81959cca1e823a9adf40968717d264f965aa4edb4e591bed55cff3c7c9d
6
+ metadata.gz: ae3fa69120a6ba5103f512092694abd151073ae3e7ed27c23677aa9f617b4a986565c29e6088fbb0f4ae1a0da0cfc425b5c67c8e8b1b19b956164dd8c7fcdf87
7
+ data.tar.gz: bce34561a3ac8489bbc3466e7d63fd0c4c4a557659e28751bfc06fe3f058d3725493c34426cab2a1171ea86e1e35d4fdde8be3b1e31186599a73748a3a2563a3
@@ -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
  [![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.8)](https://github.com/winebarrel/ridgepole/actions)
10
- [![Coverage Status](https://coveralls.io/repos/github/winebarrel/ridgepole/badge.svg?branch=0.8)](https://coveralls.io/github/winebarrel/ridgepole?branch=0.8)
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.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.8.13`
131
- * Support `serial` and `bigserial` column types ([pull#321](https://github.com/winebarrel/ridgepole/pull/321))
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 }
@@ -2,7 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", "~> 5.0.1"
6
- gem "pg", "< 1.0.0"
5
+ gem "activerecord", "~> 6.1.0"
7
6
 
8
7
  gemspec path: "../"
@@ -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[:options][:options] ||= @options[:table_options] if @options[:table_options]
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
@@ -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
- append_change_table_options(table_name, table_options, buf) if table_options
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
 
@@ -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] && (from_options != to_options)
131
- from.delete(:options)
132
- to.delete(:options)
133
- table_delta[:table_options] = to_options
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
- options = column_options.dup
181
-
182
- type = if options[:id]
183
- options.delete(:id)
184
- else
185
- Ridgepole::DSLParser::TableDefinition::DEFAULT_PRIMARY_KEY_TYPE
186
- end
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: table_options[:id] || @options[:check_relation_type].to_sym,
556
- unsigned: table_options[: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
- sql = sql + ',' + Ridgepole::ExecuteExpander.alter_extra if Ridgepole::ExecuteExpander.alter_extra && sql =~ /\AALTER\b/i
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
- options.delete(:options) if options && @__without_table_options
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(ActiveRecord::Base.connection_config)])
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ridgepole
4
- VERSION = '0.8.13'
4
+ VERSION = '0.9.0.beta'
5
5
  end
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.0.1', '< 6.1'
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 condition(*Array(conds))
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