Skip to content

Commit 149c7c3

Browse files
thomas-manginclaude
andcommitted
Drop Python 3.10/3.11 support, require Python 3.12+
- Update requires-python to >=3.12 (no upper bound) - Add Python 3.14 to classifiers and CI test matrix - Update GitHub workflows: unit-testing, functional-testing, release - Update documentation: README.md, CLAUDE.md, .claude/ protocols - mypy now targets Python 3.12 This enables use of Python 3.12+ features like buffer protocol improvements for future zero-copy parsing optimizations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent c495ccc commit 149c7c3

File tree

12 files changed

+24
-26
lines changed

12 files changed

+24
-26
lines changed

.claude/CI_TESTING.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,5 @@ killall -9 Python # macOS uses capital P
6060
All must pass:
6161
- Linting (Python 3.12)
6262
- Type checking (Python 3.12)
63-
- Unit tests (Python 3.10-3.13)
64-
- Functional tests (Python 3.10-3.13)
63+
- Unit tests (Python 3.12-3.14)
64+
- Functional tests (Python 3.12-3.14)

.claude/CODING_STANDARDS.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@
3131

3232
---
3333

34-
## Python 3.10+ Compatibility (MANDATORY)
34+
## Python 3.12+ Compatibility (MANDATORY)
3535

3636
### Type Annotations
3737

38-
ExaBGP 6.0 requires Python 3.10+, enabling modern type annotation syntax:
38+
ExaBGP 6.0 requires Python 3.12+, enabling modern type annotation syntax:
3939

40-
**CORRECT (Python 3.10+ style - preferred):**
40+
**CORRECT (Python 3.12+ style - preferred):**
4141
```python
4242
def func(x: int | str) -> bool | None:
4343
data: dict[str, list[int]] = {}
@@ -273,7 +273,7 @@ return cast(int, untrusted_value)
273273

274274
## Quick Checklist
275275

276-
- [ ] Python 3.10+ syntax (prefer `int | str` over `Union[int, str]`)
276+
- [ ] Python 3.12+ syntax (prefer `int | str` over `Union[int, str]`)
277277
- [ ] Avoid `| None` class attributes when possible
278278
- [ ] Fix type errors at root cause, avoid `# type: ignore`
279279
- [ ] Only use `cast()` when preceded by runtime type check (isinstance/hasattr)

.claude/ESSENTIAL_PROTOCOLS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,10 @@ uv run pytest tests/unit/path/to/test.py -v # Should FAIL
213213

214214
### 4. Coding Standards
215215

216-
**Core principle:** Python 3.10+, strict mypy, stable BGP APIs
216+
**Core principle:** Python 3.12+, strict mypy, stable BGP APIs
217217

218218
**Required:**
219-
- Python 3.10+ syntax: `int | str` NOT `Union[int, str]`
219+
- Python 3.12+ syntax: `int | str` NOT `Union[int, str]`
220220
- NO code requiring mypy config changes
221221
- BGP APIs: keep `negotiated` parameter (stable API, unused OK)
222222
- Fix type errors at root cause, avoid `# type: ignore`

.claude/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ This single file contains core rules that apply to ALL interactions:
1616
- Verification before claiming success
1717
- Communication style (terse, emoji-prefixed)
1818
- Testing requirements (./qa/bin/test_everything)
19-
- Coding standards essentials (Python 3.10+, mypy)
19+
- Coding standards essentials (Python 3.12+, mypy)
2020
- Session start workflow
2121
- Contextual protocol loading guide
2222

.github/workflows/container.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ on:
55
workflows:
66
- "Unit Testing"
77
- "Linting"
8-
- "Testing (Python 3.8 to 3.12)"
8+
- "Testing (Python 3.12+)"
99
branches:
1010
- "main"
1111
- "5.0"

.github/workflows/functional-testing.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Testing (Python 3.10 to 3.13)
1+
name: Testing (Python 3.12+)
22

33
on:
44
push:
@@ -16,7 +16,7 @@ jobs:
1616
strategy:
1717
fail-fast: false
1818
matrix:
19-
python-version: ["3.10", "3.11", "3.12", "3.13"]
19+
python-version: ["3.12", "3.13", "3.14"]
2020
os: ["ubuntu-latest"]
2121

2222
steps:

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ jobs:
1818
with:
1919
fetch-depth: 0
2020

21-
- name: Set up Python 3.8
21+
- name: Set up Python 3.12
2222
uses: actions/setup-python@v6
2323
with:
24-
python-version: 3.8
24+
python-version: "3.12"
2525
# - name: Build
2626
# run: |
2727
# make init build

.github/workflows/unit-testing.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
strategy:
2020
fail-fast: false
2121
matrix:
22-
python-version: ["3.10", "3.11", "3.12", "3.13"]
22+
python-version: ["3.12", "3.13", "3.14"]
2323
os: ["ubuntu-latest"]
2424

2525
steps:

CLAUDE.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ exabgp_reactor_asyncio=true ./sbin/exabgp config.conf
363363

364364
## Key Requirements
365365

366-
**Python 3.10+ ONLY:**
366+
**Python 3.12+ ONLY:**
367367
- Prefer `int | str` over `Union[int, str]`
368368
- Prefer `str | None` over `Optional[str]`
369369
- See `.claude/CODING_STANDARDS.md`
@@ -404,7 +404,7 @@ Before declaring success:
404404
- [ ] `git status` reviewed
405405
- [ ] Plan files updated (if working on a plan)
406406
- [ ] User approval for commit/push
407-
- [ ] Python 3.10+ syntax
407+
- [ ] Python 3.12+ syntax
408408
- [ ] No asyncio introduced
409409

410410
Before ending session:

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,11 +354,11 @@ Documentation contributions are genuinely welcomed! Even small improvements help
354354

355355
### Requirements
356356

357-
- **Python 3.10+** required for ExaBGP 6.0 (supports versions 3.10 through 3.13)
357+
- **Python 3.12+** required for ExaBGP 6.0 (supports versions 3.12, 3.13, 3.14)
358358
- **No asyncio**: Uses custom reactor pattern predating asyncio adoption
359359
- **Compatibility**: Focus on reliability over adopting latest Python features
360360

361-
**Version 3.x** supported Python 2 only. **Version 4.x** introduced Python 3 support while maintaining Python 2 compatibility (minimum: Python 3.6). **Version 5.0** requires Python 3.8 or later. **Version 6.0** requires Python 3.10 or later, enabling use of modern type annotation syntax (`int | str` unions) and other language improvements.
361+
**Version 3.x** supported Python 2 only. **Version 4.x** introduced Python 3 support while maintaining Python 2 compatibility (minimum: Python 3.6). **Version 5.0** requires Python 3.8 or later. **Version 6.0** requires Python 3.12 or later, enabling use of modern type annotation syntax, buffer protocol improvements, and other language features.
362362

363363
ExaBGP is nearly as old as Python 3. A lot has changed since 2009; the application does not use Python 3's async-io (as we run a homemade async core engine). It may never do as development slowed, and our primary goal is ensuring reliability for current and new users.
364364

0 commit comments

Comments
 (0)