que-schema 0.1.2 → 0.1.4
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/CHANGELOG.md +5 -13
- data/Gemfile.lock +1 -1
- data/lib/que_schema/schema_dumper.rb +39 -4
- data/lib/que_schema/schema_statements.rb +8 -0
- data/lib/que_schema/version.rb +1 -1
- data/spec/schema_dumper_spec.rb +126 -0
- data/spec/schema_statements_spec.rb +40 -0
- 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: 539498be1f604e4c6c861625da853bc839f9180568e3711a80bba9d7eb307a74
|
|
4
|
+
data.tar.gz: e5af896433efb7f6f91eb5cafc09012286307b67b56b5ab186452a12437d05ef
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 14ee67ec7ef19298088ea7ca10a3282dbf466f226acab5852308ae56c18f63e0ea32c035cc5333840e38729e2b2bed5459043198f1ba1f3742829118048f470b
|
|
7
|
+
data.tar.gz: adbc82bcb5fa30c7a10419920c1a98ee4cb045a603710c91a9384b6c7cb88a23c52784d11476c77a80c6a7361bb4fe2de5cfdcd5aa6debb2d00d207aca299b14
|
data/CHANGELOG.md
CHANGED
|
@@ -2,22 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
## [0.1.
|
|
6
|
-
|
|
7
|
-
### Added
|
|
8
|
-
|
|
9
|
-
- Suppress Que-managed functions and triggers in schema dump (629c074)
|
|
5
|
+
## [0.1.4] - 2026-04-01
|
|
10
6
|
|
|
11
7
|
### Fixed
|
|
12
8
|
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
### Changed
|
|
9
|
+
- Foreign keys between Que-managed tables appearing in schema.rb (860ae38)
|
|
16
10
|
|
|
17
|
-
|
|
11
|
+
## [0.1.3] - 2026-04-01
|
|
18
12
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
### Fixed
|
|
13
|
+
### Added
|
|
22
14
|
|
|
23
|
-
-
|
|
15
|
+
- Automatic que-scheduler schema management when que-scheduler gem is present (2bf5b3b)
|
data/Gemfile.lock
CHANGED
|
@@ -44,7 +44,8 @@ module QueSchema
|
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
# Only objects created by Que.migrate! — other que_*
|
|
47
|
-
# objects (e.g. que_scheduler_*) belong to separate gems
|
|
47
|
+
# objects (e.g. que_scheduler_*) belong to separate gems
|
|
48
|
+
# unless que-schema manages them too.
|
|
48
49
|
QUE_MANAGED_TABLES = %w[
|
|
49
50
|
que_jobs que_lockers que_values
|
|
50
51
|
].freeze
|
|
@@ -58,16 +59,50 @@ module QueSchema
|
|
|
58
59
|
que_job_notify que_state_notify
|
|
59
60
|
].freeze
|
|
60
61
|
|
|
62
|
+
QUE_SCHEDULER_TABLES = %w[
|
|
63
|
+
que_scheduler_audit que_scheduler_audit_enqueued
|
|
64
|
+
].freeze
|
|
65
|
+
|
|
66
|
+
QUE_SCHEDULER_FUNCTIONS = %w[
|
|
67
|
+
que_scheduler_check_job_exists
|
|
68
|
+
que_scheduler_prevent_job_deletion
|
|
69
|
+
].freeze
|
|
70
|
+
|
|
71
|
+
QUE_SCHEDULER_TRIGGERS = %w[
|
|
72
|
+
que_scheduler_prevent_job_deletion_trigger
|
|
73
|
+
].freeze
|
|
74
|
+
|
|
75
|
+
def que_scheduler?
|
|
76
|
+
defined?(Que::Scheduler::Migrations)
|
|
77
|
+
end
|
|
78
|
+
|
|
61
79
|
def que_table?(table_name)
|
|
62
|
-
QUE_MANAGED_TABLES.include?(table_name)
|
|
80
|
+
return true if QUE_MANAGED_TABLES.include?(table_name)
|
|
81
|
+
return true if que_scheduler? && QUE_SCHEDULER_TABLES.include?(table_name)
|
|
82
|
+
|
|
83
|
+
false
|
|
63
84
|
end
|
|
64
85
|
|
|
65
86
|
def que_function?(name)
|
|
66
|
-
QUE_MANAGED_FUNCTIONS.include?(name.to_s)
|
|
87
|
+
return true if QUE_MANAGED_FUNCTIONS.include?(name.to_s)
|
|
88
|
+
return true if que_scheduler? && QUE_SCHEDULER_FUNCTIONS.include?(name.to_s)
|
|
89
|
+
|
|
90
|
+
false
|
|
67
91
|
end
|
|
68
92
|
|
|
69
93
|
def que_trigger?(name)
|
|
70
|
-
QUE_MANAGED_TRIGGERS.include?(name.to_s)
|
|
94
|
+
return true if QUE_MANAGED_TRIGGERS.include?(name.to_s)
|
|
95
|
+
return true if que_scheduler? && QUE_SCHEDULER_TRIGGERS.include?(name.to_s)
|
|
96
|
+
|
|
97
|
+
false
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Suppress foreign keys between Que-managed tables —
|
|
101
|
+
# Que.migrate! / scheduler migrations recreate them.
|
|
102
|
+
def foreign_keys(table, stream)
|
|
103
|
+
return if postgresql? && que_table?(table.to_s)
|
|
104
|
+
|
|
105
|
+
super
|
|
71
106
|
end
|
|
72
107
|
|
|
73
108
|
# Override Fx::SchemaDumper methods to filter out
|
|
@@ -14,6 +14,14 @@ module QueSchema
|
|
|
14
14
|
|
|
15
15
|
Que.connection_proc = proc { |&block| block.call(connection.raw_connection) }
|
|
16
16
|
Que.migrate!(version: version.to_i)
|
|
17
|
+
apply_que_scheduler_schema
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def apply_que_scheduler_schema
|
|
21
|
+
return unless defined?(Que::Scheduler::Migrations)
|
|
22
|
+
|
|
23
|
+
Que::Scheduler::Migrations.migrate!(version: Que::Scheduler::Migrations::MAX_VERSION)
|
|
24
|
+
Que::Scheduler::Migrations.reenqueue_scheduler_if_missing
|
|
17
25
|
end
|
|
18
26
|
|
|
19
27
|
private
|
data/lib/que_schema/version.rb
CHANGED
data/spec/schema_dumper_spec.rb
CHANGED
|
@@ -146,6 +146,26 @@ RSpec.describe QueSchema::SchemaDumper do
|
|
|
146
146
|
end
|
|
147
147
|
end
|
|
148
148
|
|
|
149
|
+
describe "#foreign_keys" do
|
|
150
|
+
context "when PostgreSQL" do
|
|
151
|
+
before { stub_postgresql! }
|
|
152
|
+
|
|
153
|
+
it "suppresses foreign keys on que_jobs" do
|
|
154
|
+
stream = StringIO.new
|
|
155
|
+
dumper.send(:foreign_keys, "que_jobs", stream)
|
|
156
|
+
expect(stream.string).to be_empty
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "passes app tables through to super" do
|
|
160
|
+
stream = StringIO.new
|
|
161
|
+
expect { dumper.send(:foreign_keys, "users", stream) }
|
|
162
|
+
.to raise_error(NoMethodError, /super/)
|
|
163
|
+
# Raises because the test double has no real superclass —
|
|
164
|
+
# confirms the method delegates rather than suppressing.
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
149
169
|
describe "#que_function? (private)" do
|
|
150
170
|
it "returns true for Que-managed functions" do
|
|
151
171
|
%w[que_validate_tags que_determine_job_state que_job_notify que_state_notify].each do |name|
|
|
@@ -228,6 +248,112 @@ RSpec.describe QueSchema::SchemaDumper do
|
|
|
228
248
|
end
|
|
229
249
|
end
|
|
230
250
|
|
|
251
|
+
context "when que-scheduler is present" do
|
|
252
|
+
before do
|
|
253
|
+
stub_const("Que::Scheduler::Migrations", double("Migrations"))
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
describe "#que_table?" do
|
|
257
|
+
it "suppresses que_scheduler tables" do
|
|
258
|
+
expect(dumper.send(:que_table?, "que_scheduler_audit")).to be true
|
|
259
|
+
expect(dumper.send(:que_table?, "que_scheduler_audit_enqueued")).to be true
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "still suppresses core que tables" do
|
|
263
|
+
expect(dumper.send(:que_table?, "que_jobs")).to be true
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
it "does not suppress non-que tables" do
|
|
267
|
+
expect(dumper.send(:que_table?, "users")).to be false
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
describe "#que_function?" do
|
|
272
|
+
it "suppresses que_scheduler functions" do
|
|
273
|
+
expect(dumper.send(:que_function?, "que_scheduler_check_job_exists")).to be true
|
|
274
|
+
expect(dumper.send(:que_function?, "que_scheduler_prevent_job_deletion")).to be true
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
it "still suppresses core que functions" do
|
|
278
|
+
expect(dumper.send(:que_function?, "que_job_notify")).to be true
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
describe "#que_trigger?" do
|
|
283
|
+
it "suppresses que_scheduler triggers" do
|
|
284
|
+
expect(dumper.send(:que_trigger?, "que_scheduler_prevent_job_deletion_trigger")).to be true
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
it "still suppresses core que triggers" do
|
|
288
|
+
expect(dumper.send(:que_trigger?, "que_job_notify")).to be true
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
describe "#table" do
|
|
293
|
+
before { stub_postgresql! }
|
|
294
|
+
|
|
295
|
+
it "suppresses que_scheduler_audit" do
|
|
296
|
+
stream = StringIO.new
|
|
297
|
+
dumper.send(:table, "que_scheduler_audit", stream)
|
|
298
|
+
expect(stream.string).to be_empty
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
describe "#functions" do
|
|
303
|
+
before do
|
|
304
|
+
stub_postgresql!
|
|
305
|
+
stub_const("Fx", double("Fx", database: double(functions: [
|
|
306
|
+
double("function", name: "que_scheduler_check_job_exists", to_schema: " create_function :que_scheduler_check_job_exists"),
|
|
307
|
+
double("function", name: "my_app_function", to_schema: " create_function :my_app_function")
|
|
308
|
+
])))
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
it "filters out que_scheduler functions" do
|
|
312
|
+
stream = StringIO.new
|
|
313
|
+
dumper.send(:functions, stream)
|
|
314
|
+
output = stream.string
|
|
315
|
+
|
|
316
|
+
expect(output).not_to include("que_scheduler_check_job_exists")
|
|
317
|
+
expect(output).to include("my_app_function")
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
describe "#triggers" do
|
|
322
|
+
before do
|
|
323
|
+
stub_postgresql!
|
|
324
|
+
stub_const("Fx", double("Fx", database: double(triggers: [
|
|
325
|
+
double("trigger", name: "que_scheduler_prevent_job_deletion_trigger", to_schema: " create_trigger :que_scheduler_prevent_job_deletion_trigger"),
|
|
326
|
+
double("trigger", name: "my_app_trigger", to_schema: " create_trigger :my_app_trigger")
|
|
327
|
+
])))
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
it "filters out que_scheduler triggers" do
|
|
331
|
+
stream = StringIO.new
|
|
332
|
+
dumper.send(:triggers, stream)
|
|
333
|
+
output = stream.string
|
|
334
|
+
|
|
335
|
+
expect(output).not_to include("que_scheduler_prevent_job_deletion_trigger")
|
|
336
|
+
expect(output).to include("my_app_trigger")
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
describe "#foreign_keys" do
|
|
341
|
+
before { stub_postgresql! }
|
|
342
|
+
|
|
343
|
+
it "suppresses foreign keys on que_scheduler tables" do
|
|
344
|
+
stream = StringIO.new
|
|
345
|
+
dumper.send(:foreign_keys, "que_scheduler_audit_enqueued", stream)
|
|
346
|
+
expect(stream.string).to be_empty
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
it "suppresses foreign keys on core que tables" do
|
|
350
|
+
stream = StringIO.new
|
|
351
|
+
dumper.send(:foreign_keys, "que_jobs", stream)
|
|
352
|
+
expect(stream.string).to be_empty
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
|
|
231
357
|
describe "#que_schema_version (private)" do
|
|
232
358
|
it "returns the version from the table comment" do
|
|
233
359
|
allow(connection).to receive(:table_exists?).with("que_jobs").and_return(true)
|
|
@@ -64,6 +64,46 @@ RSpec.describe QueSchema::SchemaStatements do
|
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
+
describe "que-scheduler integration" do
|
|
68
|
+
context "when Que::Scheduler::Migrations is defined" do
|
|
69
|
+
before do
|
|
70
|
+
scheduler_mod = Module.new do
|
|
71
|
+
class << self
|
|
72
|
+
attr_accessor :migrate_called_with, :reenqueue_called
|
|
73
|
+
|
|
74
|
+
def migrate!(version:)
|
|
75
|
+
self.migrate_called_with = version
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def reenqueue_scheduler_if_missing
|
|
79
|
+
self.reenqueue_called = true
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
scheduler_mod.const_set(:MAX_VERSION, 8)
|
|
84
|
+
stub_const("Que::Scheduler::Migrations", scheduler_mod)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "calls Que::Scheduler::Migrations.migrate! with MAX_VERSION" do
|
|
88
|
+
instance.que_define_schema(version: 7)
|
|
89
|
+
|
|
90
|
+
expect(Que::Scheduler::Migrations.migrate_called_with).to eq(8)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "calls reenqueue_scheduler_if_missing" do
|
|
94
|
+
instance.que_define_schema(version: 7)
|
|
95
|
+
|
|
96
|
+
expect(Que::Scheduler::Migrations.reenqueue_called).to be true
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
context "when Que::Scheduler::Migrations is not defined" do
|
|
101
|
+
it "does not raise an error" do
|
|
102
|
+
expect { instance.que_define_schema(version: 7) }.not_to raise_error
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
67
107
|
describe "#postgresql? (private)" do
|
|
68
108
|
it "returns false when no connection method exists" do
|
|
69
109
|
obj = Object.new
|
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.4
|
|
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.6
|
|
106
106
|
specification_version: 4
|
|
107
107
|
summary: Enables schema.rb compatibility for the que job queue gem
|
|
108
108
|
test_files: []
|