Source code for planemo.reports.build_report

import base64

from galaxy.util import strip_control_characters
from jinja2 import (
    Environment,
    PackageLoader,
)
from pkg_resources import resource_string

TITLE = "Results (powered by Planemo)"


[docs]def build_report(structured_data, report_type="html", execution_type="Test", **kwds): """Use report_{report_type}.tpl to build page for report.""" environment = dict( title=TITLE, raw_data=structured_data, ) __fix_test_ids(environment) environment = __inject_summary(environment) if report_type == "html": # The HTML report format needs a lot of extra, custom data. # IMO, this seems to suggest it should be embedded. environment["title"] = None environment["execution_type"] = execution_type markdown = template_data(environment, "report_markdown.tpl") environment["title"] = " ".join((environment["execution_type"], TITLE)) environment["raw_data"] = base64.b64encode(markdown.encode("utf-8")).decode("utf-8") environment.update( { "custom_style": __style("custom.css"), "custom_script": __script("custom"), "bootstrap_style": __style("bootstrap.min.css"), "jquery_script": __script("jquery.min"), "bootstrap_script": __script("bootstrap.min"), "markdown_it_script": __script("markdown-it.min"), } ) return template_data(environment, "report_%s.tpl" % report_type)
[docs]def template_data(environment, template_name, **kwds): """Build an arbitrary templated page.""" env_kwargs = {} if template_name == "report_markdown.tpl": env_kwargs["keep_trailing_newline"] = True env_kwargs["trim_blocks"] = True env = Environment(loader=PackageLoader("planemo", "reports"), **env_kwargs) env.filters["strip_control_characters"] = lambda x: strip_control_characters(x) if x else x template = env.get_template(template_name) return template.render(**environment)
def __fix_test_ids(environment): for test in environment["raw_data"]["tests"]: test_data = test.get("data") if test_data and test_data.get("tool_id"): test["id"] = f"{test_data['tool_id']} (Test #{test_data['test_index'] + 1})" def __inject_summary(environment): total = 0 errors = 0 failures = 0 skips = 0 for execution in environment["raw_data"]["tests"]: total += 1 test_data = execution.get("data") if test_data: status = test_data.get("status") if status == "error": errors += 1 elif status == "failure": failures += 1 elif status == "skipped": skips += 1 environment["raw_data"]["results"] = { "total": total, "errors": errors, "failures": failures, "skips": skips, } if "suitename" not in environment: environment["raw_data"]["suitename"] = TITLE return environment def __style(filename): resource = __load_resource(filename) return "<style>%s</style>" % resource def __script(short_name): resource = __load_resource("%s.js" % short_name) return "<script>%s</script>" % resource def __load_resource(name): return resource_string(__name__, name).decode("UTF-8")