pydocket 0.7.0__tar.gz → 0.8.0__tar.gz

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.

Potentially problematic release.


This version of pydocket might be problematic. Click here for more details.

Files changed (74) hide show
  1. {pydocket-0.7.0 → pydocket-0.8.0}/.github/workflows/ci.yml +2 -2
  2. {pydocket-0.7.0 → pydocket-0.8.0}/.github/workflows/publish.yml +9 -4
  3. {pydocket-0.7.0 → pydocket-0.8.0}/.gitignore +7 -9
  4. pydocket-0.8.0/CLAUDE.md +127 -0
  5. {pydocket-0.7.0 → pydocket-0.8.0}/PKG-INFO +3 -1
  6. {pydocket-0.7.0 → pydocket-0.8.0}/README.md +2 -0
  7. pydocket-0.8.0/docs/advanced-patterns.md +558 -0
  8. pydocket-0.8.0/docs/dependencies.md +394 -0
  9. pydocket-0.8.0/docs/getting-started.md +198 -0
  10. pydocket-0.8.0/docs/production.md +407 -0
  11. pydocket-0.8.0/docs/testing.md +356 -0
  12. pydocket-0.8.0/examples/concurrency_control.py +114 -0
  13. {pydocket-0.7.0 → pydocket-0.8.0}/mkdocs.yml +4 -0
  14. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/__init__.py +2 -0
  15. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/annotations.py +4 -0
  16. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/cli.py +138 -0
  17. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/dependencies.py +92 -3
  18. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/docket.py +43 -0
  19. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/execution.py +3 -1
  20. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/instrumentation.py +6 -0
  21. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/worker.py +174 -16
  22. pydocket-0.8.0/tests/cli/test_clear.py +253 -0
  23. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/test_snapshot.py +153 -0
  24. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/test_worker.py +4 -3
  25. {pydocket-0.7.0 → pydocket-0.8.0}/tests/conftest.py +6 -2
  26. pydocket-0.8.0/tests/test_concurrency_basic.py +31 -0
  27. pydocket-0.8.0/tests/test_concurrency_control.py +336 -0
  28. pydocket-0.8.0/tests/test_concurrency_refresh.py +196 -0
  29. pydocket-0.8.0/tests/test_docket.py +168 -0
  30. {pydocket-0.7.0 → pydocket-0.8.0}/tests/test_instrumentation.py +92 -0
  31. pydocket-0.8.0/tests/test_worker.py +1429 -0
  32. {pydocket-0.7.0 → pydocket-0.8.0}/uv.lock +417 -416
  33. pydocket-0.7.0/docs/getting-started.md +0 -286
  34. pydocket-0.7.0/tests/test_docket.py +0 -14
  35. pydocket-0.7.0/tests/test_worker.py +0 -515
  36. {pydocket-0.7.0 → pydocket-0.8.0}/.cursor/rules/general.mdc +0 -0
  37. {pydocket-0.7.0 → pydocket-0.8.0}/.cursor/rules/python-style.mdc +0 -0
  38. {pydocket-0.7.0 → pydocket-0.8.0}/.github/codecov.yml +0 -0
  39. {pydocket-0.7.0 → pydocket-0.8.0}/.github/workflows/chaos.yml +0 -0
  40. {pydocket-0.7.0 → pydocket-0.8.0}/.github/workflows/docs.yml +0 -0
  41. {pydocket-0.7.0 → pydocket-0.8.0}/.pre-commit-config.yaml +0 -0
  42. {pydocket-0.7.0 → pydocket-0.8.0}/LICENSE +0 -0
  43. {pydocket-0.7.0 → pydocket-0.8.0}/chaos/README.md +0 -0
  44. {pydocket-0.7.0 → pydocket-0.8.0}/chaos/__init__.py +0 -0
  45. {pydocket-0.7.0 → pydocket-0.8.0}/chaos/driver.py +0 -0
  46. {pydocket-0.7.0 → pydocket-0.8.0}/chaos/producer.py +0 -0
  47. {pydocket-0.7.0 → pydocket-0.8.0}/chaos/run +0 -0
  48. {pydocket-0.7.0 → pydocket-0.8.0}/chaos/tasks.py +0 -0
  49. {pydocket-0.7.0 → pydocket-0.8.0}/docs/api-reference.md +0 -0
  50. {pydocket-0.7.0 → pydocket-0.8.0}/docs/index.md +0 -0
  51. {pydocket-0.7.0 → pydocket-0.8.0}/examples/__init__.py +0 -0
  52. {pydocket-0.7.0 → pydocket-0.8.0}/examples/common.py +0 -0
  53. {pydocket-0.7.0 → pydocket-0.8.0}/examples/find_and_flood.py +0 -0
  54. {pydocket-0.7.0 → pydocket-0.8.0}/examples/self_perpetuating.py +0 -0
  55. {pydocket-0.7.0 → pydocket-0.8.0}/pyproject.toml +0 -0
  56. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/__main__.py +0 -0
  57. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/py.typed +0 -0
  58. {pydocket-0.7.0 → pydocket-0.8.0}/src/docket/tasks.py +0 -0
  59. {pydocket-0.7.0 → pydocket-0.8.0}/telemetry/.gitignore +0 -0
  60. {pydocket-0.7.0 → pydocket-0.8.0}/telemetry/start +0 -0
  61. {pydocket-0.7.0 → pydocket-0.8.0}/telemetry/stop +0 -0
  62. {pydocket-0.7.0 → pydocket-0.8.0}/tests/__init__.py +0 -0
  63. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/__init__.py +0 -0
  64. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/conftest.py +0 -0
  65. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/test_module.py +0 -0
  66. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/test_parsing.py +0 -0
  67. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/test_striking.py +0 -0
  68. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/test_tasks.py +0 -0
  69. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/test_version.py +0 -0
  70. {pydocket-0.7.0 → pydocket-0.8.0}/tests/cli/test_workers.py +0 -0
  71. {pydocket-0.7.0 → pydocket-0.8.0}/tests/test_dependencies.py +0 -0
  72. {pydocket-0.7.0 → pydocket-0.8.0}/tests/test_execution.py +0 -0
  73. {pydocket-0.7.0 → pydocket-0.8.0}/tests/test_fundamentals.py +0 -0
  74. {pydocket-0.7.0 → pydocket-0.8.0}/tests/test_striking.py +0 -0
@@ -15,7 +15,7 @@ jobs:
15
15
  fail-fast: false
16
16
  matrix:
17
17
  python-version: ["3.12", "3.13"]
18
- redis-version: ["6.2", "7.4"]
18
+ redis-version: ["6.2", "7.4", "valkey-8.0"]
19
19
  redis-py-version: [">=4.6,<5", ">=5"]
20
20
 
21
21
  steps:
@@ -34,7 +34,7 @@ jobs:
34
34
  - name: Run tests
35
35
  env:
36
36
  REDIS_VERSION: ${{ matrix.redis-version }}
37
- run: uv run pytest --cov-branch --cov-report=xml --cov-report=term-missing:skip-covered
37
+ run: uv run pytest --cov-branch --cov-fail-under=100 --cov-report=xml --cov-report=term-missing:skip-covered
38
38
 
39
39
  - name: Upload coverage reports to Codecov
40
40
  uses: codecov/codecov-action@v5
@@ -13,8 +13,11 @@ jobs:
13
13
  name: Build and publish to PyPI
14
14
  runs-on: ubuntu-latest
15
15
  needs: ci
16
+ environment:
17
+ name: pypi
18
+ url: https://pypi.org/p/pydocket
16
19
  permissions:
17
- id-token: write
20
+ id-token: write # Required for trusted publishing and PEP 740 attestations
18
21
  contents: read
19
22
 
20
23
  steps:
@@ -31,10 +34,12 @@ jobs:
31
34
  cache-dependency-glob: "pyproject.toml"
32
35
 
33
36
  - name: Install build dependencies
34
- run: uv pip install build hatchling hatch-vcs
37
+ run: uv pip install hatchling hatch-vcs
35
38
 
36
39
  - name: Build package
37
40
  run: uv build
38
41
 
39
- - name: Publish to PyPI
40
- run: uv publish
42
+ - name: Publish to PyPI with PEP 740 attestations
43
+ uses: pypa/gh-action-pypi-publish@release/v1
44
+ with:
45
+ packages-dir: dist/
@@ -1,13 +1,11 @@
1
- # Python-generated files
2
- __pycache__/
3
- *.py[oc]
4
- build/
5
- dist/
6
- wheels/
7
1
  *.egg-info
8
-
9
- # Virtual environments
10
- .venv
2
+ *.py[oc]
11
3
  .coverage
12
4
  .envrc
13
5
  .python-version
6
+ .venv
7
+ .worktrees/
8
+ __pycache__/
9
+ build/
10
+ dist/
11
+ wheels/
@@ -0,0 +1,127 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ **Docket** (`pydocket` on PyPI) is a distributed background task system for Python functions with Redis-backed persistence. It enables scheduling both immediate and future work with comprehensive dependency injection, retry mechanisms, and fault tolerance.
8
+
9
+ **Key Requirements**: Python 3.12+, Redis 6.2+ or Valkey 8.0+
10
+
11
+ ## Development Commands
12
+
13
+ ### Testing
14
+
15
+ ```bash
16
+ # Run full test suite with coverage and parallel execution
17
+ pytest
18
+
19
+ # Run specific test
20
+ pytest tests/test_docket.py::test_specific_function
21
+
22
+ ```
23
+
24
+ The project REQUIRES 100% test coverage
25
+
26
+ ### Code Quality
27
+
28
+ ```bash
29
+ # Lint and format code
30
+ ruff check
31
+ ruff format
32
+
33
+ # Type checking
34
+ pyright
35
+ pyright tests
36
+
37
+ # Run all pre-commit hooks
38
+ pre-commit run --all-files
39
+ ```
40
+
41
+ ### Development Setup
42
+
43
+ ```bash
44
+ # Install development dependencies
45
+ uv sync --group dev
46
+
47
+ # Install pre-commit hooks
48
+ pre-commit install
49
+ ```
50
+
51
+ ### Git Workflow
52
+
53
+ - This project uses Github for issue tracking
54
+ - This project can use git worktrees under .worktrees/
55
+
56
+ ## Core Architecture
57
+
58
+ ### Key Classes
59
+
60
+ - **`Docket`** (`src/docket/docket.py`): Central task registry and scheduler
61
+
62
+ - `add()`: Schedule tasks for execution
63
+ - `replace()`: Replace existing scheduled tasks
64
+ - `cancel()`: Cancel pending tasks
65
+ - `strike()`/`restore()`: Conditionally block/unblock tasks
66
+ - `snapshot()`: Get current state for observability
67
+
68
+ - **`Worker`** (`src/docket/worker.py`): Task execution engine
69
+
70
+ - `run_forever()`/`run_until_finished()`: Main execution loops
71
+ - Handles concurrency, retries, and dependency injection
72
+ - Maintains heartbeat for liveness tracking
73
+
74
+ - **`Execution`** (`src/docket/execution.py`): Task execution context with metadata
75
+
76
+ ### Dependencies System (`src/docket/dependencies.py`)
77
+
78
+ Rich dependency injection supporting:
79
+
80
+ - Context access: `CurrentDocket`, `CurrentWorker`, `CurrentExecution`
81
+ - Retry strategies: `Retry`, `ExponentialRetry`
82
+ - Special behaviors: `Perpetual` (self-rescheduling), `Timeout`
83
+ - Custom injection: `Depends()`
84
+ - Contextual logging: `TaskLogger`
85
+
86
+ ### Redis Data Model
87
+
88
+ - **Streams**: `{docket}:stream` (ready tasks), `{docket}:strikes` (commands)
89
+ - **Sorted Sets**: `{docket}:queue` (scheduled tasks), `{docket}:workers` (heartbeats)
90
+ - **Hashes**: `{docket}:{key}` (parked task data)
91
+ - **Sets**: `{docket}:worker-tasks:{worker}` (worker capabilities)
92
+
93
+ ### Task Lifecycle
94
+
95
+ 1. Registration with `Docket.register()` or `@docket.task`
96
+ 2. Scheduling: immediate → Redis stream, future → Redis sorted set
97
+ 3. Worker processing: scheduler moves due tasks, workers consume via consumer groups
98
+ 4. Execution: dependency injection, retry logic, acknowledgment
99
+
100
+ ## Project Structure
101
+
102
+ ### Source Code
103
+
104
+ - `src/docket/` - Main package
105
+ - `__init__.py` - Public API exports
106
+ - `docket.py` - Core Docket class
107
+ - `worker.py` - Worker implementation
108
+ - `execution.py` - Task execution context
109
+ - `dependencies.py` - Dependency injection system
110
+ - `tasks.py` - Built-in utility tasks
111
+ - `cli.py` - Command-line interface
112
+
113
+ ### Testing and Examples
114
+
115
+ - `tests/` - Comprehensive test suite
116
+ - `examples/` - Usage examples
117
+ - `chaos/` - Chaos testing framework
118
+
119
+ ## CLI Usage
120
+
121
+ ```bash
122
+ # Run a worker
123
+ docket worker --url redis://localhost:6379/0 --tasks your.module --concurrency 4
124
+
125
+ # See all commands
126
+ docket --help
127
+ ```
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydocket
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: A distributed background task system for Python functions
5
5
  Project-URL: Homepage, https://github.com/chrisguidry/docket
6
6
  Project-URL: Bug Tracker, https://github.com/chrisguidry/docket/issues
@@ -93,6 +93,8 @@ reference](https://chrisguidry.github.io/docket/api-reference/).
93
93
 
94
94
  🧩 Fully type-complete and type-aware for your background task functions
95
95
 
96
+ 💉 Dependency injection like FastAPI, Typer, and FastMCP for reusable resources
97
+
96
98
  ## Installing `docket`
97
99
 
98
100
  Docket is [available on PyPI](https://pypi.org/project/pydocket/) under the package name
@@ -57,6 +57,8 @@ reference](https://chrisguidry.github.io/docket/api-reference/).
57
57
 
58
58
  🧩 Fully type-complete and type-aware for your background task functions
59
59
 
60
+ 💉 Dependency injection like FastAPI, Typer, and FastMCP for reusable resources
61
+
60
62
  ## Installing `docket`
61
63
 
62
64
  Docket is [available on PyPI](https://pypi.org/project/pydocket/) under the package name