Source code for hammurabi.config

# pylint: disable=R0902

from importlib.util import module_from_spec, spec_from_file_location
import logging
import os
from pathlib import Path
import sys
from typing import Optional, Union

from git import Repo
from github3 import GitHub, login
import toml


[docs]class Config: """ Simple configuration object which used across Hammurabi. The :class:`Config` loads the given ``pyproject.toml`` according to PEP-518. """ def __init__(self): self.__repo: Optional[Repo] = None self.github: Optional[GitHub] = None self.dry_run: bool = False self.pillar = None self.working_dir = Path(".") self.log_level: str = "INFO" self.rule_can_abort: bool = False self.git_branch_name = "hammurabi" self.git_base_name = "master" self.repository: str = "" logging.basicConfig( stream=sys.stdout, format="[%(levelname)s]\t%(asctime)s - %(message)s", datefmt="%Y-%M-%d %H:%S", ) @property def repo(self) -> Union[Repo, None]: """ Get the target directory. """ return self.__repo @repo.setter def repo(self, repository): """ Set the target and change the working directory. If the target is a git repository. """ self.working_dir = repository.absolute() os.chdir(self.working_dir) self.__repo = Repo(self.working_dir)
[docs] def load(self, file: Union[str, Path]): """ Load and parse the given ``pyproject.toml`` file. """ file = Path(file) pyproject = toml.load(file.expanduser()) project_config = pyproject.get("tool", {}).get("hammurabi", {}) config_file = Path(project_config.get("config")).expanduser() pillar_var = project_config.get("pillar", "pillar") spec = spec_from_file_location(config_file.name.replace(".py", ""), config_file) module = module_from_spec(spec) spec.loader.exec_module(module) # type: ignore self.pillar = getattr(module, pillar_var) self.log_level = project_config.get("log_level", "INFO") self.github = login(token=project_config.get("github_token", "")) self.repo = Path(project_config.get("target", "")) self.repository = project_config.get("repository", "") self.git_base_name = project_config.get("git_base_name", self.git_base_name) self.git_branch_name = project_config.get( "git_branch_name", self.git_branch_name ) self.dry_run = bool(project_config.get("dry_run", "")) self.rule_can_abort = bool(project_config.get("rule_can_abort", "")) logging.root.setLevel(config.log_level) logging.debug('Successfully loaded "%s"', file.absolute()) logging.debug('Successfully loaded "%s"', config_file.absolute())
config = Config() # pylint: disable=invalid-name