Files
jpacrepo-uploader/jpacrepo_uploader/config.py
2023-09-04 07:36:50 +08:00

57 lines
2.0 KiB
Python

from configparser import RawConfigParser
from os import environ
from .maybe import Maybe
from pathlib import Path
from itertools import chain
from dataclasses import dataclass
from typing import Optional
_config_file_name = 'client.properties'
@dataclass
class Config:
server_url: str
auth_server_url: str
repo_folders: tuple[Path, ...]
config_file_candidates = [
(Maybe.of(Path('/etc') / 'jpacrepo' / _config_file_name)
.filter(Path.exists)),
(Maybe.of_nullable(environ.get('XDG_CONFIG_HOME', None))
.map(Path)
.map(lambda xdg_config_home: xdg_config_home / 'jpacrepo' / _config_file_name)
.filter(Path.exists)),
(Maybe.of_nullable(environ['HOME'])
.map(Path)
.map(lambda home: home / '.config' / _config_file_name)
.filter(Path.exists))
]
def load_configuration() -> Config:
main_section = 'main'
server_url: Optional[str] = None
auth_server_url: Optional[str] = None
repo_folders: list[Path] = []
for config_file_maybe in config_file_candidates:
def process_configuration(config_file: Path) -> None:
nonlocal server_url
nonlocal auth_server_url
config = RawConfigParser()
with open(config_file, 'r') as lines:
config.read_file(chain((f'[{main_section}]',), lines))
(Maybe.of_nullable(config.get(main_section, 'RepoFolder', fallback=None))
.map(lambda v: v.format(**environ))
.map(Path)
.if_present(repo_folders.append))
server_url = config.get(main_section, 'ServerURL', fallback=server_url)
auth_server_url = config.get(main_section, 'AuthServerURL', fallback=auth_server_url)
config_file_maybe.if_present(process_configuration)
return Config(server_url or 'https://woggioni.net/jpacrepo/',
auth_server_url or 'https://woggioni.net/auth/realms/woggioni.net',
tuple(repo_folders) or (Path('/var/cache/pacman/pkg'),)
)