-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconvert.py
76 lines (57 loc) · 2.36 KB
/
convert.py
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
import importlib
import inspect
import os
import pkgutil
from importlib.metadata import version
from typing import Dict
from jinja2 import Template
DIAGRAMS_MODULE = "diagrams"
DIAGRAMS_VERSION = version(DIAGRAMS_MODULE)
ICON_BASE_PATH = f"https://raw.githubusercontent.com/mingrammer/diagrams/v{DIAGRAMS_VERSION}"
def iter_submodules(parent_module):
return (
name for _, name, _
in pkgutil.iter_modules(parent_module.__path__, parent_module.__name__ + ".")
)
def get_namespaced_icons() -> Dict[str, Dict[str, Dict[str, str]]]:
root_results = {}
diagrams = importlib.import_module(DIAGRAMS_MODULE)
# categories
for module_name in iter_submodules(diagrams):
module_results = {}
module = importlib.import_module(module_name)
# subcategories
for submodule_name in iter_submodules(module):
submodule_results = {}
submodule = importlib.import_module(submodule_name)
# find only component classes (classes with an icon defined)
icon_classes = [
attribute
for attribute_name, attribute in inspect.getmembers(submodule)
if getattr(attribute, "_icon", None)
]
for cls in icon_classes:
icon_full_path = os.path.join(ICON_BASE_PATH, cls._icon_dir, cls._icon)
submodule_results[cls.__name__] = icon_full_path
submodule_basename = str(submodule_name).split(".")[-1]
module_results[submodule_basename] = submodule_results
module_basename = module_name.split(".")[-1]
root_results[module_basename] = module_results
return root_results
if __name__ == '__main__':
icons = get_namespaced_icons()
template_str = inspect.cleandoc("""
# Autogenerated using https://github.com/denis-ismailaj/d2-diagrams-icons (based on diagrams v{{version}})\
{% for module, submodules in icons.items() %}
{{ module }}: { {% for submodule, classes in submodules.items() %}
{{ submodule }}: { {% for class_name, icon_path in classes.items() %}
{{ class_name }}: {
icon: {{ icon_path }}
shape: image
}{% endfor %}
}{% endfor %}
}{% endfor %}
""")
template = Template(template_str)
result = template.render(icons=icons, version=DIAGRAMS_VERSION)
print(result)