comparison venv/lib/python2.7/site-packages/planemo/tool_lint.py @ 0:d67268158946 draft

planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
author bcclaywell
date Mon, 12 Oct 2015 17:43:33 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d67268158946
1 import os
2
3 from planemo.io import info
4 from planemo.io import error
5
6 import planemo.linters.xsd
7
8 from planemo.tools import load_tool_elements_from_path, is_tool_load_error
9 from galaxy.tools.lint import lint_xml
10
11 SKIP_XML_MESSAGE = "Skipping XML file - does not appear to be a tool %s."
12 LINTING_TOOL_MESSAGE = "Linting tool %s"
13 SHED_FILES = ["tool_dependencies.xml", "repository_dependencies.xml"]
14
15
16 def lint_tools_on_path(ctx, paths, lint_args, **kwds):
17 assert_tools = kwds.get("assert_tools", True)
18 recursive = kwds.get("recursive", False)
19 exit = 0
20 valid_tools = 0
21 for path in paths:
22 for (tool_path, tool_xml) in yield_tool_xmls(ctx, path, recursive):
23 if handle_tool_load_error(tool_path, tool_xml):
24 exit = 1
25 continue
26 info("Linting tool %s" % tool_path)
27 if not lint_xml(tool_xml, **lint_args):
28 error("Failed linting")
29 exit = 1
30 else:
31 valid_tools += 1
32 if exit == 0 and valid_tools == 0 and assert_tools:
33 exit = 2
34 return exit
35
36
37 def handle_tool_load_error(tool_path, tool_xml):
38 """ Return True if tool_xml is tool load error (invalid XML), and
39 print a helpful error message.
40 """
41 is_error = False
42 if is_tool_load_error(tool_xml):
43 info("Could not lint %s due to malformed xml." % tool_path)
44 is_error = True
45 return is_error
46
47
48 def yield_tool_xmls(ctx, path, recursive=False):
49 tools = load_tool_elements_from_path(
50 path,
51 recursive,
52 register_load_errors=True,
53 )
54 for (tool_path, tool_xml) in tools:
55 if is_tool_load_error(tool_xml):
56 yield (tool_path, tool_xml)
57 continue
58 if not _is_tool_xml(ctx, tool_path, tool_xml):
59 continue
60 yield (tool_path, tool_xml)
61
62
63 def build_lint_args(ctx, **kwds):
64 report_level = kwds.get("report_level", "all")
65 fail_level = kwds.get("fail_level", "warn")
66 skip = kwds.get("skip", None)
67 if skip is None:
68 skip = ctx.global_config.get("lint_skip", "")
69 if isinstance(skip, list):
70 skip = ",".join(skip)
71
72 skip_types = [s.strip() for s in skip.split(",")]
73 lint_args = dict(
74 level=report_level,
75 fail_level=fail_level,
76 extra_modules=_lint_extra_modules(**kwds),
77 skip_types=skip_types,
78 )
79 return lint_args
80
81
82 def _lint_extra_modules(**kwds):
83 xsd = kwds.get("xsd", False)
84 if xsd:
85 return [planemo.linters.xsd]
86 else:
87 return []
88
89
90 def _is_tool_xml(ctx, tool_path, tool_xml):
91 if os.path.basename(tool_path) in SHED_FILES:
92 return False
93 if tool_xml.getroot().tag != "tool":
94 if ctx.verbose:
95 info(SKIP_XML_MESSAGE % tool_path)
96 return False
97 return True