diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 38bd545c..d9de7a03 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -16,6 +16,8 @@ branchProtectionRules: - 'Samples - Python 3.10' - 'Samples - Python 3.11' - 'Samples - Python 3.12' + - 'Samples - Python 3.13' + permissionRules: - team: actools-python permission: admin diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d845b07..72311aa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,13 @@ Older versions of this project were distributed as [pybigquery][0]. [2]: https://pypi.org/project/pybigquery/#history +## [1.15.0](https://github.com/googleapis/python-bigquery-sqlalchemy/compare/v1.14.1...v1.15.0) (2025-06-18) + + +### Features + +* Add Python 3.13 runtime support ([#1211](https://github.com/googleapis/python-bigquery-sqlalchemy/issues/1211)) ([55336f3](https://github.com/googleapis/python-bigquery-sqlalchemy/commit/55336f38e57cfd245e603fd2246c6bae50065d67)) + ## [1.14.1](https://github.com/googleapis/python-bigquery-sqlalchemy/compare/v1.14.0...v1.14.1) (2025-05-09) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 3f0d9cdb..2f03f9d0 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 and 3.12 on both UNIX and Windows. + 3.8, 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 @@ -72,7 +72,7 @@ We use `nox `__ to instrument our tests. - To run a single unit test:: - $ nox -s unit-3.12 -- -k + $ nox -s unit-3.13 -- -k .. note:: @@ -143,12 +143,12 @@ Running System Tests $ nox -s system # Run a single system test - $ nox -s system-3.12 -- -k + $ nox -s system-3.13 -- -k .. note:: - System tests are only configured to run under Python 3.8, 3.11 and 3.12. + System tests are only configured to run under Python 3.8, 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 @@ -226,12 +226,14 @@ We support: - `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/ .. _Python 3.12: https://docs.python.org/3.12/ +.. _Python 3.13: https://docs.python.org/3.13/ Supported versions can be found in our ``noxfile.py`` `config`_. diff --git a/README.rst b/README.rst index b3e19045..2a64c0c7 100644 --- a/README.rst +++ b/README.rst @@ -51,7 +51,7 @@ dependencies. Supported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^ -Python >= 3.8 +Python >= 3.8, <3.14 Unsupported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/noxfile.py b/noxfile.py index 9825e03c..b6e34730 100644 --- a/noxfile.py +++ b/noxfile.py @@ -41,7 +41,7 @@ DEFAULT_PYTHON_VERSION = "3.8" -UNIT_TEST_PYTHON_VERSIONS: List[str] = ["3.8", "3.9", "3.10", "3.11", "3.12"] +UNIT_TEST_PYTHON_VERSIONS: List[str] = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] UNIT_TEST_STANDARD_DEPENDENCIES = [ "mock", "asyncmock", @@ -71,9 +71,14 @@ "geography", "bqstorage", ], + "3.13": [ + "tests", + "geography", + "bqstorage", + ], } -SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.8", "3.11", "3.12"] +SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.8", "3.12", "3.13"] SYSTEM_TEST_STANDARD_DEPENDENCIES: List[str] = [ "mock", "pytest", @@ -91,12 +96,12 @@ "alembic", "bqstorage", ], - "3.11": [ + "3.12": [ "tests", "geography", "bqstorage", ], - "3.12": [ + "3.13": [ "tests", "geography", "bqstorage", @@ -219,7 +224,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"]: + if install_extras and session.python in ["3.11", "3.12", "3.13"]: install_target = ".[geography,alembic,tests,bqstorage]" elif install_extras: install_target = ".[all]" @@ -395,7 +400,7 @@ def compliance(session): ) if session.python == "3.8": extras = "[tests,alembic]" - elif session.python in ["3.11", "3.12"]: + elif session.python in ["3.12", "3.13"]: extras = "[tests,geography]" else: extras = "[tests]" @@ -522,7 +527,7 @@ def docfx(session): ) -@nox.session(python="3.12") +@nox.session(python="3.13") @nox.parametrize( "protobuf_implementation", ["python", "upb", "cpp"], diff --git a/owlbot.py b/owlbot.py index 3b2884f3..5173dce0 100644 --- a/owlbot.py +++ b/owlbot.py @@ -33,10 +33,11 @@ "3.8": ["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"], - system_test_python_versions=["3.8", "3.11", "3.12"], + 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"], 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 7cf0be72..82b196c3 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,17 +1,20 @@ attrs==25.3.0 -click==8.1.8 -google-auth==2.38.0 -google-cloud-testutils==1.6.0 +click===8.1.8; python_version <= '3.9' +click==8.2.1; python_version >= '3.10' +google-auth==2.40.3 +google-cloud-testutils==1.6.4 iniconfig==2.1.0 -packaging==24.2 -pluggy==1.5.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 +rsa==4.9.1 six==1.17.0 toml==0.10.2 -typing-extensions==4.13.0 +typing-extensions===4.13.0; python_version == '3.8' +typing-extensions==4.14.0; python_version >= '3.9' diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index d2a9ab03..3ee07a2d 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,43 +1,47 @@ alembic===1.14.0; python_version == '3.8' -alembic==1.15.2; python_version >= '3.9' -certifi==2025.1.31 -charset-normalizer==3.4.1 +alembic==1.16.2; python_version >= '3.9' +certifi==2025.6.15 +charset-normalizer==3.4.2 geoalchemy2==0.17.1 -google-api-core[grpc]==2.24.2 -google-auth==2.38.0 +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.31.0; python_version >= '3.9' +google-cloud-bigquery==3.34.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.69.2 -greenlet==3.1.1 +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.71.0; python_version >= '3.9' +grpcio==1.73.0; python_version >= '3.9' grpcio-status===1.68.0; python_version == '3.8' -grpcio-status==1.71.0; python_version >= '3.9' +grpcio-status==1.73.0; 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.9; python_version >= '3.9' +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==24.2 +packaging==25.0 proto-plus==1.26.1 -protobuf===5.28.3; python_version >= '3.8' +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 -requests==2.32.3 -rsa==4.9 -shapely==2.0.7 +requests==2.32.4 +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.13.0 +typing-extensions===4.13.0; python_version == '3.8' +typing-extensions==4.14.0; python_version >= '3.9' urllib3===2.2.3; python_version == '3.8' -urllib3==2.3.0; python_version >= '3.9' +urllib3==2.5.0; python_version >= '3.9' diff --git a/setup.py b/setup.py index f655101c..6d6c814a 100644 --- a/setup.py +++ b/setup.py @@ -104,6 +104,7 @@ def readme(): "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Operating System :: OS Independent", "Topic :: Database :: Front-Ends", ], @@ -119,7 +120,7 @@ def readme(): "sqlalchemy>=1.4.16,<3.0.0", ], extras_require=extras, - python_requires=">=3.8, <3.13", + python_requires=">=3.8, <3.14", tests_require=["packaging", "pytz"], entry_points={ "sqlalchemy.dialects": ["bigquery = sqlalchemy_bigquery:BigQueryDialect"] diff --git a/sqlalchemy_bigquery/version.py b/sqlalchemy_bigquery/version.py index f69b018d..86059295 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.14.1" +__version__ = "1.15.0" diff --git a/testing/constraints-3.13.txt b/testing/constraints-3.13.txt index 0e713350..5b82150f 100644 --- a/testing/constraints-3.13.txt +++ b/testing/constraints-3.13.txt @@ -1,13 +1 @@ -# 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 "google-cloud-foo >= 1.14.0, < 2.0.0dev", -# Then this file should have google-cloud-foo==1.14.0 -google-api-core == 1.31.5 -google-auth==1.25.0 -google-cloud-bigquery==3.3.6 -google-cloud-bigquery-storage == 2.0.0 -grpcio == 1.47.0 -pyarrow == 3.0.0 -sqlalchemy==1.4.16 +numpy>=1.23