[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