Skip to content

Commit 5f98bd2

Browse files
authored
feat: add sanitize_url jinja macro (#571)
1 parent 7818b33 commit 5f98bd2

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

airbyte_cdk/sources/declarative/interpolation/macros.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import datetime
77
import typing
88
from typing import Optional, Union
9+
from urllib.parse import quote_plus
910

1011
import isodate
1112
import pytz
@@ -182,6 +183,17 @@ def format_datetime(
182183
return DatetimeParser().format(dt=dt_datetime, format=format)
183184

184185

186+
def sanitize_url(value: str) -> str:
187+
"""
188+
Sanitizes a value by via urllib.parse.quote_plus
189+
190+
Usage:
191+
`"{{ sanitize_url('https://example.com/path?query=value') }}"`
192+
"""
193+
sanitization_strategy = quote_plus
194+
return sanitization_strategy(value)
195+
196+
185197
_macros_list = [
186198
now_utc,
187199
today_utc,
@@ -193,5 +205,6 @@ def format_datetime(
193205
format_datetime,
194206
today_with_timezone,
195207
str_to_datetime,
208+
sanitize_url,
196209
]
197210
macros = {f.__name__: f for f in _macros_list}

unit_tests/sources/declarative/interpolation/test_macros.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,30 @@ def test_given_invalid_date_str_to_datetime_raises_value_error():
222222
str_to_datetime_fn = macros["str_to_datetime"]
223223
with pytest.raises(ValueError):
224224
str_to_datetime_fn("invalid-date")
225+
226+
227+
@pytest.mark.parametrize(
228+
"test_name, input_value, expected_output",
229+
[
230+
(
231+
"test_basic_url",
232+
"https://example.com/path?query=value",
233+
"https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue",
234+
),
235+
(
236+
"test_url_with_spaces",
237+
"https://example.com/path with spaces?query=some value",
238+
"https%3A%2F%2Fexample.com%2Fpath+with+spaces%3Fquery%3Dsome+value",
239+
),
240+
(
241+
"test_url_with_special_chars",
242+
"https://example.com/path?query=value&other=123+456#fragment",
243+
"https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue%26other%3D123%2B456%23fragment",
244+
),
245+
("test_non_url_string", "hello world", "hello+world"),
246+
],
247+
)
248+
def test_sanitize_url(test_name, input_value, expected_output):
249+
sanitize_url = macros["sanitize_url"]
250+
actual_output = sanitize_url(input_value)
251+
assert actual_output == expected_output

0 commit comments

Comments
 (0)