"""
CLI interface for RAPyDo
"""
import os
import sys
from pathlib import Path
from typing import Dict, NoReturn, Union
from colorama import Fore as colors # type: ignore
from loguru import logger as log
from python_on_whales.components.compose.models import ComposeConfigService
ComposeServices = Dict[str, ComposeConfigService]
__version__ = "3.0"
__all__ = [colors]
COMPOSE_ENVIRONMENT_FILE = Path(".env")
SUBMODULES_DIR = Path("submodules")
PROJECT_DIR = Path("projects")
DATA_DIR = Path("data")
BACKUP_DIR = DATA_DIR.joinpath("backup")
TEMPLATE_DIR = Path("templates")
LOGS_FOLDER = DATA_DIR.joinpath("logs").resolve()
LOG_RETENTION = os.getenv("LOG_RETENTION", "180")
LOG_FORMAT = os.getenv("RAPYDO_LOG_FORMAT", "simple")
TABLE_FORMAT = "simple" # plain, simple, pretty, presto
LOGS_FILE = None
if LOGS_FOLDER.is_dir():
LOGS_FILE = LOGS_FOLDER.joinpath("rapydo-controller.log")
# log.level("VERBOSE", no=1, color="<fg #666>")
log.level("INFO", color="<green>")
log.remove()
TESTING = os.getenv("TESTING", "0") == "1"
fmt = "<fg #666>{time:YYYY-MM-DD HH:mm:ss,SSS}</fg #666> "
if LOG_FORMAT == "full": # pragma: no cover
fmt += "[<level>{level}</level> "
fmt += "<fg #666>{name}:{line}</fg #666>] "
else:
fmt += "<level>{level:8}</level> "
fmt += "<fg #FFF>{message}</fg #FFF>"
log.add(sys.stderr, format=fmt)
if LOGS_FILE is not None:
try:
log.add(
LOGS_FILE,
level=0,
rotation="1 week",
retention=f"{LOG_RETENTION} days",
format="{time:YYYY-MM-DD HH:mm:ss,SSS} <level>{level:8}</level> {message}",
colorize=False,
filter=lambda record: record["level"].no >= log.level("WARNING").no
or "log_to_file" in record["extra"],
)
except PermissionError as e: # pragma: no cover
log.error(e)
LOGS_FILE = None
CONFS_DIR = Path(__file__).resolve().parent.joinpath("confs")
PLACEHOLDER = "**PLACEHOLDER**"
PROJECTRC = Path(".projectrc")
# PROJECTRC_ALTERNATIVE = ".project.yml"
DATAFILE = Path(".rapydo")
EXTENDED_PROJECT_DISABLED = "no_extended_project"
CONTAINERS_YAML_DIRNAME = "confs"
COMPOSE_FILE = Path("docker-compose.yml")
COMPOSE_FILE_VERSION = "3.9"
REGISTRY = "registry"
EnvType = Union[None, str, int, float]
[docs]
def print_and_exit(
message: str, *args: Union[str, Path], **kwargs: Union[str, Path]
) -> NoReturn:
"""
Print a critical message and then exit with code 1
"""
log.critical(message, *args, **kwargs)
sys.exit(1)
[docs]
def RED(msg: str) -> str:
"""
Colorize a string with ANSI Red
"""
return f"{colors.RED}{msg}{colors.RESET}"
[docs]
def YELLOW(msg: str) -> str:
"""
Colorize a string with ANSI Yellow
"""
return f"{colors.YELLOW}{msg}{colors.RESET}"
[docs]
def GREEN(msg: str) -> str:
"""
Colorize a string with ANSI Green
"""
return f"{colors.GREEN}{msg}{colors.RESET}"