convergence 0.2.7 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +2 -0
- data/CHANGELOG.md +42 -0
- data/Gemfile.lock +47 -52
- data/README.md +50 -19
- data/bin/convergence +2 -19
- data/convergence.gemspec +4 -5
- data/lib/convergence.rb +0 -22
- data/lib/convergence/cli.rb +55 -0
- data/lib/convergence/column.rb +1 -0
- data/lib/convergence/command.rb +6 -26
- data/lib/convergence/command/apply.rb +25 -15
- data/lib/convergence/command/diff.rb +6 -7
- data/lib/convergence/command/dryrun.rb +9 -7
- data/lib/convergence/command/export.rb +4 -7
- data/lib/convergence/command/rollback_dryrun.rb +28 -0
- data/lib/convergence/config.rb +31 -1
- data/lib/convergence/database_connector.rb +1 -0
- data/lib/convergence/database_connector/mysql_connector.rb +16 -10
- data/lib/convergence/default_parameter.rb +1 -0
- data/lib/convergence/default_parameter/mysql_default_parameter.rb +2 -0
- data/lib/convergence/diff.rb +1 -1
- data/lib/convergence/dsl.rb +2 -0
- data/lib/convergence/dumper.rb +1 -1
- data/lib/convergence/dumper/mysql_schema_dumper.rb +3 -0
- data/lib/convergence/pretty_diff.rb +2 -0
- data/lib/convergence/sql_generator/mysql_generator.rb +2 -0
- data/lib/convergence/table.rb +4 -0
- data/lib/convergence/version.rb +1 -1
- data/spec/convergence/diff_spec.rb +2 -0
- data/spec/convergence/dsl_spec.rb +1 -0
- data/spec/convergence/dumper/mysql_schema_dumper_spec.rb +2 -0
- data/spec/convergence/dumper_spec.rb +2 -0
- data/spec/convergence/table_spec.rb +1 -0
- data/spec/integrations/command_dryrun.rb +2 -2
- data/spec/integrations/drop_foreign_key.rb +2 -2
- data/spec/spec_helper.rb +3 -4
- metadata +13 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a41f0e1a7c45b785eecc5a53f5aa622158f8777d51999e0ba48280fc53901326
|
4
|
+
data.tar.gz: 91749136917fd3c5f0c2ba6ff1553bd23ceb96edeca9c702eae9aeecd01f7976
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e232a04b220ccdce258b2ab2f8da447e1c95dbba6b58f5de20ef6d9193553fce54a8504205503d15111ce2e00db5000753083af5284c502f4919890919b8572
|
7
|
+
data.tar.gz: 5fdc75e1b04fac387622100c41d85cc79b8c4440988fe0560d5c9bd0149411da18172ab3513a9fad1a1688b38b7f3a247640ce7d815d0614b29030868986f750
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -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)
|
data/Gemfile.lock
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
convergence (0.
|
4
|
+
convergence (1.0.4)
|
5
5
|
diff-lcs
|
6
6
|
diffy
|
7
7
|
mysql2
|
8
|
-
|
8
|
+
thor (~> 0.20)
|
9
9
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
ast (2.
|
13
|
+
ast (2.4.0)
|
14
14
|
coderay (1.1.2)
|
15
|
-
diff-lcs (1.
|
16
|
-
diffy (3.
|
17
|
-
ffi (1.
|
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.
|
19
|
+
guard (2.16.1)
|
20
20
|
formatador (>= 0.2.4)
|
21
21
|
listen (>= 2.7, < 4.0)
|
22
|
-
lumberjack (
|
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
|
-
|
34
|
-
|
35
|
-
rb-
|
36
|
-
|
37
|
-
lumberjack (1.0
|
38
|
-
method_source (0.9.
|
39
|
-
mysql2 (0.5.
|
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.
|
41
|
+
notiffany (0.1.3)
|
42
42
|
nenv (~> 0.1)
|
43
43
|
shellany (~> 0.0)
|
44
|
-
parallel (1.
|
45
|
-
parser (2.
|
46
|
-
ast (~> 2.
|
47
|
-
|
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 (
|
52
|
-
|
53
|
-
|
54
|
-
rb-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
rspec-
|
59
|
-
rspec-
|
60
|
-
|
61
|
-
|
62
|
-
|
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.
|
66
|
-
rspec-mocks (3.
|
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.
|
69
|
-
rspec-support (3.
|
70
|
-
rubocop (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.
|
73
|
-
|
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 (
|
77
|
-
ruby-progressbar (1.
|
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
|
-
|
81
|
-
|
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 (~>
|
94
|
-
rspec
|
88
|
+
rake (~> 13.0)
|
89
|
+
rspec (>= 3.5)
|
95
90
|
rubocop
|
96
91
|
|
97
92
|
BUNDLED WITH
|
98
|
-
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
|
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 -
|
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
|
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 -
|
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
|
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
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
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
|
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
|
-
###
|
219
|
+
### Dry run
|
197
220
|
|
198
221
|
```
|
199
|
-
$ convergence -c database.yml -
|
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
|
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|
|
data/bin/convergence
CHANGED
@@ -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
|
-
|
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
|
data/convergence.gemspec
CHANGED
@@ -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 '
|
24
|
+
spec.add_dependency 'thor', '~> 0.20'
|
25
25
|
|
26
|
-
spec.required_ruby_version = ">= 2.
|
26
|
+
spec.required_ruby_version = ">= 2.4.0"
|
27
27
|
|
28
|
-
spec.add_development_dependency '
|
29
|
-
spec.add_development_dependency '
|
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'
|
data/lib/convergence.rb
CHANGED
@@ -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
|
data/lib/convergence/column.rb
CHANGED
data/lib/convergence/command.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
2
|
-
|
3
|
-
|
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
|
data/lib/convergence/config.rb
CHANGED
@@ -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
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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}.")
|
data/lib/convergence/diff.rb
CHANGED
@@ -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|
|
data/lib/convergence/dsl.rb
CHANGED
data/lib/convergence/dumper.rb
CHANGED
data/lib/convergence/table.rb
CHANGED
data/lib/convergence/version.rb
CHANGED
@@ -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
|
data/spec/spec_helper.rb
CHANGED
@@ -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::
|
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.
|
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.
|
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:
|
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:
|
56
|
+
name: thor
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
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: '
|
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: '
|
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: '
|
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: '
|
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: '
|
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.
|
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
|
-
|
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
|