def job(self, joborder, basedir, output_callback, use_container=True, **kwargs): builder = self._init_job(joborder, basedir, **kwargs) if self.tool["baseCommand"]: for n, b in enumerate(aslist(self.tool["baseCommand"])): builder.bindings.append({ "position": [-1000000, n], "valueFrom": b }) if self.tool.get("arguments"): for i, a in enumerate(self.tool["arguments"]): if isinstance(a, dict): a = copy.copy(a) if a.get("position"): a["position"] = [a["position"], i] else: a["position"] = [0, i] a["do_eval"] = a["valueFrom"] a["valueFrom"] = None builder.bindings.append(a) else: builder.bindings.append({ "position": [0, i], "valueFrom": a }) builder.bindings.sort(key=lambda a: a["position"]) _logger.debug(pprint.pformat(builder.bindings)) _logger.debug(pprint.pformat(builder.files)) reffiles = [f["path"] for f in builder.files] j = CommandLineJob() j.joborder = builder.job j.stdin = None j.stdout = None builder.pathmapper = None if self.tool.get("stdin"): j.stdin = self.tool["stdin"] if isinstance(j.stdin, dict) and "ref" in j.stdin: j.stdin = builder.job[j.stdin["ref"][1:]]["path"] reffiles.append(j.stdin) if self.tool.get("stdout"): if isinstance(self.tool["stdout"], dict) and "ref" in self.tool["stdout"]: for out in self.tool.get("outputs", []): if out["id"] == self.tool["stdout"]["ref"]: filename = self.tool["stdout"]["ref"][1:] j.stdout = filename out["outputBinding"] = out.get("outputBinding", {}) out["outputBinding"]["glob"] = filename if not j.stdout: raise Exception("stdout refers to invalid output") else: j.stdout = self.tool["stdout"] if os.path.isabs(j.stdout): raise Exception("stdout must be a relative path") j.requirements = self.requirements j.hints = self.hints for r in (j.requirements + j.hints): if r["class"] == "DockerRequirement" and use_container: builder.pathmapper = DockerPathMapper(reffiles, basedir) if builder.pathmapper is None: builder.pathmapper = PathMapper(reffiles, basedir) for f in builder.files: f["path"] = builder.pathmapper.mapper(f["path"]) builder.requirements = j.requirements j.generatefiles = {} for t in self.tool.get("fileDefs", []): j.generatefiles[t["filename"]] = expression.do_eval( t["value"], builder.job, j.requirements, self.docpath) j.environment = {} for t in self.tool.get("environmentDefs", []): j.environment[t["env"]] = expression.do_eval( t["value"], builder.job, j.requirements, self.docpath) j.command_line = flatten(map(builder.generate_arg, builder.bindings)) if j.stdin: j.stdin = j.stdin if os.path.isabs(j.stdin) else os.path.join( basedir, j.stdin) j.pathmapper = builder.pathmapper j.collect_outputs = functools.partial(self.collect_output_ports, self.tool["outputs"], builder) j.output_callback = output_callback yield j
def makeJobRunner(self): return CommandLineJob()
def job(self, joborder, input_basedir, output_callback, use_container=True, **kwargs): builder = self._init_job(joborder, input_basedir, **kwargs) if self.tool["baseCommand"]: for n, b in enumerate(aslist(self.tool["baseCommand"])): builder.bindings.append({ "position": [-1000000, n], "valueFrom": b }) if self.tool.get("arguments"): for i, a in enumerate(self.tool["arguments"]): if isinstance(a, dict): a = copy.copy(a) if a.get("position"): a["position"] = [a["position"], i] else: a["position"] = [0, i] a["do_eval"] = a["valueFrom"] a["valueFrom"] = None builder.bindings.append(a) else: builder.bindings.append({ "position": [0, i], "valueFrom": a }) builder.bindings.sort(key=lambda a: a["position"]) reffiles = [f["path"] for f in builder.files] j = CommandLineJob() j.joborder = builder.job j.stdin = None j.stdout = None j.successCodes = self.tool.get("successCodes") j.temporaryFailCodes = self.tool.get("temporaryFailCodes") j.permanentFailCodes = self.tool.get("permanentFailCodes") j.requirements = self.requirements j.hints = self.hints builder.pathmapper = None if self.tool.get("stdin"): j.stdin = expression.do_eval(self.tool["stdin"], builder.job, self.requirements, self.docpath, j.stdin) if isinstance(j.stdin, dict) and "ref" in j.stdin: j.stdin = builder.job[j.stdin["ref"][1:]]["path"] reffiles.append(j.stdin) if self.tool.get("stdout"): j.stdout = expression.do_eval(self.tool["stdout"], builder.job, j.requirements, self.docpath) if os.path.isabs(j.stdout): raise validate.ValidationException("stdout must be a relative path") dockerReq, _ = get_feature("DockerRequirement", requirements=self.requirements, hints=self.hints) if dockerReq and use_container: builder.pathmapper = DockerPathMapper(reffiles, input_basedir) if builder.pathmapper is None: builder.pathmapper = PathMapper(reffiles, input_basedir) for f in builder.files: f["path"] = builder.pathmapper.mapper(f["path"])[1] _logger.debug("Bindings is %s", pprint.pformat(builder.bindings)) _logger.debug("Files is %s", pprint.pformat({p: builder.pathmapper.mapper(p) for p in builder.pathmapper.files()})) builder.requirements = j.requirements j.generatefiles = {} createFiles, _ = get_feature("CreateFileRequirement", requirements=self.requirements, hints=self.hints) if createFiles: for t in createFiles["fileDef"]: j.generatefiles[t["filename"]] = expression.do_eval(t["fileContent"], builder.job, j.requirements, self.docpath) j.environment = {} evr, _ = get_feature("EnvVarRequirement", requirements=self.requirements, hints=self.hints) if evr: for t in evr["envDef"]: j.environment[t["envName"]] = expression.do_eval(t["envValue"], builder.job, j.requirements, self.docpath) j.command_line = flatten(map(builder.generate_arg, builder.bindings)) if j.stdin: j.stdin = j.stdin if os.path.isabs(j.stdin) else os.path.join(input_basedir, j.stdin) j.pathmapper = builder.pathmapper j.collect_outputs = functools.partial(self.collect_output_ports, self.tool["outputs"], builder) j.output_callback = output_callback yield j