summaryrefslogtreecommitdiffstats
path: root/cli/openbb_cli/models/settings.py
blob: c30f6ff99520281a29c6ac5167081dc6458f01e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""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
    SHOW_MSG_OBBJECT_REGISTRY: bool = False

    # GENERAL
    TIMEZONE: str = "America/New_York"
    FLAIR: str = ":openbb"
    USE_LANGUAGE: str = "en"
    PREVIOUS_USE: bool = False
    N_TO_KEEP_OBBJECT_REGISTRY: int = 10

    # STYLE
    RICH_STYLE: str = "dark"

    # OUTPUT
    ALLOWED_NUMBER_OF_ROWS: int = 20
    ALLOWED_NUMBER_OF_COLUMNS: int = 5

    # 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))