diff --git a/main.py b/main.py deleted file mode 100644 index db48b90..0000000 --- a/main.py +++ /dev/null @@ -1,6 +0,0 @@ -def main(): - print("Hello from python-utils!") - - -if __name__ == "__main__": - main() diff --git a/pyproject.toml b/pyproject.toml index 55945c1..aec63d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,3 +24,20 @@ dev = [ "ruff>=0.12.10", "safety>=3.6.0", ] + +[tool.mypy] +python_version = "3.10" +warn_return_any = true # nudge to use stricter types +warn_unused_configs = true # nudge to remove unused configs +disallow_untyped_defs = true # disallow untyped function definitions +disallow_incomplete_defs = true # ensure all parts of a function has type annotation +check_untyped_defs = true # dont skip untyped functions +disallow_untyped_decorators = false # allow untyped decorators to keep code more readable +no_implicit_optional = true # disallow implicit optional types leading to None-mess +warn_redundant_casts = true # nudge to use explicit type casts +warn_unused_ignores = true # nudge to remove unused ignores +warn_no_return = true # catch missing return statements +warn_unreachable = true # catch unreachable code +show_error_codes = true # show error codes in output +explicit_package_bases = true # reduce risk of import confusion +namespace_packages = true # enable namespace packages diff --git a/python_utils/__init__.py b/python_utils/__init__.py index e69de29..60e6d80 100644 --- a/python_utils/__init__.py +++ b/python_utils/__init__.py @@ -0,0 +1,4 @@ +from .check_env import check_env as check_env +from .readable_unit import readable_unit as readable_unit + +__all__ = ["check_env", "readable_unit"] diff --git a/python_utils/check_env.py b/python_utils/check_env.py index 63f61af..1b4a91e 100644 --- a/python_utils/check_env.py +++ b/python_utils/check_env.py @@ -5,7 +5,7 @@ import os def check_env( - var_list: str | list[str], + var_list: str | set[str] | list[str] | tuple[str, ...], missing_ok: bool = False, ) -> None: """Check if environment variables are set. diff --git a/tests/unit/check_env_test.py b/tests/unit/check_env_test.py index e5cf166..bda970e 100644 --- a/tests/unit/check_env_test.py +++ b/tests/unit/check_env_test.py @@ -3,12 +3,15 @@ import os import unittest -from pytohn_utils import check_env +from python_utils import check_env class TestCheckEnv(unittest.TestCase): + set_vars: list[str] + unset_var: str + @classmethod - def setUpClass(cls): + def setUpClass(cls) -> None: """Set up test environment variables.""" cls.set_vars = ["A", "B", "C"] for var in cls.set_vars: @@ -20,41 +23,41 @@ class TestCheckEnv(unittest.TestCase): ) @classmethod - def tearDownClass(cls): + def tearDownClass(cls) -> None: for var in cls.set_vars: if var in os.environ: del os.environ[var] os.environ.pop(var, None) - def test_check_env_accepts_single_string(self): + def test_check_env_accepts_single_string(self) -> None: """Test check_env function with a valid single string.""" - self.assertIsNone(check_env(self.set_vars[0])) + check_env(self.set_vars[0]) - def test_check_env_accepts_list_of_strings(self): + def test_check_env_accepts_list_of_strings(self) -> None: """Test check_env function with a valid list of strings.""" - self.assertIsNone(check_env(self.set_vars)) + check_env(self.set_vars) - def test_check_env_accepts_set_of_strings(self): + def test_check_env_accepts_set_of_strings(self) -> None: """Test check_env function with a valid set of strings.""" - self.assertIsNone(check_env(set(self.set_vars))) + check_env(set(self.set_vars)) - def test_check_env_accepts_tuple_of_strings(self): + def test_check_env_accepts_tuple_of_strings(self) -> None: """Test check_env function with a valid tuple of strings.""" - self.assertIsNone(check_env(tuple(self.set_vars))) + check_env(tuple(self.set_vars)) - def test_check_env_rejects_empty_list(self): + def test_check_env_rejects_empty_list(self) -> None: """Test check_env function with an empty list.""" with self.assertRaises(ValueError): check_env([]) - def test_check_env_raises_error_on_missing_vars(self): + def test_check_env_raises_error_on_missing_vars(self) -> None: """Test check_env function with missing environment variables.""" with self.assertRaises(OSError): check_env(self.unset_var) - def test_check_env_does_not_raise_error_when_missing_ok_flag_set(self): + def test_check_env_does_not_raise_error_when_missing_ok_flag_set(self) -> None: """Test that check_env does not raise an error when the environment variable is missing and missing_ok=True. The 'missing_ok' flag allows the function to skip raising an error if the specified environment variable(s) are not set. """ - self.assertIsNone(check_env(self.unset_var, missing_ok=True)) + check_env(self.unset_var, missing_ok=True) diff --git a/tests/unit/readable_unit_test.py b/tests/unit/readable_unit_test.py index 98e631f..23b1e11 100644 --- a/tests/unit/readable_unit_test.py +++ b/tests/unit/readable_unit_test.py @@ -1,6 +1,7 @@ """Unittests for the readable function.""" import pytest +from typing import Any from python_utils import readable_unit @@ -31,7 +32,11 @@ TEST_CASES = [ @pytest.mark.parametrize("value, unit, expected", TEST_CASES) -def test_readable_unit(value, unit, expected): +def test_readable_unit( + value: Any, # Allow invalid types for testing + unit: Any, # Allow invalid types for testing + expected: Any, # Allow invalid types for testing +) -> None: """Test readable_unit function with valid inputs.""" if isinstance(expected, type) and issubclass(expected, Exception): with pytest.raises(expected):