Tighten configuration and export handling
This commit is contained in:
@@ -1,41 +1,68 @@
|
||||
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:
|
||||
REDMINE_URL = os.getenv("REDMINE_URL", "").strip().rstrip("/")
|
||||
REDMINE_API_KEY = os.getenv("REDMINE_API_KEY")
|
||||
REDMINE_USER = os.getenv("REDMINE_USER")
|
||||
REDMINE_PASSWORD = os.getenv("REDMINE_PASSWORD")
|
||||
REDMINE_AUTHOR = os.getenv("REDMINE_AUTHOR")
|
||||
DEFAULT_FROM_DATE = os.getenv("DEFAULT_FROM_DATE")
|
||||
DEFAULT_TO_DATE = os.getenv("DEFAULT_TO_DATE")
|
||||
@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
|
||||
if cls.REDMINE_AUTHOR:
|
||||
return cls.REDMINE_AUTHOR
|
||||
return ""
|
||||
return os.getenv("REDMINE_AUTHOR", "").strip()
|
||||
|
||||
@classmethod
|
||||
def get_default_date_range(cls) -> str:
|
||||
if cls.DEFAULT_FROM_DATE and cls.DEFAULT_TO_DATE:
|
||||
return f"{cls.DEFAULT_FROM_DATE}--{cls.DEFAULT_TO_DATE}"
|
||||
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.REDMINE_URL:
|
||||
if not cls.get_redmine_url():
|
||||
raise ValueError("REDMINE_URL is required (set via env or .env)")
|
||||
if cls.REDMINE_API_KEY:
|
||||
if cls.get_redmine_api_key():
|
||||
return
|
||||
if not (cls.REDMINE_USER and cls.REDMINE_PASSWORD):
|
||||
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"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user