X Tutup
Skip to content

chore(migration): Migrate code from googleapis/python-spanner-sqlalchemy into packages/sqlalchemy-spanner#16054

Draft
parthea wants to merge 584 commits intomainfrom
migration.python-spanner-sqlalchemy.migration.2026-03-09_19-05-52.migrate
Draft

chore(migration): Migrate code from googleapis/python-spanner-sqlalchemy into packages/sqlalchemy-spanner#16054
parthea wants to merge 584 commits intomainfrom
migration.python-spanner-sqlalchemy.migration.2026-03-09_19-05-52.migrate

Conversation

@parthea
Copy link
Contributor

@parthea parthea commented Mar 9, 2026

See #10954.

This PR should be merged with a merge-commit, not a squash-commit, in order to preserve the git history.

renovate-bot and others added 30 commits November 26, 2024 15:02
* fix: support THEN RETURN for insert, update, delete

Support THEN RETURN clauses for INSERT, UPDATE, and DELETE statements.

Fixes #498

* test: override insert auto-generated pk test
Adds helper functions for insert-or-update and insert-or-ignore
and samples for how to use these functions.

Fixes #391
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [google-cloud-spanner](https://redirect.github.com/googleapis/python-spanner) | `==3.50.1` -> `==3.51.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/google-cloud-spanner/3.51.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/google-cloud-spanner/3.51.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/google-cloud-spanner/3.50.1/3.51.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/google-cloud-spanner/3.50.1/3.51.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>googleapis/python-spanner (google-cloud-spanner)</summary>

### [`v3.51.0`](https://redirect.github.com/googleapis/python-spanner/blob/HEAD/CHANGELOG.md#3510-2024-12-05)

[Compare Source](https://redirect.github.com/googleapis/python-spanner/compare/v3.50.1...v3.51.0)

##### Features

-   Add connection variable for ignoring transaction warnings ([#&#8203;1249](https://redirect.github.com/googleapis/python-spanner/issues/1249)) ([eeb7836](https://redirect.github.com/googleapis/python-spanner/commit/eeb7836b6350aa9626dfb733208e6827d38bb9c9))
-   **spanner:** Implement custom tracer_provider injection for opentelemetry traces ([#&#8203;1229](https://redirect.github.com/googleapis/python-spanner/issues/1229)) ([6869ed6](https://redirect.github.com/googleapis/python-spanner/commit/6869ed651e41d7a8af046884bc6c792a4177f766))
-   Support float32 parameters in dbapi ([#&#8203;1245](https://redirect.github.com/googleapis/python-spanner/issues/1245)) ([829b799](https://redirect.github.com/googleapis/python-spanner/commit/829b799e0c9c6da274bf95c272cda564cfdba928))

##### Bug Fixes

-   Allow setting connection.read_only to same value ([#&#8203;1247](https://redirect.github.com/googleapis/python-spanner/issues/1247)) ([5e8ca94](https://redirect.github.com/googleapis/python-spanner/commit/5e8ca949b583fbcf0b92b42696545973aad8c78f))
-   Allow setting staleness to same value in tx ([#&#8203;1253](https://redirect.github.com/googleapis/python-spanner/issues/1253)) ([a214885](https://redirect.github.com/googleapis/python-spanner/commit/a214885ed474f3d69875ef580d5f8cbbabe9199a))
-   Dbapi raised AttributeError with \[] as arguments ([#&#8203;1257](https://redirect.github.com/googleapis/python-spanner/issues/1257)) ([758bf48](https://redirect.github.com/googleapis/python-spanner/commit/758bf4889a7f3346bc8282a3eed47aee43be650c))

##### Performance Improvements

-   Optimize ResultSet decoding ([#&#8203;1244](https://redirect.github.com/googleapis/python-spanner/issues/1244)) ([ccae6e0](https://redirect.github.com/googleapis/python-spanner/commit/ccae6e0287ba6cf3c14f15a907b2106b11ef1fdc))
-   Remove repeated GetSession calls for FixedSizePool ([#&#8203;1252](https://redirect.github.com/googleapis/python-spanner/issues/1252)) ([c064815](https://redirect.github.com/googleapis/python-spanner/commit/c064815abaaa4b564edd6f0e365a37e7e839080c))

##### Documentation

-   **samples:** Add samples for Cloud Spanner Default Backup Schedules ([#&#8203;1238](https://redirect.github.com/googleapis/python-spanner/issues/1238)) ([054a186](https://redirect.github.com/googleapis/python-spanner/commit/054a18658eedc5d4dbecb7508baa3f3d67f5b815))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS40Mi40IiwidXBkYXRlZEluVmVyIjoiMzkuNDIuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
* feat: support float32

Adds support for FLOAT32 columns. Applications should use the SQLAlchemy
type REAL to create a FLOAT32 column, as FLOAT is already reserved for
FLOAT64.

Fixes #409

* chore: run code formatter

* fix: remove DOUBLE reference which is SQLAlchemy 2.0-only
* docs: add sample for read-only transactions

Adds a sample and documentation for read-only transactions.

Fixes #493

* chore: run two read-only transactions in test

* chore: remove GetSession requests

* chore: remove unused import
Adds tests and samples for executing Partitioned DML using SQLAlchemy.

Fixes #496
* docs: add sample for stale reads

Adds a sample and tests for executing stale reads on Spanner. Using
stale reads can improve performance when the application does not require
the guarantees that are given by strong reads.

Fixes #495

* chore: remove GetSession requests
parthea and others added 27 commits November 13, 2025 10:50
Towards googleapis/librarian#2460

---------

Co-authored-by: Knut Olav Løite <koloite@gmail.com>
Co-authored-by: ohmayr <omairn@google.com>
This PR adds support for Python 3.14 to the library.

Key changes include:
- Updating `setup.py` to include the Python 3.14 classifier.
- Updating `noxfile.py`:
   - Add 3.14 to test sessions.
- Refactor to use version constants (`UNIT_TEST_PYTHON_VERSIONS`,
`SYSTEM_TEST_PYTHON_VERSIONS`).
- Update `DEFAULT_PYTHON_VERSION` and
`DEFAULT_PYTHON_VERSION_FOR_SQLALCHEMY_20` to
"3.14".
   - Update `BLACK_VERSION` to `23.7.0` for Python 3.14 compatibility.
- Updating `.github/workflows/test_suite.yml` to use appropriate Python
versions for each job including matrix strategies for `unit` and
`system` jobs.

NOTE: The following CI/CD check is failing:

* `SQLAlchemy Spanner dialect / compliance_tests_20`

Per Gemini: The `compliance_test_20` session in Nox is currently failing
on Python 3.13 and 3.14 due to issues with schema reflection for
elements with quoted names or mixed case. These appear to pre-existing
issues with the dialect's handling of such identifiers, rather than a
regressio introduced by Python 3.14.

The failing compliance test has been marked as not required so as to not
be a blocker for this PR. As noted in the issue that status should be
reverted when the issue is resolved.

Further details and investigation are tracked in Issue #805.
PR created by the Librarian CLI to initialize a release. Merging this PR
will auto trigger a release.

Librarian Version: v0.7.0
Language Image:
us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:c8612d3fffb3f6a32353b2d1abd16b61e87811866f7ec9d65b59b02eb452a620
<details><summary>sqlalchemy-spanner: 1.17.2</summary>

##
[1.17.2](googleapis/python-spanner-sqlalchemy@v1.17.1...v1.17.2)
(2025-12-15)

### Bug Fixes

* Retrieve columns in compound indexes in correct order (#798)
([9afe49bb](googleapis/python-spanner-sqlalchemy@9afe49bb))

</details>
The conformance tests for SQLAlchemy 2.0 were failing due to a
dependency conflict for OpenTelemetry. This change removes the use of
OpenTelemetry entirely from the tests, as the version that is currently
used by the Spanner client library triggers a deprecation warning when
used with SQLAlchemy. That in itself is not a big problem, except that
the SQLAlchemy tests verify that there are no warnings, and there are no
reasonable ways to ignore these warnings, other than just getting rid of
the OpenTelemetry usage.

See
https://github.com/googleapis/python-spanner-sqlalchemy/actions/runs/22582034832/job/65569068380?pr=825
for an example of the build error that is being fixed.
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| cachetools | `==6.2.1` → `==6.2.6` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/cachetools/6.2.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cachetools/6.2.1/6.2.6?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [click](https://redirect.github.com/pallets/click)
([changelog](https://click.palletsprojects.com/page/changes/)) |
`==8.3.0` → `==8.3.1` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/click/8.3.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/click/8.3.0/8.3.1?slim=true)
|

---

### Release Notes

<details>
<summary>pallets/click (click)</summary>

###
[`v8.3.1`](https://redirect.github.com/pallets/click/blob/HEAD/CHANGES.rst#Version-831)

[Compare
Source](https://redirect.github.com/pallets/click/compare/8.3.0...8.3.1)

Released 2025-11-15

- Don't discard pager arguments by correctly using `subprocess.Popen`.
:issue:`3039`
  :pr:`3055`
- Replace `Sentinel.UNSET` default values by `None` as they're passed
through
  the `Context.invoke()` method. :issue:`3066` :issue:`3065` :pr:`3068`
- Fix conversion of `Sentinel.UNSET` happening too early, which caused
incorrect
behavior for multiple parameters using the same name. :issue:`3071`
:pr:`3079`
- Hide `Sentinel.UNSET` values as `None` when looking up for other
parameters
through the context inside parameter callbacks. :issue:`3136` :pr:`3137`
- Fix rendering when `prompt` and `confirm` parameter `prompt_suffix` is
  empty. :issue:`3019` :pr:`3021`
- When `Sentinel.UNSET` is found during parsing, it will skip calls to
  `type_cast_value`. :issue:`3069` :pr:`3090`

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [importlib-metadata](https://redirect.github.com/python/importlib_metadata) | `==8.7.0` → `==8.7.1` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/importlib-metadata/8.7.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/importlib-metadata/8.7.0/8.7.1?slim=true) |

---

### Release Notes

<details>
<summary>python/importlib_metadata (importlib-metadata)</summary>

### [`v8.7.1`](https://redirect.github.com/python/importlib_metadata/compare/v8.7.0...v8.7.1)

[Compare Source](https://redirect.github.com/python/importlib_metadata/compare/v8.7.0...v8.7.1)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pip-tools](https://redirect.github.com/jazzband/pip-tools)
([changelog](https://redirect.github.com/jazzband/pip-tools/releases)) |
`==7.5.1` → `==7.5.3` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/pip-tools/7.5.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pip-tools/7.5.1/7.5.3?slim=true)
|

---

### Release Notes

<details>
<summary>jazzband/pip-tools (pip-tools)</summary>

###
[`v7.5.3`](https://redirect.github.com/jazzband/pip-tools/blob/HEAD/CHANGELOG.md#v753)

[Compare
Source](https://redirect.github.com/jazzband/pip-tools/compare/v7.5.2...v7.5.3)

*2026-02-09*

##### Bug fixes

- The option `--unsafe-package` is now normalized -- by {user}`shifqu`.

  *PRs and issues:* {issue}`2150`

- Fixed a bug in which `pip-compile` lost any index URL options when
  looking up hashes -- by {user}`sirosen`.

  This caused errors when a package was only available from an extra
  index, and caused `pip-compile` to incorrectly drop index URL options
  from output, even when they were present in the input requirements.

  *PRs and issues:* {issue}`2220`, {issue}`2294`, {issue}`2305`

- Fixed removal of temporary files used when reading requirements from
stdin
  \-- by {user}`sirosen`.

##### Features

- `pip-tools` is now tested against Python 3.14 and 3.14t in CI, and
  marks them as supported in the core packaging metadata
  \-- by {user}`webknjaz`.

  *PRs and issues:* {issue}`2255`

- pip-tools is now compatible with pip 26.0 -- by {user}`sirosen`.

  *PRs and issues:* {issue}`2319`, {issue}`2320`

##### Removals and backward incompatible breaking changes

- Removed support for Python 3.8 -- by {user}`sirosen`.

##### Improved documentation

- The change log management infra now allows the maintainers to add
notes
  before and after the regular categories -- by {user}`webknjaz`.

  *PRs and issues:* {issue}`2287`, {issue}`2322`

- Added documentation clarifying that `pip-compile` reads the existing
  output file as a constraint source, and how to use `--upgrade` to
  refresh dependencies -- by {user}`maliktafheem`.

  *PRs and issues:* {issue}`2307`

##### Packaging updates and notes for downstreams

- `pip-tools` is now tested against Python 3.14 and 3.14t in CI, and
  marks them as supported in the core packaging metadata
  \-- by {user}`webknjaz`.

  *PRs and issues:* {issue}`2255`

##### Contributor-facing changes

- Consistency of the Markdown files is now being enforced by linting
  with {pypi}`pymarkdownlnt` -- by {user}`webknjaz`.

  *PRs and issues:* {issue}`2256`

- The linting is now set up to perform structured GitHub Actions
  workflows and actions checks against json schemas
  \-- by {user}`webknjaz`.

  *PRs and issues:* {issue}`2273`

- The CI/CD is now set up so that the distribution build job
  is a part of the test pipeline. That pipeline is included in
  the release workflow which sources the artifact in produces.
  The tests must now pass for the release to be published to PyPI.

  \-- by {user}`webknjaz`

  *PRs and issues:* {issue}`2274`

- Fix `actionlint` hook usage to always include `shellcheck` integration
-- by {user}`sirosen`.

  *PRs and issues:* {issue}`2281`

- Utilities for interacting with `pip` have started to move into the
:py:mod:`piptools._internal._pip_api` subpackage -- by {user}`sirosen`.

  *PRs and issues:* {issue}`2285`

- The change log management infra now allows the maintainers to add
notes
  before and after the regular categories -- by {user}`webknjaz`.

  *PRs and issues:* {issue}`2287`, {issue}`2322`

- The linting is now set up to demand that {py:mod}`typing` is always
  imported as a module under the name of `_t` -- by {user}`webknjaz`.

  This is enforced by {user}`sirosen`'s {pypi}`flake8-typing-as-t`
  plugin for {pypi}`flake8`.

  *PRs and issues:* {issue}`2289`

- The {file}`tox.ini` and {file}`.github/` parts of the repository now
have project leads assigned as GitHub code owners -- by
{user}`webknjaz`.

  *PRs and issues:* {issue}`2291`

- Remove a redundant 'v' prefix from the CI release workflow job name --
by {user}`anandvenugopal-tech`.

  *PRs and issues:* {issue}`2300`

- The `check-jsonschema` ReadTheDocs hook has been enabled, and
  the config has been tweaked to pass -- by {user}`sirosen`.

###
[`v7.5.2`](https://redirect.github.com/jazzband/pip-tools/blob/HEAD/CHANGELOG.md#v752)

[Compare
Source](https://redirect.github.com/jazzband/pip-tools/compare/v7.5.1...v7.5.2)

*2025-11-11*

##### Bug fixes

- Fixed `pip-compile` to handle relative path includes which are not
subpaths of
  the current working directory -- by {user}`sirosen`.

  *PRs and issues:* {issue}`2231`, {issue}`2260`

- Using `--upgrade-package` and dynamically building project metadata no
longer causes an {exc}`AttributeError` when pip encounters an error
during the
  build -- by {user}`Epic_Wink` and {user}`tusharsadhwani`.

  *PRs and issues:* {issue}`2258`

##### Features

- Test and declare Python 3.13 support -- by {user}`jayaddison` (for
OpenCulinary).

  *PRs and issues:* {issue}`2251`

- pip-tools is now compatible with pip 25.3 -- by {user}`shifqu`.

  *PRs and issues:* {issue}`2252`, {issue}`2253`

##### Packaging updates and notes for downstreams

- `pip-tools` now supports installation from git archives by providing
  `setuptools-scm` with `.git_archival.txt` data.

  *PRs and issues:* {issue}`2225`

##### Contributor-facing changes

- The [change log entry bot] has been explicitly configured to stop
requiring
news fragments in pull requests having the [`bot:chronographer:skip`
label] set
  \-- by {user}`sirosen` and {user}`webknjaz`.

It was also set up to reference our change log authoring document from
the
GitHub Checks pages. And the reported check name is now set to `Change
log entry`.

[change log entry bot]:
https://redirect.github.com/sanitizers/chronographer-github-app

[`bot:chronographer:skip` label]:
https://redirect.github.com/jazzband/pip-tools/labels/bot:chronographer:skip

  *PRs and issues:* {issue}`2201`

- The CI is now set up to invoke failed tests again with
  maximum level of detail -- by {user}`webknjaz`.

  The change is aimed at helping troubleshoot failures
  that might be difficult to reproduce locally.

  *PRs and issues:* {issue}`2254`

- The integration with Codecov has been updated to ensure that reports
  are uploaded to the service even on failures -- by {user}`webknjaz`.

  GitHub Actions is now configured to also send an explicit notification
  to Codecov about the completion of previously initiated uploads.

  Additionally, the configuration file is now {file}`.codecov.yml`.

  *PRs and issues:* {issue}`2265`

- The linting suite now runs [`actionlint`] -- by {user}`webknjaz`.

  This tool checks typical problems with GitHub Actions workflow
  definitions and has a registry of widely-used GitHub Action
  arguments that it validates.

  [`actionlint`]: https://rhysd.github.io/actionlint/

  *PRs and issues:* {issue}`2266`

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [SQLAlchemy](https://www.sqlalchemy.org)
([changelog](https://docs.sqlalchemy.org/en/latest/changelog/)) |
`==2.0.44` → `==2.0.48` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/sqlalchemy/2.0.48?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/sqlalchemy/2.0.44/2.0.48?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [build](https://redirect.github.com/pypa/build)
([changelog](https://build.pypa.io/en/stable/changelog.html)) |
`==1.3.0` → `==1.4.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/build/1.4.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/build/1.3.0/1.4.0?slim=true)
|

---

### Release Notes

<details>
<summary>pypa/build (build)</summary>

###
[`v1.4.0`](https://redirect.github.com/pypa/build/blob/HEAD/CHANGELOG.rst#140-2026-01-08)

[Compare
Source](https://redirect.github.com/pypa/build/compare/1.3.0...1.4.0)

\==================

- Add `--quiet` flag
  (:pr:`947`)
- Add option to dump PEP 517 metadata with `--metadata`
  (:pr:`940`, :pr:`943`)
- Support `UV` environment variable
  (:pr:`971`)
- Remove a workaround for 3.14b1
  (:pr:`960`)
- In 3.14 final release, `color` defaults to `True` already
  (:pr:`962`)
- Pass sp-repo-review
  (:pr:`942`)
- In pytest configuration, `log_level` is better than `log_cli_level`
  (:pr:`950`)
- Split up typing and mypy
  (:pr:`944`)
- Use `types-colorama`
  (:pr:`945`)
- In docs, first argument for `_has_dependency` is a name
  (PR :pr:`970`)
- Fix test failure when `flit-core` is installed
  (PR :pr:`921`)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [certifi](https://redirect.github.com/certifi/python-certifi) |
`==2025.10.5` → `==2025.11.12` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/certifi/2025.11.12?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/certifi/2025.10.5/2025.11.12?slim=true)
|

---

### Release Notes

<details>
<summary>certifi/python-certifi (certifi)</summary>

###
[`v2025.11.12`](https://redirect.github.com/certifi/python-certifi/compare/2025.10.05...2025.11.12)

[Compare
Source](https://redirect.github.com/certifi/python-certifi/compare/2025.10.05...2025.11.12)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [greenlet](https://redirect.github.com/python-greenlet/greenlet)
([changelog](https://greenlet.readthedocs.io/en/latest/changes.html)) |
`==3.2.4` → `==3.3.2` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/greenlet/3.3.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/greenlet/3.2.4/3.3.2?slim=true)
|

---

### Release Notes

<details>
<summary>python-greenlet/greenlet (greenlet)</summary>

###
[`v3.3.2`](https://redirect.github.com/python-greenlet/greenlet/blob/HEAD/CHANGES.rst#332-2026-02-20)

[Compare
Source](https://redirect.github.com/python-greenlet/greenlet/compare/3.3.1...3.3.2)

\==================

- Fix a crash on Python 3.10 if there are active greenlets during
interpreter shutdown. See `PR 495
<https://github.com/python-greenlet/greenlet/pull/495>`\_ by Nicolas
  Bouvrette.

###
[`v3.3.1`](https://redirect.github.com/python-greenlet/greenlet/blob/HEAD/CHANGES.rst#331-2026-01-23)

[Compare
Source](https://redirect.github.com/python-greenlet/greenlet/compare/3.3.0...3.3.1)

\==================

- Publish Windows ARM binary wheels, where available.
- Fix compilation for 3.14t on Windows.
- Publish Windows 3.14t binary wheels for Intel.
- Switch from Appveyor for Windows to Github Actions.
- Fix compilation on MIPS with GCC 15 and binutils 2.45. See `PR 487
by Rosen Penev
<https://github.com/python-greenlet/greenlet/pull/487>`\_. Note that
  this is not a platform tested by this project's CI.
- Move most project metadata into the static `pyproject.toml` file.
  This updates licensing information to use the modern
`License-Expression` field. See `PR 480 by mrbean-bremen
<https://github.com/python-greenlet/greenlet/pull/480/>`\_.

###
[`v3.3.0`](https://redirect.github.com/python-greenlet/greenlet/blob/HEAD/CHANGES.rst#330-2025-12-04)

[Compare
Source](https://redirect.github.com/python-greenlet/greenlet/compare/3.2.5...3.3.0)

\==================

- Drop support for Python 3.9.
- Switch to distributing manylinux\_2\_28 wheels instead of
  manylinux2014 wheels. Likewise, switch from musllinux\_1\_1 to 1\_2.
- Add initial support for free-threaded builds of CPython 3.14. Due to
  limitations, we do not distribute binary wheels for free-threaded
  CPython on Windows. (Free-threaded CPython 3.13 may work, but is
  untested and unsupported.)

  .. caution::

  Under some rare scenarios with free-threaded 3.14, the
  interpreter may crash on accessing a variable or attribute or
  when shutting down. If this happens, try disabling the
  thread-local bytecode cache. See the greenlet documentation for
more details. See `PR 472 by T. Wouters
<https://github.com/python-greenlet/greenlet/pull/472>`\_ for the
  initial free-threaded support and a discussion of the current
  known issues.

###
[`v3.2.5`](https://redirect.github.com/python-greenlet/greenlet/blob/HEAD/CHANGES.rst#325-2026-02-20)

[Compare
Source](https://redirect.github.com/python-greenlet/greenlet/compare/3.2.4...3.2.5)

\==================

.. note::

The 3.2.x series will be the last to support Python 3.9.

- Backport the changes from PR 495 in release 3.3.2 for Python 3.9.

.. note::

No Windows wheels will be published for this version.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [proto-plus](https://redirect.github.com/googleapis/proto-plus-python)
| `==1.26.1` → `==1.27.1` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/proto-plus/1.27.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/proto-plus/1.26.1/1.27.1?slim=true)
|

---

### Release Notes

<details>
<summary>googleapis/proto-plus-python (proto-plus)</summary>

###
[`v1.27.1`](https://redirect.github.com/googleapis/proto-plus-python/blob/HEAD/CHANGELOG.md#1271-2026-01-30)

[Compare
Source](https://redirect.github.com/googleapis/proto-plus-python/compare/v1.27.0...v1.27.1)

##### Bug Fixes

- remove float\_precision for protobuf 7
([#&#8203;559](https://redirect.github.com/googleapis/proto-plus-python/issues/559))
([390b9d571bb5e58879137d5ac7c4cea1978e0024](https://redirect.github.com/googleapis/proto-plus-python/commit/390b9d571bb5e58879137d5ac7c4cea1978e0024))

###
[`v1.27.0`](https://redirect.github.com/googleapis/proto-plus-python/blob/HEAD/CHANGELOG.md#1270-2025-12-12)

[Compare
Source](https://redirect.github.com/googleapis/proto-plus-python/compare/v1.26.1...v1.27.0)

##### Features

- Add classifier for Python 3.14
([#&#8203;544](https://redirect.github.com/googleapis/proto-plus-python/issues/544))
([d9f41512648c4551fc3e926649864c5dfe3964b2](https://redirect.github.com/googleapis/proto-plus-python/commit/d9f41512648c4551fc3e926649864c5dfe3964b2))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pyparsing](https://redirect.github.com/pyparsing/pyparsing) |
`==3.2.5` → `==3.3.2` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/pyparsing/3.3.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pyparsing/3.2.5/3.3.2?slim=true)
|

---

### Release Notes

<details>
<summary>pyparsing/pyparsing (pyparsing)</summary>

###
[`v3.3.2`](https://redirect.github.com/pyparsing/pyparsing/blob/HEAD/CHANGES#Version-332---January-2026)

[Compare
Source](https://redirect.github.com/pyparsing/pyparsing/compare/3.3.1...3.3.2)

- Defined pyparsing-specific warning classes so that they can be
selectively enabled
or disabled without affecting warnings raised by other libraries in the
same Python
  app:
- `PyparsingWarning` - base warning for all pyparsing-specific warnings
(inherits
    from `UserWarning`)
- `PyparsingDeprecationWarning` - warning for using deprecated features
(inherits
    from `PyparsingWarning` and `DeprecationWarning`)
- `PyparsingDiagnosticWarning` - warning raised when pyparsing
diagnostics are
enabled and a diagnostic feature is used (inherits from
`PyparsingWarning`)

- Added `as_datetime` parse action to `pyparsing.common` - a more
generalized
version of the `convert_to_datetime` parse action (supports any
expression that extracts
date/time fields into "year", "month", "day", etc. results names), and
validates
  that the parsed fields represent a valid date and time.

- Added `iso8601_date_validated` and `iso8601_datetime_validated`
expressions to
  `pyparsing.common`, which return a Python `datetime.datetime`

- Various performance improvements in `ParseResults` class and core
functions, with
  10-20% performance overall.

- Added `regex_inverter` web page (using PyScript) to demonstrate using
the `inv_regex.py`
  example.

- Expanded regex forms handled by the `examples/inv_regex.py` example:
  - named capturing groups (`?P<name>`)
  - partial repetition (`{m,}` and `{,n}`)
  - negated character classes (`[^...]`)

- Added `SPy` (Simplified Python) parser to examples.

###
[`v3.3.1`](https://redirect.github.com/pyparsing/pyparsing/blob/HEAD/CHANGES#Version-331---December-2025)

[Compare
Source](https://redirect.github.com/pyparsing/pyparsing/compare/3.3.0...3.3.1)

- Added license info to metadata, following PEP-639. Thanks to Gedalia
Pasternak and
Marc Mueller for submitted issue and PR. Fixes
[#&#8203;626](https://redirect.github.com/pyparsing/pyparsing/issues/626).

###
[`v3.3.0`](https://redirect.github.com/pyparsing/pyparsing/blob/HEAD/CHANGES#Version-330---December-2025)

[Compare
Source](https://redirect.github.com/pyparsing/pyparsing/compare/3.2.5...3.3.0)


\===========================================================================================
The version 3.3.0 release will begin emitting `DeprecationWarnings` for
pyparsing methods
that have been renamed to PEP8-compliant names (introduced in pyparsing
3.0.0, in August,
2021, with legacy names retained as aliases). In preparation, I added in
pyparsing
3.2.2 a utility for finding and replacing the legacy method names with
the new names.
This utility is located at `pyparsing/tools/cvt_pep8_names.py`. This
script will scan all
Python files specified on the command line, and if the `-u` option is
selected, will
replace all occurrences of the old method names with the new
PEP8-compliant names,
updating the files in place.

Here is an example that converts all the files in the pyparsing
`/examples` directory:

```
  python -m pyparsing.tools.cvt_pyparsing_pep8_names -u examples/*.py
```

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [protobuf](https://developers.google.com/protocol-buffers/) |
`==6.33.0` → `==6.33.5` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/protobuf/6.33.5?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/protobuf/6.33.0/6.33.5?slim=true)
|

### GitHub Vulnerability Alerts

#### [CVE-2026-0994](https://nvd.nist.gov/vuln/detail/CVE-2026-0994)

A denial-of-service (DoS) vulnerability exists in
google.protobuf.json_format.ParseDict() in Python, where the
max_recursion_depth limit can be bypassed when parsing nested
google.protobuf.Any messages.

Due to missing recursion depth accounting inside the internal
Any-handling logic, an attacker can supply deeply nested Any structures
that bypass the intended recursion limit, eventually exhausting Python’s
recursion stack and causing a RecursionError.

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [tomli](https://redirect.github.com/hukkin/tomli)
([changelog](https://redirect.github.com/hukkin/tomli/blob/master/CHANGELOG.md))
| `==2.3.0` → `==2.4.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/tomli/2.4.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/tomli/2.3.0/2.4.0?slim=true)
|

---

### Release Notes

<details>
<summary>hukkin/tomli (tomli)</summary>

###
[`v2.4.0`](https://redirect.github.com/hukkin/tomli/blob/HEAD/CHANGELOG.md#240)

[Compare
Source](https://redirect.github.com/hukkin/tomli/compare/2.3.0...2.4.0)

- Added
  - TOML v1.1.0 compatibility
  - Binary wheels for Windows arm64

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://redirect.github.com/actions/checkout) |
action | major | `v5` → `v6` |

---

### Release Notes

<details>
<summary>actions/checkout (actions/checkout)</summary>

### [`v6`](https://redirect.github.com/actions/checkout/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/checkout/compare/v5...v6)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [protobuf](https://developers.google.com/protocol-buffers/) |
`==6.33.5` → `==7.34.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/protobuf/7.34.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/protobuf/6.33.5/7.34.0?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| cachetools | `==6.2.6` → `==7.0.2` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/cachetools/7.0.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cachetools/6.2.6/7.0.2?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [certifi](https://redirect.github.com/certifi/python-certifi) |
`==2025.11.12` → `==2026.2.25` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/certifi/2026.2.25?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/certifi/2025.11.12/2026.2.25?slim=true)
|

---

### Release Notes

<details>
<summary>certifi/python-certifi (certifi)</summary>

###
[`v2026.2.25`](https://redirect.github.com/certifi/python-certifi/compare/2026.01.04...2026.02.25)

[Compare
Source](https://redirect.github.com/certifi/python-certifi/compare/2026.01.04...2026.02.25)

###
[`v2026.1.4`](https://redirect.github.com/certifi/python-certifi/compare/2025.11.12...2026.01.04)

[Compare
Source](https://redirect.github.com/certifi/python-certifi/compare/2025.11.12...2026.01.04)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [packaging](https://redirect.github.com/pypa/packaging) | `==25.0` →
`==26.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/packaging/26.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/packaging/25.0/26.0?slim=true)
|

---

### Release Notes

<details>
<summary>pypa/packaging (packaging)</summary>

###
[`v26.0`](https://redirect.github.com/pypa/packaging/releases/tag/26.0)

[Compare
Source](https://redirect.github.com/pypa/packaging/compare/25.0...26.0)

Read about the performance improvements here:
<https://iscinumpy.dev/post/packaging-faster>.

#### What's Changed

Features:

- PEP 751: support pylock by
[@&#8203;sbidoul](https://redirect.github.com/sbidoul) in
[#&#8203;900](https://redirect.github.com/pypa/packaging/pull/900)
- PEP 794: import name metadata by
[@&#8203;brettcannon](https://redirect.github.com/brettcannon) in
[#&#8203;948](https://redirect.github.com/pypa/packaging/pull/948)
- Support writing metadata by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;846](https://redirect.github.com/pypa/packaging/pull/846)
- Support `__replace__` for `Version` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1003](https://redirect.github.com/pypa/packaging/pull/1003)
- Support positional pattern matching for `Version` and `Specifier` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1004](https://redirect.github.com/pypa/packaging/pull/1004)

Behavior adaptations:

- PEP 440 handling of prereleases for `Specifier.contains`,
`SpecifierSet.contains`, and `SpecifierSet.filter` by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;897](https://redirect.github.com/pypa/packaging/pull/897)
- Handle PEP 440 edge case in `SpecifierSet.filter` by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;942](https://redirect.github.com/pypa/packaging/pull/942)
- Adjust arbitrary equality intersection preservation in `SpecifierSet`
by [@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;951](https://redirect.github.com/pypa/packaging/pull/951)
- Return `False` instead of raising for `.contains` with invalid version
by [@&#8203;Liam-DeVoe](https://redirect.github.com/Liam-DeVoe) in
[#&#8203;932](https://redirect.github.com/pypa/packaging/pull/932)
- Support arbitrary equality on arbitrary strings for `Specifier` and
`SpecifierSet`'s `filter` and `contains` method. by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;954](https://redirect.github.com/pypa/packaging/pull/954)
- Only try to parse as `Version` on certain marker keys, return `False`
on unequal ordered comparsions by
[@&#8203;JP-Ellis](https://redirect.github.com/JP-Ellis) in
[#&#8203;939](https://redirect.github.com/pypa/packaging/pull/939)

Fixes:

- Update `_hash` when unpickling `Tag()` by
[@&#8203;dholth](https://redirect.github.com/dholth) in
[#&#8203;860](https://redirect.github.com/pypa/packaging/pull/860)
- Correct comment and simplify implicit prerelease handling in
`Specifier.prereleases` by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;896](https://redirect.github.com/pypa/packaging/pull/896)
- Use explicit `_GLibCVersion` `NamedTuple` in `_manylinux` by
[@&#8203;cthoyt](https://redirect.github.com/cthoyt) in
[#&#8203;868](https://redirect.github.com/pypa/packaging/pull/868)
- Detect invalid license expressions containing `()` by
[@&#8203;bwoodsend](https://redirect.github.com/bwoodsend) in
[#&#8203;879](https://redirect.github.com/pypa/packaging/pull/879)
- Correct regex for metadata `'name'` format by
[@&#8203;di](https://redirect.github.com/di) in
[#&#8203;925](https://redirect.github.com/pypa/packaging/pull/925)
- Improve the message around expecting a semicolon by
[@&#8203;pradyunsg](https://redirect.github.com/pradyunsg) in
[#&#8203;833](https://redirect.github.com/pypa/packaging/pull/833)
- Support nested parens in license expressions by
[@&#8203;Liam-DeVoe](https://redirect.github.com/Liam-DeVoe) in
[#&#8203;931](https://redirect.github.com/pypa/packaging/pull/931)
- Add space before at symbol in `Requirements` string by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;953](https://redirect.github.com/pypa/packaging/pull/953)
- A root logger use found by ruff LOG, use `packaging` logger instead by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;965](https://redirect.github.com/pypa/packaging/pull/965)
- Better support for subclassing `Marker` and `Requirement` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1022](https://redirect.github.com/pypa/packaging/pull/1022)
- Normalize all extras, not just if it comes first by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1024](https://redirect.github.com/pypa/packaging/pull/1024)
- Don't produce a broken repr if `Marker` fails to construct by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1033](https://redirect.github.com/pypa/packaging/pull/1033)

Performance:

- Avoid recompiling regexes in the tokenizer for a 3x speedup by
[@&#8203;hauntsaninja](https://redirect.github.com/hauntsaninja) in
[#&#8203;1019](https://redirect.github.com/pypa/packaging/pull/1019)
- Improve performance in `_manylinux.py` by
[@&#8203;cthoyt](https://redirect.github.com/cthoyt) in
[#&#8203;869](https://redirect.github.com/pypa/packaging/pull/869)
- Minor cleanups to `Version` by
[@&#8203;bearomorphism](https://redirect.github.com/bearomorphism) in
[#&#8203;913](https://redirect.github.com/pypa/packaging/pull/913)
- Skip redundant creation of `Version`s in specifier comparison by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;986](https://redirect.github.com/pypa/packaging/pull/986)
- Cache `Specifier`'s Version by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;985](https://redirect.github.com/pypa/packaging/pull/985)
- Make `Version` a little faster by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;987](https://redirect.github.com/pypa/packaging/pull/987)
- Minor `Version` regex cleanup by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;990](https://redirect.github.com/pypa/packaging/pull/990)
- Faster regex on Python 3.11.5+ by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;988](https://redirect.github.com/pypa/packaging/pull/988) and
[#&#8203;1055](https://redirect.github.com/pypa/packaging/pull/1055)
- Lazily calculate `_key` in `Version` by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;989](https://redirect.github.com/pypa/packaging/pull/989) and
regression for `packaging_legacy` fixed by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1048](https://redirect.github.com/pypa/packaging/pull/1048)
- Faster `canonicalize_version` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;993](https://redirect.github.com/pypa/packaging/pull/993)
- Use `fullmatch` in a couple more places by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;992](https://redirect.github.com/pypa/packaging/pull/992)
- Use `fullmatch` for markers too by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1029](https://redirect.github.com/pypa/packaging/pull/1029)
- Use `map` instead of generator by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;996](https://redirect.github.com/pypa/packaging/pull/996)
- Deprecate `._version` (`_Version`, a `NamedTuple`) by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;995](https://redirect.github.com/pypa/packaging/pull/995) and
[#&#8203;1062](https://redirect.github.com/pypa/packaging/pull/1062)
- Avoid duplicate `Version` creation in `canonicalize_version` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;994](https://redirect.github.com/pypa/packaging/pull/994)
- Add `__slots__` to `Version` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1001](https://redirect.github.com/pypa/packaging/pull/1001)
- Add `__slots__` to `Specifier`s by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1002](https://redirect.github.com/pypa/packaging/pull/1002)
- Add `__slots__` to `Node`s by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1032](https://redirect.github.com/pypa/packaging/pull/1032)
- Use `version.__replace__` in specifier comparison by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;999](https://redirect.github.com/pypa/packaging/pull/999)
- Use `_get_spec_version` in more places in `Specifier` by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;1005](https://redirect.github.com/pypa/packaging/pull/1005)
- Pull `set` construction out of function by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1012](https://redirect.github.com/pypa/packaging/pull/1012)
- Letter normalization dict for prereleases and the like by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1014](https://redirect.github.com/pypa/packaging/pull/1014)
- Avoid normalizing extras again when comparing by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1028](https://redirect.github.com/pypa/packaging/pull/1028)
- Speed up `Version.__str__` by about 10% by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;997](https://redirect.github.com/pypa/packaging/pull/997)
- Increase the performance of `canonicalize_name` by avoiding a regex by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1030](https://redirect.github.com/pypa/packaging/pull/1030),
[#&#8203;1047](https://redirect.github.com/pypa/packaging/pull/1047),
and [#&#8203;1064](https://redirect.github.com/pypa/packaging/pull/1064)
- Faster zero stripping by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1058](https://redirect.github.com/pypa/packaging/pull/1058)

Type annotations:

- Fix a type annotation by
[@&#8203;brettcannon](https://redirect.github.com/brettcannon) in
[#&#8203;907](https://redirect.github.com/pypa/packaging/pull/907)
- Fix tags return type in `parse_wheel_filename` docs by
[@&#8203;ncoghlan](https://redirect.github.com/ncoghlan) in
[#&#8203;973](https://redirect.github.com/pypa/packaging/pull/973)
- Add type hint for `_version` in `.version.Version` by
[@&#8203;brettcannon](https://redirect.github.com/brettcannon) in
[#&#8203;927](https://redirect.github.com/pypa/packaging/pull/927)
- Changed static type annotations in prereleases setter method in
`specifier.py` by
[@&#8203;subhajitsaha01](https://redirect.github.com/subhajitsaha01) in
[#&#8203;930](https://redirect.github.com/pypa/packaging/pull/930)
- Statically type the tests by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;982](https://redirect.github.com/pypa/packaging/pull/982)

Internal:

- Test and declare support Python 3.14 by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;901](https://redirect.github.com/pypa/packaging/pull/901)
- Modernize and speed up tests on Python 3.14 by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;903](https://redirect.github.com/pypa/packaging/pull/903)
- Change our license metadata to use an SPDX license expression by
[@&#8203;cdce8p](https://redirect.github.com/cdce8p) in
[#&#8203;881](https://redirect.github.com/pypa/packaging/pull/881)
- No need for `license-files` by
[@&#8203;DimitriPapadopoulos](https://redirect.github.com/DimitriPapadopoulos)
in [#&#8203;924](https://redirect.github.com/pypa/packaging/pull/924)
- Update mypy by
[@&#8203;hauntsaninja](https://redirect.github.com/hauntsaninja) in
[#&#8203;891](https://redirect.github.com/pypa/packaging/pull/891)
- Some config updates by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;902](https://redirect.github.com/pypa/packaging/pull/902)
- Add spell check and rst check by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;904](https://redirect.github.com/pypa/packaging/pull/904)
- Clean up ruff ignores by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;905](https://redirect.github.com/pypa/packaging/pull/905)
- Update example for env marker `python_version` by
[@&#8203;trim21](https://redirect.github.com/trim21) in
[#&#8203;908](https://redirect.github.com/pypa/packaging/pull/908)
- Move codespell configuration into pyproject.toml by
[@&#8203;yarikoptic](https://redirect.github.com/yarikoptic) in
[#&#8203;910](https://redirect.github.com/pypa/packaging/pull/910)
- Check warning a little more precisely by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;837](https://redirect.github.com/pypa/packaging/pull/837)
- Speed up mypy a little by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;836](https://redirect.github.com/pypa/packaging/pull/836)
- Apply ruff/flake8-pyi rules (PYI) by
[@&#8203;DimitriPapadopoulos](https://redirect.github.com/DimitriPapadopoulos)
in [#&#8203;835](https://redirect.github.com/pypa/packaging/pull/835)
- Better local runs for codespell by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;911](https://redirect.github.com/pypa/packaging/pull/911)
- Remove outdated/confusing Gist link by
[@&#8203;stefan6419846](https://redirect.github.com/stefan6419846) in
[#&#8203;921](https://redirect.github.com/pypa/packaging/pull/921)
- Fix docs and docs ci after
[#&#8203;897](https://redirect.github.com/pypa/packaging/issues/897)
landed by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;926](https://redirect.github.com/pypa/packaging/pull/926)
- Run twine-check on push in CI by
[@&#8203;EpicWink](https://redirect.github.com/EpicWink) in
[#&#8203;922](https://redirect.github.com/pypa/packaging/pull/922)
- `ruff` was renamed `ruff-check` in pre-commit by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;933](https://redirect.github.com/pypa/packaging/pull/933)
- Fix incorrectly implicitly concatenated string in specifiers test by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;946](https://redirect.github.com/pypa/packaging/pull/946)
- Simplify conditional by
[@&#8203;ofek](https://redirect.github.com/ofek) in
[#&#8203;949](https://redirect.github.com/pypa/packaging/pull/949)
- Modernize nox, use dependency-groups for tests by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;952](https://redirect.github.com/pypa/packaging/pull/952)
- Add more checks that don't affect anything by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;957](https://redirect.github.com/pypa/packaging/pull/957)
- Enable Ruff ISC rule by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;959](https://redirect.github.com/pypa/packaging/pull/959)
- Ruff code FLY by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;963](https://redirect.github.com/pypa/packaging/pull/963)
- pytest `log_level` is better than `log_cli_level` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;956](https://redirect.github.com/pypa/packaging/pull/956)
- Ruff code TRY by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;961](https://redirect.github.com/pypa/packaging/pull/961)
- Add the ruff PL checks by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;964](https://redirect.github.com/pypa/packaging/pull/964)
- Enable Ruff ARG rules by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;958](https://redirect.github.com/pypa/packaging/pull/958)
- Ruff PT code (pytest) by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;960](https://redirect.github.com/pypa/packaging/pull/960)
- Add ruff DTZ by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;968](https://redirect.github.com/pypa/packaging/pull/968)
- Add ruff BLE by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;967](https://redirect.github.com/pypa/packaging/pull/967)
- Add the ruff SIM checks by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;966](https://redirect.github.com/pypa/packaging/pull/966)
- Adding ruff PERF by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;969](https://redirect.github.com/pypa/packaging/pull/969)
- Move some config into coverage config by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;971](https://redirect.github.com/pypa/packaging/pull/971)
- Check ruff C4 by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;962](https://redirect.github.com/pypa/packaging/pull/962)
- Adding ruff T20 by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;972](https://redirect.github.com/pypa/packaging/pull/972)
- Add a tests pass job by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;977](https://redirect.github.com/pypa/packaging/pull/977)
- Add ruff TC by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;980](https://redirect.github.com/pypa/packaging/pull/980)
- Adding part of ruff RET by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;979](https://redirect.github.com/pypa/packaging/pull/979)
- Reorder mypy check by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;983](https://redirect.github.com/pypa/packaging/pull/983)
- Enable ruff ALL by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;984](https://redirect.github.com/pypa/packaging/pull/984)
- Link back to repo/source in furo by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;991](https://redirect.github.com/pypa/packaging/pull/991)
- Add case insensitivity tests for arbitrary equality by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;975](https://redirect.github.com/pypa/packaging/pull/975)
- Synchronize documentation and code for markers by
[@&#8203;zahlman](https://redirect.github.com/zahlman) in
[#&#8203;1008](https://redirect.github.com/pypa/packaging/pull/1008)
- Use `partition` in `_parse_project_urls` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1013](https://redirect.github.com/pypa/packaging/pull/1013)
- auto-skip the dependabot PRs in the release changelog generation by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1016](https://redirect.github.com/pypa/packaging/pull/1016)
- Update unreleased section in changelog by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1017](https://redirect.github.com/pypa/packaging/pull/1017)
- Fix PR role to match extlinks by
[@&#8203;hugovk](https://redirect.github.com/hugovk) in
[#&#8203;1020](https://redirect.github.com/pypa/packaging/pull/1020)
- Mention new parts in README by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1023](https://redirect.github.com/pypa/packaging/pull/1023)
- Replace a couple of asserts with else by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1027](https://redirect.github.com/pypa/packaging/pull/1027)
- Simplify and/or check a little more by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1031](https://redirect.github.com/pypa/packaging/pull/1031)
- Use slim runner for all check by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1021](https://redirect.github.com/pypa/packaging/pull/1021)
- Use typos instead of codespell by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1015](https://redirect.github.com/pypa/packaging/pull/1015)
- Update changelog with recent additions by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1034](https://redirect.github.com/pypa/packaging/pull/1034)
- Publish to PyPI via GitHub CI by
[@&#8203;EpicWink](https://redirect.github.com/EpicWink) in
[#&#8203;893](https://redirect.github.com/pypa/packaging/pull/893)
- Use prek for faster pre-commit lint step by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1037](https://redirect.github.com/pypa/packaging/pull/1037)
- Add help text to noxfile by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1038](https://redirect.github.com/pypa/packaging/pull/1038)
- Update licenses to 3.27 by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1036](https://redirect.github.com/pypa/packaging/pull/1036)
- Use relative import in `packaging.licenses` by
[@&#8203;notatallshaw](https://redirect.github.com/notatallshaw) in
[#&#8203;1039](https://redirect.github.com/pypa/packaging/pull/1039)
- Add zizmor and tighten up CI by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1035](https://redirect.github.com/pypa/packaging/pull/1035)
- Fix release script by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1040](https://redirect.github.com/pypa/packaging/pull/1040)
- Fix using a dev version (again) by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1041](https://redirect.github.com/pypa/packaging/pull/1041)
- Fix type hint of function used with `contextlib.contextmanager` by
[@&#8203;SpecLad](https://redirect.github.com/SpecLad) in
[#&#8203;1046](https://redirect.github.com/pypa/packaging/pull/1046)
- Always run tests by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1044](https://redirect.github.com/pypa/packaging/pull/1044)
- Fix a changelog number by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1042](https://redirect.github.com/pypa/packaging/pull/1042)
- Fix the publish job by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1043](https://redirect.github.com/pypa/packaging/pull/1043)
- Get the correct tag on publish by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1045](https://redirect.github.com/pypa/packaging/pull/1045)
- Test on first public release of CPython 3.11 and newer by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1056](https://redirect.github.com/pypa/packaging/pull/1056)
- Fix publication job (again) by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1051](https://redirect.github.com/pypa/packaging/pull/1051)
- Use `actionlint` to check CI workflows by
[@&#8203;miketheman](https://redirect.github.com/miketheman) in
[#&#8203;1052](https://redirect.github.com/pypa/packaging/pull/1052)
- Fix formatting of distribution types in metadata.rst by
[@&#8203;brettcannon](https://redirect.github.com/brettcannon) in
[#&#8203;1053](https://redirect.github.com/pypa/packaging/pull/1053)

#### New Contributors

- [@&#8203;cdce8p](https://redirect.github.com/cdce8p) made their first
contribution in
[#&#8203;881](https://redirect.github.com/pypa/packaging/pull/881)
- [@&#8203;dholth](https://redirect.github.com/dholth) made their first
contribution in
[#&#8203;860](https://redirect.github.com/pypa/packaging/pull/860)
- [@&#8203;trim21](https://redirect.github.com/trim21) made their first
contribution in
[#&#8203;908](https://redirect.github.com/pypa/packaging/pull/908)
- [@&#8203;yarikoptic](https://redirect.github.com/yarikoptic) made
their first contribution in
[#&#8203;910](https://redirect.github.com/pypa/packaging/pull/910)
- [@&#8203;cthoyt](https://redirect.github.com/cthoyt) made their first
contribution in
[#&#8203;868](https://redirect.github.com/pypa/packaging/pull/868)
- [@&#8203;bwoodsend](https://redirect.github.com/bwoodsend) made their
first contribution in
[#&#8203;879](https://redirect.github.com/pypa/packaging/pull/879)
- [@&#8203;stefan6419846](https://redirect.github.com/stefan6419846)
made their first contribution in
[#&#8203;921](https://redirect.github.com/pypa/packaging/pull/921)
- [@&#8203;bearomorphism](https://redirect.github.com/bearomorphism)
made their first contribution in
[#&#8203;913](https://redirect.github.com/pypa/packaging/pull/913)
- [@&#8203;EpicWink](https://redirect.github.com/EpicWink) made their
first contribution in
[#&#8203;922](https://redirect.github.com/pypa/packaging/pull/922)
- [@&#8203;Liam-DeVoe](https://redirect.github.com/Liam-DeVoe) made
their first contribution in
[#&#8203;932](https://redirect.github.com/pypa/packaging/pull/932)
- [@&#8203;subhajitsaha01](https://redirect.github.com/subhajitsaha01)
made their first contribution in
[#&#8203;930](https://redirect.github.com/pypa/packaging/pull/930)
- [@&#8203;ncoghlan](https://redirect.github.com/ncoghlan) made their
first contribution in
[#&#8203;973](https://redirect.github.com/pypa/packaging/pull/973)
- [@&#8203;zahlman](https://redirect.github.com/zahlman) made their
first contribution in
[#&#8203;1008](https://redirect.github.com/pypa/packaging/pull/1008)
- [@&#8203;JP-Ellis](https://redirect.github.com/JP-Ellis) made their
first contribution in
[#&#8203;939](https://redirect.github.com/pypa/packaging/pull/939)

#### Since last RC

Fixes:

- Restore `._version` as a compat shim by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1062](https://redirect.github.com/pypa/packaging/pull/1062)

Performance:

- Dual replace by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1064](https://redirect.github.com/pypa/packaging/pull/1064)

Documentaiton:

- Prepare for 26.0 final by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1063](https://redirect.github.com/pypa/packaging/pull/1063)

**Full Changelog**:
<pypa/packaging@26.0rc3...26.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[opentelemetry-api](https://redirect.github.com/open-telemetry/opentelemetry-python)
| `==1.38.0` → `==1.40.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/opentelemetry-api/1.40.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/opentelemetry-api/1.38.0/1.40.0?slim=true)
|
|
[opentelemetry-sdk](https://redirect.github.com/open-telemetry/opentelemetry-python)
| `==1.38.0` → `==1.40.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/opentelemetry-sdk/1.40.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/opentelemetry-sdk/1.38.0/1.40.0?slim=true)
|

---

### Release Notes

<details>
<summary>open-telemetry/opentelemetry-python
(opentelemetry-api)</summary>

###
[`v1.40.0`](https://redirect.github.com/open-telemetry/opentelemetry-python/blob/HEAD/CHANGELOG.md#Version-1400061b0-2026-03-04)

[Compare
Source](https://redirect.github.com/open-telemetry/opentelemetry-python/compare/v1.39.1...v1.40.0)

- `opentelemetry-sdk`: deprecate `LoggingHandler` in favor of
`opentelemetry-instrumentation-logging`, see
`opentelemetry-instrumentation-logging` documentation

([#&#8203;4919](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4919))
- `opentelemetry-sdk`: Clarify log processor error handling expectations
in documentation

([#&#8203;4915](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4915))
- bump semantic-conventions to v1.40.0

([#&#8203;4941](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4941))
- Add stale PR GitHub Action

([#&#8203;4926](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4926))
- `opentelemetry-sdk`: Drop unused Jaeger exporter environment variables
(exporter removed in 1.22.0)

([#&#8203;4918](https://redirect.github.com/open-telemetry/opentelemetry-python/issues/4918))
- `opentelemetry-sdk`: Clarify timeout units in environment variable
documentation

([#&#8203;4906](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4906))
- `opentelemetry-exporter-otlp-proto-grpc`: Fix re-initialization of
gRPC channel on UNAVAILABLE error

([#&#8203;4825](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4825))
- `opentelemetry-exporter-prometheus`: Fix duplicate HELP/TYPE
declarations for metrics with different label sets

([#&#8203;4868](https://redirect.github.com/open-telemetry/opentelemetry-python/issues/4868))
- Allow loading all resource detectors by setting
`OTEL_EXPERIMENTAL_RESOURCE_DETECTORS` to `*`

([#&#8203;4819](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4819))
- `opentelemetry-sdk`: Fix the type hint of the `_metrics_data` property
to allow `None`

([#&#8203;4837](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4837)).
- Regenerate opentelemetry-proto code with v1.9.0 release

([#&#8203;4840](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4840))
- Add python 3.14 support

([#&#8203;4798](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4798))
- Silence events API warnings for internal users

([#&#8203;4847](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4847))
- opentelemetry-sdk: make it possible to override the default processors
in the SDK configurator

([#&#8203;4806](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4806))
- Prevent possible endless recursion from happening in
`SimpleLogRecordProcessor.on_emit`,

([#&#8203;4799](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4799))
and
([#&#8203;4867](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4867)).
- Implement span start/end metrics

([#&#8203;4880](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4880))
- Add environment variable carriers to API

([#&#8203;4609](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4609))
- Add experimental composable rule based sampler

([#&#8203;4882](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4882))
- Make ConcurrentMultiSpanProcessor fork safe

([#&#8203;4862](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4862))
- `opentelemetry-exporter-otlp-proto-http`: fix retry logic and error
handling for connection failures in trace, metric, and log exporters

([#&#8203;4709](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4709))
- `opentelemetry-sdk`: avoid RuntimeError during iteration of view
instrument match dictionary in MetricReaderStorage.collect()

([#&#8203;4891](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4891))
- Implement experimental TracerConfigurator

([#&#8203;4861](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4861))
- `opentelemetry-sdk`: Fix instrument creation race condition

([#&#8203;4913](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4913))
- bump semantic-conventions to v1.39.0

([#&#8203;4914](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4914))
- `opentelemetry-sdk`: automatically generate configuration models using
OTel config JSON schema

([#&#8203;4879](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4879))

###
[`v1.39.1`](https://redirect.github.com/open-telemetry/opentelemetry-python/releases/tag/v1.39.1):
Version 1.39.1/0.60b1

[Compare
Source](https://redirect.github.com/open-telemetry/opentelemetry-python/compare/v1.39.0...v1.39.1)

This is a patch release on the previous 1.39.0/0.60b0 release, fixing
the issue(s) below.

- Silence events API warnings for internal users
([#&#8203;4847](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4847))

###
[`v1.39.0`](https://redirect.github.com/open-telemetry/opentelemetry-python/blob/HEAD/CHANGELOG.md#Version-1390060b0-2025-12-03)

[Compare
Source](https://redirect.github.com/open-telemetry/opentelemetry-python/compare/v1.38.0...v1.39.0)

- `opentelemetry-api`: Convert objects of any type other than AnyValue
in attributes to string to be exportable

([#&#8203;4808](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4808))
- docs: Added sqlcommenter example

([#&#8203;4734](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4734))
- build: bump ruff to 0.14.1

([#&#8203;4782](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4782))
- Add `opentelemetry-exporter-credential-provider-gcp` as an optional
dependency to `opentelemetry-exporter-otlp-proto-grpc`
  and `opentelemetry-exporter-otlp-proto-http`

([#&#8203;4760](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4760))
- feat: implement on ending in span processor

([#&#8203;4775](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4775))
- semantic-conventions: Bump to 1.38.0

([#&#8203;4791](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4791))
- \[BREAKING] Remove LogData and extend SDK LogRecord to have
instrumentation scope

([#&#8203;4676](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4676))
- \[BREAKING] Rename several classes from Log to LogRecord

([#&#8203;4647](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4647))

  **Migration Guide:**

  `LogData` has been removed. Users should update their code as follows:

- **For Log Exporters:** Change from `Sequence[LogData]` to
`Sequence[ReadableLogRecord]`
    ```python
    # Before
    from opentelemetry.sdk._logs import LogData
    def export(self, batch: Sequence[LogData]) -> LogRecordExportResult:
        ...

    # After
    from opentelemetry.sdk._logs import ReadableLogRecord
def export(self, batch: Sequence[ReadableLogRecord]) ->
LogRecordExportResult:
        ...
    ```

- **For Log Processors:** Use `ReadWriteLogRecord` for processing,
`ReadableLogRecord` for exporting
    ```python
    # Before
    from opentelemetry.sdk._logs import LogData
    def on_emit(self, log_data: LogData):
        ...

    # After
from opentelemetry.sdk._logs import ReadWriteLogRecord,
ReadableLogRecord
    def on_emit(self, log_record: ReadWriteLogRecord):
        # Convert to ReadableLogRecord before exporting
        readable = ReadableLogRecord(
            log_record=log_record.log_record,
            resource=log_record.resource or Resource.create({}),
            instrumentation_scope=log_record.instrumentation_scope,
            limits=log_record.limits,
        )
        ...
    ```

- **Accessing log data:** Use the same attributes on
`ReadableLogRecord`/`ReadWriteLogRecord`
- `log_record.log_record` - The API LogRecord (contains body, severity,
attributes, etc.)
    - `log_record.resource` - The Resource
- `log_record.instrumentation_scope` - The InstrumentationScope (now
included, was in LogData before)
    - `log_record.limits` - The LogRecordLimits
- Mark the Events API/SDK as deprecated. The Logs API/SDK should be used
instead, an event is now a `LogRecord` with the `event_name` field set

([#&#8203;4654](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4654)).
- Fix type checking for built-in metric exporters

([#&#8203;4820](https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4820))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/python-spanner-sqlalchemy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

---------

Co-authored-by: Knut Olav Løite <koloite@gmail.com>
…hemy/main' into migration.python-spanner-sqlalchemy.migration.2026-03-09_19-05-52.migrate
@gemini-code-assist
Copy link
Contributor

Warning

Gemini is experiencing higher than usual traffic and was unable to create the summary. Please try again in a few hours by commenting /gemini summary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

X Tutup