From 5f0bc1f4a301f5ef7b473c11bbe5c225afd4ab61 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 17 Jul 2025 00:52:46 +0200 Subject: [PATCH 01/13] chore(deps): update all dependencies (#1213) --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 82b196c3..d31b0a4e 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -17,4 +17,4 @@ rsa==4.9.1 six==1.17.0 toml==0.10.2 typing-extensions===4.13.0; python_version == '3.8' -typing-extensions==4.14.0; python_version >= '3.9' +typing-extensions==4.14.1; python_version >= '3.9' diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 3ee07a2d..a98926e2 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,12 +1,12 @@ alembic===1.14.0; python_version == '3.8' -alembic==1.16.2; python_version >= '3.9' -certifi==2025.6.15 +alembic==1.16.4; python_version >= '3.9' +certifi==2025.7.14 charset-normalizer==3.4.2 geoalchemy2==0.17.1 google-api-core[grpc]==2.25.1 google-auth==2.40.3 google-cloud-bigquery===3.30.0; python_version == '3.8' -google-cloud-bigquery==3.34.0; python_version >= '3.9' +google-cloud-bigquery==3.35.0; python_version >= '3.9' google-cloud-core==2.4.3 google-crc32c===1.5.0; python_version == '3.8' google-crc32c==1.7.1; python_version >= '3.9' @@ -15,9 +15,9 @@ googleapis-common-protos==1.70.0 greenlet===3.1.1; python_version == '3.8' greenlet==3.2.3; python_version >= '3.9' grpcio===1.68.0; python_version == '3.8' -grpcio==1.73.0; python_version >= '3.9' +grpcio==1.73.1; python_version >= '3.9' grpcio-status===1.68.0; python_version == '3.8' -grpcio-status==1.73.0; python_version >= '3.9' +grpcio-status==1.73.1; python_version >= '3.9' idna==3.10 importlib-resources===6.4.5; python_version == '3.8' importlib-resources==6.5.2; python_version >= '3.9' @@ -42,6 +42,6 @@ shapely==2.1.1; python_version >= '3.10' six==1.17.0 sqlalchemy===1.4.27 typing-extensions===4.13.0; python_version == '3.8' -typing-extensions==4.14.0; python_version >= '3.9' +typing-extensions==4.14.1; python_version >= '3.9' urllib3===2.2.3; python_version == '3.8' urllib3==2.5.0; python_version >= '3.9' From 632d6ef024bdd1dcb4206e2b111063f79f29b7ba Mon Sep 17 00:00:00 2001 From: Chalmer Lowe Date: Thu, 24 Jul 2025 14:22:20 -0400 Subject: [PATCH 02/13] feat: remove python 3.8 support (#1215) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: remove python 3.8 support * adds debugging to noxfile and tweaks to correct coverage * updates lowest version for system test and owlbot * updates DEFAULT_PYTHON_VERSION to 3.10 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * updates extras in several sessions & lists additional Python ver. * Revert "adds debugging to noxfile and tweaks to correct coverage" This reverts commit 4e86c0446c30d4e88e644d04f7a7c30581f2e47d. * adds back in code that was removed * adds pragma to avoid cover fallure. --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: Owl Bot --- .github/sync-repo-settings.yaml | 1 - CONTRIBUTING.rst | 12 +++++------- README.rst | 2 +- noxfile.py | 22 +++++----------------- owlbot.py | 6 +++--- samples/snippets/requirements-test.txt | 3 --- samples/snippets/requirements.txt | 13 ------------- setup.py | 2 +- sqlalchemy_bigquery/__init__.py | 11 +++++++---- testing/constraints-3.8.txt | 13 ------------- testing/constraints-3.9.txt | 13 +++++++++++++ 11 files changed, 35 insertions(+), 63 deletions(-) delete mode 100644 testing/constraints-3.8.txt diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index d9de7a03..c3e26318 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -11,7 +11,6 @@ branchProtectionRules: - 'OwlBot Post Processor' - 'Kokoro' - 'Samples - Lint' - - 'Samples - Python 3.8' - 'Samples - Python 3.9' - 'Samples - Python 3.10' - 'Samples - Python 3.11' diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 2f03f9d0..538a10eb 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -22,7 +22,7 @@ In order to add a feature: documentation. - The feature must work fully on the following CPython versions: - 3.8, 3.9, 3.10, 3.11, 3.12, and 3.13 on both UNIX and Windows. + 3.9, 3.10, 3.11, 3.12, and 3.13 on both UNIX and Windows. - The feature must not add unnecessary dependencies (where "unnecessary" is of course subjective, but new dependencies should @@ -148,7 +148,7 @@ Running System Tests .. note:: - System tests are only configured to run under Python 3.8, 3.12, and 3.13. + System tests are only configured to run under Python 3.9, 3.12, and 3.13. For expediency, we do not run them in older versions of Python 3. This alone will not run the tests. You'll need to change some local @@ -195,11 +195,11 @@ configure them just like the System Tests. # Run all tests in a folder $ cd samples/snippets - $ nox -s py-3.8 + $ nox -s py-3.9 # Run a single sample test $ cd samples/snippets - $ nox -s py-3.8 -- -k + $ nox -s py-3.9 -- -k ******************************************** Note About ``README`` as it pertains to PyPI @@ -221,14 +221,12 @@ Supported Python Versions We support: -- `Python 3.8`_ - `Python 3.9`_ - `Python 3.10`_ - `Python 3.11`_ - `Python 3.12`_ - `Python 3.13`_ -.. _Python 3.8: https://docs.python.org/3.8/ .. _Python 3.9: https://docs.python.org/3.9/ .. _Python 3.10: https://docs.python.org/3.10/ .. _Python 3.11: https://docs.python.org/3.11/ @@ -241,7 +239,7 @@ Supported versions can be found in our ``noxfile.py`` `config`_. .. _config: https://github.com/googleapis/python-bigquery-sqlalchemy/blob/main/noxfile.py -We also explicitly decided to support Python 3 beginning with version 3.8. +We also explicitly decided to support Python 3 beginning with version 3.9. Reasons for this include: - Encouraging use of newest versions of Python 3 diff --git a/README.rst b/README.rst index 2a64c0c7..be964f0c 100644 --- a/README.rst +++ b/README.rst @@ -51,7 +51,7 @@ dependencies. Supported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^ -Python >= 3.8, <3.14 +Python >= 3.9, <3.14 Unsupported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/noxfile.py b/noxfile.py index b6e34730..8fb2e70b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -39,9 +39,9 @@ "setup.py", ] -DEFAULT_PYTHON_VERSION = "3.8" +DEFAULT_PYTHON_VERSION = "3.10" -UNIT_TEST_PYTHON_VERSIONS: List[str] = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] +UNIT_TEST_PYTHON_VERSIONS: List[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"] UNIT_TEST_STANDARD_DEPENDENCIES = [ "mock", "asyncmock", @@ -56,11 +56,6 @@ "tests", ] UNIT_TEST_EXTRAS_BY_PYTHON: Dict[str, List[str]] = { - "3.8": [ - "tests", - "alembic", - "bqstorage", - ], "3.11": [ "tests", "geography", @@ -78,7 +73,7 @@ ], } -SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.8", "3.12", "3.13"] +SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.9", "3.12", "3.13"] SYSTEM_TEST_STANDARD_DEPENDENCIES: List[str] = [ "mock", "pytest", @@ -91,11 +86,6 @@ "tests", ] SYSTEM_TEST_EXTRAS_BY_PYTHON: Dict[str, List[str]] = { - "3.8": [ - "tests", - "alembic", - "bqstorage", - ], "3.12": [ "tests", "geography", @@ -398,10 +388,8 @@ def compliance(session): "-c", constraints_path, ) - if session.python == "3.8": - extras = "[tests,alembic]" - elif session.python in ["3.12", "3.13"]: - extras = "[tests,geography]" + if session.python in ["3.12", "3.13"]: + extras = "[tests,geography,alembic]" else: extras = "[tests]" session.install("-e", f".{extras}", "-c", constraints_path) diff --git a/owlbot.py b/owlbot.py index 5173dce0..a8e359fe 100644 --- a/owlbot.py +++ b/owlbot.py @@ -30,14 +30,14 @@ # ---------------------------------------------------------------------------- extras = ["tests"] extras_by_python = { - "3.8": ["tests", "alembic", "bqstorage"], + "3.9": ["tests", "alembic", "bqstorage"], "3.11": ["tests", "geography", "bqstorage"], "3.12": ["tests", "geography", "bqstorage"], "3.13": ["tests", "geography", "bqstorage"], } templated_files = common.py_library( - unit_test_python_versions=["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"], - system_test_python_versions=["3.8", "3.12", "3.13"], + unit_test_python_versions=["3.9", "3.10", "3.11", "3.12", "3.13"], + system_test_python_versions=["3.9", "3.12", "3.13"], cov_level=100, unit_test_extras=extras, unit_test_extras_by_python=extras_by_python, diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index d31b0a4e..de552810 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -5,16 +5,13 @@ google-auth==2.40.3 google-cloud-testutils==1.6.4 iniconfig==2.1.0 packaging==25.0 -pluggy===1.5.0; python_version == '3.8' pluggy==1.6.0; python_version >= '3.9' py==1.11.0 pyasn1==0.6.1 pyasn1-modules==0.4.2 -pyparsing===3.1.4; python_version == '3.8' pyparsing==3.2.3; python_version >= '3.9' pytest===6.2.5 rsa==4.9.1 six==1.17.0 toml==0.10.2 -typing-extensions===4.13.0; python_version == '3.8' typing-extensions==4.14.1; python_version >= '3.9' diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index a98926e2..9fb5e6cf 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,37 +1,26 @@ -alembic===1.14.0; python_version == '3.8' alembic==1.16.4; python_version >= '3.9' certifi==2025.7.14 charset-normalizer==3.4.2 geoalchemy2==0.17.1 google-api-core[grpc]==2.25.1 google-auth==2.40.3 -google-cloud-bigquery===3.30.0; python_version == '3.8' google-cloud-bigquery==3.35.0; python_version >= '3.9' google-cloud-core==2.4.3 -google-crc32c===1.5.0; python_version == '3.8' google-crc32c==1.7.1; python_version >= '3.9' google-resumable-media==2.7.2 googleapis-common-protos==1.70.0 -greenlet===3.1.1; python_version == '3.8' greenlet==3.2.3; python_version >= '3.9' -grpcio===1.68.0; python_version == '3.8' grpcio==1.73.1; python_version >= '3.9' -grpcio-status===1.68.0; python_version == '3.8' grpcio-status==1.73.1; python_version >= '3.9' idna==3.10 -importlib-resources===6.4.5; python_version == '3.8' importlib-resources==6.5.2; python_version >= '3.9' -mako===1.3.5; python_version == '3.8' mako==1.3.10; python_version >= '3.9' -markupsafe===2.1.5; python_version == '3.8' markupsafe==3.0.2; python_version >= '3.9' packaging==25.0 proto-plus==1.26.1 -protobuf===5.28.3; python_version == '3.8' protobuf==6.31.1; python_version >= '3.9' pyasn1==0.6.1 pyasn1-modules==0.4.2 -pyparsing===3.1.4; python_version == '3.8' pyparsing==3.2.3; python_version >= '3.9' python-dateutil==2.9.0.post0 pytz==2025.2 @@ -41,7 +30,5 @@ shapely===2.0.7; python_version <= '3.9' shapely==2.1.1; python_version >= '3.10' six==1.17.0 sqlalchemy===1.4.27 -typing-extensions===4.13.0; python_version == '3.8' typing-extensions==4.14.1; python_version >= '3.9' -urllib3===2.2.3; python_version == '3.8' urllib3==2.5.0; python_version >= '3.9' diff --git a/setup.py b/setup.py index 6d6c814a..472c8fa0 100644 --- a/setup.py +++ b/setup.py @@ -62,7 +62,7 @@ def readme(): # https://github.com/grpc/grpc/pull/15254 "grpcio >= 1.47.0, < 2.0.0", "grpcio >= 1.49.1, < 2.0.0; python_version>='3.11'", - "pyarrow >= 3.0.0", + "pyarrow >= 5.0.0", ], } diff --git a/sqlalchemy_bigquery/__init__.py b/sqlalchemy_bigquery/__init__.py index 1e506125..373c4861 100644 --- a/sqlalchemy_bigquery/__init__.py +++ b/sqlalchemy_bigquery/__init__.py @@ -48,14 +48,17 @@ from . import _versions_helpers sys_major, sys_minor, sys_micro = _versions_helpers.extract_runtime_version() -if sys_major == 3 and sys_minor in (7, 8): + +# Now that support for Python 3.7 and 3.8 has been removed, we don't expect the +# following check to succeed. The warning is only included for robustness. +if sys_major == 3 and sys_minor in (7, 8): # pragma: NO COVER warnings.warn( - "The python-bigquery library will stop supporting Python 3.7 " - "and Python 3.8 in a future major release expected in Q4 2024. " + "The python-bigquery-sqlalchemy library no longer supports Python 3.7 " + "and Python 3.8. " f"Your Python version is {sys_major}.{sys_minor}.{sys_micro}. We " "recommend that you update soon to ensure ongoing support. For " "more details, see: [Google Cloud Client Libraries Supported Python Versions policy](https://cloud.google.com/python/docs/supported-python-versions)", - PendingDeprecationWarning, + FutureWarning, ) diff --git a/testing/constraints-3.8.txt b/testing/constraints-3.8.txt deleted file mode 100644 index 667a747d..00000000 --- a/testing/constraints-3.8.txt +++ /dev/null @@ -1,13 +0,0 @@ -# This constraints file is used to check that lower bounds -# are correct in setup.py -# List *all* library dependencies and extras in this file. -# Pin the version to the lower bound. -# -# e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev", -sqlalchemy==1.4.16 -google-auth==1.25.0 -google-cloud-bigquery==3.3.6 -google-cloud-bigquery-storage==2.0.0 -google-api-core==1.31.5 -grpcio==1.47.0 -pyarrow==3.0.0 diff --git a/testing/constraints-3.9.txt b/testing/constraints-3.9.txt index e69de29b..a9840fe3 100644 --- a/testing/constraints-3.9.txt +++ b/testing/constraints-3.9.txt @@ -0,0 +1,13 @@ +# This constraints file is used to check that lower bounds +# are correct in setup.py +# List *all* library dependencies and extras in this file. +# Pin the version to the lower bound. +# +# e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev", +sqlalchemy==1.4.16 +google-auth==1.25.0 +google-cloud-bigquery==3.3.6 +google-cloud-bigquery-storage==2.0.0 +google-api-core==1.31.5 +grpcio==1.47.0 +numpy==1.26.4 From d5474a9118d9a5131b03fab9efd26546e9434652 Mon Sep 17 00:00:00 2001 From: Chalmer Lowe Date: Tue, 29 Jul 2025 05:05:03 -0400 Subject: [PATCH 03/13] chore: Add decorator @calculate_duration (#1216) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * adds debugging to noxfile and tweaks to correct coverage * adds a decorator to help calculate the duration of a nox session * Minor tweaks. * adds back in a pip freeze that was accidentally removed. * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- noxfile.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/noxfile.py b/noxfile.py index 8fb2e70b..98e341ec 100644 --- a/noxfile.py +++ b/noxfile.py @@ -18,10 +18,12 @@ from __future__ import absolute_import +from functools import wraps import os import pathlib import re import shutil +import time from typing import Dict, List import warnings @@ -100,6 +102,27 @@ CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() + +def _calculate_duration(func): + """This decorator prints the execution time for the decorated function.""" + + @wraps(func) + def wrapper(*args, **kwargs): + start = time.monotonic() + result = func(*args, **kwargs) + end = time.monotonic() + total_seconds = round(end - start) + hours = total_seconds // 3600 # Integer division to get hours + remaining_seconds = total_seconds % 3600 # Modulo to find remaining seconds + minutes = remaining_seconds // 60 + seconds = remaining_seconds % 60 + human_time = f"{hours:}:{minutes:0>2}:{seconds:0>2}" + print(f"Session ran in {total_seconds} seconds ({human_time})") + return result + + return wrapper + + nox.options.sessions = [ "unit", "system", @@ -118,6 +141,7 @@ @nox.session(python=DEFAULT_PYTHON_VERSION) +@_calculate_duration def lint(session): """Run linters. @@ -134,6 +158,7 @@ def lint(session): @nox.session(python=DEFAULT_PYTHON_VERSION) +@_calculate_duration def blacken(session): """Run black. Format code to uniform standard.""" session.install(BLACK_VERSION) @@ -144,6 +169,7 @@ def blacken(session): @nox.session(python=DEFAULT_PYTHON_VERSION) +@_calculate_duration def format(session): """ Run isort to sort imports. Then run black @@ -164,6 +190,7 @@ def format(session): @nox.session(python=DEFAULT_PYTHON_VERSION) +@_calculate_duration def lint_setup_py(session): """Verify that setup.py is valid (including RST check).""" session.install("docutils", "pygments") @@ -203,6 +230,7 @@ def install_unittest_dependencies(session, *constraints): "protobuf_implementation", ["python", "upb", "cpp"], ) +@_calculate_duration def unit(session, protobuf_implementation, install_extras=True): # Install all test dependencies, then install this package in-place. @@ -278,6 +306,7 @@ def install_systemtest_dependencies(session, *constraints): @nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS) +@_calculate_duration def system(session): """Run the system test suite.""" constraints_path = str( @@ -321,6 +350,7 @@ def system(session): @nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS) +@_calculate_duration def system_noextras(session): """Run the system test suite.""" constraints_path = str( @@ -366,6 +396,7 @@ def system_noextras(session): @nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS[-1]) +@_calculate_duration def compliance(session): """Run the SQLAlchemy dialect-compliance system tests""" constraints_path = str( @@ -418,6 +449,7 @@ def compliance(session): @nox.session(python=DEFAULT_PYTHON_VERSION) +@_calculate_duration def cover(session): """Run the final coverage report. @@ -431,6 +463,7 @@ def cover(session): @nox.session(python="3.10") +@_calculate_duration def docs(session): """Build the docs for this library.""" @@ -468,6 +501,7 @@ def docs(session): @nox.session(python="3.10") +@_calculate_duration def docfx(session): """Build the docfx yaml files for this library.""" @@ -520,6 +554,7 @@ def docfx(session): "protobuf_implementation", ["python", "upb", "cpp"], ) +@_calculate_duration def prerelease_deps(session, protobuf_implementation): """Run all tests with prerelease versions of dependencies installed.""" From 547d256b5f3847fe1bbc6693a1dfc719fdc6574e Mon Sep 17 00:00:00 2001 From: Chalmer Lowe Date: Wed, 30 Jul 2025 11:42:34 -0400 Subject: [PATCH 04/13] chore: updates owlbot and renovate.json to help control dependency when Python 3.9 is used. (#1227) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update all dependencies * add checks to avoid overwriting dependency when using python 3.9 * Update samples/snippets/requirements.txt * Update renovate.json * updates name of test to match upstream refactor * blocks a class with tests for content BQ does not support * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Mend Renovate Co-authored-by: Owl Bot --- owlbot.py | 1 + renovate.json | 9 ++++++++- samples/snippets/requirements.txt | 9 +++++---- .../test_dialect_compliance.py | 6 ++++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/owlbot.py b/owlbot.py index a8e359fe..b79babb4 100644 --- a/owlbot.py +++ b/owlbot.py @@ -53,6 +53,7 @@ # exclude gh actions as credentials are needed for tests ".github/workflows", "README.rst", + "renovate.json", ], ) diff --git a/renovate.json b/renovate.json index c7875c46..ccdeeb0a 100644 --- a/renovate.json +++ b/renovate.json @@ -8,5 +8,12 @@ "ignorePaths": [".pre-commit-config.yaml", ".kokoro/requirements.txt", "setup.py", ".github/workflows/unittest.yml"], "pip_requirements": { "fileMatch": ["requirements-test.txt", "samples/[\\S/]*constraints.txt", "samples/[\\S/]*constraints-test.txt"] - } + }, + "packageRules": [ + { + "matchFileNames": ["requirements.txt"], + "matchStrings": ["geoalchemy2(.*); python_version == '3.9'"], + "allowedVersions": ">= 0.17.1, < 0.18.0" + } + ] } diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 9fb5e6cf..9567dcd2 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,17 +1,18 @@ alembic==1.16.4; python_version >= '3.9' certifi==2025.7.14 charset-normalizer==3.4.2 -geoalchemy2==0.17.1 +geoalchemy2===0.17.1; python_version == '3.9' +geoalchemy2==0.18.0; python_version >= '3.10' google-api-core[grpc]==2.25.1 google-auth==2.40.3 -google-cloud-bigquery==3.35.0; python_version >= '3.9' +google-cloud-bigquery==3.35.1; python_version >= '3.9' google-cloud-core==2.4.3 google-crc32c==1.7.1; python_version >= '3.9' google-resumable-media==2.7.2 googleapis-common-protos==1.70.0 greenlet==3.2.3; python_version >= '3.9' -grpcio==1.73.1; python_version >= '3.9' -grpcio-status==1.73.1; python_version >= '3.9' +grpcio==1.74.0; python_version >= '3.9' +grpcio-status==1.74.0; python_version >= '3.9' idna==3.10 importlib-resources==6.5.2; python_version >= '3.9' mako==1.3.10; python_version >= '3.9' diff --git a/tests/sqlalchemy_dialect_compliance/test_dialect_compliance.py b/tests/sqlalchemy_dialect_compliance/test_dialect_compliance.py index ff14db9a..6ac2ffa0 100644 --- a/tests/sqlalchemy_dialect_compliance/test_dialect_compliance.py +++ b/tests/sqlalchemy_dialect_compliance/test_dialect_compliance.py @@ -55,8 +55,9 @@ ) from sqlalchemy.testing.suite.test_reflection import ( - BizarroCharacterFKResolutionTest, + BizarroCharacterTest, ComponentReflectionTest, + ComponentReflectionTestExtra, HasTableTest, ) @@ -615,6 +616,7 @@ def test_no_results_for_non_returning_insert(cls): pass +del ComponentReflectionTestExtra # Multiple tests re: CHECK CONSTRAINTS, etc which del ComponentReflectionTest # Multiple tests re: CHECK CONSTRAINTS, etc which # BQ does not support # class ComponentReflectionTest(_ComponentReflectionTest): @@ -629,7 +631,7 @@ def test_no_results_for_non_returning_insert(cls): # pass del ArrayTest # only appears to apply to postgresql -del BizarroCharacterFKResolutionTest +del BizarroCharacterTest del HasTableTest.test_has_table_cache # TODO confirm whether BQ has table caching del DistinctOnTest # expects unquoted table names. del HasIndexTest # BQ doesn't do the indexes that SQLA is loooking for. From a35be7a53fa6c0a4c21894bd68cc4160742320e8 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 3 Sep 2025 18:39:43 +0200 Subject: [PATCH 05/13] chore(deps): update all dependencies (#1229) --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index de552810..4276a2bb 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -14,4 +14,4 @@ pytest===6.2.5 rsa==4.9.1 six==1.17.0 toml==0.10.2 -typing-extensions==4.14.1; python_version >= '3.9' +typing-extensions==4.15.0; python_version >= '3.9' diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 9567dcd2..b4fb97b6 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,16 +1,16 @@ -alembic==1.16.4; python_version >= '3.9' -certifi==2025.7.14 -charset-normalizer==3.4.2 +alembic==1.16.5; python_version >= '3.9' +certifi==2025.8.3 +charset-normalizer==3.4.3 geoalchemy2===0.17.1; python_version == '3.9' geoalchemy2==0.18.0; python_version >= '3.10' google-api-core[grpc]==2.25.1 google-auth==2.40.3 -google-cloud-bigquery==3.35.1; python_version >= '3.9' +google-cloud-bigquery==3.36.0; python_version >= '3.9' google-cloud-core==2.4.3 google-crc32c==1.7.1; python_version >= '3.9' google-resumable-media==2.7.2 googleapis-common-protos==1.70.0 -greenlet==3.2.3; python_version >= '3.9' +greenlet==3.2.4; python_version >= '3.9' grpcio==1.74.0; python_version >= '3.9' grpcio-status==1.74.0; python_version >= '3.9' idna==3.10 @@ -19,17 +19,17 @@ mako==1.3.10; python_version >= '3.9' markupsafe==3.0.2; python_version >= '3.9' packaging==25.0 proto-plus==1.26.1 -protobuf==6.31.1; python_version >= '3.9' +protobuf==6.32.0; python_version >= '3.9' pyasn1==0.6.1 pyasn1-modules==0.4.2 pyparsing==3.2.3; python_version >= '3.9' python-dateutil==2.9.0.post0 pytz==2025.2 -requests==2.32.4 +requests==2.32.5 rsa==4.9.1 shapely===2.0.7; python_version <= '3.9' shapely==2.1.1; python_version >= '3.10' six==1.17.0 sqlalchemy===1.4.27 -typing-extensions==4.14.1; python_version >= '3.9' +typing-extensions==4.15.0; python_version >= '3.9' urllib3==2.5.0; python_version >= '3.9' From 47e055a82c909b712a96bfe38f975461faa2f339 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 10 Sep 2025 19:43:34 +0200 Subject: [PATCH 06/13] chore(deps): update dependency google-cloud-bigquery to v3.37.0 (#1230) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index b4fb97b6..36baabe3 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -5,7 +5,7 @@ geoalchemy2===0.17.1; python_version == '3.9' geoalchemy2==0.18.0; python_version >= '3.10' google-api-core[grpc]==2.25.1 google-auth==2.40.3 -google-cloud-bigquery==3.36.0; python_version >= '3.9' +google-cloud-bigquery==3.37.0; python_version >= '3.9' google-cloud-core==2.4.3 google-crc32c==1.7.1; python_version >= '3.9' google-resumable-media==2.7.2 From 5aac85300a43d74fa724aa56f4fc560314f78205 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Sep 2025 20:20:31 +0200 Subject: [PATCH 07/13] chore(deps): update all dependencies (#1231) --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 4276a2bb..3c4d3f1b 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -9,7 +9,7 @@ pluggy==1.6.0; python_version >= '3.9' py==1.11.0 pyasn1==0.6.1 pyasn1-modules==0.4.2 -pyparsing==3.2.3; python_version >= '3.9' +pyparsing==3.2.4; python_version >= '3.9' pytest===6.2.5 rsa==4.9.1 six==1.17.0 diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 36baabe3..f714a013 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -11,18 +11,18 @@ google-crc32c==1.7.1; python_version >= '3.9' google-resumable-media==2.7.2 googleapis-common-protos==1.70.0 greenlet==3.2.4; python_version >= '3.9' -grpcio==1.74.0; python_version >= '3.9' -grpcio-status==1.74.0; python_version >= '3.9' +grpcio==1.75.0; python_version >= '3.9' +grpcio-status==1.75.0; python_version >= '3.9' idna==3.10 importlib-resources==6.5.2; python_version >= '3.9' mako==1.3.10; python_version >= '3.9' markupsafe==3.0.2; python_version >= '3.9' packaging==25.0 proto-plus==1.26.1 -protobuf==6.32.0; python_version >= '3.9' +protobuf==6.32.1; python_version >= '3.9' pyasn1==0.6.1 pyasn1-modules==0.4.2 -pyparsing==3.2.3; python_version >= '3.9' +pyparsing==3.2.4; python_version >= '3.9' python-dateutil==2.9.0.post0 pytz==2025.2 requests==2.32.5 From d9217470bb10f6d914e6359f99ea096067fe6967 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 1 Oct 2025 21:58:08 +0100 Subject: [PATCH 08/13] chore(deps): update all dependencies (#1232) --- samples/snippets/requirements-test.txt | 6 +++--- samples/snippets/requirements.txt | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 3c4d3f1b..429b9b45 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,7 +1,7 @@ attrs==25.3.0 click===8.1.8; python_version <= '3.9' -click==8.2.1; python_version >= '3.10' -google-auth==2.40.3 +click==8.3.0; python_version >= '3.10' +google-auth==2.41.1 google-cloud-testutils==1.6.4 iniconfig==2.1.0 packaging==25.0 @@ -9,7 +9,7 @@ pluggy==1.6.0; python_version >= '3.9' py==1.11.0 pyasn1==0.6.1 pyasn1-modules==0.4.2 -pyparsing==3.2.4; python_version >= '3.9' +pyparsing==3.2.5; python_version >= '3.9' pytest===6.2.5 rsa==4.9.1 six==1.17.0 diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index f714a013..06d9e2e3 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -4,31 +4,31 @@ charset-normalizer==3.4.3 geoalchemy2===0.17.1; python_version == '3.9' geoalchemy2==0.18.0; python_version >= '3.10' google-api-core[grpc]==2.25.1 -google-auth==2.40.3 -google-cloud-bigquery==3.37.0; python_version >= '3.9' +google-auth==2.41.1 +google-cloud-bigquery==3.38.0; python_version >= '3.9' google-cloud-core==2.4.3 google-crc32c==1.7.1; python_version >= '3.9' google-resumable-media==2.7.2 googleapis-common-protos==1.70.0 greenlet==3.2.4; python_version >= '3.9' -grpcio==1.75.0; python_version >= '3.9' -grpcio-status==1.75.0; python_version >= '3.9' +grpcio==1.75.1; python_version >= '3.9' +grpcio-status==1.75.1; python_version >= '3.9' idna==3.10 importlib-resources==6.5.2; python_version >= '3.9' mako==1.3.10; python_version >= '3.9' -markupsafe==3.0.2; python_version >= '3.9' +markupsafe==3.0.3; python_version >= '3.9' packaging==25.0 proto-plus==1.26.1 protobuf==6.32.1; python_version >= '3.9' pyasn1==0.6.1 pyasn1-modules==0.4.2 -pyparsing==3.2.4; python_version >= '3.9' +pyparsing==3.2.5; python_version >= '3.9' python-dateutil==2.9.0.post0 pytz==2025.2 requests==2.32.5 rsa==4.9.1 shapely===2.0.7; python_version <= '3.9' -shapely==2.1.1; python_version >= '3.10' +shapely==2.1.2; python_version >= '3.10' six==1.17.0 sqlalchemy===1.4.27 typing-extensions==4.15.0; python_version >= '3.9' From 552e543b5265d155e05f0299ba15711a0f39dc27 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 3 Oct 2025 20:35:18 +0100 Subject: [PATCH 09/13] chore(deps): update dependency google-api-core to v2.25.2 (#1234) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 06d9e2e3..612bd5b5 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -3,7 +3,7 @@ certifi==2025.8.3 charset-normalizer==3.4.3 geoalchemy2===0.17.1; python_version == '3.9' geoalchemy2==0.18.0; python_version >= '3.10' -google-api-core[grpc]==2.25.1 +google-api-core[grpc]==2.25.2 google-auth==2.41.1 google-cloud-bigquery==3.38.0; python_version >= '3.9' google-cloud-core==2.4.3 From f3cd5072ccd4a0fcc1ce80cab573a14c667e951c Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 7 Oct 2025 18:28:43 +0100 Subject: [PATCH 10/13] chore(deps): update all dependencies (#1235) --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 429b9b45..b878043a 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,4 +1,4 @@ -attrs==25.3.0 +attrs==25.4.0 click===8.1.8; python_version <= '3.9' click==8.3.0; python_version >= '3.10' google-auth==2.41.1 diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 612bd5b5..2b448f07 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,5 +1,5 @@ alembic==1.16.5; python_version >= '3.9' -certifi==2025.8.3 +certifi==2025.10.5 charset-normalizer==3.4.3 geoalchemy2===0.17.1; python_version == '3.9' geoalchemy2==0.18.0; python_version >= '3.10' From 9478f4b2a8ee67e6e6f25da29a904e9b5994f1b3 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 12:51:55 -0700 Subject: [PATCH 11/13] chore(python): Add Python 3.14 to python post processor image (#1237) Source-Link: https://github.com/googleapis/synthtool/commit/16790a32126759493ba20781e04edd165825ff82 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:543e209e7c1c1ffe720eb4db1a3f045a75099304fb19aa11a47dc717b8aae2a9 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/samples/python3.14/common.cfg | 40 ++++++++++++++++++++ .kokoro/samples/python3.14/continuous.cfg | 6 +++ .kokoro/samples/python3.14/periodic-head.cfg | 11 ++++++ .kokoro/samples/python3.14/periodic.cfg | 6 +++ .kokoro/samples/python3.14/presubmit.cfg | 6 +++ samples/snippets/noxfile.py | 2 +- 7 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 .kokoro/samples/python3.14/common.cfg create mode 100644 .kokoro/samples/python3.14/continuous.cfg create mode 100644 .kokoro/samples/python3.14/periodic-head.cfg create mode 100644 .kokoro/samples/python3.14/periodic.cfg create mode 100644 .kokoro/samples/python3.14/presubmit.cfg diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 508ba98e..4a311db0 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:25de45b58e52021d3a24a6273964371a97a4efeefe6ad3845a64e697c63b6447 -# created: 2025-04-14T14:34:43.260858345Z + digest: sha256:543e209e7c1c1ffe720eb4db1a3f045a75099304fb19aa11a47dc717b8aae2a9 +# created: 2025-10-09T14:48:42.914384887Z diff --git a/.kokoro/samples/python3.14/common.cfg b/.kokoro/samples/python3.14/common.cfg new file mode 100644 index 00000000..cc6e7ee0 --- /dev/null +++ b/.kokoro/samples/python3.14/common.cfg @@ -0,0 +1,40 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Specify which tests to run +env_vars: { + key: "RUN_TESTS_SESSION" + value: "py-3.14" +} + +# Declare build specific Cloud project. +env_vars: { + key: "BUILD_SPECIFIC_GCLOUD_PROJECT" + value: "python-docs-samples-tests-314" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-bigquery-sqlalchemy/.kokoro/test-samples.sh" +} + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker" +} + +# Download secrets for samples +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples" + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "python-bigquery-sqlalchemy/.kokoro/trampoline_v2.sh" diff --git a/.kokoro/samples/python3.14/continuous.cfg b/.kokoro/samples/python3.14/continuous.cfg new file mode 100644 index 00000000..a1c8d975 --- /dev/null +++ b/.kokoro/samples/python3.14/continuous.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/.kokoro/samples/python3.14/periodic-head.cfg b/.kokoro/samples/python3.14/periodic-head.cfg new file mode 100644 index 00000000..abf3481d --- /dev/null +++ b/.kokoro/samples/python3.14/periodic-head.cfg @@ -0,0 +1,11 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-bigquery-sqlalchemy/.kokoro/test-samples-against-head.sh" +} diff --git a/.kokoro/samples/python3.14/periodic.cfg b/.kokoro/samples/python3.14/periodic.cfg new file mode 100644 index 00000000..71cd1e59 --- /dev/null +++ b/.kokoro/samples/python3.14/periodic.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "False" +} diff --git a/.kokoro/samples/python3.14/presubmit.cfg b/.kokoro/samples/python3.14/presubmit.cfg new file mode 100644 index 00000000..a1c8d975 --- /dev/null +++ b/.kokoro/samples/python3.14/presubmit.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index e5885544..6c2546ed 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -89,7 +89,7 @@ def get_pytest_env_vars() -> Dict[str, str]: # DO NOT EDIT - automatically generated. # All versions used to test samples. -ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] +ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] # Any default versions that should be ignored. IGNORED_VERSIONS = TEST_CONFIG["ignored_versions"] From c09a00976a70194abb2561753071e3e7b3659d5c Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Tue, 4 Nov 2025 19:28:24 -0500 Subject: [PATCH 12/13] feat: Add support for Python 3.14 (#1278) --- CONTRIBUTING.rst | 10 ++++++---- noxfile.py | 38 +++++++++++++++++++++++++++--------- owlbot.py | 5 +++-- setup.py | 6 ++++-- testing/constraints-3.14.txt | 0 5 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 testing/constraints-3.14.txt diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 538a10eb..3d141082 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -22,7 +22,7 @@ In order to add a feature: documentation. - The feature must work fully on the following CPython versions: - 3.9, 3.10, 3.11, 3.12, and 3.13 on both UNIX and Windows. + 3.9, 3.10, 3.11, 3.12, 3.13 and 3.14 on both UNIX and Windows. - The feature must not add unnecessary dependencies (where "unnecessary" is of course subjective, but new dependencies should @@ -72,7 +72,7 @@ We use `nox `__ to instrument our tests. - To run a single unit test:: - $ nox -s unit-3.13 -- -k + $ nox -s unit-3.14 -- -k .. note:: @@ -143,12 +143,12 @@ Running System Tests $ nox -s system # Run a single system test - $ nox -s system-3.13 -- -k + $ nox -s system-3.14 -- -k .. note:: - System tests are only configured to run under Python 3.9, 3.12, and 3.13. + System tests are only configured to run under Python 3.9, 3.12, and 3.14. For expediency, we do not run them in older versions of Python 3. This alone will not run the tests. You'll need to change some local @@ -226,12 +226,14 @@ We support: - `Python 3.11`_ - `Python 3.12`_ - `Python 3.13`_ +- `Python 3.14`_ .. _Python 3.9: https://docs.python.org/3.9/ .. _Python 3.10: https://docs.python.org/3.10/ .. _Python 3.11: https://docs.python.org/3.11/ .. _Python 3.12: https://docs.python.org/3.12/ .. _Python 3.13: https://docs.python.org/3.13/ +.. _Python 3.14: https://docs.python.org/3.14/ Supported versions can be found in our ``noxfile.py`` `config`_. diff --git a/noxfile.py b/noxfile.py index 98e341ec..d4fd895b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -41,9 +41,9 @@ "setup.py", ] -DEFAULT_PYTHON_VERSION = "3.10" +DEFAULT_PYTHON_VERSION = "3.14" -UNIT_TEST_PYTHON_VERSIONS: List[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"] +UNIT_TEST_PYTHON_VERSIONS: List[str] = ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] UNIT_TEST_STANDARD_DEPENDENCIES = [ "mock", "asyncmock", @@ -73,9 +73,14 @@ "geography", "bqstorage", ], + "3.14": [ + "tests", + "geography", + "bqstorage", + ], } -SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.9", "3.12", "3.13"] +SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.9", "3.12", "3.13", "3.14"] SYSTEM_TEST_STANDARD_DEPENDENCIES: List[str] = [ "mock", "pytest", @@ -98,6 +103,11 @@ "geography", "bqstorage", ], + "3.14": [ + "tests", + "geography", + "bqstorage", + ], } CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() @@ -193,7 +203,7 @@ def format(session): @_calculate_duration def lint_setup_py(session): """Verify that setup.py is valid (including RST check).""" - session.install("docutils", "pygments") + session.install("docutils", "pygments", "setuptools") session.run("python", "setup.py", "check", "--restructuredtext", "--strict") @@ -234,7 +244,12 @@ def install_unittest_dependencies(session, *constraints): def unit(session, protobuf_implementation, install_extras=True): # Install all test dependencies, then install this package in-place. - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): + if protobuf_implementation == "cpp" and session.python in ( + "3.11", + "3.12", + "3.13", + "3.14", + ): session.skip("cpp implementation is not supported in python 3.11+") constraints_path = str( @@ -242,7 +257,7 @@ def unit(session, protobuf_implementation, install_extras=True): ) install_unittest_dependencies(session, "-c", constraints_path) - if install_extras and session.python in ["3.11", "3.12", "3.13"]: + if install_extras and session.python in ["3.11", "3.12", "3.13", "3.14"]: install_target = ".[geography,alembic,tests,bqstorage]" elif install_extras: install_target = ".[all]" @@ -419,7 +434,7 @@ def compliance(session): "-c", constraints_path, ) - if session.python in ["3.12", "3.13"]: + if session.python in ["3.12", "3.13", "3.14"]: extras = "[tests,geography,alembic]" else: extras = "[tests]" @@ -549,7 +564,7 @@ def docfx(session): ) -@nox.session(python="3.13") +@nox.session(python=DEFAULT_PYTHON_VERSION) @nox.parametrize( "protobuf_implementation", ["python", "upb", "cpp"], @@ -558,7 +573,12 @@ def docfx(session): def prerelease_deps(session, protobuf_implementation): """Run all tests with prerelease versions of dependencies installed.""" - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): + if protobuf_implementation == "cpp" and session.python in ( + "3.11", + "3.12", + "3.13", + "3.14", + ): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies diff --git a/owlbot.py b/owlbot.py index b79babb4..e5e1d8b4 100644 --- a/owlbot.py +++ b/owlbot.py @@ -34,10 +34,11 @@ "3.11": ["tests", "geography", "bqstorage"], "3.12": ["tests", "geography", "bqstorage"], "3.13": ["tests", "geography", "bqstorage"], + "3.14": ["tests", "geography", "bqstorage"], } templated_files = common.py_library( - unit_test_python_versions=["3.9", "3.10", "3.11", "3.12", "3.13"], - system_test_python_versions=["3.9", "3.12", "3.13"], + unit_test_python_versions=["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"], + system_test_python_versions=["3.9", "3.12", "3.13", "3.14"], cov_level=100, unit_test_extras=extras, unit_test_extras_by_python=extras_by_python, diff --git a/setup.py b/setup.py index 472c8fa0..fbc319bd 100644 --- a/setup.py +++ b/setup.py @@ -61,7 +61,8 @@ def readme(): # grpc.Channel.close() method isn't added until 1.32.0. # https://github.com/grpc/grpc/pull/15254 "grpcio >= 1.47.0, < 2.0.0", - "grpcio >= 1.49.1, < 2.0.0; python_version>='3.11'", + "grpcio >= 1.49.1, < 2.0.0; python_version =='3.11'", + "grpcio >= 1.75.1, < 2.0.0; python_version >= '3.14'", "pyarrow >= 5.0.0", ], } @@ -105,6 +106,7 @@ def readme(): "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", "Topic :: Database :: Front-Ends", ], @@ -120,7 +122,7 @@ def readme(): "sqlalchemy>=1.4.16,<3.0.0", ], extras_require=extras, - python_requires=">=3.8, <3.14", + python_requires=">=3.8, <3.15", tests_require=["packaging", "pytz"], entry_points={ "sqlalchemy.dialects": ["bigquery = sqlalchemy_bigquery:BigQueryDialect"] diff --git a/testing/constraints-3.14.txt b/testing/constraints-3.14.txt new file mode 100644 index 00000000..e69de29b From 83c677d00b8fcc8e5ac330f7d3f9cc787869485b Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 5 Nov 2025 20:29:32 -0500 Subject: [PATCH 13/13] chore(main): release 1.16.0 (#1217) :robot: I have created a release *beep* *boop* --- ## [1.16.0](https://github.com/googleapis/python-bigquery-sqlalchemy/compare/v1.15.0...v1.16.0) (2025-11-05) ### Features * Add support for Python 3.14 ([#1278](https://github.com/googleapis/python-bigquery-sqlalchemy/issues/1278)) ([c09a009](https://github.com/googleapis/python-bigquery-sqlalchemy/commit/c09a00976a70194abb2561753071e3e7b3659d5c)) * Remove python 3.8 support ([#1215](https://github.com/googleapis/python-bigquery-sqlalchemy/issues/1215)) ([632d6ef](https://github.com/googleapis/python-bigquery-sqlalchemy/commit/632d6ef024bdd1dcb4206e2b111063f79f29b7ba)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ sqlalchemy_bigquery/version.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72311aa6..83a5bc63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Older versions of this project were distributed as [pybigquery][0]. [2]: https://pypi.org/project/pybigquery/#history +## [1.16.0](https://github.com/googleapis/python-bigquery-sqlalchemy/compare/v1.15.0...v1.16.0) (2025-11-05) + + +### Features + +* Add support for Python 3.14 ([#1278](https://github.com/googleapis/python-bigquery-sqlalchemy/issues/1278)) ([c09a009](https://github.com/googleapis/python-bigquery-sqlalchemy/commit/c09a00976a70194abb2561753071e3e7b3659d5c)) +* Remove python 3.8 support ([#1215](https://github.com/googleapis/python-bigquery-sqlalchemy/issues/1215)) ([632d6ef](https://github.com/googleapis/python-bigquery-sqlalchemy/commit/632d6ef024bdd1dcb4206e2b111063f79f29b7ba)) + ## [1.15.0](https://github.com/googleapis/python-bigquery-sqlalchemy/compare/v1.14.1...v1.15.0) (2025-06-18) diff --git a/sqlalchemy_bigquery/version.py b/sqlalchemy_bigquery/version.py index 86059295..e76f81a9 100644 --- a/sqlalchemy_bigquery/version.py +++ b/sqlalchemy_bigquery/version.py @@ -17,4 +17,4 @@ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__version__ = "1.15.0" +__version__ = "1.16.0"