From fd7f8e856f0f6121a48c32adc1477261730524f0 Mon Sep 17 00:00:00 2001 From: Nik Samokhvalov Date: Fri, 10 Jul 2026 02:33:14 -0700 Subject: [PATCH 1/2] fix(ruby): reject unsupported event extras --- clients/ruby/README.md | 14 ++++++++++++++ clients/ruby/lib/pgque/event.rb | 5 ++--- clients/ruby/test/test_send.rb | 25 +++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/clients/ruby/README.md b/clients/ruby/README.md index 74b9cd61..bf7f6f41 100644 --- a/clients/ruby/README.md +++ b/clients/ruby/README.md @@ -83,6 +83,20 @@ ticking from your application or an external scheduler — see the project [Installation](https://github.com/NikolayS/pgque#installation) section for both paths. +### Event inputs + +`Pgque::Event` is an optional value object for carrying a payload and type +together before sending: + +```ruby +event = Pgque::Event.new(payload: { "order_id" => 42 }, type: "order.created") +client.send("orders", event) +``` + +It accepts only `payload:` and `type:`. The receive-side `extra1` through +`extra4` fields are not supported by this producer wrapper; unknown keywords +such as `extra:` raise `ArgumentError` instead of being silently discarded. + ### Consumer options `Consumer.new(..., max_messages: ...)` controls the per-`receive` limit. diff --git a/clients/ruby/lib/pgque/event.rb b/clients/ruby/lib/pgque/event.rb index 4e78a63e..3b6c4eba 100644 --- a/clients/ruby/lib/pgque/event.rb +++ b/clients/ruby/lib/pgque/event.rb @@ -2,12 +2,11 @@ module Pgque class Event - attr_reader :payload, :type, :extra + attr_reader :payload, :type - def initialize(payload:, type: "default", extra: {}) + def initialize(payload:, type: "default") @payload = payload @type = type - @extra = extra end end end diff --git a/clients/ruby/test/test_send.rb b/clients/ruby/test/test_send.rb index 5a2342cc..736e3a07 100644 --- a/clients/ruby/test/test_send.rb +++ b/clients/ruby/test/test_send.rb @@ -23,12 +23,33 @@ def test_send_with_explicit_type end def test_send_event_object - with_queue do |queue, _consumer, conn| + with_queue do |queue, consumer, conn| client = Pgque::Client.new(conn) - event = Pgque::Event.new(payload: { "x" => 1 }, type: "custom.t") + payload = { "x" => 1 } + event = Pgque::Event.new(payload: payload, type: "custom.t") + refute_respond_to event, :extra eid = client.send(queue, event) assert_kind_of Integer, eid + + conn.exec_params("select pgque.force_next_tick($1)", [queue]) + conn.exec_params("select pgque.ticker($1)", [queue]) + msg = client.receive(queue, consumer, 1).fetch(0) + assert_equal eid, msg.msg_id + assert_equal "custom.t", msg.type + assert_equal payload, msg.payload + client.ack(msg.batch_id) + end + end + + def test_event_rejects_extra_keyword_instead_of_silently_dropping_it + error = assert_raises(ArgumentError) do + Pgque::Event.new( + payload: { "x" => 1 }, + type: "custom.t", + extra: { "trace_id" => "lost" }, + ) end + assert_match(/unknown keyword.*extra/, error.message) end def test_send_str_payload_passes_through From cdaf7259cc995656cdcf3f91a02d353dc624eb8d Mon Sep 17 00:00:00 2001 From: Nik Samokhvalov Date: Sat, 11 Jul 2026 06:51:03 -0700 Subject: [PATCH 2/2] docs(ruby): state event keyword contract --- clients/ruby/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/ruby/README.md b/clients/ruby/README.md index bf7f6f41..1111b6ce 100644 --- a/clients/ruby/README.md +++ b/clients/ruby/README.md @@ -95,7 +95,7 @@ client.send("orders", event) It accepts only `payload:` and `type:`. The receive-side `extra1` through `extra4` fields are not supported by this producer wrapper; unknown keywords -such as `extra:` raise `ArgumentError` instead of being silently discarded. +such as `extra:` raise `ArgumentError`. ### Consumer options