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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b71ca08a2b1ad3fc910bf8fd6ae9a0b5fa86458ee8dccbd1b52f303423df1540
4
- data.tar.gz: 940685472b0247d15d013e345d234775230c0a45e55f685386040eea618b2d50
3
+ metadata.gz: 539498be1f604e4c6c861625da853bc839f9180568e3711a80bba9d7eb307a74
4
+ data.tar.gz: e5af896433efb7f6f91eb5cafc09012286307b67b56b5ab186452a12437d05ef
5
5
  SHA512:
6
- metadata.gz: 1a98ce1e87b13f293474f8d294854edee91f85c66e1a5cc172039ba59f3b174c02f9f95e18cfe0a650014081018cec8ba576b2e62e22632a2e8a91c7f0e586b2
7
- data.tar.gz: d4780708ca8767222b797aef3f047158889e5cbce54d3e3264d16bd4544baef819d3733e2534bca69739ce2339f1fe9e6e0cab87c5815a1e0c0626ce220500dd
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.2] - 2026-03-09
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
- - Duplicate trigger errors during db:schema:load (629c074)
14
-
15
- ### Changed
9
+ - Foreign keys between Que-managed tables appearing in schema.rb (860ae38)
16
10
 
17
- - SchemaDumper prepend timing for correct ancestor order (629c074)
11
+ ## [0.1.3] - 2026-04-01
18
12
 
19
- ## [0.1.1] - 2026-03-09
20
-
21
- ### Fixed
13
+ ### Added
22
14
 
23
- - Schema dumper suppressing que_scheduler_* tables (1669e0d)
15
+ - Automatic que-scheduler schema management when que-scheduler gem is present (2bf5b3b)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- que-schema (0.1.2)
4
+ que-schema (0.1.4)
5
5
  activerecord (>= 6.0)
6
6
  que
7
7
  railties (>= 6.0)
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module QueSchema
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.4"
5
5
  end
@@ -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.2
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.3
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: []