From 4efc50076a91b0de711bcd3d3c6d1ca5d70621f3 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Thu, 27 Jul 2023 17:21:21 +0100 Subject: [PATCH] first iteration with a more generic class that only translates all methods once --- .../argparse_class_processor.py | 54 +++++++++++++++++++ argparse_translator/argparse_translator.py | 2 +- openbb_terminal/stocks/stocks_controller.py | 12 +++-- terminal.py | 4 ++ 4 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 argparse_translator/argparse_class_processor.py diff --git a/argparse_translator/argparse_class_processor.py b/argparse_translator/argparse_class_processor.py new file mode 100644 index 00000000000..1b9025b8e79 --- /dev/null +++ b/argparse_translator/argparse_class_processor.py @@ -0,0 +1,54 @@ +import inspect +from typing import Type + +from argparse_translator.argparse_translator import ArgparseTranslator + + +class ArgparseClassProcessor: + """ + Process a target class to create ArgparseTranslators for its methods. + """ + + def __init__(self, target_class: Type, menu_designation: str): + """ + Initialize the ArgparseClassProcessor. + + Parameters + ---------- + target_class : Type + The target class whose methods will be processed. + menu_designation : str + The designation for the menu level associated with the target class. + """ + self._target_class = target_class + self._menu_designation = menu_designation + self._translators = {self._menu_designation: {}} + + self._process_methods() + + def _process_methods(self): + """ + Process the methods of the target class to create ArgparseTranslators. + """ + for name, method in inspect.getmembers(self._target_class, inspect.ismethod): + if name.startswith("__"): + continue + self._translators[self._menu_designation][name] = ArgparseTranslator(method) + + def get_translator(self, menu: str, command: str) -> ArgparseTranslator: + """ + Retrieve the ArgparseTranslator object associated with a specific menu and command. + + Parameters + ---------- + menu : str + The menu designation. + command : str + The command associated with the ArgparseTranslator. + + Returns + ------- + ArgparseTranslator + The ArgparseTranslator associated with the specified menu and command. + """ + return self._translators[menu][command] diff --git a/argparse_translator/argparse_translator.py b/argparse_translator/argparse_translator.py index 51255a687d5..708f24ae58d 100644 --- a/argparse_translator/argparse_translator.py +++ b/argparse_translator/argparse_translator.py @@ -190,7 +190,7 @@ class ArgparseTranslator: kwargs["choices"] = choices if param_type == bool: - # store_true action does not accept the bellow kwargs + # store_true action does not accept the below kwargs kwargs.pop("type") kwargs.pop("nargs") diff --git a/openbb_terminal/stocks/stocks_controller.py b/openbb_terminal/stocks/stocks_controller.py index 759dc9a99c4..21c602f1df9 100644 --- a/openbb_terminal/stocks/stocks_controller.py +++ b/openbb_terminal/stocks/stocks_controller.py @@ -9,7 +9,7 @@ from typing import List, Optional import financedatabase as fd -from argparse_translator.argparse_translator import ArgparseTranslator +from argparse_translator.argparse_class_processor import ArgparseClassProcessor # pylint: disable=R1710,import-outside-toplevel,R0913,R1702,no-member from openbb_sdk.openbb import obb @@ -37,6 +37,8 @@ from openbb_terminal.terminal_helper import suppress_stdout logger = logging.getLogger(__name__) +stocks_translations = ArgparseClassProcessor(obb.stocks, "stocks") + class StocksController(StockBaseController): """Stocks Controller class.""" @@ -155,7 +157,7 @@ class StocksController(StockBaseController): def call_load(self, other_args: List[str]): """Process load command.""" - translator = ArgparseTranslator(func=obb.stocks.load, add_help=False) + translator = stocks_translations.get_translator(menu="stocks", command="load") parser = translator.parser if ns_parser := self.parse_known_args_and_warn(parser, other_args): @@ -167,14 +169,14 @@ class StocksController(StockBaseController): self.ticker = ns_parser.symbol self.stock = c_out.to_dataframe() - # TODO : temporary workarround + # TODO : temporary workaround # core gives all columns lower case and terminal expects 1st letter upper case # upper case first letter of all columns self.stock.columns = [ x[0].upper() + x[1:] for x in self.stock.columns.tolist() ] - - c_out.show() + if ns_parser.chart: + c_out.show() @log_start_end(log=logger) def call_search(self, other_args: List[str]): diff --git a/terminal.py b/terminal.py index dd0977a5f62..3499d19c0ba 100644 --- a/terminal.py +++ b/terminal.py @@ -1,6 +1,10 @@ import sys from multiprocessing import freeze_support +# TODO : importing the sdk-core here trying to get the obb object to be available +# so it doesn't take a lot when accessing a menu for the first time +# is it good or is it bad? +from openbb_sdk.openbb import obb import openbb_terminal.config_terminal as cfg # pylint:disable=unused-import,import-outside-toplevel