convergence 0.2.7 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +42 -0
  4. data/Gemfile.lock +47 -52
  5. data/README.md +50 -19
  6. data/bin/convergence +2 -19
  7. data/convergence.gemspec +4 -5
  8. data/lib/convergence.rb +0 -22
  9. data/lib/convergence/cli.rb +55 -0
  10. data/lib/convergence/column.rb +1 -0
  11. data/lib/convergence/command.rb +6 -26
  12. data/lib/convergence/command/apply.rb +25 -15
  13. data/lib/convergence/command/diff.rb +6 -7
  14. data/lib/convergence/command/dryrun.rb +9 -7
  15. data/lib/convergence/command/export.rb +4 -7
  16. data/lib/convergence/command/rollback_dryrun.rb +28 -0
  17. data/lib/convergence/config.rb +31 -1
  18. data/lib/convergence/database_connector.rb +1 -0
  19. data/lib/convergence/database_connector/mysql_connector.rb +16 -10
  20. data/lib/convergence/default_parameter.rb +1 -0
  21. data/lib/convergence/default_parameter/mysql_default_parameter.rb +2 -0
  22. data/lib/convergence/diff.rb +1 -1
  23. data/lib/convergence/dsl.rb +2 -0
  24. data/lib/convergence/dumper.rb +1 -1
  25. data/lib/convergence/dumper/mysql_schema_dumper.rb +3 -0
  26. data/lib/convergence/pretty_diff.rb +2 -0
  27. data/lib/convergence/sql_generator/mysql_generator.rb +2 -0
  28. data/lib/convergence/table.rb +4 -0
  29. data/lib/convergence/version.rb +1 -1
  30. data/spec/convergence/diff_spec.rb +2 -0
  31. data/spec/convergence/dsl_spec.rb +1 -0
  32. data/spec/convergence/dumper/mysql_schema_dumper_spec.rb +2 -0
  33. data/spec/convergence/dumper_spec.rb +2 -0
  34. data/spec/convergence/table_spec.rb +1 -0
  35. data/spec/integrations/command_dryrun.rb +2 -2
  36. data/spec/integrations/drop_foreign_key.rb +2 -2
  37. data/spec/spec_helper.rb +3 -4
  38. metadata +13 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ef1510b43ccf48e6a03e2fd52d2db4bde278b310
4
- data.tar.gz: fc57a20928217ecdd52231365a9dbd76366e26ac
2
+ SHA256:
3
+ metadata.gz: a41f0e1a7c45b785eecc5a53f5aa622158f8777d51999e0ba48280fc53901326
4
+ data.tar.gz: 91749136917fd3c5f0c2ba6ff1553bd23ceb96edeca9c702eae9aeecd01f7976
5
5
  SHA512:
6
- metadata.gz: 9a83c88ec1b880cc029fa3ce993b907f51dc4e8987274a0a2d2fac2a1cef0ee1f5accf0d89f4ee603521a13863ae7a4b51e27671ea426887c8a590011054e55d
7
- data.tar.gz: a8e5a9ce6069bfb6285dd5855c4c8082c35989c4c537cbb9a5791eadabd5209b2161c93d7126ae6e514ed573e6a141132c434b8e8a785c5293a36e0274cebef2
6
+ metadata.gz: 2e232a04b220ccdce258b2ab2f8da447e1c95dbba6b58f5de20ef6d9193553fce54a8504205503d15111ce2e00db5000753083af5284c502f4919890919b8572
7
+ data.tar.gz: 5fdc75e1b04fac387622100c41d85cc79b8c4440988fe0560d5c9bd0149411da18172ab3513a9fad1a1688b38b7f3a247640ce7d815d0614b29030868986f750
@@ -1,6 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.4.1
4
+ services:
5
+ - mysql
4
6
  script:
5
7
  - bundle install
6
8
  - bundle exec rake db:convergence:prepare
@@ -1,3 +1,45 @@
1
+ ## Convergence 1.0.4 (September 8, 2020) ##
2
+
3
+ * Support diff-lcs 1.4 (PR: #75 #76)
4
+
5
+ *yujideveloper*
6
+
7
+ * Fix warning on Ruby 2.6 and later (PR: #77)
8
+
9
+ *yujideveloper*
10
+
11
+ ## Convergence 1.0.3 (January 8, 2020) ##
12
+
13
+ * Support json column (PR: #70)
14
+
15
+ *nishio-dens*
16
+
17
+ ## Convergence 1.0.2 (May 24, 2019) ##
18
+
19
+ * Support ssl connections (PR: #69)
20
+
21
+ *yujideveloper*
22
+
23
+ ## Convergence 1.0.1 (September 27, 2018) ##
24
+
25
+ * Add Rollback Dryrun command (PR: #64)
26
+
27
+ *nishio-dens*
28
+
29
+ ## Convergence 1.0.0 (August 28, 2018) ##
30
+
31
+ * [BREAKING CHANGE] Change flag style command to sub-command style (PR: #60)
32
+
33
+ A flag style command has been deprecated
34
+
35
+ e.g. convergence -c database.yml -i example.schema --apply
36
+
37
+ Introduce a sub command style.
38
+
39
+ e.g. convergence apply example.schema -c database.yml
40
+
41
+ *yujideveloper*
42
+
1
43
  ## Convergence 0.2.7 (August 20, 2018) ##
2
44
 
3
45
  * Fix issues of Convergence::Config (PR: #58)
@@ -1,25 +1,25 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- convergence (0.2.7)
4
+ convergence (1.0.4)
5
5
  diff-lcs
6
6
  diffy
7
7
  mysql2
8
- slop (~> 3.6)
8
+ thor (~> 0.20)
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- ast (2.3.0)
13
+ ast (2.4.0)
14
14
  coderay (1.1.2)
15
- diff-lcs (1.3)
16
- diffy (3.2.1)
17
- ffi (1.9.18)
15
+ diff-lcs (1.4.2)
16
+ diffy (3.4.0)
17
+ ffi (1.11.3)
18
18
  formatador (0.2.5)
19
- guard (2.14.1)
19
+ guard (2.16.1)
20
20
  formatador (>= 0.2.4)
21
21
  listen (>= 2.7, < 4.0)
22
- lumberjack (~> 1.0)
22
+ lumberjack (>= 1.0.12, < 2.0)
23
23
  nenv (~> 0.1)
24
24
  notiffany (~> 0.0)
25
25
  pry (>= 0.9.12)
@@ -30,69 +30,64 @@ GEM
30
30
  guard (~> 2.1)
31
31
  guard-compat (~> 1.1)
32
32
  rspec (>= 2.99.0, < 4.0)
33
- listen (3.1.5)
34
- rb-fsevent (~> 0.9, >= 0.9.4)
35
- rb-inotify (~> 0.9, >= 0.9.7)
36
- ruby_dep (~> 1.2)
37
- lumberjack (1.0.12)
38
- method_source (0.9.0)
39
- mysql2 (0.5.2)
33
+ jaro_winkler (1.5.4)
34
+ listen (3.2.1)
35
+ rb-fsevent (~> 0.10, >= 0.10.3)
36
+ rb-inotify (~> 0.9, >= 0.9.10)
37
+ lumberjack (1.1.0)
38
+ method_source (0.9.2)
39
+ mysql2 (0.5.3)
40
40
  nenv (0.3.0)
41
- notiffany (0.1.1)
41
+ notiffany (0.1.3)
42
42
  nenv (~> 0.1)
43
43
  shellany (~> 0.0)
44
- parallel (1.12.0)
45
- parser (2.4.0.2)
46
- ast (~> 2.3)
47
- powerpack (0.1.1)
48
- pry (0.11.3)
44
+ parallel (1.19.1)
45
+ parser (2.7.0.1)
46
+ ast (~> 2.4.0)
47
+ pry (0.12.2)
49
48
  coderay (~> 1.1.0)
50
49
  method_source (~> 0.9.0)
51
- rainbow (2.2.2)
52
- rake
53
- rake (10.5.0)
54
- rb-fsevent (0.10.2)
55
- rb-inotify (0.9.10)
56
- ffi (>= 0.5.0, < 2)
57
- rspec (3.7.0)
58
- rspec-core (~> 3.7.0)
59
- rspec-expectations (~> 3.7.0)
60
- rspec-mocks (~> 3.7.0)
61
- rspec-core (3.7.0)
62
- rspec-support (~> 3.7.0)
63
- rspec-expectations (3.7.0)
50
+ rainbow (3.0.0)
51
+ rake (13.0.1)
52
+ rb-fsevent (0.10.3)
53
+ rb-inotify (0.10.1)
54
+ ffi (~> 1.0)
55
+ rspec (3.9.0)
56
+ rspec-core (~> 3.9.0)
57
+ rspec-expectations (~> 3.9.0)
58
+ rspec-mocks (~> 3.9.0)
59
+ rspec-core (3.9.1)
60
+ rspec-support (~> 3.9.1)
61
+ rspec-expectations (3.9.0)
64
62
  diff-lcs (>= 1.2.0, < 2.0)
65
- rspec-support (~> 3.7.0)
66
- rspec-mocks (3.7.0)
63
+ rspec-support (~> 3.9.0)
64
+ rspec-mocks (3.9.1)
67
65
  diff-lcs (>= 1.2.0, < 2.0)
68
- rspec-support (~> 3.7.0)
69
- rspec-support (3.7.0)
70
- rubocop (0.51.0)
66
+ rspec-support (~> 3.9.0)
67
+ rspec-support (3.9.2)
68
+ rubocop (0.79.0)
69
+ jaro_winkler (~> 1.5.1)
71
70
  parallel (~> 1.10)
72
- parser (>= 2.3.3.1, < 3.0)
73
- powerpack (~> 0.1)
74
- rainbow (>= 2.2.2, < 3.0)
71
+ parser (>= 2.7.0.1)
72
+ rainbow (>= 2.2.2, < 4.0)
75
73
  ruby-progressbar (~> 1.7)
76
- unicode-display_width (~> 1.0, >= 1.0.1)
77
- ruby-progressbar (1.9.0)
78
- ruby_dep (1.5.0)
74
+ unicode-display_width (>= 1.4.0, < 1.7)
75
+ ruby-progressbar (1.10.1)
79
76
  shellany (0.0.1)
80
- slop (3.6.0)
81
- thor (0.20.0)
82
- unicode-display_width (1.3.0)
77
+ thor (0.20.3)
78
+ unicode-display_width (1.6.0)
83
79
 
84
80
  PLATFORMS
85
81
  ruby
86
82
 
87
83
  DEPENDENCIES
88
- bundler (~> 1.7)
89
84
  convergence!
90
85
  guard
91
86
  guard-rspec
92
87
  pry
93
- rake (~> 10.0)
94
- rspec
88
+ rake (~> 13.0)
89
+ rspec (>= 3.5)
95
90
  rubocop
96
91
 
97
92
  BUNDLED WITH
98
- 1.16.1
93
+ 2.1.3
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Convergence
2
2
 
3
3
  Convergence is a pure-Ruby database schema migration tool.
4
- Currently, This tools is support only MySQL.
4
+ Currently, This tool is support only MySQL.
5
5
 
6
6
  It defines DB Schema using Convergence DSL(like Rails DSL).
7
- For more information about Convergence DSL, See below 'Detail About Convergence DSL'.
7
+ For more information about Convergence DSL, See below ['Detail About Convergence DSL'](#detail-about-convergence-dsl)
8
8
 
9
9
 
10
10
  [![Gem Version](https://badge.fury.io/rb/convergence.svg)](https://badge.fury.io/rb/convergence)
@@ -53,7 +53,7 @@ create_table 'test_tables' do |t|
53
53
  t.index :name
54
54
  end
55
55
 
56
- $ convergence -c database.yml -i example.schema --dryrun
56
+ $ convergence apply example.schema -c database.yml --dry-run
57
57
 
58
58
  # CREATE TABLE `test_tables` (
59
59
  # `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -64,7 +64,7 @@ $ convergence -c database.yml -i example.schema --dryrun
64
64
  # KEY `index_test_tables_on_name` (`name`)
65
65
  # ) ENGINE=InnoDB ROW_FORMAT=Compact DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;
66
66
 
67
- $ convergence -c database.yml -i example.schema --apply
67
+ $ convergence apply example.schema -c database.yml
68
68
 
69
69
  SET FOREIGN_KEY_CHECKS=0;
70
70
  --> 0.0005826340056955814s
@@ -89,7 +89,7 @@ create_table 'test_tables', comment: 'Table Comment Test', engine: 'MyISAM' do |
89
89
  t.datetime :posted_at
90
90
  end
91
91
 
92
- $ convergence -c database.yml -i changed_example.schema --dryrun
92
+ $ convergence apply changed_example.schema -c database.yml --dry-run
93
93
 
94
94
  # DROP INDEX `index_test_tables_on_name` ON `test_tables`;
95
95
  # ALTER TABLE `test_tables`
@@ -98,7 +98,7 @@ $ convergence -c database.yml -i changed_example.schema --dryrun
98
98
  # ADD COLUMN `posted_at` datetime NOT NULL AFTER `created_at`;
99
99
  # ALTER TABLE `test_tables` ENGINE=MyISAM COMMENT='Table Comment Test';
100
100
 
101
- $ convergence -c database.yml -i changed_example.schema --apply
101
+ $ convergence apply changed_example.schema -c database.yml
102
102
 
103
103
  SET FOREIGN_KEY_CHECKS=0;
104
104
  --> 0.0005331430002115667s
@@ -131,15 +131,12 @@ Create Table: CREATE TABLE `test_tables` (
131
131
  ## Usage
132
132
 
133
133
  ```
134
- Usage: convergence [options]
135
- -v, --version
136
- -c, --config Database Yaml Setting
137
- -d, --diff DSL1,DSL2
138
- -e, --export export db schema to dsl
139
- -i, --input Input DSL
140
- --dryrun
141
- --apply execute sql to your database
142
- -h, --help Display this help message.
134
+ Commands:
135
+ convergence apply FILE -c, --config=CONFIG # execute sql to your database
136
+ convergence diff FILE1 FILE2 # print diff of DSLs
137
+ convergence export -c, --config=CONFIG # export db schema to dsl
138
+ convergence help [COMMAND] # Describe available commands or one specific command
139
+ convergence version # print the version
143
140
  ```
144
141
 
145
142
  ### DB Config
@@ -155,13 +152,39 @@ username: root
155
152
  password:
156
153
  ```
157
154
 
155
+ #### Use SSL connection
156
+
157
+ If you would like to use SSL connection, you can specify SSL options in database.yml
158
+
159
+ ```
160
+ $ cat database.yml
161
+ adapter: mysql
162
+ database: convergence_test
163
+ host: 127.0.0.1
164
+ username: root
165
+ password:
166
+ sslca: /path/to/ca-cert.pem
167
+ sslverify: true
168
+ ```
169
+
170
+ Supported ssl options are below:
171
+ * `ssl_mode`
172
+ * `sslkey`
173
+ * `sslcert`
174
+ * `sslca`
175
+ * `sslcapath`
176
+ * `sslcipher`
177
+ * `sslverify`
178
+
179
+ See [the ssl options section of mysql2 README](https://github.com/brianmario/mysql2/tree/master#ssl-options) for more details of SSL options
180
+
158
181
  ### Export Your DB Schema
159
182
 
160
183
  First, you need to create database.yml.
161
184
  And then, execute command like below.
162
185
 
163
186
  ```
164
- $ convergence -c database.yml --export > example.schema
187
+ $ convergence export -c database.yml > example.schema
165
188
  ```
166
189
 
167
190
  Export DSL like this.
@@ -193,16 +216,23 @@ create_table "paper_authors", collate: "utf8_general_ci", comment: "Paper Author
193
216
  end
194
217
  ```
195
218
 
196
- ### Dryrun
219
+ ### Dry run
197
220
 
198
221
  ```
199
- $ convergence -c database.yml -i example.schema --dryrun
222
+ $ convergence apply example.schema -c database.yml --dry-run
200
223
  ```
201
224
 
225
+ ### Rollback Dry run
226
+
227
+ ```
228
+ $ convergence apply example.schema -c database.yml --rollback-dry-run
229
+ ```
230
+
231
+
202
232
  ### Apply
203
233
 
204
234
  ```
205
- $ convergence -c database.yml -i example.schema --apply
235
+ $ convergence apply example.schema -c database.yml
206
236
  ```
207
237
 
208
238
  ### Include Other Schema files
@@ -242,6 +272,7 @@ Convergence is currently support column types below.
242
272
  - datetime
243
273
  - timestamp
244
274
  - year
275
+ - json
245
276
 
246
277
  ```
247
278
  create_table "tests", comment: 'Column type example' do |t|
@@ -1,23 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
3
  require 'rubygems'
4
- require 'convergence'
5
- require 'slop'
4
+ require 'convergence/cli'
6
5
 
7
- opts = Slop.parse(help: true) do |opt|
8
- opt.banner 'Usage: convergence [options]'
9
-
10
- opt.on 'v', 'version' do
11
- puts "version #{Convergence::VERSION}"
12
- exit
13
- end
14
-
15
- opt.on 'c=', 'config=', 'Database Yaml Setting'
16
- opt.on 'd=', 'diff=', 'DSL1,DSL2', as: Array, limit: 2
17
- opt.on 'e', 'export', 'export db schema to dsl'
18
- opt.on 'i=', 'input=', 'Input DSL'
19
- opt.on 'dryrun'
20
- opt.on 'apply', 'execute sql to your database'
21
- end
22
-
23
- Convergence::Command.new(opts).execute
6
+ Convergence::CLI.start
@@ -21,13 +21,12 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'mysql2'
22
22
  spec.add_dependency 'diff-lcs'
23
23
  spec.add_dependency 'diffy'
24
- spec.add_dependency 'slop', '~> 3.6'
24
+ spec.add_dependency 'thor', '~> 0.20'
25
25
 
26
- spec.required_ruby_version = ">= 2.3.0"
26
+ spec.required_ruby_version = ">= 2.4.0"
27
27
 
28
- spec.add_development_dependency 'bundler', '~> 1.7'
29
- spec.add_development_dependency 'rake', '~> 10.0'
30
- spec.add_development_dependency 'rspec'
28
+ spec.add_development_dependency 'rake', '~> 13.0'
29
+ spec.add_development_dependency 'rspec', '>= 3.5'
31
30
  spec.add_development_dependency 'rubocop'
32
31
  spec.add_development_dependency 'pry'
33
32
  spec.add_development_dependency 'guard'
@@ -1,24 +1,2 @@
1
1
  require 'convergence/module'
2
- require 'convergence/logger'
3
2
  require 'convergence/version'
4
- require 'convergence/config'
5
- require 'convergence/command'
6
- require 'convergence/command/diff'
7
- require 'convergence/command/export'
8
- require 'convergence/command/dryrun'
9
- require 'convergence/command/apply'
10
- require 'convergence/pretty_diff'
11
- require 'convergence/database_connector'
12
- require 'convergence/database_connector/mysql_connector'
13
- require 'convergence/column'
14
- require 'convergence/index'
15
- require 'convergence/foreign_key'
16
- require 'convergence/table'
17
- require 'convergence/dsl'
18
- require 'convergence/diff'
19
- require 'convergence/sql_generator'
20
- require 'convergence/sql_generator/mysql_generator'
21
- require 'convergence/dumper'
22
- require 'convergence/dumper/mysql_schema_dumper'
23
- require 'convergence/default_parameter'
24
- require 'convergence/default_parameter/mysql_default_parameter'
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+ require 'convergence/module'
5
+ require 'convergence/config'
6
+
7
+ class Convergence::CLI < Thor
8
+ map %w[--version -v] => :version
9
+
10
+ desc 'apply FILE', 'execute sql to your database'
11
+ method_option :config, aliases: '-c', type: :string, required: true, desc: 'Database Yaml Setting'
12
+ method_option :dry_run, type: :boolean
13
+ method_option :rollback_dry_run, type: :boolean
14
+ def apply(file)
15
+ opts = { input: file }
16
+ if options[:dry_run]
17
+ require 'convergence/command/dryrun'
18
+ Convergence::Command::Dryrun.new(opts, config: config).execute
19
+ elsif options[:rollback_dry_run]
20
+ require 'convergence/command/rollback_dryrun'
21
+ Convergence::Command::RollbackDryrun.new(opts, config: config).execute
22
+ else
23
+ require 'convergence/command/apply'
24
+ Convergence::Command::Apply.new(opts, config: config).execute
25
+ end
26
+ end
27
+
28
+ desc 'diff FILE1 FILE2', 'print diff of DSLs'
29
+ def diff(file1, file2)
30
+ require 'convergence/command/diff'
31
+ opts = { diff: [file1, file2] }
32
+ Convergence::Command::Diff.new(opts, config: config).execute
33
+ end
34
+
35
+ desc 'export', 'export db schema to dsl'
36
+ method_option :config, aliases: '-c', type: :string, required: true, desc: 'Database Yaml Setting'
37
+ def export
38
+ require 'convergence/command/export'
39
+ opts = {}
40
+ Convergence::Command::Export.new(opts, config: config).execute
41
+ end
42
+
43
+ desc 'version', 'print the version'
44
+ def version
45
+ require 'convergence/version'
46
+ puts "version #{Convergence::VERSION}"
47
+ end
48
+
49
+ private
50
+
51
+ def config
52
+ return unless options[:config]
53
+ @config ||= Convergence::Config.load(options[:config])
54
+ end
55
+ end
@@ -27,6 +27,7 @@ class Convergence::Column
27
27
  datetime
28
28
  timestamp
29
29
  year
30
+ json
30
31
  )
31
32
  FLOATING_POINT_COLUMN_TYPE = %i(
32
33
  float
@@ -1,3 +1,7 @@
1
+ require 'convergence/config'
2
+ require 'convergence/logger'
3
+ require 'convergence/database_connector'
4
+
1
5
  class Convergence::Command
2
6
  def initialize(opts, config: nil)
3
7
  @opts = opts
@@ -8,23 +12,7 @@ class Convergence::Command
8
12
  end
9
13
  end
10
14
 
11
- def execute
12
- execute_klass =
13
- if @opts[:diff]
14
- Convergence::Command::Diff
15
- elsif @opts[:export]
16
- Convergence::Command::Export
17
- elsif @opts[:dryrun]
18
- Convergence::Command::Dryrun
19
- elsif @opts[:apply]
20
- Convergence::Command::Apply
21
- end
22
- if execute_klass.nil?
23
- puts @opts
24
- else
25
- execute_klass.new(@opts, config: @config).execute
26
- end
27
- end
15
+ private
28
16
 
29
17
  def database_adapter
30
18
  @config.nil? ? 'mysql' : @config.adapter
@@ -37,21 +25,13 @@ class Convergence::Command
37
25
  def dumper
38
26
  @dumper ||= case database_adapter
39
27
  when 'mysql', 'mysql2'
28
+ require 'convergence/dumper/mysql_schema_dumper'
40
29
  Convergence::Dumper::MysqlSchemaDumper.new(connector)
41
30
  else
42
31
  fail NotImplementedError.new('unknown database adapter')
43
32
  end
44
33
  end
45
34
 
46
- def sql_generator
47
- @sql_generator ||= case database_adapter
48
- when 'mysql', 'mysql2'
49
- SQLGenerator::MysqlGenerator.new
50
- else
51
- fail NotImplementedError.new('unknown database adapter')
52
- end
53
- end
54
-
55
35
  def logger
56
36
  @logger ||= Convergence::Logger.new
57
37
  end
@@ -1,20 +1,39 @@
1
1
  require 'benchmark'
2
2
  require 'pathname'
3
+ require 'convergence/command'
4
+ require 'convergence/dsl'
5
+ require 'convergence/default_parameter'
6
+ require 'convergence/diff'
3
7
 
4
8
  class Convergence::Command::Apply < Convergence::Command
5
- def validate!
6
- fail ArgumentError.new('--config required') if @config.nil?
7
- fail ArgumentError.new('--input required') unless @opts[:input]
8
- end
9
-
10
9
  def execute
11
- validate!
12
10
  current_dir_path = Pathname.new(@opts[:input]).realpath.dirname
13
11
  input_tables = Convergence::DSL.parse(File.open(@opts[:input]).read, current_dir_path)
14
12
  current_tables = dumper.dump
15
13
  execute_sql(input_tables, current_tables)
16
14
  end
17
15
 
16
+ def generate_sql(input_tables, current_tables)
17
+ current_tables_with_full_option =
18
+ Convergence::DefaultParameter.append_database_default_parameter(current_tables, database_adapter)
19
+ input_tables_with_full_option =
20
+ Convergence::DefaultParameter.append_database_default_parameter(input_tables, database_adapter)
21
+ delta = Convergence::Diff.new.diff(current_tables_with_full_option, input_tables_with_full_option)
22
+ sql_generator.generate(input_tables_with_full_option, delta, current_tables_with_full_option)
23
+ end
24
+
25
+ private
26
+
27
+ def sql_generator
28
+ @sql_generator ||= case database_adapter
29
+ when 'mysql', 'mysql2'
30
+ require 'convergence/sql_generator/mysql_generator'
31
+ SQLGenerator::MysqlGenerator.new
32
+ else
33
+ fail NotImplementedError.new('unknown database adapter')
34
+ end
35
+ end
36
+
18
37
  def execute_sql(input_tables, current_tables)
19
38
  sql = generate_sql(input_tables, current_tables)
20
39
  unless sql.strip.empty?
@@ -41,13 +60,4 @@ SET FOREIGN_KEY_CHECKS=1;
41
60
  end
42
61
  end
43
62
  end
44
-
45
- def generate_sql(input_tables, current_tables)
46
- current_tables_with_full_option =
47
- Convergence::DefaultParameter.append_database_default_parameter(current_tables, database_adapter)
48
- input_tables_with_full_option =
49
- Convergence::DefaultParameter.append_database_default_parameter(input_tables, database_adapter)
50
- delta = Convergence::Diff.new.diff(current_tables_with_full_option, input_tables_with_full_option)
51
- sql_generator.generate(input_tables_with_full_option, delta, current_tables_with_full_option)
52
- end
53
63
  end
@@ -1,12 +1,11 @@
1
- class Convergence::Command::Diff < Convergence::Command
2
- def validate!
3
- unless @opts[:diff].size == 2
4
- fail ArgumentError.new('diff required two arguments')
5
- end
6
- end
1
+ require 'pathname'
2
+ require 'convergence/command'
3
+ require 'convergence/default_parameter'
4
+ require 'convergence/pretty_diff'
5
+ require 'convergence/dsl'
7
6
 
7
+ class Convergence::Command::Diff < Convergence::Command
8
8
  def execute
9
- validate!
10
9
  from = Convergence::DefaultParameter.remove_database_default_parameter(from_tables, database_adapter)
11
10
  to = Convergence::DefaultParameter.remove_database_default_parameter(to_tables, database_adapter)
12
11
  msg = Convergence::PrettyDiff.new(from, to).output
@@ -1,12 +1,12 @@
1
1
  require 'pathname'
2
- class Convergence::Command::Dryrun < Convergence::Command
3
- def validate!
4
- fail ArgumentError.new('--config required') if @config.nil?
5
- fail ArgumentError.new('--input required') unless @opts[:input]
6
- end
2
+ require 'convergence/command'
3
+ require 'convergence/command/apply'
4
+ require 'convergence/dsl'
5
+ require 'convergence/default_parameter'
6
+ require 'convergence/pretty_diff'
7
7
 
8
+ class Convergence::Command::Dryrun < Convergence::Command
8
9
  def execute
9
- validate!
10
10
  current_dir_path = Pathname.new(@opts[:input]).realpath.dirname
11
11
  input_tables = Convergence::DSL.parse(File.open(@opts[:input]).read, current_dir_path)
12
12
  current_tables = dumper.dump
@@ -15,6 +15,8 @@ class Convergence::Command::Dryrun < Convergence::Command
15
15
  output_sql(input_tables, current_tables)
16
16
  end
17
17
 
18
+ private
19
+
18
20
  def output_diff(input_tables, current_tables)
19
21
  input_tables_without_default_parameter =
20
22
  Convergence::DefaultParameter.remove_database_default_parameter(input_tables, database_adapter)
@@ -35,7 +37,7 @@ class Convergence::Command::Dryrun < Convergence::Command
35
37
  .split("\n")
36
38
  .map { |v| '# ' + v }
37
39
  .join("\n")
38
- logger.output(msg)
40
+ logger.output(msg) unless msg.empty?
39
41
  msg
40
42
  end
41
43
  end
@@ -1,12 +1,9 @@
1
- class Convergence::Command::Export < Convergence::Command
2
- def validate!
3
- if @config.nil?
4
- fail ArgumentError.new('--config required')
5
- end
6
- end
1
+ require 'convergence/command'
2
+ require 'convergence/dumper'
3
+ require 'convergence/default_parameter'
7
4
 
5
+ class Convergence::Command::Export < Convergence::Command
8
6
  def execute
9
- validate!
10
7
  tables = Convergence::DefaultParameter.remove_database_default_parameter(dumper.dump, database_adapter)
11
8
  msg = Convergence::Dumper.new.dump_dsl(tables)
12
9
  logger.output(msg)
@@ -0,0 +1,28 @@
1
+ require 'pathname'
2
+ require 'convergence/command'
3
+ require 'convergence/command/apply'
4
+ require 'convergence/dsl'
5
+ require 'convergence/default_parameter'
6
+
7
+ class Convergence::Command::RollbackDryrun < Convergence::Command
8
+ def execute
9
+ current_dir_path = Pathname.new(@opts[:input]).realpath.dirname
10
+ input_tables = Convergence::DSL.parse(File.open(@opts[:input]).read, current_dir_path)
11
+ current_tables = dumper.dump
12
+
13
+ output_sql(current_tables, input_tables)
14
+ end
15
+
16
+ private
17
+
18
+ def output_sql(input_tables, current_tables)
19
+ msg = Convergence::Command::Apply
20
+ .new(@opts, config: @config)
21
+ .generate_sql(input_tables, current_tables)
22
+ .split("\n")
23
+ .map { |v| '# ' + v }
24
+ .join("\n")
25
+ logger.output(msg)
26
+ msg
27
+ end
28
+ end
@@ -4,7 +4,33 @@ require 'yaml'
4
4
  class Convergence::Config
5
5
  ATTRIBUTES = %i[adapter database host port username password].freeze
6
6
 
7
- attr_accessor(*ATTRIBUTES)
7
+ attr_accessor(*ATTRIBUTES, :mysql)
8
+
9
+ class MySQL
10
+ ATTRIBUTES = %i[ssl_mode sslkey sslcert sslca sslcapath sslcipher sslverify].freeze
11
+
12
+ attr_accessor(*ATTRIBUTES)
13
+
14
+ def initialize(attributes)
15
+ attributes.each do |k, v|
16
+ next if v.nil?
17
+ next if !ATTRIBUTES.include?(k.to_sym) && !ATTRIBUTES.include?(k.to_s)
18
+ instance_variable_set("@#{k}", v)
19
+ end
20
+ end
21
+
22
+ def ssl_options
23
+ {
24
+ ssl_mode: ssl_mode,
25
+ sslkey: sslkey,
26
+ sslcert: sslcert,
27
+ sslca: sslca,
28
+ sslcapath: sslcapath,
29
+ sslcipher: sslcipher,
30
+ sslverify: sslverify
31
+ }.compact
32
+ end
33
+ end
8
34
 
9
35
  def initialize(attributes)
10
36
  attributes.each do |k, v|
@@ -12,6 +38,10 @@ class Convergence::Config
12
38
  next if !ATTRIBUTES.include?(k.to_sym) && !ATTRIBUTES.include?(k.to_s)
13
39
  instance_variable_set("@#{k}", v)
14
40
  end
41
+ case adapter
42
+ when 'mysql', 'mysql2'
43
+ @mysql = MySQL.new(attributes)
44
+ end
15
45
  end
16
46
 
17
47
  def self.load(yaml_path)
@@ -5,6 +5,7 @@ class Convergence::DatabaseConnector
5
5
  @connector =
6
6
  case config.adapter
7
7
  when 'mysql', 'mysql2'
8
+ require 'convergence/database_connector/mysql_connector'
8
9
  Convergence::DatabaseConnector::MysqlConnector.new(config)
9
10
  else
10
11
  fail NotImplementedError.new("#{config.adapter} not supported yet")
@@ -1,4 +1,6 @@
1
1
  require 'mysql2'
2
+ require 'convergence/database_connector'
3
+
2
4
  class Convergence::DatabaseConnector::MysqlConnector
3
5
  attr_reader :config
4
6
 
@@ -8,21 +10,25 @@ class Convergence::DatabaseConnector::MysqlConnector
8
10
 
9
11
  def client(database_name = @config.database)
10
12
  @mysql ||= Mysql2::Client.new(
11
- host: @config.host,
12
- port: @config.port,
13
- username: @config.username,
14
- password: @config.password,
15
- database: database_name
13
+ {
14
+ host: @config.host,
15
+ port: @config.port,
16
+ username: @config.username,
17
+ password: @config.password,
18
+ database: database_name
19
+ }.merge!(@config.mysql.ssl_options)
16
20
  )
17
21
  end
18
22
 
19
23
  def schema_client
20
24
  @schema_mysql ||= Mysql2::Client.new(
21
- host: @config.host,
22
- port: @config.port,
23
- username: @config.username,
24
- password: @config.password,
25
- database: 'information_schema'
25
+ {
26
+ host: @config.host,
27
+ port: @config.port,
28
+ username: @config.username,
29
+ password: @config.password,
30
+ database: 'information_schema'
31
+ }.merge!(@config.mysql.ssl_options)
26
32
  )
27
33
  end
28
34
  end
@@ -2,6 +2,7 @@ class Convergence::DefaultParameter
2
2
  def initialize(adapter)
3
3
  case adapter.downcase
4
4
  when 'mysql', 'mysql2'
5
+ require 'convergence/default_parameter/mysql_default_parameter'
5
6
  @parameter_klass = Convergence::DefaultParameter::MysqlDefaultParameter.new
6
7
  else
7
8
  fail NotImplementedError.new("unknown adapter #{config.adapter}.")
@@ -1,3 +1,5 @@
1
+ require 'convergence/default_parameter'
2
+
1
3
  class Convergence::DefaultParameter::MysqlDefaultParameter
2
4
  DEFAULT_TABLE_PARAMETERS = {
3
5
  engine: 'InnoDB',
@@ -99,7 +99,7 @@ class Convergence::Diff
99
99
  from_columns = from.columns.keys
100
100
  to_columns = to.columns.keys
101
101
  order_changed_columns = Diff::LCS.diff(from_columns, to_columns)
102
- .flatten
102
+ .flatten(1)
103
103
  .select(&:adding?)
104
104
  .map(&:element)
105
105
  order_changed_columns.each do |column|
@@ -1,3 +1,5 @@
1
+ require 'convergence/table'
2
+
1
3
  class Convergence::DSL
2
4
  attr_accessor :tables, :current_dir_path
3
5
 
@@ -70,7 +70,7 @@ class Convergence::Dumper
70
70
  end
71
71
 
72
72
  def key_value_text(k, v)
73
- value = if v.to_s == 'true' || v.to_s == 'false' || v =~ /^\d+$/
73
+ value = if v.to_s == 'true' || v.to_s == 'false' || v.to_s =~ /^\d+$/
74
74
  v
75
75
  else
76
76
  %(#{v.inspect})
@@ -1,3 +1,6 @@
1
+ require 'convergence/dumper'
2
+ require 'convergence/table'
3
+
1
4
  class Convergence::Dumper::MysqlSchemaDumper
2
5
  def initialize(connector)
3
6
  @connector = connector
@@ -1,4 +1,6 @@
1
1
  require 'diffy'
2
+ require 'convergence/diff'
3
+ require 'convergence/dumper'
2
4
 
3
5
  class Convergence::PrettyDiff
4
6
  def initialize(from_tables, to_tables)
@@ -1,3 +1,5 @@
1
+ require 'convergence/sql_generator'
2
+
1
3
  class SQLGenerator::MysqlGenerator < SQLGenerator
2
4
  OPTION_MAPPING = {
3
5
  engine: 'ENGINE',
@@ -1,3 +1,7 @@
1
+ require 'convergence/column'
2
+ require 'convergence/index'
3
+ require 'convergence/foreign_key'
4
+
1
5
  class Convergence::Table
2
6
  attr_accessor :table_name, :table_options, :columns, :indexes, :foreign_keys
3
7
 
@@ -1,3 +1,3 @@
1
1
  module Convergence
2
- VERSION = '0.2.7'
2
+ VERSION = '1.0.4'
3
3
  end
@@ -1,4 +1,6 @@
1
1
  require 'spec_helper'
2
+ require 'convergence/diff'
3
+ require 'convergence/table'
2
4
 
3
5
  describe Convergence::DSL do
4
6
  describe '#diff' do
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'convergence/dsl'
2
3
 
3
4
  describe Convergence::DSL do
4
5
  let(:dsl_single_table) do
@@ -1,4 +1,6 @@
1
1
  require 'spec_helper'
2
+ require 'convergence/dumper/mysql_schema_dumper'
3
+ require 'convergence/database_connector'
2
4
 
3
5
  describe Convergence::Dumper::MysqlSchemaDumper do
4
6
  before do
@@ -1,4 +1,6 @@
1
1
  require 'spec_helper'
2
+ require 'convergence/dumper'
3
+ require 'convergence/table'
2
4
 
3
5
  describe Convergence::Dumper do
4
6
  let(:table1) do
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'convergence/table'
2
3
 
3
4
  describe Convergence::Table do
4
5
  let(:table_name) { 'dummy_table' }
@@ -1,12 +1,12 @@
1
1
  require 'spec_helper'
2
+ require 'convergence/command/dryrun'
2
3
 
3
4
  describe 'Command::Dryrun#execute' do
4
5
  def execute(dsl_path)
5
6
  parse_option = {
6
- dryrun: true,
7
7
  input: File.expand_path("#{File.dirname(__FILE__)}/../fixtures/#{dsl_path}")
8
8
  }
9
- Convergence::Command.new(parse_option, config: mysql_settings).execute
9
+ Convergence::Command::Dryrun.new(parse_option, config: mysql_settings).execute
10
10
  end
11
11
 
12
12
  describe 'change table options' do
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'convergence/command/apply'
2
3
 
3
4
  describe 'Changeable Foreign key' do
4
5
  after(:each) do
@@ -7,10 +8,9 @@ describe 'Changeable Foreign key' do
7
8
 
8
9
  def execute(dsl_path)
9
10
  parse_option = {
10
- apply: true,
11
11
  input: File.expand_path("#{File.dirname(__FILE__)}/../fixtures/#{dsl_path}")
12
12
  }
13
- Convergence::Command.new(parse_option, config: mysql_settings).execute
13
+ Convergence::Command::Apply.new(parse_option, config: mysql_settings).execute
14
14
  end
15
15
 
16
16
  describe 'drop foreign key' do
@@ -3,6 +3,7 @@ require 'bundler/setup'
3
3
  require 'rspec'
4
4
  require 'pry'
5
5
  require 'convergence'
6
+ require 'convergence/database_connector'
6
7
  Dir["#{File.dirname(__FILE__)}/integrations/**/*.rb"].each { |f| require f }
7
8
 
8
9
  $default_output = File.open('/dev/null', 'w')
@@ -20,14 +21,12 @@ def rollback
20
21
  .map(&:strip)
21
22
  .reject(&:empty?)
22
23
  sqls.each do |sql|
23
- Convergence::Command.new({}, config: mysql_settings)
24
- .connector
24
+ Convergence::DatabaseConnector.new(mysql_settings)
25
25
  .client
26
26
  .query("#{sql};")
27
27
  end
28
28
  end
29
29
 
30
30
  RSpec.configure do |config|
31
- config.filter_run :focus
32
- config.run_all_when_everything_filtered = true
31
+ config.filter_run_when_matching :focus
33
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: convergence
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shinsuke Nishio
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-20 00:00:00.000000000 Z
11
+ date: 2020-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mysql2
@@ -53,61 +53,47 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: slop
56
+ name: thor
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.6'
61
+ version: '0.20'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.6'
69
- - !ruby/object:Gem::Dependency
70
- name: bundler
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.7'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.7'
68
+ version: '0.20'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rake
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - "~>"
88
74
  - !ruby/object:Gem::Version
89
- version: '10.0'
75
+ version: '13.0'
90
76
  type: :development
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
- version: '10.0'
82
+ version: '13.0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: rspec
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ">="
102
88
  - !ruby/object:Gem::Version
103
- version: '0'
89
+ version: '3.5'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - ">="
109
95
  - !ruby/object:Gem::Version
110
- version: '0'
96
+ version: '3.5'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: rubocop
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -187,12 +173,14 @@ files:
187
173
  - convergence.gemspec
188
174
  - database.yml.example
189
175
  - lib/convergence.rb
176
+ - lib/convergence/cli.rb
190
177
  - lib/convergence/column.rb
191
178
  - lib/convergence/command.rb
192
179
  - lib/convergence/command/apply.rb
193
180
  - lib/convergence/command/diff.rb
194
181
  - lib/convergence/command/dryrun.rb
195
182
  - lib/convergence/command/export.rb
183
+ - lib/convergence/command/rollback_dryrun.rb
196
184
  - lib/convergence/config.rb
197
185
  - lib/convergence/database_connector.rb
198
186
  - lib/convergence/database_connector/mysql_connector.rb
@@ -241,15 +229,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
241
229
  requirements:
242
230
  - - ">="
243
231
  - !ruby/object:Gem::Version
244
- version: 2.3.0
232
+ version: 2.4.0
245
233
  required_rubygems_version: !ruby/object:Gem::Requirement
246
234
  requirements:
247
235
  - - ">="
248
236
  - !ruby/object:Gem::Version
249
237
  version: '0'
250
238
  requirements: []
251
- rubyforge_project:
252
- rubygems_version: 2.6.8
239
+ rubygems_version: 3.1.2
253
240
  signing_key:
254
241
  specification_version: 4
255
242
  summary: DB Schema management tool