These should be reusable across test cases. Cache the lookup results on the first access Signed-off-by: Cole Robinson <crobinso@xxxxxxxxxx> --- tests/util.py | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/tests/util.py b/tests/util.py index 15ec3cc..418b9d2 100644 --- a/tests/util.py +++ b/tests/util.py @@ -15,31 +15,41 @@ class _DataFiles(): def __init__(self): self.datadir = os.environ['INTERNAL_OSINFO_DB_DATA_DIR'] self.schema = os.path.join(self.datadir, 'schema', 'osinfo.rng') + self._all_xml_cache = [] + self._oses_cache = [] if not os.path.exists(self.datadir): raise RuntimeError("INTERNAL_OSINFO_DB_DATA_DIR=%s " "doesn't exist" % self.datadir) - def _get_files(self, directory): - files = [] - root = os.path.join(self.datadir, directory) - for (dirpath, _, filenames) in os.walk(root): - for filename in filenames: - if not filename.endswith('.xml'): - continue - files.append(os.path.join(dirpath, filename)) - return files + def _get_all_xml(self): + """ + Get and cache the full list of all DATA_DIR .xml paths + """ + if not self._all_xml_cache: + for (dirpath, _, filenames) in os.walk(self.datadir): + for filename in filenames: + if not filename.endswith('.xml'): + continue + self._all_xml_cache.append(os.path.join(dirpath, filename)) + return self._all_xml_cache + + def _filter_xml(self, dirname): + """ + Filter XML paths by those in $DATA_DIR/$dirname + """ + return [p for p in self._get_all_xml() if + p.startswith(os.path.join(self.datadir, dirname))] def oses(self): - ret = [] - files = self._get_files('os') - for path in files: - osroot = ET.parse(path).getroot().find('os') - ret.append(osinfo.Os(osroot)) - return ret + if not self._oses_cache: + for path in self._filter_xml('os'): + osroot = ET.parse(path).getroot().find('os') + self._oses_cache.append(osinfo.Os(osroot)) + return self._oses_cache def xmls(self): - return self._get_files('') + return self._get_all_xml() DataFiles = _DataFiles() -- 2.21.0 _______________________________________________ Libosinfo mailing list Libosinfo@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libosinfo