diff env/lib/python3.9/site-packages/planemo/reports/build_report.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.9/site-packages/planemo/reports/build_report.py	Mon Mar 22 18:12:50 2021 +0000
@@ -0,0 +1,99 @@
+import base64
+
+from galaxy.util import strip_control_characters
+from jinja2 import Environment, PackageLoader
+from pkg_resources import resource_string
+
+TITLE = "Test Results (powered by Planemo)"
+
+
+def build_report(structured_data, report_type="html", **kwds):
+    """ Use report_{report_type}.tpl to build page for report.
+    """
+    environment = dict(
+        title=TITLE,
+        raw_data=structured_data,
+    )
+    environment = __inject_summary(environment)
+    __fix_test_ids(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
+        markdown = template_data(environment, 'report_markdown.tpl')
+        environment['title'] = 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)
+
+
+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'] = "%s (Test #%s)" % (test_data['tool_id'], test_data['test_index'] + 1)
+
+
+def __inject_summary(environment):
+    total = 0
+    errors = 0
+    failures = 0
+    skips = 0
+    for test in environment['raw_data']['tests']:
+        total += 1
+        test_data = test.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')