Source code for jobflow_remote.config.settings
from pathlib import Path
from typing import Optional
from pydantic import Field, model_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
from jobflow_remote.config.base import LogLevel
DEFAULT_PROJECTS_FOLDER = Path("~/.jfremote").expanduser().as_posix()
DEFAULT_CONFIG_FILE_PATH = Path("~/.jfremote.yaml").expanduser().as_posix()
[docs]
class JobflowRemoteSettings(BaseSettings):
config_file: str = Field(
DEFAULT_CONFIG_FILE_PATH,
description="Location of the config file for jobflow remote.",
)
projects_folder: str = Field(
DEFAULT_PROJECTS_FOLDER, description="Location of the projects files."
)
project: Optional[str] = Field(None, description="The name of the project used.")
cli_full_exc: bool = Field(
default=False,
description="If True prints the full stack trace of the exception when raised in the CLI.",
)
cli_suggestions: bool = Field(
default=True, description="If True prints some suggestions in the CLI commands."
)
cli_log_level: LogLevel = Field(
LogLevel.WARN, description="The level set for logging in the CLI"
)
model_config = SettingsConfigDict(env_prefix="jfremote_")
[docs]
@model_validator(mode="before")
@classmethod
def load_default_settings(cls, values: dict) -> dict:
"""
Load settings from file or environment variables.
Loads settings from a root file if available and uses that as defaults in
place of built-in defaults.
This allows setting of the config file path through environment variables.
"""
from monty.serialization import loadfn
config_file_path: str = values.get("config_file", DEFAULT_CONFIG_FILE_PATH)
new_values = {}
if Path(config_file_path).expanduser().exists():
new_values.update(loadfn(Path(config_file_path).expanduser()))
new_values.update(values)
return new_values