Skip to content

Commit 48f97d0

Browse files
derek73claude
andauthored
Promote Python 3.15 to a blocking CI target (#259) (#642)
3.15.0 final is out: the build matrix's 3.15 row drops continue-on-error and allow-prereleases, and pyproject gains the 3.15 classifier. ja-extra runs on 3.11 and 3.15, covering both of uv.lock's numpy/scipy branches; numpy, scipy, pandas and regex were bumped to versions with cp315 wheels. CONTRIBUTING.md points at the matrix instead of restating its range. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 4455962 commit 48f97d0

5 files changed

Lines changed: 332 additions & 252 deletions

File tree

‎.github/workflows/python-package.yml‎

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ jobs:
2121
fail-fast: false
2222
matrix:
2323
python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"]
24-
# 3.15 is pre-release until 2026-10-01 (#259): surface breakage
25-
# without blocking the branch; flip to blocking when it goes final.
26-
continue-on-error: ${{ matrix.python-version == '3.15' }}
2724
env:
2825
# Without this, uv sync honors .python-version (3.11) over the
2926
# matrix interpreter and every job silently tests 3.11.
@@ -45,7 +42,6 @@ jobs:
4542
uses: actions/setup-python@v7
4643
with:
4744
python-version: ${{ matrix.python-version }}
48-
allow-prereleases: true
4945
- name: Install uv
5046
uses: astral-sh/setup-uv@v7
5147
with:
@@ -84,18 +80,25 @@ jobs:
8480
# without it).
8581
ja-extra:
8682
runs-on: ubuntu-latest
87-
# 3.14, not the matrix's newest: namedivider-python pulls lightgbm,
88-
# which pulls scipy/numpy, and those have no 3.15 wheels yet (the
89-
# sdist build fails). 3.15 is pre-release and this matrix is ahead
90-
# of the ecosystem; revisit when it goes final.
83+
# The floor and the newest Python whose wheels the lock pins: uv.lock
84+
# splits numpy and scipy at 3.12, so the floor is the only row that
85+
# installs the older branch. namedivider-python's compiled
86+
# dependencies (numpy, scipy, pandas, regex; lightgbm is py3-none)
87+
# had no cp315 wheels at the versions uv.lock pinned before #259,
88+
# and numpy's and scipy's sdist builds fail, so moving the top row to
89+
# a new Python can need a lock bump first.
90+
strategy:
91+
fail-fast: false
92+
matrix:
93+
python-version: ["3.11", "3.15"]
9194
env:
92-
UV_PYTHON: "3.14"
95+
UV_PYTHON: ${{ matrix.python-version }}
9396
steps:
9497
- uses: actions/checkout@v7
95-
- name: Set up Python 3.14
98+
- name: Set up Python ${{ matrix.python-version }}
9699
uses: actions/setup-python@v7
97100
with:
98-
python-version: "3.14"
101+
python-version: ${{ matrix.python-version }}
99102
- name: Install uv
100103
uses: astral-sh/setup-uv@v7
101104
with:

‎CONTRIBUTING.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ You can also pass a name string to see how it will be parsed:
4141
]>
4242
Initials: H. R.
4343

44-
CI runs tests against Python 3.10–3.14 via GitHub Actions on every push and pull request.
44+
CI runs tests against every supported Python version (see the matrix in `.github/workflows/python-package.yml`) via GitHub Actions on every push and pull request.
4545

4646
Writing Tests
4747
----------------

‎docs/release_log.rst‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ Release Log
8888

8989
**Additions**
9090

91+
- **Add Python 3.15 support.** Python 3.15 is now tested as a regular CI target and listed in the package classifiers. (closes #259)
92+
9193
- **Add Lexicon.conjunctions_ambiguous, the one-letter connectives that read as initials.** A subset of ``conjunctions`` holding ``e`` and ``i`` by default; it is the knob for the change above rather than a switch. Portuguese data, where ``e`` links surnames the way ``y`` does in Spanish, takes it out: ``Lexicon.default().remove(conjunctions_ambiguous={"e"})`` restores the joining reading. Dutch data, where a bare single letter is an initial and never a connective, adds the other one: ``Lexicon.default().add(conjunctions_ambiguous={"y"})``. A v1 ``Constants`` has no manager of its own for it -- deleting the word from ``conjunctions`` is what turns the marking off, the same rule the glued-honorific tails follow. See ``docs/customize.rst`` (#383, #479)
9294

9395
- **Add AmbiguityKind.CONJUNCTION_OR_INITIAL, reported when a one-letter connective in a name written wholly in one case is read as an initial:** ``parse("jose e maria santos").ambiguities`` and ``parse("JOSE E MARIA SANTOS").ambiguities`` both name it, and ``detail`` names the letter. That is the call the behavior change above had to make. A letter outside the marked set reports nothing, its reading not being in doubt, so ``JUAN GARCIA Y LOPEZ`` is silent; so is every mixed-case name, where the writing decided it. See the ``P3`` entry of ``docs/design/decisions.md`` (#383, #479)

‎pyproject.toml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ classifiers = [
1717
"Programming Language :: Python :: 3.12",
1818
"Programming Language :: Python :: 3.13",
1919
"Programming Language :: Python :: 3.14",
20+
"Programming Language :: Python :: 3.15",
2021
"Development Status :: 5 - Production/Stable",
2122
"Natural Language :: English",
2223
"Topic :: Software Development :: Libraries :: Python Modules",

0 commit comments

Comments
 (0)