Skip to content

Releases: chrisguidry/docket

0.18.2 - cron is a flat circcle

10 Mar 12:58
562f060

Choose a tag to compare

What's Changed

Full Changelog: 0.18.1...0.18.2

0.18.1 - Don't be so shy

06 Mar 13:56
4ab39d2

Choose a tag to compare

What's Changed

Full Changelog: 0.18.0...0.18.1

0.18.0 - Totally uncalled for

02 Mar 16:14
744a614

Choose a tag to compare

The big news with this release is that I've extracted Docket's dependency system to it's own library called uncalled-for (https://github.com/chrisguidry/uncalled-for and https://pypi.org/project/uncalled-for/). This should be a transparent change for all Docket users, and I've done everything I could to make sure that the import surface area is completely compatible.

I also took this opportunity to implement some ideas that we've been bouncing around for a bit, where we have Annotated dependencies specifically for dependencies that need to modify their behavior based on a parameter. For example, if you want to set a concurrency limit by customer, that looks like:

async def hit_customer_webhook(customer_id: Annotated[int, ConcurrencyLimit(2)]):
    ...

(note, the prior style continues to work for ConcurrencyLimit)

Inspired by this new style, I've implemented some additional modifiers to runtime behavior/admissions, Debouce, Cooldown, and RateLimit, which all hopefully do what they sound like they do. More on those new behavior dependencies in the docs.

Please note that with Annotated dependencies, they are still activated for the lifecycle of the task, but their return values aren't accessible as parameters. This is a design choice and we will not be supporting some_parameter: Annotated[SomeType, Depends(some_function)]. Our stance is that any dependency like that should be provided via a kwarg default to keep the intention clear. I want to thank @omikader for helping me think through this and bravely taking a stab at one version of Annotated dependencies.

What's Changed

Compatibility guarantees

I've tested both FastMCP 2.x and FastMCP 3.x with no other code changes and both are operating correctly. Prefect doesn't use any relevant imports from Docket and is using only the public API that's remained unchanged.

Full Changelog: 0.17.9...0.18.0

0.17.9 - READ ME

20 Feb 20:48
23e3c3d

Choose a tag to compare

image

What's Changed

Full Changelog: 0.17.8...0.17.9

0.17.8

17 Feb 22:00
a63b5f3

Choose a tag to compare

What's Changed

  • Clear known from runs hash on cancel so add() can reschedule by @chrisguidry in #336
  • Handle AlreadyExists race in cluster image build by @chrisguidry in #337
  • Serialize cluster image builds and split CLI tests into separate CI job by @chrisguidry in #338
  • Fix high CPU on Windows memory:// backend and add Windows CI by @chrisguidry in #340
  • Support redis-py 7.2.0 and bump CI to Redis 8.6 by @chrisguidry in #342
  • Migrate docs from mkdocs-material to Zensical by @chrisguidry in #343

Full Changelog: 0.17.7...0.17.8

0.17.7 - The whole universe, just Lua scripts all the way down.

11 Feb 20:54
0812c86

Choose a tag to compare

What's Changed

  • Bump the all-dependencies group with 2 updates by @dependabot[bot] in #333
  • Don't let _mark_as_terminal clobber Perpetual successor state by @chrisguidry in #335

Full Changelog: 0.17.6...0.17.7

0.17.6 - Perpetual: The Next Generation

10 Feb 22:18
aec04bd

Choose a tag to compare

What's Changed

Full Changelog: 0.17.5...0.17.6

0.17.5 - In the zone

30 Jan 18:40
b85c7d4

Choose a tag to compare

What's Changed

  • feat(cron): add support for custom timezones by @omikader in #312

Full Changelog: 0.17.4...0.17.5

0.17.4 - I love it when a plan comes together

30 Jan 17:12
f9c7d16

Choose a tag to compare

Big thanks to @omikader who's been a partner in thinking through some big refactorings, culminating in a very clean addition of a new Cron dependency!

from docket.dependencies import Cron

async def hourly_session_cleanup(cron: Cron = Cron("15 * * * *")):
    ... clean up user sessions at the :15 mark of every hour ...

# @daily is equivalent to "0 0 * * *" (midnight every day)
async def daily_report(cron: Cron = Cron("@daily")):
    ... run the daily report ...

Cron dependencies default to automatic=True (so they just automatically get scheduled for their next appropriate run) but you can disable them if you want more control by setting automatic=False.

I love it when a plan comes together

What's Changed

  • Add internal state invariant tests and reorganize test directories by @chrisguidry in #310
  • Add Cron dependency for cron-style task scheduling by @omikader in #311

New Contributors

Full Changelog: 0.17.3...0.17.4

0.17.3 - Let it goooo

27 Jan 00:58
c5a2b6d

Choose a tag to compare

What's Changed

Full Changelog: 0.17.2...0.17.3