Commit 7a2c291
feat: add Python 3.14 support (#250)
# Summary
Adds Python 3.14 to the supported/runtime-tested versions for Plugboard
and aligns dependency floors with the releases needed for working 3.14
compatibility across the project and Ray-backed tests. CI and release
workflows are updated so packaging and validation run against the
expanded version set, and the Ray resource integration test is updated
to avoid depending on the dashboard HTTP API in CI.
# Changes
- **Project metadata**
- Adds the Python 3.14 Trove classifier.
- Keeps the existing `requires-python >=3.12,<4.0` range and updates
dependency floors needed for 3.14:
- `msgspec[yaml] >= 0.20`
- `pydantic >= 2.13.1`
- Ray optional/test dependencies moved to `ray[tune] >= 2.55.0`
- **CI / release pipelines**
- Extends the main lint/test/build matrix to include Python 3.14.
- Moves single-version workflows that build/publish artifacts to Python
3.14:
- docs
- docker
- PyPI publish
- Updates benchmarks to run on 3.14 so perf coverage tracks the newest
supported interpreter.
- **Lockfile refresh**
- Regenerates `uv.lock` for the new dependency constraints and trims
packages that were only pulled in by `ray[default]`.
- **Python 3.14 Ray compatibility**
- Fixes the Python 3.14 Ray test failures caused by `ray 2.55.0`
resolving against an older `pydantic.v1` compatibility layer.
- Bumps the workspace Pydantic floor in both `plugboard` and
`plugboard-schemas` so Ray state/dashboard imports and `ray.init()` work
correctly on Python 3.14.
- **Test harness compatibility**
- Replaces the removed `asyncio.events.BaseDefaultEventLoopPolicy`
annotation in `tests/conftest.py` with a Python-3.14-safe event loop
policy fixture.
- Updates `tests/integration/test_component_resources.py` to verify Ray
actor creation and resource reservation using Ray core APIs instead of
`ray.util.state.list_actors()`, avoiding flaky failures when the
dashboard API on port `8265` is unavailable in CI.
```toml
classifiers = [
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
]
dependencies = [
"msgspec[yaml]>=0.20,<1",
"pydantic>=2.13.1,<3",
]
[project.optional-dependencies]
ray = ["ray[tune]>=2.55.0,<3", "jsonschema<4.25.0", "optuna>=3.0,<5"]
```
> [!WARNING]
>
> Ray 2.55.0 Python 3.14 support depends on resolving to a new enough
`pydantic.v1` compatibility layer. This PR raises the Pydantic floor
accordingly to avoid Ray startup and state API failures on Python 3.14.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: toby-coleman <13170610+toby-coleman@users.noreply.github.com>
Co-authored-by: Toby Coleman <toby@tobycoleman.com>1 parent 2c24e5f commit 7a2c291
10 files changed
Lines changed: 177 additions & 133 deletions
File tree
- .github/workflows
- plugboard-schemas
- tests
- integration
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| |||
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
83 | | - | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
| 22 | + | |
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| |||
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
81 | | - | |
| 81 | + | |
82 | 82 | | |
83 | 83 | | |
84 | 84 | | |
| |||
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
119 | | - | |
| 119 | + | |
120 | 120 | | |
121 | 121 | | |
122 | 122 | | |
| |||
161 | 161 | | |
162 | 162 | | |
163 | 163 | | |
164 | | - | |
| 164 | + | |
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
| |||
201 | 201 | | |
202 | 202 | | |
203 | 203 | | |
204 | | - | |
| 204 | + | |
205 | 205 | | |
206 | 206 | | |
207 | 207 | | |
| |||
231 | 231 | | |
232 | 232 | | |
233 | 233 | | |
234 | | - | |
| 234 | + | |
235 | 235 | | |
236 | 236 | | |
237 | 237 | | |
| |||
277 | 277 | | |
278 | 278 | | |
279 | 279 | | |
280 | | - | |
| 280 | + | |
281 | 281 | | |
282 | 282 | | |
283 | 283 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
| 22 | + | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
27 | | - | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
31 | | - | |
| 32 | + | |
| 33 | + | |
32 | 34 | | |
33 | 35 | | |
34 | 36 | | |
| |||
49 | 51 | | |
50 | 52 | | |
51 | 53 | | |
52 | | - | |
| 54 | + | |
53 | 55 | | |
54 | 56 | | |
55 | 57 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | 4 | | |
6 | 5 | | |
7 | 6 | | |
| |||
10 | 9 | | |
11 | 10 | | |
12 | 11 | | |
13 | | - | |
14 | 12 | | |
15 | 13 | | |
16 | 14 | | |
| |||
23 | 21 | | |
24 | 22 | | |
25 | 23 | | |
26 | | - | |
| 24 | + | |
27 | 25 | | |
28 | 26 | | |
29 | 27 | | |
| |||
44 | 42 | | |
45 | 43 | | |
46 | 44 | | |
47 | | - | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
| 94 | + | |
94 | 95 | | |
95 | 96 | | |
96 | 97 | | |
97 | 98 | | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
103 | | - | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
104 | 111 | | |
105 | 112 | | |
106 | 113 | | |
| |||
0 commit comments