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

husseinawala 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 553fb1f2ed rename skip_exit_code to skip_on_exit_code and allow 
providing multiple codes (#30692)
553fb1f2ed is described below

commit 553fb1f2ed0dfd177b11e3cc5232b964360fac8b
Author: Hussein Awala <[email protected]>
AuthorDate: Tue Apr 18 03:23:45 2023 +0200

    rename skip_exit_code to skip_on_exit_code and allow providing multiple 
codes (#30692)
    
    * rename skip_exit_code to skip_on_exit_code and allow providing multiple 
codes
    
    * replace list type by Container
---
 airflow/operators/python.py    | 17 ++++++++++++-----
 tests/operators/test_python.py | 11 +++++++----
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/airflow/operators/python.py b/airflow/operators/python.py
index 6f565f3492..b3744c7c85 100644
--- a/airflow/operators/python.py
+++ b/airflow/operators/python.py
@@ -26,6 +26,7 @@ import sys
 import types
 import warnings
 from abc import ABCMeta, abstractmethod
+from collections.abc import Container
 from pathlib import Path
 from tempfile import TemporaryDirectory
 from textwrap import dedent
@@ -471,7 +472,7 @@ class 
PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
     :param expect_airflow: expect Airflow to be installed in the target 
environment. If true, the operator
         will raise warning if Airflow is not installed, and it will attempt to 
load Airflow
         macros when starting.
-    :param skip_exit_code: If python_callable exits with this exit code, leave 
the task
+    :param skip_on_exit_code: If python_callable exits with this exit code, 
leave the task
         in ``skipped`` state (default: None). If set to ``None``, any non-zero
         exit code will be treated as a failure.
     """
@@ -494,7 +495,7 @@ class 
PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
         templates_dict: dict | None = None,
         templates_exts: list[str] | None = None,
         expect_airflow: bool = True,
-        skip_exit_code: int | None = None,
+        skip_on_exit_code: int | Container[int] | None = None,
         **kwargs,
     ):
         if (
@@ -518,7 +519,13 @@ class 
PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
         self.python_version = python_version
         self.system_site_packages = system_site_packages
         self.pip_install_options = pip_install_options
-        self.skip_exit_code = skip_exit_code
+        self.skip_on_exit_code = (
+            skip_on_exit_code
+            if isinstance(skip_on_exit_code, Container)
+            else [skip_on_exit_code]
+            if skip_on_exit_code
+            else []
+        )
         super().__init__(
             python_callable=python_callable,
             use_dill=use_dill,
@@ -557,8 +564,8 @@ class 
PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
             try:
                 result = 
self._execute_python_callable_in_subprocess(python_path, tmp_path)
             except subprocess.CalledProcessError as e:
-                if self.skip_exit_code and e.returncode == self.skip_exit_code:
-                    raise AirflowSkipException(f"Process exited with code 
{self.skip_exit_code}. Skipping.")
+                if e.returncode in self.skip_on_exit_code:
+                    raise AirflowSkipException(f"Process exited with code 
{e.returncode}. Skipping.")
                 else:
                     raise
             return result
diff --git a/tests/operators/test_python.py b/tests/operators/test_python.py
index 067e07d6c3..32c3b30b64 100644
--- a/tests/operators/test_python.py
+++ b/tests/operators/test_python.py
@@ -938,12 +938,15 @@ class TestPythonVirtualenvOperator(BasePythonTest):
         "extra_kwargs, actual_exit_code, expected_state",
         [
             (None, 99, TaskInstanceState.FAILED),
-            ({"skip_exit_code": 100}, 100, TaskInstanceState.SKIPPED),
-            ({"skip_exit_code": 100}, 101, TaskInstanceState.FAILED),
-            ({"skip_exit_code": None}, 0, TaskInstanceState.SUCCESS),
+            ({"skip_on_exit_code": 100}, 100, TaskInstanceState.SKIPPED),
+            ({"skip_on_exit_code": [100]}, 100, TaskInstanceState.SKIPPED),
+            ({"skip_on_exit_code": (100, 101)}, 100, 
TaskInstanceState.SKIPPED),
+            ({"skip_on_exit_code": 100}, 101, TaskInstanceState.FAILED),
+            ({"skip_on_exit_code": [100, 102]}, 101, TaskInstanceState.FAILED),
+            ({"skip_on_exit_code": None}, 0, TaskInstanceState.SUCCESS),
         ],
     )
-    def test_skip_exit_code(self, extra_kwargs, actual_exit_code, 
expected_state):
+    def test_on_skip_exit_code(self, extra_kwargs, actual_exit_code, 
expected_state):
         def f(exit_code):
             if exit_code != 0:
                 raise SystemExit(exit_code)

Reply via email to