Skip to content

Commit 9aa60e1

Browse files
authored
feat: add new function to help pre format a list of objects (#504)
1 parent d0277e4 commit 9aa60e1

File tree

2 files changed

+148
-0
lines changed

2 files changed

+148
-0
lines changed

app/tests/utils/test_filters.py

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pytest
12
from utils import filters
23

34

@@ -232,3 +233,139 @@ def test_get_unique_nested_dicts_with_duplicate_key():
232233
assert sorted(users_from_groups, key=lambda user: user["id"]) == sorted(
233234
expected_users, key=lambda user: user["id"]
234235
)
236+
237+
238+
def test_preformat_items():
239+
items_to_format = [
240+
{
241+
"id": "PREFIX-google_group_id1",
242+
"name": "PREFIX-group-name1",
243+
"members": [
244+
{
245+
"id": "PREFIX-user_id1",
246+
"primaryEmail": "[email protected]",
247+
}
248+
],
249+
}
250+
]
251+
252+
lookup_key = "name"
253+
new_key = "DisplayName"
254+
pattern = r"^PREFIX-"
255+
replace = "new-"
256+
response = filters.preformat_items(
257+
items_to_format, lookup_key, new_key, pattern, replace
258+
)
259+
260+
assert response == [
261+
{
262+
"id": "PREFIX-google_group_id1",
263+
"name": "PREFIX-group-name1",
264+
"members": [
265+
{
266+
"id": "PREFIX-user_id1",
267+
"primaryEmail": "[email protected]",
268+
}
269+
],
270+
"DisplayName": "new-group-name1",
271+
}
272+
]
273+
274+
275+
def test_preformat_items_returns_value_if_no_matching_pattern():
276+
items_to_format = [
277+
{
278+
"id": "PREFIX-google_group_id1",
279+
"name": "not-PREFIX-group-name1",
280+
"members": [
281+
{
282+
"id": "PREFIX-user_id1",
283+
"primaryEmail": "[email protected]",
284+
}
285+
],
286+
}
287+
]
288+
lookup_key = "name"
289+
new_key = "DisplayName"
290+
pattern = r"^PREFIX-"
291+
replace = "new-"
292+
response = filters.preformat_items(
293+
items_to_format, lookup_key, new_key, pattern, replace
294+
)
295+
296+
assert response == [
297+
{
298+
"id": "PREFIX-google_group_id1",
299+
"name": "not-PREFIX-group-name1",
300+
"members": [
301+
{
302+
"id": "PREFIX-user_id1",
303+
"primaryEmail": "[email protected]",
304+
}
305+
],
306+
"DisplayName": "not-PREFIX-group-name1",
307+
}
308+
]
309+
310+
311+
def test_preformat_items_lookup_key_not_found_raise_error(google_groups_w_users):
312+
items_to_format = google_groups_w_users(
313+
n_groups=1, n_users=1, group_prefix="PREFIX-"
314+
)
315+
lookup_key = "invalid_key"
316+
new_key = "DisplayName"
317+
pattern = "PREFIX-"
318+
replace = "new-"
319+
320+
with pytest.raises(KeyError) as exc:
321+
filters.preformat_items(items_to_format, lookup_key, new_key, pattern, replace)
322+
323+
expected_error_message = (
324+
f'"Item {items_to_format[0]} does not have {lookup_key} key"'
325+
)
326+
assert str(exc.value) == expected_error_message
327+
328+
329+
def test_preformat_items_with_nested_lookup_key():
330+
items_to_format = [
331+
{
332+
"id": "PREFIX-google_group_id1",
333+
"name": "PREFIX-group-name1",
334+
"members": [
335+
{
336+
"id": "PREFIX-user_id1",
337+
"primaryEmail": "[email protected]",
338+
}
339+
],
340+
"group_membership_id": {
341+
"id": "PREFIX-group_membership_id1",
342+
"name": "PREFIX-group_membership_name1",
343+
},
344+
}
345+
]
346+
347+
lookup_key = "group_membership_id.name"
348+
new_key = "group_name"
349+
pattern = r"^PREFIX-"
350+
replace = "new-"
351+
response = filters.preformat_items(
352+
items_to_format, lookup_key, new_key, pattern, replace
353+
)
354+
355+
assert response == [
356+
{
357+
"id": "PREFIX-google_group_id1",
358+
"name": "PREFIX-group-name1",
359+
"members": [
360+
{
361+
"id": "PREFIX-user_id1",
362+
"primaryEmail": "[email protected]",
363+
}
364+
],
365+
"group_membership_id": {
366+
"id": "PREFIX-group_membership_id1",
367+
"name": "PREFIX-group_membership_name1",
368+
},
369+
"group_name": "new-group_membership_name1",
370+
}
371+
]

app/utils/filters.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""This module contains utility functions for filtering lists and dictionaries."""
22
from functools import reduce
33
import logging
4+
import re
45

56
logger = logging.getLogger(__name__)
67

@@ -133,3 +134,13 @@ def get_unique_nested_dicts(source_items, nested_key):
133134
unique_dicts[str(nested_dict)] = nested_dict
134135
logger.info(f"Found {len(unique_dicts)} unique dictionaries.")
135136
return list(unique_dicts.values())
137+
138+
139+
def preformat_items(items, lookup_key, new_key, pattern="", replace=""):
140+
for item in items:
141+
value = get_nested_value(item, lookup_key)
142+
if not value:
143+
raise KeyError(f"Item {item} does not have {lookup_key} key")
144+
item[new_key] = re.sub(pattern, replace, value)
145+
146+
return items

0 commit comments

Comments
 (0)