From 1be9a4e8d8ab03eb938bfe3c7f6a1b56fb0be09a Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 15 Oct 2025 16:56:24 -0700 Subject: [PATCH 01/16] updated noxfile to avoid 3.7 and 3.8 --- mypy.ini | 2 +- noxfile.py | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mypy.ini b/mypy.ini index beaa679a8..1420daa1d 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,3 +1,3 @@ [mypy] -python_version = 3.8 +python_version = 3.13 namespace_packages = True diff --git a/noxfile.py b/noxfile.py index 9e81d7179..4e8e4fa94 100644 --- a/noxfile.py +++ b/noxfile.py @@ -33,7 +33,7 @@ ISORT_VERSION = "isort==5.11.0" LINT_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] -DEFAULT_PYTHON_VERSION = "3.8" +DEFAULT_PYTHON_VERSION = "3.13" UNIT_TEST_PYTHON_VERSIONS: List[str] = [ "3.7", @@ -61,7 +61,7 @@ UNIT_TEST_EXTRAS: List[str] = [] UNIT_TEST_EXTRAS_BY_PYTHON: Dict[str, List[str]] = {} -SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.7"] +SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.9"] SYSTEM_TEST_STANDARD_DEPENDENCIES: List[str] = [ "mock", "pytest", @@ -79,7 +79,11 @@ CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() nox.options.sessions = [ - "unit", + "unit-3.9", + "unit-3.10", + "unit-3.11", + "unit-3.12", + "unit-3.13", "system_emulated", "system", "mypy", @@ -170,7 +174,7 @@ def mypy(session): @nox.session(python=DEFAULT_PYTHON_VERSION) def lint_setup_py(session): """Verify that setup.py is valid (including RST check).""" - session.install("docutils", "pygments") + session.install("setuptools", "docutils", "pygments") session.run("python", "setup.py", "check", "--restructuredtext", "--strict") @@ -210,7 +214,8 @@ def install_unittest_dependencies(session, *constraints): def unit(session, protobuf_implementation): # Install all test dependencies, then install this package in-place. - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): + py_version = tuple([int(v) for v in session.python.split(".")]) + if protobuf_implementation == "cpp" and py_version >= (3, 11): session.skip("cpp implementation is not supported in python 3.11+") constraints_path = str( @@ -469,7 +474,8 @@ 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"): + py_version = tuple([int(v) for v in session.python.split(".")]) + if protobuf_implementation == "cpp" and py_version >= (3, 11): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies From 9b6f8f8409eccbe2123c25946b2fcf5947a29b5b Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 15 Oct 2025 16:57:45 -0700 Subject: [PATCH 02/16] added generic system test --- .kokoro/presubmit/system.cfg | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .kokoro/presubmit/system.cfg diff --git a/.kokoro/presubmit/system.cfg b/.kokoro/presubmit/system.cfg new file mode 100644 index 000000000..6e4f768fd --- /dev/null +++ b/.kokoro/presubmit/system.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Only run this nox session. +env_vars: { + key: "NOX_SESSION" + value: "system" +} From 90dbcbee51a96ac7f64ce7ee5c24f3089c3e26b4 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 15 Oct 2025 16:58:25 -0700 Subject: [PATCH 03/16] changed required tests --- .github/sync-repo-settings.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 9920db74d..be723d073 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -17,18 +17,17 @@ branchProtectionRules: # List of required status check contexts that must pass for commits to be accepted to matching branches. requiredStatusCheckContexts: - 'Kokoro' - - 'Kokoro system-3.7' + - 'Kokoro system' - 'cla/google' - 'OwlBot Post Processor' - 'docs' - 'docfx' - 'lint' - - 'unit (3.7)' - - 'unit (3.8)' - 'unit (3.9)' - 'unit (3.10)' - 'unit (3.11)' - 'unit (3.12)' + - 'unit (3.13)' - 'cover' - 'run-systests' # List of explicit permissions to add (additive only) From d464f51d815c78f181939962b01836c7f5b59467 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 15 Oct 2025 17:01:24 -0700 Subject: [PATCH 04/16] updated versions --- .github/workflows/lint.yml | 2 +- .github/workflows/mypy.yml | 2 +- .github/workflows/system_emulated.yml | 2 +- .github/workflows/unittest.yml | 2 +- owlbot.py | 3 +++ 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4866193af..9a0598202 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.13" - name: Install nox run: | python -m pip install --upgrade setuptools pip wheel diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index 772186478..27075146a 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.13" - name: Install nox run: | python -m pip install --upgrade setuptools pip wheel diff --git a/.github/workflows/system_emulated.yml b/.github/workflows/system_emulated.yml index 0f3a69224..bb7986a0a 100644 --- a/.github/workflows/system_emulated.yml +++ b/.github/workflows/system_emulated.yml @@ -17,7 +17,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v5 with: - python-version: '3.7' + python-version: '3.13' # firestore emulator requires java 21+ - name: Setup Java diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index c66b757ce..32b627997 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -45,7 +45,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.13" - name: Install coverage run: | python -m pip install --upgrade setuptools pip wheel diff --git a/owlbot.py b/owlbot.py index f08048fef..3c5cc5fe6 100644 --- a/owlbot.py +++ b/owlbot.py @@ -144,6 +144,9 @@ def update_fixup_scripts(library): microgenerator=True, cov_level=100, split_system_tests=True, + default_python_version="3.13", + system_test_python_versions=["3.9"], + unit_test_python_versions=["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"], ) s.move(templated_files, From ec7966d8034e128d7177f8690a967ac4e901cd3b Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 15 Oct 2025 17:11:54 -0700 Subject: [PATCH 05/16] ignore warnings --- pytest.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pytest.ini b/pytest.ini index 099cbd3ad..2d9b7edf9 100644 --- a/pytest.ini +++ b/pytest.ini @@ -18,3 +18,5 @@ filterwarnings = ignore:After January 1, 2024, new releases of this library will drop support for Python 3.7:DeprecationWarning # Remove warning once https://github.com/googleapis/gapic-generator-python/issues/1939 is fixed ignore:get_mtls_endpoint_and_cert_source is deprecated.:DeprecationWarning + # Remove once credential file support is removed + ignore:.*The \`credentials_file\` argument is deprecated.*:DeprecationWarning \ No newline at end of file From 6122c10cf79bf2050123f719c2824d867903ab58 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 15 Oct 2025 17:28:47 -0700 Subject: [PATCH 06/16] fixed mypy errors --- .github/.OwlBot.lock.yaml | 4 ++-- google/cloud/firestore_bundle/bundle.py | 3 ++- google/cloud/firestore_v1/async_transaction.py | 3 ++- google/cloud/firestore_v1/base_query.py | 3 ++- mypy.ini | 4 ++++ 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 508ba98ef..9a7846675 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:4a9e5d44b98e8672e2037ee22bc6b4f8e844a2d75fcb78ea8a4b38510112abc6 +# created: 2025-10-07 diff --git a/google/cloud/firestore_bundle/bundle.py b/google/cloud/firestore_bundle/bundle.py index 0f9aaed97..e985a1e06 100644 --- a/google/cloud/firestore_bundle/bundle.py +++ b/google/cloud/firestore_bundle/bundle.py @@ -344,9 +344,10 @@ def build(self) -> str: BundleElement(document_metadata=bundled_document.metadata) ) document_count += 1 + bundle_pb = bundled_document.snapshot._to_protobuf() buffer += self._compile_bundle_element( BundleElement( - document=bundled_document.snapshot._to_protobuf()._pb, + document=bundle_pb._pb if bundle_pb else None, ) ) diff --git a/google/cloud/firestore_v1/async_transaction.py b/google/cloud/firestore_v1/async_transaction.py index 36509941e..739aa8ec6 100644 --- a/google/cloud/firestore_v1/async_transaction.py +++ b/google/cloud/firestore_v1/async_transaction.py @@ -21,6 +21,7 @@ AsyncGenerator, Awaitable, Callable, + Generic, Optional, ) @@ -253,7 +254,7 @@ async def get( ) -class _AsyncTransactional(_BaseTransactional): +class _AsyncTransactional(_BaseTransactional, Generic[T, P]): """Provide a callable object to use as a transactional decorater. This is surfaced via diff --git a/google/cloud/firestore_v1/base_query.py b/google/cloud/firestore_v1/base_query.py index 14df886bc..0a16b7592 100644 --- a/google/cloud/firestore_v1/base_query.py +++ b/google/cloud/firestore_v1/base_query.py @@ -930,7 +930,8 @@ def _normalize_cursor(self, cursor, orders) -> Tuple[List, bool] | None: if isinstance(document_fields, document.DocumentSnapshot): snapshot = document_fields document_fields = snapshot.to_dict() - document_fields["__name__"] = snapshot.reference + if document_fields is not None: + document_fields["__name__"] = snapshot.reference if isinstance(document_fields, dict): # Transform to list using orders diff --git a/mypy.ini b/mypy.ini index 1420daa1d..59a6e4d37 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,3 +1,7 @@ [mypy] python_version = 3.13 namespace_packages = True + +# ignore gapic files +[mypy-google.cloud.firestore_v1.services.*] +ignore_errors = True \ No newline at end of file From 68f208c75a3f521525ff19ab1ec596f1ed95e82e Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 15 Oct 2025 17:34:04 -0700 Subject: [PATCH 07/16] fixed typing --- google/cloud/firestore_v1/async_transaction.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/google/cloud/firestore_v1/async_transaction.py b/google/cloud/firestore_v1/async_transaction.py index 739aa8ec6..0dfa82e01 100644 --- a/google/cloud/firestore_v1/async_transaction.py +++ b/google/cloud/firestore_v1/async_transaction.py @@ -24,6 +24,7 @@ Generic, Optional, ) +from typing_extensions import Concatenate, ParamSpec, TypeVar from google.api_core import exceptions, gapic_v1 from google.api_core import retry_async as retries @@ -45,14 +46,14 @@ # Types needed only for Type Hints if TYPE_CHECKING: # pragma: NO COVER import datetime - from typing_extensions import TypeVar, ParamSpec, Concatenate from google.cloud.firestore_v1.async_stream_generator import AsyncStreamGenerator from google.cloud.firestore_v1.base_document import DocumentSnapshot from google.cloud.firestore_v1.query_profile import ExplainOptions - T = TypeVar("T") - P = ParamSpec("P") + +T = TypeVar("T") +P = ParamSpec("P") class AsyncTransaction(async_batch.AsyncWriteBatch, BaseTransaction): From 84e661e67cdb04a3d009078172c2959c78b9f3dc Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 15 Oct 2025 17:35:15 -0700 Subject: [PATCH 08/16] removed duplicate field --- owlbot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/owlbot.py b/owlbot.py index 3c5cc5fe6..86e8feff9 100644 --- a/owlbot.py +++ b/owlbot.py @@ -138,7 +138,6 @@ def update_fixup_scripts(library): # ---------------------------------------------------------------------------- templated_files = common.py_library( samples=False, # set to True only if there are samples - system_test_python_versions=["3.7"], unit_test_external_dependencies=["aiounittest", "six", "freezegun"], system_test_external_dependencies=["pytest-asyncio", "six"], microgenerator=True, From 313d660f401abd5a5b9f61f387cc860ca25a734d Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Thu, 16 Oct 2025 00:37:21 +0000 Subject: [PATCH 09/16] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20?= =?UTF-8?q?post-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- .kokoro/presubmit/system-3.9.cfg | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .kokoro/presubmit/system-3.9.cfg diff --git a/.kokoro/presubmit/system-3.9.cfg b/.kokoro/presubmit/system-3.9.cfg new file mode 100644 index 000000000..b8ae66b37 --- /dev/null +++ b/.kokoro/presubmit/system-3.9.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Only run this nox session. +env_vars: { + key: "NOX_SESSION" + value: "system-3.9" +} \ No newline at end of file From 0bfc5e253b85476bab09910467a2d695f7aa1e4b Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Thu, 16 Oct 2025 10:06:09 -0700 Subject: [PATCH 10/16] improved snapshot parsing --- google/cloud/firestore_v1/base_query.py | 5 ++--- tests/unit/v1/test_base_query.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/google/cloud/firestore_v1/base_query.py b/google/cloud/firestore_v1/base_query.py index 0a16b7592..2de95b79a 100644 --- a/google/cloud/firestore_v1/base_query.py +++ b/google/cloud/firestore_v1/base_query.py @@ -929,9 +929,8 @@ def _normalize_cursor(self, cursor, orders) -> Tuple[List, bool] | None: if isinstance(document_fields, document.DocumentSnapshot): snapshot = document_fields - document_fields = snapshot.to_dict() - if document_fields is not None: - document_fields["__name__"] = snapshot.reference + document_fields = copy.deepcopy(snapshot._data) + document_fields["__name__"] = snapshot.reference if isinstance(document_fields, dict): # Transform to list using orders diff --git a/tests/unit/v1/test_base_query.py b/tests/unit/v1/test_base_query.py index 7f6b0e5e2..ab77f362b 100644 --- a/tests/unit/v1/test_base_query.py +++ b/tests/unit/v1/test_base_query.py @@ -1399,6 +1399,16 @@ def test_basequery__normalize_cursor_as_snapshot_hit(): assert query._normalize_cursor(cursor, query._orders) == ([1], True) +def test_basequery__normalize_cursor_non_existant_snapshot(): + from google.cloud.firestore_v1 import document + values = {"b": 1} + docref = _make_docref("here", "doc_id") + snapshot = document.DocumentSnapshot(docref, values, False, None, None, None) + cursor = (snapshot, True) + collection = _make_collection("here") + query = _make_base_query(collection).order_by("b", "ASCENDING") + + assert query._normalize_cursor(cursor, query._orders) == ([1], True) def test_basequery__normalize_cursor_w___name___w_reference(): db_string = "projects/my-project/database/(default)" From fa4e4a9370133614b9eb62c5d90ea22984fcf2b3 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Thu, 16 Oct 2025 17:08:29 +0000 Subject: [PATCH 11/16] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20?= =?UTF-8?q?post-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- tests/unit/v1/test_base_query.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/unit/v1/test_base_query.py b/tests/unit/v1/test_base_query.py index ab77f362b..7804b0430 100644 --- a/tests/unit/v1/test_base_query.py +++ b/tests/unit/v1/test_base_query.py @@ -1399,8 +1399,10 @@ def test_basequery__normalize_cursor_as_snapshot_hit(): assert query._normalize_cursor(cursor, query._orders) == ([1], True) + def test_basequery__normalize_cursor_non_existant_snapshot(): from google.cloud.firestore_v1 import document + values = {"b": 1} docref = _make_docref("here", "doc_id") snapshot = document.DocumentSnapshot(docref, values, False, None, None, None) @@ -1410,6 +1412,7 @@ def test_basequery__normalize_cursor_non_existant_snapshot(): assert query._normalize_cursor(cursor, query._orders) == ([1], True) + def test_basequery__normalize_cursor_w___name___w_reference(): db_string = "projects/my-project/database/(default)" client = mock.Mock(spec=["_database_string"]) From 723a86c80881b6afbaaf6511e049b80397f6e011 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Thu, 16 Oct 2025 10:44:07 -0700 Subject: [PATCH 12/16] omit tests in coverage --- noxfile.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 4e8e4fa94..89bbc316d 100644 --- a/noxfile.py +++ b/noxfile.py @@ -380,7 +380,13 @@ def cover(session): test runs (not system test runs), and then erases coverage data. """ session.install("coverage", "pytest-cov") - session.run("coverage", "report", "--show-missing", "--fail-under=100") + session.run( + "coverage", + "report", + "--show-missing", + "--fail-under=100", + "--omit=tests/*", + ) session.run("coverage", "erase") From 927ed19af27c9a366a514aa98172e96789ad09dc Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Thu, 16 Oct 2025 11:52:44 -0700 Subject: [PATCH 13/16] added 3.14 support --- .github/sync-repo-settings.yaml | 1 + .github/workflows/unittest.yml | 2 +- .kokoro/presubmit/system.cfg | 2 +- CONTRIBUTING.rst | 7 ++++--- noxfile.py | 4 +++- owlbot.py | 4 ++-- pytest.ini | 5 ++++- setup.py | 2 ++ 8 files changed, 18 insertions(+), 9 deletions(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index be723d073..389c3747c 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -28,6 +28,7 @@ branchProtectionRules: - 'unit (3.11)' - 'unit (3.12)' - 'unit (3.13)' + - 'unit (3.14)' - 'cover' - 'run-systests' # List of explicit permissions to add (additive only) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 32b627997..494bb568f 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - python: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] + python: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.kokoro/presubmit/system.cfg b/.kokoro/presubmit/system.cfg index 6e4f768fd..bd1fb514b 100644 --- a/.kokoro/presubmit/system.cfg +++ b/.kokoro/presubmit/system.cfg @@ -3,5 +3,5 @@ # Only run this nox session. env_vars: { key: "NOX_SESSION" - value: "system" + value: "system-3.9" } diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 1d0c00be3..c91768524 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.7, 3.8, 3.9, 3.10, 3.11, 3.12 and 3.13 on both UNIX and Windows. + 3.7, 3.8, 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:: @@ -238,6 +238,7 @@ We support: - `Python 3.11`_ - `Python 3.12`_ - `Python 3.13`_ +- `Python 3.14`_ .. _Python 3.7: https://docs.python.org/3.7/ .. _Python 3.8: https://docs.python.org/3.8/ @@ -245,7 +246,7 @@ We support: .. _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 89bbc316d..ac1c7ee4d 100644 --- a/noxfile.py +++ b/noxfile.py @@ -43,6 +43,7 @@ "3.11", "3.12", "3.13", + "3.14", ] UNIT_TEST_STANDARD_DEPENDENCIES = [ "mock", @@ -61,7 +62,7 @@ UNIT_TEST_EXTRAS: List[str] = [] UNIT_TEST_EXTRAS_BY_PYTHON: Dict[str, List[str]] = {} -SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.9"] +SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.9", "3.14"] SYSTEM_TEST_STANDARD_DEPENDENCIES: List[str] = [ "mock", "pytest", @@ -84,6 +85,7 @@ "unit-3.11", "unit-3.12", "unit-3.13", + "unit-3.14", "system_emulated", "system", "mypy", diff --git a/owlbot.py b/owlbot.py index 86e8feff9..612c5302f 100644 --- a/owlbot.py +++ b/owlbot.py @@ -144,8 +144,8 @@ def update_fixup_scripts(library): cov_level=100, split_system_tests=True, default_python_version="3.13", - system_test_python_versions=["3.9"], - unit_test_python_versions=["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"], + system_test_python_versions=["3.9", "3.14"] + unit_test_python_versions=["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"], ) s.move(templated_files, diff --git a/pytest.ini b/pytest.ini index 2d9b7edf9..eac8ea123 100644 --- a/pytest.ini +++ b/pytest.ini @@ -19,4 +19,7 @@ filterwarnings = # Remove warning once https://github.com/googleapis/gapic-generator-python/issues/1939 is fixed ignore:get_mtls_endpoint_and_cert_source is deprecated.:DeprecationWarning # Remove once credential file support is removed - ignore:.*The \`credentials_file\` argument is deprecated.*:DeprecationWarning \ No newline at end of file + ignore:.*The \`credentials_file\` argument is deprecated.*:DeprecationWarning + # Remove after updating test dependencies that use asyncio.iscoroutinefunction + ignore:.*\'asyncio.iscoroutinefunction\' is deprecated.*:DeprecationWarning + ignore:.*\'asyncio.get_event_loop_policy\' is deprecated.*:DeprecationWarning \ No newline at end of file diff --git a/setup.py b/setup.py index 2a47080a1..8625abce9 100644 --- a/setup.py +++ b/setup.py @@ -79,6 +79,8 @@ "Programming Language :: Python :: 3.10", "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 :: Internet", "Topic :: Software Development :: Libraries :: Python Modules", From 0869caf70acbb26f232a76c63cc5ddd32bc92603 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Thu, 16 Oct 2025 11:54:23 -0700 Subject: [PATCH 14/16] added missing constraints file --- testing/constraints-3.14.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 testing/constraints-3.14.txt diff --git a/testing/constraints-3.14.txt b/testing/constraints-3.14.txt new file mode 100644 index 000000000..e69de29bb From d1fede49656cc243bf9d2d3314488121f3777ebc Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Thu, 16 Oct 2025 11:55:34 -0700 Subject: [PATCH 15/16] fixed typo in owlbot --- owlbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owlbot.py b/owlbot.py index 612c5302f..a9323ce3c 100644 --- a/owlbot.py +++ b/owlbot.py @@ -144,7 +144,7 @@ def update_fixup_scripts(library): cov_level=100, split_system_tests=True, default_python_version="3.13", - system_test_python_versions=["3.9", "3.14"] + system_test_python_versions=["3.9", "3.14"], unit_test_python_versions=["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"], ) From c6f2973cbb8a13f805be6be6b1c0e3434ac9af96 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Thu, 16 Oct 2025 18:57:36 +0000 Subject: [PATCH 16/16] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20?= =?UTF-8?q?post-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- .kokoro/presubmit/system-3.14.cfg | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .kokoro/presubmit/system-3.14.cfg diff --git a/.kokoro/presubmit/system-3.14.cfg b/.kokoro/presubmit/system-3.14.cfg new file mode 100644 index 000000000..86e7c5d77 --- /dev/null +++ b/.kokoro/presubmit/system-3.14.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Only run this nox session. +env_vars: { + key: "NOX_SESSION" + value: "system-3.14" +} \ No newline at end of file