diff options
Diffstat (limited to 'gm/rebaseline_server/results.py')
-rwxr-xr-x | gm/rebaseline_server/results.py | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/gm/rebaseline_server/results.py b/gm/rebaseline_server/results.py index 255dfa31e2..461e7463a6 100755 --- a/gm/rebaseline_server/results.py +++ b/gm/rebaseline_server/results.py @@ -190,20 +190,25 @@ class BaseComparisons(object): return False return True - def _read_dicts_from_root(self, root, pattern='*.json'): + def _read_builder_dicts_from_root(self, root, pattern='*.json'): """Read all JSON dictionaries within a directory tree. + Skips any dictionaries belonging to a builder we have chosen to ignore. + Args: root: path to root of directory tree pattern: which files to read within root (fnmatch-style pattern) Returns: A meta-dictionary containing all the JSON dictionaries found within - the directory tree, keyed by the builder name of each dictionary. + the directory tree, keyed by builder name (the basename of the directory + where each JSON dictionary was found). Raises: IOError if root does not refer to an existing directory """ + # I considered making this call _read_dicts_from_root(), but I decided + # it was better to prune out the ignored builders within the os.walk(). if not os.path.isdir(root): raise IOError('no directory found at path %s' % root) meta_dict = {} @@ -212,8 +217,34 @@ class BaseComparisons(object): builder = os.path.basename(dirpath) if self._ignore_builder(builder): continue - fullpath = os.path.join(dirpath, matching_filename) - meta_dict[builder] = gm_json.LoadFromFile(fullpath) + full_path = os.path.join(dirpath, matching_filename) + meta_dict[builder] = gm_json.LoadFromFile(full_path) + return meta_dict + + def _read_dicts_from_root(self, root, pattern='*.json'): + """Read all JSON dictionaries within a directory tree. + + Args: + root: path to root of directory tree + pattern: which files to read within root (fnmatch-style pattern) + + Returns: + A meta-dictionary containing all the JSON dictionaries found within + the directory tree, keyed by the pathname (relative to root) of each JSON + dictionary. + + Raises: + IOError if root does not refer to an existing directory + """ + if not os.path.isdir(root): + raise IOError('no directory found at path %s' % root) + meta_dict = {} + for abs_dirpath, dirnames, filenames in os.walk(root): + rel_dirpath = os.path.relpath(abs_dirpath, root) + for matching_filename in fnmatch.filter(filenames, pattern): + abs_path = os.path.join(abs_dirpath, matching_filename) + rel_path = os.path.join(rel_dirpath, matching_filename) + meta_dict[rel_path] = gm_json.LoadFromFile(abs_path) return meta_dict @staticmethod @@ -240,18 +271,18 @@ class BaseComparisons(object): Input: { - "failed" : { - "changed.png" : [ "bitmap-64bitMD5", 8891695120562235492 ], + KEY_A1 : { + KEY_B1 : VALUE_B1, }, - "no-comparison" : { - "unchanged.png" : [ "bitmap-64bitMD5", 11092453015575919668 ], + KEY_A2 : { + KEY_B2 : VALUE_B2, } } Output: { - "changed.png" : [ "bitmap-64bitMD5", 8891695120562235492 ], - "unchanged.png" : [ "bitmap-64bitMD5", 11092453015575919668 ], + KEY_B1 : VALUE_B1, + KEY_B2 : VALUE_B2, } If this would result in any repeated keys, it will raise an Exception. @@ -263,3 +294,13 @@ class BaseComparisons(object): raise Exception('duplicate key %s in combine_subdicts' % subdict_key) output_dict[subdict_key] = subdict_value return output_dict + + @staticmethod + def get_multilevel(input_dict, *keys): + """ Returns input_dict[key1][key2][...], or None if any key is not found. + """ + for key in keys: + if input_dict == None: + return None + input_dict = input_dict.get(key, None) + return input_dict |