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

kaxilnaik 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 40f6f7ed137 Move compat shim in Standard Provider to 
`version_compat.py` (#52567)
40f6f7ed137 is described below

commit 40f6f7ed1378f1263e4d85ee9225b893489b5927
Author: Kaxil Naik <[email protected]>
AuthorDate: Tue Jul 1 00:08:01 2025 +0530

    Move compat shim in Standard Provider to `version_compat.py` (#52567)
    
    Moves the conditional imports to `version_compat.py`
---
 .../airflow/providers/standard/operators/bash.py   |  7 +-----
 .../airflow/providers/standard/operators/branch.py |  7 +-----
 .../airflow/providers/standard/operators/empty.py  |  7 +-----
 .../airflow/providers/standard/operators/python.py |  7 +-----
 .../airflow/providers/standard/operators/smooth.py |  7 +-----
 .../providers/standard/operators/trigger_dagrun.py |  5 +---
 .../src/airflow/providers/standard/sensors/bash.py |  7 +-----
 .../providers/standard/sensors/date_time.py        |  7 +-----
 .../providers/standard/sensors/external_task.py    | 20 ++++++----------
 .../providers/standard/sensors/filesystem.py       |  7 +-----
 .../airflow/providers/standard/sensors/python.py   |  7 +-----
 .../src/airflow/providers/standard/sensors/time.py |  7 +-----
 .../providers/standard/sensors/time_delta.py       |  7 +-----
 .../airflow/providers/standard/sensors/weekday.py  |  7 +-----
 .../airflow/providers/standard/version_compat.py   | 28 ++++++++++++++++++++--
 .../unit/standard/operators/test_trigger_dagrun.py |  4 ++--
 16 files changed, 48 insertions(+), 93 deletions(-)

diff --git 
a/providers/standard/src/airflow/providers/standard/operators/bash.py 
b/providers/standard/src/airflow/providers/standard/operators/bash.py
index caee52072e1..e10192a05b2 100644
--- a/providers/standard/src/airflow/providers/standard/operators/bash.py
+++ b/providers/standard/src/airflow/providers/standard/operators/bash.py
@@ -26,12 +26,7 @@ from typing import TYPE_CHECKING, Any, cast
 
 from airflow.exceptions import AirflowException, AirflowSkipException
 from airflow.providers.standard.hooks.subprocess import SubprocessHook, 
SubprocessResult, working_directory
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
AIRFLOW_V_3_1_PLUS
-
-if AIRFLOW_V_3_1_PLUS:
-    from airflow.sdk import BaseOperator
-else:
-    from airflow.models.baseoperator import BaseOperator  # type: 
ignore[no-redef]
+from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
BaseOperator
 
 if AIRFLOW_V_3_0_PLUS:
     from airflow.sdk.execution_time.context import context_to_airflow_vars
diff --git 
a/providers/standard/src/airflow/providers/standard/operators/branch.py 
b/providers/standard/src/airflow/providers/standard/operators/branch.py
index 064bb52afe1..98c059ac38e 100644
--- a/providers/standard/src/airflow/providers/standard/operators/branch.py
+++ b/providers/standard/src/airflow/providers/standard/operators/branch.py
@@ -22,12 +22,7 @@ from __future__ import annotations
 from collections.abc import Iterable
 from typing import TYPE_CHECKING
 
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
AIRFLOW_V_3_1_PLUS
-
-if AIRFLOW_V_3_1_PLUS:
-    from airflow.sdk import BaseOperator
-else:
-    from airflow.models.baseoperator import BaseOperator  # type: 
ignore[no-redef]
+from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
BaseOperator
 
 if AIRFLOW_V_3_0_PLUS:
     from airflow.providers.standard.utils.skipmixin import SkipMixin
diff --git 
a/providers/standard/src/airflow/providers/standard/operators/empty.py 
b/providers/standard/src/airflow/providers/standard/operators/empty.py
index cdfebf3a413..b9a480bc86e 100644
--- a/providers/standard/src/airflow/providers/standard/operators/empty.py
+++ b/providers/standard/src/airflow/providers/standard/operators/empty.py
@@ -18,12 +18,7 @@ from __future__ import annotations
 
 from typing import TYPE_CHECKING
 
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_1_PLUS
-
-if AIRFLOW_V_3_1_PLUS:
-    from airflow.sdk import BaseOperator
-else:
-    from airflow.models.baseoperator import BaseOperator  # type: 
ignore[no-redef]
+from airflow.providers.standard.version_compat import BaseOperator
 
 if TYPE_CHECKING:
     from airflow.sdk.definitions.context import Context
diff --git 
a/providers/standard/src/airflow/providers/standard/operators/python.py 
b/providers/standard/src/airflow/providers/standard/operators/python.py
index 92387d28cbf..f6efcf3bf0d 100644
--- a/providers/standard/src/airflow/providers/standard/operators/python.py
+++ b/providers/standard/src/airflow/providers/standard/operators/python.py
@@ -50,18 +50,13 @@ from airflow.exceptions import (
 )
 from airflow.models.variable import Variable
 from airflow.providers.standard.utils.python_virtualenv import 
prepare_virtualenv, write_python_script
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
AIRFLOW_V_3_1_PLUS
+from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
BaseOperator
 from airflow.utils import hashlib_wrapper
 from airflow.utils.context import context_copy_partial, context_merge
 from airflow.utils.file import get_unique_dag_module_name
 from airflow.utils.operator_helpers import KeywordParameters
 from airflow.utils.process_utils import execute_in_subprocess
 
-if AIRFLOW_V_3_1_PLUS:
-    from airflow.sdk import BaseOperator
-else:
-    from airflow.models.baseoperator import BaseOperator  # type: 
ignore[no-redef]
-
 if AIRFLOW_V_3_0_PLUS:
     from airflow.providers.standard.operators.branch import BaseBranchOperator
     from airflow.providers.standard.utils.skipmixin import SkipMixin
diff --git 
a/providers/standard/src/airflow/providers/standard/operators/smooth.py 
b/providers/standard/src/airflow/providers/standard/operators/smooth.py
index 6799e07a5ef..9b3d1ff181e 100644
--- a/providers/standard/src/airflow/providers/standard/operators/smooth.py
+++ b/providers/standard/src/airflow/providers/standard/operators/smooth.py
@@ -19,12 +19,7 @@ from __future__ import annotations
 
 from typing import TYPE_CHECKING
 
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
-
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk import BaseOperator
-else:
-    from airflow.models.baseoperator import BaseOperator  # type: 
ignore[no-redef]
+from airflow.providers.standard.version_compat import BaseOperator
 
 if TYPE_CHECKING:
     from airflow.sdk.definitions.context import Context
diff --git 
a/providers/standard/src/airflow/providers/standard/operators/trigger_dagrun.py 
b/providers/standard/src/airflow/providers/standard/operators/trigger_dagrun.py
index 4f474c3e699..998fd4c8d7e 100644
--- 
a/providers/standard/src/airflow/providers/standard/operators/trigger_dagrun.py
+++ 
b/providers/standard/src/airflow/providers/standard/operators/trigger_dagrun.py
@@ -34,12 +34,11 @@ from airflow.exceptions import (
     DagNotFound,
     DagRunAlreadyExists,
 )
-from airflow.models import BaseOperator
 from airflow.models.dag import DagModel
 from airflow.models.dagbag import DagBag
 from airflow.models.dagrun import DagRun
 from airflow.providers.standard.triggers.external_task import DagStateTrigger
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
+from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
BaseOperator, BaseOperatorLink
 from airflow.utils import timezone
 from airflow.utils.state import DagRunState
 from airflow.utils.types import NOTSET, ArgNotSet, DagRunType
@@ -60,11 +59,9 @@ if TYPE_CHECKING:
         from airflow.utils.context import Context
 
 if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk import BaseOperatorLink
     from airflow.sdk.execution_time.xcom import XCom
 else:
     from airflow.models import XCom  # type: ignore[no-redef]
-    from airflow.models.baseoperatorlink import BaseOperatorLink  # type: 
ignore[no-redef]
 
 
 class DagIsPaused(AirflowException):
diff --git a/providers/standard/src/airflow/providers/standard/sensors/bash.py 
b/providers/standard/src/airflow/providers/standard/sensors/bash.py
index 5e8dd0b2465..9b83b4af187 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/bash.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/bash.py
@@ -24,12 +24,7 @@ from tempfile import NamedTemporaryFile, TemporaryDirectory, 
gettempdir
 from typing import TYPE_CHECKING
 
 from airflow.exceptions import AirflowFailException
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
-
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk.bases.sensor import BaseSensorOperator
-else:
-    from airflow.sensors.base import BaseSensorOperator  # type: 
ignore[no-redef]
+from airflow.providers.standard.version_compat import BaseSensorOperator
 
 if TYPE_CHECKING:
     try:
diff --git 
a/providers/standard/src/airflow/providers/standard/sensors/date_time.py 
b/providers/standard/src/airflow/providers/standard/sensors/date_time.py
index a2e2478109f..85758210a05 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/date_time.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/date_time.py
@@ -23,14 +23,9 @@ from dataclasses import dataclass
 from typing import TYPE_CHECKING, Any, NoReturn
 
 from airflow.providers.standard.triggers.temporal import DateTimeTrigger
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
+from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
BaseSensorOperator
 from airflow.utils import timezone
 
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk.bases.sensor import BaseSensorOperator
-else:
-    from airflow.sensors.base import BaseSensorOperator  # type: 
ignore[no-redef]
-
 try:
     from airflow.triggers.base import StartTriggerArgs
 except ImportError:
diff --git 
a/providers/standard/src/airflow/providers/standard/sensors/external_task.py 
b/providers/standard/src/airflow/providers/standard/sensors/external_task.py
index 974608bf714..32ad0111295 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/external_task.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/external_task.py
@@ -39,14 +39,16 @@ from airflow.providers.standard.exceptions import (
 from airflow.providers.standard.operators.empty import EmptyOperator
 from airflow.providers.standard.triggers.external_task import WorkflowTrigger
 from airflow.providers.standard.utils.sensor_helper import _get_count, 
_get_external_task_group_task_ids
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
+from airflow.providers.standard.version_compat import (
+    AIRFLOW_V_3_0_PLUS,
+    BaseOperator,
+    BaseOperatorLink,
+    BaseSensorOperator,
+)
 from airflow.utils.file import correct_maybe_zipped
 from airflow.utils.state import State, TaskInstanceState
 
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk.bases.sensor import BaseSensorOperator
-else:
-    from airflow.sensors.base import BaseSensorOperator  # 
type:ignore[no-redef]
+if not AIRFLOW_V_3_0_PLUS:
     from airflow.utils.session import NEW_SESSION, provide_session
 
 if TYPE_CHECKING:
@@ -55,19 +57,11 @@ if TYPE_CHECKING:
     from airflow.models.taskinstancekey import TaskInstanceKey
 
     if AIRFLOW_V_3_0_PLUS:
-        from airflow.sdk import BaseOperator
         from airflow.sdk.definitions.context import Context
     else:
-        from airflow.models.baseoperator import BaseOperator  # type: 
ignore[no-redef]
         from airflow.utils.context import Context  # type: ignore[no-redef]
 
 
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk import BaseOperatorLink
-else:
-    from airflow.models.baseoperatorlink import BaseOperatorLink  # type: 
ignore[no-redef]
-
-
 class ExternalDagLink(BaseOperatorLink):
     """
     Operator link for ExternalTaskSensor and ExternalTaskMarker.
diff --git 
a/providers/standard/src/airflow/providers/standard/sensors/filesystem.py 
b/providers/standard/src/airflow/providers/standard/sensors/filesystem.py
index 10315dc88a9..32681cb0f27 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/filesystem.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/filesystem.py
@@ -29,12 +29,7 @@ from airflow.configuration import conf
 from airflow.exceptions import AirflowException
 from airflow.providers.standard.hooks.filesystem import FSHook
 from airflow.providers.standard.triggers.file import FileTrigger
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
-
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk.bases.sensor import BaseSensorOperator
-else:
-    from airflow.sensors.base import BaseSensorOperator  # type: 
ignore[no-redef]
+from airflow.providers.standard.version_compat import BaseSensorOperator
 
 try:
     from airflow.triggers.base import StartTriggerArgs
diff --git 
a/providers/standard/src/airflow/providers/standard/sensors/python.py 
b/providers/standard/src/airflow/providers/standard/sensors/python.py
index 512ebab4449..d6fc454018c 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/python.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/python.py
@@ -20,15 +20,10 @@ from __future__ import annotations
 from collections.abc import Callable, Mapping, Sequence
 from typing import TYPE_CHECKING, Any
 
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
+from airflow.providers.standard.version_compat import BaseSensorOperator, 
PokeReturnValue
 from airflow.utils.context import context_merge
 from airflow.utils.operator_helpers import determine_kwargs
 
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk.bases.sensor import BaseSensorOperator, PokeReturnValue
-else:
-    from airflow.sensors.base import BaseSensorOperator, PokeReturnValue  # 
type: ignore[no-redef]
-
 if TYPE_CHECKING:
     try:
         from airflow.sdk.definitions.context import Context
diff --git a/providers/standard/src/airflow/providers/standard/sensors/time.py 
b/providers/standard/src/airflow/providers/standard/sensors/time.py
index ad02dc4dc82..6d72c29fb4a 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/time.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/time.py
@@ -25,12 +25,7 @@ from typing import TYPE_CHECKING, Any
 from airflow.configuration import conf
 from airflow.exceptions import AirflowProviderDeprecationWarning
 from airflow.providers.standard.triggers.temporal import DateTimeTrigger
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
-
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk.bases.sensor import BaseSensorOperator
-else:
-    from airflow.sensors.base import BaseSensorOperator  # type: 
ignore[no-redef]
+from airflow.providers.standard.version_compat import BaseSensorOperator
 
 try:
     from airflow.triggers.base import StartTriggerArgs
diff --git 
a/providers/standard/src/airflow/providers/standard/sensors/time_delta.py 
b/providers/standard/src/airflow/providers/standard/sensors/time_delta.py
index 5b38a2b078e..492e9aafa1d 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/time_delta.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/time_delta.py
@@ -28,14 +28,9 @@ from packaging.version import Version
 from airflow.configuration import conf
 from airflow.exceptions import AirflowProviderDeprecationWarning, 
AirflowSkipException
 from airflow.providers.standard.triggers.temporal import DateTimeTrigger, 
TimeDeltaTrigger
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
+from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, 
BaseSensorOperator
 from airflow.utils import timezone
 
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk.bases.sensor import BaseSensorOperator
-else:
-    from airflow.sensors.base import BaseSensorOperator  # type: 
ignore[no-redef]
-
 if TYPE_CHECKING:
     try:
         from airflow.sdk.definitions.context import Context
diff --git 
a/providers/standard/src/airflow/providers/standard/sensors/weekday.py 
b/providers/standard/src/airflow/providers/standard/sensors/weekday.py
index 6f3af7a3182..ac23e1ac9cb 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/weekday.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/weekday.py
@@ -21,14 +21,9 @@ from collections.abc import Iterable
 from typing import TYPE_CHECKING
 
 from airflow.providers.standard.utils.weekday import WeekDay
-from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
+from airflow.providers.standard.version_compat import BaseSensorOperator
 from airflow.utils import timezone
 
-if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk.bases.sensor import BaseSensorOperator
-else:
-    from airflow.sensors.base import BaseSensorOperator  # type: 
ignore[no-redef]
-
 if TYPE_CHECKING:
     try:
         from airflow.sdk.definitions.context import Context
diff --git 
a/providers/standard/src/airflow/providers/standard/version_compat.py 
b/providers/standard/src/airflow/providers/standard/version_compat.py
index 42bdcc7da03..e630ace142f 100644
--- a/providers/standard/src/airflow/providers/standard/version_compat.py
+++ b/providers/standard/src/airflow/providers/standard/version_compat.py
@@ -32,5 +32,29 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]:
     return airflow_version.major, airflow_version.minor, airflow_version.micro
 
 
-AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0)
-AIRFLOW_V_3_1_PLUS = get_base_airflow_version_tuple() >= (3, 1, 0)
+AIRFLOW_V_3_0_PLUS: bool = get_base_airflow_version_tuple() >= (3, 0, 0)
+AIRFLOW_V_3_1_PLUS: bool = get_base_airflow_version_tuple() >= (3, 1, 0)
+
+# BaseOperator is not imported from SDK from 3.0 (and only done from 3.1) due 
to a bug with
+# DecoratedOperator -- where `DecoratedOperator._handle_output` needed 
`xcom_push` to exist on `BaseOperator`
+# even though it wasn't used.
+if AIRFLOW_V_3_1_PLUS:
+    from airflow.sdk import BaseOperator
+else:
+    from airflow.models.baseoperator import BaseOperator  # type: 
ignore[no-redef]
+
+if AIRFLOW_V_3_0_PLUS:
+    from airflow.sdk import BaseOperatorLink
+    from airflow.sdk.bases.sensor import BaseSensorOperator, PokeReturnValue
+else:
+    from airflow.models.baseoperatorlink import BaseOperatorLink  # type: 
ignore[no-redef]
+    from airflow.sensors.base import BaseSensorOperator, PokeReturnValue  # 
type: ignore[no-redef]
+
+__all__ = [
+    "AIRFLOW_V_3_0_PLUS",
+    "AIRFLOW_V_3_1_PLUS",
+    "BaseOperator",
+    "BaseOperatorLink",
+    "BaseSensorOperator",
+    "PokeReturnValue",
+]
diff --git 
a/providers/standard/tests/unit/standard/operators/test_trigger_dagrun.py 
b/providers/standard/tests/unit/standard/operators/test_trigger_dagrun.py
index 190973b477a..ad63b23096f 100644
--- a/providers/standard/tests/unit/standard/operators/test_trigger_dagrun.py
+++ b/providers/standard/tests/unit/standard/operators/test_trigger_dagrun.py
@@ -182,9 +182,9 @@ class TestDagRunOperator:
             )
         dag_maker.sync_dagbag_to_db()
         parse_and_sync_to_db(self.f_name)
-        dag_maker.create_dagrun()
+        dr = dag_maker.create_dagrun()
         with pytest.raises(ValueError, match="^conf parameter should be JSON 
Serializable$"):
-            task.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE)
+            dag_maker.run_ti(task.task_id, dr)
 
     def test_trigger_dagrun_with_no_failed_state(self, dag_maker):
         task = TriggerDagRunOperator(

Reply via email to