This is an automated email from the ASF dual-hosted git repository.

eladkal pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 26cd35328ee Add Python 3.14 Support (#64061)
26cd35328ee is described below

commit 26cd35328ee94607eb902b0216eb8ed87dfc2403
Author: Dev-iL <[email protected]>
AuthorDate: Mon Mar 23 09:00:06 2026 +0200

    Add Python 3.14 Support (#64061)
    
    Un-exclude the google provider from py3.14
---
 dev/breeze/tests/test_selective_checks.py                         | 1 -
 providers/google/docs/changelog.rst                               | 8 +++++++-
 providers/google/provider.yaml                                    | 3 ---
 providers/google/pyproject.toml                                   | 3 ++-
 providers/google/src/airflow/providers/google/cloud/hooks/ray.py  | 5 +++++
 .../google/tests/unit/google/cloud/hooks/test_bigquery_dts.py     | 8 ++++----
 providers/google/tests/unit/google/cloud/hooks/test_ray.py        | 6 +++++-
 .../google/tests/unit/google/cloud/hooks/vertex_ai/test_ray.py    | 2 +-
 providers/google/tests/unit/google/cloud/links/test_ray.py        | 4 ++++
 providers/google/tests/unit/google/cloud/operators/test_ray.py    | 3 +++
 .../google/tests/unit/google/cloud/triggers/test_dataproc.py      | 5 +----
 pyproject.toml                                                    | 4 ++--
 scripts/tests/ci/prek/test_check_excluded_provider_markers.py     | 1 -
 uv.lock                                                           | 8 ++++----
 14 files changed, 38 insertions(+), 23 deletions(-)

diff --git a/dev/breeze/tests/test_selective_checks.py 
b/dev/breeze/tests/test_selective_checks.py
index a870616b06f..86cfec23084 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -1385,7 +1385,6 @@ def test_excluded_providers():
                     "3.14": [
                         "amazon",  # Depends on lxml<6
                         "apache.cassandra",  # Enable when the next release 
after 3.29.3 is available
-                        "google",  # Depends on ray, which does not yet 
support python 3.14 (due to pydantic v1)
                     ],
                 }
             ),
diff --git a/providers/google/docs/changelog.rst 
b/providers/google/docs/changelog.rst
index 041d1f81278..485a46574f0 100644
--- a/providers/google/docs/changelog.rst
+++ b/providers/google/docs/changelog.rst
@@ -31,6 +31,11 @@ Changelog
 21.0.0
 ......
 
+.. note::
+  This version of the provider introduces support for Python 3.14.
+  However, the Ray package doesn't yet support Python 3.14, thus 
``RayJobHook`` will not work.
+  If you use ``RayJobHook`` you should stay on Python<3.14 until the upstream 
library issues a fix.
+
 .. warning::
   Deprecated classes, parameters and features have been removed from the 
Google provider package.
   The following breaking changes were introduced:
@@ -193,7 +198,8 @@ Doc-only
 ......
 
 .. warning::
-  We have identified the following regressions for this version.
+  We have identified the following regressions for this version:
+
   - The return value of the ``GenAIGeminiCreateBatchJobOperator`` and 
``GenAIGeminiGetBatchJobOperator`` were incompatible with Airflow 2. The issues 
fixed in the following PRs #61253 and #61842.
   - The ``transport`` parameter broke the deferrable mode for 
``CloudRunExecuteJobOperator``. The issue fixed in #61546.
 
diff --git a/providers/google/provider.yaml b/providers/google/provider.yaml
index f123cbd7b47..04541d5569d 100644
--- a/providers/google/provider.yaml
+++ b/providers/google/provider.yaml
@@ -123,9 +123,6 @@ versions:
   - 2.0.0
   - 1.0.0
 
-excluded-python-versions:
-  - "3.14"
-
 integrations:
   - integration-name: Google Analytics (GA4)
     external-doc-url: https://analytics.google.com/
diff --git a/providers/google/pyproject.toml b/providers/google/pyproject.toml
index 562bf9af04a..25013e9f7f5 100644
--- a/providers/google/pyproject.toml
+++ b/providers/google/pyproject.toml
@@ -49,9 +49,10 @@ classifiers = [
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
     "Programming Language :: Python :: 3.13",
+    "Programming Language :: Python :: 3.14",
     "Topic :: System :: Monitoring",
 ]
-requires-python = ">=3.10,!=3.14.*"
+requires-python = ">=3.10"
 
 # The dependencies should be modified in place in the generated file.
 # Any change in the dependencies is preserved when the file is regenerated
diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/ray.py 
b/providers/google/src/airflow/providers/google/cloud/hooks/ray.py
index bda6ab086ae..75267ef485b 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/ray.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/ray.py
@@ -19,9 +19,14 @@
 
 from __future__ import annotations
 
+import sys
 from typing import TYPE_CHECKING, Any
 from urllib.parse import urlparse
 
+# Remove the below after https://github.com/ray-project/ray/issues/56434 is 
resolved
+if sys.version_info >= (3, 14):
+    raise ImportError("Ray is not supported on Python 3.14 yet")
+
 from ray.job_submission import JobSubmissionClient
 
 from airflow.providers.google.common.hooks.base_google import GoogleBaseHook
diff --git 
a/providers/google/tests/unit/google/cloud/hooks/test_bigquery_dts.py 
b/providers/google/tests/unit/google/cloud/hooks/test_bigquery_dts.py
index 3ee7328e03f..f94ba9b4b15 100644
--- a/providers/google/tests/unit/google/cloud/hooks/test_bigquery_dts.py
+++ b/providers/google/tests/unit/google/cloud/hooks/test_bigquery_dts.py
@@ -134,10 +134,6 @@ class TestAsyncBiqQueryDataTransferServiceHook:
             
f"{self.HOOK_MODULE_PATH}.AsyncBiqQueryDataTransferServiceHook._get_conn",
             new_callable=AsyncMock,
         ) as mock_client:
-            transfer_result = Future()
-            transfer_result.set_result(mock.MagicMock())
-
-            mock_client.return_value.get_transfer_run = 
mock.MagicMock(return_value=transfer_result)
             yield mock_client
 
     @pytest.fixture
@@ -147,6 +143,10 @@ class TestAsyncBiqQueryDataTransferServiceHook:
     @pytest.mark.db_test
     @pytest.mark.asyncio
     async def test_get_transfer_run(self, mock_client, hook):
+        transfer_result = Future()
+        transfer_result.set_result(mock.MagicMock())
+        mock_client.return_value.get_transfer_run = 
mock.MagicMock(return_value=transfer_result)
+
         await hook.get_transfer_run(
             run_id=RUN_ID,
             config_id=TRANSFER_CONFIG_ID,
diff --git a/providers/google/tests/unit/google/cloud/hooks/test_ray.py 
b/providers/google/tests/unit/google/cloud/hooks/test_ray.py
index e22c07204ac..02b45ca0cb2 100644
--- a/providers/google/tests/unit/google/cloud/hooks/test_ray.py
+++ b/providers/google/tests/unit/google/cloud/hooks/test_ray.py
@@ -19,12 +19,16 @@ from __future__ import annotations
 
 from unittest import mock
 
-from airflow.providers.google.cloud.hooks.ray import RayJobHook
+import pytest
 
 from unit.google.cloud.utils.base_gcp_mock import (
     mock_base_gcp_hook_default_project_id,
 )
 
+# Remove the below workaround once 
https://github.com/ray-project/ray/issues/56434 is resolved
+pytest.importorskip("airflow.providers.google.cloud.hooks.ray")
+from airflow.providers.google.cloud.hooks.ray import RayJobHook
+
 TEST_GCP_CONN_ID: str = "test-gcp-conn-id"
 TEST_CLUSTER_NAME: str = "test-cluster-name"
 
diff --git 
a/providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_ray.py 
b/providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_ray.py
index c4905cc1c52..d3d071c4b3f 100644
--- a/providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_ray.py
+++ b/providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_ray.py
@@ -21,7 +21,7 @@ from unittest import mock
 
 import pytest
 
-resources = 
pytest.importorskip("google.cloud.aiplatform.vertex_ray.util.resources")
+pytest.importorskip("google.cloud.aiplatform.vertex_ray.util.resources")
 from google.cloud.aiplatform.vertex_ray.util.resources import Cluster, 
Resources
 
 from airflow.providers.google.cloud.hooks.vertex_ai.ray import RayHook
diff --git a/providers/google/tests/unit/google/cloud/links/test_ray.py 
b/providers/google/tests/unit/google/cloud/links/test_ray.py
index e7b51b99322..34e6c9c0aaa 100644
--- a/providers/google/tests/unit/google/cloud/links/test_ray.py
+++ b/providers/google/tests/unit/google/cloud/links/test_ray.py
@@ -19,6 +19,10 @@ from __future__ import annotations
 
 from unittest import mock
 
+import pytest
+
+# Remove the below workaround once 
https://github.com/ray-project/ray/issues/56434 is resolved
+pytest.importorskip("ray.dashboard.modules.job.common")
 from airflow.providers.google.cloud.links.ray import RayJobLink
 
 TEST_CLUSTER_ADDRESS = "ray-head-123.us-central1.ray.googleusercontent.com"
diff --git a/providers/google/tests/unit/google/cloud/operators/test_ray.py 
b/providers/google/tests/unit/google/cloud/operators/test_ray.py
index 3256925803a..5d8aee1f172 100644
--- a/providers/google/tests/unit/google/cloud/operators/test_ray.py
+++ b/providers/google/tests/unit/google/cloud/operators/test_ray.py
@@ -19,6 +19,9 @@ from __future__ import annotations
 from unittest import mock
 
 import pytest
+
+# Remove the below workaround once 
https://github.com/ray-project/ray/issues/56434 is resolved
+pytest.importorskip("ray.dashboard.modules.job.common")
 from ray.dashboard.modules.job.common import JobStatus
 
 from airflow.providers.common.compat.sdk import AirflowTaskTimeout
diff --git a/providers/google/tests/unit/google/cloud/triggers/test_dataproc.py 
b/providers/google/tests/unit/google/cloud/triggers/test_dataproc.py
index ed3e5c08f36..1e0f9176497 100644
--- a/providers/google/tests/unit/google/cloud/triggers/test_dataproc.py
+++ b/providers/google/tests/unit/google/cloud/triggers/test_dataproc.py
@@ -210,10 +210,7 @@ class TestDataprocClusterTrigger:
     @pytest.mark.db_test
     @pytest.mark.asyncio
     
@mock.patch("airflow.providers.google.cloud.triggers.dataproc.DataprocClusterTrigger.fetch_cluster")
-    @mock.patch(
-        
"airflow.providers.google.cloud.hooks.dataproc.DataprocAsyncHook.delete_cluster",
-        return_value=asyncio.Future(),
-    )
+    
@mock.patch("airflow.providers.google.cloud.hooks.dataproc.DataprocAsyncHook.delete_cluster")
     @mock.patch("google.auth.default")
     async def test_async_cluster_trigger_run_returns_error_event(
         self, mock_auth, mock_delete_cluster, mock_fetch_cluster, 
cluster_trigger, async_get_cluster, caplog
diff --git a/pyproject.toml b/pyproject.toml
index 26287e61dd0..812f4c13147 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -230,7 +230,7 @@ packages = []
     "apache-airflow-providers-github>=2.8.0"
 ]
 "google" = [
-    "apache-airflow-providers-google>=10.24.0; python_version !=\"3.14\""
+    "apache-airflow-providers-google>=10.24.0"
 ]
 "grpc" = [
     "apache-airflow-providers-grpc>=3.7.0"
@@ -436,7 +436,7 @@ packages = []
     "apache-airflow-providers-ftp>=3.12.0",
     "apache-airflow-providers-git>=0.0.2", # Set from MIN_VERSION_OVERRIDE in 
update_airflow_pyproject_toml.py
     "apache-airflow-providers-github>=2.8.0",
-    "apache-airflow-providers-google>=10.24.0; python_version !=\"3.14\"",
+    "apache-airflow-providers-google>=10.24.0",
     "apache-airflow-providers-grpc>=3.7.0",
     "apache-airflow-providers-hashicorp>=4.0.0",
     "apache-airflow-providers-http>=4.13.2",
diff --git a/scripts/tests/ci/prek/test_check_excluded_provider_markers.py 
b/scripts/tests/ci/prek/test_check_excluded_provider_markers.py
index 62ca32728d3..159e7bd2bde 100644
--- a/scripts/tests/ci/prek/test_check_excluded_provider_markers.py
+++ b/scripts/tests/ci/prek/test_check_excluded_provider_markers.py
@@ -21,7 +21,6 @@ from check_excluded_provider_markers import _check_dependency
 
 EXCLUDED = {
     "apache-airflow-providers-amazon": ["3.14"],
-    "apache-airflow-providers-google": ["3.14"],
 }
 
 
diff --git a/uv.lock b/uv.lock
index 26c6d6d2f9a..653885f7f2e 100644
--- a/uv.lock
+++ b/uv.lock
@@ -883,7 +883,7 @@ all = [
     { name = "apache-airflow-providers-ftp" },
     { name = "apache-airflow-providers-git" },
     { name = "apache-airflow-providers-github" },
-    { name = "apache-airflow-providers-google", marker = "python_full_version 
!= '3.14.*'" },
+    { name = "apache-airflow-providers-google" },
     { name = "apache-airflow-providers-grpc" },
     { name = "apache-airflow-providers-hashicorp" },
     { name = "apache-airflow-providers-http" },
@@ -1100,7 +1100,7 @@ github-enterprise = [
     { name = "authlib" },
 ]
 google = [
-    { name = "apache-airflow-providers-google", marker = "python_full_version 
!= '3.14.*'" },
+    { name = "apache-airflow-providers-google" },
 ]
 google-auth = [
     { name = "apache-airflow-providers-fab" },
@@ -1451,8 +1451,8 @@ requires-dist = [
     { name = "apache-airflow-providers-git", marker = "extra == 'git'", 
editable = "providers/git" },
     { name = "apache-airflow-providers-github", marker = "extra == 'all'", 
editable = "providers/github" },
     { name = "apache-airflow-providers-github", marker = "extra == 'github'", 
editable = "providers/github" },
-    { name = "apache-airflow-providers-google", marker = "python_full_version 
!= '3.14.*' and extra == 'all'", editable = "providers/google" },
-    { name = "apache-airflow-providers-google", marker = "python_full_version 
!= '3.14.*' and extra == 'google'", editable = "providers/google" },
+    { name = "apache-airflow-providers-google", marker = "extra == 'all'", 
editable = "providers/google" },
+    { name = "apache-airflow-providers-google", marker = "extra == 'google'", 
editable = "providers/google" },
     { name = "apache-airflow-providers-grpc", marker = "extra == 'all'", 
editable = "providers/grpc" },
     { name = "apache-airflow-providers-grpc", marker = "extra == 'grpc'", 
editable = "providers/grpc" },
     { name = "apache-airflow-providers-hashicorp", marker = "extra == 'all'", 
editable = "providers/hashicorp" },

Reply via email to