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)