summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-09-30 16:21:14 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-09-30 16:25:00 +0200
commit23b95deb3b712c9883e5ae12748fb0637b2403bb (patch)
tree0459d3eaa6d0e79428b7bf4b33457d87ba3d786b
parentmodules: Update rtems (diff)
downloadrtems-central-23b95deb3b712c9883e5ae12748fb0637b2403bb.tar.bz2
items: Add ItemMapper.get_value_dictionary()
-rw-r--r--rtemsspec/items.py34
-rw-r--r--rtemsspec/tests/spec-item-cache/d/c.yml1
-rw-r--r--rtemsspec/tests/test_items_itemcache.py6
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"