|
1 | 1 | import base64 |
| 2 | +import inspect |
| 3 | +import logging |
2 | 4 | from typing import Any |
3 | 5 | from typing import List |
4 | 6 | from typing import Optional |
|
10 | 12 | from idpyoidc.message import Message |
11 | 13 | from idpyoidc.storage import DictType |
12 | 14 |
|
| 15 | +logger = logging.getLogger(__name__) |
13 | 16 |
|
14 | 17 | def fully_qualified_name(cls): |
15 | 18 | return cls.__module__ + "." + cls.__class__.__name__ |
@@ -41,6 +44,7 @@ def __init__(self): |
41 | 44 | pass |
42 | 45 |
|
43 | 46 | def dump_attr(self, cls, item, exclude_attributes: Optional[List[str]] = None) -> dict: |
| 47 | + logger.debug(f"dump_attr:: cls: {cls}, item: {item}") |
44 | 48 | if cls in [None, 0, "", bool]: |
45 | 49 | val = item |
46 | 50 | elif cls == b"": |
@@ -74,9 +78,29 @@ def dump_attr(self, cls, item, exclude_attributes: Optional[List[str]] = None) - |
74 | 78 | val = qualified_name(item) |
75 | 79 | elif isinstance(cls, list): |
76 | 80 | val = [self.dump_attr(cls[0], v, exclude_attributes) for v in item] |
| 81 | + elif inspect.isclass(cls): |
| 82 | + logger.debug(f"class instance: {cls}") |
| 83 | + _dump = getattr(cls, "dump", None) |
| 84 | + if _dump: |
| 85 | + val = _dump(item, exclude_attributes=exclude_attributes) |
| 86 | + else: |
| 87 | + if isinstance(item, cls): |
| 88 | + val = {qualified_name(cls): item.to_dict()} |
| 89 | + elif isinstance(item, dict): |
| 90 | + val = {qualified_name(cls): item} |
| 91 | + else: |
| 92 | + logger.error(f"Can't dump {item} as {cls}") |
77 | 93 | else: |
78 | | - val = item.dump(exclude_attributes=exclude_attributes) |
| 94 | + _dump = getattr(item, "dump", None) |
| 95 | + if _dump: |
| 96 | + val = _dump(exclude_attributes=exclude_attributes) |
| 97 | + elif isinstance(item, dict): |
| 98 | + val = item |
| 99 | + else: |
| 100 | + logger.error(f"Do not know how to dump: {item}") |
| 101 | + raise AttributeError() |
79 | 102 |
|
| 103 | + logger.debug(f"-> {val}") |
80 | 104 | return val |
81 | 105 |
|
82 | 106 | def dump(self, exclude_attributes: Optional[List[str]] = None) -> dict: |
@@ -154,7 +178,11 @@ def load_attr( |
154 | 178 | val = [_cls(**_args).load(v, **_kwargs) for v in item] |
155 | 179 | elif issubclass(cls, Message): |
156 | 180 | _cls_name = list(item.keys())[0] |
157 | | - _cls = importer(_cls_name) |
| 181 | + try: |
| 182 | + _cls = importer(_cls_name) |
| 183 | + except Exception as err: |
| 184 | + logger.error(f"Could not import {item}: {err}") |
| 185 | + raise |
158 | 186 | val = _cls().from_dict(item[_cls_name]) |
159 | 187 | else: |
160 | 188 | if issubclass(cls, ImpExp) and init_args: |
|
0 commit comments