diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-09-30 16:21:14 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-09-30 16:25:00 +0200 |
commit | 23b95deb3b712c9883e5ae12748fb0637b2403bb (patch) | |
tree | 0459d3eaa6d0e79428b7bf4b33457d87ba3d786b | |
parent | modules: Update rtems (diff) | |
download | rtems-central-23b95deb3b712c9883e5ae12748fb0637b2403bb.tar.bz2 |
items: Add ItemMapper.get_value_dictionary()
-rw-r--r-- | rtemsspec/items.py | 34 | ||||
-rw-r--r-- | rtemsspec/tests/spec-item-cache/d/c.yml | 1 | ||||
-rw-r--r-- | rtemsspec/tests/test_items_itemcache.py | 6 |
3 files changed, 35 insertions, 6 deletions
diff --git a/rtemsspec/items.py b/rtemsspec/items.py index ee5a9fb8..eb261766 100644 --- a/rtemsspec/items.py +++ b/rtemsspec/items.py @@ -438,6 +438,15 @@ class _ItemMapperContext(dict): return value +class _GetValueDictionary(dict): + def __init__(self, get_value: ItemGetValue): + super().__init__() + self._get_value = get_value + + def get(self, _key, _default): + return (self._get_value, {}) + + class ItemMapper: """ Maps identifiers to items and attribute values. """ def __init__(self, item: Item, recursive: bool = False): @@ -456,17 +465,30 @@ class ItemMapper: """ Sets the item of the mapper. """ self._item = item - def add_get_value(self, type_path_key: str, - get_value: ItemGetValue) -> None: - """ - Adds a get value for the specified type and key path. - """ + def _add_get_value_map( + self, type_path_key: str, new_get_value_map: Tuple[ItemGetValue, + Dict]) -> None: type_name, path_key = type_path_key.split(":") keys = path_key.strip("/").split("/") get_value_map = self._get_value_map.setdefault(type_name, {}) for key in keys[:-1]: _, get_value_map = get_value_map.setdefault(key, (_get_value, {})) - get_value_map[keys[-1]] = (get_value, {}) + get_value_map[keys[-1]] = new_get_value_map + + def add_get_value(self, type_path_key: str, + get_value: ItemGetValue) -> None: + """ + Adds a get value for the specified type and key path. + """ + self._add_get_value_map(type_path_key, (get_value, {})) + + def add_get_value_dictionary(self, type_path_key: str, + get_value: ItemGetValue) -> None: + """ + Adds a get value dictionary for the specified type and key path. + """ + self._add_get_value_map(type_path_key, + (_get_value, _GetValueDictionary(get_value))) def push_prefix(self, prefix: str) -> None: """ Pushes a key path prefix. """ diff --git a/rtemsspec/tests/spec-item-cache/d/c.yml b/rtemsspec/tests/spec-item-cache/d/c.yml index 4b9febc6..51667d09 100644 --- a/rtemsspec/tests/spec-item-cache/d/c.yml +++ b/rtemsspec/tests/spec-item-cache/d/c.yml @@ -7,6 +7,7 @@ a: - g: - 4 - 5 +dict: {} links: - role: null uid: ../p diff --git a/rtemsspec/tests/test_items_itemcache.py b/rtemsspec/tests/test_items_itemcache.py index 81e2db70..4dc48c05 100644 --- a/rtemsspec/tests/test_items_itemcache.py +++ b/rtemsspec/tests/test_items_itemcache.py @@ -109,6 +109,10 @@ def get_x_to_b_value(ctx): return ctx.value["b"] +def get_value_dict(ctx): + return ctx.key + + class Mapper(ItemMapper): def __init__(self, item): super().__init__(item) @@ -157,6 +161,8 @@ def test_item_mapper(tmpdir): assert item_3 == item assert key_path_3 == "/v" assert value_3 == "p" + mapper.add_get_value_dictionary(":/dict", get_value_dict) + assert mapper["d/c:/dict/some-arbitrary-key"] == "some-arbitrary-key" recursive_mapper = ItemMapper(item, recursive=True) assert recursive_mapper.substitute("${.:/r1/r2/r3}") == "foobar" assert recursive_mapper[".:/r1/r2/r3"] == "foobar" |