Source code for dailylog1.config

"""Top level module config for dailylog."""

import os
from pathlib import Path

import click
from click.core import Context
from wtforglib.files import load_yaml_file, write_yaml_file
from wtforglib.kinds import StrAnyDict

from dailylog1.exceptions import FilePermError
from dailylog1.options import Options

CURRENT_CONFIG_VERSION = 1
CONST_DEFAULT_LOG = str(Path.home() / "daily.log")


# WPS214 Found too many methods
[docs] class Config(Options): # noqa: WPS214 """Class to manage the configuration.""" config: StrAnyDict def __init__(self, ctx: Context): """Constructor for Config class.""" super().__init__(ctx) if self.config_path().is_file(): self.config = self._load_config() else: self.config = {} self.config["version"] = CURRENT_CONFIG_VERSION self.config["default_log"] = CONST_DEFAULT_LOG self._save_config()
[docs] def set_default_log(self, log_fn: str): """Set the default log file. Parameters ---------- log_fn : str Absolute path to the log file """ log_path = Path(log_fn) Config.validate_path(log_path) self.config["default_log"] = str(log_path) self._save_config()
[docs] @staticmethod def update_config(config: StrAnyDict) -> StrAnyDict: """Update configuration from version to current version. Args: config (StrAnyDict): previous config verstion """ version = config.get("version", 0) if version != CURRENT_CONFIG_VERSION: raise ValueError("Unknown config version: {0}".format(version)) return config
[docs] @staticmethod def validate_path(path: Path) -> None: """Validate the file path exists or can be created. Args: path (Path): files spec for log Raises: FileNotFoundError: when parent directory doesn't exist or is not a directory FilePermError: when parent directory is not writable """ if path.exists(): Config.validate_existing_path(path) elif not path.parent.is_dir(): raise FileNotFoundError("Directory not found: {0}".format(path.parent)) elif not os.access(path.parent, os.W_OK): raise FilePermError("Not writable: {0}".format(path.parent))
[docs] def default_log(self) -> str: """Returns the path to the default log. Returns ------- str Path to the default log """ return self.config.get("default_log", CONST_DEFAULT_LOG)
[docs] @staticmethod def validate_existing_path(path: Path) -> None: """Validate existing path. Args: path (Path): files spec for log Raises: FileNotFoundError: when path exists but is not a file FilePermError: when path exists but is not writable """ if not path.is_file(): raise FileNotFoundError("Not a file: {0}".format(path)) if not os.access(path, os.W_OK): raise FilePermError("Not writable: {0}".format(path))
def _load_config(self) -> StrAnyDict: """Load configuration from file.""" config = load_yaml_file(self.config_path()) version = config.get("version", 0) if version != CURRENT_CONFIG_VERSION: return Config.update_config(config) return config def _save_config(self) -> None: """Load configuration from file.""" if self.is_debug(): click.echo("Saving configuration to file: {0}".format(self.config_path())) write_yaml_file(self.config_path(), self.config)