| 32 | class BaseFormatter(formatters.Formatter): |
| 33 | @classmethod |
| 34 | def format(self, subject, *args, **kwargs): |
| 35 | attributes = kwargs.get("attributes", None) |
| 36 | if type(subject) is str: |
| 37 | subject = orjson.loads(subject) |
| 38 | elif not isinstance(subject, (list, tuple)) and not hasattr( |
| 39 | subject, "__iter__" |
| 40 | ): |
| 41 | doc = subject if isinstance(subject, dict) else subject.__dict__ |
| 42 | keys = ( |
| 43 | list(doc.keys()) |
| 44 | if not attributes or "all" in attributes |
| 45 | else attributes |
| 46 | ) |
| 47 | docs = jsutil.get_kvps(doc, keys) |
| 48 | else: |
| 49 | docs = [] |
| 50 | for item in subject: |
| 51 | doc = item if isinstance(item, dict) else item.__dict__ |
| 52 | keys = ( |
| 53 | list(doc.keys()) |
| 54 | if not attributes or "all" in attributes |
| 55 | else attributes |
| 56 | ) |
| 57 | docs.append(jsutil.get_kvps(doc, keys)) |
| 58 | |
| 59 | return docs |
| 60 | |
| 61 | |
| 62 | class JsonFormatter(BaseFormatter): |