[Libosinfo] [PATCH osinfo-db 09/10] tests: osinfo: Caching all XML property lookups

Cole Robinson crobinso at redhat.com
Tue Mar 19 20:01:59 UTC 2019


On its own this doesn't save much time, but offers significan time
savings when combined with the next patch

Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 tests/osinfo.py | 47 +++++++++++++++++++++++++++++++++--------------
 1 file changed, 33 insertions(+), 14 deletions(-)

diff --git a/tests/osinfo.py b/tests/osinfo.py
index 0e0eb3d..295bac3 100644
--- a/tests/osinfo.py
+++ b/tests/osinfo.py
@@ -7,83 +7,101 @@ import logging
 import requests
 
 
+def _cache_property(fn):
+    """
+    Decorator to use self._cache to cache property lookup results
+    """
+    def _wrapper(*args):
+        self = args[0]
+        key = str(fn)
+        cache = self._cache  # pylint: disable=protected-access
+        if key not in cache:
+            cache[key] = fn(*args)
+        return cache[key]
+    return property(_wrapper)
+
+
 class Os():
     def __init__(self, root):
         self._root = root
+        self._cache = {}
 
     def _get_images(self):
         images = []
         for image in self._root.findall('image'):
             images.append(Image(image))
         return images
-    images = property(_get_images)
+    images = _cache_property(_get_images)
 
     def _get_medias(self):
         medias = []
         for media in self._root.findall('media'):
             medias.append(Media(media))
         return medias
-    medias = property(_get_medias)
+    medias = _cache_property(_get_medias)
 
     def _get_trees(self):
         trees = []
         for tree in self._root.findall('tree'):
             trees.append(Tree(tree))
         return trees
-    trees = property(_get_trees)
+    trees = _cache_property(_get_trees)
 
     def _get_shortid(self):
         shortid = self._root.find('short-id')
         return shortid.text
-    shortid = property(_get_shortid)
+    shortid = _cache_property(_get_shortid)
 
     def _get_distro(self):
         distro = self._root.find('distro')
         return distro.text
-    distro = property(_get_distro)
+    distro = _cache_property(_get_distro)
 
 
 class Image():
     def __init__(self, root):
         self._root = root
+        self._cache = {}
 
     def _get_url(self):
         url = self._root.find('url')
         if url is not None:
             return URL(url.text)
         return None
-    url = property(_get_url)
+    url = _cache_property(_get_url)
 
 
 class Media():
     def __init__(self, root):
         self._root = root
+        self._cache = {}
 
     def _get_url(self):
         url = self._root.find('url')
         if url is not None:
             return URL(url.text)
         return None
-    url = property(_get_url)
+    url = _cache_property(_get_url)
 
     def _get_iso(self):
         iso = self._root.find('iso')
         if iso is not None:
             return ISO(iso)
         return None
-    iso = property(_get_iso)
+    iso = _cache_property(_get_iso)
 
 
 class Tree():
     def __init__(self, root):
         self._root = root
+        self._cache = {}
 
     def _get_url(self):
         url = self._root.find('url')
         if url is not None:
             return URL(url.text)
         return None
-    url = property(_get_url)
+    url = _cache_property(_get_url)
 
 
 class URL():
@@ -101,6 +119,7 @@ class URL():
 class ISO():
     def __init__(self, root):
         self._root = root
+        self._cache = {}
 
     def _get_value(self, name, return_type=str, default=''):
         entry = self._root.find(name)
@@ -108,20 +127,20 @@ class ISO():
 
     def _get_volumeid(self):
         return self._get_value('volume-id')
-    volumeid = property(_get_volumeid)
+    volumeid = _cache_property(_get_volumeid)
 
     def _get_publisherid(self):
         return self._get_value('publisher-id')
-    publisherid = property(_get_publisherid)
+    publisherid = _cache_property(_get_publisherid)
 
     def _get_applicationid(self):
         return self._get_value('application-id')
-    applicationid = property(_get_applicationid)
+    applicationid = _cache_property(_get_applicationid)
 
     def _get_systemid(self):
         return self._get_value('system-id')
-    systemid = property(_get_systemid)
+    systemid = _cache_property(_get_systemid)
 
     def _get_volumesize(self):
         return self._get_value('volume-size', int, 0)
-    volumesize = property(_get_volumesize)
+    volumesize = _cache_property(_get_volumesize)
-- 
2.21.0




More information about the Libosinfo mailing list