This little helper utility fixes the names of json results to be the same as the name of the folder they are stored in.
Signed-off-by: Dylan Baker <[email protected]> --- framework/backends/json.py | 7 ++-- framework/summary.py | 1 + utils/__init__.py | 0 utils/fix_name.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 utils/__init__.py create mode 100755 utils/fix_name.py diff --git a/framework/backends/json.py b/framework/backends/json.py index 48a34a8..dae93c8 100644 --- a/framework/backends/json.py +++ b/framework/backends/json.py @@ -38,6 +38,7 @@ from .register import Registry __all__ = [ 'REGISTRY', 'JSONBackend', + 'write', ] # The current version of the JSON results @@ -150,7 +151,7 @@ class JSONBackend(FileBackend): shutil.rmtree(os.path.join(self._dest, 'tests')) @staticmethod - def _write(f, name, data): + def write(f, name, data): json.dump({name: data}, f, default=piglit_encoder) @@ -300,7 +301,7 @@ def _update_results(results, filepath): # Move the old results, and write the current results try: os.rename(filepath, filepath + '.old') - _write(results, filepath) + write(results, filepath) except OSError: print("WARNING: Could not write updated results {}".format(filepath), file=sys.stderr) @@ -308,7 +309,7 @@ def _update_results(results, filepath): return results -def _write(results, file_): +def write(results, file_): """WRite the values of the results out to a file.""" with open(file_, 'w') as f: json.dump({k:v for k, v in results.__dict__.iteritems()}, diff --git a/framework/summary.py b/framework/summary.py index ecd59f1..f4ee590 100644 --- a/framework/summary.py +++ b/framework/summary.py @@ -484,6 +484,7 @@ class Summary: 'Two or more of your results have the same "name" ' 'attribute. Try changing one or more of the "name" ' 'values in your json files.\n' + 'utils/fix_names.py can help with this problem.\n' 'Duplicate value: {}'.format(name)) else: raise e diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/fix_name.py b/utils/fix_name.py new file mode 100755 index 0000000..c90fb25 --- /dev/null +++ b/utils/fix_name.py @@ -0,0 +1,96 @@ +#!/usr/bin/python2 + +# Copyright (c) 2015 Intel Corporation + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Fix the name value in one or more json results to match the folder name. + +This utility can be used on results to fix the name in the json dictionary to +match the name of the folder. Can be run with multiple names. It can resolve +both Unix ~ and shell variables + +example: +fix_name.py ~/piglit-results/* + +""" + +from __future__ import print_function, division, absolute_import +import argparse +import os +import sys + +sys.path.insert(0, os.path.abspath(os.path.dirname('__file__'))) + +from framework.backends import load +from framework.backends.json import write + + +def enumerate_directories(directories): + """Generator that walks directories and returns the name of each directory + that contains a .json file. + + """ + def resolve_vars(name): + return os.path.expanduser(os.path.expandvars(name)) + + for directory in directories: + for dirpath, _, filenames in os.walk(resolve_vars(directory)): + for filename in filenames: + if os.path.splitext(filename)[1] == '.json': + yield (os.path.basename(dirpath), + os.path.join(dirpath, filename)) + + +def needs_update(dirname, results): + """Compares the value of 'name', and the name of the directory. + + If the two names are the same returns False, otherwise returns True + + """ + return results.name != dirname + + +def parse(): + """Parse command line arguments.""" + parser = argparse.ArgumentParser() + parser.add_argument('directories', + nargs='+', + help='directories containing results to search for') + return parser.parse_args() + + +def update(results, dirname, filepath): + """Update the results, write them, and print the output.""" + results.name = dirname + write(results, filepath) + print('Updating name of {} to {}'.format(filepath, dirname)) + + +def main(): + """main function.""" + args = parse() + for dirname, filepath in enumerate_directories(args.directories): + results = load(filepath) + if needs_update(dirname, results): + update(results, dirname, filepath) + + +if __name__ == '__main__': + main() -- 2.4.2 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
