|
|
"""Settings model.""" |
|
|
|
|
|
from enum import Enum |
|
|
from typing import Any, Literal |
|
|
|
|
|
from dotenv import dotenv_values, set_key |
|
|
from openbb_cli.config.constants import AVAILABLE_FLAIRS, ENV_FILE_SETTINGS |
|
|
from openbb_core.app.version import get_package_version |
|
|
from pydantic import BaseModel, ConfigDict, Field, model_validator |
|
|
from pytz import all_timezones |
|
|
|
|
|
VERSION = get_package_version("openbb-cli") |
|
|
|
|
|
|
|
|
class SettingGroups(Enum): |
|
|
"""Setting types.""" |
|
|
|
|
|
feature_flags = "feature_flag" |
|
|
preferences = "preference" |
|
|
|
|
|
|
|
|
class Settings(BaseModel): |
|
|
"""Settings model.""" |
|
|
|
|
|
|
|
|
VERSION: str = VERSION |
|
|
|
|
|
|
|
|
TEST_MODE: bool = False |
|
|
DEBUG_MODE: bool = False |
|
|
DEV_BACKEND: bool = False |
|
|
|
|
|
|
|
|
HUB_URL: str = "https://my.openbb.co" |
|
|
BASE_URL: str = "https://payments.openbb.co" |
|
|
|
|
|
|
|
|
PREVIOUS_USE: bool = False |
|
|
|
|
|
|
|
|
FILE_OVERWRITE: bool = Field( |
|
|
default=False, |
|
|
description="whether to overwrite Excel files if they already exists", |
|
|
command="overwrite", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
SHOW_VERSION: bool = Field( |
|
|
default=True, |
|
|
description="whether to show the version in the bottom right corner", |
|
|
command="version", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
USE_INTERACTIVE_DF: bool = Field( |
|
|
default=True, |
|
|
description="display tables in interactive window", |
|
|
command="interactive", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
USE_CLEAR_AFTER_CMD: bool = Field( |
|
|
default=False, |
|
|
description="clear console after each command", |
|
|
command="cls", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
USE_DATETIME: bool = Field( |
|
|
default=True, |
|
|
description="whether to show the date and time before the flair", |
|
|
command="datetime", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
USE_PROMPT_TOOLKIT: bool = Field( |
|
|
default=True, |
|
|
description="enable prompt toolkit (autocomplete and history)", |
|
|
command="promptkit", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
ENABLE_EXIT_AUTO_HELP: bool = Field( |
|
|
default=True, |
|
|
description="automatically print help when quitting menu", |
|
|
command="exithelp", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
ENABLE_RICH_PANEL: bool = Field( |
|
|
default=True, |
|
|
description="enable colorful rich CLI panel", |
|
|
command="richpanel", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
TOOLBAR_HINT: bool = Field( |
|
|
default=True, |
|
|
description="displays usage hints in the bottom toolbar", |
|
|
command="tbhint", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
SHOW_MSG_OBBJECT_REGISTRY: bool = Field( |
|
|
default=False, |
|
|
description="show obbject registry message after a new result is added", |
|
|
command="obbject_msg", |
|
|
group=SettingGroups.feature_flags, |
|
|
) |
|
|
|
|
|
|
|
|
TIMEZONE: Literal[tuple(all_timezones)] = Field( |
|
|
default="America/New_York", |
|
|
description="pick timezone", |
|
|
command="timezone", |
|
|
group=SettingGroups.preferences, |
|
|
) |
|
|
FLAIR: Literal[tuple(AVAILABLE_FLAIRS)] = Field( |
|
|
default=":openbb", |
|
|
description="choose flair icon", |
|
|
command="flair", |
|
|
group=SettingGroups.preferences, |
|
|
) |
|
|
N_TO_KEEP_OBBJECT_REGISTRY: int = Field( |
|
|
default=10, |
|
|
description="define the maximum number of obbjects allowed in the registry", |
|
|
command="obbject_res", |
|
|
group=SettingGroups.preferences, |
|
|
) |
|
|
N_TO_DISPLAY_OBBJECT_REGISTRY: int = Field( |
|
|
default=5, |
|
|
description="define the maximum number of cached results to display on the help menu", |
|
|
command="obbject_display", |
|
|
group=SettingGroups.preferences, |
|
|
) |
|
|
RICH_STYLE: str = Field( |
|
|
default="dark", |
|
|
description="apply a custom rich style to the CLI", |
|
|
command="console_style", |
|
|
group=SettingGroups.preferences, |
|
|
) |
|
|
ALLOWED_NUMBER_OF_ROWS: int = Field( |
|
|
default=20, |
|
|
description="number of rows to show (when not using interactive tables).", |
|
|
command="n_rows", |
|
|
group=SettingGroups.preferences, |
|
|
) |
|
|
ALLOWED_NUMBER_OF_COLUMNS: int = Field( |
|
|
default=5, |
|
|
description="number of columns to show (when not using interactive tables).", |
|
|
command="n_cols", |
|
|
group=SettingGroups.preferences, |
|
|
) |
|
|
|
|
|
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 settings from .env.""" |
|
|
settings = {} |
|
|
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.""" |
|
|
setattr(self, key, value) |
|
|
set_key(str(ENV_FILE_SETTINGS), "OPENBB_" + key, str(value)) |
|
|
|