Skip to content

Commit 361bb63

Browse files
authored
Merge branch 'main' into docs/fix-comparison-type-claims
2 parents edc9fdd + 1bb9953 commit 361bb63

34 files changed

Lines changed: 131 additions & 897 deletions

‎.github/workflows/ci.yml‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ jobs:
6464
strategy:
6565
fail-fast: false
6666
matrix:
67-
python-version: ${{ github.event_name == 'push' && fromJSON('["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]') || fromJSON('["3.12"]') }}
67+
python-version: ${{ github.event_name == 'push' && fromJSON('["3.10", "3.11", "3.12", "3.13", "3.14"]') || fromJSON('["3.12"]') }}
6868

6969
steps:
7070
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
@@ -161,11 +161,12 @@ jobs:
161161

162162
- name: Scan Python dependencies for CVEs
163163
run: |
164-
# GHSA-5239-wwwm-4pmq: pygments ReDoS in AdlLexer (dev-only, no fix available)
165-
# GHSA-58qw-9mgm-455v: pip tar/zip confusion (pip itself, no fix available)
166-
uv run pip-audit --desc \
167-
--ignore-vuln GHSA-5239-wwwm-4pmq \
168-
--ignore-vuln GHSA-58qw-9mgm-455v
164+
# No suppressions: every prior CVE is resolved at source on the py3.10+
165+
# resolution. urllib3>=2.7.0 and pip>=26.1.2 are pinned via
166+
# [tool.uv] constraint-dependencies; pygments/pyarrow advisories cleared
167+
# by their py3.10+ fix versions. Keep this list IDENTICAL to
168+
# security-fast.yml's pip-audit so the two cannot drift.
169+
uv run pip-audit --desc
169170
170171
- name: Run markdown documentation tests
171172
run: make test-docs-examples

‎.github/workflows/release-please.yml‎

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,26 @@ jobs:
8484
strategy:
8585
matrix:
8686
include:
87-
# Linux builds - must specify interpreters explicitly (manylinux has 3.8+ but we support 3.9+)
87+
# Linux builds - must specify interpreters explicitly (manylinux has 3.8+ but we support 3.10+)
8888
- os: ubuntu-latest
8989
target: x86_64-unknown-linux-gnu
90-
interpreter: -i python3.9 -i python3.10 -i python3.11 -i python3.12 -i python3.13
90+
interpreter: -i python3.10 -i python3.11 -i python3.12 -i python3.13
9191
# macOS/Windows - must specify interpreters explicitly (auto-discovery unreliable)
9292
- os: macos-latest
9393
target: x86_64-apple-darwin
94-
interpreter: -i python3.9 -i python3.10 -i python3.11 -i python3.12 -i python3.13
94+
interpreter: -i python3.10 -i python3.11 -i python3.12 -i python3.13
9595
- os: macos-latest
9696
target: aarch64-apple-darwin
97-
interpreter: -i python3.9 -i python3.10 -i python3.11 -i python3.12 -i python3.13
97+
interpreter: -i python3.10 -i python3.11 -i python3.12 -i python3.13
9898
- os: windows-latest
9999
target: x86_64-pc-windows-msvc
100-
interpreter: -i python3.9 -i python3.10 -i python3.11 -i python3.12 -i python3.13
100+
interpreter: -i python3.10 -i python3.11 -i python3.12 -i python3.13
101101
# aarch64 Linux cross-compilation - must specify Python versions explicitly
102102
# (cross containers don't have discoverable Python interpreters)
103103
# Uses manylinux_2_28 for modern GCC (fixes ring crate aarch64 build)
104104
- os: ubuntu-latest
105105
target: aarch64-unknown-linux-gnu
106-
interpreter: -i python3.9 -i python3.10 -i python3.11 -i python3.12 -i python3.13
106+
interpreter: -i python3.10 -i python3.11 -i python3.12 -i python3.13
107107
manylinux: "2_28"
108108
runs-on: ${{ matrix.os }}
109109
steps:
@@ -119,7 +119,6 @@ jobs:
119119
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
120120
with:
121121
python-version: |
122-
3.9
123122
3.10
124123
3.11
125124
3.12

‎.github/workflows/security-fast.yml‎

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,12 @@ jobs:
8787
8888
- name: Run pip-audit
8989
run: |
90-
# Dev-only transitive CVEs — no runtime impact, fixes require py3.10+ (we support 3.9)
91-
# GHSA-5239-wwwm-4pmq: pygments ReDoS in AdlLexer (dev-only, no fix available)
92-
# GHSA-58qw-9mgm-455v: pip tar/zip confusion (pip itself, no fix available)
93-
# GHSA-jp4c-xjxw-mgf9: pip self-update import ordering (fix requires py3.10+)
94-
# GHSA-qccp-gfcp-xxvc: urllib3 cross-origin header leak (dev dep via uv sync; runtime uses httpx, fix 2.7.0 requires py3.10+)
95-
# GHSA-mf9v-mfxr-j63j: urllib3 decompression bomb (dev dep via uv sync; runtime uses httpx, fix 2.7.0 requires py3.10+)
96-
# PYSEC-2026-113: pyarrow C++ IPC pre-buffer UAF (PreBufferMetadata not exposed to Python bindings per advisory)
97-
uv run pip-audit --desc --format json --output pip-audit-report.json \
98-
--ignore-vuln GHSA-5239-wwwm-4pmq \
99-
--ignore-vuln GHSA-58qw-9mgm-455v \
100-
--ignore-vuln GHSA-jp4c-xjxw-mgf9 \
101-
--ignore-vuln GHSA-qccp-gfcp-xxvc \
102-
--ignore-vuln GHSA-mf9v-mfxr-j63j \
103-
--ignore-vuln PYSEC-2026-113
90+
# No suppressions: every prior CVE is resolved at source on the py3.10+
91+
# resolution. urllib3>=2.7.0 and pip>=26.1.2 are pinned via
92+
# [tool.uv] constraint-dependencies; pygments/pyarrow advisories cleared
93+
# by their py3.10+ fix versions. Keep this list IDENTICAL to ci.yml's
94+
# post-merge pip-audit so the two cannot drift.
95+
uv run pip-audit --desc --format json --output pip-audit-report.json
10496
10597
- name: Upload report
10698
if: always()

‎.secrets.baseline‎

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎CONTRIBUTING.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ This project follows a standard code of conduct. Please be respectful and profes
1010

1111
### Prerequisites
1212

13-
- Python 3.9 or higher
13+
- Python 3.10 or higher
1414
- Rust 1.80 or higher
1515
- Redis 5.0 or higher (for testing)
1616
- [uv](https://github.com/astral-sh/uv) (recommended for dependency management)
@@ -80,7 +80,7 @@ This project follows a standard code of conduct. Please be respectful and profes
8080
- **Linter**: Ruff (runs automatically with `make lint`)
8181
- **Type checker**: basedpyright (standard mode, zero errors enforced)
8282
- **Type hints**: Required for all public APIs
83-
- **Python 3.9+ compatibility**: Use `from __future__ import annotations` for modern union syntax
83+
- **Python 3.10+ compatibility**: Use `from __future__ import annotations` for modern union syntax
8484
- **Docstrings**: Google style for public functions/classes
8585
- **Imports**: Absolute imports only
8686

‎Cargo.lock‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ See [CONTRIBUTING.md][contributing-url] for full development guidelines.
405405

406406
| Component | Version |
407407
|:----------|:--------|
408-
| Python | 3.9+ |
408+
| Python | 3.10+ |
409409

410410
---
411411

‎basedpyright.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"reportUnnecessaryCast": "warning",
3131
"reportUnnecessaryComparison": "warning",
3232

33-
"pythonVersion": "3.9",
33+
"pythonVersion": "3.10",
3434
"pythonPlatform": "Linux",
3535

3636
"stubPath": "typings",

‎docs/api-reference.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ def typed_function(data: dict[str, Any]) -> str | int | None:
782782
return process_data(data)
783783
```
784784

785-
**Type Safety**: The library uses `from __future__ import annotations` for Python 3.9+ compatibility, enabling modern union syntax (`X | Y`) while maintaining backward compatibility.
785+
**Type Safety**: The library uses `from __future__ import annotations` for Python 3.10+ compatibility, enabling modern union syntax (`X | Y`) while maintaining backward compatibility.
786786

787787
## Monitoring and Observability
788788

‎pyproject.toml‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ classifiers = [
3636
"License :: OSI Approved :: MIT License",
3737
"Operating System :: OS Independent",
3838
"Programming Language :: Python :: 3",
39-
"Programming Language :: Python :: 3.9",
4039
"Programming Language :: Python :: 3.10",
4140
"Programming Language :: Python :: 3.11",
4241
"Programming Language :: Python :: 3.12",
@@ -51,7 +50,7 @@ classifiers = [
5150
"Framework :: AsyncIO",
5251
"Typing :: Typed",
5352
]
54-
requires-python = ">=3.9"
53+
requires-python = ">=3.10"
5554
dependencies = [
5655
# Core Redis functionality
5756
"redis[hiredis]>=4.0.0",
@@ -101,7 +100,7 @@ include = ["LICENSE", "README.md"]
101100
# Ruff configuration
102101
[tool.ruff]
103102
line-length = 129
104-
target-version = "py39"
103+
target-version = "py310"
105104

106105
[tool.ruff.lint]
107106
select = [
@@ -237,7 +236,11 @@ fuzz = [
237236
# Override vulnerable transitive dependencies
238237
[tool.uv]
239238
constraint-dependencies = [
240-
"urllib3>=2.6.0",
239+
"urllib3>=2.7.0",
241240
"fonttools>=4.60.2",
242241
"werkzeug>=3.1.4",
242+
# pip is a dev-only transitive dep (pip-audit -> pip-api -> pip). 26.1.2 fixes
243+
# PYSEC-2026-196 (entry-point path traversal), GHSA-58qw-9mgm-455v (tar/zip
244+
# confusion) and GHSA-jp4c-xjxw-mgf9 (self-update import ordering).
245+
"pip>=26.1.2",
243246
]

0 commit comments

Comments
 (0)