ridgepole 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +95 -4
- data/bin/ridgepole +50 -5
- data/lib/ridgepole/client.rb +28 -0
- data/lib/ridgepole/diff.rb +37 -0
- data/lib/ridgepole/version.rb +1 -1
- data/spec/{dump → 0_diff}/dump_disable_unsigned_spec.rb +0 -0
- data/spec/diff/diff_spec.rb +154 -0
- data/spec/{migrate/migrate_drop_table.rb → dump/dump_class_method_spec.rb} +7 -23
- data/spec/migrate/migrate_add_column_spec.rb +11 -0
- data/spec/migrate/migrate_change_column_spec.rb +11 -0
- data/spec/migrate/migrate_change_table_option_spec.rb +6 -0
- data/spec/migrate/migrate_create_index_spec.rb +12 -0
- data/spec/migrate/migrate_create_table_spec.rb +12 -0
- data/spec/migrate/migrate_drop_column_spec.rb +16 -0
- data/spec/migrate/{migrate_drop_index.rb → migrate_drop_index_spec.rb} +13 -1
- data/spec/migrate/migrate_drop_table_spec.rb +116 -0
- data/spec/migrate/migrate_empty_spec.rb +22 -0
- data/spec/migrate/migrate_merge_mode_spec.rb +5 -0
- data/spec/migrate/migrate_rename_column_spec.rb +12 -0
- data/spec/migrate/migrate_rename_table_spec.rb +8 -0
- data/spec/migrate/migrate_with_ignore_tables_spec.rb +155 -0
- data/spec/migrate/migrate_with_tables_spec.rb +155 -0
- data/spec/spec_helper.rb +9 -5
- metadata +16 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5d54e938bc4e2bf95598645ed4a431726393ec0
|
4
|
+
data.tar.gz: 4a51aeaa8a9f1b9786c77ec09607b7be67227c81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93a822f7d5188da00068bad5b309b76adac1e6ee8992550eeccff464672c54ac77f88fadd0817404f7b44115662bbaecb5fa782d6dceb41c03c15a522c1ee52a
|
7
|
+
data.tar.gz: 8073144c850abfff1970664fc861d241f7676cfc98e9e26afb0e5d6be0d8aac2b6ce42517ac4827bcf8b6b2d6bebad8fb13f79b511deef5539e4e615974e78a6
|
data/README.md
CHANGED
@@ -25,10 +25,101 @@ Or install it yourself as:
|
|
25
25
|
## Usage
|
26
26
|
|
27
27
|
```sh
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
$ git init
|
29
|
+
Initialized empty Git repository in ...
|
30
|
+
|
31
|
+
$ cat config.yml
|
32
|
+
adapter: mysql2
|
33
|
+
encoding: utf8
|
34
|
+
database: blog
|
35
|
+
username: root
|
36
|
+
|
37
|
+
$ ridgepole -c config.yml --export -o Schemafile # or `ridgepole -c '{adapter: mysql2, database: blog}' ...`
|
38
|
+
Export Schema to `Schemafile`
|
39
|
+
|
40
|
+
$ cat Schemafile
|
41
|
+
create_table "articles", force: true do |t|
|
42
|
+
t.string "title"
|
43
|
+
t.text "text"
|
44
|
+
t.datetime "created_at"
|
45
|
+
t.datetime "updated_at"
|
46
|
+
end
|
47
|
+
|
48
|
+
$ git add .
|
49
|
+
$ git commit -m 'first commit' -a
|
50
|
+
[master (root-commit) a6c2d31] first commit
|
51
|
+
2 files changed, 10 insertions(+)
|
52
|
+
create mode 100644 Schemafile
|
53
|
+
create mode 100644 config.yml
|
54
|
+
|
55
|
+
$ vi Schemafile
|
56
|
+
$ git diff
|
57
|
+
diff --git a/Schemafile b/Schemafile
|
58
|
+
index f5848b9..c266fed 100644
|
59
|
+
--- a/Schemafile
|
60
|
+
+++ b/Schemafile
|
61
|
+
@@ -1,6 +1,7 @@
|
62
|
+
create_table "articles", force: true do |t|
|
63
|
+
t.string "title"
|
64
|
+
t.text "text"
|
65
|
+
+ t.text "author"
|
66
|
+
t.datetime "created_at"
|
67
|
+
t.datetime "updated_at"
|
68
|
+
end
|
69
|
+
|
70
|
+
$ ridgepole -c config.yml --apply --dry-run
|
71
|
+
Apply `Schemafile` (dry-run)
|
72
|
+
add_column("articles", "author", :text, {:after=>"text"})
|
73
|
+
|
74
|
+
$ ridgepole -c config.yml --apply
|
75
|
+
Apply `Schemafile`
|
76
|
+
-- add_column("articles", "author", :text, {:after=>"text"})
|
77
|
+
-> 0.0202s
|
78
|
+
```
|
79
|
+
|
80
|
+
## Diff
|
81
|
+
```sh
|
82
|
+
$ ridgepole --diff file1.schema file2.schema
|
83
|
+
add_column("articles", "author", :text, {:after=>"title"})
|
84
|
+
rename_column("articles", "text", "desc")
|
85
|
+
|
86
|
+
# You can apply to the database the difference:
|
87
|
+
# $ ridgepole -c config.yml --diff file1.schema file2.schema --with-apply
|
88
|
+
```
|
89
|
+
|
90
|
+
You can also compare databases and files.
|
91
|
+
|
92
|
+
```sh
|
93
|
+
$ ridgepole --diff config.yml file1.schema
|
94
|
+
remove_column("articles", "author")
|
95
|
+
```
|
96
|
+
|
97
|
+
### Reverse diff
|
98
|
+
```sh
|
99
|
+
$ cat file1.schema
|
100
|
+
create_table "articles", force: true do |t|
|
101
|
+
t.string "title"
|
102
|
+
t.text "text"
|
103
|
+
t.datetime "created_at"
|
104
|
+
t.datetime "updated_at"
|
105
|
+
end
|
106
|
+
|
107
|
+
$ cat file2.schema
|
108
|
+
create_table "articles", force: true do |t|
|
109
|
+
t.string "title"
|
110
|
+
t.text "desc", rename_from: "text"
|
111
|
+
t.text "author"
|
112
|
+
t.datetime "created_at"
|
113
|
+
t.datetime "updated_at"
|
114
|
+
end
|
115
|
+
|
116
|
+
$ ridgepole --diff file1.schema file2.schema
|
117
|
+
add_column("articles", "author", :text, {:after=>"title"})
|
118
|
+
rename_column("articles", "text", "desc")
|
119
|
+
|
120
|
+
$ ridgepole --diff file1.schema file2.schema --reverse
|
121
|
+
rename_column("articles", "desc", "text")
|
122
|
+
remove_column("articles", "author")
|
32
123
|
```
|
33
124
|
|
34
125
|
## Demo
|
data/bin/ridgepole
CHANGED
@@ -17,6 +17,9 @@ mode = nil
|
|
17
17
|
file = DEFAULT_FILENAME
|
18
18
|
output_file = '-'
|
19
19
|
split = false
|
20
|
+
diff_files = nil
|
21
|
+
diff_with_apply = false
|
22
|
+
exit_code = 0
|
20
23
|
|
21
24
|
options = {
|
22
25
|
:dry_run => false,
|
@@ -38,6 +41,20 @@ ARGV.options do |opt|
|
|
38
41
|
opt.on('-e', '--export') { set_mode[:export] }
|
39
42
|
opt.on('', '--split') {|v| split = true }
|
40
43
|
opt.on('', '--split-with-dir') {|v| split = :with_dir }
|
44
|
+
opt.on('-d', '--diff DSL1 DSL2') {|diff_arg1|
|
45
|
+
set_mode[:diff]
|
46
|
+
diff_arg2 = ARGV.first
|
47
|
+
|
48
|
+
if [diff_arg1, diff_arg2].any? {|i| i.nil? or i =~ /\A-/ }
|
49
|
+
puts opt.help
|
50
|
+
exit 1
|
51
|
+
end
|
52
|
+
|
53
|
+
ARGV.shift
|
54
|
+
diff_files = [diff_arg1, diff_arg2]
|
55
|
+
}
|
56
|
+
opt.on('', '--reverse') { options[:reverse] = true }
|
57
|
+
opt.on('', '--with-apply') { diff_with_apply = true }
|
41
58
|
opt.on('-o', '--output FILE') {|v| output_file = v }
|
42
59
|
opt.on('-t', '--tables TABLES', Array) {|v| options[:tables] = v }
|
43
60
|
opt.on('', '--ignore-tables TABLES', Array) {|v| options[:ignore_tables] = v.map {|i| Regexp.new(i) } }
|
@@ -47,7 +64,7 @@ ARGV.options do |opt|
|
|
47
64
|
opt.on('' , '--debug') { options[:debug] = true }
|
48
65
|
opt.parse!
|
49
66
|
|
50
|
-
|
67
|
+
if not mode or ([:apply, :export].include?(mode) and not config) or (options[:with_apply] and not config)
|
51
68
|
puts opt.help
|
52
69
|
exit 1
|
53
70
|
end
|
@@ -61,9 +78,11 @@ begin
|
|
61
78
|
logger = Ridgepole::Logger.instance
|
62
79
|
logger.set_debug(options[:debug])
|
63
80
|
|
64
|
-
|
65
|
-
|
66
|
-
|
81
|
+
if config
|
82
|
+
config = File.read(config) if File.exist?(config)
|
83
|
+
config = YAML.load(config)
|
84
|
+
client = Ridgepole::Client.new(config, options)
|
85
|
+
end
|
67
86
|
|
68
87
|
case mode
|
69
88
|
when :export
|
@@ -115,7 +134,7 @@ begin
|
|
115
134
|
msg << ' (dry-run)' if options[:dry_run]
|
116
135
|
logger.info(msg)
|
117
136
|
|
118
|
-
dsl =
|
137
|
+
dsl = File.read(file)
|
119
138
|
delta = client.diff(dsl, :path => file)
|
120
139
|
|
121
140
|
if options[:dry_run]
|
@@ -128,6 +147,30 @@ begin
|
|
128
147
|
unless delta.differ?
|
129
148
|
logger.info('No change')
|
130
149
|
end
|
150
|
+
when :diff
|
151
|
+
diff_files = diff_files.map do |file|
|
152
|
+
if File.exist?(file)
|
153
|
+
file_ext = File.extname(file)
|
154
|
+
%w(.yml .yaml).include?(file_ext) ? YAML.load_file(file) : File.read(file)
|
155
|
+
else
|
156
|
+
YAML.load(file)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
delta = Ridgepole::Client.diff(*diff_files, options)
|
161
|
+
|
162
|
+
if diff_with_apply
|
163
|
+
logger.verbose_info('# Update schema')
|
164
|
+
|
165
|
+
if delta.differ?
|
166
|
+
delta.migrate
|
167
|
+
else
|
168
|
+
logger.info('No change')
|
169
|
+
end
|
170
|
+
elsif delta.differ?
|
171
|
+
puts delta.script
|
172
|
+
exit_code = 1
|
173
|
+
end
|
131
174
|
end
|
132
175
|
rescue => e
|
133
176
|
if options[:debug]
|
@@ -137,3 +180,5 @@ rescue => e
|
|
137
180
|
exit 1
|
138
181
|
end
|
139
182
|
end
|
183
|
+
|
184
|
+
exit exit_code
|
data/lib/ridgepole/client.rb
CHANGED
@@ -28,4 +28,32 @@ class Ridgepole::Client
|
|
28
28
|
logger.verbose_info('# Compare definitions')
|
29
29
|
@diff.diff(current_definition, expected_definition)
|
30
30
|
end
|
31
|
+
|
32
|
+
class << self
|
33
|
+
def diff(dsl_or_config1, dsl_or_config2, options = {})
|
34
|
+
logger = Ridgepole::Logger.instance
|
35
|
+
|
36
|
+
logger.verbose_info('# Parse DSL1')
|
37
|
+
definition1 = load_definition(dsl_or_config1)
|
38
|
+
logger.verbose_info('# Parse DSL2')
|
39
|
+
definition2 = load_definition(dsl_or_config2)
|
40
|
+
|
41
|
+
logger.verbose_info('# Compare definitions')
|
42
|
+
diff = Ridgepole::Diff.new(options)
|
43
|
+
diff.diff(definition1, definition2)
|
44
|
+
end
|
45
|
+
|
46
|
+
def dump(conn_spec, options = {}, &block)
|
47
|
+
client = self.new(conn_spec, options)
|
48
|
+
client.dump(&block)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def load_definition(dsl_or_config, options = {})
|
54
|
+
dsl_or_config = dump(dsl_or_config, options) if dsl_or_config.kind_of?(Hash)
|
55
|
+
parser = Ridgepole::DSLParser.new(options)
|
56
|
+
parser.parse(dsl_or_config)
|
57
|
+
end
|
58
|
+
end # of class methods
|
31
59
|
end
|
data/lib/ridgepole/diff.rb
CHANGED
@@ -6,6 +6,11 @@ class Ridgepole::Diff
|
|
6
6
|
def diff(from, to)
|
7
7
|
from = (from || {}).dup
|
8
8
|
to = (to || {}).dup
|
9
|
+
|
10
|
+
if @options[:reverse]
|
11
|
+
from, to = to, from
|
12
|
+
end
|
13
|
+
|
9
14
|
delta = {}
|
10
15
|
|
11
16
|
to.dup.each do |table_name, to_attrs|
|
@@ -23,6 +28,24 @@ class Ridgepole::Diff
|
|
23
28
|
end
|
24
29
|
end
|
25
30
|
|
31
|
+
|
32
|
+
# for reverse option
|
33
|
+
from.dup.each do |table_name, from_attrs|
|
34
|
+
if (to_table_name = (from_attrs[:options] || {}).delete(:rename_from))
|
35
|
+
unless to.has_key?(to_table_name)
|
36
|
+
raise "Table `#{from_table_name}` not found"
|
37
|
+
end
|
38
|
+
|
39
|
+
# XXX: Correct?
|
40
|
+
next unless target?(to_table_name)
|
41
|
+
|
42
|
+
delta[:rename] ||= {}
|
43
|
+
delta[:rename][to_table_name] = table_name
|
44
|
+
from.delete(table_name)
|
45
|
+
to.delete(to_table_name)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
26
49
|
to.each do |table_name, to_attrs|
|
27
50
|
next unless target?(table_name)
|
28
51
|
|
@@ -87,6 +110,20 @@ class Ridgepole::Diff
|
|
87
110
|
end
|
88
111
|
end
|
89
112
|
|
113
|
+
# for reverse option
|
114
|
+
from.dup.each do |column_name, from_attrs|
|
115
|
+
if (to_column_name = (from_attrs[:options] || {}).delete(:rename_from))
|
116
|
+
unless to.has_key?(to_column_name)
|
117
|
+
raise "Column `#{to_column_name}` not found"
|
118
|
+
end
|
119
|
+
|
120
|
+
definition_delta[:rename] ||= {}
|
121
|
+
definition_delta[:rename][to_column_name] = column_name
|
122
|
+
from.delete(column_name)
|
123
|
+
to.delete(to_column_name)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
90
127
|
priv_column_name = nil
|
91
128
|
|
92
129
|
to.each do |column_name, to_attrs|
|
data/lib/ridgepole/version.rb
CHANGED
File without changes
|
@@ -0,0 +1,154 @@
|
|
1
|
+
describe 'Ridgepole::Client.diff' do
|
2
|
+
context 'when change column' do
|
3
|
+
let(:actual_dsl) {
|
4
|
+
<<-RUBY
|
5
|
+
create_table "clubs", force: true do |t|
|
6
|
+
t.string "name", default: "", null: false
|
7
|
+
end
|
8
|
+
|
9
|
+
add_index "clubs", ["name"], name: "idx_name", unique: true, using: :btree
|
10
|
+
|
11
|
+
create_table "departments", primary_key: "dept_no", force: true do |t|
|
12
|
+
t.string "dept_name", limit: 40, null: false
|
13
|
+
end
|
14
|
+
|
15
|
+
add_index "departments", ["dept_name"], name: "dept_name", unique: true, using: :btree
|
16
|
+
|
17
|
+
create_table "dept_emp", id: false, force: true do |t|
|
18
|
+
t.integer "emp_no", null: false
|
19
|
+
t.string "dept_no", limit: 4, null: false
|
20
|
+
t.date "from_date", null: false
|
21
|
+
t.date "to_date", null: false
|
22
|
+
end
|
23
|
+
|
24
|
+
add_index "dept_emp", ["dept_no"], name: "dept_no", using: :btree
|
25
|
+
add_index "dept_emp", ["emp_no"], name: "emp_no", using: :btree
|
26
|
+
|
27
|
+
create_table "dept_manager", id: false, force: true do |t|
|
28
|
+
t.string "dept_no", limit: 4, null: false
|
29
|
+
t.integer "emp_no", null: false
|
30
|
+
t.date "from_date", null: false
|
31
|
+
t.date "to_date", null: false
|
32
|
+
end
|
33
|
+
|
34
|
+
add_index "dept_manager", ["dept_no"], name: "dept_no", using: :btree
|
35
|
+
add_index "dept_manager", ["emp_no"], name: "emp_no", using: :btree
|
36
|
+
|
37
|
+
create_table "employee_clubs", force: true do |t|
|
38
|
+
t.integer "emp_no", unsigned: true, null: false
|
39
|
+
t.integer "club_id", unsigned: true, null: false
|
40
|
+
end
|
41
|
+
|
42
|
+
add_index "employee_clubs", ["emp_no", "club_id"], name: "idx_emp_no_club_id", using: :btree
|
43
|
+
|
44
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
45
|
+
t.date "birth_date", null: false
|
46
|
+
t.string "first_name", limit: 14, null: false
|
47
|
+
t.string "last_name", limit: 16, null: false
|
48
|
+
t.string "gender", limit: 1, null: false
|
49
|
+
t.date "hire_date", null: false
|
50
|
+
end
|
51
|
+
|
52
|
+
create_table "salaries", id: false, force: true do |t|
|
53
|
+
t.integer "emp_no", null: false
|
54
|
+
t.integer "salary", null: false
|
55
|
+
t.date "from_date", null: false
|
56
|
+
t.date "to_date", null: false
|
57
|
+
end
|
58
|
+
|
59
|
+
add_index "salaries", ["emp_no"], name: "emp_no", using: :btree
|
60
|
+
|
61
|
+
create_table "titles", id: false, force: true do |t|
|
62
|
+
t.integer "emp_no", null: false
|
63
|
+
t.string "title", limit: 50, null: false
|
64
|
+
t.date "from_date", null: false
|
65
|
+
t.date "to_date"
|
66
|
+
end
|
67
|
+
|
68
|
+
add_index "titles", ["emp_no"], name: "emp_no", using: :btree
|
69
|
+
RUBY
|
70
|
+
}
|
71
|
+
|
72
|
+
let(:expected_dsl) {
|
73
|
+
<<-RUBY
|
74
|
+
create_table "clubs", force: true do |t|
|
75
|
+
t.string "name", default: "", null: false
|
76
|
+
end
|
77
|
+
|
78
|
+
add_index "clubs", ["name"], name: "idx_name", unique: true, using: :btree
|
79
|
+
|
80
|
+
create_table "departments", primary_key: "dept_no", force: true do |t|
|
81
|
+
t.string "dept_name", limit: 40, null: false
|
82
|
+
end
|
83
|
+
|
84
|
+
add_index "departments", ["dept_name"], name: "dept_name", unique: true, using: :btree
|
85
|
+
|
86
|
+
create_table "dept_emp", id: false, force: true do |t|
|
87
|
+
t.integer "emp_no", null: false
|
88
|
+
t.string "dept_no", limit: 4, null: false
|
89
|
+
t.date "from_date", null: false
|
90
|
+
t.date "to_date", null: false
|
91
|
+
end
|
92
|
+
|
93
|
+
add_index "dept_emp", ["dept_no"], name: "dept_no", using: :btree
|
94
|
+
add_index "dept_emp", ["emp_no"], name: "emp_no", using: :btree
|
95
|
+
|
96
|
+
create_table "dept_manager", id: false, force: true do |t|
|
97
|
+
t.string "dept_no", limit: 4, null: false
|
98
|
+
t.integer "emp_no", null: false
|
99
|
+
t.date "from_date", null: false
|
100
|
+
t.date "to_date", null: false
|
101
|
+
end
|
102
|
+
|
103
|
+
add_index "dept_manager", ["dept_no"], name: "dept_no", using: :btree
|
104
|
+
add_index "dept_manager", ["emp_no"], name: "emp_no", using: :btree
|
105
|
+
|
106
|
+
create_table "employee_clubs", force: true do |t|
|
107
|
+
t.integer "emp_no", unsigned: true, null: false
|
108
|
+
t.integer "club_id", unsigned: false, null: true
|
109
|
+
end
|
110
|
+
|
111
|
+
add_index "employee_clubs", ["emp_no", "club_id"], name: "idx_emp_no_club_id", using: :btree
|
112
|
+
|
113
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
114
|
+
t.date "birth_date", null: false
|
115
|
+
t.string "first_name", limit: 14, null: false
|
116
|
+
t.string "last_name", limit: 20, default: "XXX", null: false
|
117
|
+
t.string "gender", limit: 2, null: false
|
118
|
+
t.date "hire_date", null: false
|
119
|
+
end
|
120
|
+
|
121
|
+
create_table "salaries", id: false, force: true do |t|
|
122
|
+
t.integer "emp_no", null: false
|
123
|
+
t.integer "salary", null: false
|
124
|
+
t.date "from_date", null: false
|
125
|
+
t.date "to_date", null: false
|
126
|
+
end
|
127
|
+
|
128
|
+
add_index "salaries", ["emp_no"], name: "emp_no", using: :btree
|
129
|
+
|
130
|
+
create_table "titles", id: false, force: true do |t|
|
131
|
+
t.integer "emp_no", null: false
|
132
|
+
t.string "title", limit: 50, null: false
|
133
|
+
t.date "from_date", null: false
|
134
|
+
t.date "to_date"
|
135
|
+
end
|
136
|
+
|
137
|
+
add_index "titles", ["emp_no"], name: "emp_no", using: :btree
|
138
|
+
RUBY
|
139
|
+
}
|
140
|
+
|
141
|
+
subject { Ridgepole::Client }
|
142
|
+
|
143
|
+
it {
|
144
|
+
delta = subject.diff(actual_dsl, expected_dsl)
|
145
|
+
expect(delta.differ?).to be_true
|
146
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
147
|
+
change_column("employee_clubs", "club_id", :integer, {:unsigned=>false, :null=>true})
|
148
|
+
|
149
|
+
change_column("employees", "last_name", :string, {:limit=>20, :default=>"XXX", :null=>false, :unsigned=>false})
|
150
|
+
change_column("employees", "gender", :string, {:limit=>2, :null=>false, :unsigned=>false})
|
151
|
+
RUBY
|
152
|
+
}
|
153
|
+
end
|
154
|
+
end
|
@@ -1,7 +1,10 @@
|
|
1
|
-
describe 'Ridgepole::Client
|
2
|
-
context 'when
|
3
|
-
|
4
|
-
|
1
|
+
describe 'Ridgepole::Client.dump' do
|
2
|
+
context 'when there is a tables' do
|
3
|
+
before { restore_tables }
|
4
|
+
subject { Ridgepole::Client }
|
5
|
+
|
6
|
+
it {
|
7
|
+
expect(subject.dump(conn_spec)).to eq (<<-RUBY).undent.strip
|
5
8
|
create_table "clubs", force: true do |t|
|
6
9
|
t.string "name", default: "", null: false
|
7
10
|
end
|
@@ -68,24 +71,5 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
68
71
|
add_index "titles", ["emp_no"], name: "emp_no", using: :btree
|
69
72
|
RUBY
|
70
73
|
}
|
71
|
-
|
72
|
-
let(:actual_dsl) { dsl }
|
73
|
-
|
74
|
-
let(:expected_dsl) {
|
75
|
-
dsl.delete_create_table('clubs')
|
76
|
-
.delete_create_table('employee_clubs')
|
77
|
-
.delete_create_table('employees')
|
78
|
-
}
|
79
|
-
|
80
|
-
before { subject.diff(actual_dsl).migrate }
|
81
|
-
subject { client }
|
82
|
-
|
83
|
-
it {
|
84
|
-
delta = subject.diff(expected_dsl)
|
85
|
-
expect(delta.differ?).to be_true
|
86
|
-
expect(subject.dump).to eq actual_dsl.undent.strip
|
87
|
-
delta.migrate
|
88
|
-
expect(subject.dump).to eq expected_dsl.undent.strip
|
89
|
-
}
|
90
74
|
end
|
91
75
|
end
|
@@ -151,5 +151,16 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
151
151
|
delta.migrate
|
152
152
|
expect(subject.dump).to eq expected_dsl.undent.strip
|
153
153
|
}
|
154
|
+
|
155
|
+
it {
|
156
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
157
|
+
expect(delta.differ?).to be_true
|
158
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
159
|
+
remove_column("employee_clubs", "any_col")
|
160
|
+
|
161
|
+
remove_column("employees", "age")
|
162
|
+
remove_column("employees", "updated_at")
|
163
|
+
RUBY
|
164
|
+
}
|
154
165
|
end
|
155
166
|
end
|
@@ -148,5 +148,16 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
148
148
|
delta.migrate
|
149
149
|
expect(subject.dump).to eq expected_dsl.undent.strip.gsub(/(\s*,\s*unsigned: false)?\s*,\s*null: true/, '')
|
150
150
|
}
|
151
|
+
|
152
|
+
it {
|
153
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
154
|
+
expect(delta.differ?).to be_true
|
155
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
156
|
+
change_column("employee_clubs", "club_id", :integer, {:unsigned=>true, :null=>false})
|
157
|
+
|
158
|
+
change_column("employees", "last_name", :string, {:limit=>16, :null=>false, :unsigned=>false})
|
159
|
+
change_column("employees", "gender", :string, {:limit=>1, :null=>false, :unsigned=>false})
|
160
|
+
RUBY
|
161
|
+
}
|
151
162
|
end
|
152
163
|
end
|
@@ -36,5 +36,11 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
36
36
|
delta.migrate
|
37
37
|
expect(subject.dump).to eq actual_dsl.undent.strip
|
38
38
|
}
|
39
|
+
|
40
|
+
it {
|
41
|
+
expect(Ridgepole::Logger.instance).to receive(:warn).with('[WARNING] Table `employees` options cannot be changed')
|
42
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
43
|
+
expect(delta.differ?).to be_false
|
44
|
+
}
|
39
45
|
end
|
40
46
|
end
|
@@ -87,5 +87,17 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
87
87
|
delta.migrate
|
88
88
|
expect(subject.dump.delete_empty_lines).to eq expected_dsl.undent.strip.delete_empty_lines
|
89
89
|
}
|
90
|
+
|
91
|
+
it {
|
92
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
93
|
+
expect(delta.differ?).to be_true
|
94
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
95
|
+
remove_index("clubs", {:name=>"idx_name"})
|
96
|
+
|
97
|
+
remove_index("employee_clubs", {:name=>"idx_emp_no_club_id"})
|
98
|
+
|
99
|
+
remove_index("titles", {:name=>"emp_no"})
|
100
|
+
RUBY
|
101
|
+
}
|
90
102
|
end
|
91
103
|
end
|
@@ -87,5 +87,17 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
87
87
|
delta.migrate
|
88
88
|
expect(subject.dump.delete_empty_lines).to eq expected_dsl.undent.strip.delete_empty_lines
|
89
89
|
}
|
90
|
+
|
91
|
+
it {
|
92
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
93
|
+
expect(delta.differ?).to be_true
|
94
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
95
|
+
drop_table("clubs")
|
96
|
+
|
97
|
+
drop_table("employee_clubs")
|
98
|
+
|
99
|
+
drop_table("employees")
|
100
|
+
RUBY
|
101
|
+
}
|
90
102
|
end
|
91
103
|
end
|
@@ -141,5 +141,21 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
141
141
|
delta.migrate
|
142
142
|
expect(subject.dump).to eq expected_dsl.undent.strip
|
143
143
|
}
|
144
|
+
|
145
|
+
it {
|
146
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
147
|
+
expect(delta.differ?).to be_true
|
148
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
149
|
+
add_column("dept_emp", "from_date", :date, {:null=>false, :after=>"dept_no"})
|
150
|
+
add_column("dept_emp", "to_date", :date, {:null=>false, :after=>"from_date"})
|
151
|
+
|
152
|
+
add_column("dept_manager", "from_date", :date, {:null=>false, :after=>"emp_no"})
|
153
|
+
add_column("dept_manager", "to_date", :date, {:null=>false, :after=>"from_date"})
|
154
|
+
|
155
|
+
add_column("employees", "last_name", :string, {:limit=>16, :null=>false, :after=>"first_name"})
|
156
|
+
add_column("employees", "gender", :string, {:limit=>1, :null=>false, :after=>"last_name"})
|
157
|
+
add_column("employees", "hire_date", :date, {:null=>false, :after=>"gender"})
|
158
|
+
RUBY
|
159
|
+
}
|
144
160
|
end
|
145
161
|
end
|
@@ -85,7 +85,19 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
85
85
|
expect(delta.differ?).to be_true
|
86
86
|
expect(subject.dump).to eq actual_dsl.undent.strip
|
87
87
|
delta.migrate
|
88
|
-
expect(subject.dump).to eq expected_dsl.undent.strip
|
88
|
+
expect(subject.dump.each_line.select {|i| i !~ /\A\Z/ }.join).to eq expected_dsl.undent.strip.each_line.select {|i| i !~ /\A\Z/ }.join
|
89
|
+
}
|
90
|
+
|
91
|
+
it {
|
92
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
93
|
+
expect(delta.differ?).to be_true
|
94
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
95
|
+
add_index("clubs", ["name"], {:name=>"idx_name", :unique=>true, :using=>:btree})
|
96
|
+
|
97
|
+
add_index("employee_clubs", ["emp_no", "club_id"], {:name=>"idx_emp_no_club_id", :using=>:btree})
|
98
|
+
|
99
|
+
add_index("titles", ["emp_no"], {:name=>"emp_no", :using=>:btree})
|
100
|
+
RUBY
|
89
101
|
}
|
90
102
|
end
|
91
103
|
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
describe 'Ridgepole::Client#diff -> migrate' do
|
2
|
+
context 'when drop table' do
|
3
|
+
let(:dsl) {
|
4
|
+
<<-RUBY
|
5
|
+
create_table "clubs", force: true do |t|
|
6
|
+
t.string "name", default: "", null: false
|
7
|
+
end
|
8
|
+
|
9
|
+
add_index "clubs", ["name"], name: "idx_name", unique: true, using: :btree
|
10
|
+
|
11
|
+
create_table "departments", primary_key: "dept_no", force: true do |t|
|
12
|
+
t.string "dept_name", limit: 40, null: false
|
13
|
+
end
|
14
|
+
|
15
|
+
add_index "departments", ["dept_name"], name: "dept_name", unique: true, using: :btree
|
16
|
+
|
17
|
+
create_table "dept_emp", id: false, force: true do |t|
|
18
|
+
t.integer "emp_no", null: false
|
19
|
+
t.string "dept_no", limit: 4, null: false
|
20
|
+
t.date "from_date", null: false
|
21
|
+
t.date "to_date", null: false
|
22
|
+
end
|
23
|
+
|
24
|
+
add_index "dept_emp", ["dept_no"], name: "dept_no", using: :btree
|
25
|
+
add_index "dept_emp", ["emp_no"], name: "emp_no", using: :btree
|
26
|
+
|
27
|
+
create_table "dept_manager", id: false, force: true do |t|
|
28
|
+
t.string "dept_no", limit: 4, null: false
|
29
|
+
t.integer "emp_no", null: false
|
30
|
+
t.date "from_date", null: false
|
31
|
+
t.date "to_date", null: false
|
32
|
+
end
|
33
|
+
|
34
|
+
add_index "dept_manager", ["dept_no"], name: "dept_no", using: :btree
|
35
|
+
add_index "dept_manager", ["emp_no"], name: "emp_no", using: :btree
|
36
|
+
|
37
|
+
create_table "employee_clubs", force: true do |t|
|
38
|
+
t.integer "emp_no", unsigned: true, null: false
|
39
|
+
t.integer "club_id", unsigned: true, null: false
|
40
|
+
end
|
41
|
+
|
42
|
+
add_index "employee_clubs", ["emp_no", "club_id"], name: "idx_emp_no_club_id", using: :btree
|
43
|
+
|
44
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
45
|
+
t.date "birth_date", null: false
|
46
|
+
t.string "first_name", limit: 14, null: false
|
47
|
+
t.string "last_name", limit: 16, null: false
|
48
|
+
t.string "gender", limit: 1, null: false
|
49
|
+
t.date "hire_date", null: false
|
50
|
+
end
|
51
|
+
|
52
|
+
create_table "salaries", id: false, force: true do |t|
|
53
|
+
t.integer "emp_no", null: false
|
54
|
+
t.integer "salary", null: false
|
55
|
+
t.date "from_date", null: false
|
56
|
+
t.date "to_date", null: false
|
57
|
+
end
|
58
|
+
|
59
|
+
add_index "salaries", ["emp_no"], name: "emp_no", using: :btree
|
60
|
+
|
61
|
+
create_table "titles", id: false, force: true do |t|
|
62
|
+
t.integer "emp_no", null: false
|
63
|
+
t.string "title", limit: 50, null: false
|
64
|
+
t.date "from_date", null: false
|
65
|
+
t.date "to_date"
|
66
|
+
end
|
67
|
+
|
68
|
+
add_index "titles", ["emp_no"], name: "emp_no", using: :btree
|
69
|
+
RUBY
|
70
|
+
}
|
71
|
+
|
72
|
+
let(:actual_dsl) { dsl }
|
73
|
+
|
74
|
+
let(:expected_dsl) {
|
75
|
+
dsl.delete_create_table('clubs')
|
76
|
+
.delete_create_table('employee_clubs')
|
77
|
+
.delete_create_table('employees')
|
78
|
+
}
|
79
|
+
|
80
|
+
before { subject.diff(actual_dsl).migrate }
|
81
|
+
subject { client }
|
82
|
+
|
83
|
+
it {
|
84
|
+
delta = subject.diff(expected_dsl)
|
85
|
+
expect(delta.differ?).to be_true
|
86
|
+
expect(subject.dump).to eq actual_dsl.undent.strip
|
87
|
+
delta.migrate
|
88
|
+
expect(subject.dump.each_line.select {|i| i !~ /\A\Z/ }.join).to eq expected_dsl.undent.strip.each_line.select {|i| i !~ /\A\Z/ }.join
|
89
|
+
}
|
90
|
+
|
91
|
+
it {
|
92
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
93
|
+
expect(delta.differ?).to be_true
|
94
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
95
|
+
create_table("clubs", {}) do |t|
|
96
|
+
t.string("name", {:default=>"", :null=>false})
|
97
|
+
end
|
98
|
+
add_index("clubs", ["name"], {:name=>"idx_name", :unique=>true, :using=>:btree})
|
99
|
+
|
100
|
+
create_table("employee_clubs", {}) do |t|
|
101
|
+
t.integer("emp_no", {:unsigned=>true, :null=>false})
|
102
|
+
t.integer("club_id", {:unsigned=>true, :null=>false})
|
103
|
+
end
|
104
|
+
add_index("employee_clubs", ["emp_no", "club_id"], {:name=>"idx_emp_no_club_id", :using=>:btree})
|
105
|
+
|
106
|
+
create_table("employees", {:primary_key=>"emp_no"}) do |t|
|
107
|
+
t.date("birth_date", {:null=>false})
|
108
|
+
t.string("first_name", {:limit=>14, :null=>false})
|
109
|
+
t.string("last_name", {:limit=>16, :null=>false})
|
110
|
+
t.string("gender", {:limit=>1, :null=>false})
|
111
|
+
t.date("hire_date", {:null=>false})
|
112
|
+
end
|
113
|
+
RUBY
|
114
|
+
}
|
115
|
+
end
|
116
|
+
end
|
@@ -79,5 +79,27 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
79
79
|
delta.migrate
|
80
80
|
expect(subject.dump).to eq expected_dsl.undent.strip
|
81
81
|
}
|
82
|
+
|
83
|
+
it {
|
84
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
85
|
+
expect(delta.differ?).to be_true
|
86
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
87
|
+
drop_table("clubs")
|
88
|
+
|
89
|
+
drop_table("departments")
|
90
|
+
|
91
|
+
drop_table("dept_emp")
|
92
|
+
|
93
|
+
drop_table("dept_manager")
|
94
|
+
|
95
|
+
drop_table("employee_clubs")
|
96
|
+
|
97
|
+
drop_table("employees")
|
98
|
+
|
99
|
+
drop_table("salaries")
|
100
|
+
|
101
|
+
drop_table("titles")
|
102
|
+
RUBY
|
103
|
+
}
|
82
104
|
end
|
83
105
|
end
|
@@ -153,5 +153,10 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
153
153
|
# `clubs` table is not deleted
|
154
154
|
expect(subject.dump).to eq expected_dsl.undent.strip
|
155
155
|
}
|
156
|
+
|
157
|
+
it {
|
158
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, merge: true, reverse: true)
|
159
|
+
expect(delta.differ?).to be_false
|
160
|
+
}
|
156
161
|
end
|
157
162
|
end
|
@@ -148,6 +148,18 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
148
148
|
delta.migrate
|
149
149
|
expect(subject.dump).to eq expected_dsl.undent.strip.gsub(/\s*,\s*rename_from:.*$/, '')
|
150
150
|
}
|
151
|
+
|
152
|
+
it {
|
153
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
154
|
+
expect(delta.differ?).to be_true
|
155
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
156
|
+
rename_column("dept_emp", "from_date2", "from_date")
|
157
|
+
|
158
|
+
rename_column("dept_manager", "to_date2", "to_date")
|
159
|
+
|
160
|
+
rename_column("employees", "gender2", "gender")
|
161
|
+
RUBY
|
162
|
+
}
|
151
163
|
end
|
152
164
|
|
153
165
|
context 'when rename column (not found)' do
|
@@ -148,6 +148,14 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
148
148
|
delta.migrate
|
149
149
|
expect(subject.dump).to eq expected_dsl.undent.strip.gsub(/, rename_from: 'employees'/, '')
|
150
150
|
}
|
151
|
+
|
152
|
+
it {
|
153
|
+
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
|
154
|
+
expect(delta.differ?).to be_true
|
155
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
156
|
+
rename_table("employees2", "employees")
|
157
|
+
RUBY
|
158
|
+
}
|
151
159
|
end
|
152
160
|
|
153
161
|
context 'when rename table (not found)' do
|
@@ -0,0 +1,155 @@
|
|
1
|
+
describe 'Ridgepole::Client#diff -> migrate' do
|
2
|
+
context 'when with ignore tables option (same)' do
|
3
|
+
let(:current_schema) {
|
4
|
+
<<-RUBY
|
5
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
6
|
+
t.date "birth_date", null: false
|
7
|
+
t.string "first_name", limit: 14, null: false
|
8
|
+
t.string "last_name", limit: 16, null: false
|
9
|
+
t.string "gender", limit: 1, null: false
|
10
|
+
t.date "hire_date", null: false
|
11
|
+
end
|
12
|
+
|
13
|
+
create_table "salaries", id: false, force: true do |t|
|
14
|
+
t.integer "emp_no", null: false
|
15
|
+
t.integer "salary", null: false
|
16
|
+
t.date "from_date", null: false
|
17
|
+
t.date "to_date", null: false
|
18
|
+
end
|
19
|
+
|
20
|
+
add_index "salaries", ["salary"], name: "emp_no", using: :btree
|
21
|
+
RUBY
|
22
|
+
}
|
23
|
+
|
24
|
+
let(:dsl) {
|
25
|
+
<<-RUBY
|
26
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
27
|
+
t.date "birth_date", null: false
|
28
|
+
t.string "first_name", limit: 14, null: false
|
29
|
+
t.string "last_name", limit: 16, null: false
|
30
|
+
t.string "gender", limit: 1, null: false
|
31
|
+
t.date "hire_date", null: false
|
32
|
+
end
|
33
|
+
|
34
|
+
create_table "salaries", id: false, force: true do |t|
|
35
|
+
t.integer "emp_no", null: false
|
36
|
+
t.integer "salary", null: false
|
37
|
+
t.date "from_date", null: false
|
38
|
+
t.date "to_date", null: false
|
39
|
+
end
|
40
|
+
|
41
|
+
add_index "salaries", ["emp_no"], name: "emp_no", using: :btree
|
42
|
+
RUBY
|
43
|
+
}
|
44
|
+
|
45
|
+
let(:expected_dsl) {
|
46
|
+
<<-RUBY
|
47
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
48
|
+
t.date "birth_date", null: false
|
49
|
+
t.string "first_name", limit: 14, null: false
|
50
|
+
t.string "last_name", limit: 16, null: false
|
51
|
+
t.string "gender", limit: 1, null: false
|
52
|
+
t.date "hire_date", null: false
|
53
|
+
end
|
54
|
+
RUBY
|
55
|
+
}
|
56
|
+
|
57
|
+
before { subject.diff(current_schema).migrate }
|
58
|
+
subject { client(ignore_tables: [/^salaries$/] ) }
|
59
|
+
|
60
|
+
it {
|
61
|
+
delta = subject.diff(dsl)
|
62
|
+
expect(delta.differ?).to be_false
|
63
|
+
expect(subject.dump).to eq expected_dsl.undent.strip
|
64
|
+
delta.migrate
|
65
|
+
expect(subject.dump).to eq expected_dsl.undent.strip
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when with ignore tables option (differ)' do
|
70
|
+
let(:current_schema) {
|
71
|
+
<<-RUBY
|
72
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
73
|
+
t.date "birth_date", null: false
|
74
|
+
t.string "first_name", limit: 14, null: false
|
75
|
+
t.string "last_name", limit: 16, null: false
|
76
|
+
t.string "gender", limit: 1, null: false
|
77
|
+
t.date "hire_date", null: false
|
78
|
+
end
|
79
|
+
|
80
|
+
create_table "salaries", id: false, force: true do |t|
|
81
|
+
t.integer "emp_no", null: false
|
82
|
+
t.integer "salary", null: false
|
83
|
+
t.date "from_date", null: false
|
84
|
+
t.date "to_date", null: false
|
85
|
+
end
|
86
|
+
|
87
|
+
add_index "salaries", ["salary"], name: "emp_no", using: :btree
|
88
|
+
RUBY
|
89
|
+
}
|
90
|
+
|
91
|
+
let(:dsl) {
|
92
|
+
<<-RUBY
|
93
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
94
|
+
t.date "birth_date", null: false
|
95
|
+
t.string "first_name", limit: 15, null: false
|
96
|
+
t.string "last_name", limit: 16, null: false
|
97
|
+
t.string "gender", limit: 1, null: false
|
98
|
+
t.date "hire_date", null: false
|
99
|
+
end
|
100
|
+
|
101
|
+
create_table "salaries", id: false, force: true do |t|
|
102
|
+
t.integer "emp_no", null: false
|
103
|
+
t.integer "salary", null: false
|
104
|
+
t.date "from_date", null: false
|
105
|
+
t.date "to_date", null: false
|
106
|
+
end
|
107
|
+
|
108
|
+
add_index "salaries", ["emp_no"], name: "emp_no", using: :btree
|
109
|
+
RUBY
|
110
|
+
}
|
111
|
+
|
112
|
+
let(:before_dsl) {
|
113
|
+
<<-RUBY
|
114
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
115
|
+
t.date "birth_date", null: false
|
116
|
+
t.string "first_name", limit: 14, null: false
|
117
|
+
t.string "last_name", limit: 16, null: false
|
118
|
+
t.string "gender", limit: 1, null: false
|
119
|
+
t.date "hire_date", null: false
|
120
|
+
end
|
121
|
+
RUBY
|
122
|
+
}
|
123
|
+
|
124
|
+
let(:after_dsl) {
|
125
|
+
<<-RUBY
|
126
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
127
|
+
t.date "birth_date", null: false
|
128
|
+
t.string "first_name", limit: 15, null: false
|
129
|
+
t.string "last_name", limit: 16, null: false
|
130
|
+
t.string "gender", limit: 1, null: false
|
131
|
+
t.date "hire_date", null: false
|
132
|
+
end
|
133
|
+
RUBY
|
134
|
+
}
|
135
|
+
|
136
|
+
before { subject.diff(current_schema).migrate }
|
137
|
+
subject { client(ignore_tables: [/^salaries$/] ) }
|
138
|
+
|
139
|
+
it {
|
140
|
+
delta = subject.diff(dsl)
|
141
|
+
expect(delta.differ?).to be_true
|
142
|
+
expect(subject.dump).to eq before_dsl.undent.strip
|
143
|
+
delta.migrate
|
144
|
+
expect(subject.dump).to eq after_dsl.undent.strip
|
145
|
+
}
|
146
|
+
|
147
|
+
it {
|
148
|
+
delta = Ridgepole::Client.diff(current_schema, dsl, ignore_tables: [/^salaries$/], reverse: true)
|
149
|
+
expect(delta.differ?).to be_true
|
150
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
151
|
+
change_column("employees", "first_name", :string, {:limit=>14, :null=>false, :unsigned=>false})
|
152
|
+
RUBY
|
153
|
+
}
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
describe 'Ridgepole::Client#diff -> migrate' do
|
2
|
+
context 'when with tables option (same)' do
|
3
|
+
let(:current_schema) {
|
4
|
+
<<-RUBY
|
5
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
6
|
+
t.date "birth_date", null: false
|
7
|
+
t.string "first_name", limit: 14, null: false
|
8
|
+
t.string "last_name", limit: 16, null: false
|
9
|
+
t.string "gender", limit: 1, null: false
|
10
|
+
t.date "hire_date", null: false
|
11
|
+
end
|
12
|
+
|
13
|
+
create_table "salaries", id: false, force: true do |t|
|
14
|
+
t.integer "emp_no", null: false
|
15
|
+
t.integer "salary", null: false
|
16
|
+
t.date "from_date", null: false
|
17
|
+
t.date "to_date", null: false
|
18
|
+
end
|
19
|
+
|
20
|
+
add_index "salaries", ["salary"], name: "emp_no", using: :btree
|
21
|
+
RUBY
|
22
|
+
}
|
23
|
+
|
24
|
+
let(:dsl) {
|
25
|
+
<<-RUBY
|
26
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
27
|
+
t.date "birth_date", null: false
|
28
|
+
t.string "first_name", limit: 14, null: false
|
29
|
+
t.string "last_name", limit: 16, null: false
|
30
|
+
t.string "gender", limit: 1, null: false
|
31
|
+
t.date "hire_date", null: false
|
32
|
+
end
|
33
|
+
|
34
|
+
create_table "salaries", id: false, force: true do |t|
|
35
|
+
t.integer "emp_no", null: false
|
36
|
+
t.integer "salary", null: false
|
37
|
+
t.date "from_date", null: false
|
38
|
+
t.date "to_date", null: false
|
39
|
+
end
|
40
|
+
|
41
|
+
add_index "salaries", ["emp_no"], name: "emp_no", using: :btree
|
42
|
+
RUBY
|
43
|
+
}
|
44
|
+
|
45
|
+
let(:expected_dsl) {
|
46
|
+
<<-RUBY
|
47
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
48
|
+
t.date "birth_date", null: false
|
49
|
+
t.string "first_name", limit: 14, null: false
|
50
|
+
t.string "last_name", limit: 16, null: false
|
51
|
+
t.string "gender", limit: 1, null: false
|
52
|
+
t.date "hire_date", null: false
|
53
|
+
end
|
54
|
+
RUBY
|
55
|
+
}
|
56
|
+
|
57
|
+
before { subject.diff(current_schema).migrate }
|
58
|
+
subject { client(tables: ['employees'] ) }
|
59
|
+
|
60
|
+
it {
|
61
|
+
delta = subject.diff(dsl)
|
62
|
+
expect(delta.differ?).to be_false
|
63
|
+
expect(subject.dump).to eq expected_dsl.undent.strip
|
64
|
+
delta.migrate
|
65
|
+
expect(subject.dump).to eq expected_dsl.undent.strip
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when with tables option (differ)' do
|
70
|
+
let(:current_schema) {
|
71
|
+
<<-RUBY
|
72
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
73
|
+
t.date "birth_date", null: false
|
74
|
+
t.string "first_name", limit: 14, null: false
|
75
|
+
t.string "last_name", limit: 16, null: false
|
76
|
+
t.string "gender", limit: 1, null: false
|
77
|
+
t.date "hire_date", null: false
|
78
|
+
end
|
79
|
+
|
80
|
+
create_table "salaries", id: false, force: true do |t|
|
81
|
+
t.integer "emp_no", null: false
|
82
|
+
t.integer "salary", null: false
|
83
|
+
t.date "from_date", null: false
|
84
|
+
t.date "to_date", null: false
|
85
|
+
end
|
86
|
+
|
87
|
+
add_index "salaries", ["salary"], name: "emp_no", using: :btree
|
88
|
+
RUBY
|
89
|
+
}
|
90
|
+
|
91
|
+
let(:dsl) {
|
92
|
+
<<-RUBY
|
93
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
94
|
+
t.date "birth_date", null: false
|
95
|
+
t.string "first_name", limit: 15, null: false
|
96
|
+
t.string "last_name", limit: 16, null: false
|
97
|
+
t.string "gender", limit: 1, null: false
|
98
|
+
t.date "hire_date", null: false
|
99
|
+
end
|
100
|
+
|
101
|
+
create_table "salaries", id: false, force: true do |t|
|
102
|
+
t.integer "emp_no", null: false
|
103
|
+
t.integer "salary", null: false
|
104
|
+
t.date "from_date", null: false
|
105
|
+
t.date "to_date", null: false
|
106
|
+
end
|
107
|
+
|
108
|
+
add_index "salaries", ["emp_no"], name: "emp_no", using: :btree
|
109
|
+
RUBY
|
110
|
+
}
|
111
|
+
|
112
|
+
let(:before_dsl) {
|
113
|
+
<<-RUBY
|
114
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
115
|
+
t.date "birth_date", null: false
|
116
|
+
t.string "first_name", limit: 14, null: false
|
117
|
+
t.string "last_name", limit: 16, null: false
|
118
|
+
t.string "gender", limit: 1, null: false
|
119
|
+
t.date "hire_date", null: false
|
120
|
+
end
|
121
|
+
RUBY
|
122
|
+
}
|
123
|
+
|
124
|
+
let(:after_dsl) {
|
125
|
+
<<-RUBY
|
126
|
+
create_table "employees", primary_key: "emp_no", force: true do |t|
|
127
|
+
t.date "birth_date", null: false
|
128
|
+
t.string "first_name", limit: 15, null: false
|
129
|
+
t.string "last_name", limit: 16, null: false
|
130
|
+
t.string "gender", limit: 1, null: false
|
131
|
+
t.date "hire_date", null: false
|
132
|
+
end
|
133
|
+
RUBY
|
134
|
+
}
|
135
|
+
|
136
|
+
before { subject.diff(current_schema).migrate }
|
137
|
+
subject { client(tables: ['employees']) }
|
138
|
+
|
139
|
+
it {
|
140
|
+
delta = subject.diff(dsl)
|
141
|
+
expect(delta.differ?).to be_true
|
142
|
+
expect(subject.dump).to eq before_dsl.undent.strip
|
143
|
+
delta.migrate
|
144
|
+
expect(subject.dump).to eq after_dsl.undent.strip
|
145
|
+
}
|
146
|
+
|
147
|
+
it {
|
148
|
+
delta = Ridgepole::Client.diff(current_schema, dsl, tables: ['employees'], reverse: true)
|
149
|
+
expect(delta.differ?).to be_true
|
150
|
+
expect(delta.script).to eq (<<-RUBY).undent.strip
|
151
|
+
change_column("employees", "first_name", :string, {:limit=>14, :null=>false, :unsigned=>false})
|
152
|
+
RUBY
|
153
|
+
}
|
154
|
+
end
|
155
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -22,13 +22,17 @@ def restore_tables
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def client(options = {}, config = {})
|
25
|
-
config =
|
26
|
-
adapter: 'mysql2',
|
27
|
-
database: 'ridgepole_test',
|
28
|
-
}.merge(config)
|
25
|
+
config = conn_spec(config)
|
29
26
|
|
30
27
|
options = {
|
31
28
|
}.merge(options)
|
32
29
|
|
33
30
|
Ridgepole::Client.new(config, options)
|
34
|
-
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def conn_spec(config = {})
|
34
|
+
{
|
35
|
+
adapter: 'mysql2',
|
36
|
+
database: 'ridgepole_test',
|
37
|
+
}.merge(config)
|
38
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ridgepole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -122,7 +122,9 @@ files:
|
|
122
122
|
- lib/ridgepole/string_ext.rb
|
123
123
|
- lib/ridgepole/version.rb
|
124
124
|
- ridgepole.gemspec
|
125
|
-
- spec/
|
125
|
+
- spec/0_diff/dump_disable_unsigned_spec.rb
|
126
|
+
- spec/diff/diff_spec.rb
|
127
|
+
- spec/dump/dump_class_method_spec.rb
|
126
128
|
- spec/dump/dump_some_tables_spec.rb
|
127
129
|
- spec/dump/dump_spec.rb
|
128
130
|
- spec/migrate/migrate_add_column_spec.rb
|
@@ -131,8 +133,8 @@ files:
|
|
131
133
|
- spec/migrate/migrate_create_index_spec.rb
|
132
134
|
- spec/migrate/migrate_create_table_spec.rb
|
133
135
|
- spec/migrate/migrate_drop_column_spec.rb
|
134
|
-
- spec/migrate/
|
135
|
-
- spec/migrate/
|
136
|
+
- spec/migrate/migrate_drop_index_spec.rb
|
137
|
+
- spec/migrate/migrate_drop_table_spec.rb
|
136
138
|
- spec/migrate/migrate_duplicate_index_spec.rb
|
137
139
|
- spec/migrate/migrate_duplicate_table_spec.rb
|
138
140
|
- spec/migrate/migrate_empty_spec.rb
|
@@ -142,6 +144,8 @@ files:
|
|
142
144
|
- spec/migrate/migrate_same_default_null_spec.rb
|
143
145
|
- spec/migrate/migrate_same_default_unsigned_spec.rb
|
144
146
|
- spec/migrate/migrate_same_spec.rb
|
147
|
+
- spec/migrate/migrate_with_ignore_tables_spec.rb
|
148
|
+
- spec/migrate/migrate_with_tables_spec.rb
|
145
149
|
- spec/ridgepole_test_database.sql
|
146
150
|
- spec/ridgepole_test_tables.sql
|
147
151
|
- spec/spec_helper.rb
|
@@ -171,7 +175,9 @@ signing_key:
|
|
171
175
|
specification_version: 4
|
172
176
|
summary: Ridgepole is a tool to DB schema.
|
173
177
|
test_files:
|
174
|
-
- spec/
|
178
|
+
- spec/0_diff/dump_disable_unsigned_spec.rb
|
179
|
+
- spec/diff/diff_spec.rb
|
180
|
+
- spec/dump/dump_class_method_spec.rb
|
175
181
|
- spec/dump/dump_some_tables_spec.rb
|
176
182
|
- spec/dump/dump_spec.rb
|
177
183
|
- spec/migrate/migrate_add_column_spec.rb
|
@@ -180,8 +186,8 @@ test_files:
|
|
180
186
|
- spec/migrate/migrate_create_index_spec.rb
|
181
187
|
- spec/migrate/migrate_create_table_spec.rb
|
182
188
|
- spec/migrate/migrate_drop_column_spec.rb
|
183
|
-
- spec/migrate/
|
184
|
-
- spec/migrate/
|
189
|
+
- spec/migrate/migrate_drop_index_spec.rb
|
190
|
+
- spec/migrate/migrate_drop_table_spec.rb
|
185
191
|
- spec/migrate/migrate_duplicate_index_spec.rb
|
186
192
|
- spec/migrate/migrate_duplicate_table_spec.rb
|
187
193
|
- spec/migrate/migrate_empty_spec.rb
|
@@ -191,6 +197,8 @@ test_files:
|
|
191
197
|
- spec/migrate/migrate_same_default_null_spec.rb
|
192
198
|
- spec/migrate/migrate_same_default_unsigned_spec.rb
|
193
199
|
- spec/migrate/migrate_same_spec.rb
|
200
|
+
- spec/migrate/migrate_with_ignore_tables_spec.rb
|
201
|
+
- spec/migrate/migrate_with_tables_spec.rb
|
194
202
|
- spec/ridgepole_test_database.sql
|
195
203
|
- spec/ridgepole_test_tables.sql
|
196
204
|
- spec/spec_helper.rb
|