diff --git a/magic_filter/__init__.py b/magic_filter/__init__.py index cc803ab..9a5909a 100644 --- a/magic_filter/__init__.py +++ b/magic_filter/__init__.py @@ -1,6 +1,7 @@ from . import operations +from .attrdict import AttrDict from .magic import MagicFilter -__all__ = ("operations", "MagicFilter", "F") +__all__ = ("operations", "MagicFilter", "F", "AttrDict") F = MagicFilter() diff --git a/magic_filter/attrdict.py b/magic_filter/attrdict.py new file mode 100644 index 0000000..1d90720 --- /dev/null +++ b/magic_filter/attrdict.py @@ -0,0 +1,14 @@ +from typing import Any, Dict, TypeVar + +KT = TypeVar("KT") +VT = TypeVar("VT") + + +class AttrDict(Dict[KT, VT]): + """ + A wrapper over dict which where element can be accessed as regular attributes + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super(AttrDict, self).__init__(*args, **kwargs) + self.__dict__ = self # type: ignore diff --git a/pyproject.toml b/pyproject.toml index 5e7a6eb..1275003 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "magic-filter" -version = "1.0.2" +version = "1.0.3" description = "This package provides magic filter based on dynamic attribute getter" license = "MIT" readme = "README.md" diff --git a/tests/test_attrdict.py b/tests/test_attrdict.py new file mode 100644 index 0000000..ac2939b --- /dev/null +++ b/tests/test_attrdict.py @@ -0,0 +1,15 @@ +from magic_filter import AttrDict + + +class TestAttrDict: + def test_attrdict(self): + attr = AttrDict({"a": 1, "b": 2, "c": "d"}) + + assert attr["a"] == 1 + assert attr.a == 1 + + assert attr["b"] == 2 + assert attr.b == 2 + + assert attr["c"] == "d" + assert attr.c == "d"