From 80b3c01988cda399ec7b7a1bec9cf5c8cd43a8b0 Mon Sep 17 00:00:00 2001 From: "didierlopes.eth" Date: Wed, 25 May 2022 03:11:40 +0100 Subject: [PATCH] Refactor main menu to have: Settings and Feature Flags menus (#1864) --- .github/workflows/test.yml | 2 +- .pre-commit-config.yaml | 2 +- i18n/README.md | 0 i18n/en.yml | 48 +- openbb_terminal/featflags_controller.py | 220 +++++ openbb_terminal/settings_controller.py | 385 +++++---- .../stocks/insider/openinsider_view.py | 4 +- openbb_terminal/timezone.openbb | 2 +- terminal.py | 133 +-- .../test_print_insider_data.yaml | 760 +++++++++--------- .../test_print_insider_filter.yaml | 2 +- .../test_print_help.txt | 6 +- .../test_print_insider_filter.txt | 2 +- .../test_featflags_controller.py | 81 ++ .../test_settings_controller.py | 60 -- 15 files changed, 924 insertions(+), 783 deletions(-) delete mode 100644 i18n/README.md create mode 100644 openbb_terminal/featflags_controller.py create mode 100644 tests/openbb_terminal/test_featflags_controller.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 75eb1024d58..c2e13a2d2cb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -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 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c14eb07fa1e..19617713300 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -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 diff --git a/i18n/README.md b/i18n/README.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/i18n/en.yml b/i18n/en.yml index de1ae9ce310..f95d04086b2 100644 --- a/i18n/en.yml +++ b/i18n/en.yml @@ -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 diff --git a/openbb_terminal/featflags_controller.py b/openbb_terminal/featflags_controller.py new file mode 100644 index 00000000000..e13c322b1d2 --- /dev/null +++ b/openbb_terminal/featflags_controller.py @@ -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("") diff --git a/openbb_terminal/settings_controller.py b/openbb_terminal/settings_controller.py index 16926b68de1..0904cc0169d 100644 --- a/openbb_terminal/settings_controller.py +++ b/openbb_terminal/settings_controller.py @@ -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() diff --git a/openbb_terminal/stocks/insider/openinsider_view.py b/openbb_terminal/stocks/insider/openinsider_view.py index 49cd2b4f18b..2ba46339bf7 100644 --- a/openbb_terminal/stocks/insider/openinsider_view.py +++ b/openbb_terminal/stocks/insider/openinsider_view.py @@ -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("") diff --git a/openbb_terminal/timezone.openbb b/openbb_terminal/timezone.openbb index b8d5363be0d..27f725e7757 100644 --- a/openbb_terminal/timezone.openbb +++ b/openbb_terminal/timezone.openbb @@ -1 +1 @@ -US/Eastern \ No newline at end of file +America/New_York \ No newline at end of file diff --git a/terminal.py b/terminal.py index 67de3c94519..2a7d02e0c6f 100644 --- a/terminal.py +++ b/terminal.py @@ -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 diff --git a/tests/openbb_terminal/stocks/insider/cassettes/test_openinsider_view/test_print_insider_data.yaml b/tests/openbb_terminal/stocks/insider/cassettes/test_openinsider_view/test_print_insider_data.yaml index e4280a457a8..69a13f24a8b 100644 --- a/tests/openbb_terminal/stocks/insider/cassettes/test_openinsider_view/test_print_insider_data.yaml +++ b/tests/openbb_terminal/stocks/insider/cassettes/test_openinsider_view/test_print_insider_data.yaml @@ -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: diff --git a/tests/openbb_terminal/stocks/insider/cassettes/test_openinsider_view/test_print_insider_filter.yaml b/tests/openbb_terminal/stocks/insider/cassettes/test_openinsider_view/test_print_insider_filter.yaml index 419ed0119ab..0bbf3277f27 100644 --- a/tests/openbb_terminal/stocks/insider/cassettes/test_openinsider_view/test_print_insider_filter.yaml +++ b/tests/openbb_terminal/stocks/insider/cassettes/test_openinsider_view/test_print_insider_filter.yaml @@ -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: diff --git a/tests/openbb_terminal/stocks/insider/txt/test_insider_controller/test_print_help.txt b/tests/openbb_terminal/stocks/insider/txt/test_insider_controller/test_print_help.txt index 3933d766b7c..9c71be5d206 100644 --- a/tests/openbb_terminal/stocks/insider/txt/test_insider_controller/test_print_help.txt +++ b/tests/openbb_terminal/stocks/insider/txt/test_insider_controller/test_print_help.txt @@ -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] diff --git a/tests/openbb_terminal/stocks/insider/txt/test_openinsider_view/test_print_insider_filter.txt b/tests/openbb_terminal/stocks/insider/txt/test_openinsider_view/test_print_insider_filter.txt index b03fa09b600..a613fb884ac 100644 --- a/tests/openbb_terminal/stocks/insider/txt/test_openinsider_view/test_print_insider_filter.txt +++ b/tests/openbb_terminal/stocks/insider/txt/test_openinsider_view/test_print_insider_filter.txt @@ -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] + diff --git a/tests/openbb_terminal/test_featflags_controller.py b/tests/openbb_terminal/test_featflags_controller.py new file mode 100644 index 00000000000..0215f616e9e --- /dev/null +++ b/tests/openbb_terminal/test_featflags_controller.py @@ -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) diff --git a/tests/openbb_terminal/test_settings_controller.py b/tests/openbb_terminal/test_settings_controller.py index 669ab039e55..16c19e1fcf3 100644 --- a/tests/openbb_terminal/test_settings_controller.py +++ b/tests/openbb_terminal/test_settings_controller.py @@ -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)