Skip to content
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
4 changes: 0 additions & 4 deletions docs/package/base/.pages

This file was deleted.

1 change: 0 additions & 1 deletion docs/package/base/char.md

This file was deleted.

15 changes: 15 additions & 0 deletions pycommons/lang/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,21 @@

from importlib_metadata import PackageNotFoundError, version

from .arrayutils import ArrayUtils
from .charutils import CharUtils
from .exceptionutils import ExceptionUtils
from .stringutils import StringUtils

__all__ = [
"__author__",
"__email__",
"__version__",
"ArrayUtils",
"CharUtils",
"ExceptionUtils",
"StringUtils",
]

__author__ = "Shashank Sharma"
__email__ = "shashankrnr32@gmail.com"

Expand Down
File renamed without changes.
File renamed without changes.
51 changes: 51 additions & 0 deletions pycommons/lang/exceptionutils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import traceback
from contextlib import AbstractContextManager
from types import TracebackType
from typing import TypeVar, Type, Optional, Union, Generic

from pycommons.base.utils.utils import UtilityClass

_E = TypeVar("_E", Exception, BaseException)


class ExceptionUtils(UtilityClass):
@classmethod
def get_cause(cls, exception: _E) -> Optional[BaseException]:
return exception.__cause__

@classmethod
def ignored(cls, exception_type: Type[_E] = Exception) -> "IgnoredExceptionContext[_E]":
return IgnoredExceptionContext(exception_type)


class IgnoredExceptionContext(AbstractContextManager, Generic[_E]): # type: ignore
def __init__(self, exception_type: Type[BaseException]):
self._expected_exc_type: Type[BaseException] = exception_type
self._exception: Optional[Union[_E, BaseException]] = None

@property
def exception(self) -> Optional[Union[_E, BaseException]]:
return self._exception

def __exit__(
self,
__exc_type: Optional[Type[BaseException]],
__exc_value: Optional[BaseException],
__traceback: Optional[TracebackType],
) -> Optional[bool]:
self._exception = __exc_value
if (
__exc_type is not None
and (
__exc_type == self._expected_exc_type
or issubclass(__exc_type, self._expected_exc_type)
)
and __traceback is not None
):
traceback.clear_frames(__traceback)
return True

if __exc_type is not None and __exc_type != self._expected_exc_type:
return False

return None
File renamed without changes.
Empty file removed pycommons/lang/utils/__init__.py
Empty file.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ max-locals = 20
min-public-method = 0

[tool.pytest.ini_options]
addopts = "--cov=pycommons --cov-branch --cov-report term-missing --cov-report xml -vv --color=yes --cov-fail-under 10"
addopts = "--cov=pycommons --cov-branch --cov-report term-missing --cov-report xml -vv --color=yes --cov-fail-under 40"
python_files = "tests.py test_*.py *_tests.py *Test.py"

[build-system]
Expand Down
4 changes: 2 additions & 2 deletions tests/parametrized.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import dataclasses
import functools
from typing import Any, Optional, List
from typing import Any, Optional


@dataclasses.dataclass
Expand All @@ -17,7 +17,7 @@ def get_message(self):
)


def cases(testcases: List[TestData]):
def cases(*testcases: TestData):
def decorator(f):
@functools.wraps(f)
def wrapped(self):
Expand Down
3 changes: 3 additions & 0 deletions tests/pycommons/lang/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from pycommons.lang import ArrayUtils, CharUtils, StringUtils, ExceptionUtils

__all__ = ["ArrayUtils", "CharUtils", "StringUtils", "ExceptionUtils"]
136 changes: 136 additions & 0 deletions tests/pycommons/lang/test_charutils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
from unittest import TestCase

from pycommons.lang.charutils import CharUtils
from tests.parametrized import cases, TestData


class CharUtilsTest(TestCase):
@cases(
TestData(data=" ", expected=True),
TestData(data="\t", expected=True),
TestData(data="\f", expected=True),
TestData(data="\u001D", expected=True),
TestData(data="a", expected=False),
TestData(data="1", expected=False),
TestData(data="*", expected=False),
TestData(data=None, expected=False),
)
def test_is_whitespace(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_whitespace(test_case.data))

@cases(
TestData(data="a", expected=True),
TestData(data="1", expected=True),
TestData(data="*", expected=True),
TestData(data="\u001D", expected=False),
TestData(data=None, expected=False),
TestData(data="ಕ", expected=False),
)
def test_is_ascii_printable(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_ascii_printable(test_case.data))

@cases(
TestData(data=" ", expected=False),
TestData(data="\t", expected=False),
TestData(data="a", expected=False),
TestData(data="1", expected=True),
TestData(data="Ⅳ", expected=False),
TestData(data=None, expected=False),
)
def test_is_digit(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_digit(test_case.data))

@cases(
TestData(data=" ", expected=False),
TestData(data="\t", expected=False),
TestData(data="a", expected=True),
TestData(data="1", expected=False),
TestData(data="Ⅳ", expected=False),
TestData(data="ಕ", expected=True),
TestData(data=None, expected=False),
)
def test_is_letter(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_letter(test_case.data))

@cases(
TestData(data=" ", expected=False),
TestData(data="a", expected=True),
TestData(data="1", expected=True),
TestData(data="Ⅳ", expected=True),
TestData(data="ಕ", expected=True),
TestData(data=None, expected=False),
)
def test_is_letter_or_digit(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_letter_or_digit(test_case.data))

@cases(
TestData(data=" ", expected=False),
TestData(data="a", expected=False),
TestData(data="A", expected=True),
TestData(data="1", expected=False),
TestData(data="Ⅳ", expected=True),
TestData(data="ಕ", expected=False),
TestData(data=None, expected=False),
)
def test_is_uppercase(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_uppercase(test_case.data))

@cases(
TestData(data=" ", expected=False),
TestData(data="a", expected=True),
TestData(data="A", expected=False),
TestData(data="1", expected=False),
TestData(data="Ⅳ", expected=False),
TestData(data="ಕ", expected=False),
TestData(data=None, expected=False),
)
def test_is_lowercase(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_lowercase(test_case.data))

@cases(
TestData(data=" ", expected=" "),
TestData(data="a", expected="a"),
TestData(data="A", expected="A"),
TestData(data="1", expected="1"),
TestData(data="Ⅳ", expected="Ⅳ"),
TestData(data="ಕ", expected="ಕ"),
TestData(data=None, expected=None),
)
def test_to_character(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.to_character(test_case.data))

@cases(
TestData(data=(" ", "\t"), expected=False),
TestData(data=("a", "a"), expected=True),
TestData(data=("1", "1"), expected=True),
TestData(data=(69, 78), expected=False),
TestData(data=(None, "1"), expected=False),
TestData(data=("1", None), expected=False),
TestData(data=(None, None), expected=False),
)
def test_is_equal(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_equal(*test_case.data))

@cases(
TestData(data=" ", expected=" "),
TestData(data="a", expected="A"),
TestData(data="A", expected="A"),
TestData(data="1", expected="1"),
TestData(data="Ⅳ", expected="Ⅳ"),
TestData(data="ಕ", expected="ಕ"),
TestData(data=None, expected=None),
)
def test_to_uppercase(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.to_uppercase(test_case.data))

@cases(
TestData(data=" ", expected=" "),
TestData(data="a", expected="a"),
TestData(data="A", expected="a"),
TestData(data="1", expected="1"),
TestData(data="Ⅳ", expected="ⅳ"),
TestData(data="ಕ", expected="ಕ"),
TestData(data=None, expected=None),
)
def test_to_lowercase(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.to_lowercase(test_case.data))
44 changes: 44 additions & 0 deletions tests/pycommons/lang/test_stringutils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from unittest import TestCase

from pycommons.lang.stringutils import StringUtils
from tests.parametrized import cases, TestData


class TestStringUtils(TestCase):
@cases(
TestData(data=(None, "testString"), expected="testString"),
TestData(data=(None, None), expected=None),
TestData(data=(), expected=None),
TestData(data=("", " ", "testString", None), expected="testString"),
TestData(data=("None", None, "testString"), expected="None"),
)
def test_get_first_non_blank(self, test_data: TestData):
self.assertEqual(test_data.expected, StringUtils.get_first_non_blank(*test_data.data))

@cases(
TestData(data=(None, "testString"), expected="testString"),
TestData(data=(None, None), expected=None),
TestData(data=(), expected=None),
TestData(data=("", " ", "testString", None), expected=" "),
TestData(data=("None", None, "testString"), expected="None"),
)
def test_get_first_non_empty(self, test_data: TestData):
self.assertEqual(test_data.expected, StringUtils.get_first_non_empty(*test_data.data))

@cases(
TestData(data="testString", expected=b"testString"),
TestData(data="", expected=b""),
TestData(data=None, expected=None),
)
def test_get_bytes(self, test_data: TestData):
self.assertEqual(test_data.expected, StringUtils.get_bytes(test_data.data))

@cases(
TestData(data="testString", expected=""),
TestData(data="123testString456", expected="123456"),
TestData(data="123456", expected="123456"),
TestData(data=None, expected=""),
TestData(data="", expected=""),
)
def test_get_digits(self, test_data: TestData):
self.assertEqual(test_data.expected, StringUtils.get_digits(test_data.data))
Empty file.
Loading