Visitar URL original
deprecate dummy trigger rule infavor of always (#17144) · apache/airflow@d7a6856 · GitHub
Skip to content

Commit d7a6856

Browse files
authored
deprecate dummy trigger rule infavor of always (#17144)
1 parent 2dc7aa8 commit d7a6856

8 files changed

Lines changed: 44 additions & 8 deletions

File tree

‎UPDATING.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ https://developers.google.com/style/inclusive-documentation
7373
7474
-->
7575

76+
### Dummy trigger rule has been deprecated
77+
78+
`TriggerRule.DUMMY` is replaced by `TriggerRule.ALWAYS`.
79+
This is only name change, no functionality changes made.
80+
This change is backward compatible however `TriggerRule.DUMMY` will be removed in next major release.
81+
7682
### DAG concurrency settings have been renamed
7783

7884
`[core] dag_concurrency` setting in `airflow.cfg` has been renamed to `[core] max_active_tasks_per_dag`

‎airflow/models/baseoperator.py‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ class derived from this one results in the creation of a task object,
348348
:param trigger_rule: defines the rule by which dependencies are applied
349349
for the task to get triggered. Options are:
350350
``{ all_success | all_failed | all_done | one_success |
351-
one_failed | none_failed | none_failed_or_skipped | none_skipped | dummy}``
351+
one_failed | none_failed | none_failed_or_skipped | none_skipped | always}``
352352
default is ``all_success``. Options can be set as string or
353353
using the constants defined in the static class
354354
``airflow.utils.TriggerRule``
@@ -542,6 +542,14 @@ def __init__(
542542
if end_date:
543543
self.end_date = timezone.convert_to_utc(end_date)
544544

545+
if trigger_rule == "dummy":
546+
warnings.warn(
547+
"dummy Trigger Rule is deprecated. Please use `TriggerRule.ALWAYS`.",
548+
DeprecationWarning,
549+
stacklevel=2,
550+
)
551+
trigger_rule = TriggerRule.ALWAYS
552+
545553
if not TriggerRule.is_valid(trigger_rule):
546554
raise AirflowException(
547555
"The trigger_rule must be one of {all_triggers},"

‎airflow/ti_deps/deps/trigger_rule_dep.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ def _get_dep_statuses(self, ti, session, dep_context):
6161
yield self._passing_status(reason="The task instance did not have any upstream tasks.")
6262
return
6363

64-
if ti.task.trigger_rule == TR.DUMMY:
65-
yield self._passing_status(reason="The task had a dummy trigger rule set.")
64+
if ti.task.trigger_rule == TR.ALWAYS:
65+
yield self._passing_status(reason="The task had a always trigger rule set.")
6666
return
6767
# see if the task name is in the task upstream for our task
6868
successes, skipped, failed, upstream_failed, done = self._get_states_count_upstream_ti(

‎airflow/utils/trigger_rule.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class TriggerRule:
3131
NONE_FAILED_OR_SKIPPED = 'none_failed_or_skipped'
3232
NONE_SKIPPED = 'none_skipped'
3333
DUMMY = 'dummy'
34+
ALWAYS = 'always'
3435

3536
_ALL_TRIGGER_RULES: Set[str] = set()
3637

‎docs/apache-airflow/concepts/dags.rst‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ However, this is just the default behaviour, and you can control it using the ``
337337
* ``none_failed``: All upstream tasks have not ``failed`` or ``upstream_failed`` - that is, all upstream tasks have succeeded or been skipped
338338
* ``none_failed_or_skipped``: All upstream tasks have not ``failed`` or ``upstream_failed``, and at least one upstream task has succeeded.
339339
* ``none_skipped``: No upstream task is in a ``skipped`` state - that is, all upstream tasks are in a ``success``, ``failed``, or ``upstream_failed`` state
340-
* ``dummy``: No dependencies at all, run this task at any time
340+
* ``always``: No dependencies at all, run this task at any time
341341

342342
You can also combine this with the :ref:`concepts:depends-on-past` functionality if you wish.
343343

‎tests/models/test_baseoperator.py‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from airflow.models.baseoperator import BaseOperatorMeta, chain, cross_downstream
3232
from airflow.operators.dummy import DummyOperator
3333
from airflow.utils.edgemodifier import Label
34+
from airflow.utils.trigger_rule import TriggerRule
3435
from tests.models import DEFAULT_DATE
3536
from tests.test_utils.mock_operators import DeprecatedOperator, MockNamedTuple, MockOperator
3637

@@ -595,6 +596,25 @@ def test_set_xcomargs_dependencies_error_when_outside_dag(self):
595596
op1 = DummyOperator(task_id="op1")
596597
CustomOp(task_id="op2", field=op1.output)
597598

599+
def test_invalid_trigger_rule(self):
600+
with pytest.raises(
601+
AirflowException,
602+
match=(
603+
f"The trigger_rule must be one of {TriggerRule.all_triggers()},"
604+
"'.op1'; received 'some_rule'."
605+
),
606+
):
607+
DummyOperator(task_id="op1", trigger_rule="some_rule")
608+
609+
@parameterized.expand((("string", "dummy"), ("enum", TriggerRule.DUMMY)))
610+
def test_replace_dummy_trigger_rule(self, name, rule):
611+
with pytest.warns(
612+
DeprecationWarning, match="dummy Trigger Rule is deprecated. Please use `TriggerRule.ALWAYS`."
613+
):
614+
op1 = DummyOperator(task_id="op1", trigger_rule=rule)
615+
616+
assert op1.trigger_rule == TriggerRule.ALWAYS
617+
598618

599619
class InitSubclassOp(DummyOperator):
600620
def __init_subclass__(cls, class_arg=None, **kwargs) -> None:

‎tests/ti_deps/deps/test_trigger_rule_dep.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ def test_no_upstream_tasks(self):
4848
ti = self._get_task_instance(TriggerRule.ALL_DONE, State.UP_FOR_RETRY)
4949
assert TriggerRuleDep().is_met(ti=ti)
5050

51-
def test_dummy_tr(self):
51+
def test_always_tr(self):
5252
"""
53-
The dummy trigger rule should always pass this dep
53+
The always trigger rule should always pass this dep
5454
"""
55-
ti = self._get_task_instance(TriggerRule.DUMMY, State.UP_FOR_RETRY)
55+
ti = self._get_task_instance(TriggerRule.ALWAYS, State.UP_FOR_RETRY)
5656
assert TriggerRuleDep().is_met(ti=ti)
5757

5858
def test_one_success_tr_success(self):

‎tests/utils/test_trigger_rule.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ def test_valid_trigger_rules(self):
3232
assert TriggerRule.is_valid(TriggerRule.NONE_FAILED_OR_SKIPPED)
3333
assert TriggerRule.is_valid(TriggerRule.NONE_SKIPPED)
3434
assert TriggerRule.is_valid(TriggerRule.DUMMY)
35-
assert len(TriggerRule.all_triggers()) == 9
35+
assert TriggerRule.is_valid(TriggerRule.ALWAYS)
36+
assert len(TriggerRule.all_triggers()) == 10

0 commit comments

Comments
 (0)