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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 57ca4e6b9d4ac5f62c434e2cd3116f13b77e308666beb4e7e242def292d25957
4
- data.tar.gz: 3cb9d7fb9e6949b9627ddb23219b5dbe7a7e34168e00fcf0cb073fd123b90e36
3
+ metadata.gz: a86332195811295a61f945779cad2b09c6fd8b01df116e505f89995c576f978c
4
+ data.tar.gz: 491952fd6d83ffb361bbae4153b0fff3d216512948ed0f6b521e408375f898ab
5
5
  SHA512:
6
- metadata.gz: 9ba1cab03cb73b791fc28bf52985dd7caef619694fad6fc0ab9b22eedc53791da70050d6c77b4017019708dade6387777836c427dc080c9dace6690ac83a1a3b
7
- data.tar.gz: 3f8446b608a6bdc86095aa3639bd3e57bcebdf423c858edf3f12613e98a6674be7bf210ec6443d0964189143cae3f5af4223a36cda705e8c0bf3ddaf44026fab
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
@@ -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] || {}).reverse_each do |table_name, attrs|
45
+ (@delta[:delete] || {}).each do |table_name, attrs|
46
46
  append_drop_table(table_name, attrs, buf)
47
47
  end
48
48
 
@@ -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
 
@@ -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
- sorted_definition = {}
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ridgepole
4
- VERSION = '0.8.2'
4
+ VERSION = '0.8.3'
5
5
  end
@@ -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 "0_parent", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
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
- create_table "1_child", force: :cascade do |t|
67
- t.integer "0_parent_id"
68
- t.index ["0_parent_id"], name: "par_id", <%= i cond(5.0, using: :btree) %>
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 "1_child", "0_parent", name: "child_ibfk_1"
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 "0_parent", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
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 "1_child", force: :cascade do |t|
81
- t.integer "0_parent_id"
82
- t.index ["0_parent_id"], name: "par_id", <%= i cond(5.0, using: :btree) %>
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 "1_child", "0_parent", name: "child_ibfk_1"
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.2
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-12 00:00:00.000000000 Z
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.4
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.