Selaa lähdekoodia

add jinja2-based renderer for object diagrams

Joeri Exelmans 1 vuosi sitten
vanhempi
commit
200f2a3ede

+ 18 - 0
concrete_syntax/textual_od/objectdiagrams.jinja2

@@ -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 %}

+ 58 - 0
concrete_syntax/textual_od/renderer_jinja2.py

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

+ 7 - 2
examples/petrinet/runner.py

@@ -1,12 +1,13 @@
 from state.devstate import DevState
 from api.od import ODAPI
 from concrete_syntax.textual_od.renderer import render_od
+# from concrete_syntax.textual_od.renderer_jinja2 import render_od_jinja2
 from bootstrap.scd import bootstrap_scd
 from util import loader
 from transformation.rule import RuleMatcherRewriter, ActionGenerator
 from transformation.ramify import ramify
 from examples.semantics.operational import simulator
-from examples.petrinet.renderer import render_petri_net
+from examples.petrinet.renderer import show_petri_net
 
 
 if __name__ == "__main__":
@@ -48,11 +49,15 @@ if __name__ == "__main__":
     matcher_rewriter = RuleMatcherRewriter(state, mm_rt, mm_rt_ramified)
     action_generator = ActionGenerator(matcher_rewriter, rules)
 
+    def render_callback(od):
+        show_petri_net(od)
+        return render_od(state, od.m, od.mm)
+
     sim = simulator.Simulator(
         action_generator=action_generator,
         decision_maker=simulator.InteractiveDecisionMaker(auto_proceed=False),
         # decision_maker=simulator.RandomDecisionMaker(seed=0),
-        renderer=lambda od: render_petri_net(od) + render_od(state, od.m, od.mm),
+        renderer=render_callback,
         # renderer=lambda od: render_od(state, od.m, od.mm),
     )
 

+ 2 - 1
requirements.txt

@@ -1 +1,2 @@
-lark==1.1.9
+lark==1.1.9
+jinja2==3.1.4