diff --git a/openbb_terminal/api.py b/openbb_terminal/api.py index 8b969912c3b..6fb0e21dfbf 100644 --- a/openbb_terminal/api.py +++ b/openbb_terminal/api.py @@ -1942,6 +1942,8 @@ functions = { "keys.eodhd": {"model": "openbb_terminal.keys_model.set_eodhd_key"}, "keys.santiment": {"model": "openbb_terminal.keys_model.set_santiment_key"}, "keys.mykeys": {"model": "openbb_terminal.keys_model.get_keys"}, + "keys.set_keys": {"model": "openbb_terminal.keys_model.set_keys"}, + "keys.get_keys_info": {"model": "openbb_terminal.keys_model.get_keys_info"}, } forecast_extras = { "forecast.load": {"model": "openbb_terminal.forecast.forecast_model.load"}, diff --git a/openbb_terminal/keys_controller.py b/openbb_terminal/keys_controller.py index d3cd09ee284..d8b35d21ba9 100644 --- a/openbb_terminal/keys_controller.py +++ b/openbb_terminal/keys_controller.py @@ -28,37 +28,7 @@ logger = logging.getLogger(__name__) class KeysController(BaseController): # pylint: disable=too-many-public-methods """Keys Controller class""" - API_DICT: Dict = { - "av": "ALPHA_VANTAGE", - "fmp": "FINANCIAL_MODELING_PREP", - "quandl": "QUANDL", - "polygon": "POLYGON", - "fred": "FRED", - "news": "NEWSAPI", - "tradier": "TRADIER", - "cmc": "COINMARKETCAP", - "finnhub": "FINNHUB", - "iex": "IEXCLOUD", - "reddit": "REDDIT", - "twitter": "TWITTER", - "rh": "ROBINHOOD", - "degiro": "DEGIRO", - "oanda": "OANDA", - "binance": "BINANCE", - "bitquery": "BITQUERY", - "si": "SENTIMENT_INVESTOR", - "coinbase": "COINBASE", - "walert": "WHALE_ALERT", - "glassnode": "GLASSNODE", - "coinglass": "COINGLASS", - "cpanic": "CRYPTO_PANIC", - "ethplorer": "ETHPLORER", - "smartstake": "SMARTSTAKE", - "github": "GITHUB", - "messari": "MESSARI", - "eodhd": "EODHD", - "santiment": "SANTIMENT", - } + API_DICT = keys_model.API_DICT API_LIST = list(API_DICT.keys()) CHOICES_COMMANDS: List[str] = ["mykeys"] + API_LIST PATH = "/keys/" diff --git a/openbb_terminal/keys_model.py b/openbb_terminal/keys_model.py index 5e8437ce9b1..361efc85151 100644 --- a/openbb_terminal/keys_model.py +++ b/openbb_terminal/keys_model.py @@ -7,6 +7,8 @@ import sys import logging import os from enum import Enum + +from typing import Dict, List, Union import binance import dotenv import pandas as pd @@ -35,6 +37,39 @@ logger = logging.getLogger(__name__) sys.tracebacklimit = 0 +API_DICT: Dict = { + "av": "ALPHA_VANTAGE", + "fmp": "FINANCIAL_MODELING_PREP", + "quandl": "QUANDL", + "polygon": "POLYGON", + "fred": "FRED", + "news": "NEWSAPI", + "tradier": "TRADIER", + "cmc": "COINMARKETCAP", + "finnhub": "FINNHUB", + "iex": "IEXCLOUD", + "reddit": "REDDIT", + "twitter": "TWITTER", + "rh": "ROBINHOOD", + "degiro": "DEGIRO", + "oanda": "OANDA", + "binance": "BINANCE", + "bitquery": "BITQUERY", + "si": "SENTIMENT_INVESTOR", + "coinbase": "COINBASE", + "walert": "WHALE_ALERT", + "glassnode": "GLASSNODE", + "coinglass": "COINGLASS", + "cpanic": "CRYPTO_PANIC", + "ethplorer": "ETHPLORER", + "smartstake": "SMARTSTAKE", + "github": "GITHUB", + "messari": "MESSARI", + "eodhd": "EODHD", + "santiment": "SANTIMENT", +} + + class KeyStatus(str, Enum): """Class to handle status messages and colors""" @@ -62,6 +97,82 @@ class KeyStatus(str, Enum): return f"[{c}]{self.value}[/{c}]" +def set_keys( + keys_dict: Dict[str, Dict[str, Union[str, bool]]], + persist: bool = False, + show_output: bool = False, +) -> Dict: + """Set API keys in bundle. + + Parameters + ---------- + keys_dict: Dict[str, Dict[str, Union[str, bool]]] + E.g. {"fred": {"key":"XXXXX"}, "binance": {"key":"YYYYY", "secret":"ZZZZZ"}} + More info on APIs can be found through get_keys_info(). + persist: bool + If False, api key change will be contained to where it was changed. For example, Jupyter notebook. + If True, api key change will be global, i.e. it will affect terminal environment variables. + By default, False. + show_output: bool + Display status string or not. By default, False. + + Returns + ------- + status_dict: Dict + + """ + + status_dict = {} + + for api, kwargs in keys_dict.items(): + expected_args_dict = get_keys_info() + + if api in expected_args_dict: + + received_kwargs_list = list(kwargs.keys()) + expected_kwargs_list = expected_args_dict[api] + + if received_kwargs_list == expected_kwargs_list: + kwargs["persist"] = persist + kwargs["show_output"] = show_output + status_dict[api] = str( + getattr(sys.modules[__name__], "set_" + str(api) + "_key")(**kwargs) + ) + else: + console.print( + f"[red]'{api}' kwargs: {received_kwargs_list} don't match expected: {expected_kwargs_list}.[/red]" + ) + else: + console.print( + f"[red]API '{api}' was not recognized. Please check get_keys_info().[/red]" + ) + + return status_dict + + +def get_keys_info() -> Dict[str, List[str]]: + """Get info on available APIs to use in set_keys. + + Returns + ------- + Dictionary of expected API keys and arguments: Dict[str, List[str]] + + """ + args_dict = {} + + for api in API_DICT: + arg_list = list( + getattr( + sys.modules[__name__], "set_" + str(api) + "_key" + ).__code__.co_varnames + ) + arg_list.remove("persist") + arg_list.remove("show_output") + args_dict[api] = arg_list + + return args_dict + + def set_key(env_var_name: str, env_var_value: str, persist: bool = False) -> None: """Set API key. diff --git a/tests/openbb_terminal/test_featflags_controller.py b/tests/openbb_terminal/test_featflags_controller.py index 078a1defc5c..eee90b0de3f 100644 --- a/tests/openbb_terminal/test_featflags_controller.py +++ b/tests/openbb_terminal/test_featflags_controller.py @@ -37,10 +37,6 @@ 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)