diff options
Diffstat (limited to 'cli/openbb_cli/models/settings.py')
-rw-r--r-- | cli/openbb_cli/models/settings.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/cli/openbb_cli/models/settings.py b/cli/openbb_cli/models/settings.py new file mode 100644 index 00000000000..f83bca01ab3 --- /dev/null +++ b/cli/openbb_cli/models/settings.py @@ -0,0 +1,85 @@ +"""Settings model""" + +from typing import Any + +from dotenv import dotenv_values, set_key +from openbb_cli.config.constants import ( + ENV_FILE_PROJECT, + ENV_FILE_REPOSITORY, + ENV_FILE_SETTINGS, +) +from pydantic import BaseModel, ConfigDict, model_validator + + +class Settings(BaseModel): + """Settings model.""" + + # Platform CLI version + VERSION: str = "1.0.0" + + # DEVELOPMENT FLAGS + TEST_MODE: bool = False + DEBUG_MODE: bool = False + DEV_BACKEND: bool = False + + # FEATURE FLAGS + FILE_OVERWRITE: bool = False + SHOW_VERSION: bool = True + USE_INTERACTIVE_DF: bool = True + USE_CLEAR_AFTER_CMD: bool = False + USE_DATETIME: bool = True + USE_PROMPT_TOOLKIT: bool = True + ENABLE_EXIT_AUTO_HELP: bool = True + REMEMBER_CONTEXTS: bool = True + ENABLE_RICH_PANEL: bool = True + TOOLBAR_HINT: bool = True + + # GENERAL + TIMEZONE: str = "America/New_York" + FLAIR: str = ":openbb" + USE_LANGUAGE: str = "en" + PREVIOUS_USE: bool = False + + # STYLE + RICH_STYLE: str = "dark" + + # OUTPUT + ALLOWED_NUMBER_OF_ROWS: int = 366 + ALLOWED_NUMBER_OF_COLUMNS: int = 15 + + # OPENBB + HUB_URL: str = "https://my.openbb.co" + BASE_URL: str = "https://payments.openbb.co" + + model_config = ConfigDict(validate_assignment=True) + + def __repr__(self) -> str: + """Return a string representation of the model.""" + return f"{self.__class__.__name__}\n\n" + "\n".join( + f"{k}: {v}" for k, v in self.model_dump().items() + ) + + @model_validator(mode="before") + @classmethod + def from_env(cls, values: dict) -> dict: + """Load .env files. + + Loads the dotenv files in the following order: + 1. Repository .env file + 2. Package .env file + 3. User .env file + """ + settings = {} + settings.update(dotenv_values(ENV_FILE_REPOSITORY)) + settings.update(dotenv_values(ENV_FILE_PROJECT)) + settings.update(dotenv_values(ENV_FILE_SETTINGS)) + settings.update(values) + filtered = {k.replace("OPENBB_", ""): v for k, v in settings.items()} + return filtered + + def set_item(self, key: str, value: Any) -> None: + """Set an item in the model and save to .env.""" + # TODO: Check if this is ok, we are just saving into the settings .env + # Same behavior as before... + setattr(self, key, value) + set_key(str(ENV_FILE_SETTINGS), "OPENBB_" + key, str(value)) |