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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7527f5ce44a1b320c5d7614f8967b608ded6a21116ef4821855e49ca22fb1730
4
- data.tar.gz: ac0e1cd4f0d2384cf5e7344724ad5075d261ce1383a6d63140c8d60071067308
3
+ metadata.gz: b71ca08a2b1ad3fc910bf8fd6ae9a0b5fa86458ee8dccbd1b52f303423df1540
4
+ data.tar.gz: 940685472b0247d15d013e345d234775230c0a45e55f685386040eea618b2d50
5
5
  SHA512:
6
- metadata.gz: a7c65e8a37a8d36feadac9be7fd2df507898b2711edc379ecbe2a317175569604d18b47e49fdf4e23f82e5f362161ed49f5e12e835321cd70ed38818743ec6a4
7
- data.tar.gz: af2ffccca2ea04ae3d5ed731085100cedac5c9c709032c7c0a34e6fad606ef0585fad059877add945aa7315da6c04c757dd1fcedf41f2f94a5b60b29aadf9a65
6
+ metadata.gz: 1a98ce1e87b13f293474f8d294854edee91f85c66e1a5cc172039ba59f3b174c02f9f95e18cfe0a650014081018cec8ba576b2e62e22632a2e8a91c7f0e586b2
7
+ data.tar.gz: d4780708ca8767222b797aef3f047158889e5cbce54d3e3264d16bd4544baef819d3733e2534bca69739ce2339f1fe9e6e0cab87c5815a1e0c0626ce220500dd
@@ -13,3 +13,4 @@ jobs:
13
13
  uses: SOFware/reissue/.github/workflows/shared-ruby-gem-release.yml@main
14
14
  with:
15
15
  dry_run: ${{ inputs.dry_run }}
16
+ ruby_version: "4.0"
data/CHANGELOG.md CHANGED
@@ -2,8 +2,22 @@
2
2
 
3
3
 
4
4
 
5
- ## [0.1.0] - 2026-03-09
5
+ ## [0.1.2] - 2026-03-09
6
6
 
7
7
  ### Added
8
8
 
9
- - Schema dump/load support for Que via ActiveRecord integration (0aa34d1)
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- que-schema (0.1.0)
4
+ que-schema (0.1.2)
5
5
  activerecord (>= 6.0)
6
6
  que
7
7
  railties (>= 6.0)
@@ -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
- super
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 all que_* tables — Que.migrate! creates them during schema load.
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
- table_name.start_with?("que_")
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module QueSchema
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.2"
5
5
  end
@@ -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 after tables" do
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 > output.index("original tables")
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 "suppresses any future que_* table" do
122
+ it "does not suppress tables from other que_* gems" do
123
123
  stream = StringIO.new
124
- dumper.send(:table, "que_something_new", stream)
125
- expect(stream.string).to be_empty
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 que_ prefixed tables" do
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
- expect(dumper.send(:que_table?, "que_new_future_table")).to be true
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.0
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.5
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: []