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