Refactor main menu to have: Settings and Feature Flags menus (#1864)

This commit is contained in:
didierlopes.eth
2022-05-25 03:11:40 +01:00
committed by GitHub
parent 46da0fca5e
commit 80b3c01988
15 changed files with 924 additions and 783 deletions

View File

@@ -27,7 +27,7 @@ jobs:
key: ${{ runner.os }}-v1-linting
restore-keys: ${{ runner.os }}-v1-linting
- run: python custom_pre_commit/check_doc.py --ignore-files=settings_controller.py,keys_controller.py,degiro_controller.py,oanda_controller.py --ignore-commands=login,al_swe,info_swe,goodness,resources,yf,yolo
- run: python custom_pre_commit/check_doc.py --ignore-files=settings_controller.py,keys_controller.py,featflags_controller.py,degiro_controller.py,oanda_controller.py --ignore-commands=login,al_swe,info_swe,goodness,resources,yf,yolo
- run: pip install bandit black codespell flake8 mypy pyupgrade safety pylint==2.12.2
- run: pip install types-pytz types-requests types-termcolor types-tabulate types-PyYAML types-python-dateutil types-setuptools types-six
- run: bandit -x ./tests -r . || true

View File

@@ -8,7 +8,7 @@ repos:
pass_filenames: false
args:
[
"--ignore-files=settings_controller.py,keys_controller.py,degiro_controller.py,",
"--ignore-files=settings_controller.py,featflags_controller.py,keys_controller.py,degiro_controller.py,",
"--ignore-commands=login,al_swe,info_swe,goodness,resources,yf,yolo",
]
entry: python custom_pre_commit/check_doc.py

0
i18n/README.md vendored
View File

48
i18n/en.yml vendored
View File

@@ -30,33 +30,36 @@ en:
tz: set different timezone
export: select export folder to output data
exe: execute automated routine script
settings: set feature flags and style charts
settings: tune settings (export folder, timezone, language, plot size)
featflags: enable and disable feature flags
keys: set API keys and check their validity
_configure_: Configure your own terminal
_main_menu_: Main menu
keys/_keys_: Set API keys through environment variables
defined, test passed: defined, test passed
defined, test failed: defined, test failed
not defined: not defined
defined, not tested: defined, not tested
defined, test unsuccessful: defined, test unsuccessful
settings/_feature_flags_: Feature flags through environment variables
settings/logcollection: allow logs to be sent to help OpenBB team
settings/tab: use tabulate to print dataframes
settings/cls: clear console after each command
settings/color: use coloring features
settings/promptkit: enable prompt toolkit (autocomplete and history)
settings/predict: prediction features
settings/thoughts: thoughts of the day
settings/reporthtml: open report as HTML otherwise notebook
settings/exithelp: automatically print help when quitting menu
settings/rcontext: remember contexts loaded params during session
settings/rich: colorful rich terminal
settings/richpanel: colorful rich terminal panel
settings/ion: interactive matplotlib mode
settings/watermark: watermark in figures
settings/cmdloc: command location displayed in figures
featflags/_info_: Feature flags through environment variables
featflags/logcollection: allow logs to be sent to help OpenBB team
featflags/tab: use tabulate to print dataframes
featflags/cls: clear console after each command
featflags/color: use coloring features
featflags/promptkit: enable prompt toolkit (autocomplete and history)
featflags/predict: prediction features
featflags/thoughts: thoughts of the day
featflags/reporthtml: open report as HTML otherwise notebook
featflags/exithelp: automatically print help when quitting menu
featflags/rcontext: remember contexts loaded params during session
featflags/rich: colorful rich terminal
featflags/richpanel: colorful rich terminal panel
featflags/ion: interactive matplotlib mode
featflags/watermark: watermark in figures
featflags/cmdloc: command location displayed in figures
settings/_info_: Settings through environment variables
settings/autoscaling: plot autoscaling
settings/dt: add date and time to command line
settings/flair: console flair
settings/dt: add or remove datetime from flair
settings/_flair: Flair
settings/lang: terminal language
settings/_language: Language
@@ -74,8 +77,8 @@ en:
settings/_plot_height_pct: Plot height [%]
settings/_plot_width_pct: Plot width [%]
settings/_monitor: Monitor
_export_folder: Export Folder
_timezone: Timezone
settings/_export_folder: Export Folder
settings/_timezone: Timezone
_others_: Others
stocks: access historical pricing data, options, sector and industry, and overall due diligence
crypto: dive into onchain data, tokenomics, circulation supply, nfts and more
@@ -282,6 +285,9 @@ en:
stocks/ins/tist: top insider sales today
stocks/ins/tispw: top insider sales past week
stocks/ins/tispm: top insider sales past month
stocks/ins/_ticker: Ticker
stocks/ins/_last_insiders: Last Insiders
stocks/ins/_top_insiders: Top Insiders
stocks/gov/_explore: Explore
stocks/gov/lasttrades: last trades
stocks/gov/topbuys: show most purchased stocks

View File

@@ -0,0 +1,220 @@
"""Feature Flags Controller Module"""
__docformat__ = "numpy"
# IMPORTATION STANDARD
import logging
from typing import List
# IMPORTATION THIRDPARTY
from dotenv import set_key
from prompt_toolkit.completion import NestedCompleter
# IMPORTATION INTERNAL
from openbb_terminal import feature_flags as obbff
from openbb_terminal.decorators import log_start_end
from openbb_terminal.menu import session
from openbb_terminal.parent_classes import BaseController
from openbb_terminal.rich_config import console, MenuText
# pylint: disable=too-many-lines,no-member,too-many-public-methods,C0302
# pylint:disable=import-outside-toplevel
logger = logging.getLogger(__name__)
class FeatureFlagsController(BaseController):
"""Feature Flags Controller class"""
CHOICES_COMMANDS: List[str] = [
"logcollection",
"tab",
"cls",
"color",
"ion",
"watermark",
"cmdloc",
"promptkit",
"predict",
"thoughts",
"reporthtml",
"exithelp",
"rcontext",
"rich",
"richpanel",
]
PATH = "/featflags/"
def __init__(self, queue: List[str] = None):
"""Constructor"""
super().__init__(queue)
if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
self.completer = NestedCompleter.from_nested_dict(choices)
def print_help(self):
"""Print help"""
mt = MenuText("featflags/")
mt.add_info("_info_")
mt.add_raw("\n")
mt.add_setting("logcollection", obbff.LOG_COLLECTION)
mt.add_setting("tab", obbff.USE_TABULATE_DF)
mt.add_setting("cls", obbff.USE_CLEAR_AFTER_CMD)
mt.add_setting("color", obbff.USE_COLOR)
mt.add_setting("promptkit", obbff.USE_PROMPT_TOOLKIT)
mt.add_setting("predict", obbff.ENABLE_PREDICT)
mt.add_setting("thoughts", obbff.ENABLE_THOUGHTS_DAY)
mt.add_setting("reporthtml", obbff.OPEN_REPORT_AS_HTML)
mt.add_setting("exithelp", obbff.ENABLE_EXIT_AUTO_HELP)
mt.add_setting("rcontext", obbff.REMEMBER_CONTEXTS)
mt.add_setting("rich", obbff.ENABLE_RICH)
mt.add_setting("richpanel", obbff.ENABLE_RICH_PANEL)
mt.add_setting("ion", obbff.USE_ION)
mt.add_setting("watermark", obbff.USE_WATERMARK)
mt.add_setting("cmdloc", obbff.USE_CMD_LOCATION_FIGURE)
console.print(text=mt.menu_text, menu="Feature Flags")
@log_start_end(log=logger)
def call_logcollection(self, _):
"""Process logcollection command"""
obbff.LOG_COLLECTION = not obbff.LOG_COLLECTION
set_key(obbff.ENV_FILE, "OPENBB_LOG_COLLECTION", str(obbff.LOG_COLLECTION))
console.print("")
@log_start_end(log=logger)
def call_tab(self, _):
"""Process tab command"""
obbff.USE_TABULATE_DF = not obbff.USE_TABULATE_DF
set_key(obbff.ENV_FILE, "OPENBB_USE_TABULATE_DF", str(obbff.USE_TABULATE_DF))
console.print("")
@log_start_end(log=logger)
def call_cls(self, _):
"""Process cls command"""
obbff.USE_CLEAR_AFTER_CMD = not obbff.USE_CLEAR_AFTER_CMD
set_key(
obbff.ENV_FILE,
"OPENBB_USE_CLEAR_AFTER_CMD",
str(obbff.USE_CLEAR_AFTER_CMD),
)
console.print("")
@log_start_end(log=logger)
def call_color(self, _):
"""Process color command"""
obbff.USE_COLOR = not obbff.USE_COLOR
set_key(obbff.ENV_FILE, "OPENBB_USE_COLOR", str(obbff.USE_COLOR))
console.print("")
@log_start_end(log=logger)
def call_promptkit(self, _):
"""Process promptkit command"""
obbff.USE_PROMPT_TOOLKIT = not obbff.USE_PROMPT_TOOLKIT
set_key(
obbff.ENV_FILE,
"OPENBB_USE_PROMPT_TOOLKIT",
str(obbff.USE_PROMPT_TOOLKIT),
)
console.print("")
@log_start_end(log=logger)
def call_predict(self, _):
"""Process predict command"""
obbff.ENABLE_PREDICT = not obbff.ENABLE_PREDICT
set_key(obbff.ENV_FILE, "OPENBB_ENABLE_PREDICT", str(obbff.ENABLE_PREDICT))
console.print("")
@log_start_end(log=logger)
def call_thoughts(self, _):
"""Process thoughts command"""
obbff.ENABLE_THOUGHTS_DAY = not obbff.ENABLE_THOUGHTS_DAY
set_key(
obbff.ENV_FILE,
"OPENBB_ENABLE_THOUGHTS_DAY",
str(obbff.ENABLE_THOUGHTS_DAY),
)
console.print("")
@log_start_end(log=logger)
def call_reporthtml(self, _):
"""Process reporthtml command"""
obbff.OPEN_REPORT_AS_HTML = not obbff.OPEN_REPORT_AS_HTML
set_key(
obbff.ENV_FILE,
"OPENBB_OPEN_REPORT_AS_HTML",
str(obbff.OPEN_REPORT_AS_HTML),
)
console.print("")
@log_start_end(log=logger)
def call_exithelp(self, _):
"""Process exithelp command"""
obbff.ENABLE_EXIT_AUTO_HELP = not obbff.ENABLE_EXIT_AUTO_HELP
set_key(
obbff.ENV_FILE,
"OPENBB_ENABLE_EXIT_AUTO_HELP",
str(obbff.ENABLE_EXIT_AUTO_HELP),
)
console.print("")
@log_start_end(log=logger)
def call_rcontext(self, _):
"""Process rcontext command"""
obbff.REMEMBER_CONTEXTS = not obbff.REMEMBER_CONTEXTS
set_key(
obbff.ENV_FILE,
"OPENBB_REMEMBER_CONTEXTS",
str(obbff.REMEMBER_CONTEXTS),
)
console.print("")
@log_start_end(log=logger)
def call_dt(self, _):
"""Process dt command"""
obbff.USE_DATETIME = not obbff.USE_DATETIME
set_key(obbff.ENV_FILE, "OPENBB_USE_DATETIME", str(obbff.USE_DATETIME))
console.print("")
@log_start_end(log=logger)
def call_rich(self, _):
"""Process rich command"""
obbff.ENABLE_RICH = not obbff.ENABLE_RICH
set_key(obbff.ENV_FILE, "OPENBB_ENABLE_RICH", str(obbff.ENABLE_RICH))
console.print("")
@log_start_end(log=logger)
def call_richpanel(self, _):
"""Process richpanel command"""
obbff.ENABLE_RICH_PANEL = not obbff.ENABLE_RICH_PANEL
set_key(
obbff.ENV_FILE,
"OPENBB_ENABLE_RICH_PANEL",
str(obbff.ENABLE_RICH_PANEL),
)
console.print("")
@log_start_end(log=logger)
def call_ion(self, _):
"""Process ion command"""
obbff.USE_ION = not obbff.USE_ION
set_key(obbff.ENV_FILE, "OPENBB_USE_ION", str(obbff.USE_ION))
console.print("")
@log_start_end(log=logger)
def call_watermark(self, _):
"""Process watermark command"""
obbff.USE_WATERMARK = not obbff.USE_WATERMARK
set_key(obbff.ENV_FILE, "OPENBB_USE_WATERMARK", str(obbff.USE_WATERMARK))
console.print("")
@log_start_end(log=logger)
def call_cmdloc(self, _):
"""Process cmdloc command"""
obbff.USE_CMD_LOCATION_FIGURE = not obbff.USE_CMD_LOCATION_FIGURE
set_key(
obbff.ENV_FILE,
"OPENBB_USE_CMD_LOCATION_FIGURE",
str(obbff.USE_CMD_LOCATION_FIGURE),
)
console.print("")

View File

@@ -6,6 +6,7 @@ import os
import argparse
import logging
from typing import List
import pytz
# IMPORTATION THIRDPARTY
from dotenv import set_key
@@ -15,7 +16,13 @@ from prompt_toolkit.completion import NestedCompleter
from openbb_terminal import config_plot as cfg_plot
from openbb_terminal import feature_flags as obbff
from openbb_terminal.decorators import log_start_end
from openbb_terminal.helper_funcs import get_flair, parse_known_args_and_warn
from openbb_terminal.helper_funcs import (
get_flair,
parse_known_args_and_warn,
get_user_timezone_or_invalid,
replace_user_timezone,
set_export_folder,
)
from openbb_terminal.menu import session
from openbb_terminal.parent_classes import BaseController
from openbb_terminal.rich_config import console, MenuText
@@ -30,24 +37,8 @@ class SettingsController(BaseController):
"""Settings Controller class"""
CHOICES_COMMANDS: List[str] = [
"logcollection",
"tab",
"cls",
"color",
"flair",
"dt",
"ion",
"watermark",
"cmdloc",
"promptkit",
"predict",
"autoscaling",
"thoughts",
"reporthtml",
"exithelp",
"rcontext",
"rich",
"richpanel",
"dpi",
"backend",
"height",
@@ -56,162 +47,87 @@ class SettingsController(BaseController):
"pwidth",
"monitor",
"lang",
"tz",
"export",
]
PATH = "/settings/"
def __init__(self, queue: List[str] = None):
all_timezones = [tz.replace("/", "_") for tz in pytz.all_timezones]
languages_i18n = os.path.join(
os.path.dirname(os.path.abspath(os.path.dirname(__file__))), "i18n"
)
languages_available = [
lang.strip(".yml")
for lang in os.listdir(languages_i18n)
if lang.endswith(".yml")
]
def __init__(self, queue: List[str] = None, env_file: str = ".env"):
"""Constructor"""
super().__init__(queue)
self.env_file = env_file
if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
choices["tz"] = {c: None for c in self.all_timezones}
choices["lang"] = {c: None for c in self.languages_available}
self.completer = NestedCompleter.from_nested_dict(choices)
def print_help(self):
"""Print help"""
mt = MenuText("settings/")
mt.add_info("_feature_flags_")
mt.add_info("_info_")
mt.add_raw("\n")
mt.add_setting("logcollection", obbff.LOG_COLLECTION)
mt.add_setting("tab", obbff.USE_TABULATE_DF)
mt.add_setting("cls", obbff.USE_CLEAR_AFTER_CMD)
mt.add_setting("color", obbff.USE_COLOR)
mt.add_setting("promptkit", obbff.USE_PROMPT_TOOLKIT)
mt.add_setting("predict", obbff.ENABLE_PREDICT)
mt.add_setting("thoughts", obbff.ENABLE_THOUGHTS_DAY)
mt.add_setting("reporthtml", obbff.OPEN_REPORT_AS_HTML)
mt.add_setting("exithelp", obbff.ENABLE_EXIT_AUTO_HELP)
mt.add_setting("rcontext", obbff.REMEMBER_CONTEXTS)
mt.add_setting("rich", obbff.ENABLE_RICH)
mt.add_setting("richpanel", obbff.ENABLE_RICH_PANEL)
mt.add_setting("ion", obbff.USE_ION)
mt.add_setting("watermark", obbff.USE_WATERMARK)
mt.add_setting("cmdloc", obbff.USE_CMD_LOCATION_FIGURE)
mt.add_setting("autoscaling", obbff.USE_PLOT_AUTOSCALING)
mt.add_setting("dt", obbff.USE_DATETIME)
mt.add_raw("\n")
mt.add_cmd("flair")
mt.add_raw("\n")
mt.add_param("_flair", get_flair())
mt.add_raw("\n")
mt.add_cmd("lang")
mt.add_raw("\n")
mt.add_param("_language", obbff.USE_LANGUAGE)
mt.add_raw("\n")
mt.add_cmd("export")
mt.add_raw("\n")
mt.add_param(
"_export_folder",
obbff.EXPORT_FOLDER_PATH
if obbff.EXPORT_FOLDER_PATH
else "DEFAULT (folder: exports/)",
)
mt.add_raw("\n")
mt.add_cmd("tz")
mt.add_raw("\n")
mt.add_param("_timezone", get_user_timezone_or_invalid())
mt.add_raw("\n")
mt.add_setting("autoscaling", obbff.USE_PLOT_AUTOSCALING)
if obbff.USE_PLOT_AUTOSCALING:
mt.add_cmd("pheight")
mt.add_cmd("pwidth")
mt.add_raw("\n")
mt.add_param("_plot_height_pct", cfg_plot.PLOT_HEIGHT_PERCENTAGE, 16)
mt.add_param("_plot_width_pct", cfg_plot.PLOT_WIDTH_PERCENTAGE, 16)
else:
mt.add_cmd("height")
mt.add_cmd("width")
mt.add_raw("\n")
mt.add_param("_plot_height", cfg_plot.PLOT_HEIGHT, 12)
mt.add_param("_plot_width", cfg_plot.PLOT_WIDTH, 12)
mt.add_raw("\n")
mt.add_cmd("dpi")
mt.add_raw("\n")
mt.add_param("_dpi", cfg_plot.PLOT_DPI)
mt.add_raw("\n")
mt.add_cmd("backend")
mt.add_cmd("height", "", not obbff.USE_PLOT_AUTOSCALING)
mt.add_cmd("width", "", not obbff.USE_PLOT_AUTOSCALING)
mt.add_cmd("pheight", "", obbff.USE_PLOT_AUTOSCALING)
mt.add_cmd("pwidth", "", obbff.USE_PLOT_AUTOSCALING)
mt.add_raw("\n")
mt.add_param("_backend", cfg_plot.BACKEND)
mt.add_raw("\n")
mt.add_cmd("monitor")
mt.add_raw("\n")
mt.add_param("_dpi", cfg_plot.PLOT_DPI, 19)
mt.add_param("_backend", cfg_plot.BACKEND, 19)
if obbff.USE_PLOT_AUTOSCALING:
mt.add_param("_plot_height_pct", cfg_plot.PLOT_HEIGHT_PERCENTAGE, 19)
mt.add_param("_plot_width_pct", cfg_plot.PLOT_WIDTH_PERCENTAGE, 19)
else:
mt.add_param("_plot_height", cfg_plot.PLOT_HEIGHT, 19)
mt.add_param("_plot_width", cfg_plot.PLOT_WIDTH, 19)
mt.add_param("_monitor", cfg_plot.MONITOR, 19)
mt.add_param("_monitor", cfg_plot.MONITOR)
console.print(text=mt.menu_text, menu="Settings")
@log_start_end(log=logger)
def call_logcollection(self, _):
"""Process logcollection command"""
obbff.LOG_COLLECTION = not obbff.LOG_COLLECTION
set_key(obbff.ENV_FILE, "OPENBB_LOG_COLLECTION", str(obbff.LOG_COLLECTION))
console.print("")
@log_start_end(log=logger)
def call_tab(self, _):
"""Process tab command"""
obbff.USE_TABULATE_DF = not obbff.USE_TABULATE_DF
set_key(obbff.ENV_FILE, "OPENBB_USE_TABULATE_DF", str(obbff.USE_TABULATE_DF))
console.print("")
@log_start_end(log=logger)
def call_cls(self, _):
"""Process cls command"""
obbff.USE_CLEAR_AFTER_CMD = not obbff.USE_CLEAR_AFTER_CMD
set_key(
obbff.ENV_FILE,
"OPENBB_USE_CLEAR_AFTER_CMD",
str(obbff.USE_CLEAR_AFTER_CMD),
)
console.print("")
@log_start_end(log=logger)
def call_color(self, _):
"""Process color command"""
obbff.USE_COLOR = not obbff.USE_COLOR
set_key(obbff.ENV_FILE, "OPENBB_USE_COLOR", str(obbff.USE_COLOR))
console.print("")
@log_start_end(log=logger)
def call_promptkit(self, _):
"""Process promptkit command"""
obbff.USE_PROMPT_TOOLKIT = not obbff.USE_PROMPT_TOOLKIT
set_key(
obbff.ENV_FILE,
"OPENBB_USE_PROMPT_TOOLKIT",
str(obbff.USE_PROMPT_TOOLKIT),
)
console.print("")
@log_start_end(log=logger)
def call_predict(self, _):
"""Process predict command"""
obbff.ENABLE_PREDICT = not obbff.ENABLE_PREDICT
set_key(obbff.ENV_FILE, "OPENBB_ENABLE_PREDICT", str(obbff.ENABLE_PREDICT))
console.print("")
@log_start_end(log=logger)
def call_thoughts(self, _):
"""Process thoughts command"""
obbff.ENABLE_THOUGHTS_DAY = not obbff.ENABLE_THOUGHTS_DAY
set_key(
obbff.ENV_FILE,
"OPENBB_ENABLE_THOUGHTS_DAY",
str(obbff.ENABLE_THOUGHTS_DAY),
)
console.print("")
@log_start_end(log=logger)
def call_reporthtml(self, _):
"""Process reporthtml command"""
obbff.OPEN_REPORT_AS_HTML = not obbff.OPEN_REPORT_AS_HTML
set_key(
obbff.ENV_FILE,
"OPENBB_OPEN_REPORT_AS_HTML",
str(obbff.OPEN_REPORT_AS_HTML),
)
console.print("")
@log_start_end(log=logger)
def call_exithelp(self, _):
"""Process exithelp command"""
obbff.ENABLE_EXIT_AUTO_HELP = not obbff.ENABLE_EXIT_AUTO_HELP
set_key(
obbff.ENV_FILE,
"OPENBB_ENABLE_EXIT_AUTO_HELP",
str(obbff.ENABLE_EXIT_AUTO_HELP),
)
console.print("")
@log_start_end(log=logger)
def call_rcontext(self, _):
"""Process rcontext command"""
obbff.REMEMBER_CONTEXTS = not obbff.REMEMBER_CONTEXTS
set_key(
obbff.ENV_FILE,
"OPENBB_REMEMBER_CONTEXTS",
str(obbff.REMEMBER_CONTEXTS),
)
console.print("")
@log_start_end(log=logger)
def call_dt(self, _):
"""Process dt command"""
@@ -219,49 +135,6 @@ class SettingsController(BaseController):
set_key(obbff.ENV_FILE, "OPENBB_USE_DATETIME", str(obbff.USE_DATETIME))
console.print("")
@log_start_end(log=logger)
def call_rich(self, _):
"""Process rich command"""
obbff.ENABLE_RICH = not obbff.ENABLE_RICH
set_key(obbff.ENV_FILE, "OPENBB_ENABLE_RICH", str(obbff.ENABLE_RICH))
console.print("")
@log_start_end(log=logger)
def call_richpanel(self, _):
"""Process richpanel command"""
obbff.ENABLE_RICH_PANEL = not obbff.ENABLE_RICH_PANEL
set_key(
obbff.ENV_FILE,
"OPENBB_ENABLE_RICH_PANEL",
str(obbff.ENABLE_RICH_PANEL),
)
console.print("")
@log_start_end(log=logger)
def call_ion(self, _):
"""Process ion command"""
obbff.USE_ION = not obbff.USE_ION
set_key(obbff.ENV_FILE, "OPENBB_USE_ION", str(obbff.USE_ION))
console.print("")
@log_start_end(log=logger)
def call_watermark(self, _):
"""Process watermark command"""
obbff.USE_WATERMARK = not obbff.USE_WATERMARK
set_key(obbff.ENV_FILE, "OPENBB_USE_WATERMARK", str(obbff.USE_WATERMARK))
console.print("")
@log_start_end(log=logger)
def call_cmdloc(self, _):
"""Process cmdloc command"""
obbff.USE_CMD_LOCATION_FIGURE = not obbff.USE_CMD_LOCATION_FIGURE
set_key(
obbff.ENV_FILE,
"OPENBB_USE_CMD_LOCATION_FIGURE",
str(obbff.USE_CMD_LOCATION_FIGURE),
)
console.print("")
@log_start_end(log=logger)
def call_autoscaling(self, _):
"""Process autoscaling command"""
@@ -455,15 +328,6 @@ class SettingsController(BaseController):
@log_start_end(log=logger)
def call_lang(self, other_args: List[str]):
"""Process lang command"""
languages_i18n = os.path.join(
os.path.dirname(os.path.abspath(os.path.dirname(__file__))), "i18n"
)
languages_available = [
lang.strip(".yml")
for lang in os.listdir(languages_i18n)
if lang.endswith(".yml")
]
parser = argparse.ArgumentParser(
add_help=False,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
@@ -476,13 +340,134 @@ class SettingsController(BaseController):
type=str,
dest="value",
help="Language",
choices=languages_available,
required=True,
choices=self.languages_available,
default="",
)
if other_args and "-" not in other_args[0][0]:
other_args.insert(0, "-v")
ns_parser = parse_known_args_and_warn(parser, other_args)
if ns_parser:
set_key(obbff.ENV_FILE, "OPENBB_USE_LANGUAGE", str(ns_parser.value))
obbff.USE_LANGUAGE = ns_parser.value
if ns_parser.value:
set_key(obbff.ENV_FILE, "OPENBB_USE_LANGUAGE", str(ns_parser.value))
obbff.USE_LANGUAGE = ns_parser.value
else:
console.print(
f"Languages available: {', '.join(self.languages_available)}"
)
console.print("")
def call_tz(self, other_args: List[str]):
"""Process tz command"""
parser = argparse.ArgumentParser(
add_help=False,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
description="""
Setting a different timezone
""",
)
parser.add_argument(
"-t",
dest="timezone",
help="Choose timezone",
required="-h" not in other_args,
choices=self.all_timezones,
)
if other_args and "-t" not in other_args[0]:
other_args.insert(0, "-t")
ns_parser = parse_known_args_and_warn(parser, other_args)
if ns_parser:
if ns_parser.timezone:
replace_user_timezone(ns_parser.timezone.replace("_", "/", 1))
def call_export(self, other_args: List[str]):
"""Process export command"""
parser = argparse.ArgumentParser(
add_help=False,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
prog="export",
description="Select folder where to export data",
)
parser.add_argument(
"-f",
"--folder",
type=str,
dest="folder",
help="Folder where to export data. 'default' redirects to OpenBB Terminal 'exports'",
default="default",
)
if other_args and "-" not in other_args[0][0]:
other_args.insert(0, "-f")
ns_parser = parse_known_args_and_warn(parser, other_args)
if ns_parser:
if other_args or self.queue:
if other_args:
export_path = ""
else:
# Re-add the initial slash for an absolute directory provided
export_path = "/"
export_path += "/".join([ns_parser.folder] + self.queue)
self.queue = []
base_path = os.path.dirname(os.path.abspath(__file__))
default_path = os.path.join(base_path, "exports")
success_export = False
while not success_export:
if export_path.upper() == "DEFAULT":
console.print(
f"Export data to be saved in the default folder: '{default_path}'"
)
set_export_folder(self.env_file, path_folder="")
success_export = True
else:
# If the path selected does not start from the user root, give relative location from root
if export_path[0] == "~":
export_path = export_path.replace(
"~", os.path.expanduser("~")
)
elif export_path[0] != "/":
export_path = os.path.join(base_path, export_path)
# Check if the directory exists
if os.path.isdir(export_path):
console.print(
f"Export data to be saved in the selected folder: '{export_path}'"
)
set_export_folder(self.env_file, path_folder=export_path)
success_export = True
else:
console.print(
"[red]The path selected to export data does not exist![/red]\n"
)
user_opt = "None"
while user_opt not in ("Y", "N"):
user_opt = input(
f"Do you wish to create folder: `{export_path}` ? [Y/N]\n"
).upper()
if user_opt == "Y":
os.makedirs(export_path)
console.print(
f"[green]Folder '{export_path}' successfully created.[/green]"
)
set_export_folder(
self.env_file, path_folder=export_path
)
else:
# Do not update export_folder path since we will keep the same as before
path_display = (
obbff.EXPORT_FOLDER_PATH
if obbff.EXPORT_FOLDER_PATH
else "DEFAULT (folder: exports/)"
)
console.print(
"[yellow]Export data to keep being saved in"
+ f"the selected folder: {path_display}[/yellow]"
)
success_export = True
console.print()

View File

@@ -309,7 +309,7 @@ def print_insider_filter(
if not links:
l_chars = [list(chars) for chars in df_insider_orig["X"].values]
l_uchars = np.unique(list(itertools.chain(*l_chars)))
console.print("")
for char in l_uchars:
console.print(d_notes[char])
@@ -318,3 +318,5 @@ def print_insider_filter(
for tradetype in l_utradetype:
console.print(d_trade_types[tradetype])
console.print("")

View File

@@ -1 +1 @@
US/Eastern
America/New_York

View File

@@ -10,7 +10,6 @@ import platform
import sys
from typing import List
from pathlib import Path
import pytz
import dotenv
from prompt_toolkit.completion import NestedCompleter
@@ -20,10 +19,7 @@ from openbb_terminal import feature_flags as obbff
from openbb_terminal.helper_funcs import (
check_path,
get_flair,
get_user_timezone_or_invalid,
parse_known_args_and_warn,
replace_user_timezone,
set_export_folder,
)
from openbb_terminal.loggers import setup_logging
from openbb_terminal.menu import session
@@ -56,9 +52,8 @@ class TerminalController(BaseController):
"about",
"keys",
"settings",
"tz",
"featflags",
"exe",
"export",
]
CHOICES_MENUS = [
"stocks",
@@ -76,15 +71,12 @@ class TerminalController(BaseController):
PATH = "/"
all_timezones = [tz.replace("/", "-") for tz in pytz.all_timezones]
def __init__(self, jobs_cmds: List[str] = None):
"""Constructor"""
super().__init__(jobs_cmds)
if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
choices["tz"] = {c: None for c in self.all_timezones}
choices["support"] = self.SUPPORT_CHOICES
self.completer = NestedCompleter.from_nested_dict(choices)
@@ -105,26 +97,20 @@ class TerminalController(BaseController):
mt.add_cmd("quit")
mt.add_cmd("exit")
mt.add_cmd("reset")
mt.add_raw("\n")
mt.add_cmd("resources")
mt.add_cmd("update")
mt.add_cmd("about")
mt.add_cmd("support")
mt.add_raw("\n")
mt.add_cmd("about")
mt.add_cmd("update")
mt.add_cmd("tz")
mt.add_cmd("export")
mt.add_cmd("exe")
mt.add_menu("settings")
mt.add_info("_configure_")
mt.add_menu("keys")
mt.add_menu("featflags")
mt.add_menu("settings")
mt.add_raw("\n")
mt.add_param(
"_export_folder",
obbff.EXPORT_FOLDER_PATH
if obbff.EXPORT_FOLDER_PATH
else "DEFAULT (folder: exports/)",
14,
)
mt.add_param("_timezone", get_user_timezone_or_invalid(), 14)
mt.add_cmd("exe")
mt.add_raw("\n")
mt.add_info("_main_menu_")
mt.add_menu("stocks")
mt.add_menu("crypto")
mt.add_menu("etf")
@@ -156,6 +142,12 @@ class TerminalController(BaseController):
self.queue = self.load_class(SettingsController, self.queue)
def call_featflags(self, _):
"""Process feature flags command"""
from openbb_terminal.featflags_controller import FeatureFlagsController
self.queue = self.load_class(FeatureFlagsController, self.queue)
def call_about(self, _):
"""Process about command"""
about_us()
@@ -250,101 +242,6 @@ class TerminalController(BaseController):
self.queue = self.load_class(PortfolioController, self.queue)
def call_tz(self, other_args: List[str]):
"""Process tz command"""
tz_parser = argparse.ArgumentParser(
add_help=False,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
description="""
Setting a different timezone
""",
)
tz_parser.add_argument(
"-t",
dest="timezone",
help="Choose timezone",
required="-h" not in other_args,
choices=self.all_timezones,
)
if other_args and "-t" not in other_args[0]:
other_args.insert(0, "-t")
tz_ns_parser = parse_known_args_and_warn(tz_parser, other_args)
if tz_ns_parser:
if tz_ns_parser.timezone:
replace_user_timezone(tz_ns_parser.timezone.replace("-", "/"))
def call_export(self, other_args: List[str]):
"""Process export command"""
if other_args or self.queue:
if other_args:
export_path = ""
else:
# Re-add the initial slash for an absolute directory provided
export_path = "/"
other_args += self.queue
self.queue = []
export_path += "/".join(other_args)
base_path = os.path.dirname(os.path.abspath(__file__))
default_path = os.path.join(base_path, "exports")
success_export = False
while not success_export:
if export_path.upper() == "DEFAULT":
console.print(
f"Export data to be saved in the default folder: '{default_path}'"
)
set_export_folder(env_file, path_folder="")
success_export = True
else:
# If the path selected does not start from the user root, give relative location from terminal root
if export_path[0] == "~":
export_path = export_path.replace("~", os.path.expanduser("~"))
elif export_path[0] != "/":
export_path = os.path.join(base_path, export_path)
# Check if the directory exists
if os.path.isdir(export_path):
console.print(
f"Export data to be saved in the selected folder: '{export_path}'"
)
set_export_folder(env_file, path_folder=export_path)
success_export = True
else:
console.print(
"[red]The path selected to export data does not exist![/red]\n"
)
user_opt = "None"
while user_opt not in ("Y", "N"):
user_opt = input(
f"Do you wish to create folder: `{export_path}` ? [Y/N]\n"
).upper()
if user_opt == "Y":
os.makedirs(export_path)
console.print(
f"[green]Folder '{export_path}' successfully created.[/green]"
)
set_export_folder(env_file, path_folder=export_path)
else:
# Do not update export_folder path since we will keep the same as before
path_display = (
obbff.EXPORT_FOLDER_PATH
if obbff.EXPORT_FOLDER_PATH
else "DEFAULT (folder: exports/)"
)
console.print(
"[yellow]Export data to keep being saved in"
+ f"the selected folder: {path_display}[/yellow]"
)
success_export = True
console.print()
def call_exe(self, other_args: List[str]):
"""Process exe command"""
# Merge rest of string path to other_args and remove queue since it is a dir

View File

@@ -15,377 +15,387 @@ interactions:
response:
body:
string: !!binary |
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
AyyuP+HfYTzy4If/C+/kNz016QEA
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
headers:
Accept-Ranges:
- bytes
@@ -394,17 +404,17 @@ interactions:
Content-Encoding:
- gzip
Content-Length:
- '21111'
- '21716'
Content-Type:
- text/html
Date:
- Sat, 21 May 2022 14:38:18 GMT
- Wed, 25 May 2022 00:15:16 GMT
ETag:
- '"1e935-5df7bfab5e472-gzip"'
- '"1eaf2-5dfcaf78521cc-gzip"'
Keep-Alive:
- timeout=5, max=10
Last-Modified:
- Sat, 21 May 2022 02:01:03 GMT
- Wed, 25 May 2022 00:15:12 GMT
Server:
- Apache/2.4.41 (Ubuntu)
Vary:

View File

@@ -166,7 +166,7 @@ interactions:
Content-Type:
- text/html; charset=UTF-8
Date:
- Sat, 21 May 2022 14:38:18 GMT
- Wed, 25 May 2022 00:15:15 GMT
Keep-Alive:
- timeout=5, max=10
Server:

View File

@@ -6,13 +6,13 @@ Preset: whales
filter filter insiders based on preset [Open Insider]
stocks/ins/_ticker:
Ticker:
[unvl] stats insider stats of the company[/unvl] [Open Insider]
[unvl] act insider activity over time[/unvl] [Business Insider]
[unvl] lins last insider trading of the company[/unvl] [Finviz]
stocks/ins/_last_insiders:
Last Insiders:
lcb latest cluster boys [Open Insider]
lpsb latest penny stock buys [Open Insider]
lit latest insider trading (all filings) [Open Insider]
@@ -24,7 +24,7 @@ stocks/ins/_last_insiders:
blis big latest insider sales ($100k+) [Open Insider]
blos big latest officer sales ($100k+) [Open Insider]
blcs big latest CEO/CFO sales ($100k+) [Open Insider]
stocks/ins/_top_insiders:
Top Insiders:
topt top officer purchases today [Open Insider]
toppw top officer purchases past week [Open Insider]
toppm top officer purchases past month [Open Insider]

View File

@@ -4,6 +4,6 @@
2 [red][/red] [red]2022-02-17[/red] [red]PM[/red] [red]Olczak Jacek[/red] [red]CEO[/red] [red]$111.31[/red] [red]-40,000[/red] [red]326,907[/red] [red]-11%[/red] [red]-$4,452,308[/red]
3 [red][/red] [red]2022-02-17[/red] [red]PM[/red] [red]Calantzopoulos Andre[/red] [red]Exec. COB[/red] [red]$110.69[/red] [red]-75,000[/red] [red]935,380[/red] [red]-7%[/red] [red]-$8,301,750[/red]
4 [red][/red] [red]2021-07-27[/red] [red]PM[/red] [red]King Martin G.[/red] [red]CEO, PMI America[/red] [red]$100.18[/red] [red]-21,725[/red] [red]128,484[/red] [red]-14%[/red] [red]-$2,176,482[/red]
M: Multiple transactions in filing; earliest reported transaction date & weighted average transaction price
[red]S - Sale: Sale of securities on an exchange or to another person[/red]

View File

@@ -0,0 +1,81 @@
import pytest
from openbb_terminal.featflags_controller import FeatureFlagsController
# pylint: disable=W0621
@pytest.fixture()
def controller(mocker):
mocker.patch(
"openbb_terminal.featflags_controller.obbff.USE_PROMPT_TOOLKIT",
True,
)
mocker.patch("openbb_terminal.featflags_controller.session", True)
mocker.patch("openbb_terminal.featflags_controller.set_key")
mocker.patch("openbb_terminal.featflags_controller.obbff")
return FeatureFlagsController()
def test_print_help(controller):
controller.print_help()
def test_call_logcollection(controller):
controller.call_logcollection(None)
def test_call_tab(controller):
controller.call_tab(None)
def test_call_cls(controller):
controller.call_cls(None)
def test_call_color(controller):
controller.call_color(None)
def test_call_promptkit(controller):
controller.call_promptkit(None)
def test_call_predict(controller):
controller.call_predict(None)
def test_call_thoughts(controller):
controller.call_thoughts(None)
def test_call_reporthtml(controller):
controller.call_reporthtml(None)
def test_call_exithelp(controller):
controller.call_exithelp(None)
def test_call_rcontext(controller):
controller.call_rcontext(None)
def test_call_rich(controller):
controller.call_rich(None)
def test_call_richpanel(controller):
controller.call_richpanel(None)
def test_call_ion(controller):
controller.call_ion(None)
def test_call_watermark(controller):
controller.call_watermark(None)
def test_call_cmdloc(controller):
controller.call_cmdloc(None)

View File

@@ -21,70 +21,10 @@ def test_print_help(controller):
controller.print_help()
def test_call_logcollection(controller):
controller.call_logcollection(None)
def test_call_tab(controller):
controller.call_tab(None)
def test_call_cls(controller):
controller.call_cls(None)
def test_call_color(controller):
controller.call_color(None)
def test_call_promptkit(controller):
controller.call_promptkit(None)
def test_call_predict(controller):
controller.call_predict(None)
def test_call_thoughts(controller):
controller.call_thoughts(None)
def test_call_reporthtml(controller):
controller.call_reporthtml(None)
def test_call_exithelp(controller):
controller.call_exithelp(None)
def test_call_rcontext(controller):
controller.call_rcontext(None)
def test_call_dt(controller):
controller.call_dt(None)
def test_call_rich(controller):
controller.call_rich(None)
def test_call_richpanel(controller):
controller.call_richpanel(None)
def test_call_ion(controller):
controller.call_ion(None)
def test_call_watermark(controller):
controller.call_watermark(None)
def test_call_cmdloc(controller):
controller.call_cmdloc(None)
def test_call_autoscaling(controller):
controller.call_autoscaling(None)