Configure explain log level via cli and config file

This commit is contained in:
Joscha
2021-05-19 17:48:51 +02:00
parent 92886fb8d8
commit 0d10752b5a
6 changed files with 44 additions and 23 deletions

View File

@ -4,6 +4,7 @@ import configparser
from pathlib import Path
from .config import Config, ConfigDumpException, ConfigLoadException
from .logging import log
from .output_dir import OnConflict, Redownload
from .pferd import Pferd
from .version import NAME, VERSION
@ -42,6 +43,13 @@ GENERAL_PARSER.add_argument(
metavar="PATH",
help="custom working directory"
)
GENERAL_PARSER.add_argument(
"--explain", "-e",
# TODO Use argparse.BooleanOptionalAction after updating to 3.9
action="store_const",
const=True,
help="log and explain in detail what PFERD is doing"
)
def load_general(
@ -52,6 +60,8 @@ def load_general(
if args.working_dir is not None:
section["working_dir"] = str(args.working_dir)
if args.explain is not None:
section["explain"] = "true" if args.explain else "false"
CRAWLER_PARSER = argparse.ArgumentParser(add_help=False)
@ -217,6 +227,10 @@ def prune_crawlers(
def main() -> None:
args = PARSER.parse_args()
# Configure log levels set by command line arguments
if args.explain is not None:
log.output_explain = args.explain
if args.version:
print(f"{NAME} {VERSION}")
exit()
@ -226,6 +240,11 @@ def main() -> None:
except ConfigLoadException:
exit(1)
# Configure log levels set in the config file
# TODO Catch config section exceptions
if args.explain is None:
log.output_explain = config.default_section.explain()
if args.dump_config is not None:
try:
if args.dump_config is True:

View File

@ -50,6 +50,15 @@ class Section:
self.error(key, "Missing value")
class DefaultSection(Section):
def working_dir(self) -> Path:
pathstr = self.s.get("working_dir", ".")
return Path(pathstr).expanduser()
def explain(self) -> bool:
return self.s.getboolean("explain", fallback=False)
class Config:
@staticmethod
def _default_path() -> Path:
@ -62,6 +71,11 @@ class Config:
def __init__(self, parser: ConfigParser):
self._parser = parser
self._default_section = DefaultSection(parser[parser.default_section])
@property
def default_section(self) -> DefaultSection:
return self._default_section
@staticmethod
def _fail_load(path: Path, reason: str) -> None:
@ -134,10 +148,6 @@ class Config:
def dump_to_stdout(self) -> None:
self._parser.write(sys.stdout)
@property
def default_section(self) -> SectionProxy:
return self._parser[self._parser.default_section]
def crawler_sections(self) -> List[Tuple[str, SectionProxy]]:
result = []
for name, proxy in self._parser.items():
@ -153,8 +163,3 @@ class Config:
result.append((name, proxy))
return result
@property
def working_dir(self) -> Path:
pathstr = self.default_section.get("working_dir", ".")
return Path(pathstr).expanduser()

View File

@ -184,7 +184,7 @@ class Crawler(ABC):
self._transformer = Transformer(section.transform())
self._output_dir = OutputDirectory(
config.working_dir / section.output_dir(name),
config.default_section.working_dir() / section.output_dir(name),
section.redownload(),
section.on_conflict(),
)

View File

@ -46,7 +46,7 @@ class LocalCrawler(Crawler):
):
super().__init__(name, section, config)
self._target = config.working_dir / section.target()
self._target = config.default_section.working_dir() / section.target()
self._crawl_delay = section.crawl_delay()
self._download_delay = section.download_delay()
self._download_speed = section.download_speed()

View File

@ -52,9 +52,9 @@ class Log:
self._lines: List[str] = []
# Whether different parts of the output are enabled or disabled
self._enabled_explain = False
self._enabled_action = True
self._enabled_report = True
self.output_explain = False
self.output_action = True
self.output_report = True
def _update_live(self) -> None:
elements = []
@ -66,11 +66,6 @@ class Log:
group = RenderGroup(*elements) # type: ignore
self._live.update(group)
def configure(self, explain: bool, action: bool, report: bool) -> None:
self._enabled_explain = explain
self._enabled_action = action
self._enabled_report = report
@contextmanager
def show_progress(self) -> Iterator[None]:
if self._showing_progress:
@ -107,19 +102,19 @@ class Log:
self.console.print(text)
def explain_topic(self, text: str) -> None:
if self._enabled_explain:
if self.output_explain:
self.print(f"[cyan]{escape(text)}")
def explain(self, text: str) -> None:
if self._enabled_explain:
if self.output_explain:
self.print(f" {escape(text)}")
def action(self, text: str) -> None:
if self._enabled_action:
if self.output_action:
self.print(text)
def report(self, text: str) -> None:
if self._enabled_report:
if self.output_report:
self.print(text)
@contextmanager