Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/planemo/cwl/run.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author | shellac |
---|---|
date | Sat, 02 May 2020 07:14:21 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.7/site-packages/planemo/cwl/run.py Sat May 02 07:14:21 2020 -0400 @@ -0,0 +1,108 @@ +"""Module defines a planemo abstraction around running cwltool. + +cwltool is an executable Python script and library mostly maintained by +Peter Amstutz and serves the reference implementation for the CWL. +It can be found at https://github.com/common-workflow-language/cwltool, +""" +import json +import tempfile + +from galaxy.tool_util.cwl.cwltool_deps import ( + ensure_cwltool_available, + main, +) + +from planemo.deps import ensure_dependency_resolvers_conf_configured +from planemo.io import error, real_io +from planemo.runnable import ( + ErrorRunResponse, + SuccessfulRunResponse, +) + +JSON_PARSE_ERROR_MESSAGE = ("Failed to parse JSON from cwltool output [%s] " + "in file [%s]. cwltool logs [%s].") + + +class CwlToolRunResponse(SuccessfulRunResponse): + """Describe the resut of a cwltool invocation.""" + + def __init__(self, log, outputs=None): + self._log = log + self._outputs = outputs + + @property + def log(self): + return self._log + + @property + def job_info(self): + return None + + @property + def outputs_dict(self): + return self._outputs + + +def run_cwltool(ctx, path, job_path, **kwds): + """Translate planemo kwds to cwltool kwds and run cwltool main function.""" + ensure_cwltool_available() + + args = [] + if ctx.verbose: + args.append("--verbose") + output_directory = kwds.get("output_directory", None) + if output_directory: + args.append("--outdir") + args.append(output_directory) + if kwds.get("no_container", False): + args.append("--no-container") + ensure_dependency_resolvers_conf_configured(ctx, kwds) + args.append("--beta-dependency-resolvers-configuration") + args.append(kwds["dependency_resolvers_config_file"]) + if kwds.get("mulled_containers"): + args.append("--beta-use-biocontainers") + + if kwds.get("non_strict_cwl", False): + args.append("--non-strict") + + args.extend([path, job_path]) + ctx.vlog("Calling cwltool with arguments %s" % args) + with tempfile.NamedTemporaryFile("w") as tmp_stdout, \ + tempfile.NamedTemporaryFile("w") as tmp_stderr: + # cwltool passes sys.stderr to subprocess.Popen - ensure it has + # and actual fileno. + with real_io(): + ret_code = main.main( + args, + stdout=tmp_stdout, + stderr=tmp_stderr, + ) + tmp_stdout.flush() + tmp_stderr.flush() + with open(tmp_stderr.name, "r") as stderr_f: + log = stderr_f.read() + ctx.vlog("cwltool log output [%s]" % log) + with open(tmp_stdout.name, "r") as stdout_f: + try: + result = json.load(stdout_f) + except ValueError: + message = JSON_PARSE_ERROR_MESSAGE % ( + open(tmp_stdout.name, "r").read(), + tmp_stdout.name, + log + ) + error(message) + raise Exception(message) + + if ret_code != 0: + return ErrorRunResponse("Error running cwltool", log=log) + outputs = result + return CwlToolRunResponse( + log, + outputs=outputs, + ) + + +__all__ = ( + "run_cwltool", +)