Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/planemo/galaxy/test/structures.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/planemo/galaxy/test/structures.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,216 +0,0 @@ -"""Utilities for reasoning about Galaxy test results.""" -from __future__ import absolute_import -from __future__ import print_function - -import os -from collections import namedtuple -from xml.etree import ElementTree as ET - -from six.moves import shlex_quote - -from planemo.io import error -from planemo.test.results import StructuredData as BaseStructuredData - - -NO_STRUCTURED_FILE = ( - "Warning: Problem with target Galaxy, it did not " - "produce a structured test results file [%s] - summary " - "information and planemo reports will be incorrect." -) - - -class GalaxyTestCommand(object): - """Abstraction around building a ``run_tests.sh`` command for Galaxy tests.""" - - def __init__( - self, - html_report_file, - xunit_report_file, - structured_report_file, - failed=False, - installed=False, - ): - self.html_report_file = html_report_file - self.xunit_report_file = xunit_report_file - self.structured_report_file = structured_report_file - self.failed = failed - self.installed = installed - - def build(self): - xunit_report_file = self.xunit_report_file - sd_report_file = self.structured_report_file - cmd = "sh run_tests.sh $COMMON_STARTUP_ARGS --report_file %s" % shlex_quote(self.html_report_file) - if xunit_report_file: - cmd += " --xunit_report_file %s" % shlex_quote(xunit_report_file) - if sd_report_file: - cmd += " --structured_data_report_file %s" % shlex_quote(sd_report_file) - if self.installed: - cmd += ' -installed' - elif self.failed: - sd = StructuredData(sd_report_file) - tests = " ".join(sd.failed_ids) - cmd += " %s" % tests - else: - cmd += ' functional.test_toolbox' - return cmd - - -class StructuredData(BaseStructuredData): - """Abstraction around Galaxy's structured test data output.""" - - def __init__(self, json_path): - if not json_path or not os.path.exists(json_path): - error(NO_STRUCTURED_FILE % json_path) - super(StructuredData, self).__init__(json_path) - - def merge_xunit(self, xunit_root): - self.has_details = True - xunit_attrib = xunit_root.attrib - num_tests = int(xunit_attrib.get("tests", 0)) - num_failures = int(xunit_attrib.get("failures", 0)) - num_errors = int(xunit_attrib.get("errors", 0)) - num_skips = int(xunit_attrib.get("skips", 0)) - summary = dict( - num_tests=num_tests, - num_failures=num_failures, - num_errors=num_errors, - num_skips=num_skips, - ) - - self.structured_data["summary"] = summary - - for testcase_el in xunit_t_elements_from_root(xunit_root): - test = case_id(testcase_el) - test_data = self.structured_data_by_id.get(test.id) - if not test_data: - continue - problem_el = None - for problem_type in ["skip", "failure", "error"]: - problem_el = testcase_el.find(problem_type) - if problem_el is not None: - break - if problem_el is not None: - status = problem_el.tag - test_data["problem_type"] = problem_el.attrib["type"] - test_data["problem_log"] = problem_el.text - else: - status = "success" - test_data["status"] = status - - -class GalaxyTestResults(object): - """ Class that combine the test-centric xunit output - with the Galaxy centric structured data output - and - abstracts away the difference (someday). - """ - - def __init__( - self, - output_json_path, - output_xml_path, - output_html_path, - exit_code, - ): - self.output_html_path = output_html_path - sd = StructuredData(output_json_path) - self.sd = sd - self.structured_data = sd.structured_data - self.structured_data_tests = sd.structured_data_tests - self.structured_data_by_id = sd.structured_data_by_id - - self.xunit_tree = parse_xunit_report(output_xml_path) - sd.merge_xunit(self._xunit_root) - - self.sd.set_exit_code(exit_code) - self.sd.read_summary() - self.sd.update() - - @property - def exit_code(self): - return self.sd.exit_code - - @property - def has_details(self): - return self.sd.has_details - - @property - def num_tests(self): - return self.sd.num_tests - - @property - def num_problems(self): - return self.sd.num_problems - - @property - def _xunit_root(self): - return self.xunit_tree.getroot() - - @property - def all_tests_passed(self): - return self.sd.num_problems == 0 - - @property - def xunit_testcase_elements(self): - return xunit_t_elements_from_root(self._xunit_root) - - -def xunit_t_elements_from_root(xunit_root): - for testcase_el in find_cases(xunit_root): - yield testcase_el - - -def parse_xunit_report(xunit_report_path): - return ET.parse(xunit_report_path) - - -def find_cases(xunit_root): - return xunit_root.findall("testcase") - - -def case_id(testcase_el=None, raw_id=None): - if raw_id is None: - assert testcase_el is not None - name_raw = testcase_el.attrib["name"] - if "TestForTool_" in name_raw: - raw_id = name_raw - else: - class_name = testcase_el.attrib["classname"] - raw_id = "{0}.{1}".format(class_name, name_raw) - - name = None - num = None - if "TestForTool_" in raw_id: - tool_and_num = raw_id.split("TestForTool_")[-1] - if ".test_tool_" in tool_and_num: - name, num_str = tool_and_num.split(".test_tool_", 1) - num = _parse_num(num_str) - # Tempted to but something human friendly in here like - # num + 1 - but then it doesn't match HTML report. - else: - name = tool_and_num - else: - name = raw_id - - return TestId(name, num, raw_id) - - -def _parse_num(num_str): - try: - num = int(num_str) - except ValueError: - num = None - return num - - -TestId = namedtuple("TestId", ["name", "num", "id"]) - - -@property -def _label(self): - if self.num is not None: - return "{0}[{1}]".format(self.name, self.num) - else: - return self.id - - -TestId.label = _label
