|
|
@@ -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),
|
|
|
+ })
|