Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BugFix] - Remove multiple .envs #6363

Merged
merged 3 commits into from
May 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions cli/openbb_cli/config/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
SETTINGS_DIRECTORY = HOME_DIRECTORY / ".openbb_platform"
ASSETS_DIRECTORY = SRC_DIRECTORY / "assets"
STYLES_DIRECTORY = ASSETS_DIRECTORY / "styles"
ENV_FILE_REPOSITORY = REPOSITORY_DIRECTORY / ".env"
ENV_FILE_PROJECT = REPOSITORY_DIRECTORY / "openbb_cli" / ".env"
ENV_FILE_SETTINGS = SETTINGS_DIRECTORY / ".cli.env"
HIST_FILE_PROMPT = SETTINGS_DIRECTORY / ".cli.his"
I18N_FILE = ASSETS_DIRECTORY / "i18n"
Expand Down
194 changes: 49 additions & 145 deletions cli/openbb_cli/config/menu_text.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,28 +26,6 @@
"[/help]",
]

USE_COLOR = True


def get_ordered_providers(command_path: str) -> List:
"""Return the preferred provider for the given command.

Parameters
----------
command_path: str
The command to find the provider for. E.g. "/equity/price/historical

Returns
-------
List
The list of providers for the given command.
"""
command_reference = obb.reference.get("paths", {}).get(command_path, {}) # type: ignore
if command_reference:
providers = list(command_reference["parameters"].keys())
return [provider for provider in providers if provider != "standard"]
return []


class MenuText:
"""Create menu text with rich colors to be displayed by CLI."""
Expand All @@ -58,82 +36,33 @@ class MenuText:
SECTION_SPACING = 4

def __init__(self, path: str = ""):
"""Initialize menu help.

Parameters
----------
path : str
path to the menu that is being created
column_sources : int
column width from which to start displaying sources
"""
"""Initialize menu help."""
self.menu_text = ""
self.menu_path = path
self.warnings: List[Dict[str, str]] = []

def add_raw(self, raw_text: str):
"""Append raw text (no translation) to a menu.

Parameters
----------
raw_text : str
raw text to be appended to the menu
"""
self.menu_text += raw_text

def add_custom(self, key: str):
"""Append custom text (after translation from key) to a menu.

Parameters
----------
key : str
key to get translated text and add to the menu
"""
self.menu_text += f"{i18n.t(self.menu_path + key)}"

def add_info(self, key_info: str):
"""Append info text (after translation from key) to a menu.

Parameters
----------
key_info : str
key to get translated text and add to the menu as info
"""
self.menu_text += f"[info]{i18n.t(self.menu_path + key_info)}:[/info]\n"

def add_param(self, key_param: str, value: str, col_align: int = 0):
"""Append info text (after translation from key) to a menu.

Parameters
----------
key_param : str
key to get translated text and add to the menu as parameter
value : str
value to display in front of the parameter
col_align : int
column alignment for the value. This allows for a better UX experience.
"""
parameter_translated = i18n.t(self.menu_path + key_param)
space = (
(col_align - len(parameter_translated)) * " "
if col_align > len(parameter_translated)
else ""
)
self.menu_text += f"[param]{parameter_translated}{space}:[/param] {value}\n"

def _format_cmd_name(self, name: str) -> str:
"""Adjust the length of the command if it is too long.
@staticmethod
def _get_providers(command_path: str) -> List:
"""Return the preferred provider for the given command.

Parameters
----------
name : str
command to be formatted
command_path: str
The command to find the provider for. E.g. "/equity/price/historical

Returns
-------
str
formatted command
List
The list of providers for the given command.
"""
command_reference = obb.reference.get("paths", {}).get(command_path, {}) # type: ignore
if command_reference:
providers = list(command_reference["parameters"].keys())
return [provider for provider in providers if provider != "standard"]
return []

def _format_cmd_name(self, name: str) -> str:
"""Truncate command name length if it is too long."""
if len(name) > self.CMD_NAME_LENGTH:
new_name = name[
: self.CMD_NAME_LENGTH
Expand Down Expand Up @@ -164,22 +93,7 @@ def _format_cmd_name(self, name: str) -> str:
def _format_cmd_description(
self, name: str, description: str, trim: bool = True
) -> str:
"""Handle the command description.

Parameters
----------
name : str
command to be adjusted
description : str
description of the command
trim : bool
If true, the description will be trimmed to the maximum length

Returns
-------
str
adjusted command description
"""
"""Truncate command description length if it is too long."""
if not description:
description = i18n.t(self.menu_path + name)
if description == self.menu_path + name:
Expand All @@ -190,21 +104,33 @@ def _format_cmd_description(
else description
)

def add_cmd(self, name: str, description: str = "", disable: bool = False):
"""Append command text (after translation from key) to a menu.
def add_raw(self, text: str):
"""Append raw text (without translation)."""
self.menu_text += text

Parameters
----------
name : str
key command to be executed by user. It is also used as a key to get description of command.
description : str
description of the command
disable : bool
If disable is true, the command line is greyed out.
"""
def add_custom(self, name: str):
"""Append custom text (after translation)."""
self.menu_text += f"{i18n.t(self.menu_path + name)}"

def add_info(self, text: str):
"""Append information text (after translation)."""
self.menu_text += f"[info]{i18n.t(self.menu_path + text)}:[/info]\n"

def add_param(self, name: str, value: str, col_align: int = 0):
"""Append parameter (after translation)."""
parameter_translated = i18n.t(self.menu_path + name)
space = (
(col_align - len(parameter_translated)) * " "
if col_align > len(parameter_translated)
else ""
)
self.menu_text += f"[param]{parameter_translated}{space}:[/param] {value}\n"

def add_cmd(self, name: str, description: str = "", disable: bool = False):
"""Append command text (after translation)."""
formatted_name = self._format_cmd_name(name)
name_padding = (self.CMD_NAME_LENGTH - len(formatted_name)) * " "
providers = get_ordered_providers(f"{self.menu_path}{name}")
providers = self._get_providers(f"{self.menu_path}{name}")
formatted_description = self._format_cmd_description(
formatted_name,
description,
Expand All @@ -231,43 +157,21 @@ def add_menu(
description: str = "",
disable: bool = False,
):
"""Append menu text (after translation from key) to a menu.

Parameters
----------
name : str
key menu to be executed by user. It is also used as a key to get description of menu.
disable : bool
If disable is true, the menu line is greyed out.
"""
"""Append menu text (after translation)."""
spacing = (self.CMD_NAME_LENGTH - len(name) + self.SECTION_SPACING) * " "

if description:
menu = f"{name}{spacing}{description}"
else:
if not description:
description = i18n.t(self.menu_path + name)
if description == self.menu_path + name:
description = ""
menu = f"{name}{spacing}{description}"

if disable:
self.menu_text += f"[unvl]> {menu}[/unvl]\n"
else:
self.menu_text += f"[menu]> {menu}[/menu]\n"
menu = f"{name}{spacing}{description}"
tag = "unvl" if disable else "menu"
self.menu_text += f"[{tag}]> {menu}[/{tag}]\n"

def add_setting(self, name: str, status: bool = True):
"""Append menu text (after translation from key) to a menu.

Parameters
----------
name : str
key setting to be set by user. It is also used as a key to get description of the setting.
status : bool
status of the current setting. If true the line will be green, otherwise red.
"""
"""Append menu text (after translation)."""
spacing = (self.CMD_NAME_LENGTH - len(name) + self.SECTION_SPACING) * " "
indentation = self.SECTION_SPACING * " "
if status:
self.menu_text += f"[green]{indentation}{name}{spacing}{i18n.t(self.menu_path + name)}[/green]\n"
else:
self.menu_text += f"[red]{indentation}{name}{spacing}{i18n.t(self.menu_path + name)}[/red]\n"
color = "green" if status else "red"
self.menu_text += f"[{color}]{indentation}{name}{spacing}{i18n.t(self.menu_path + name)}[/{color}]\n"
18 changes: 2 additions & 16 deletions cli/openbb_cli/models/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,7 @@
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 openbb_cli.config.constants import ENV_FILE_SETTINGS
from pydantic import BaseModel, ConfigDict, model_validator


Expand Down Expand Up @@ -62,24 +58,14 @@ def __repr__(self) -> str:
@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
"""
"""Load settings from .env."""
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))
1 change: 0 additions & 1 deletion cli/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ description = "Investment Research for Everyone, Anywhere."
license = "MIT"
authors = ["OpenBB <hello@openbb.co>"]
packages = [{ include = "openbb_cli" }]
include = ["cli/.env"]
readme = "README.md"
homepage = "https://openbb.co"
repository = "https://github.com/OpenBB-finance/OpenBBTerminal"
Expand Down
Loading