Releases: oliverm91/processes
Releases · oliverm91/processes
Release list
v7.0.4
v7.0.1
Processes v7.0.0
v7.0.0 (2026-06-20)
BREAKING CHANGE
- Task(channels=...) and the NotificationChannel API are removed;
HTMLEmailStyle.style and traced_vars_frame_filter are removed (the latter moves
to Task). Per-task email/webhook alerts are replaced by report.notify.
Feat
- add process name to report, email subject, and webhook payload
- normalize task names to lowercase for case-insensitive matching
- delegate notifications to ProcessExecutionReport, drop per-task channels
- replace notify_errors with notify(only_errors=...) and add task filter
- implement WebhookChannel and EmailChannel send_report
- add ReportChannel architecture for report notifications
- add ProcessExecutionReport.notify/.notify_errors stubs
- add ProcessExecutionReport.to_json
- add graph mutation methods to Process
Refactor
- group communication code into a comms/ package
- unify SMTP and webhook transport behind single classes
- extract task value types to leaf module, break import cycle
Perf
- cache palette CSS and report template loading
- cache language string loading
- add slots=True to frozen value types
v6.0.0 (2026-06-15)
BREAKING CHANGE
- Process.run() returns ProcessExecutionReport instead of
ProcessResult. Use report.successes / report.errored / report.skipped
instead of passed_tasks_results / errored_tasks / skipped_tasks, and
report.entries[name].result / .error instead of
passed_tasks_results[name] / failed_tasks_results[name].
Feat
- remove ProcessResult, have Process.run() return ProcessExecutionReport
- expand TaskStatus with PENDING and add status field to TaskResult
- add ProcessExecutionReport for per-task execution summaries
- track failed task results in ProcessRunner and ProcessResult
- promote ErrorData to public API and add timing/attempts to TaskResult
Fix
- make Task.run never propagate dependency-resolution failures
Refactor
- drop _is_unrunnable side effect and reuse TaskResult helpers
v5.0.0 (2026-06-14)
BREAKING CHANGE
- log_path and func swap positions; existing positional
Task(name, log_path, func, ...) calls must be updated to
Task(name, func, log_path, ...).
Feat
- add nest_under option to WebhookConfig for nested payload envelopes
- make Task.log_path optional, reorder constructor signature
v4.1.0 (2026-06-14)
Feat
- add extra_payload to WebhookConfig for service-specific routing keys
- include traced variables in task logfiles
- add generic WebhookChannel with optional HMAC body signing
Refactor
- make traced_vars a plain {name: repr(value)} dict
v4.0.0 (2026-06-14)
BREAKING CHANGE
- Task no longer accepts smtp_config or email_style.
Pass channels=[EmailChannel(smtp_config, style)] instead.
Feat
- add NotificationChannel abstraction with file and email channels
Refactor
- configure email alerts via channels instead of Task smtp_config
- keep file and email channel implementations internal
- build task handlers through notification channels
v3.1.1 (2026-06-13)
Processes v3.1.1
v3.1.1 (2026-06-13)
Refactor
- rename _log_formatting to _logfile_formatting and _TaskLogFormatter to _TaskLogfileFormatter
v3.1.0 (2026-06-13)
Processes v3.1.0
v3.1.0 — Failure Context in Logfiles, PEP 561, Docs Refresh
✨ New Features
- Failure context in task logfiles: when a task fails, its logfile now
includes the same structured information shown in the HTML failure email —
function name, args/kwargs, downstream impact, traced-vars location, and
the traceback — not just the bare exception message and stack trace.
🔧 Refactoring
- Introduced
_ErrorData, a typed view over the internaltask_context
payload, and_ErrorContextFormatter, a shared base class for the email
and logfile formatters. Both formatters now read one typed object instead
of independently pulling fields out of an untyped dict. - Extracted plain-text logfile rendering into a new
_log_formattingmodule
(_TaskLogFormatter), keeping_email_internalsfocused on SMTP/HTML
concerns only.
📦 Packaging
- Added PEP 561 support: shipped
py.typedmarker and the
"Typing :: Typed"classifier, so downstreammypy/pyrightruns pick up
this package's type hints. - Removed the stale
version_filesentry from[tool.commitizen](version
is sourced from git tags viahatch-vcs). - Refined the package
descriptionto lead with what the library does and
call out that tasks are plain callables.
📚 Documentation
- Configured
mkdocstringsfor NumPy-style docstrings (docstring_style: numpy) and enabled heading/signature rendering — the API Reference page
now shows class names, method sections, and proper parameter/attribute
lists instead of flat paragraphs. - Updated the "Customizing the HTML email" section and Quick Start example
to useSMTPConfig/HTMLEmailStyle(the oldHTMLSMTPHandlerreferences
were stale after the v3.0.0 API change). - Added a "Retries & Timeouts" section to the advanced example, documenting
timeout,retries, andretry_on.
🧹 CI
- Bumped
actions/checkoutandastral-sh/setup-uvto their latest
available major tags (v6) across all workflows to silence Node 20
deprecation warnings.
Processes v3.0.1
v3.0.1 — Email API Overhaul, Task Retries & Timeouts
⚠️ Breaking Changes
-
Removed
HTMLSMTPHandlerandhtml_mail_handler. Email alerting is now configured with two plain dataclasses passed toTask:SMTPConfig— SMTP transport settings (host, credentials, sender/recipients, TLS).HTMLEmailStyle— presentation settings (style, color palette, language, traced-vars frame filter).
Task(..., smtp_config=SMTPConfig(...), email_style=HTMLEmailStyle(style="modern", palette="catppuccin"))
✨ New Features
- Per-task timeouts:
Task(..., timeout=30)raisesTimeoutErrorif an attempt exceeds the limit. - Automatic retries:
Task(..., retries=3, retry_on=(ConnectionError, TimeoutError))retries failed attempts on the specified exception types (defaults toConnectionError/TimeoutError). - Structured exceptions:
DependencyNotFoundError,TaskNotFoundError, andCircularDependencyErrornow carry structured attributes (task_name,missing_dep) instead of plain messages. - Traced variables in error emails: failure emails include a "Traced Variables" section showing local variables at the relevant stack frame, with a configurable
traced_vars_frame_filterto target a specific module.
🔧 Refactoring
- Centralized failure-context extraction:
Task._resolve_argsandTask._build_failure_contextcleanly separate dependency-result injection from failure reporting. - Split traceback/frame-walking utilities (
_tb_utils.py) from email-rendering internals (_email_internals.py) — each module now has a single responsibility. - Each
Tasknow gets a unique per-instance logger, preventing handler leakage between tasks with the same name. - Minor cleanups in
Process: bareraisefor re-raised exceptions, extracted_is_done()helper for the parallel runner loop.
🐛 Bug Fixes
- Fixed a logging bug where
logger.exception(...)was called outside anexceptblock, resulting in empty exception details (None) in failure emails. Errors now log with fullexc_infoand a structuredtask_contextpayload. - Fixed
Task.run()not reporting the actual exception when retries were exhausted.
🧪 Testing & CI
- Migrated the test suite to a shared
BaseTestbase class with consistent per-test log directories and cleanup. - Added dedicated tests for timeout and retry behavior.
- Bumped GitHub Actions (
actions/checkout→ v6,astral-sh/setup-uv→ v6) to silence deprecation warnings.
Processes v2.0.1
v2.0.1 (2026-06-12)
Fix
- publish.yml: remove unneeded step ruff format check in quality-gate
v2.0.0 (2026-06-12)
Processes v2.0.0
v2.0.0 (2026-06-12)
BREAKING CHANGE
- log records no longer carry
post_traceback_html_body. Consumers introspecting that attribute
must readrecord.task_contextinstead.
Feat
- email_alerting: Traced Variables section with file:line reference in email body
- email_alerting: language alternatives for HTML email body
- email_alerting: template-driven HTML body from pure metadata
Fix
- process: parallel runner no longer raises on unrunnable tail