From 1f9182bdb931d59f6d3e100627baca4fe6b93e14 Mon Sep 17 00:00:00 2001 From: oleks-dev <1228369+oleks-dev@users.noreply.github.com> Date: Sun, 28 Sep 2025 19:54:09 +0200 Subject: [PATCH] allow single tuple in step filter.regex_replace --- docs/reference/template/steps.md | 2 +- prich/models/text_filter_model.py | 4 +++- tests/test_run_template.py | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/reference/template/steps.md b/docs/reference/template/steps.md index fda90ca..e005447 100644 --- a/docs/reference/template/steps.md +++ b/docs/reference/template/steps.md @@ -48,7 +48,7 @@ steps: regex_extract: ".*" # optional [str] # replace output text using regex patterns - regex_replace: # optional [list(tuple(str,str))] - regex pattern, replace + regex_replace: # optional [tuple(str,str) | list(tuple(str,str))] - regex pattern, replace - ["(?i)(\"password\"\s*:\s*\")[^\"]+(\")", "\\1*****\\2"] # (ex. for json passwords sanitization) ``` diff --git a/prich/models/text_filter_model.py b/prich/models/text_filter_model.py index b38aba8..66a0b36 100644 --- a/prich/models/text_filter_model.py +++ b/prich/models/text_filter_model.py @@ -8,7 +8,7 @@ class TextFilterModel(BaseModel): slice_start: Optional[int] = None slice_end: Optional[int] = None regex_extract: Optional[str] = None - regex_replace: Optional[List[Tuple[str, str]]] = None # [(pattern, replacement), ...] + regex_replace: Optional[List[Tuple[str, str]] | Tuple[str, str]] = None # (pattern, replacement) or [(pattern, replacement), ...] def apply(self, text: str) -> str: out = text @@ -27,6 +27,8 @@ def apply(self, text: str) -> str: out = m.group(1) if (m and m.groups()) else (m.group(0) if m else "") if self.regex_replace: + if isinstance(self.regex_replace, tuple): + self.regex_replace = [self.regex_replace] for pattern, repl in self.regex_replace: out = re.sub(pattern, repl, out) diff --git a/tests/test_run_template.py b/tests/test_run_template.py index 24f3ec0..9464519 100644 --- a/tests/test_run_template.py +++ b/tests/test_run_template.py @@ -801,6 +801,27 @@ }, "expected_output": ["• Preprocess python", "{\"password\": \"*****\"}"] }, + {"id": "run_cmd_and_sanitize_output_single_regex_replace", "template": + # TemplateModel( + { + "id": "test-tpl", + "name": "Test TPL", + "steps": [ + PythonStep( + name="Preprocess python", + type="python", + call="echo.py", + args=["{\"password\": \"secret\"}"], + filter=TextFilterModel( + regex_replace=("(?i)(\"password\"\\s*:\\s*\")[^\"]+(\")", r"\1*****\2") + ), + ), + ], + "folder": "." + # ), + }, + "expected_output": ["• Preprocess python", "{\"password\": \"*****\"}"] + }, {"id": "run_cmd_and_sanitize_output_verbose", "template": # TemplateModel( {