convergence 0.2.7 → 1.0.4

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 (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