ridgepole 0.5.3.beta4 → 0.6.0.beta
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/README.md +22 -50
- data/bin/ridgepole +8 -18
- data/lib/ridgepole/client.rb +10 -16
- data/lib/ridgepole/delta.rb +57 -19
- data/lib/ridgepole/diff.rb +45 -14
- data/lib/ridgepole/dsl_parser.rb +38 -8
- data/lib/ridgepole/execute_expander.rb +0 -29
- data/lib/ridgepole/ext/mysql_awesome.rb +1 -5
- data/lib/ridgepole/version.rb +1 -1
- data/lib/ridgepole.rb +10 -2
- data/ridgepole.gemspec +3 -8
- data/spec/bigint_pk/bigint_pkspec.rb +2 -2
- data/spec/cli/ridgepole_spec.rb +3 -5
- data/spec/collation/collation_spec.rb +35 -35
- data/spec/diff/diff2_spec.rb +18 -18
- data/spec/diff/diff_spec.rb +18 -18
- data/spec/dump/dump_class_method_spec.rb +18 -18
- data/spec/dump/dump_some_tables_spec.rb +12 -12
- data/spec/dump/dump_spec.rb +18 -18
- data/spec/dump/dump_without_table_options_spec.rb +6 -6
- data/spec/migrate/check_orphan_index_spec.rb +8 -8
- data/spec/migrate/migrate_add_column2_spec.rb +15 -15
- data/spec/migrate/migrate_add_column_spec.rb +40 -40
- data/spec/migrate/migrate_change_column2_spec.rb +5 -5
- data/spec/migrate/migrate_change_column3_spec.rb +26 -26
- data/spec/migrate/migrate_change_column_float_spec.rb +7 -7
- data/spec/migrate/migrate_change_column_spec.rb +42 -42
- data/spec/migrate/migrate_change_index2_spec.rb +13 -13
- data/spec/migrate/migrate_change_index3_spec.rb +26 -26
- data/spec/migrate/migrate_change_index4_spec.rb +28 -28
- data/spec/migrate/migrate_change_index_spec.rb +46 -46
- data/spec/migrate/migrate_change_table_option_spec.rb +2 -2
- data/spec/migrate/migrate_create_index_spec.rb +18 -18
- data/spec/migrate/migrate_create_table_spec.rb +18 -18
- data/spec/migrate/migrate_create_table_with_options_spec.rb +3 -3
- data/spec/migrate/migrate_drop_column_and_index_2_spec.rb +35 -35
- data/spec/migrate/migrate_drop_column_and_index_spec.rb +33 -33
- data/spec/migrate/migrate_drop_column_spec.rb +36 -36
- data/spec/migrate/migrate_drop_index_spec.rb +18 -18
- data/spec/migrate/migrate_drop_table_spec.rb +24 -24
- data/spec/migrate/migrate_duplicate_index_spec.rb +1 -1
- data/spec/migrate/migrate_duplicate_table_spec.rb +2 -2
- data/spec/migrate/migrate_empty_spec.rb +18 -18
- data/spec/migrate/migrate_execute_spec.rb +58 -49
- data/spec/migrate/migrate_merge_mode_spec.rb +38 -38
- data/spec/migrate/migrate_noop_spec.rb +40 -40
- data/spec/migrate/migrate_rename_column_spec.rb +37 -37
- data/spec/migrate/migrate_rename_table_spec.rb +39 -39
- data/spec/migrate/migrate_same_default_null_spec.rb +4 -4
- data/spec/migrate/migrate_same_spec.rb +18 -18
- data/spec/migrate/migrate_script_error_spec.rb +8 -8
- data/spec/migrate/migrate_skip_rename_column_spec.rb +36 -36
- data/spec/migrate/migrate_skip_rename_table_spec.rb +36 -36
- data/spec/migrate/migrate_with_ignore_tables_spec.rb +12 -12
- data/spec/migrate/migrate_with_pre_post_query_spec.rb +32 -32
- data/spec/migrate/migrate_with_tables_spec.rb +12 -12
- data/spec/migrate_0/migrate_change_fk_spec.rb +11 -11
- data/spec/migrate_0/migrate_create_fk_spec.rb +29 -30
- data/spec/migrate_0/migrate_drop_fk_spec.rb +22 -23
- data/spec/spec_helper.rb +24 -2
- metadata +10 -89
- data/lib/ridgepole/ext/foreign_key.rb +0 -121
- data/spec/0_diff/dump_disable_unsigned_spec.rb +0 -75
- data/spec/comment/comment_spec.rb +0 -179
- data/spec/migrate/migrate_same_default_unsigned_spec.rb +0 -63
- data/spec/~pkdump/pkdump_spec.rb +0 -67
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91b851129e798ca93f666b4942b4fa163b061d96
|
4
|
+
data.tar.gz: 19d3dd0442a52a650d2d1bfcc8adda3b6755335f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5263173c6cca716198521b2c2a0802b6755a7cb9eb414756cf2d3e6fbcce61ac057d7eda74e0c3b95931d4df6ed8554933640f9d4952eea91878aa9193eb7cc4
|
7
|
+
data.tar.gz: 0b12d04adeb3b76dd298199a5a88a467a30ff8149734cf5b9d311475bc0b82f482a661d381ff271eb3ca5260c858005cf9193fcb07b30d7a6faa4854a83d80da
|
data/README.md
CHANGED
@@ -27,6 +27,13 @@ It defines DB schema using [Rails DSL](http://guides.rubyonrails.org/migrations.
|
|
27
27
|
* Add `--enable-mysql-awesome` option ([activerecord-mysql-awesome](https://github.com/kamipo/activerecord-mysql-awesome) is required `>= 0.0.3`)
|
28
28
|
* It is not possible to enable both `--enable-mysql-awesome` and `--enable-migration-comments`, `--enable-mysql-awesome` and `--enable-mysql-unsigned`, `--enable-mysql-awesome` and `--enable-mysql-pkdump`
|
29
29
|
* Fix foreigner version `<= 1.7.1`
|
30
|
+
* `>= 0.6.0`
|
31
|
+
* Fix rails version `~> 4.2.1`
|
32
|
+
* Disable following libraries support:
|
33
|
+
* activerecord-mysql-unsigned
|
34
|
+
* migration_comments
|
35
|
+
* foreigner
|
36
|
+
* Disable sqlite support
|
30
37
|
|
31
38
|
## Installation
|
32
39
|
|
@@ -54,6 +61,9 @@ Usage: ridgepole [options]
|
|
54
61
|
--table-options OPTIONS
|
55
62
|
--bulk-change
|
56
63
|
--default-int-limit LIMIT
|
64
|
+
--default-float-limit LIMIT
|
65
|
+
--default-string-limit LIMIT
|
66
|
+
--default-text-limit LIMIT
|
57
67
|
--pre-query QUERY
|
58
68
|
--post-query QUERY
|
59
69
|
-e, --export
|
@@ -65,13 +75,8 @@ Usage: ridgepole [options]
|
|
65
75
|
-o, --output FILE
|
66
76
|
-t, --tables TABLES
|
67
77
|
--ignore-tables TABLES
|
68
|
-
--enable-mysql-unsigned
|
69
|
-
--enable-mysql-pkdump
|
70
|
-
--enable-foreigner
|
71
|
-
--enable-migration-comments
|
72
78
|
--enable-mysql-awesome
|
73
79
|
--mysql-awesome-unsigned-pk
|
74
|
-
--normalize-mysql-float
|
75
80
|
--dump-without-table-options
|
76
81
|
-r, --require LIBS
|
77
82
|
--log-file LOG_FILE
|
@@ -96,7 +101,7 @@ $ ridgepole -c config.yml --export -o Schemafile # or `ridgepole -c '{adapter: m
|
|
96
101
|
Export Schema to `Schemafile`
|
97
102
|
|
98
103
|
$ cat Schemafile
|
99
|
-
create_table "articles", force:
|
104
|
+
create_table "articles", force: :cascade do |t|
|
100
105
|
t.string "title"
|
101
106
|
t.text "text"
|
102
107
|
t.datetime "created_at"
|
@@ -117,7 +122,7 @@ index f5848b9..c266fed 100644
|
|
117
122
|
--- a/Schemafile
|
118
123
|
+++ b/Schemafile
|
119
124
|
@@ -1,6 +1,7 @@
|
120
|
-
create_table "articles", force:
|
125
|
+
create_table "articles", force: :cascade do |t|
|
121
126
|
t.string "title"
|
122
127
|
t.text "text"
|
123
128
|
+ t.text "author"
|
@@ -139,7 +144,7 @@ Apply `Schemafile`
|
|
139
144
|
|
140
145
|
## Rename
|
141
146
|
```ruby
|
142
|
-
create_table "articles", force:
|
147
|
+
create_table "articles", force: :cascade do |t|
|
143
148
|
t.string "title"
|
144
149
|
t.text "desc", renamed_from: "text"
|
145
150
|
t.text "author"
|
@@ -147,7 +152,7 @@ create_table "articles", force: true do |t|
|
|
147
152
|
t.datetime "updated_at"
|
148
153
|
end
|
149
154
|
|
150
|
-
create_table "user_comments", force:
|
155
|
+
create_table "user_comments", force: :cascade, renamed_from: "comments" do |t|
|
151
156
|
t.string "commenter"
|
152
157
|
t.text "body"
|
153
158
|
t.integer "article_id"
|
@@ -157,39 +162,25 @@ end
|
|
157
162
|
```
|
158
163
|
|
159
164
|
## Foreign Key
|
160
|
-
You can use the foreign key by passing `--enable-foreigner` ([foreigner](https://github.com/matthuhiggins/foreigner) is required)
|
161
|
-
|
162
165
|
```ruby
|
163
|
-
create_table "parent", force:
|
166
|
+
create_table "parent", force: :cascade do |t|
|
164
167
|
end
|
165
168
|
|
166
|
-
create_table "child", id: false, force:
|
169
|
+
create_table "child", id: false, force: :cascade do |t|
|
167
170
|
t.integer "id"
|
168
171
|
t.integer "parent_id"
|
169
172
|
end
|
170
173
|
|
171
174
|
add_index "child", ["parent_id"], name: "par_ind", using: :btree
|
172
175
|
|
173
|
-
add_foreign_key "child", "parent", name: "child_ibfk_1"
|
174
|
-
```
|
175
|
-
|
176
|
-
## Comment
|
177
|
-
You can use the table/column comment by passing `--enable-migration-comments` ([migration_comments](https://github.com/pinnymz/migration_comments) is required)
|
178
|
-
|
179
|
-
```ruby
|
180
|
-
create_table "articles", force: true, comment: "table comment" do |t|
|
181
|
-
t.string "title", comment: "column comment"
|
182
|
-
t.text "text"
|
183
|
-
t.datetime "created_at"
|
184
|
-
t.datetime "updated_at"
|
185
|
-
end
|
176
|
+
add_foreign_key "child", "parent", name: "child_ibfk_1"
|
186
177
|
```
|
187
178
|
|
188
179
|
## Collation
|
189
180
|
You can use the column collation by passing `--enable-mysql-awesome` ([activerecord-mysql-awesome](https://github.com/kamipo/activerecord-mysql-awesome) is required)
|
190
181
|
|
191
182
|
```ruby
|
192
|
-
create_table "articles", force:
|
183
|
+
create_table "articles", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
193
184
|
t.string "title", collation: "ascii_bin"
|
194
185
|
t.text "text", null: false, collation: "utf8mb4_bin"
|
195
186
|
t.datetime "created_at"
|
@@ -197,32 +188,13 @@ create_table "articles", force: true, options: "ENGINE=InnoDB DEFAULT CHARSET=ut
|
|
197
188
|
end
|
198
189
|
```
|
199
190
|
|
200
|
-
## bigint support
|
201
|
-
Export of `bigint` PK is enabled by passing `--enable-mysql-pkdump` ([activerecord-mysql-pkdump](https://github.com/winebarrel/activerecord-mysql-pkdump) is required)
|
202
|
-
```ruby
|
203
|
-
create_table "books", id: "bigint(20) PRIMARY KEY auto_increment", force: true do |t|
|
204
|
-
t.string "title", null: false
|
205
|
-
t.integer "author_id", null: false
|
206
|
-
t.datetime "created_at"
|
207
|
-
t.datetime "updated_at"
|
208
|
-
end
|
209
|
-
```
|
210
|
-
|
211
|
-
If you use `--enable-mysql-awesome`:
|
212
|
-
|
213
|
-
```ruby
|
214
|
-
create_table "books", id: :bigint, force: true do |t|
|
215
|
-
...
|
216
|
-
end
|
217
|
-
```
|
218
|
-
|
219
191
|
## Execute
|
220
192
|
```ruby
|
221
|
-
create_table "authors", force:
|
193
|
+
create_table "authors", force: :cascade do |t|
|
222
194
|
t.string "name", null: false
|
223
195
|
end
|
224
196
|
|
225
|
-
create_table "books", force:
|
197
|
+
create_table "books", force: :cascade do |t|
|
226
198
|
t.string "title", null: false
|
227
199
|
t.integer "author_id", unsigned: true, null: false
|
228
200
|
end
|
@@ -255,7 +227,7 @@ remove_column("articles", "author")
|
|
255
227
|
### Reverse diff
|
256
228
|
```sh
|
257
229
|
$ cat file1.schema
|
258
|
-
create_table "articles", force:
|
230
|
+
create_table "articles", force: :cascade do |t|
|
259
231
|
t.string "title"
|
260
232
|
t.text "text"
|
261
233
|
t.datetime "created_at"
|
@@ -263,7 +235,7 @@ create_table "articles", force: true do |t|
|
|
263
235
|
end
|
264
236
|
|
265
237
|
$ cat file2.schema
|
266
|
-
create_table "articles", force:
|
238
|
+
create_table "articles", force: :cascade do |t|
|
267
239
|
t.string "title"
|
268
240
|
t.text "desc", renamed_from: "text"
|
269
241
|
t.text "author"
|
data/bin/ridgepole
CHANGED
@@ -66,9 +66,13 @@ ARGV.options do |opt|
|
|
66
66
|
raise "Cannot use `bulk-change` in `merge`" if options[:merge]
|
67
67
|
options[:bulk_change] = true
|
68
68
|
}
|
69
|
-
|
70
|
-
|
71
|
-
|
69
|
+
|
70
|
+
Ridgepole::DEFAULTS_LIMITS.keys.each do |column_type|
|
71
|
+
opt.on('', "--default-#{column_type == :integer ? :int : column_type}-limit LIMIT", Integer) {|v|
|
72
|
+
options[:"default_#{column_type}_limit"] = v
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
72
76
|
opt.on('', '--pre-query QUERY') {|v| options[:pre_query] = v }
|
73
77
|
opt.on('', '--post-query QUERY') {|v| options[:post_query] = v }
|
74
78
|
opt.on('-e', '--export') { set_mode[:export] }
|
@@ -91,13 +95,8 @@ ARGV.options do |opt|
|
|
91
95
|
opt.on('-o', '--output FILE') {|v| output_file = v }
|
92
96
|
opt.on('-t', '--tables TABLES', Array) {|v| options[:tables] = v }
|
93
97
|
opt.on('', '--ignore-tables TABLES', Array) {|v| options[:ignore_tables] = v.map {|i| Regexp.new(i) } }
|
94
|
-
opt.on('', '--enable-mysql-unsigned') { options[:enable_mysql_unsigned] = true }
|
95
|
-
opt.on('', '--enable-mysql-pkdump') { options[:enable_mysql_pkdump] = true }
|
96
|
-
opt.on('', '--enable-foreigner') { options[:enable_foreigner] = true }
|
97
|
-
opt.on('', '--enable-migration-comments') { options[:enable_migration_comments] = true }
|
98
98
|
opt.on('', '--enable-mysql-awesome') { options[:enable_mysql_awesome] = true }
|
99
99
|
opt.on('', '--mysql-awesome-unsigned-pk') { options[:mysql_awesome_unsigned_pk] = true }
|
100
|
-
opt.on('', '--normalize-mysql-float') { options[:normalize_mysql_float] = true }
|
101
100
|
opt.on('', '--dump-without-table-options') { options[:dump_without_table_options] = true }
|
102
101
|
opt.on('-r' , '--require LIBS', Array) {|v| v.each {|i| require i } }
|
103
102
|
opt.on('' , '--log-file LOG_FILE') {|v| options[:log_file] = v }
|
@@ -115,18 +114,9 @@ ARGV.options do |opt|
|
|
115
114
|
puts opt.help
|
116
115
|
exit 1
|
117
116
|
end
|
118
|
-
|
119
|
-
if options[:enable_mysql_awesome]
|
120
|
-
if options[:enable_migration_comments]
|
121
|
-
raise "It is not possible to enable both `--enable-mysql-awesome` and `--enable-migration-comments`"
|
122
|
-
elsif options[:enable_mysql_unsigned]
|
123
|
-
raise "It is not possible to enable both `--enable-mysql-awesome` and `--enable-mysql-unsigned`"
|
124
|
-
elsif options[:enable_mysql_pkdump]
|
125
|
-
raise "It is not possible to enable both `--enable-mysql-awesome` and `--enable-mysql-pkdump`"
|
126
|
-
end
|
127
|
-
end
|
128
117
|
rescue => e
|
129
118
|
$stderr.puts("[ERROR] #{e.message}")
|
119
|
+
puts e.backtrace
|
130
120
|
exit 1
|
131
121
|
end
|
132
122
|
end
|
data/lib/ridgepole/client.rb
CHANGED
@@ -1,24 +1,14 @@
|
|
1
1
|
class Ridgepole::Client
|
2
2
|
def initialize(conn_spec, options = {})
|
3
|
+
Ridgepole::Client.normalize_options(options)
|
3
4
|
@options = options
|
5
|
+
|
4
6
|
ActiveRecord::Base.establish_connection(conn_spec)
|
5
7
|
Ridgepole::ExecuteExpander.expand_execute(ActiveRecord::Base.connection)
|
6
8
|
@dumper = Ridgepole::Dumper.new(@options)
|
7
9
|
@parser = Ridgepole::DSLParser.new(@options)
|
8
10
|
@diff = Ridgepole::Diff.new(@options)
|
9
11
|
|
10
|
-
if @options[:enable_mysql_unsigned]
|
11
|
-
require 'activerecord-mysql-unsigned/base'
|
12
|
-
end
|
13
|
-
|
14
|
-
if @options[:enable_mysql_pkdump]
|
15
|
-
require 'activerecord-mysql-pkdump'
|
16
|
-
end
|
17
|
-
|
18
|
-
if @options[:enable_migration_comments]
|
19
|
-
require 'migration_comments'
|
20
|
-
end
|
21
|
-
|
22
12
|
if @options[:enable_mysql_awesome]
|
23
13
|
require 'activerecord/mysql/awesome/base'
|
24
14
|
|
@@ -26,10 +16,6 @@ class Ridgepole::Client
|
|
26
16
|
require 'ridgepole/ext/mysql_awesome.rb'
|
27
17
|
end
|
28
18
|
end
|
29
|
-
|
30
|
-
if @options[:enable_foreigner]
|
31
|
-
Ridgepole::ForeignKey.init
|
32
|
-
end
|
33
19
|
end
|
34
20
|
|
35
21
|
def dump(&block)
|
@@ -51,6 +37,7 @@ class Ridgepole::Client
|
|
51
37
|
|
52
38
|
class << self
|
53
39
|
def diff(dsl_or_config1, dsl_or_config2, options = {})
|
40
|
+
normalize_options(options)
|
54
41
|
logger = Ridgepole::Logger.instance
|
55
42
|
|
56
43
|
logger.verbose_info('# Parse DSL1')
|
@@ -64,10 +51,17 @@ class Ridgepole::Client
|
|
64
51
|
end
|
65
52
|
|
66
53
|
def dump(conn_spec, options = {}, &block)
|
54
|
+
normalize_options(options)
|
67
55
|
client = self.new(conn_spec, options)
|
68
56
|
client.dump(&block)
|
69
57
|
end
|
70
58
|
|
59
|
+
def normalize_options(options)
|
60
|
+
Ridgepole::DEFAULTS_LIMITS.each do |column_type, limit|
|
61
|
+
options[:"default_#{column_type}_limit"] ||= limit
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
71
65
|
private
|
72
66
|
|
73
67
|
def load_definition(dsl_or_config, options = {})
|
data/lib/ridgepole/delta.rb
CHANGED
@@ -14,6 +14,7 @@ class Ridgepole::Delta
|
|
14
14
|
end
|
15
15
|
|
16
16
|
open(log_file, 'wb') {|f| f.puts JSON.pretty_generate(result) }
|
17
|
+
result
|
17
18
|
else
|
18
19
|
migrate0(options)
|
19
20
|
end
|
@@ -59,7 +60,7 @@ class Ridgepole::Delta
|
|
59
60
|
buf = StringIO.new
|
60
61
|
|
61
62
|
callback = proc do |sql, name|
|
62
|
-
buf.puts sql if sql =~ /\A(CREATE|ALTER|DROP|RENAME
|
63
|
+
buf.puts sql if sql =~ /\A(CREATE|ALTER|DROP|RENAME)\b/i
|
63
64
|
end
|
64
65
|
|
65
66
|
Ridgepole::ExecuteExpander.without_operation(callback) do
|
@@ -204,10 +205,7 @@ create_table(#{table_name.inspect}, #{options.inspect}) do |t|
|
|
204
205
|
definition.each do |column_name, column_attrs|
|
205
206
|
column_type = column_attrs.fetch(:type)
|
206
207
|
column_options = column_attrs[:options] || {}
|
207
|
-
|
208
|
-
if @options[:default_int_limit] and column_type == :integer
|
209
|
-
column_options[:limit] ||= @options[:default_int_limit]
|
210
|
-
end
|
208
|
+
normalize_limit(column_type, column_options)
|
211
209
|
|
212
210
|
buf.puts(<<-EOS)
|
213
211
|
t.#{column_type}(#{column_name.inspect}, #{column_options.inspect})
|
@@ -226,11 +224,9 @@ end
|
|
226
224
|
end
|
227
225
|
end
|
228
226
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
Ridgepole::ForeignKey.append_add_foreign_key(table_name, foreign_key_name, foreign_key_attrs, buf, @options)
|
233
|
-
end
|
227
|
+
unless (foreign_keys = attrs[:foreign_keys] || {}).empty?
|
228
|
+
foreign_keys.each do |foreign_key_name, foreign_key_attrs|
|
229
|
+
append_add_foreign_key(table_name, foreign_key_name, foreign_key_attrs, buf, @options)
|
234
230
|
end
|
235
231
|
end
|
236
232
|
|
@@ -254,15 +250,21 @@ drop_table(#{table_name.inspect})
|
|
254
250
|
end
|
255
251
|
|
256
252
|
def append_change(table_name, attrs, buf)
|
257
|
-
|
258
|
-
|
259
|
-
|
253
|
+
definition = attrs[:definition] || {}
|
254
|
+
indices = attrs[:indices] || {}
|
255
|
+
foreign_keys = attrs[:foreign_keys] || {}
|
260
256
|
|
261
|
-
|
262
|
-
|
257
|
+
if not definition.empty? or not indices.empty?
|
258
|
+
append_change_table(table_name, buf) do
|
259
|
+
append_change_definition(table_name, definition, buf)
|
260
|
+
append_change_indices(table_name, indices, buf)
|
263
261
|
end
|
264
262
|
end
|
265
263
|
|
264
|
+
unless foreign_keys.empty?
|
265
|
+
append_change_foreign_keys(table_name, foreign_keys, buf, @options)
|
266
|
+
end
|
267
|
+
|
266
268
|
buf.puts
|
267
269
|
end
|
268
270
|
|
@@ -293,10 +295,7 @@ drop_table(#{table_name.inspect})
|
|
293
295
|
def append_add_column(table_name, column_name, attrs, buf)
|
294
296
|
type = attrs.fetch(:type)
|
295
297
|
options = attrs[:options] || {}
|
296
|
-
|
297
|
-
if @options[:default_int_limit] and type == :integer
|
298
|
-
options[:limit] ||= @options[:default_int_limit]
|
299
|
-
end
|
298
|
+
normalize_limit(type, options)
|
300
299
|
|
301
300
|
if @options[:bulk_change]
|
302
301
|
buf.puts(<<-EOS)
|
@@ -389,7 +388,46 @@ remove_index(#{table_name.inspect}, #{target.inspect})
|
|
389
388
|
end
|
390
389
|
end
|
391
390
|
|
391
|
+
def append_change_foreign_keys(table_name, delta, buf, options)
|
392
|
+
(delta[:delete] || {}).each do |foreign_key_name, attrs|
|
393
|
+
append_remove_foreign_key(table_name, foreign_key_name, attrs, buf, options)
|
394
|
+
end
|
395
|
+
|
396
|
+
(delta[:add] || {}).each do |foreign_key_name, attrs|
|
397
|
+
append_add_foreign_key(table_name, foreign_key_name, attrs, buf, options)
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
def append_add_foreign_key(table_name, foreign_key_name, attrs, buf, options)
|
402
|
+
to_table = attrs.fetch(:to_table)
|
403
|
+
attrs_options = attrs[:options] || {}
|
404
|
+
|
405
|
+
buf.puts(<<-EOS)
|
406
|
+
add_foreign_key(#{table_name.inspect}, #{to_table.inspect}, #{attrs_options.inspect})
|
407
|
+
EOS
|
408
|
+
end
|
409
|
+
|
410
|
+
def append_remove_foreign_key(table_name, foreign_key_name, attrs, buf, options)
|
411
|
+
attrs_options = attrs[:options] || {}
|
412
|
+
target = {:name => attrs_options.fetch(:name)}
|
413
|
+
|
414
|
+
buf.puts(<<-EOS)
|
415
|
+
remove_foreign_key(#{table_name.inspect}, #{target.inspect})
|
416
|
+
EOS
|
417
|
+
end
|
418
|
+
|
392
419
|
def delta_execute
|
393
420
|
@delta[:execute] || []
|
394
421
|
end
|
422
|
+
|
423
|
+
def normalize_limit(column_type, column_options)
|
424
|
+
Ridgepole::DEFAULTS_LIMITS.each do |default_column_type, limit|
|
425
|
+
default_limit = @options[:"default_#{default_column_type}_limit"]
|
426
|
+
next if default_limit <= 0
|
427
|
+
|
428
|
+
if column_type == default_column_type
|
429
|
+
column_options[:limit] ||= default_limit
|
430
|
+
end
|
431
|
+
end
|
432
|
+
end
|
395
433
|
end
|
data/lib/ridgepole/diff.rb
CHANGED
@@ -78,10 +78,7 @@ class Ridgepole::Diff
|
|
78
78
|
scan_options_change(table_name, from[:options], to[:options], table_delta)
|
79
79
|
scan_definition_change(from[:definition], to[:definition], from[:indices], table_delta)
|
80
80
|
scan_indices_change(from[:indices], to[:indices], to[:definition], table_delta, from[:options], to[:options])
|
81
|
-
|
82
|
-
if @options[:enable_foreigner]
|
83
|
-
Ridgepole::ForeignKey.scan_foreign_keys_change(from[:foreign_keys], to[:foreign_keys], table_delta, @options)
|
84
|
-
end
|
81
|
+
scan_foreign_keys_change(from[:foreign_keys], to[:foreign_keys], table_delta, @options)
|
85
82
|
|
86
83
|
unless table_delta.empty?
|
87
84
|
delta[:change] ||= {}
|
@@ -243,10 +240,13 @@ class Ridgepole::Diff
|
|
243
240
|
opts = attrs[:options]
|
244
241
|
opts[:null] = true unless opts.has_key?(:null)
|
245
242
|
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
243
|
+
Ridgepole::DEFAULTS_LIMITS.keys.each do |column_type|
|
244
|
+
default_limit = @options[:"default_#{column_type}_limit"]
|
245
|
+
next if default_limit <= 0
|
246
|
+
|
247
|
+
if attrs[:type] == column_type and opts[:limit] == default_limit
|
248
|
+
opts.delete(:limit)
|
249
|
+
end
|
250
250
|
end
|
251
251
|
|
252
252
|
# XXX: MySQL only?
|
@@ -254,14 +254,9 @@ class Ridgepole::Diff
|
|
254
254
|
opts[:default] = nil
|
255
255
|
end
|
256
256
|
|
257
|
-
|
258
|
-
if @options[:enable_mysql_unsigned] or @options[:enable_mysql_awesome]
|
257
|
+
if @options[:enable_mysql_awesome]
|
259
258
|
opts[:unsigned] = false unless opts.has_key?(:unsigned)
|
260
259
|
end
|
261
|
-
|
262
|
-
if @options[:normalize_mysql_float] and attrs[:type] == :float
|
263
|
-
opts.delete(:limit) if opts[:limit] == 24
|
264
|
-
end
|
265
260
|
end
|
266
261
|
|
267
262
|
def normalize_index_options!(opts)
|
@@ -276,4 +271,40 @@ class Ridgepole::Diff
|
|
276
271
|
|
277
272
|
expected_columns.all? {|i| actual_columns.include?(i) }
|
278
273
|
end
|
274
|
+
|
275
|
+
def scan_foreign_keys_change(from, to, table_delta, options)
|
276
|
+
from = (from || {}).dup
|
277
|
+
to = (to || {}).dup
|
278
|
+
foreign_keys_delta = {}
|
279
|
+
|
280
|
+
to.each do |foreign_key_name, to_attrs|
|
281
|
+
from_attrs = from.delete(foreign_key_name)
|
282
|
+
|
283
|
+
if from_attrs
|
284
|
+
if from_attrs != to_attrs
|
285
|
+
foreign_keys_delta[:add] ||= {}
|
286
|
+
foreign_keys_delta[:add][foreign_key_name] = to_attrs
|
287
|
+
|
288
|
+
unless options[:merge]
|
289
|
+
foreign_keys_delta[:delete] ||= {}
|
290
|
+
foreign_keys_delta[:delete][foreign_key_name] = from_attrs
|
291
|
+
end
|
292
|
+
end
|
293
|
+
else
|
294
|
+
foreign_keys_delta[:add] ||= {}
|
295
|
+
foreign_keys_delta[:add][foreign_key_name] = to_attrs
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
unless options[:merge]
|
300
|
+
from.each do |foreign_key_name, from_attrs|
|
301
|
+
foreign_keys_delta[:delete] ||= {}
|
302
|
+
foreign_keys_delta[:delete][foreign_key_name] = from_attrs
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
unless foreign_keys_delta.empty?
|
307
|
+
table_delta[:foreign_keys] = foreign_keys_delta
|
308
|
+
end
|
309
|
+
end
|
279
310
|
end
|
data/lib/ridgepole/dsl_parser.rb
CHANGED
@@ -22,10 +22,12 @@ class Ridgepole::DSLParser
|
|
22
22
|
}
|
23
23
|
end
|
24
24
|
|
25
|
+
# https://github.com/winebarrel/rails/blob/v4.2.1/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L274
|
25
26
|
TYPES = [
|
26
27
|
:string,
|
27
28
|
:text,
|
28
29
|
:integer,
|
30
|
+
:bigint,
|
29
31
|
:float,
|
30
32
|
:decimal,
|
31
33
|
:datetime,
|
@@ -33,7 +35,7 @@ class Ridgepole::DSLParser
|
|
33
35
|
:time,
|
34
36
|
:date,
|
35
37
|
:binary,
|
36
|
-
:boolean
|
38
|
+
:boolean,
|
37
39
|
]
|
38
40
|
|
39
41
|
TYPES.each do |column_type|
|
@@ -53,9 +55,11 @@ class Ridgepole::DSLParser
|
|
53
55
|
def references(*args)
|
54
56
|
options = args.extract_options!
|
55
57
|
polymorphic = options.delete(:polymorphic)
|
58
|
+
type = options.delete(:type) || :integer
|
59
|
+
|
56
60
|
args.each do |col|
|
57
|
-
column("#{col}_id",
|
58
|
-
column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options)
|
61
|
+
column("#{col}_id", type, options)
|
62
|
+
column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) if polymorphic
|
59
63
|
end
|
60
64
|
end
|
61
65
|
alias :belongs_to :references
|
@@ -120,6 +124,28 @@ class Ridgepole::DSLParser
|
|
120
124
|
}
|
121
125
|
end
|
122
126
|
|
127
|
+
def add_foreign_key(from_table, to_table, options = {})
|
128
|
+
unless options[:name]
|
129
|
+
raise "Foreign key name in `#{from_table}` is undefined"
|
130
|
+
end
|
131
|
+
|
132
|
+
from_table = from_table.to_s
|
133
|
+
to_table = to_table.to_s
|
134
|
+
options[:name] = options[:name].to_s
|
135
|
+
@__definition[from_table] ||= {}
|
136
|
+
@__definition[from_table][:foreign_keys] ||= {}
|
137
|
+
idx = options[:name]
|
138
|
+
|
139
|
+
if @__definition[from_table][:foreign_keys][idx]
|
140
|
+
raise "Foreign Key `#{from_table}(#{idx})` already defined"
|
141
|
+
end
|
142
|
+
|
143
|
+
@__definition[from_table][:foreign_keys][idx] = {
|
144
|
+
:to_table => to_table,
|
145
|
+
:options => options,
|
146
|
+
}
|
147
|
+
end
|
148
|
+
|
123
149
|
def require(file)
|
124
150
|
schemafile = (file =~ %r|\A/|) ? file : File.join(@__working_dir, file)
|
125
151
|
|
@@ -147,11 +173,7 @@ class Ridgepole::DSLParser
|
|
147
173
|
def parse(dsl, opts = {})
|
148
174
|
definition, execute = Context.eval(dsl, opts)
|
149
175
|
check_orphan_index(definition)
|
150
|
-
|
151
|
-
if @options[:enable_foreigner]
|
152
|
-
Ridgepole::ForeignKey.check_orphan_foreign_key(definition)
|
153
|
-
end
|
154
|
-
|
176
|
+
check_orphan_foreign_key(definition)
|
155
177
|
[definition, execute]
|
156
178
|
end
|
157
179
|
|
@@ -164,4 +186,12 @@ class Ridgepole::DSLParser
|
|
164
186
|
end
|
165
187
|
end
|
166
188
|
end
|
189
|
+
|
190
|
+
def check_orphan_foreign_key(definition)
|
191
|
+
definition.each do |table_name, attrs|
|
192
|
+
if attrs[:foreign_keys] and not attrs[:definition]
|
193
|
+
raise "Table `#{table_name}` to create the foreign key is not defined: #{attrs[:foreign_keys].keys.join(',')}"
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
167
197
|
end
|
@@ -69,32 +69,3 @@ module ActiveRecord::ConnectionAdapters::SchemaStatements
|
|
69
69
|
end
|
70
70
|
alias_method_chain :index_name_exists?, :noop
|
71
71
|
end
|
72
|
-
|
73
|
-
begin
|
74
|
-
require 'active_record/connection_adapters/sqlite3_adapter'
|
75
|
-
|
76
|
-
class ActiveRecord::ConnectionAdapters::SQLite3Adapter
|
77
|
-
def exec_query_with_noop(sql, name = nil, binds = [])
|
78
|
-
if Ridgepole::ExecuteExpander.noop
|
79
|
-
if (callback = Ridgepole::ExecuteExpander.callback)
|
80
|
-
callback.call(sql, name)
|
81
|
-
end
|
82
|
-
else
|
83
|
-
exec_query_without_noop(sql, name, binds)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
alias_method_chain :exec_query, :noop
|
87
|
-
|
88
|
-
def copy_table_with_noop(from, to, options = {})
|
89
|
-
if Ridgepole::ExecuteExpander.noop
|
90
|
-
if (callback = Ridgepole::ExecuteExpander.callback)
|
91
|
-
callback.call("COPY TABLE #{from} TO #{to}")
|
92
|
-
end
|
93
|
-
else
|
94
|
-
copy_table_without_noop(from, to, options)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
alias_method_chain :copy_table, :noop
|
98
|
-
end
|
99
|
-
rescue LoadError
|
100
|
-
end
|
@@ -3,10 +3,6 @@ class ActiveRecord::ConnectionAdapters::TableDefinition
|
|
3
3
|
alias primary_key_without_unsigned primary_key
|
4
4
|
|
5
5
|
def primary_key(name, type = :primary_key, options = {})
|
6
|
-
|
7
|
-
primary_key_without_unsigned(name, type, options)
|
8
|
-
else
|
9
|
-
primary_key_without_unsigned(name, type, options.merge(primary_key: true).reverse_merge(unsigned: true))
|
10
|
-
end
|
6
|
+
primary_key_without_unsigned(name, type, options.merge(primary_key: true).reverse_merge(unsigned: true))
|
11
7
|
end
|
12
8
|
end
|
data/lib/ridgepole/version.rb
CHANGED
data/lib/ridgepole.rb
CHANGED
@@ -6,14 +6,22 @@ require 'active_record'
|
|
6
6
|
require 'active_support'
|
7
7
|
require 'active_support/core_ext'
|
8
8
|
|
9
|
-
module Ridgepole
|
9
|
+
module Ridgepole
|
10
|
+
# for MySQL
|
11
|
+
DEFAULTS_LIMITS = {
|
12
|
+
:integer => 4,
|
13
|
+
:float => 24,
|
14
|
+
:string => 255,
|
15
|
+
:text => 65535,
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
10
19
|
require 'ridgepole/client'
|
11
20
|
require 'ridgepole/delta'
|
12
21
|
require 'ridgepole/diff'
|
13
22
|
require 'ridgepole/dsl_parser'
|
14
23
|
require 'ridgepole/dumper'
|
15
24
|
require 'ridgepole/execute_expander'
|
16
|
-
require 'ridgepole/ext/foreign_key'
|
17
25
|
require 'ridgepole/logger'
|
18
26
|
require 'ridgepole/migration_ext'
|
19
27
|
require 'ridgepole/schema_dumper_ext'
|