diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-05-28 09:17:41 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-05-28 09:17:41 +0200 |
commit | e336dd37e786e59856c6d22e8c1096eb27658364 (patch) | |
tree | dbdfef8a1614b0210a79656b659d237fce02f289 | |
parent | spec: Fix links and references (diff) | |
download | rtems-central-e336dd37e786e59856c6d22e8c1096eb27658364.tar.bz2 |
specview.py: Substitute text during view
This helps to catch invalid attribute references.
-rwxr-xr-x | specview.py | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/specview.py b/specview.py index cc579904..d834b3e2 100755 --- a/specview.py +++ b/specview.py @@ -28,9 +28,10 @@ import argparse import itertools import sys -from typing import List, Set, Tuple +from typing import Any, List, Set, Tuple -from rtemsspec.items import Item, ItemCache, Link +from rtemsspec.items import EmptyItem, Item, ItemCache, ItemMapper, \ + ItemGetValueContext, Link from rtemsspec.sphinxcontent import SphinxContent from rtemsspec.util import load_config from rtemsspec.validation import Transition, TransitionMap @@ -43,14 +44,62 @@ _CHILD_ROLES = [ _PARENT_ROLES = ["interface-enumerator", "interface-placement"] +def _get_value_dummy(_ctx: ItemGetValueContext) -> Any: + return "" + + +_MAPPER = ItemMapper(EmptyItem()) +_MAPPER.add_get_value("requirement/functional/action:/text-template", + _get_value_dummy) +_MAPPER.add_get_value("glossary/term:/plural", _get_value_dummy) +_MAPPER.add_get_value( + "requirement/non-functional/performance-runtime:/limit-kind", + _get_value_dummy) +_MAPPER.add_get_value( + "requirement/non-functional/performance-runtime:/limit-condition", + _get_value_dummy) +_MAPPER.add_get_value( + "requirement/non-functional/performance-runtime:/environment", + _get_value_dummy) + + +def _visit_action_conditions(item: Item, name: str) -> None: + for index, condition in enumerate(item[name]): + for index_2, state in enumerate(condition["states"]): + _MAPPER.substitute(state["text"], item, + f"{name}[{index}]/states[{index_2}]/text") + + +def _visit_action(item: Item) -> None: + _visit_action_conditions(item, "pre-conditions") + _visit_action_conditions(item, "post-conditions") + + +_VISITORS = { + "requirement/functional/action": _visit_action, +} + + +def _visit_item(item: Item, level: int) -> None: + print(f"{' ' * level}{item.uid}") + if item.type.startswith("requirement"): + _MAPPER.substitute(item["text"], item) + try: + visitor = _VISITORS[item.type] + except KeyError: + pass + else: + visitor(item) + + def _view_interface_placment(item: Item, level: int) -> None: for child in item.children("interface-placement"): - print(f"{' ' * level}{child.uid}") + _visit_item(child, level) _view_interface_placment(child, level + 1) def _view(item: Item, level: int) -> None: - print(f"{' ' * level}{item.uid}") + _visit_item(item, level) _view_interface_placment(item, level + 1) for child in item.children(_CHILD_ROLES): _view(child, level + 1) |