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

henry3260 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 6086dac8b61 Remove deprecated TimeDeltaSensorAsync (#76131)
6086dac8b61 is described below

commit 6086dac8b619073b94e273cc625c97da23633e48
Author: Shahar Epstein <[email protected]>
AuthorDate: Sat Oct 31 16:07:05 2026 +0200

    Remove deprecated TimeDeltaSensorAsync (#76131)
---
 airflow-core/src/airflow/sensors/__init__.py       |  1 -
 providers/standard/docs/changelog.rst              |  3 ++
 .../providers/standard/sensors/time_delta.py       | 23 -----------
 .../tests/unit/standard/sensors/test_time_delta.py | 47 +---------------------
 4 files changed, 5 insertions(+), 69 deletions(-)

diff --git a/airflow-core/src/airflow/sensors/__init__.py 
b/airflow-core/src/airflow/sensors/__init__.py
index 366837c20fd..fb1bdf56976 100644
--- a/airflow-core/src/airflow/sensors/__init__.py
+++ b/airflow-core/src/airflow/sensors/__init__.py
@@ -51,7 +51,6 @@ __deprecated_classes = {
     },
     "time_delta": {
         "TimeDeltaSensor": 
"airflow.providers.standard.sensors.time_delta.TimeDeltaSensor",
-        "TimeDeltaSensorAsync": 
"airflow.providers.standard.sensors.time_delta.TimeDeltaSensorAsync",
     },
     "filesystem": {
         "FileSensor": 
"airflow.providers.standard.sensors.filesystem.FileSensor",
diff --git a/providers/standard/docs/changelog.rst 
b/providers/standard/docs/changelog.rst
index 2de64323713..678e7ae4657 100644
--- a/providers/standard/docs/changelog.rst
+++ b/providers/standard/docs/changelog.rst
@@ -35,6 +35,9 @@
 Changelog
 ---------
 
+.. warning::
+  The deprecated ``TimeDeltaSensorAsync`` class has been removed. Use 
``TimeDeltaSensor(..., deferrable=True)`` instead.
+
 1.21.0
 ......
 
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 1295a829bb3..4dd500ac31f 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/time_delta.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/time_delta.py
@@ -17,16 +17,13 @@
 # under the License.
 from __future__ import annotations
 
-import warnings
 from collections.abc import Sequence
 from datetime import datetime, timedelta
 from time import sleep
 from typing import TYPE_CHECKING, Any
 
-from deprecated.classic import deprecated
 from packaging.version import Version
 
-from airflow.exceptions import AirflowProviderDeprecationWarning
 from airflow.providers.common.compat.sdk import AirflowSkipException, 
BaseSensorOperator, conf, timezone
 from airflow.providers.standard.triggers.temporal import DateTimeTrigger, 
TimeDeltaTrigger
 from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
@@ -156,26 +153,6 @@ class TimeDeltaSensor(BaseSensorOperator):
         return None
 
 
-# TODO: Remove in the next major release
-@deprecated(
-    "Use `TimeDeltaSensor` with `deferrable=True` instead", 
category=AirflowProviderDeprecationWarning
-)
-class TimeDeltaSensorAsync(TimeDeltaSensor):
-    """
-    Deprecated. Use TimeDeltaSensor with deferrable=True instead.
-
-    :sphinx-autoapi-skip:
-    """
-
-    def __init__(self, *, end_from_trigger: bool = False, delta, **kwargs) -> 
None:
-        warnings.warn(
-            "TimeDeltaSensorAsync is deprecated and will be removed in a 
future version. Use `TimeDeltaSensor` with `deferrable=True` instead.",
-            AirflowProviderDeprecationWarning,
-            stacklevel=2,
-        )
-        super().__init__(delta=delta, deferrable=True, 
end_from_trigger=end_from_trigger, **kwargs)
-
-
 class WaitSensor(BaseSensorOperator):
     """
     A sensor that waits a specified period of time before completing.
diff --git a/providers/standard/tests/unit/standard/sensors/test_time_delta.py 
b/providers/standard/tests/unit/standard/sensors/test_time_delta.py
index 814ffe81910..c37dc030518 100644
--- a/providers/standard/tests/unit/standard/sensors/test_time_delta.py
+++ b/providers/standard/tests/unit/standard/sensors/test_time_delta.py
@@ -25,12 +25,10 @@ import pendulum
 import pytest
 import time_machine
 
-from airflow.exceptions import AirflowProviderDeprecationWarning
 from airflow.models.dag import DAG
 from airflow.providers.common.compat.sdk import TaskDeferred
 from airflow.providers.standard.sensors.time_delta import (
     TimeDeltaSensor,
-    TimeDeltaSensorAsync,
     WaitSensor,
 )
 from airflow.providers.standard.triggers.temporal import DateTimeTrigger
@@ -168,7 +166,7 @@ def 
test_timedelta_sensor_deferrable_run_after_vs_interval(run_after, interval_e
     assert trigger.moment == expected_fire_time
 
 
-class TestTimeDeltaSensorAsync:
+class TestTimeDeltaSensorDeferrable:
     def setup_method(self):
         if AIRFLOW_V_3_3_PLUS:
             self.dagbag = DagBag(dag_folder=DEV_NULL)
@@ -184,8 +182,7 @@ class TestTimeDeltaSensorAsync:
     def test_timedelta_sensor(self, mocker, should_defer):
         defer_mock = mocker.patch(DEFER_PATH)
         delta = timedelta(hours=1)
-        with pytest.warns(AirflowProviderDeprecationWarning):
-            op = TimeDeltaSensorAsync(task_id="timedelta_sensor_check", 
delta=delta, dag=self.dag)
+        op = TimeDeltaSensor(task_id="timedelta_sensor_check", delta=delta, 
dag=self.dag, deferrable=True)
         if should_defer:
             data_interval_end = pendulum.now("UTC").add(hours=1)
         else:
@@ -215,46 +212,6 @@ class TestTimeDeltaSensorAsync:
                 defer_mock.assert_not_called()
                 sleep_mock.assert_called_once_with(30)
 
-    @pytest.mark.parametrize(
-        ("run_after", "interval_end"),
-        [
-            (timezone.utcnow() + timedelta(days=1), timezone.utcnow() + 
timedelta(days=2)),
-            (timezone.utcnow() + timedelta(days=1), None),
-        ],
-    )
-    def test_timedelta_sensor_async_run_after_vs_interval(self, run_after, 
interval_end, dag_maker):
-        """Interval end should be used as base time when present else 
run_after"""
-        if not AIRFLOW_V_3_0_PLUS and not interval_end:
-            pytest.skip("not applicable")
-
-        context = {}
-        if interval_end:
-            context["data_interval_end"] = interval_end
-        with dag_maker() as dag:
-            ...
-        kwargs = {}
-        if AIRFLOW_V_3_0_PLUS:
-            from airflow.utils.types import DagRunTriggeredByType
-
-            kwargs.update(triggered_by=DagRunTriggeredByType.TEST, 
run_after=run_after)
-
-        dr = dag_maker.create_dagrun(
-            run_id="abcrhroceuh",
-            run_type=DagRunType.MANUAL,
-            state=None,
-            **kwargs,
-        )
-        context.update(dag_run=dr)
-        delta = timedelta(seconds=1)
-        with pytest.warns(AirflowProviderDeprecationWarning):
-            op = TimeDeltaSensorAsync(task_id="wait_sensor_check", 
delta=delta, dag=dag)
-        base_time = interval_end or run_after
-        expected_time = base_time + delta
-        with pytest.raises(TaskDeferred) as caught:
-            op.execute(context)
-
-        assert caught.value.trigger.moment == expected_time
-
     @pytest.mark.parametrize("delta", [timedelta(minutes=1), 1, "{{ 1*2 }}"])
     def test_time_delta_sensor_templating(self, mocker, delta):
         defer_mock = mocker.patch(DEFER_PATH)

Reply via email to