From d1df2fb6f0477c0b10a193af303a2c9b56d4c28f Mon Sep 17 00:00:00 2001 From: Jonathon Reinhart Date: Wed, 3 Jan 2024 00:25:14 -0500 Subject: [PATCH] scuba: Simplify ScubaDive.__str__ (#246) The output format is not particularly important; it is a diagnostic facility. Switch from complex custom formatting to pprint.pformat(). Note that we would like to use sort_dicts=False, but that was introduced in Python 3.8, and our current minimum is Python 3.7. See #242. --- scuba/scuba.py | 50 ++++++++++++-------------------------------------- 1 file changed, 12 insertions(+), 38 deletions(-) diff --git a/scuba/scuba.py b/scuba/scuba.py index 0c4f9899..06423887 100644 --- a/scuba/scuba.py +++ b/scuba/scuba.py @@ -2,11 +2,11 @@ import copy import dataclasses import os +import pprint import shutil import sys import tempfile from grp import getgrgid -from io import StringIO from pathlib import Path from pwd import getpwuid from typing import cast, Any, Dict, Iterable, List, Optional, Sequence, Tuple, Union @@ -117,44 +117,18 @@ def _cleanup(self) -> None: shutil.rmtree(self.__scubadir_hostpath) def __str__(self) -> str: - s = StringIO() - - indent = " " - level = 0 - - def writehdr(name: str) -> None: - writeln(s, f"{indent * level}{name}:") - - def writelist(name: str, vals: Optional[Iterable[Any]]) -> None: - writehdr(name) - for val in vals or (): - writeln(s, f"{indent * (level + 1)}{val}") - - def writescl(name: str, val: Union[None, bool, float, str, Path]) -> None: - writeln(s, f"{indent * level}{name + ':':<14s}{val}") - - writeln(s, "ScubaDive") - level += 1 - - writescl("verbose", self.verbose) - writescl("as_root", self.as_root) - writescl("workdir", self.workdir) - - writelist("options", self.options) - writelist("docker_args", self.docker_args) - writelist("env_vars", (f"{name}={val}" for name, val in self.env_vars.items())) - writelist( - "volumes", (f"{hp} => {cp} {opt}" for hp, cp, opt in self.__get_vol_opts()) + data = dict( + verbose=self.verbose, + as_root=self.as_root, + workdir=str(self.workdir), + options=self.options, + docker_args=self.docker_args, + env_vars=self.env_vars, + volumes=[f"{hp} => {cp} {opt}" for hp, cp, opt in self.__get_vol_opts()], + context=dataclasses.asdict(self.context), ) - - writehdr("context") - level += 1 - writelist("script", self.context.script) - writescl("image", self.context.image) - writelist("docker_args", self.context.docker_args) - writelist("volumes", self.context.volumes) - - return s.getvalue() + # TODO(#242) Use sort_dicts=False in Python >= 3.8 + return "ScubaDive\n" + pprint.pformat(data, width=100) @property def is_remote_docker(self) -> bool: