Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/workflows/test-suite.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ jobs:
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: ${{ matrix.python-version }}
if: matrix.python-version == '3.13' || matrix.python-version == '3.14'
if: matrix.python-version == '3.13' || matrix.python-version == '3.14' || matrix.python-version == '3.15'
- uses: taiki-e/install-action@7a79fe8c3a13344501c80d99cae481c1c9085912 # v2.81.10
with:
tool: just
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ jobs:
REQUESTED_VERSIONS: ${{ inputs.python-versions }}
# Every supported version, oldest first; keep in sync with the
# pyproject.toml classifiers.
PYTHON_VERSIONS: '["3.11", "3.12", "3.13", "3.14"]'
PYTHON_VERSIONS: '["3.11", "3.12", "3.13", "3.14", "3.15"]'

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent review (relayed) — CLEAN

Reviewer: Codex CLI 0.162.1, model gpt-6-astra, model_reasoning_effort=high, sandbox read-only; session 01a13a46-70f8-7ea2-a682-b1d486cff58e.
Base 6ea5587dde5aae5a5066a91da1f1231803d471e0, head 9d405b8d68da5c0cd9dad5e50225475b34875a8a, detached snapshot worktree (unchanged after the review).
Constraints: review only (no edits, builds, tests, or GitHub access); the prompt omitted the PR number, description, commit messages, and prior findings. Static review with public package-metadata lookups; nothing was executed.

Reviewer output:

Surfaces covered:

  • Runtime dependencies, extras, and requires-python: unchanged.
  • Lock forks and dependency markers: pyarrow remains 25.0.1 on 3.11–3.14 and selects 26.0.0 on 3.15. NumPy selections remain consistent. The awswrangler dependency branches for 3.15 are unreachable because its parent dependency excludes that version.
  • Benchmark environment: Python 3.12 still includes awswrangler 3.17.1 and pyarrow 25.0.1. Shared lock upgrades also affect older environments: coverage 7.6.10 → 7.16.2, greenlet 3.3.2 → 3.5.6, MarkupSafe 3.0.2 → 3.0.4, and typing-extensions 4.12.2 → 4.16.0. Their Python requirements still permit 3.11.
  • CI and tox: traced version selection through both workflows, interpreter setup, just tox, all three tox environments, and release-workflow reuse. Python 3.15 is included.
  • Listings and tests: checked classifiers, README, documentation, benchmark configuration, and searches for supported-version assertions; no stale version set found.
  • Added comments: confirmed against pyarrow release metadata and awswrangler metadata.
  • Runtime compatibility: inspected datetime parsing, text encoding, imports, typing/introspection, and concurrency paths against the Python 3.15 changes. No concrete required runtime repair identified.

CLEAN

No actionable findings in 6ea5587d..9d405b8d. This is a static review with public metadata verification; installation, builds, tests, and AWS execution were not performed.

run: |
case "$EVENT_NAME" in
pull_request | schedule)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ PyAthena is a Python [DB API 2.0 (PEP 249)](https://www.python.org/dev/peps/pep-

- Python

- CPython 3.11, 3.12, 3.13, 3.14
- CPython 3.11, 3.12, 3.13, 3.14, 3.15

## Installation

Expand Down
4 changes: 3 additions & 1 deletion benchmarks/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ requires-python = ">=3.11"
classifiers = ["Private :: Do Not Upload"]
dependencies = [
"PyAthena[pandas,arrow,polars,sqlalchemy]",
"awswrangler>=3.17,<4",
# Released awswrangler caps pyarrow below 26.0.0, the first release with
# Python 3.15 wheels; the marker keeps the workspace lock installable on 3.15.
"awswrangler>=3.17,<4; python_version < '3.15'",
"polars",
"psutil>=7,<8",
]
Expand Down
2 changes: 1 addition & 1 deletion docs/introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ SPDX-License-Identifier: MIT

- Python

- CPython 3.11, 3.12, 3.13, 3.14
- CPython 3.11, 3.12, 3.13, 3.14, 3.15

(installation)=

Expand Down
12 changes: 9 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: 3.15",
]
dynamic = ["version"]

Expand Down Expand Up @@ -91,9 +92,13 @@ dev = [
"sqlalchemy[asyncio]>=2.0.0",
"pandas>=3.0.0",
"pyarrow>=22.0.0",
# pyarrow 26.0.0 is the first release with Python 3.15 wheels; without this,
# the lock keeps the version that the benchmarks' awswrangler allows.
"pyarrow>=26.0.0; python_version >= '3.15'",

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Self-review round one (implementation behavior) — CLEAN

Base 6ea5587dde5aae5a5066a91da1f1231803d471e0, head ba621c1548e760ccbecaff9fd278de3b04e19343.

Covered: pyproject.toml (classifier, dev-group pyarrow marker, tox envlist/gh-actions), benchmarks/pyproject.toml (awswrangler marker), uv.lock (greenlet 3.5.6, typing-extensions 4.16.0, pyarrow forked 25.0.1 / 26.0.0 at 3.15), test.yaml PYTHON_VERSIONS, test-suite.yaml setup-python condition, README.md, docs/introduction.md.

  • No runtime code or [project] requirement changes, so DB API, converter, and filesystem behavior are unchanged for 3.11–3.14 users.
  • Grepped pyathena/ for APIs removed or changed by 3.15 (open() without encoding under UTF-8 mode, get_event_loop, event-loop policies, utcnow, locale): none used.
  • The awswrangler marker only affects the benchmark environment on 3.15; benchmarks run on 3.12 (BENCHMARK_UV sets UV_PYTHON=3.12; README and the bootstrap pin 3.12), and adapters.py imports awswrangler at module level only there.
  • greenlet 3.5.6 ships cp311/cp312 manylinux aarch64/x86_64 wheels, so the Graviton benchmark host and CI keep binary installs.
  • Validation: just lint on 3.15 (mypy 1.14.0 via its pure wheel), just benchmark test 217 passed / 1 skipped, just scripts 112 passed, uv lock --check with uv 0.12.5 and 0.13.1.

"polars>=1.39.0",
# Pull requests test the newest Python with Polars 2, and the older Pythons keep
# the newest Polars 1.x release.
# Python 3.14 and later, including the newest version that pull requests test,
# use Polars 2; Polars 1.x Series methods return None on Python 3.15
# (pola-rs/polars#29419). The older versions keep the newest Polars 1.x release.
"polars>=2.0.0; python_version >= '3.14'",
"polars<2.0.0; python_version < '3.14'",
"Jinja2>=3.1.0",
Expand Down Expand Up @@ -230,14 +235,15 @@ exclude = [
legacy_tox_ini = """
[tox]
isolated_build = true
envlist = py{311,312,313,314}-{pyathena,sqla,sqla_async}
envlist = py{311,312,313,314,315}-{pyathena,sqla,sqla_async}

[gh-actions]
python =
3.11: py311
3.12: py312
3.13: py313
3.14: py314
3.15: py315

[gh-actions:env]
TEST_TYPE =
Expand Down
3 changes: 2 additions & 1 deletion tests/pyathena/test_cursor.py
Original file line number Diff line number Diff line change
Expand Up @@ -630,8 +630,9 @@ def test_contain_special_character_query(self, cursor):
assert cursor.fetchall() == [("a string", "%%")]

def test_contain_special_character_query_with_parameter(self, cursor):
# Python 3.15 raises ValueError instead of TypeError for a % without a mapping key.
pytest.raises(

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Self-review of the changes after the first reviews and of the rebase (both perspectives): CLEAN

Old range 6ea5587dde5aae5a5066a91da1f1231803d471e0..9d405b8d68da5c0cd9dad5e50225475b34875a8a (reviewed), new range a618cd57..bffd35492274be1bc6c39b491aeb4b0b23696115, compared with git range-diff. The new base includes #1169 (Polars 2 on Python 3.14 and later), #1167, #1166, and #1165.

Changes since the reviewed head:

  • test_contain_special_character_query_with_parameter now accepts (TypeError, ValueError). CI run 38560114057 failed on 3.15 with ValueError: format requires a parenthesised mapping key; locally, 3.12 raises TypeError: not enough arguments for format string and 3.15 raises ValueError for the same expression. DefaultParameterFormatter.format() does not catch either, so the test now asserts what Python raises. The formatter code is unchanged.
  • Support Python 3.15 #1164's own polars>=2.0.0; python_version >= '3.15' marker was dropped in favor of Read CSV results through fsspec for Polars 2.0 #1169's >= '3.14' marker; the comment now also gives the 3.15 reason (_is_empty_method is not True on Python 3.15 pola-rs/polars#29419, fixed only in 2.0.0; reproduced locally: Series.is_null() returns None on 3.15 with Polars 1.44.2).
  • uv.lock was regenerated from the new base with uv 0.12.5 (revision 3). The package versions that differ from the base are the same set as before the rebase (greenlet 3.5.6, typing-extensions 4.16.0, coverage 7.16.2, MarkupSafe 3.0.4, pyarrow 26.0.0 for 3.15); the rest is fork-marker text.

Behavior perspective: no runtime code changes; on 3.15, Polars 2.0.0 and pyarrow 26.0.0 are locked. The upstream runtime changes (#1165 S3File parts, #1167 PandasCursor rows) are covered by the full CI on 3.15 to follow.
Claims perspective: the PR body now drops the dependency note on #1168 and the obsolete Polars 3.15 marker, and records the post-rebase evidence.
Validation at bffd354: uv lock --check (uv 0.12.5 and 0.13.1), just lint on 3.15, just benchmark test 235 passed / 1 skipped, just scripts 112 passed, just docs lint; on 3.15 (AWS) the Polars suites plus the formatter and Arrow as_polars tests: 156 passed.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent follow-up review (relayed): CLEAN

Reviewer: Codex CLI 0.162.1, model gpt-6-astra, model_reasoning_effort=high, sandbox read-only; session 01a13ac7-07b9-7621-b40e-0e34457523cf.
Scope: a618cd57..bffd35492274be1bc6c39b491aeb4b0b23696115 with the range-diff against the reviewed 6ea5587d..9d405b8d; detached snapshot unchanged after the review. The prompt described the change and the new base, without the PR description, commit messages, or author conclusions. Static review only.

Reviewer output:

Surfaces covered:

  • Supplied full diff and range comparison; CI version selection, tox configuration, classifiers, and support documentation.
  • tests/pyathena/test_cursor.py:635: accepting (TypeError, ValueError) is appropriately scoped. The unchanged formatter delegates to %; the existing 3.15 failure log confirms ValueError at that operation. Escaped-percent success cases remain intact.
  • pyproject.toml:99 and uv.lock: the comment matches the retained markers. Polars resolves to 1.44.2 below 3.14 and 2.0.0 on ≥3.14; PyArrow resolves to 25.0.1 below 3.15 and 26.0.0 on ≥3.15. Root, extras, benchmark edges, and runtime-package forks agree.
  • Dependency upgrades: checked release metadata and wheel availability for greenlet 3.5.6, typing-extensions 4.16.0, coverage 7.16.2, and MarkupSafe 3.0.4.
  • Base changes in 6ea5587d..a618cd57: Polars CSV/map compatibility and associated tests, pandas row iteration, bounded multipart uploads, and benchmark quiescing. No additional actionable 3.15 interaction identified.

CLEAN — no actionable findings in the follow-up scope.

Read-only inspection, including existing log evidence; no builds, tests, installs, edits, or GitHub writes performed. This does not establish runtime success at the current head.

TypeError,
(TypeError, ValueError),
lambda: cursor.execute(
"""
SELECT col_string, %(param)s FROM one_row_complex
Expand Down
580 changes: 421 additions & 159 deletions uv.lock

Large diffs are not rendered by default.

Loading