[rtems-central commit] items: Derive ItemCache from dict

Sebastian Huber sebh at rtems.org
Mon Jun 26 19:05:41 UTC 2023


Module:    rtems-central
Branch:    master
Commit:    926dda5c9e12cf48947fba95bdd85ebff0099804
Changeset: http://git.rtems.org/rtems-central/commit/?id=926dda5c9e12cf48947fba95bdd85ebff0099804

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue May 30 11:40:33 2023 +0200

items: Derive ItemCache from dict

---

 rtemsspec/build.py                      |  4 ++--
 rtemsspec/items.py                      | 26 +++++++++-----------------
 rtemsspec/specverify.py                 |  2 +-
 rtemsspec/tests/test_items_item.py      |  4 ++--
 rtemsspec/tests/test_items_itemcache.py |  9 ++++-----
 rtemsspec/tests/test_validation.py      |  2 +-
 rtemsspec/validation.py                 |  2 +-
 specview.py                             |  4 ++--
 8 files changed, 22 insertions(+), 31 deletions(-)

diff --git a/rtemsspec/build.py b/rtemsspec/build.py
index 8570cbd9..595ff5fe 100644
--- a/rtemsspec/build.py
+++ b/rtemsspec/build.py
@@ -84,7 +84,7 @@ def _gather_source_files(item: Item, enabled: List[str],
 
 def _gather_test_header(item_cache: ItemCache, enabled: List[str],
                         source_files: List[str]) -> None:
-    for item in item_cache.all.values():
+    for item in item_cache.values():
         tests = ["test-case", "requirement/functional/action"]
         if item.type in tests and item["test-header"] and item.is_enabled(
                 enabled):
@@ -96,7 +96,7 @@ def gather_files(config: dict,
                  test_header: bool = True) -> List[str]:
     """ Generates a list of files form the build specification. """
     bsps: BSPMap = {}
-    for item in item_cache.all.values():
+    for item in item_cache.values():
         if item["type"] == "build" and item["build-type"] == "bsp":
             arch_bsps = bsps.setdefault(item["arch"].strip(), {})
             arch_bsps[item["bsp"].strip()] = item
diff --git a/rtemsspec/items.py b/rtemsspec/items.py
index da68d4f3..a3890f6f 100644
--- a/rtemsspec/items.py
+++ b/rtemsspec/items.py
@@ -755,7 +755,7 @@ def _resolve_proxy(proxy: Item, is_link_enabled: Callable[[Link],
         proxy._links_to_parents = member._links_to_parents
 
 
-class ItemCache:
+class ItemCache(dict):
     """ This class provides a cache of specification items. """
 
     # pylint: disable=too-many-instance-attributes
@@ -764,17 +764,17 @@ class ItemCache:
                  post_process_load: Optional[Callable[[ItemMap], None]] = None,
                  is_item_enabled: Callable[[List[str], Item],
                                            bool] = _is_item_enabled):
+        super().__init__()
         self._cache_index: int = 0
         self._cache_directory: str = os.path.abspath(
             config.get("cache-directory", "cache"))
-        self._items: ItemMap = {}
         self._types: Set[str] = set()
         self.items_by_type: Dict[str, List[Item]] = {}
         self._updates = 0
         for path in config["paths"]:
             self.load_items(path)
         if post_process_load:
-            post_process_load(self._items)
+            post_process_load(self)
         if config.get("initialize-links", True):
             self._init_parents()
             self._init_children()
@@ -785,15 +785,12 @@ class ItemCache:
             self._root_type = None
         self._enabled = config.get("enabled", [])
         self._is_enabled = is_item_enabled
-        for item in self._items.values():
+        for item in self.values():
             self._set_type(item)
             item["_enabled"] = is_item_enabled(self._enabled, item)
         if config.get("resolve-proxies", False):
             self.resolve_proxies()
 
-    def __getitem__(self, uid: str) -> Item:
-        return self._items[uid]
-
     @property
     def updates(self) -> bool:
         """
@@ -802,11 +799,6 @@ class ItemCache:
         """
         return self._updates > 0
 
-    @property
-    def all(self) -> ItemMap:
-        """ Returns the map of all specification items. """
-        return self._items
-
     @property
     def types(self) -> Set[str]:
         """ Returns the types of the items. """
@@ -827,7 +819,7 @@ class ItemCache:
         """
         self._enabled = enabled
         self._is_enabled = is_item_enabled
-        for item in self._items.values():
+        for item in self.values():
             item["_enabled"] = is_item_enabled(enabled, item)
 
     def resolve_proxies(
@@ -861,7 +853,7 @@ class ItemCache:
 
     def _add_item(self, uid: str, data: Any) -> Item:
         item = Item(self, uid, data)
-        self._items[uid] = item
+        self[uid] = item
         return item
 
     def _load_items_in_dir(self, base: str, path: str, cache_file: str,
@@ -930,12 +922,12 @@ class ItemCache:
             self._save_data(file, data2)
 
     def _init_parents(self) -> None:
-        for item in self._items.values():
+        for item in self.values():
             item.init_parents(self)
 
     def _init_children(self) -> None:
-        for uid in sorted(self._items):
-            self._items[uid].init_children()
+        for item in sorted(self.values()):
+            item.init_children()
 
     def _set_type(self, item: Item) -> None:
         spec_type = self._root_type
diff --git a/rtemsspec/specverify.py b/rtemsspec/specverify.py
index 010a8d62..b5635a02 100755
--- a/rtemsspec/specverify.py
+++ b/rtemsspec/specverify.py
@@ -528,7 +528,7 @@ class SpecVerifier:
                 logging.error("root type item does not exist in item cache")
             else:
                 logging.info("start specification item verification")
-                for key in sorted(item_cache.all):
+                for key in sorted(item_cache):
                     item = item_cache[key]
                     self._root_verifier.verify(_Path(item, f"{item.uid}:"),
                                                item.data)
diff --git a/rtemsspec/tests/test_items_item.py b/rtemsspec/tests/test_items_item.py
index a834097b..1f107e56 100644
--- a/rtemsspec/tests/test_items_item.py
+++ b/rtemsspec/tests/test_items_item.py
@@ -182,10 +182,10 @@ def test_parents():
     child["_enabled"] = True
     parent = Item(item_cache, "p", {"links": []})
     parent["_enabled"] = True
-    item_cache._items["p"] = parent
+    item_cache["p"] = parent
     parent_2 = Item(EmptyItemCache(), "p2", {})
     parent_2["_enabled"] = False
-    item_cache._items["p2"] = parent_2
+    item_cache["p2"] = parent_2
     child.init_parents(item_cache)
     for link in child.links_to_parents():
         link.item.add_link_to_child(Link.create(link, child))
diff --git a/rtemsspec/tests/test_items_itemcache.py b/rtemsspec/tests/test_items_itemcache.py
index ea0db0d4..2c24d669 100644
--- a/rtemsspec/tests/test_items_itemcache.py
+++ b/rtemsspec/tests/test_items_itemcache.py
@@ -49,7 +49,7 @@ def test_load(tmpdir):
     assert item_cache.enabled == ["foobar"]
     assert len(item_cache.types) == 1
     assert list(item_cache.types)[0] == ""
-    assert item_count == len(item_cache.all)
+    assert item_count == len(item_cache)
     assert item_cache.updates
     cache_dir = config["cache-directory"]
     assert os.path.exists(os.path.join(cache_dir, "0", "spec", "spec.pickle"))
@@ -63,10 +63,9 @@ def test_load(tmpdir):
     assert p["v"] == "p"
     assert p.map("/p") == p
     assert p.map("p") == p
-    a = item_cache.all
-    assert len(a) == 7
-    assert a["/p"]["v"] == "p"
-    assert a["/d/c"]["v"] == "c"
+    assert len(item_cache) == 7
+    assert item_cache["/p"]["v"] == "p"
+    assert item_cache["/d/c"]["v"] == "c"
     item_cache.set_enabled([])
     assert p.enabled
     item_cache_2 = ItemCache(config)
diff --git a/rtemsspec/tests/test_validation.py b/rtemsspec/tests/test_validation.py
index 934fec3f..c4872d49 100644
--- a/rtemsspec/tests/test_validation.py
+++ b/rtemsspec/tests/test_validation.py
@@ -2414,7 +2414,7 @@ void Action2_Run( int *a, int b, int *c )
 def _add_item(item_cache, uid, data, item_type):
     item = Item(item_cache, uid, data)
     item["_type"] = item_type
-    item_cache.all[item.uid] = item
+    item_cache[item.uid] = item
     return item
 
 
diff --git a/rtemsspec/validation.py b/rtemsspec/validation.py
index a500fa13..363ce568 100644
--- a/rtemsspec/validation.py
+++ b/rtemsspec/validation.py
@@ -1176,7 +1176,7 @@ def _gather(
         item_cache: ItemCache) -> Tuple[Dict[str, _SourceFile], _CaseToSuite]:
     source_files: Dict[str, _SourceFile] = {}
     test_programs: List[_TestProgram] = []
-    for item in item_cache.all.values():
+    for item in item_cache.values():
         _GATHER.get(item.type, _gather_default)(item, source_files,
                                                 test_programs)
 
diff --git a/specview.py b/specview.py
index 23367984..9cef096c 100755
--- a/specview.py
+++ b/specview.py
@@ -284,7 +284,7 @@ def _gather_design_components(item: Item, components: List[Item]) -> bool:
 
 
 def _design(item_cache: ItemCache) -> None:
-    for item in item_cache.all.values():
+    for item in item_cache.values():
         if not item.enabled:
             continue
         components: List[Item] = []
@@ -476,7 +476,7 @@ def main() -> None:
             _action_list(item_cache[uid])
     elif args.filter == "orphan":
         _validate(root)
-        for item in item_cache.all.values():
+        for item in item_cache.values():
             if item["type"] in ["build", "spec"]:
                 continue
             if item.enabled and "_validated" not in item:



More information about the vc mailing list