diff --git a/cylc/flow/config.py b/cylc/flow/config.py index f5ce67488e6..30577f0ea66 100644 --- a/cylc/flow/config.py +++ b/cylc/flow/config.py @@ -81,6 +81,7 @@ is_relative_to, ) from cylc.flow.print_tree import print_tree +from cylc.flow.task_qualifiers import ALT_QUALIFIERS from cylc.flow.simulation import configure_sim_modes from cylc.flow.subprocctx import SubFuncContext from cylc.flow.task_events_mgr import ( @@ -1136,6 +1137,15 @@ def _check_completion_expression(self, task_name: str, expr: str) -> None: ' expressions, use "succeeded or failed".' ) + for alt_qualifier, qualifier in ALT_QUALIFIERS.items(): + if alt_qualifier in error: + raise WorkflowConfigError( + f'Error in [runtime][{task_name}]completion:' + f'\n {expr}' + f'\nUse "{qualifier}" not "{alt_qualifier}" ' + 'in completion expressions.' + ) + raise WorkflowConfigError( # NOTE: str(exc) == "name 'x' is not defined" tested in # tests/integration/test_optional_outputs.py diff --git a/tests/integration/validate/test_outputs.py b/tests/integration/validate/test_outputs.py index 3ddeba0e96d..63e5df5a248 100644 --- a/tests/integration/validate/test_outputs.py +++ b/tests/integration/validate/test_outputs.py @@ -219,6 +219,12 @@ def test_messages(messages, valid, flow, validate): 'but required in the completion expression', id='failed-implicitly-optional-in-graph-required-in-completion', ), + pytest.param( + 'foo', + '(succeed and x) or failed', + 'Use "succeeded" not "succeed" in completion expressions', + id='alt-qualifier', + ), ] ) def test_completion_expression_invalid(