[rtems-central commit] items: Add ItemMapper.get_value_dictionary()
Sebastian Huber
sebh at rtems.org
Thu Sep 30 14:22:25 UTC 2021
Module: rtems-central
Branch: master
Commit: 23b95deb3b712c9883e5ae12748fb0637b2403bb
Changeset: http://git.rtems.org/rtems-central/commit/?id=23b95deb3b712c9883e5ae12748fb0637b2403bb
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Thu Sep 30 16:21:14 2021 +0200
items: Add ItemMapper.get_value_dictionary()
---
rtemsspec/items.py | 34 +++++++++++++++++++++++++++------
rtemsspec/tests/spec-item-cache/d/c.yml | 1 +
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 ee5a9fb..eb26176 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 4b9febc..51667d0 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 81e2db7..4dc48c0 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"
More information about the vc
mailing list