convergence 0.1.2 → 0.1.3
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -2
- data/lib/convergence/diff.rb +18 -5
- data/lib/convergence/sql_generator/mysql_generator.rb +1 -1
- data/lib/convergence/version.rb +1 -1
- data/spec/convergence/diff_spec.rb +19 -0
- data/spec/convergence/dsl_spec.rb +12 -1
- data/spec/convergence/dumper/mysql_schema_dumper_spec.rb +8 -1
- data/spec/fixtures/test_db.sql +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 137446e613d09e9f82e5126fef9b15f42f53b258
|
4
|
+
data.tar.gz: 80f689389a919a431063b0ca9a8ff023701f64dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45ec8cd62c1824db046585a7e069a62d2ad7b408ab1a4d74089429d7bc3f18a2768764af4c75d50a66bda662e735d0e12320f8ac2b6168d5df1c253822fa815a
|
7
|
+
data.tar.gz: a329fe4c6cb6e15455b979083c3374cb731b032a26dd39c6aa675942f782e51a3a150dc22ae8fe2af3525d4e903fd49f65e1de839b3d30847bb29653d5e018fa
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
convergence (0.1.
|
4
|
+
convergence (0.1.3)
|
5
5
|
diff-lcs
|
6
6
|
diffy
|
7
7
|
mysql2
|
@@ -36,7 +36,7 @@ GEM
|
|
36
36
|
rb-inotify (>= 0.9)
|
37
37
|
lumberjack (1.0.9)
|
38
38
|
method_source (0.8.2)
|
39
|
-
mysql2 (0.
|
39
|
+
mysql2 (0.4.2)
|
40
40
|
parser (2.2.0.pre.5)
|
41
41
|
ast (>= 1.1, < 3.0)
|
42
42
|
slop (~> 3.4, >= 3.4.5)
|
@@ -86,3 +86,6 @@ DEPENDENCIES
|
|
86
86
|
rake (~> 10.0)
|
87
87
|
rspec
|
88
88
|
rubocop
|
89
|
+
|
90
|
+
BUNDLED WITH
|
91
|
+
1.10.5
|
data/lib/convergence/diff.rb
CHANGED
@@ -6,7 +6,10 @@ class Convergence::Diff
|
|
6
6
|
from_database = {} if from_database.nil?
|
7
7
|
delta[:add_table] = scan_add_table(from_database, to_database)
|
8
8
|
delta[:remove_table] = scan_remove_table(from_database, to_database)
|
9
|
-
|
9
|
+
change_table = scan_change_table(from_database, to_database)
|
10
|
+
delta[:change_table] = change_table[:change]
|
11
|
+
delta[:remove_table].merge!(change_table[:remove])
|
12
|
+
delta[:add_table].merge!(change_table[:add])
|
10
13
|
delta
|
11
14
|
end
|
12
15
|
|
@@ -14,8 +17,9 @@ class Convergence::Diff
|
|
14
17
|
from = from_table.dup
|
15
18
|
to = to_table.dup
|
16
19
|
delta = {}
|
17
|
-
delta[:add_column] = scan_add_column(from, to)
|
18
20
|
delta[:remove_column] = scan_remove_column(from, to)
|
21
|
+
return delta if removed_all_columns?(from, delta)
|
22
|
+
delta[:add_column] = scan_add_column(from, to)
|
19
23
|
delta[:change_column] = scan_change_column(from, to)
|
20
24
|
scan_change_order_column(from, to, delta)
|
21
25
|
delta[:remove_index] = scan_change_index(to, from)
|
@@ -37,14 +41,19 @@ class Convergence::Diff
|
|
37
41
|
end
|
38
42
|
|
39
43
|
def scan_change_table(from, to)
|
40
|
-
delta = {}
|
44
|
+
delta = { change: {}, remove: {}, add: {}}
|
41
45
|
target_tables = from.map { |name, _| name } & to.map { |name, _| name }
|
42
46
|
target_tables.each do |target_table|
|
43
47
|
from_table = from.find { |name, _| name == target_table }[1]
|
44
48
|
to_table = to.find { |name, _| name == target_table }[1]
|
45
49
|
diff = diff_table(from_table, to_table)
|
46
50
|
unless diff.values.all?(&:empty?)
|
47
|
-
|
51
|
+
if removed_all_columns?(from_table, diff)
|
52
|
+
delta[:remove][target_table] = from_table
|
53
|
+
delta[:add][target_table] = to_table
|
54
|
+
else
|
55
|
+
delta[:change][target_table] = diff
|
56
|
+
end
|
48
57
|
end
|
49
58
|
end
|
50
59
|
delta
|
@@ -79,7 +88,7 @@ class Convergence::Diff
|
|
79
88
|
end
|
80
89
|
change_columns
|
81
90
|
.compact
|
82
|
-
.reduce { |a, e| a.merge(e) }
|
91
|
+
.reduce({}) { |a, e| a.merge(e) }
|
83
92
|
.reject { |_k, v| v.empty? }
|
84
93
|
end
|
85
94
|
|
@@ -145,4 +154,8 @@ class Convergence::Diff
|
|
145
154
|
end
|
146
155
|
Hash[change_options]
|
147
156
|
end
|
157
|
+
|
158
|
+
def removed_all_columns?(from_table, diff)
|
159
|
+
from_table.columns.each_key.all? { |name| diff[:remove_column].each_key.include?(name) }
|
160
|
+
end
|
148
161
|
end
|
@@ -15,8 +15,8 @@ class SQLGenerator::MysqlGenerator < SQLGenerator
|
|
15
15
|
sqls = []
|
16
16
|
sqls << change_table_sql(to_table, delta)
|
17
17
|
sqls << ['']
|
18
|
-
sqls << create_table_sqls(delta)
|
19
18
|
sqls << drop_table_sqls(delta)
|
19
|
+
sqls << create_table_sqls(delta)
|
20
20
|
sqls.join("\n")
|
21
21
|
end
|
22
22
|
|
data/lib/convergence/version.rb
CHANGED
@@ -110,6 +110,25 @@ describe Convergence::DSL do
|
|
110
110
|
expect(results[:change_table]).not_to be_empty
|
111
111
|
end
|
112
112
|
end
|
113
|
+
|
114
|
+
context 'all columns are replaced' do
|
115
|
+
let(:table_to) do
|
116
|
+
Convergence::Table.new('table1').tap do |t|
|
117
|
+
t.int('id_rename', primary_key: true)
|
118
|
+
t.varchar('name_rename', limit: 200, null: false)
|
119
|
+
t.varchar('data_rename', limit: 300, null: false)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
it do
|
124
|
+
results = Convergence::Diff.new.diff({ 'table1' => table_from }, { 'table1' => table_to })
|
125
|
+
expect(results[:add_table]).not_to be_empty
|
126
|
+
expect(results[:remove_table]).not_to be_empty
|
127
|
+
expect(results[:change_table]).to be_empty
|
128
|
+
included_after_option = results[:add_table].each_value.map { |t| t.columns.each_value.map { |c| c.options.key?(:after) } }.flatten.any?
|
129
|
+
expect(included_after_option).to eq false
|
130
|
+
end
|
131
|
+
end
|
113
132
|
end
|
114
133
|
end
|
115
134
|
|
@@ -5,8 +5,13 @@ describe Convergence::DSL do
|
|
5
5
|
<<-DSL
|
6
6
|
create_table "users", comment: 'Users' do |t|
|
7
7
|
t.int "id", primary_key: true, null: false, limit: 11, extra: "auto_increment"
|
8
|
+
t.varchar "email"
|
9
|
+
t.varchar "first_name"
|
10
|
+
t.varchar "last_name"
|
8
11
|
t.datetime "created_at", null: true
|
9
12
|
|
13
|
+
t.index 'email', length: 100
|
14
|
+
t.index ['first_name', 'last_name'], length: { first_name: 15, last_name: 20 }
|
10
15
|
t.index 'created_at'
|
11
16
|
t.foreign_key "user_id", reference: "users", reference_column: "id"
|
12
17
|
end
|
@@ -58,7 +63,13 @@ describe Convergence::DSL do
|
|
58
63
|
end
|
59
64
|
|
60
65
|
it 'should be able to parse indexes' do
|
61
|
-
|
66
|
+
indexes = subject['users'].indexes
|
67
|
+
expect(indexes).not_to be_nil
|
68
|
+
expect(indexes['index_users_on_email']).not_to be_nil
|
69
|
+
expect(indexes['index_users_on_email'].options[:length]['email']).to eq(100)
|
70
|
+
expect(indexes['index_users_on_first_name_last_name']).not_to be_nil
|
71
|
+
expect(indexes['index_users_on_first_name_last_name'].options[:length]['first_name']).to eq(15)
|
72
|
+
expect(indexes['index_users_on_first_name_last_name'].options[:length]['last_name']).to eq(20)
|
62
73
|
end
|
63
74
|
|
64
75
|
it 'should be able to parse foreign keys' do
|
@@ -67,11 +67,18 @@ describe Convergence::Dumper::MysqlSchemaDumper do
|
|
67
67
|
end
|
68
68
|
|
69
69
|
describe 'indexes' do
|
70
|
-
it do
|
70
|
+
it 'should be dump index of authors' do
|
71
71
|
index = subject['authors'].indexes['index_authors_on_created_at']
|
72
72
|
expect(index).not_to be_nil
|
73
73
|
expect(index.index_columns).to eq(['created_at'])
|
74
74
|
end
|
75
|
+
|
76
|
+
it 'should be dump index of papers' do
|
77
|
+
index = subject['papers'].indexes['index_papers_on_title1_title2']
|
78
|
+
expect(index).not_to be_nil
|
79
|
+
expect(index.index_columns).to eq(['title1', 'title2'])
|
80
|
+
expect(index.options[:length]).to eq('title1' => 100, 'title2' => 200)
|
81
|
+
end
|
75
82
|
end
|
76
83
|
|
77
84
|
describe 'foreign keys' do
|
data/spec/fixtures/test_db.sql
CHANGED
@@ -7,7 +7,8 @@ CREATE TABLE `papers` (
|
|
7
7
|
`title1` varchar(300) NOT NULL COMMENT 'Title 1',
|
8
8
|
`title2` varchar(300) NOT NULL COMMENT 'Title 2',
|
9
9
|
`description` text COMMENT 'Description',
|
10
|
-
PRIMARY KEY (`id`)
|
10
|
+
PRIMARY KEY (`id`),
|
11
|
+
KEY `index_papers_on_title1_title2` (`title1` (100), `title2` (200))
|
11
12
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='Paper';
|
12
13
|
|
13
14
|
CREATE TABLE `authors` (
|
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.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shinsuke Nishio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mysql2
|