Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
1a4a592
Readd Confluent Kafka drivers
Dec 2, 2022
c20edbf
Merge branch 'master' into readd-confluent
wbarnha Dec 2, 2022
72160f0
add confluent as extra
Dec 2, 2022
0049b7d
remove "-python"
Dec 2, 2022
209472a
undo everything from that commit
Dec 2, 2022
b3f5eff
Merge branch 'master' into readd-confluent
wbarnha Dec 22, 2022
32d2019
Merge branch 'master' into readd-confluent
wbarnha Jan 13, 2023
537607a
Merge branch 'master' into readd-confluent
wbarnha Mar 2, 2023
8e349fc
use create_task for now
Mar 2, 2023
b2b448e
Merge branch 'master' into readd-confluent
wbarnha Mar 24, 2023
71f05f7
commit experiment
Mar 27, 2023
ee12f91
Merge branch 'master' into readd-confluent
Mar 30, 2023
1986415
Merge branch 'master' into readd-confluent
wbarnha Apr 7, 2023
cd82dc9
Merge branch 'master' into readd-confluent
wbarnha May 4, 2023
c508d3f
Merge branch 'master' into readd-confluent
wbarnha Jul 6, 2023
129f241
Merge branch 'master' into readd-confluent
wbarnha Jul 15, 2023
aaafed4
point to latest aio implementation in experimental branch
Jul 15, 2023
d495401
commit reorg
Jul 15, 2023
9501bce
now to figure out assignment...
Jul 15, 2023
3f2d11f
guess we'll figure this out some other day
Jul 15, 2023
5960fe1
Merge branch 'master' into readd-confluent
wbarnha Aug 18, 2023
eb323f2
Merge branch 'master' into readd-confluent
wbarnha Jul 16, 2026
5bdd8d3
Make confluent driver work with released confluent-kafka
wbarnha Jul 16, 2026
ba2b496
Rewrite confluent driver tests against the real driver API
wbarnha Jul 16, 2026
21994eb
Fix crash in confluent Consumer.create_topic with no retention
wbarnha Jul 16, 2026
a175c21
Skip confluent driver tests when confluent-kafka is not installed
wbarnha Jul 16, 2026
7ed39f5
Exclude optional confluent driver from coverage
wbarnha Jul 16, 2026
8f92542
Pin black and isort to keep CI lint reproducible
wbarnha Jul 16, 2026
10f0f58
Fix CI lint formatting drift in tests and aerospike store (#677)
wbarnha Jul 17, 2026
5a5a2e0
Merge branch 'master' into claude/pin-lint-versions
wbarnha Jul 17, 2026
b282d42
Guard formatter pins with a Python 3.10+ marker
wbarnha Jul 17, 2026
c3c4244
Merge pull request #680 from faust-streaming/claude/pin-lint-versions
wbarnha Jul 17, 2026
a9e3eab
Merge remote-tracking branch 'origin/master' into faust-679
wbarnha Jul 17, 2026
e5f5b43
Keep aiokafka (kafka://) as the default broker in the word_count example
wbarnha Jul 17, 2026
a413a74
Merge pull request #679 from faust-streaming/claude/faust-prs-sync-fi…
wbarnha Jul 17, 2026
3031196
fix(aiokafka): keep Faust assignor for changelog tables and update ad…
Mar 31, 2026
a26f83b
remove support for python3.9 and below
Apr 1, 2026
bb06adc
Fix release artifact upload/download for upload-artifact@v4 (#684)
wbarnha Jul 17, 2026
f85f28d
Add tests for functional/platforms/agent_stopper utils (real coverage)
wbarnha Jul 17, 2026
e4f9a3f
Guard aiokafka metadata/admin calls by protocol-API version
wbarnha Jul 17, 2026
28384bf
Merge branch 'master' into claude/aiokafka-changelog-assignor
wbarnha Jul 17, 2026
11834d8
Merge pull request #682 from faust-streaming/claude/aiokafka-changelo…
wbarnha Jul 18, 2026
0423868
Merge branch 'master' into claude/test-quick-wins
wbarnha Jul 18, 2026
f3019aa
Merge pull request #687 from faust-streaming/claude/test-quick-wins
wbarnha Jul 18, 2026
3073eb9
ci: test on Python 3.14 with and without Cython
claude Jul 18, 2026
c95a518
ci: add live-broker integration test harness (Kafka in CI) (#706)
wbarnha Jul 19, 2026
d95af52
Modernize CI: wheel runners, Windows wheels, and test matrix (drop 3.…
wbarnha Jul 19, 2026
ade8a09
docs: correct stale dependency and version references (#710)
wbarnha Jul 19, 2026
3f8e190
docs: prepare v0.12.0 release notes, changelog, and docs version (#708)
wbarnha Jul 19, 2026
dd0c896
docs: prepare v0.12.1 release notes and changelog
wbarnha Jul 19, 2026
411e6dd
ci: build sdist with `python -m build` for a PEP 625 filename (#712)
wbarnha Jul 19, 2026
5b6aff7
Merge branch 'master' into claude/release-v0.12.1-prep
wbarnha Jul 19, 2026
3c18394
Merge pull request #713 from faust-streaming/claude/release-v0.12.1-prep
wbarnha Jul 19, 2026
4fefb90
Merge tag 'v0.12.1' into merge-upstream-master-12
Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@ omit =
*/faust/assignor/*
*/faust/transport/drivers/memory.py

# optional driver: only importable/tested with the ckafka extra installed
# (faust[ckafka]); not part of the CI test environment.
*/faust/transport/drivers/confluent.py

# tested by integration
*/faust/tables/recovery.py

# not needed
*/faust/utils/functional.py
*/faust/utils/iso8601.py
*/faust/utils/platforms.py
*/faust/utils/tracing.py
*/faust/types/*
*/faust/__main__.py
Expand Down
138 changes: 122 additions & 16 deletions .github/workflows/python-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ env:
FORCE_COLOR: '1' # Make tools pretty.
PIP_DISABLE_PIP_VERSION_CHECK: '1'
PIP_NO_PYTHON_VERSION_WARNING: '1'
PYTHON_LATEST: '3.13'
PYTHON_LATEST: '3.12'
jobs:
lint:
name: Check linting
Expand Down Expand Up @@ -42,7 +42,7 @@ jobs:
# for example if a test fails only when Cython is enabled
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13']
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
use-cython: ['true', 'false']
experimental: [false]
env:
Expand All @@ -67,6 +67,105 @@ jobs:
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
test-pypy:
name: 'Python pypy3.11/Cython: false'
runs-on: ubuntu-latest
timeout-minutes: 10
continue-on-error: true
env:
USE_CYTHON: 'false'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: pypy3.11
cache: pip
cache-dependency-path: requirements/test.txt
- name: Install dependencies
id: install
continue-on-error: true
run: |
pip install -r requirements/test.txt
pip install .
- name: Run tests
if: steps.install.outcome == 'success'
run: scripts/tests
- name: Enforce coverage
if: steps.install.outcome == 'success'
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
test-integration:
name: 'Integration (Kafka ${{ matrix.kafka-version }})'
runs-on: ubuntu-latest
timeout-minutes: 10
# Advisory for now: broker tests can be flaky while we stabilise them, so
# a red here must not block the required checks / the merge queue. This
# job is intentionally NOT in the `check` job's `needs`.
continue-on-error: true
strategy:
fail-fast: false
matrix:
kafka-version: ['3.8.1']
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: pip
cache-dependency-path: requirements/test.txt
# Run Kafka as a plain container (not a GH `services:` container) so its
# very chatty broker log stays inside the container -- retrievable on
# demand via `docker logs` -- and the job log shows the pytest output.
- name: Start Kafka (KRaft, single node)
run: |
docker run -d --name kafka -p 9092:9092 \
-e KAFKA_NODE_ID=1 \
-e KAFKA_PROCESS_ROLES=broker,controller \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
-e KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
-e KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 \
-e KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 \
-e KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=0 \
-e KAFKA_AUTO_CREATE_TOPICS_ENABLE=true \
apache/kafka:${{ matrix.kafka-version }}
- name: Install dependencies
run: |
pip install -r requirements/test.txt
pip install -r requirements/extras/ckafka.txt
pip install .
- name: Wait for Kafka to be ready
run: |
python - <<'PY'
import socket, time, sys
deadline = time.monotonic() + 120
while time.monotonic() < deadline:
try:
with socket.create_connection(("localhost", 9092), 2):
print("Kafka port is open")
break
except OSError:
time.sleep(2)
else:
sys.exit("Kafka did not become reachable in time")
PY
- name: Run live-broker integration tests
env:
FAUST_TEST_BROKER: 'kafka://localhost:9092'
run: pytest tests/integration/broker -v -ra --tb=short --no-cov
# Only the tail of the broker log on failure, so it augments rather than
# buries the pytest output in the job log.
- name: Kafka broker logs (on failure)
if: failure()
run: docker logs --tail 40 kafka
check: # This job does nothing and is only used for the branch protection
name: ✅ Ensure the required checks passing
if: always()
Expand All @@ -84,17 +183,22 @@ jobs:
if: github.event_name == 'release' && github.event.action == 'created'
strategy:
matrix:
os: [ubuntu-20.04, macos-13, macos-14]
# Modern, supported runner images (ubuntu-20.04 was retired in 2025).
# macos-15-intel -> x86_64 wheels, macos-14 -> arm64 wheels,
# windows-2022 -> AMD64 wheels. Build config lives in
# pyproject.toml's [tool.cibuildwheel] (cp3*, auto64, Cython).
os: [ubuntu-latest, macos-15-intel, macos-14, windows-2022]
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build wheels
uses: pypa/cibuildwheel@v2.10.1
uses: pypa/cibuildwheel@v2.21.3
- uses: actions/upload-artifact@v4
with:
name: wheel-artifacts
name: cibw-wheels-${{ matrix.os }}
path: ./wheelhouse/*.whl
if-no-files-found: error
build_sdist:
name: 📦 Build the source distribution
runs-on: ubuntu-latest
Expand All @@ -107,14 +211,19 @@ jobs:
fetch-depth: 0
- uses: actions/setup-python@v5
- name: Build sdist
# Use `python -m build`, not the deprecated `setup.py sdist`, so the
# sdist is named with the normalized project name
# (`faust_streaming-*.tar.gz`). PyPI enforces PEP 625 and rejects the
# legacy hyphenated `faust-streaming-*.tar.gz`.
run: >
pip3 install pkgconfig cython --upgrade &&
python3 setup.py sdist
pip3 install build pkgconfig cython --upgrade &&
python3 -m build --sdist --outdir dist
- uses: actions/upload-artifact@v4
name: Upload build artifacts
with:
name: sdist-artifact
name: cibw-sdist
path: dist/*.tar.gz
if-no-files-found: error
publish:
name: 📦 Publish to PyPI
runs-on: ubuntu-latest
Expand All @@ -124,17 +233,14 @@ jobs:
environment: pypi
if: github.event_name == 'release' && github.event.action == 'created'
steps:
- name: Download the sdist artifact
uses: actions/download-artifact@v4.1.7
- name: Download all build artifacts (sdist + every wheel)
uses: actions/download-artifact@v4
with:
name: sdist-artifact
path: dist
- name: Download the wheel artifact
uses: actions/download-artifact@v4.1.7
with:
pattern: "*artifact*"
pattern: cibw-*
merge-multiple: true
path: dist
- name: Publish package to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
skip-existing: true
67 changes: 67 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,73 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

<!--
This changelog was dormant between v0.9.0 and v0.11.3; those releases are
documented in their GitHub release notes at
https://github.com/faust-streaming/faust/releases. The v0.12.0 entry below
resumes the Keep a Changelog format.
-->

## [v0.12.1](https://github.com/faust-streaming/faust/releases/tag/v0.12.1) - 2026-07-19

[Compare with v0.12.0](https://github.com/faust-streaming/faust/compare/v0.12.0...v0.12.1)

Packaging-only patch release. v0.12.0's wheels published to PyPI, but its source
distribution was rejected under [PEP 625](https://peps.python.org/pep-0625/);
this release fixes the sdist filename so the full set of artifacts publishes.

### Fixed
- Build the source distribution with `python -m build` and a PEP 625-compliant
(normalized) filename — `faust_streaming-<version>.tar.gz` instead of the
legacy `faust-streaming-<version>.tar.gz` that PyPI now rejects (#712).

## [v0.12.0](https://github.com/faust-streaming/faust/releases/tag/v0.12.0) - 2026-07-19

[Compare with v0.11.3](https://github.com/faust-streaming/faust/compare/v0.11.3...v0.12.0)

<!--
Scope: this entry lists only work already merged to `master`. Fixes and
features still in open PRs (e.g. the offset-commit data-loss fixes, the
optional OpenTracing/OpenTelemetry extras, and the reported-issue fix stack)
will be added here as they merge.
-->

### Added
- Re-add the confluent-kafka transport driver (`confluent://`, install with the
`faust[ckafka]` extra), rewritten and tested against the released
`confluent-kafka` API.
- Support Python 3.13 and 3.14 (tested with and without the Cython extensions).
- `on_clear` handlers on `(Global)Table` and `ChangeloggedSet` (#645).
- Live-broker integration test harness: CI now starts a real Kafka broker and
round-trips messages through both the aiokafka and confluent-kafka client
libraries (#706).

### Changed
- **Dropped support for Python 3.8 and 3.9** (#650); the minimum supported
version is now Python 3.10.
- Replaced the unmaintained `aredis` with `redis-py` for the Redis store and
leader (#635).
- Support recent `aiokafka` releases: handle 0.13.0 removing the `api_version`
parameter (#674), and guard aiokafka metadata/admin calls by the negotiated
protocol-API version while keeping the Faust partition assignor for changelog
tables (#682).
- Modernize CI and wheel building: updated wheel runners, Windows wheels, a
refreshed `cibuildwheel`, and an updated test matrix (#690).
- Pin `black`/`isort` and update the `click` constraint for reproducible CI
(#677, #680).

### Fixed
- Fix release-artifact upload/download for `upload-artifact@v4` (#684).

### Dependencies
- Runs on the maintained mode fork `mode-streaming >= 0.4.0`.
- `aiokafka >= 0.10.0`, now compatible with recent aiokafka releases
(0.13.x / 0.14.x) — see #674 and #682.
- Adds `confluent-kafka >= 2.0.0`, required by the optional `faust[ckafka]`
transport driver.
- The `faust[cchardet]` extra now uses the maintained `faust-cchardet` fork in
place of the unmaintained `cchardet`.

## [v0.8.10](https://github.com/faust-streaming/faust/releases/tag/v0.8.10) - 2022-09-14

[Compare with v0.8.9](https://github.com/faust-streaming/faust/compare/v0.8.9...v0.8.10)
Expand Down
33 changes: 33 additions & 0 deletions RELEASE_NOTES_v0.12.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# faust-streaming 0.12.1

Packaging-only patch release, dated 2026-07-19.

## Why this release

v0.12.0's **wheels** published to PyPI successfully, but its **source
distribution** upload was rejected:

```
400 Filename 'faust-streaming-0.12.0.tar.gz' is invalid,
should be 'faust_streaming-0.12.0.tar.gz'.
```

PyPI now enforces [PEP 625](https://peps.python.org/pep-0625/), which requires
the sdist filename to use the *normalized* project name (underscores). The
release job built the sdist with the deprecated `setup.py sdist` under an old
setuptools, producing the legacy hyphenated name.

## Fixed

- Build the source distribution with `python -m build` and raise the
`[build-system]` setuptools floor to `>=69`, so the sdist is named
`faust_streaming-<version>.tar.gz` and PyPI accepts it (#712).

## Upgrade notes

There are **no code changes** in this release — it is functionally identical to
v0.12.0. It exists only so the source distribution is available on PyPI (e.g.
for consumers that build from sdist). If you install from wheels, v0.12.0 and
v0.12.1 are equivalent.

**Full changelog:** https://github.com/faust-streaming/faust/compare/v0.12.0...v0.12.1
15 changes: 12 additions & 3 deletions docs/conf.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
# -*- coding: utf-8 -*-
import sys
from contextlib import suppress

import faust
from sphinx_celery import conf

extensions = [] # set by build_config
sys.path.append('.')

# Derive the documented version (major.minor) from the installed package, which
# setuptools_scm resolves from the git tag. Keeping this dynamic means the
# published docs always report the real version instead of a hardcoded string
# that silently goes stale between releases.
_docs_version = '.'.join(faust.__version__.lstrip('v').split('.')[:2])

globals().update(conf.build_config(
'faust', __file__,
project='Faust',
version_dev='1.1',
version_stable='1.0',
version_dev=_docs_version,
version_stable=_docs_version,
canonical_url='https://faust-streaming.github.io/faust',
webdomain='',
github_project='faust-streaming/faust',
copyright='2017-2020, 2021-2022 Community',
copyright='2017-2020, 2021-2026 Community',
html_logo='images/logo.png',
html_favicon='images/favicon.ico',
html_prepend_sidebars=[],
Expand Down Expand Up @@ -54,6 +62,7 @@
'faust.cli',
'faust.models',
'faust.serializers',
'faust.transport.drivers.confluent',
'faust.types',
'faust.types._env',
'faust.utils',
Expand Down
2 changes: 2 additions & 0 deletions docs/copyright.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ Copyright

Copyright |copy| 2017-2020, Robinhood Markets, Inc.

Copyright |copy| 2021-2026, the faust-streaming project.

All rights reserved. This material may be copied or distributed only
subject to the terms and conditions set forth in the `Creative Commons
Attribution-ShareAlike 4.0 International`
Expand Down
Loading
Loading