Esempio n. 1
0
 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
Esempio n. 2
0
 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
Esempio n. 3
0
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
Esempio n. 4
0
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