def get_outputs(self, job_dir, job): result, outs = {}, self.app.outputs eval = ValueResolver(job) for out in outs: out_binding = out.output_binding ret = os.getcwd() os.chdir(job_dir) pattern = eval.resolve(out_binding.get('glob')) or "" patterns = chain(*[self.glob_or(p) for p in wrap_in_list(pattern)]) files = chain(*[glob.glob(p) for p in patterns]) res = [File({ 'class': 'File', 'path': os.path.abspath(p), 'size': os.stat(p).st_size, 'checksum': 'sha1$' + checksum(os.path.abspath(p)), 'metadata': meta(p, job.inputs, eval, out_binding), 'secondaryFiles': secondary_files(p, out_binding, eval) }) for p in files] if out_binding.get('outputEval'): self.app.load_file_content(out_binding, res) result[out.id] = eval.resolve( out_binding.get('outputEval'), [r.to_dict() for r in res] ) else: result[out.id] = res os.chdir(ret) if out.depth == 0: res = result[out.id] result[out.id] = res[0] if res and isinstance(res, list) else res return result
def get_outputs(self, job_dir, job): result, outs = {}, self.app.outputs eval = ValueResolver(job) for out in outs: out_binding = out.output_binding ret = os.getcwd() os.chdir(job_dir) pattern = eval.resolve(out_binding.get('glob')) or "" patterns = chain(*[self.glob_or(p) for p in wrap_in_list(pattern)]) files = chain(*[glob.glob(p) for p in patterns]) res = [ File({ 'class': 'File', 'path': os.path.abspath(p), 'size': os.stat(p).st_size, 'checksum': 'sha1$' + checksum(os.path.abspath(p)), 'metadata': meta(p, job.inputs, eval, out_binding), 'secondaryFiles': secondary_files(p, out_binding, eval) }) for p in files ] if out_binding.get('outputEval'): self.app.load_file_content(out_binding, res) result[out.id] = eval.resolve(out_binding.get('outputEval'), [r.to_dict() for r in res]) else: result[out.id] = res os.chdir(ret) if out.depth == 0: res = result[out.id] result[out.id] = res[0] if res and isinstance(res, list) else res return result
class CLIJob(object): def __init__(self, job): self.job = job self.app = job.app self._stdin = self.app.stdin self._stdout = self.app.stdout self.base_cmd = self.app.base_command if isinstance(self.base_cmd, six.string_types): self.base_cmd = self.base_cmd.split(' ') self.args = self.app.arguments self.eval = ValueResolver(job) @property def stdin(self): if self._stdin: return self.eval.resolve(self._stdin) @property def stdout(self): if self._stdout: return self.eval.resolve(self._stdout) def make_arg_list(self): adapters = [InputAdapter(a.get('valueFrom'), self.eval, {}, a) for a in self.args] ia = InputAdapter(self.job.inputs, self.eval, self.app.inputs) args = ia.as_toplevel(adapters) base_cmd = [self.eval.resolve(item) for item in self.base_cmd] return [six.text_type(arg) for arg in base_cmd + args] def cmd_line(self): a = self.make_arg_list() if self._stdin: a += ['<', self.stdin] if self._stdout: a += ['>', self.eval.resolve(self.stdout)] return ' '.join(a) # TODO: escape @staticmethod def glob_or(pattern): """ >>> CLIJob.glob_or("simple") ['simple'] >>> CLIJob.glob_or("{option1,option2}") ['option1', 'option2'] :param pattern: :return: """ if re.match('^\{[^,]+(,[^,]+)*\}$', pattern): return pattern.strip('{}').split(',') return [pattern] def get_outputs(self, job_dir, job): result, outs = {}, self.app.outputs eval = ValueResolver(job) for out in outs: out_binding = out.output_binding ret = os.getcwd() os.chdir(job_dir) pattern = eval.resolve(out_binding.get('glob')) or "" patterns = chain(*[self.glob_or(p) for p in wrap_in_list(pattern)]) files = chain(*[glob.glob(p) for p in patterns]) res = [File({ 'class': 'File', 'path': os.path.abspath(p), 'size': os.stat(p).st_size, 'checksum': 'sha1$' + checksum(os.path.abspath(p)), 'metadata': meta(p, job.inputs, eval, out_binding), 'secondaryFiles': secondary_files(p, out_binding, eval) }) for p in files] if out_binding.get('outputEval'): self.app.load_file_content(out_binding, res) result[out.id] = eval.resolve( out_binding.get('outputEval'), [r.to_dict() for r in res] ) else: result[out.id] = res os.chdir(ret) if out.depth == 0: res = result[out.id] result[out.id] = res[0] if res and isinstance(res, list) else res return result
class CLIJob(object): def __init__(self, job): self.job = job self.app = job.app self._stdin = self.app.stdin self._stdout = self.app.stdout self.base_cmd = self.app.base_command if isinstance(self.base_cmd, six.string_types): self.base_cmd = self.base_cmd.split(' ') self.args = self.app.arguments self.eval = ValueResolver(job) @property def stdin(self): if self._stdin: return self.eval.resolve(self._stdin) @property def stdout(self): if self._stdout: return self.eval.resolve(self._stdout) def make_arg_list(self): adapters = [ InputAdapter(a.get('valueFrom'), self.eval, {}, a) for a in self.args ] ia = InputAdapter(self.job.inputs, self.eval, self.app.inputs) args = ia.as_toplevel(adapters) base_cmd = [self.eval.resolve(item) for item in self.base_cmd] return [six.text_type(arg) for arg in base_cmd + args] def cmd_line(self): a = self.make_arg_list() if self._stdin: a += ['<', self.stdin] if self._stdout: a += ['>', self.eval.resolve(self.stdout)] return ' '.join(a) # TODO: escape @staticmethod def glob_or(pattern): """ >>> CLIJob.glob_or("simple") ['simple'] >>> CLIJob.glob_or("{option1,option2}") ['option1', 'option2'] :param pattern: :return: """ if re.match('^\{[^,]+(,[^,]+)*\}$', pattern): return pattern.strip('{}').split(',') return [pattern] def get_outputs(self, job_dir, job): result, outs = {}, self.app.outputs eval = ValueResolver(job) for out in outs: out_binding = out.output_binding ret = os.getcwd() os.chdir(job_dir) pattern = eval.resolve(out_binding.get('glob')) or "" patterns = chain(*[self.glob_or(p) for p in wrap_in_list(pattern)]) files = chain(*[glob.glob(p) for p in patterns]) res = [ File({ 'class': 'File', 'path': os.path.abspath(p), 'size': os.stat(p).st_size, 'checksum': 'sha1$' + checksum(os.path.abspath(p)), 'metadata': meta(p, job.inputs, eval, out_binding), 'secondaryFiles': secondary_files(p, out_binding, eval) }) for p in files ] if out_binding.get('outputEval'): self.app.load_file_content(out_binding, res) result[out.id] = eval.resolve(out_binding.get('outputEval'), [r.to_dict() for r in res]) else: result[out.id] = res os.chdir(ret) if out.depth == 0: res = result[out.id] result[out.id] = res[0] if res and isinstance(res, list) else res return result