Files
project-manager/project_manager/command.py
T
2023-03-15 10:26:33 +03:00

46 lines
1.0 KiB
Python

__all__ = (
"CommandError",
"Command",
)
import logging
import subprocess
from pathlib import Path
logger = logging.getLogger(">")
class CommandError(RuntimeError):
@property
def output(self):
return self.args[0].decode("utf-8").strip()
class Command:
_logger = logger
def __init__(self, executor: str, *args: str) -> None:
self._executor = executor
self._args = args
def run(self, basepath: Path):
args = [self._executor, *self._args]
self._logger.debug(" ".join(args))
result = subprocess.run(
args,
cwd=basepath,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
self._logstd(result.stdout, logging.TRACE)
self._logstd(result.stderr, logging.TRACE)
if result.returncode != 0:
raise CommandError(result.stderr)
@classmethod
def _logstd(cls, data: bytes, level: int):
if data:
output = data.decode("utf-8").strip()
cls._logger.log(level, f"\n{output}\n")