Skip to content

Commit 4a53c29

Browse files
committed
src(attrs): add cattrs converter
1 parent 2d9cdca commit 4a53c29

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

cellengine/utils/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# flake8: noqa
2+
3+
from .readonly import readonly
4+
from .converter import converter

cellengine/utils/converter.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from cellengine.utils.helpers import to_camel_case
2+
from attr import has, fields
3+
from cattr.converters import GenConverter
4+
from cattr.gen import make_dict_unstructure_fn, make_dict_structure_fn, override
5+
6+
7+
def get_converter():
8+
converter = GenConverter()
9+
10+
def to_camel_case_unstructure(cls):
11+
return make_dict_unstructure_fn(
12+
cls,
13+
converter,
14+
**{a.name: override(rename=to_camel_case(a.name)) for a in fields(cls)}
15+
)
16+
17+
def to_camel_case_structure(cls):
18+
return make_dict_structure_fn(
19+
cls,
20+
converter,
21+
**{a.name: override(rename=to_camel_case(a.name)) for a in fields(cls)}
22+
)
23+
24+
converter.register_unstructure_hook_factory(has, to_camel_case_unstructure)
25+
converter.register_structure_hook_factory(has, to_camel_case_structure)
26+
27+
return converter
28+
29+
30+
converter = get_converter()

cellengine/utils/helpers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ def check_id(_id):
1818
ValueError("Object has an invalid ID.", e)
1919

2020

21+
def to_camel_case(snake_str: str) -> str:
22+
if snake_str == "_id":
23+
return snake_str
24+
components = snake_str.split("_")
25+
return components[0] + "".join(x.title() for x in components[1:])
26+
27+
2128
def get_args_as_kwargs(cls_context, locals):
2229
# fmt: off
2330
arg_names = cls_context.create.__code__.co_varnames[

0 commit comments

Comments
 (0)