ridgepole 0.8.2 → 0.8.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/README.md +2 -0
- data/lib/ridgepole/delta.rb +1 -1
- data/lib/ridgepole/diff.rb +8 -0
- data/lib/ridgepole/dsl_parser.rb +1 -24
- data/lib/ridgepole/version.rb +1 -1
- data/spec/mysql/fk/migrate_drop_fk_spec.rb +17 -10
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a86332195811295a61f945779cad2b09c6fd8b01df116e505f89995c576f978c
|
4
|
+
data.tar.gz: 491952fd6d83ffb361bbae4153b0fff3d216512948ed0f6b521e408375f898ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7868cb379bb0329e9efef9a5402c9ef5f369740aa4cd1ff68e80798582fbf32bdb6b15840e9866c0dff7aa3fe903aab8f7d7b07359137072face3c462407698
|
7
|
+
data.tar.gz: 94a72fd2146fbcdaa81c235916b3445c13d8eb3297b5c686c011938f6918d85383fb44b00513c52e96fca78b34b1a7b035558d03f36991e1cc0d277f9aa75ebe
|
data/README.md
CHANGED
@@ -105,6 +105,8 @@ It defines DB schema using [Rails DSL](http://guides.rubyonrails.org/migrations.
|
|
105
105
|
* Drop tables in an order considering foreign key constraints ([pull#284](https://github.com/winebarrel/ridgepole/pull/284))
|
106
106
|
* `>= 0.8.2`
|
107
107
|
* Support `postgres://` schema ([pull#285](https://github.com/winebarrel/ridgepole/pull/285))
|
108
|
+
* `>= 0.8.3`
|
109
|
+
* Fix "topological sort failed" error ([pull#287](https://github.com/winebarrel/ridgepole/pull/287))
|
108
110
|
</details>
|
109
111
|
|
110
112
|
## Installation
|
data/lib/ridgepole/delta.rb
CHANGED
@@ -42,7 +42,7 @@ module Ridgepole
|
|
42
42
|
append_change(table_name, attrs, buf, pre_buf_for_fk, post_buf_for_fk)
|
43
43
|
end
|
44
44
|
|
45
|
-
(@delta[:delete] || {}).
|
45
|
+
(@delta[:delete] || {}).each do |table_name, attrs|
|
46
46
|
append_drop_table(table_name, attrs, buf)
|
47
47
|
end
|
48
48
|
|
data/lib/ridgepole/diff.rb
CHANGED
@@ -47,6 +47,14 @@ module Ridgepole
|
|
47
47
|
|
48
48
|
delta[:delete] ||= {}
|
49
49
|
delta[:delete][table_name] = from_attrs
|
50
|
+
|
51
|
+
foreign_keys = from_attrs.fetch(:foreign_keys, {})
|
52
|
+
next if foreign_keys.empty?
|
53
|
+
|
54
|
+
table_delta = {}
|
55
|
+
scan_foreign_keys_change(foreign_keys, {}, table_delta, @options)
|
56
|
+
delta[:change] ||= {}
|
57
|
+
delta[:change][table_name] = table_delta
|
50
58
|
end
|
51
59
|
end
|
52
60
|
|
data/lib/ridgepole/dsl_parser.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'tsort'
|
4
|
-
|
5
3
|
module Ridgepole
|
6
4
|
class DSLParser
|
7
5
|
def initialize(options = {})
|
@@ -12,11 +10,7 @@ module Ridgepole
|
|
12
10
|
definition, execute = Context.eval(dsl, opts)
|
13
11
|
check_orphan_index(definition)
|
14
12
|
check_orphan_foreign_key(definition)
|
15
|
-
|
16
|
-
DependencyGraph.new(definition).tsort_each do |table_name|
|
17
|
-
sorted_definition[table_name] = definition[table_name]
|
18
|
-
end
|
19
|
-
[sorted_definition, execute]
|
13
|
+
[definition, execute]
|
20
14
|
end
|
21
15
|
|
22
16
|
private
|
@@ -32,22 +26,5 @@ module Ridgepole
|
|
32
26
|
raise "Table `#{table_name}` to create the foreign key is not defined: #{attrs[:foreign_keys].keys.join(',')}" if attrs[:foreign_keys] && !(attrs[:definition])
|
33
27
|
end
|
34
28
|
end
|
35
|
-
|
36
|
-
class DependencyGraph
|
37
|
-
include TSort
|
38
|
-
|
39
|
-
def initialize(definition)
|
40
|
-
@definition = definition
|
41
|
-
end
|
42
|
-
|
43
|
-
def tsort_each_child(table_name, &block)
|
44
|
-
keys = @definition[table_name].fetch(:foreign_keys, {})
|
45
|
-
keys.each_value { |v| block.call(v[:to_table]) }
|
46
|
-
end
|
47
|
-
|
48
|
-
def tsort_each_node(&block)
|
49
|
-
@definition.each_key(&block)
|
50
|
-
end
|
51
|
-
end
|
52
29
|
end
|
53
30
|
end
|
data/lib/ridgepole/version.rb
CHANGED
@@ -60,29 +60,36 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
60
60
|
context 'when drop fk when drop table' do
|
61
61
|
let(:dsl) do
|
62
62
|
erbh(<<-ERB)
|
63
|
-
create_table "
|
63
|
+
create_table "users", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
|
64
|
+
t.integer "invitation_id"
|
65
|
+
t.index ["invitation_id"], name: "idx_invitation_id", <%= i cond(5.0, using: :btree) %>
|
64
66
|
end
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
|
68
|
+
add_foreign_key "users", "invitations", name: "users_ibfk"
|
69
|
+
|
70
|
+
create_table "invitations", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
|
71
|
+
t.integer "user_id"
|
72
|
+
t.index ["user_id"], name: "idx_user_id", <%= i cond(5.0, using: :btree) %>
|
69
73
|
end
|
70
74
|
|
71
|
-
add_foreign_key "
|
75
|
+
add_foreign_key "invitations", "users", name: "invitations_ibfk"
|
72
76
|
ERB
|
73
77
|
end
|
74
78
|
|
75
79
|
let(:sorted_dsl) do
|
76
80
|
erbh(<<-ERB)
|
77
|
-
create_table "
|
81
|
+
create_table "invitations", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
|
82
|
+
t.integer "user_id"
|
83
|
+
t.index ["user_id"], name: "idx_user_id", <%= i cond(5.0, using: :btree) %>
|
78
84
|
end
|
79
85
|
|
80
|
-
create_table "
|
81
|
-
t.integer "
|
82
|
-
t.index ["
|
86
|
+
create_table "users", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
|
87
|
+
t.integer "invitation_id"
|
88
|
+
t.index ["invitation_id"], name: "idx_invitation_id", <%= i cond(5.0, using: :btree) %>
|
83
89
|
end
|
84
90
|
|
85
|
-
add_foreign_key "
|
91
|
+
add_foreign_key "invitations", "users", name: "invitations_ibfk"
|
92
|
+
add_foreign_key "users", "invitations", name: "users_ibfk"
|
86
93
|
ERB
|
87
94
|
end
|
88
95
|
|
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.8.
|
4
|
+
version: 0.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -442,7 +442,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
442
442
|
- !ruby/object:Gem::Version
|
443
443
|
version: '0'
|
444
444
|
requirements: []
|
445
|
-
rubygems_version: 3.0.
|
445
|
+
rubygems_version: 3.0.3
|
446
446
|
signing_key:
|
447
447
|
specification_version: 4
|
448
448
|
summary: Ridgepole is a tool to manage DB schema.
|