que-schema 0.1.0 → 0.1.2
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/.github/workflows/release.yml +1 -0
- data/CHANGELOG.md +16 -2
- data/Gemfile.lock +1 -1
- data/lib/que_schema/railtie.rb +7 -1
- data/lib/que_schema/schema_dumper.rb +50 -4
- data/lib/que_schema/version.rb +1 -1
- data/spec/schema_dumper_spec.rb +75 -7
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b71ca08a2b1ad3fc910bf8fd6ae9a0b5fa86458ee8dccbd1b52f303423df1540
|
|
4
|
+
data.tar.gz: 940685472b0247d15d013e345d234775230c0a45e55f685386040eea618b2d50
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1a98ce1e87b13f293474f8d294854edee91f85c66e1a5cc172039ba59f3b174c02f9f95e18cfe0a650014081018cec8ba576b2e62e22632a2e8a91c7f0e586b2
|
|
7
|
+
data.tar.gz: d4780708ca8767222b797aef3f047158889e5cbce54d3e3264d16bd4544baef819d3733e2534bca69739ce2339f1fe9e6e0cab87c5815a1e0c0626ce220500dd
|
data/CHANGELOG.md
CHANGED
|
@@ -2,8 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
## [0.1.
|
|
5
|
+
## [0.1.2] - 2026-03-09
|
|
6
6
|
|
|
7
7
|
### Added
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- Suppress Que-managed functions and triggers in schema dump (629c074)
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Duplicate trigger errors during db:schema:load (629c074)
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- SchemaDumper prepend timing for correct ancestor order (629c074)
|
|
18
|
+
|
|
19
|
+
## [0.1.1] - 2026-03-09
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- Schema dumper suppressing que_scheduler_* tables (1669e0d)
|
data/Gemfile.lock
CHANGED
data/lib/que_schema/railtie.rb
CHANGED
|
@@ -7,8 +7,14 @@ module QueSchema
|
|
|
7
7
|
ActiveRecord::Migration.include(QueSchema::SchemaStatements)
|
|
8
8
|
ActiveRecord::Migration.include(QueSchema::MigrationHelpers)
|
|
9
9
|
ActiveRecord::Schema.include(QueSchema::SchemaStatements)
|
|
10
|
-
ActiveRecord::SchemaDumper.prepend(QueSchema::SchemaDumper)
|
|
11
10
|
end
|
|
12
11
|
end
|
|
12
|
+
|
|
13
|
+
# Prepend SchemaDumper after initialization so it sits
|
|
14
|
+
# above Fx/Scenic in the ancestor chain and can filter
|
|
15
|
+
# out Que-managed functions and triggers.
|
|
16
|
+
config.after_initialize do
|
|
17
|
+
ActiveRecord::SchemaDumper.prepend(QueSchema::SchemaDumper)
|
|
18
|
+
end
|
|
13
19
|
end
|
|
14
20
|
end
|
|
@@ -7,16 +7,19 @@ module QueSchema
|
|
|
7
7
|
private
|
|
8
8
|
|
|
9
9
|
def tables(stream)
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
# Emit que_define_schema before tables so Que objects
|
|
11
|
+
# exist when later functions/triggers reference them.
|
|
12
12
|
if postgresql? && (version = que_schema_version) && version > 0
|
|
13
13
|
stream.puts " # Que internal schema — emitted by que-schema gem"
|
|
14
14
|
stream.puts " que_define_schema(version: #{version})"
|
|
15
15
|
stream.puts
|
|
16
16
|
end
|
|
17
|
+
|
|
18
|
+
super
|
|
17
19
|
end
|
|
18
20
|
|
|
19
|
-
# Suppress
|
|
21
|
+
# Suppress Que-managed tables — Que.migrate! recreates them during
|
|
22
|
+
# schema load via que_define_schema.
|
|
20
23
|
def table(table_name, stream)
|
|
21
24
|
return if postgresql? && que_table?(table_name)
|
|
22
25
|
|
|
@@ -40,8 +43,51 @@ module QueSchema
|
|
|
40
43
|
@connection.respond_to?(:adapter_name) && @connection.adapter_name.match?(/postgresql/i)
|
|
41
44
|
end
|
|
42
45
|
|
|
46
|
+
# Only objects created by Que.migrate! — other que_*
|
|
47
|
+
# objects (e.g. que_scheduler_*) belong to separate gems.
|
|
48
|
+
QUE_MANAGED_TABLES = %w[
|
|
49
|
+
que_jobs que_lockers que_values
|
|
50
|
+
].freeze
|
|
51
|
+
|
|
52
|
+
QUE_MANAGED_FUNCTIONS = %w[
|
|
53
|
+
que_validate_tags que_determine_job_state
|
|
54
|
+
que_job_notify que_state_notify
|
|
55
|
+
].freeze
|
|
56
|
+
|
|
57
|
+
QUE_MANAGED_TRIGGERS = %w[
|
|
58
|
+
que_job_notify que_state_notify
|
|
59
|
+
].freeze
|
|
60
|
+
|
|
43
61
|
def que_table?(table_name)
|
|
44
|
-
|
|
62
|
+
QUE_MANAGED_TABLES.include?(table_name)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def que_function?(name)
|
|
66
|
+
QUE_MANAGED_FUNCTIONS.include?(name.to_s)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def que_trigger?(name)
|
|
70
|
+
QUE_MANAGED_TRIGGERS.include?(name.to_s)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Override Fx::SchemaDumper methods to filter out
|
|
74
|
+
# Que-managed objects when Fx is present.
|
|
75
|
+
def functions(stream)
|
|
76
|
+
return super unless postgresql? && defined?(::Fx)
|
|
77
|
+
|
|
78
|
+
dumpable = Fx.database.functions
|
|
79
|
+
.reject { |f| que_function?(f.name) }
|
|
80
|
+
dumpable.each { |f| stream.puts(f.to_schema) }
|
|
81
|
+
stream.puts if dumpable.any?
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def triggers(stream)
|
|
85
|
+
return super unless postgresql? && defined?(::Fx)
|
|
86
|
+
|
|
87
|
+
dumpable = Fx.database.triggers
|
|
88
|
+
.reject { |t| que_trigger?(t.name) }
|
|
89
|
+
stream.puts if dumpable.any?
|
|
90
|
+
dumpable.each { |t| stream.puts(t.to_schema) }
|
|
45
91
|
end
|
|
46
92
|
end
|
|
47
93
|
end
|
data/lib/que_schema/version.rb
CHANGED
data/spec/schema_dumper_spec.rb
CHANGED
|
@@ -45,14 +45,14 @@ RSpec.describe QueSchema::SchemaDumper do
|
|
|
45
45
|
allow(connection).to receive(:execute).and_return([{"comment" => "7"}])
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
it "emits que_define_schema
|
|
48
|
+
it "emits que_define_schema before tables" do
|
|
49
49
|
stream = StringIO.new
|
|
50
50
|
dumper.send(:tables, stream)
|
|
51
51
|
output = stream.string
|
|
52
52
|
|
|
53
53
|
expect(output).to include("que_define_schema(version: 7)")
|
|
54
54
|
expect(output).to include("# original tables output")
|
|
55
|
-
expect(output.index("que_define_schema")).to be
|
|
55
|
+
expect(output.index("que_define_schema")).to be < output.index("original tables")
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -119,10 +119,10 @@ RSpec.describe QueSchema::SchemaDumper do
|
|
|
119
119
|
expect(stream.string).to be_empty
|
|
120
120
|
end
|
|
121
121
|
|
|
122
|
-
it "
|
|
122
|
+
it "does not suppress tables from other que_* gems" do
|
|
123
123
|
stream = StringIO.new
|
|
124
|
-
dumper.send(:table, "
|
|
125
|
-
expect(stream.string).to
|
|
124
|
+
dumper.send(:table, "que_scheduler_audit", stream)
|
|
125
|
+
expect(stream.string).to include('create_table "que_scheduler_audit"')
|
|
126
126
|
end
|
|
127
127
|
|
|
128
128
|
it "does not suppress non-que tables" do
|
|
@@ -146,12 +146,80 @@ RSpec.describe QueSchema::SchemaDumper do
|
|
|
146
146
|
end
|
|
147
147
|
end
|
|
148
148
|
|
|
149
|
+
describe "#que_function? (private)" do
|
|
150
|
+
it "returns true for Que-managed functions" do
|
|
151
|
+
%w[que_validate_tags que_determine_job_state que_job_notify que_state_notify].each do |name|
|
|
152
|
+
expect(dumper.send(:que_function?, name)).to be true
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "returns false for functions from other que_* gems" do
|
|
157
|
+
expect(dumper.send(:que_function?, "que_scheduler_check_job_exists")).to be false
|
|
158
|
+
expect(dumper.send(:que_function?, "que_scheduler_prevent_job_deletion")).to be false
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
describe "#que_trigger? (private)" do
|
|
163
|
+
it "returns true for Que-managed triggers" do
|
|
164
|
+
expect(dumper.send(:que_trigger?, "que_job_notify")).to be true
|
|
165
|
+
expect(dumper.send(:que_trigger?, "que_state_notify")).to be true
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it "returns false for triggers from other que_* gems" do
|
|
169
|
+
expect(dumper.send(:que_trigger?, "que_scheduler_prevent_job_deletion_trigger")).to be false
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
describe "#functions (private)" do
|
|
174
|
+
let(:que_fn) { double("function", name: "que_job_notify", to_schema: ' create_function :que_job_notify') }
|
|
175
|
+
let(:app_fn) { double("function", name: "my_app_function", to_schema: ' create_function :my_app_function') }
|
|
176
|
+
let(:scheduler_fn) { double("function", name: "que_scheduler_check_job_exists", to_schema: ' create_function :que_scheduler_check_job_exists') }
|
|
177
|
+
|
|
178
|
+
before do
|
|
179
|
+
stub_postgresql!
|
|
180
|
+
stub_const("Fx", double("Fx", database: double(functions: [que_fn, app_fn, scheduler_fn])))
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "filters out Que-managed functions" do
|
|
184
|
+
stream = StringIO.new
|
|
185
|
+
dumper.send(:functions, stream)
|
|
186
|
+
output = stream.string
|
|
187
|
+
|
|
188
|
+
expect(output).not_to include("que_job_notify")
|
|
189
|
+
expect(output).to include("my_app_function")
|
|
190
|
+
expect(output).to include("que_scheduler_check_job_exists")
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
describe "#triggers (private)" do
|
|
195
|
+
let(:que_trigger) { double("trigger", name: "que_job_notify", to_schema: ' create_trigger :que_job_notify') }
|
|
196
|
+
let(:app_trigger) { double("trigger", name: "que_scheduler_prevent_job_deletion_trigger", to_schema: ' create_trigger :que_scheduler_prevent_job_deletion_trigger') }
|
|
197
|
+
|
|
198
|
+
before do
|
|
199
|
+
stub_postgresql!
|
|
200
|
+
stub_const("Fx", double("Fx", database: double(triggers: [que_trigger, app_trigger])))
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it "filters out Que-managed triggers" do
|
|
204
|
+
stream = StringIO.new
|
|
205
|
+
dumper.send(:triggers, stream)
|
|
206
|
+
output = stream.string
|
|
207
|
+
|
|
208
|
+
expect(output).not_to include("que_job_notify")
|
|
209
|
+
expect(output).to include("que_scheduler_prevent_job_deletion_trigger")
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
149
213
|
describe "#que_table? (private)" do
|
|
150
|
-
it "returns true for
|
|
214
|
+
it "returns true for Que-managed tables" do
|
|
151
215
|
expect(dumper.send(:que_table?, "que_jobs")).to be true
|
|
152
216
|
expect(dumper.send(:que_table?, "que_lockers")).to be true
|
|
153
217
|
expect(dumper.send(:que_table?, "que_values")).to be true
|
|
154
|
-
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it "returns false for tables from other que_* gems" do
|
|
221
|
+
expect(dumper.send(:que_table?, "que_scheduler_audit")).to be false
|
|
222
|
+
expect(dumper.send(:que_table?, "que_scheduler_audit_enqueued")).to be false
|
|
155
223
|
end
|
|
156
224
|
|
|
157
225
|
it "returns false for non-que tables" do
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: que-schema
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jim Gay
|
|
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
103
|
version: '0'
|
|
104
104
|
requirements: []
|
|
105
|
-
rubygems_version: 4.0.
|
|
105
|
+
rubygems_version: 4.0.3
|
|
106
106
|
specification_version: 4
|
|
107
107
|
summary: Enables schema.rb compatibility for the que job queue gem
|
|
108
108
|
test_files: []
|