Source code for runcommands.result

import os
import shlex
from subprocess import CompletedProcess
from typing import Mapping

from cached_property import cached_property

from .exc import RunCommandsError


[docs]class Result(RunCommandsError): def __init__(self, args, return_code, stdout, stderr): args = shlex.split(args) if isinstance(args, str) else args self.args = args self.return_code = return_code self.stdout = stdout self.stderr = stderr self.succeeded = self.return_code == 0 self.failed = not self.succeeded @classmethod def from_subprocess_result(cls, result: CompletedProcess): return cls( result.args, result.returncode, result.stdout, result.stderr, ) @cached_property def args_str(self): args = self.args if isinstance(args, Mapping): return " ".join(f"{k} => {v}" for k, v in args.items()) # XXX: Assume list, tuple, or some other kind of sequence return " ".join(str(a) for a in args) @cached_property def stdout_lines(self): return self.stdout.splitlines() if self.stdout else [] @cached_property def stderr_lines(self): return self.stderr.splitlines() if self.stderr else [] def __bool__(self): return self.succeeded def __str__(self): output = (self.stderr if self.return_code else self.stdout) or "[NO OUTPUT]" if output.endswith(os.linesep): output = output[:-1] status = "SUCCEEDED" if self.succeeded else "FAILED" string = f"{status} ({self.return_code}): {self.args_str} -> {output}" return string def __repr__(self): return repr(str(self))