Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/planemo/test/results.py @ 2:6af9afd405e9 draft
"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author | shellac |
---|---|
date | Thu, 14 May 2020 14:56:58 -0400 |
parents | 26e78fe6e8c4 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.7/site-packages/planemo/test/results.py Thu May 14 14:56:58 2020 -0400 @@ -0,0 +1,123 @@ +"""Describes results. + +Is a JSON. +""" +import json +import os + +from planemo.io import error + + +class StructuredData(object): + """Abstraction around a simple data structure describing test results.""" + + def __init__(self, json_path=None, data=None): + """Create a :class:`StructuredData` from a JSON file.""" + def data_error(): + error("An invalid JSON for structured test result data - " + "summary information and planemo reports will be " + "incorrect.") + + self.json_path = json_path + structured_data = {} + structured_data_tests = {} + if json_path and os.path.exists(json_path) and data is None: + try: + with open(json_path, "r") as output_json_f: + data = json.load(output_json_f) + except Exception: + data_error() + try: + structured_data = data + structured_data_tests = structured_data["tests"] + except Exception: + data_error() + + self.structured_data = structured_data + self.structured_data_tests = structured_data_tests + structured_data_by_id = {} + for test in self.structured_data_tests: + structured_data_by_id[test["id"]] = test["data"] + self.structured_data_by_id = structured_data_by_id + self.has_details = "summary" in structured_data + if self.has_details: + self.read_summary() + + def update(self): + """Write out an updated version of this data structure to supplied json path.""" + with open(self.json_path, "w") as out_f: + json.dump(self.structured_data, out_f) + + def set_exit_code(self, exit_code): + """Set the exit_code for the this test.""" + self.structured_data["exit_code"] = exit_code + + def calculate_summary_data_if_needed(self): + if "summary" not in self.structured_data: + self.calculate_summary_data() + + def calculate_summary_data(self): + """Use full details on individual test data to update structured data with summary info.""" + num_tests = 0 + num_failures = 0 + num_skips = 0 + num_errors = 0 + + for test in self.structured_data_tests: + test_data = get_dict_value("data", test) + status = get_dict_value("status", test_data) + num_tests += 1 + if status == "skip": + num_skips += 1 + elif status == "failure": + num_failures += 1 + elif status == "error": + num_errors += 1 + elif status != "success": + raise Exception("Unknown test status encountered [%s]" % status) + + summary = {} + summary["num_tests"] = num_tests + summary["num_failures"] = num_failures + summary["num_skips"] = num_skips + summary["num_errors"] = num_errors + self.structured_data["summary"] = summary + self.read_summary() + + def read_summary(self): + """Read summary data into properties on this class.""" + summary = self.structured_data["summary"] + num_tests = summary["num_tests"] + num_failures = summary["num_failures"] + num_skips = summary["num_skips"] + num_errors = summary["num_errors"] + + self.num_tests = num_tests + self.num_problems = num_skips + num_errors + num_failures + + self.exit_code = self.structured_data.get("exit_code", None) + + @property + def failed_ids(self): + """Find set of IDs for failed tests.""" + ids = set([]) + for test_data in self.structured_data_tests: + if test_data["data"]["status"] == "success": + continue + test_case = test_data["id"].replace(".test_toolbox.", ".test_toolbox:") + ids.add(test_case) + return ids + + +def get_dict_value(key, data): + """Return data[key] with improved KeyError.""" + try: + return data[key] + except (KeyError, TypeError): + raise KeyError("No key [%s] in [%s]" % (key, data)) + + +__all__ = ( + "StructuredData", + "get_dict_value", +)