Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: add replace non empty value in iterable and stringify value functions #17

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "upils"
version = "0.7.0"
version = "0.9.0"
description = "Unified Python Utils. Requires python 3.10 and later"
authors = [
"Aslam Hadi Harsono <[email protected]>",
Expand Down
19 changes: 19 additions & 0 deletions tests/test_iterable.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from upils.iterable import replace_none_in_iterable
import unittest


class IterableCase(unittest.TestCase):
def test_replace_empty_value_in_list_returns_no_none(self):
list_with_none = [None, "u", "i", "i", "a", "i"]
replacement = ""
list_no_none = replace_none_in_iterable(list_with_none, replacement)
self.assertTrue(None not in list_no_none)

def test_replace_empty_value_in_tuple_with_none_raises_error(self):
tuple_with_none = (None, "u", "i", "i", "a", "i")
replacement = None
with self.assertRaises(ValueError):
replace_none_in_iterable(tuple_with_none, replacement)

if __name__ == "__main__":
unittest.main()
13 changes: 13 additions & 0 deletions tests/test_string.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,19 @@ def test_hash_and_encode_to_base64(self):
)
self.assertEqual(expected_base64_string, actual_base64_string)

def test_stringify_empty_value(self):
value = None
actual_value = upils_string.stringify_value(value)
self.assertTrue(isinstance(actual_value, str))
self.assertEqual(actual_value, "NULL")

def test_stringify_non_empty_value(self):
value = 123
expected_value = "'123'"
actual_value = upils_string.stringify_value(value)
self.assertTrue(isinstance(actual_value, str))
self.assertEqual(actual_value, expected_value)


if __name__ == "__main__":
unittest.main()
15 changes: 15 additions & 0 deletions upils/iterable.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"""Module providing all function related to iterable, e.g. List, Tuple, Set"""
from typing import Any, Iterable, List


def replace_none_in_iterable(iterable: Iterable, replacement_value: Any = "") -> List:
"""Replace `None` value in iterable to handle NoneType related exceptions"""
replaced_none_iterable = []
if replacement_value is None:
raise ValueError("Replacement value cannot still be None.")
for value in iterable:
if value is None:
replaced_none_iterable.append(replacement_value)
else:
replaced_none_iterable.append(value)
return replaced_none_iterable
6 changes: 6 additions & 0 deletions upils/string.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,9 @@ def hash_and_encode_to_base64(
) -> str:
"""Get base64 string from hash digest. Used in surrogate key generation."""
return b64encode(hash_function(data.encode()).digest()).decode()

def stringify_value(value: str | None, replacement_value: str = "NULL") -> str:
"""Stringify value to use in SQL INSERT statement"""
if not isinstance(replacement_value, str):
raise ValueError("Replacement must be a string value.")
return replacement_value if value is None or value == "" else f"'{value}'"
Loading