import os from typing import Union from dotenv import load_dotenv load_dotenv() DEFAULT_REDMINE_VERIFY = "/etc/ssl/certs/ca-certificates.crt" FALSE_VALUES = {"0", "false", "no", "off"} TRUE_VALUES = {"1", "true", "yes", "on"} class Config: @classmethod def get_redmine_url(cls) -> str: return os.getenv("REDMINE_URL", "").strip().rstrip("/") @classmethod def get_redmine_api_key(cls) -> str: return os.getenv("REDMINE_API_KEY", "").strip() @classmethod def get_redmine_user(cls) -> str: return os.getenv("REDMINE_USER", "").strip() @classmethod def get_redmine_password(cls) -> str: return os.getenv("REDMINE_PASSWORD", "") @classmethod def get_redmine_verify(cls) -> Union[bool, str]: value = os.getenv("REDMINE_VERIFY", "").strip() if not value: return DEFAULT_REDMINE_VERIFY normalized = value.lower() if normalized in FALSE_VALUES: return False if normalized in TRUE_VALUES: return True return value @classmethod def get_author(cls, cli_author: str = "") -> str: """Возвращает автора: из CLI если задан, иначе из .env, иначе — заглушку.""" if cli_author: return cli_author return os.getenv("REDMINE_AUTHOR", "").strip() @classmethod def get_default_date_range(cls) -> str: default_from_date = os.getenv("DEFAULT_FROM_DATE", "").strip() default_to_date = os.getenv("DEFAULT_TO_DATE", "").strip() if default_from_date and default_to_date: return f"{default_from_date}--{default_to_date}" # fallback hardcoded return "2025-12-19--2026-01-31" @classmethod def validate(cls) -> None: if not cls.get_redmine_url(): raise ValueError("REDMINE_URL is required (set via env or .env)") if cls.get_redmine_api_key(): return if not (cls.get_redmine_user() and cls.get_redmine_password()): raise ValueError( "REDMINE_API_KEY is required, or set both REDMINE_USER and REDMINE_PASSWORD" )