forked from bogdandm/json2python-models
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpprint_meta_data.py
More file actions
89 lines (71 loc) · 2.42 KB
/
pprint_meta_data.py
File metadata and controls
89 lines (71 loc) · 2.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from inspect import isclass
from json_to_models.dynamic_typing import (
ComplexType,
ModelMeta,
ModelPtr,
SingleType,
StringSerializable,
)
from json_to_models.generator import MetadataGenerator
from json_to_models.registry import ModelRegistry
from testing_tools.data import test_data
def _pprint_gen(value, key=None, lvl=0, empty_line=True, ignore_ptr=False):
if empty_line:
yield "\n"
if lvl > 0:
yield "\t" * lvl
else:
print(end=" ")
if key is not None:
yield f"{key} -> "
if isinstance(value, dict):
yield "object:"
for k, v in value.items():
yield from _pprint_gen(v, k, lvl=lvl + 1, ignore_ptr=ignore_ptr)
elif isinstance(value, list):
for t in value:
yield from _pprint_gen(t, lvl=lvl + 1, ignore_ptr=ignore_ptr)
# raise ValueError(value)
elif ignore_ptr and isinstance(value, ModelPtr):
yield f"Model#{value.type.index}: ..."
elif isinstance(value, ModelMeta):
yield str(value) + ":"
for key, sub_value in value.type.items():
yield from _pprint_gen(
sub_value, key, lvl=lvl + 1, ignore_ptr=ignore_ptr
)
if not value.type:
yield " <empty>"
elif isinstance(value, SingleType):
yield f"{type(value).__name__}:"
yield from _pprint_gen(
value.type, lvl=lvl, empty_line=False, ignore_ptr=ignore_ptr
)
elif isinstance(value, ComplexType):
yield f"{type(value).__name__}:"
for t in value.types:
yield from _pprint_gen(t, lvl=lvl + 1, ignore_ptr=ignore_ptr)
elif isclass(value) and issubclass(value, StringSerializable):
yield f"(type=<class '{value.__name__}'>)"
else:
yield f"(type={getattr(value, 'type', value)})"
def pretty_format_meta(value, ignore_ptr=False):
"""
Formatter function to prettify metadata on printout/STDOUT
Args:
value:
ignore_ptr:
Returns:
str
"""
return "".join(_pprint_gen(value, ignore_ptr=ignore_ptr))
if __name__ == "__main__":
gen = MetadataGenerator()
reg = ModelRegistry()
fields = gen.generate(*test_data)
model = reg.process_meta_data(fields)
print(pretty_format_meta(model))
print("\n" + "-" * 10, end="")
reg.merge_models(generator=gen)
for model in reg.models:
print(pretty_format_meta(model, ignore_ptr=True))