add jinja2-based renderer for object diagrams

This commit is contained in:
Joeri Exelmans 2024-12-17 15:32:24 +01:00
parent 26d8655147
commit 200f2a3ede
4 changed files with 85 additions and 3 deletions

View file

@ -0,0 +1,18 @@
{% macro render_name(name) %}{{ name if not hide_names or name.startswith("__") else "" }}{% endmacro %}
{% macro render_attributes(obj) %} {
{% for attr_name in odapi.get_slots(obj) %}
{{ attr_name}} = {{ display_value(
val=odapi.get_slot_value(obj, attr_name),
type_name=odapi.get_type_name(odapi.get_slot(obj, attr_name)),
indentation=4) }};
{% endfor %}
}{% endmacro %}
{% for obj_name, obj in objects %}
{{ render_name(obj_name) }}:{{ odapi.get_type_name(obj) }}{{ render_attributes(obj) }}
{% endfor %}
{% for lnk_name, lnk in links %}
{{ render_name(obj_name) }}:{{ odapi.get_type_name(lnk) }} ({{odapi.get_name(odapi.get_source(lnk))}} -> {{odapi.get_name(odapi.get_target(lnk))}}){{ render_attributes(lnk) }}
{% endfor %}

View file

@ -0,0 +1,58 @@
import jinja2
import os
from uuid import UUID
THIS_DIR = os.path.dirname(__file__)
from api.od import ODAPI
from concrete_syntax import common
from services.bottom.V0 import Bottom
from util.module_to_dict import module_to_dict
def render_od_jinja2(state, m, mm):
bottom = Bottom(state)
type_model_id = state.read_dict(state.read_root(), "SCD")
scd_model = UUID(state.read_value(type_model_id))
type_odapi = ODAPI(state, mm, scd_model)
objects = []
links = []
to_add = bottom.read_keys(m)
already_added = set()
while len(to_add) > 0:
next_round = []
for obj_name in to_add:
obj = state.read_dict(m, obj_name)
src, tgt = state.read_edge(obj)
if src == None:
# not a link
objects.append((obj_name, obj))
already_added.add(obj)
else:
# A link can only be written out after its source and target have been written out
if src in already_added and tgt in already_added:
links.append((obj_name, obj))
else:
# try again later
next_round.append(obj_name)
if len(next_round) == len(to_add):
raise Exception("We got stuck!", next_round)
to_add = next_round
loader = jinja2.FileSystemLoader(searchpath=THIS_DIR)
environment = jinja2.Environment(
loader=loader,
# whitespace control:
trim_blocks=True,
lstrip_blocks=True,
)
template = environment.get_template("objectdiagrams.jinja2")
return template.render({
'objects': objects,
'links': links,
'odapi': ODAPI(state, m, mm),
**globals()['__builtins__'],
**module_to_dict(common),
})