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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a027af56db0ff232518fea7d157ddaf5a883ded7
4
- data.tar.gz: 9e17636aee309f7fd85cf18533cd8c719dd36537
3
+ metadata.gz: 137446e613d09e9f82e5126fef9b15f42f53b258
4
+ data.tar.gz: 80f689389a919a431063b0ca9a8ff023701f64dd
5
5
  SHA512:
6
- metadata.gz: ba040edebd34bdb1f90a0a29ea42dd19540e904f3a4996ceb0daa65b33bc58f2f6484e109be17183157b7071adf4d13ab0058d23248a0be8289004758073150f
7
- data.tar.gz: e9569909621306dc9a87dc39b2fff9431fefbbeab83f9eafced75bc8391718991e844b49200772e7796945f8a3a39b2dacff9c4723b2277d56baba88ce8a8b3e
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.2)
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.3.18)
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
@@ -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
- delta[:change_table] = scan_change_table(from_database, to_database)
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
- delta[target_table] = diff
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
 
@@ -1,3 +1,3 @@
1
1
  module Convergence
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -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
- expect(subject['users'].indexes).not_to be_nil
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
@@ -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.2
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-07-21 00:00:00.000000000 Z
11
+ date: 2015-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mysql2