ridgepole 0.8.13 → 0.9.0.beta

Sign up to get free protection for your applications and to get access to all the features.
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