🐑 Oban Instance Module
New facade modules allow you to call Oban
functions on instances with custom names, e.g. not Oban
, without passing a t:Oban.name/0
as the first argument.
For example, rather than calling Oban.config/1
, you'd call MyOban.config/0
:
MyOban.config()
It also makes piping into Oban functions far more convenient:
%{some: :args}
|> MyWorker.new()
|> MyOban.insert()
🧩 Partial Matches in Testing Assertions
It's now possible to match a subset of fields on args or meta with all_enqueued
, assert_enqueued
, and refute_enqueued
. For example, the following assertion will now pass:
# Given a job with these args: %{id: 123, mode: "active"}
assert_enqueued args: %{id: 123} #=> true
assert_enqueued args: %{mode: "active"} #=> true
assert_enqueued args: %{id: 321, mode: "active"} #=> false
The change applies to args
and meta
queries for all_enqueued/2
, assert_enqueued/2
and refute_enqueued/2
helpers.
⏲️ Unique Timestamp Option
Jobs are frequently scheduled for a time far in the future and it's often desirable for to consider scheduled
jobs for uniqueness, but unique jobs only checked the :inserted_at
timestamp.
Now unique
has a timestamp
option that allows checking the :scheduled_at
timestamp instead:
use Oban.Worker, unique: [period: 120, timestamp: :scheduled_at]
Bug Fixes
-
[Reindexer] Correct relname match for reindexer plugin
We can safely assume all indexes start with
oban_jobs
. The previous pattern was based on an outdated index format from older migrations. -
[Testing] Support
repo
,prefix
, andlog
query options inuse Oban.Testing