Mercurial > repos > shellac > guppy_basecaller
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:26e78fe6e8c4 |
|---|---|
| 1 """Module defines a planemo abstraction around running cwltool. | |
| 2 | |
| 3 cwltool is an executable Python script and library mostly maintained by | |
| 4 Peter Amstutz and serves the reference implementation for the CWL. | |
| 5 It can be found at https://github.com/common-workflow-language/cwltool, | |
| 6 """ | |
| 7 import json | |
| 8 import tempfile | |
| 9 | |
| 10 from galaxy.tool_util.cwl.cwltool_deps import ( | |
| 11 ensure_cwltool_available, | |
| 12 main, | |
| 13 ) | |
| 14 | |
| 15 from planemo.deps import ensure_dependency_resolvers_conf_configured | |
| 16 from planemo.io import error, real_io | |
| 17 from planemo.runnable import ( | |
| 18 ErrorRunResponse, | |
| 19 SuccessfulRunResponse, | |
| 20 ) | |
| 21 | |
| 22 JSON_PARSE_ERROR_MESSAGE = ("Failed to parse JSON from cwltool output [%s] " | |
| 23 "in file [%s]. cwltool logs [%s].") | |
| 24 | |
| 25 | |
| 26 class CwlToolRunResponse(SuccessfulRunResponse): | |
| 27 """Describe the resut of a cwltool invocation.""" | |
| 28 | |
| 29 def __init__(self, log, outputs=None): | |
| 30 self._log = log | |
| 31 self._outputs = outputs | |
| 32 | |
| 33 @property | |
| 34 def log(self): | |
| 35 return self._log | |
| 36 | |
| 37 @property | |
| 38 def job_info(self): | |
| 39 return None | |
| 40 | |
| 41 @property | |
| 42 def outputs_dict(self): | |
| 43 return self._outputs | |
| 44 | |
| 45 | |
| 46 def run_cwltool(ctx, path, job_path, **kwds): | |
| 47 """Translate planemo kwds to cwltool kwds and run cwltool main function.""" | |
| 48 ensure_cwltool_available() | |
| 49 | |
| 50 args = [] | |
| 51 if ctx.verbose: | |
| 52 args.append("--verbose") | |
| 53 output_directory = kwds.get("output_directory", None) | |
| 54 if output_directory: | |
| 55 args.append("--outdir") | |
| 56 args.append(output_directory) | |
| 57 if kwds.get("no_container", False): | |
| 58 args.append("--no-container") | |
| 59 ensure_dependency_resolvers_conf_configured(ctx, kwds) | |
| 60 args.append("--beta-dependency-resolvers-configuration") | |
| 61 args.append(kwds["dependency_resolvers_config_file"]) | |
| 62 if kwds.get("mulled_containers"): | |
| 63 args.append("--beta-use-biocontainers") | |
| 64 | |
| 65 if kwds.get("non_strict_cwl", False): | |
| 66 args.append("--non-strict") | |
| 67 | |
| 68 args.extend([path, job_path]) | |
| 69 ctx.vlog("Calling cwltool with arguments %s" % args) | |
| 70 with tempfile.NamedTemporaryFile("w") as tmp_stdout, \ | |
| 71 tempfile.NamedTemporaryFile("w") as tmp_stderr: | |
| 72 # cwltool passes sys.stderr to subprocess.Popen - ensure it has | |
| 73 # and actual fileno. | |
| 74 with real_io(): | |
| 75 ret_code = main.main( | |
| 76 args, | |
| 77 stdout=tmp_stdout, | |
| 78 stderr=tmp_stderr, | |
| 79 ) | |
| 80 tmp_stdout.flush() | |
| 81 tmp_stderr.flush() | |
| 82 with open(tmp_stderr.name, "r") as stderr_f: | |
| 83 log = stderr_f.read() | |
| 84 ctx.vlog("cwltool log output [%s]" % log) | |
| 85 with open(tmp_stdout.name, "r") as stdout_f: | |
| 86 try: | |
| 87 result = json.load(stdout_f) | |
| 88 except ValueError: | |
| 89 message = JSON_PARSE_ERROR_MESSAGE % ( | |
| 90 open(tmp_stdout.name, "r").read(), | |
| 91 tmp_stdout.name, | |
| 92 log | |
| 93 ) | |
| 94 error(message) | |
| 95 raise Exception(message) | |
| 96 | |
| 97 if ret_code != 0: | |
| 98 return ErrorRunResponse("Error running cwltool", log=log) | |
| 99 outputs = result | |
| 100 return CwlToolRunResponse( | |
| 101 log, | |
| 102 outputs=outputs, | |
| 103 ) | |
| 104 | |
| 105 | |
| 106 __all__ = ( | |
| 107 "run_cwltool", | |
| 108 ) |
