| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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),
- })
|