Skip to content

Commit 302c993

Browse files
authored
Introduce a TextTransformer to replace strings with special chars (#6)
1 parent dc65d10 commit 302c993

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

localstack_snapshot/snapshots/transformer.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,19 @@ def _transform_dict(self, input_data: dict, ctx: TransformContext = None) -> dic
344344

345345
def _transform_list(self, input_data: list, ctx: TransformContext = None) -> list:
346346
return [self._transform(e, ctx=ctx) for e in input_data]
347+
348+
349+
class TextTransformer:
350+
def __init__(self, text: str, replacement: str):
351+
self.text = text
352+
self.replacement = replacement
353+
354+
def transform(self, input_data: dict, *, ctx: TransformContext) -> dict:
355+
def replace_val(s):
356+
return s.replace(self.text, self.replacement)
357+
358+
ctx.register_serialized_replacement(replace_val)
359+
SNAPSHOT_LOGGER.debug(
360+
f"Registering text pattern '{self.text}' in snapshot with '{self.replacement}'"
361+
)
362+
return input_data

localstack_snapshot/snapshots/transformer_utility.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
JsonpathTransformer,
66
KeyValueBasedTransformer,
77
RegexTransformer,
8+
TextTransformer,
89
)
910

1011

@@ -67,3 +68,16 @@ def regex(regex: str | Pattern[str], replacement: str):
6768
:return: RegexTransformer
6869
"""
6970
return RegexTransformer(regex, replacement)
71+
72+
@staticmethod
73+
def text(text: str, replacement: str):
74+
"""Creates a new TextTransformer. All occurrences in the string-converted dict will be replaced.
75+
76+
Useful if the text contains special characters that would confuse the RegexTransformer, like '+' or '('.
77+
78+
:param text: the text that should be replaced
79+
:param replacement: the value which will replace the original value.
80+
81+
:return: TextTransformer
82+
"""
83+
return TextTransformer(text, replacement)

tests/test_transformer.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,31 @@ def test_nested_sorting_transformer(self):
211211
output = transformer.transform(input, ctx=ctx)
212212
assert output == expected
213213

214+
@pytest.mark.parametrize(
215+
"value",
216+
[
217+
"a+b",
218+
"question?",
219+
"amount: $4.00",
220+
"emoji: ^^",
221+
"sentence.",
222+
"others (like so)",
223+
"special {char}",
224+
],
225+
)
226+
def test_text(self, value):
227+
input = {"key": f"some {value} with more text"}
228+
229+
expected = {"key": "some <value> with more text"}
230+
231+
transformer = TransformerUtility.text(value, "<value>")
232+
233+
ctx = TransformContext()
234+
output = transformer.transform(json.dumps(input), ctx=ctx)
235+
for sr in ctx.serialized_replacements:
236+
output = sr(output)
237+
assert json.loads(output) == expected
238+
214239

215240
class TestTimestampTransformer:
216241
def test_generic_timestamp_transformer(self):

0 commit comments

Comments
 (0)