diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f70698b9a38..23b89da2abb 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,51 +6,50 @@ The following is a set of guidelines for contributing to OpenBB Terminal. These
Use your best judgment, and feel free to propose changes to this document in a pull request.
- [CONTRIBUTING](#contributing)
- - [BASIC](#basic)
- - [Adding a new command](#adding-a-new-command)
- - [Select Feature](#select-feature)
- - [Model](#model)
- - [View](#view)
- - [Controller](#controller)
- - [Add API endpint](#add-api-endpoint)
- - [Add Documentation](#add-documentation)
- - [Open a Pull Request](#open-a-pull-request)
- - [Review Process](#review-process)
- - [Understand Code Structure](#understand-code-structure)
- - [Follow Coding Guidelines](#follow-coding-guidelines)
- - [General Code Requirements](#general-code-requirements)
- - [File Specific Requirements](#file-specific-requirements)
- - [Coding Style](#coding-style)
- - [OpenBB Style Guide](#openbb-style-guide)
- - [Flags](#flags)
- - [Output format](#output-format)
- - [Time-related](#time-related)
- - [Data selection and manipulation](#data-selection-and-manipulation)
- - [Financial instrument characteristics](#financial-instrument-characteristics)
- - [Naming Convention](#naming-convention)
- - [Docstrings](#docstrings)
- - [Linters](#linters)
- - [Command names](#command-names)
- - [External API Keys](#external-api-keys)
- - [Creating API key](#creating-api-key)
- - [Setting and checking API key](#setting-and-checking-api-key)
- - [ADVANCED](#advanced)
- - [Important functions and classes](#important-functions-and-classes)
- - [Base controller class](#base-controller-class)
- - [Default Data Sources](#default-data-sources)
- - [Export Data](#export-data)
- - [Queue and pipeline](#queue-and-pipeline)
- - [Auto Completer](#auto-completer)
- - [Logging](#logging)
- - [Internationalization](#internationalization)
- - [Write Code and Commit](#write-code-and-commit)
- - [Pre Commit Hooks](#pre-commit-hooks)
- - [Coding](#coding)
- - [Git Process](#git-process)
- - [Add a Test](#add-a-test)
- - [Pytest](#pytest)
- - [Coverage](#coverage)
- - [VCR](#vcr)
+- [BASIC](#basic)
+ - [Adding a new command](#adding-a-new-command)
+ - [Select Feature](#select-feature)
+ - [Model](#model)
+ - [View](#view)
+ - [Controller](#controller)
+ - [Add API endpoint](#add-api-endpoint)
+ - [Add Documentation](#add-documentation)
+ - [Open a Pull Request](#open-a-pull-request)
+ - [Review Process](#review-process)
+ - [Understand Code Structure](#understand-code-structure)
+ - [Backend](#backend)
+ - [Frontend](#frontend)
+ - [Follow Coding Guidelines](#follow-coding-guidelines)
+ - [General Code Requirements](#general-code-requirements)
+ - [File Specific Requirements](#file-specific-requirements)
+ - [Coding Style](#coding-style)
+ - [OpenBB Style Guide](#openbb-style-guide)
+ - [Flags](#flags)
+ - [Output format](#output-format)
+ - [Time-related](#time-related)
+ - [Data selection and manipulation](#data-selection-and-manipulation)
+ - [Financial instrument characteristics](#financial-instrument-characteristics)
+ - [Naming Convention](#naming-convention)
+ - [Docstrings](#docstrings)
+ - [Linters](#linters)
+ - [Command names](#command-names)
+ - [External API Keys](#external-api-keys)
+ - [Creating API key](#creating-api-key)
+ - [Setting and checking API key](#setting-and-checking-api-key)
+- [ADVANCED](#advanced)
+ - [Important functions and classes](#important-functions-and-classes)
+ - [Base controller class](#base-controller-class)
+ - [Default Data Sources](#default-data-sources)
+ - [Export Data](#export-data)
+ - [Queue and pipeline](#queue-and-pipeline)
+ - [Auto Completer](#auto-completer)
+ - [Logging](#logging)
+ - [Internationalization](#internationalization)
+ - [Write Code and Commit](#write-code-and-commit)
+ - [Pre Commit Hooks](#pre-commit-hooks)
+ - [Coding](#coding)
+ - [Git Process](#git-process)
+ - [Add a Test](#add-a-test)
# BASIC
@@ -1137,23 +1136,36 @@ One of the first steps once adding a new data source that requires an API key is
The following code allows to check the validity of the IEX Cloud API key.
```python
-def check_iex_key(self, show_output: bool = False) -> None:
- """Check IEX Cloud key"""
- self.cfg_dict["IEXCLOUD"] = "iex"
+def check_iex_key(show_output: bool = False) -> str:
+ """Check IEX Cloud key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not.
+
+ Returns
+ -------
+ status: str
+
+ """
+
if cfg.API_IEX_TOKEN == "REPLACE_ME": # nosec
logger.info("IEX Cloud key not defined")
- self.key_dict["IEXCLOUD"] = "not defined"
+ status = KeyStatus.NOT_DEFINED
else:
try:
- pyEX.Client(api_token=cfg.API_IEX_TOKEN, version="v1")
+ pyEX.Client(api_token=cfg.API_IEX_TOKEN, version="v1").quote(symbol="AAPL")
logger.info("IEX Cloud key defined, test passed")
- self.key_dict["IEXCLOUD"] = "defined, test passed"
- except PyEXception:
- logger.exception("IEX Cloud key defined, test failed")
- self.key_dict["IEXCLOUD"] = "defined, test failed"
+ status = KeyStatus.DEFINED_TEST_PASSED
+ except Exception as _: # noqa: F841
+ logger.warning("IEX Cloud key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
if show_output:
- console.print(self.key_dict["IEXCLOUD"] + "\n")
+ console.print(status.colorize() + "\n")
+
+ return status
```
Note that there are usually 3 states:
@@ -1190,10 +1202,9 @@ def call_iex(self, other_args: List[str]):
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_IEX_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_IEX_KEY", ns_parser.key)
- cfg.API_IEX_TOKEN = ns_parser.key
- self.check_iex_key(show_output=True)
+ self.status_dict["iex"] = keys_model.set_iex_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
```
# ADVANCED
diff --git a/custom_pre_commit/check_config_terminal.py b/custom_pre_commit/check_config_terminal.py
index 08552bafdb2..f9c421cd6d4 100755
--- a/custom_pre_commit/check_config_terminal.py
+++ b/custom_pre_commit/check_config_terminal.py
@@ -50,14 +50,14 @@ settings = {
"OANDA_ACCOUNT_TYPE": 'OANDA_ACCOUNT_TYPE = os.getenv("OPENBB_OANDA_ACCOUNT_TYPE") or "practice"',
"OANDA_ACCOUNT": 'OANDA_ACCOUNT = os.getenv("OPENBB_OANDA_ACCOUNT") or "REPLACE_ME"',
"OANDA_TOKEN": 'OANDA_TOKEN = os.getenv("OPENBB_OANDA_TOKEN") or "REPLACE_ME"',
- "TRADIER_TOKEN": 'TRADIER_TOKEN = os.getenv("OPENBB_API_TRADIER_TOKEN") or "REPLACE_ME"',
+ "API_TRADIER_TOKEN": 'API_TRADIER_TOKEN = os.getenv("OPENBB_API_TRADIER_TOKEN") or "REPLACE_ME"',
"WEBDRIVER_TO_USE": 'WEBDRIVER_TO_USE = "chrome"',
"PATH_TO_SELENIUM_DRIVER": 'PATH_TO_SELENIUM_DRIVER = None # Replace with "PATH"',
"API_CMC_KEY": 'API_CMC_KEY = os.getenv("OPENBB_API_CMC_KEY") or "REPLACE_ME"',
"API_BINANCE_KEY": 'API_BINANCE_KEY = os.getenv("OPENBB_API_BINANCE_KEY") or "REPLACE_ME"',
"API_BINANCE_SECRET": 'API_BINANCE_SECRET = os.getenv("OPENBB_API_BINANCE_SECRET") or "REPLACE_ME"',
"API_FINNHUB_KEY": 'API_FINNHUB_KEY = os.getenv("OPENBB_API_FINNHUB_KEY") or "REPLACE_ME"',
- "API_IEX_TOKEN": 'API_IEX_TOKEN = os.getenv("OPENBB_API_IEX_KEY") or "REPLACE_ME"',
+ "API_IEX_TOKEN": 'API_IEX_TOKEN = os.getenv("OPENBB_API_IEX_TOKEN") or "REPLACE_ME"',
"API_SENTIMENTINVESTOR_TOKEN": 'API_SENTIMENTINVESTOR_TOKEN = os.getenv("OPENBB_API_SENTIMENTINVESTOR_TOKEN") or "REPLACE_ME"', # noqa
"API_COINBASE_KEY": 'API_COINBASE_KEY = os.getenv("OPENBB_API_COINBASE_KEY") or "REPLACE_ME"',
"API_COINBASE_SECRET": 'API_COINBASE_SECRET = os.getenv("OPENBB_API_COINBASE_SECRET") or "REPLACE_ME"',
diff --git a/i18n/en.yml b/i18n/en.yml
index 8e1d6d04b30..aa16438e6e2 100644
--- a/i18n/en.yml
+++ b/i18n/en.yml
@@ -16,11 +16,13 @@ en:
_configure_: Configure your own terminal
_main_menu_: Main menu
keys/_keys_: This menu allows you to set your own API keys. Type 'about' for more information
+ keys/mykeys: get your defined keys
+ keys/_status_: Status
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
+ defined, test inconclusive: defined, test inconclusive
sources/_info_: Get and set default data sources
sources/get: get available data sources associated with command
sources/set: set default data source for a command
diff --git a/jupyterlab/openbb-settings/schema/settings.json b/jupyterlab/openbb-settings/schema/settings.json
index d976a7e5675..347fd6b825c 100644
--- a/jupyterlab/openbb-settings/schema/settings.json
+++ b/jupyterlab/openbb-settings/schema/settings.json
@@ -386,7 +386,7 @@
"default": "REPLACE_ME",
"value": ""
},
- "OPENBB_API_IEX_KEY":
+ "OPENBB_API_IEX_TOKEN":
{
"type": "string",
"form": "password",
diff --git a/openbb_terminal/api.py b/openbb_terminal/api.py
index e65f387d800..11369c2fc84 100644
--- a/openbb_terminal/api.py
+++ b/openbb_terminal/api.py
@@ -521,8 +521,11 @@ functions = {
"model": "openbb_terminal.cryptocurrency.due_diligence.glassnode_model.get_active_addresses",
"view": "openbb_terminal.cryptocurrency.due_diligence.glassnode_view.display_active_addresses",
},
- "crypto.dd.btcrb": {
+ "crypto.dd.close": {
"model": "openbb_terminal.cryptocurrency.due_diligence.glassnode_model.get_close_price",
+ },
+ "crypto.dd.btcrb": {
+ "model": "openbb_terminal.cryptocurrency.due_diligence.glassnode_model.get_btc_rainbow",
"view": "openbb_terminal.cryptocurrency.due_diligence.glassnode_view.display_btc_rainbow",
},
"crypto.dd.eb": {
@@ -1884,6 +1887,36 @@ functions = {
"etf.candle": {"model": "openbb_terminal.stocks.stocks_helper.display_candle"},
"forex.candle": {"model": "openbb_terminal.forex.forex_helper.display_candle"},
"forex.load": {"model": "openbb_terminal.forex.forex_helper.load"},
+ "keys.av": {"model": "openbb_terminal.keys_model.set_av_key"},
+ "keys.fmp": {"model": "openbb_terminal.keys_model.set_fmp_key"},
+ "keys.quandl": {"model": "openbb_terminal.keys_model.set_quandl_key"},
+ "keys.polygon": {"model": "openbb_terminal.keys_model.set_polygon_key"},
+ "keys.fred": {"model": "openbb_terminal.keys_model.set_fred_key"},
+ "keys.news": {"model": "openbb_terminal.keys_model.set_news_key"},
+ "keys.tradier": {"model": "openbb_terminal.keys_model.set_tradier_key"},
+ "keys.cmc": {"model": "openbb_terminal.keys_model.set_cmc_key"},
+ "keys.finnhub": {"model": "openbb_terminal.keys_model.set_finnhub_key"},
+ "keys.iex": {"model": "openbb_terminal.keys_model.set_iex_key"},
+ "keys.reddit": {"model": "openbb_terminal.keys_model.set_reddit_key"},
+ "keys.twitter": {"model": "openbb_terminal.keys_model.set_twitter_key"},
+ "keys.rh": {"model": "openbb_terminal.keys_model.set_rh_key"},
+ "keys.degiro": {"model": "openbb_terminal.keys_model.set_degiro_key"},
+ "keys.oanda": {"model": "openbb_terminal.keys_model.set_oanda_key"},
+ "keys.binance": {"model": "openbb_terminal.keys_model.set_binance_key"},
+ "keys.bitquery": {"model": "openbb_terminal.keys_model.set_bitquery_key"},
+ "keys.si": {"model": "openbb_terminal.keys_model.set_si_key"},
+ "keys.coinbase": {"model": "openbb_terminal.keys_model.set_coinbase_key"},
+ "keys.walert": {"model": "openbb_terminal.keys_model.set_walert_key"},
+ "keys.glassnode": {"model": "openbb_terminal.keys_model.set_glassnode_key"},
+ "keys.coinglass": {"model": "openbb_terminal.keys_model.set_coinglass_key"},
+ "keys.cpanic": {"model": "openbb_terminal.keys_model.set_cpanic_key"},
+ "keys.ethplorer": {"model": "openbb_terminal.keys_model.set_ethplorer_key"},
+ "keys.smartstake": {"model": "openbb_terminal.keys_model.set_smartstake_key"},
+ "keys.github": {"model": "openbb_terminal.keys_model.set_github_key"},
+ "keys.messari": {"model": "openbb_terminal.keys_model.set_messari_key"},
+ "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"},
}
@@ -1941,7 +1974,7 @@ def change_docstring(api_callable, model: Callable, view=None):
index = view.__doc__.find("Parameters")
all_parameters = (
"\nAPI function, use the chart kwarg for getting the view model and it's plot. "
- "See every parmater below:\n\n\t"
+ "See every parmater below:\n\n "
+ view.__doc__[index:]
+ """chart: bool
If the view and its chart shall be used"""
diff --git a/openbb_terminal/config_terminal.py b/openbb_terminal/config_terminal.py
index 0e84dad04eb..20182160420 100644
--- a/openbb_terminal/config_terminal.py
+++ b/openbb_terminal/config_terminal.py
@@ -106,7 +106,7 @@ OANDA_ACCOUNT = os.getenv("OPENBB_OANDA_ACCOUNT") or "REPLACE_ME"
OANDA_TOKEN = os.getenv("OPENBB_OANDA_TOKEN") or "REPLACE_ME"
# https://tradier.com/products/market-data-api
-TRADIER_TOKEN = os.getenv("OPENBB_API_TRADIER_TOKEN") or "REPLACE_ME"
+API_TRADIER_TOKEN = os.getenv("OPENBB_API_TRADIER_TOKEN") or "REPLACE_ME"
# Selenium Webbrowser drivers can be found at https://selenium-python.readthedocs.io/installation.html
WEBDRIVER_TO_USE = "chrome"
@@ -123,7 +123,7 @@ API_BINANCE_SECRET = os.getenv("OPENBB_API_BINANCE_SECRET") or "REPLACE_ME"
API_FINNHUB_KEY = os.getenv("OPENBB_API_FINNHUB_KEY") or "REPLACE_ME"
# https://iexcloud.io
-API_IEX_TOKEN = os.getenv("OPENBB_API_IEX_KEY") or "REPLACE_ME"
+API_IEX_TOKEN = os.getenv("OPENBB_API_IEX_TOKEN") or "REPLACE_ME"
# https://www.sentimentinvestor.com
API_SENTIMENTINVESTOR_TOKEN = (
@@ -170,4 +170,4 @@ API_GITHUB_KEY = os.getenv("OPENBB_API_GITHUB_KEY") or "REPLACE_ME"
API_SANTIMENT_KEY = os.getenv("OPENBB_API_SANTIMENT_KEY") or "REPLACE_ME"
# https://eodhistoricaldata.com/r/?ref=869U7F4J
-API_EODHD_TOKEN = os.getenv("OPENBB_API_EODHD_KEY") or "REPLACE_ME"
+API_EODHD_KEY = os.getenv("OPENBB_API_EODHD_KEY") or "REPLACE_ME"
diff --git a/openbb_terminal/cryptocurrency/due_diligence/glassnode_model.py b/openbb_terminal/cryptocurrency/due_diligence/glassnode_model.py
index 2d1c2b4adf7..dc6f8c7f517 100644
--- a/openbb_terminal/cryptocurrency/due_diligence/glassnode_model.py
+++ b/openbb_terminal/cryptocurrency/due_diligence/glassnode_model.py
@@ -550,3 +550,28 @@ def get_exchange_net_position_change(
console.print(r.text)
return df
+
+
+@log_start_end(log=logger)
+def get_btc_rainbow(
+ start_date: str = "2010-01-01",
+ end_date: str = datetime.now().strftime("%Y-%m-%d"),
+):
+ """Get bitcoin price data
+ [Price data from source: https://glassnode.com]
+ [Inspired by: https://blockchaincenter.net]
+
+ Parameters
+ ----------
+ start_date : int
+ Initial date timestamp. Default is initial BTC timestamp: 1_325_376_000
+ end_date : int
+ Final date timestamp. Default is current BTC timestamp
+ """
+
+ dt_start_date = int(datetime.strptime(start_date, "%Y-%m-%d").timestamp())
+ dt_end_date = int(datetime.strptime(end_date, "%Y-%m-%d").timestamp())
+
+ df_data = get_close_price("BTC", dt_start_date, dt_end_date)
+
+ return df_data
diff --git a/openbb_terminal/cryptocurrency/due_diligence/glassnode_view.py b/openbb_terminal/cryptocurrency/due_diligence/glassnode_view.py
index 12109214cc8..803736525ee 100644
--- a/openbb_terminal/cryptocurrency/due_diligence/glassnode_view.py
+++ b/openbb_terminal/cryptocurrency/due_diligence/glassnode_view.py
@@ -16,7 +16,7 @@ from openbb_terminal.decorators import check_api_key
from openbb_terminal import config_plot as cfgPlot
from openbb_terminal.cryptocurrency.due_diligence.glassnode_model import (
get_active_addresses,
- get_close_price,
+ get_btc_rainbow,
get_exchange_balances,
get_exchange_net_position_change,
get_hashrate,
@@ -35,8 +35,8 @@ logger = logging.getLogger(__name__)
@log_start_end(log=logger)
@check_api_key(["API_GLASSNODE_KEY"])
def display_btc_rainbow(
- start_date: int = int(datetime(2010, 1, 1).timestamp()),
- end_date: int = int(datetime.now().timestamp()),
+ start_date: str = "2010-01-01",
+ end_date: str = datetime.now().strftime("%Y-%m-%d"),
export: str = "",
external_axes: Optional[List[plt.Axes]] = None,
):
@@ -55,7 +55,8 @@ def display_btc_rainbow(
external_axes : Optional[List[plt.Axes]], optional
External axes (1 axis is expected in the list), by default None
"""
- df_data = get_close_price("BTC", start_date, end_date)
+
+ df_data = get_btc_rainbow(start_date, end_date)
if df_data.empty:
return
@@ -69,7 +70,7 @@ def display_btc_rainbow(
return
d0 = datetime.strptime("2012-01-01", "%Y-%m-%d")
- dend = datetime.fromtimestamp(end_date)
+ dend = datetime.strptime(end_date, "%Y-%m-%d")
x = range((df_data.index[0] - d0).days, (dend - d0).days + 1)
diff --git a/openbb_terminal/cryptocurrency/overview/overview_controller.py b/openbb_terminal/cryptocurrency/overview/overview_controller.py
index 1fae8eca192..d2bdf5f64fc 100644
--- a/openbb_terminal/cryptocurrency/overview/overview_controller.py
+++ b/openbb_terminal/cryptocurrency/overview/overview_controller.py
@@ -315,9 +315,12 @@ class OverviewController(BaseController):
parser, other_args, EXPORT_BOTH_RAW_DATA_AND_FIGURES
)
if ns_parser:
+ start_date = ns_parser.since.strftime("%Y-%m-%d")
+ end_date = ns_parser.until.strftime("%Y-%m-%d")
+
display_btc_rainbow(
- start_date=int(ns_parser.since.timestamp()),
- end_date=int(ns_parser.until.timestamp()),
+ start_date=start_date,
+ end_date=end_date,
export=ns_parser.export,
)
diff --git a/openbb_terminal/keys_controller.py b/openbb_terminal/keys_controller.py
index 0f8e082a9af..d3cd09ee284 100644
--- a/openbb_terminal/keys_controller.py
+++ b/openbb_terminal/keys_controller.py
@@ -5,38 +5,22 @@ __docformat__ = "numpy"
import argparse
import logging
-import os
from typing import Dict, List
-import binance
-import oandapyV20.endpoints.pricing
-import dotenv
-import praw
-import pyEX
-import quandl
-import requests
-from prawcore.exceptions import ResponseException
-from alpha_vantage.timeseries import TimeSeries
-from coinmarketcapapi import CoinMarketCapAPI, CoinMarketCapAPIError
from prompt_toolkit.completion import NestedCompleter
-from pyEX.common.exception import PyEXception
-from oandapyV20 import API as oanda_API
-from oandapyV20.exceptions import V20Error
+from tqdm import tqdm
-from openbb_terminal import config_terminal as cfg
-from openbb_terminal import feature_flags as obbff
+from openbb_terminal import feature_flags as obbff, keys_view
+from openbb_terminal import keys_model
from openbb_terminal.core.config.paths import USER_ENV_FILE
-from openbb_terminal.cryptocurrency.coinbase_helpers import (
- CoinbaseProAuth,
- make_coinbase_request,
- CoinbaseApiException,
-)
from openbb_terminal.decorators import log_start_end
-from openbb_terminal.helper_funcs import parse_simple_args
+from openbb_terminal.helper_funcs import (
+ EXPORT_ONLY_RAW_DATA_ALLOWED,
+ parse_simple_args,
+)
from openbb_terminal.menu import session
from openbb_terminal.parent_classes import BaseController
from openbb_terminal.rich_config import console, MenuText, translate
-from openbb_terminal.terminal_helper import suppress_stdout
logger = logging.getLogger(__name__)
@@ -44,40 +28,41 @@ logger = logging.getLogger(__name__)
class KeysController(BaseController): # pylint: disable=too-many-public-methods
"""Keys Controller class"""
- CHOICES_COMMANDS: List[str] = [
- "av",
- "fmp",
- "quandl",
- "polygon",
- "fred",
- "news",
- "tradier",
- "cmc",
- "finnhub",
- "iex",
- "reddit",
- "twitter",
- "rh",
- "degiro",
- "oanda",
- "binance",
- "bitquery",
- "si",
- "coinbase",
- "walert",
- "glassnode",
- "coinglass",
- "cpanic",
- "ethplorer",
- "smartstake",
- "github",
- "eodhd",
- "messari",
- "santiment",
- ]
+ 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_LIST = list(API_DICT.keys())
+ CHOICES_COMMANDS: List[str] = ["mykeys"] + API_LIST
PATH = "/keys/"
- key_dict: Dict = {}
- cfg_dict: Dict = {}
+ status_dict: Dict = {}
def __init__(
self,
@@ -89,8 +74,6 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
super().__init__(queue)
self.env_file = env_file
if menu_usage:
- self.check_keys_status()
-
if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
@@ -98,761 +81,11 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
self.completer = NestedCompleter.from_nested_dict(choices)
- def check_github_key(self, show_output: bool = False) -> None:
- """Check GitHub key"""
- self.cfg_dict["GITHUB"] = "github"
- if cfg.API_GITHUB_KEY == "REPLACE_ME": # pragma: allowlist secret
- logger.info("GitHub key not defined")
- self.key_dict["GITHUB"] = "not defined"
- else:
- self.key_dict["GITHUB"] = "defined"
- # github api will not fail for the first requests without key
- # only after certain amount of requests the user will get rate limited
-
- if show_output:
- console.print(self.key_dict["GITHUB"] + "\n")
-
- def check_av_key(self, show_output: bool = False) -> None:
- """Check Alpha Vantage key"""
- self.cfg_dict["ALPHA_VANTAGE"] = "av"
- if cfg.API_KEY_ALPHAVANTAGE == "REPLACE_ME": # pragma: allowlist secret
- logger.info("Alpha Vantage key not defined")
- self.key_dict["ALPHA_VANTAGE"] = "not defined"
- else:
- df = TimeSeries(
- key=cfg.API_KEY_ALPHAVANTAGE, output_format="pandas"
- ).get_intraday(symbol="AAPL")
- if df[0].empty: # pylint: disable=no-member
- logger.warning("Alpha Vantage key defined, test failed")
- self.key_dict["ALPHA_VANTAGE"] = "defined, test failed"
- else:
- logger.info("Alpha Vantage key defined, test passed")
- self.key_dict["ALPHA_VANTAGE"] = "defined, test passed"
-
- if show_output:
- console.print(self.key_dict["ALPHA_VANTAGE"] + "\n")
-
- def check_fmp_key(self, show_output: bool = False) -> None:
- """Check Financial Modeling Prep key"""
- self.cfg_dict["FINANCIAL_MODELING_PREP"] = "fmp"
- if (
- cfg.API_KEY_FINANCIALMODELINGPREP
- == "REPLACE_ME" # pragma: allowlist secret
- ): # pragma: allowlist secret
- logger.info("Financial Modeling Prep key not defined")
- self.key_dict["FINANCIAL_MODELING_PREP"] = "not defined"
- else:
- r = requests.get(
- f"https://financialmodelingprep.com/api/v3/profile/AAPL?apikey={cfg.API_KEY_FINANCIALMODELINGPREP}"
- )
- if r.status_code in [403, 401]:
- logger.warning("Financial Modeling Prep key defined, test failed")
- self.key_dict["FINANCIAL_MODELING_PREP"] = "defined, test failed"
- elif r.status_code == 200:
- logger.info("Financial Modeling Prep key defined, test passed")
- self.key_dict["FINANCIAL_MODELING_PREP"] = "defined, test passed"
- else:
- logger.warning("Financial Modeling Prep key defined, test inconclusive")
- self.key_dict["FINANCIAL_MODELING_PREP"] = "defined, test inconclusive"
-
- if show_output:
- console.print(self.key_dict["FINANCIAL_MODELING_PREP"] + "\n")
-
- def check_quandl_key(self, show_output: bool = False) -> None:
- """Check Quandl key"""
- self.cfg_dict["QUANDL"] = "quandl"
- if cfg.API_KEY_QUANDL == "REPLACE_ME": # pragma: allowlist secret
- logger.info("Quandl key not defined")
- self.key_dict["QUANDL"] = "not defined"
- else:
- try:
- quandl.save_key(cfg.API_KEY_QUANDL)
- quandl.get_table(
- "ZACKS/FC",
- paginate=True,
- ticker=["AAPL", "MSFT"],
- per_end_date={"gte": "2015-01-01"},
- qopts={"columns": ["ticker", "per_end_date"]},
- )
- logger.info("Quandl key defined, test passed")
- self.key_dict["QUANDL"] = "defined, test passed"
- except Exception as _: # noqa: F841
- logger.exception("Quandl key defined, test failed")
- self.key_dict["QUANDL"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["QUANDL"] + "\n")
-
- def check_polygon_key(self, show_output: bool = False) -> None:
- """Check Polygon key"""
- self.cfg_dict["POLYGON"] = "polygon"
- if cfg.API_POLYGON_KEY == "REPLACE_ME":
- logger.info("Polygon key not defined")
- self.key_dict["POLYGON"] = "not defined"
- else:
- r = requests.get(
- "https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/day/2020-06-01/2020-06-17"
- f"?apiKey={cfg.API_POLYGON_KEY}"
- )
- if r.status_code in [403, 401]:
- logger.warning("Polygon key defined, test failed")
- self.key_dict["POLYGON"] = "defined, test failed"
- elif r.status_code == 200:
- logger.info("Polygon key defined, test passed")
- self.key_dict["POLYGON"] = "defined, test passed"
- else:
- logger.warning("Polygon key defined, test inconclusive")
- self.key_dict["POLYGON"] = "defined, test inconclusive"
-
- if show_output:
- console.print(self.key_dict["POLYGON"] + "\n")
-
- def check_fred_key(self, show_output: bool = False) -> None:
- """Check FRED key"""
- self.cfg_dict["FRED"] = "fred"
- if cfg.API_FRED_KEY == "REPLACE_ME":
- logger.info("FRED key not defined")
- self.key_dict["FRED"] = "not defined"
- else:
- r = requests.get(
- f"https://api.stlouisfed.org/fred/series?series_id=GNPCA&api_key={cfg.API_FRED_KEY}"
- )
- if r.status_code in [403, 401, 400]:
- logger.warning("FRED key defined, test failed")
- self.key_dict["FRED"] = "defined, test failed"
- elif r.status_code == 200:
- logger.info("FRED key defined, test passed")
- self.key_dict["FRED"] = "defined, test passed"
- else:
- logger.warning("FRED key defined, test inconclusive")
- self.key_dict["FRED"] = "defined, test inconclusive"
-
- if show_output:
- console.print(self.key_dict["FRED"] + "\n")
-
- def check_news_key(self, show_output: bool = False) -> None:
- """Check News API key"""
- self.cfg_dict["NEWSAPI"] = "news"
- if cfg.API_NEWS_TOKEN == "REPLACE_ME": # nosec
- logger.info("News API key not defined")
- self.key_dict["NEWSAPI"] = "not defined"
- else:
- r = requests.get(
- f"https://newsapi.org/v2/everything?q=keyword&apiKey={cfg.API_NEWS_TOKEN}"
- )
- if r.status_code in [401, 403]:
- logger.warning("News API key defined, test failed")
- self.key_dict["NEWSAPI"] = "defined, test failed"
- elif r.status_code == 200:
- logger.info("News API key defined, test passed")
- self.key_dict["NEWSAPI"] = "defined, test passed"
- else:
- logger.warning("News API key defined, test inconclusive")
- self.key_dict["NEWSAPI"] = "defined, test inconclusive"
-
- if show_output:
- console.print(self.key_dict["NEWSAPI"] + "\n")
-
- def check_tradier_key(self, show_output: bool = False) -> None:
- """Check Tradier key"""
- self.cfg_dict["TRADIER"] = "tradier"
- if cfg.TRADIER_TOKEN == "REPLACE_ME": # nosec
- logger.info("Tradier key not defined")
- self.key_dict["TRADIER"] = "not defined"
- else:
- r = requests.get(
- "https://sandbox.tradier.com/v1/markets/quotes",
- params={"symbols": "AAPL"},
- headers={
- "Authorization": f"Bearer {cfg.TRADIER_TOKEN}",
- "Accept": "application/json",
- },
- )
- if r.status_code in [401, 403]:
- logger.warning("Tradier key not defined, test failed")
- self.key_dict["TRADIER"] = "defined, test failed"
- elif r.status_code == 200:
- logger.info("Tradier key not defined, test passed")
- self.key_dict["TRADIER"] = "defined, test passed"
- else:
- logger.warning("Tradier key not defined, test inconclusive")
- self.key_dict["TRADIER"] = "defined, test inconclusive"
-
- if show_output:
- console.print(self.key_dict["TRADIER"] + "\n")
-
- def check_cmc_key(self, show_output: bool = False) -> None:
- """Check Coinmarketcap key"""
- self.cfg_dict["COINMARKETCAP"] = "cmc"
- if cfg.API_CMC_KEY == "REPLACE_ME":
- logger.info("Coinmarketcap key not defined")
- self.key_dict["COINMARKETCAP"] = "not defined"
- else:
- cmc = CoinMarketCapAPI(cfg.API_CMC_KEY)
-
- try:
- cmc.cryptocurrency_map()
- logger.info("Coinmarketcap key defined, test passed")
- self.key_dict["COINMARKETCAP"] = "defined, test passed"
- except CoinMarketCapAPIError:
- logger.exception("Coinmarketcap key defined, test failed")
- self.key_dict["COINMARKETCAP"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["COINMARKETCAP"] + "\n")
-
- def check_finnhub_key(self, show_output: bool = False) -> None:
- """Check Finnhub key"""
- self.cfg_dict["FINNHUB"] = "finnhub"
- if cfg.API_FINNHUB_KEY == "REPLACE_ME":
- logger.info("Finnhub key not defined")
- self.key_dict["FINNHUB"] = "not defined"
- else:
- r = r = requests.get(
- f"https://finnhub.io/api/v1/quote?symbol=AAPL&token={cfg.API_FINNHUB_KEY}"
- )
- if r.status_code in [403, 401, 400]:
- logger.warning("Finnhub key defined, test failed")
- self.key_dict["FINNHUB"] = "defined, test failed"
- elif r.status_code == 200:
- logger.info("Finnhub key defined, test passed")
- self.key_dict["FINNHUB"] = "defined, test passed"
- else:
- logger.warning("Finnhub key defined, test inconclusive")
- self.key_dict["FINNHUB"] = "defined, test inconclusive"
-
- if show_output:
- console.print(self.key_dict["FINNHUB"] + "\n")
-
- def check_iex_key(self, show_output: bool = False) -> None:
- """Check IEX Cloud key"""
- self.cfg_dict["IEXCLOUD"] = "iex"
- if cfg.API_IEX_TOKEN == "REPLACE_ME": # nosec
- logger.info("IEX Cloud key not defined")
- self.key_dict["IEXCLOUD"] = "not defined"
- else:
- try:
- pyEX.Client(api_token=cfg.API_IEX_TOKEN, version="v1")
- logger.info("IEX Cloud key defined, test passed")
- self.key_dict["IEXCLOUD"] = "defined, test passed"
- except PyEXception:
- logger.exception("IEX Cloud key defined, test failed")
- self.key_dict["IEXCLOUD"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["IEXCLOUD"] + "\n")
-
- def check_reddit_key(self, show_output: bool = False) -> None:
- """Check Reddit key"""
- self.cfg_dict["REDDIT"] = "reddit"
- reddit_keys = [
- cfg.API_REDDIT_CLIENT_ID,
- cfg.API_REDDIT_CLIENT_SECRET,
- cfg.API_REDDIT_USERNAME,
- cfg.API_REDDIT_PASSWORD,
- cfg.API_REDDIT_USER_AGENT,
- ]
- if "REPLACE_ME" in reddit_keys:
- logger.info("Reddit key not defined")
- self.key_dict["REDDIT"] = "not defined"
- else:
-
- try:
- with suppress_stdout():
- praw_api = praw.Reddit(
- client_id=cfg.API_REDDIT_CLIENT_ID,
- client_secret=cfg.API_REDDIT_CLIENT_SECRET,
- username=cfg.API_REDDIT_USERNAME,
- user_agent=cfg.API_REDDIT_USER_AGENT,
- password=cfg.API_REDDIT_PASSWORD,
- check_for_updates=False,
- comment_kind="t1",
- message_kind="t4",
- redditor_kind="t2",
- submission_kind="t3",
- subreddit_kind="t5",
- trophy_kind="t6",
- oauth_url="https://oauth.reddit.com",
- reddit_url="https://www.reddit.com",
- short_url="https://redd.it",
- ratelimit_seconds=5,
- timeout=16,
- )
-
- praw_api.user.me()
- logger.info("Reddit key defined, test passed")
- self.key_dict["REDDIT"] = "defined, test passed"
- except (Exception, ResponseException):
- logger.warning("Reddit key defined, test failed")
- self.key_dict["REDDIT"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["REDDIT"] + "\n")
-
- def check_twitter_key(self, show_output: bool = False) -> None:
- """Check Twitter key"""
- self.cfg_dict["TWITTER"] = "twitter"
- twitter_keys = [
- cfg.API_TWITTER_KEY,
- cfg.API_TWITTER_SECRET_KEY,
- cfg.API_TWITTER_BEARER_TOKEN,
- ]
- if "REPLACE_ME" in twitter_keys:
- logger.info("Twitter key not defined")
- self.key_dict["TWITTER"] = "not defined"
- else:
- params = {
- "query": "(\\$AAPL) (lang:en)",
- "max_results": "10",
- "tweet.fields": "created_at,lang",
- }
- r = requests.get(
- "https://api.twitter.com/2/tweets/search/recent",
- params=params, # type: ignore
- headers={"authorization": "Bearer " + cfg.API_TWITTER_BEARER_TOKEN},
- )
- if r.status_code == 200:
- logger.info("Twitter key defined, test passed")
- self.key_dict["TWITTER"] = "defined, test passed"
- elif r.status_code in [401, 403]:
- logger.warning("Twitter key defined, test failed")
- self.key_dict["TWITTER"] = "defined, test failed"
- else:
- logger.warning("Twitter key defined, test failed")
- self.key_dict["TWITTER"] = "defined, test inconclusive"
-
- if show_output:
- console.print(self.key_dict["TWITTER"] + "\n")
-
- def check_rh_key(self, show_output: bool = False) -> None:
- """Check Robinhood key"""
- self.cfg_dict["ROBINHOOD"] = "rh"
- rh_keys = [cfg.RH_USERNAME, cfg.RH_PASSWORD]
- if "REPLACE_ME" in rh_keys:
- logger.info("Robinhood key not defined")
- self.key_dict["ROBINHOOD"] = "not defined"
- else:
- logger.info("Robinhood key defined, not tested")
- self.key_dict["ROBINHOOD"] = "defined, not tested"
-
- if show_output:
- console.print(self.key_dict["ROBINHOOD"] + "\n")
-
- def check_degiro_key(self, show_output: bool = False) -> None:
- """Check Degiro key"""
- self.cfg_dict["DEGIRO"] = "degiro"
- dg_keys = [cfg.DG_USERNAME, cfg.DG_PASSWORD, cfg.DG_TOTP_SECRET]
- if "REPLACE_ME" in dg_keys:
- logger.info("Degiro key not defined")
- self.key_dict["DEGIRO"] = "not defined"
- else:
- logger.info("Degiro key defined, not tested")
- self.key_dict["DEGIRO"] = "defined, not tested"
-
- if show_output:
- console.print(self.key_dict["DEGIRO"] + "\n")
-
- def check_oanda_key(self, show_output: bool = False) -> None:
- """Check Oanda key"""
- self.cfg_dict["OANDA"] = "oanda"
- oanda_keys = [cfg.OANDA_TOKEN, cfg.OANDA_ACCOUNT]
- if "REPLACE_ME" in oanda_keys:
- logger.info("Oanda key not defined")
- self.key_dict["OANDA"] = "not defined"
- else:
- client = oanda_API(access_token=cfg.OANDA_TOKEN)
- account = cfg.OANDA_ACCOUNT
- try:
- parameters = {"instruments": "EUR_USD"}
- request = oandapyV20.endpoints.pricing.PricingInfo(
- accountID=account, params=parameters
- )
- client.request(request)
- logger.info("Oanda key defined, test passed")
- self.key_dict["OANDA"] = "defined, test passed"
-
- except V20Error as e:
- logger.exception(str(e))
- logger.info("Oanda key defined, test failed")
- self.key_dict["OANDA"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["OANDA"] + "\n")
-
- def check_binance_key(self, show_output: bool = False) -> None:
- """Check Binance key"""
- self.cfg_dict["BINANCE"] = "binance"
-
- if "REPLACE_ME" in [cfg.API_BINANCE_KEY, cfg.API_BINANCE_SECRET]:
- logger.info("Binance key not defined")
- self.key_dict["BINANCE"] = "not defined"
-
- else:
- try:
- client = binance.Client(cfg.API_BINANCE_KEY, cfg.API_BINANCE_SECRET)
- candles = client.get_klines(
- symbol="BTCUSDT", interval=client.KLINE_INTERVAL_1DAY
- )
-
- if len(candles) > 0:
- logger.info("Binance key defined, test passed")
- self.key_dict["BINANCE"] = "defined, test passed"
- else:
- logger.info("Binance key defined, test failed")
- self.key_dict["BINANCE"] = "defined, test failed"
- except Exception:
- logger.info("Binance key defined, test failed")
- self.key_dict["BINANCE"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["BINANCE"] + "\n")
-
- def check_bitquery_key(self, show_output: bool = False) -> None:
- """Check Bitquery key"""
- self.cfg_dict["BITQUERY"] = "bitquery"
- bitquery = cfg.API_BITQUERY_KEY
- if "REPLACE_ME" in bitquery:
- logger.info("Bitquery key not defined")
- self.key_dict["BITQUERY"] = "not defined"
- else:
- headers = {"x-api-key": cfg.API_BITQUERY_KEY}
- query = """
- {
- ethereum {
- dexTrades(options: {limit: 10, desc: "count"}) {
- count
- protocol
- }}}
- """
- r = requests.post(
- "https://graphql.bitquery.io", json={"query": query}, headers=headers
- )
- if r.status_code == 200:
- logger.info("Bitquery key defined, test passed")
- self.key_dict["BITQUERY"] = "defined, test passed"
- else:
- logger.warning("Bitquery key defined, test failed")
- self.key_dict["BITQUERY"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["BITQUERY"] + "\n")
-
- def check_si_key(self, show_output: bool = False) -> None:
- """Check Sentiment Investor key"""
- self.cfg_dict["SENTIMENT_INVESTOR"] = "si"
- si_keys = [cfg.API_SENTIMENTINVESTOR_TOKEN]
- if "REPLACE_ME" in si_keys:
- logger.info("Sentiment Investor key not defined")
- self.key_dict["SENTIMENT_INVESTOR"] = "not defined"
- else:
- try:
- account = requests.get(
- f"https://api.sentimentinvestor.com/v1/trending"
- f"?token={cfg.API_SENTIMENTINVESTOR_TOKEN}"
- )
- if account.ok and account.json().get("success", False):
- logger.info("Sentiment Investor key defined, test passed")
- self.key_dict["SENTIMENT_INVESTOR"] = "defined, test passed"
- else:
- logger.warning("Sentiment Investor key defined, test failed")
- self.key_dict["SENTIMENT_INVESTOR"] = "defined, test unsuccessful"
- except Exception:
- logger.warning("Sentiment Investor key defined, test failed")
- self.key_dict["SENTIMENT_INVESTOR"] = "defined, test unsuccessful"
-
- if show_output:
- console.print(self.key_dict["SENTIMENT_INVESTOR"] + "\n")
-
- def check_coinbase_key(self, show_output: bool = False) -> None:
- """Check Coinbase key"""
- self.cfg_dict["COINBASE"] = "coinbase"
- if "REPLACE_ME" in [
- cfg.API_COINBASE_KEY,
- cfg.API_COINBASE_SECRET,
- cfg.API_COINBASE_PASS_PHRASE,
- ]:
- logger.info("Coinbase key not defined")
- self.key_dict["COINBASE"] = "not defined"
- else:
- auth = CoinbaseProAuth(
- cfg.API_COINBASE_KEY,
- cfg.API_COINBASE_SECRET,
- cfg.API_COINBASE_PASS_PHRASE,
- )
- try:
- resp = make_coinbase_request("/accounts", auth=auth)
- except CoinbaseApiException:
- resp = None
- if not resp:
- logger.warning("Coinbase key defined, test failed")
- self.key_dict["COINBASE"] = "defined, test unsuccessful"
- else:
- logger.info("Coinbase key defined, test passed")
- self.key_dict["COINBASE"] = "defined, test passed"
-
- if show_output:
- console.print(self.key_dict["COINBASE"] + "\n")
-
- def check_walert_key(self, show_output: bool = False) -> None:
- """Check Walert key"""
- self.cfg_dict["WHALE_ALERT"] = "walert"
- if cfg.API_WHALE_ALERT_KEY == "REPLACE_ME":
- logger.info("Walert key not defined")
- self.key_dict["WHALE_ALERT"] = "not defined"
- else:
- url = (
- "https://api.whale-alert.io/v1/transactions?api_key="
- + cfg.API_WHALE_ALERT_KEY
- )
- try:
- response = requests.get(url, timeout=2)
- if not 200 <= response.status_code < 300:
- logger.warning("Walert key defined, test failed")
- self.key_dict["WHALE_ALERT"] = "defined, test unsuccessful"
- else:
- logger.info("Walert key defined, test passed")
- self.key_dict["WHALE_ALERT"] = "defined, test passed"
- except Exception:
- logger.exception("Walert key defined, test failed")
- self.key_dict["WHALE_ALERT"] = "defined, test unsuccessful"
-
- if show_output:
- console.print(self.key_dict["WHALE_ALERT"] + "\n")
-
- def check_glassnode_key(self, show_output: bool = False) -> None:
- """Check glassnode key"""
- self.cfg_dict["GLASSNODE"] = "glassnode"
- if cfg.API_GLASSNODE_KEY == "REPLACE_ME":
- logger.info("Glassnode key not defined")
- self.key_dict["GLASSNODE"] = "not defined"
- else:
- url = "https://api.glassnode.com/v1/metrics/market/price_usd_close"
-
- parameters = {
- "api_key": cfg.API_GLASSNODE_KEY,
- "a": "BTC",
- "i": "24h",
- "s": str(1_614_556_800),
- "u": str(1_641_227_783_561),
- }
-
- r = requests.get(url, params=parameters)
- if r.status_code == 200:
- logger.info("Glassnode key defined, test passed")
- self.key_dict["GLASSNODE"] = "defined, test passed"
- else:
- logger.warning("Glassnode key defined, test failed")
- self.key_dict["GLASSNODE"] = "defined, test unsuccessful"
-
- if show_output:
- console.print(self.key_dict["GLASSNODE"] + "\n")
-
- def check_coinglass_key(self, show_output: bool = False) -> None:
- """Check coinglass key"""
- self.cfg_dict["COINGLASS"] = "coinglass"
- if cfg.API_COINGLASS_KEY == "REPLACE_ME":
- logger.info("Coinglass key not defined")
- self.key_dict["COINGLASS"] = "not defined"
- else:
- url = "https://open-api.coinglass.com/api/pro/v1/futures/openInterest/chart?&symbol=BTC&interval=0"
-
- headers = {"coinglassSecret": cfg.API_COINGLASS_KEY}
-
- response = requests.request("GET", url, headers=headers)
-
- if response.status_code == 200:
- logger.info("Coinglass key defined, test passed")
- self.key_dict["COINGLASS"] = "defined, test passed"
- else:
- logger.warning("Coinglass key defined, test failed")
- self.key_dict["COINGLASS"] = "defined, test unsuccessful"
-
- if show_output:
- console.print(self.key_dict["COINGLASS"] + "\n")
-
- def check_cpanic_key(self, show_output: bool = False) -> None:
- """Check cpanic key"""
- self.cfg_dict["CRYPTO_PANIC"] = "cpanic"
- if cfg.API_CRYPTO_PANIC_KEY == "REPLACE_ME":
- logger.info("cpanic key not defined")
- self.key_dict["CRYPTO_PANIC"] = "not defined"
- else:
- crypto_panic_url = f"https://cryptopanic.com/api/v1/posts/?auth_token={cfg.API_CRYPTO_PANIC_KEY}&kind=all"
- response = requests.get(crypto_panic_url)
-
- if not 200 <= response.status_code < 300:
- logger.warning("cpanic key defined, test failed")
- self.key_dict["CRYPTO_PANIC"] = "defined, test unsuccessful"
- try:
- logger.info("cpanic key defined, test passed")
- self.key_dict["CRYPTO_PANIC"] = "defined, test passed"
- except Exception as _: # noqa: F841
- logger.warning("cpanic key defined, test failed")
- self.key_dict["CRYPTO_PANIC"] = "defined, test unsuccessful"
-
- if show_output:
- console.print(self.key_dict["CRYPTO_PANIC"] + "\n")
-
- def check_ethplorer_key(self, show_output: bool = False) -> None:
- """Check ethplorer key"""
- self.cfg_dict["ETHPLORER"] = "ethplorer"
- if cfg.API_ETHPLORER_KEY == "REPLACE_ME":
- logger.info("ethplorer key not defined")
- self.key_dict["ETHPLORER"] = "not defined"
- else:
- ethplorer_url = "https://api.ethplorer.io/getTokenInfo/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984?apiKey="
- ethplorer_url += cfg.API_ETHPLORER_KEY
- response = requests.get(ethplorer_url)
- try:
- if response.status_code == 200:
- logger.info("ethplorer key defined, test passed")
- self.key_dict["ETHPLORER"] = "defined, test passed"
- else:
- logger.warning("ethplorer key defined, test failed")
- self.key_dict["ETHPLORER"] = "defined, test unsuccessful"
- except Exception as _: # noqa: F841
- logger.exception("ethplorer key defined, test failed")
- self.key_dict["ETHPLORER"] = "defined, test unsuccessful"
-
- if show_output:
- console.print(self.key_dict["ETHPLORER"] + "\n")
-
- def check_smartstake_key(self, show_output: bool = False) -> None:
- """Check Smartstake key"""
- self.cfg_dict["SMARTSTAKE"] = "smartstake"
- if "REPLACE_ME" in [
- cfg.API_SMARTSTAKE_TOKEN,
- cfg.API_SMARTSTAKE_KEY,
- ]:
- self.key_dict["SMARTSTAKE"] = "not defined"
- else:
- payload = {
- "type": "history",
- "dayCount": 30,
- "key": cfg.API_SMARTSTAKE_KEY,
- "token": cfg.API_SMARTSTAKE_TOKEN,
- }
-
- smartstake_url = "https://prod.smartstakeapi.com/listData?app=TERRA"
- response = requests.get(smartstake_url, params=payload) # type: ignore
-
- try:
- if response.status_code == 200:
- self.key_dict["SMARTSTAKE"] = "defined, test passed"
- else:
- self.key_dict["SMARTSTAKE"] = "defined, test unsuccessful"
- except Exception as _: # noqa: F841
- self.key_dict["SMARTSTAKE"] = "defined, test unsuccessful"
-
- if show_output:
- console.print(self.key_dict["SMARTSTAKE"] + "\n")
-
- def check_messari_key(self, show_output: bool = False) -> None:
- """Check Messari key"""
- self.cfg_dict["MESSARI"] = "messari"
- if (
- cfg.API_MESSARI_KEY == "REPLACE_ME" # pragma: allowlist secret
- ): # pragma: allowlist secret
- logger.info("Messari key not defined")
- self.key_dict["MESSARI"] = "not defined"
- else:
-
- url = "https://data.messari.io/api/v2/assets/bitcoin/profile"
- headers = {"x-messari-api-key": cfg.API_MESSARI_KEY}
- params = {"fields": "profile/general/overview/official_links"}
- r = requests.get(url, headers=headers, params=params)
-
- if r.status_code == 200:
- logger.info("FMessari key defined, test passed")
- self.key_dict["MESSARI"] = "defined, test passed"
- else:
- logger.warning("Messari key defined, test failed")
- self.key_dict["MESSARI"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["MESSARI"] + "\n")
-
- def check_eodhd_key(self, show_output: bool = False) -> None:
- """Check End of Day Historical Data key"""
- self.cfg_dict["EODHD"] = "eodhd"
- if cfg.API_EODHD_TOKEN == "REPLACE_ME": # nosec
- logger.info("End of Day Historical Data key not defined")
- self.key_dict["EODHD"] = "not defined"
- else:
- try:
- pyEX.Client(api_token=cfg.API_EODHD_TOKEN, version="v1")
- logger.info("End of Day Historical Data key defined, test passed")
- self.key_dict["EODHD"] = "defined, test passed"
- except PyEXception:
- logger.exception("End of Day Historical Data key defined, test failed")
- self.key_dict["EODHD"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["EODHD"] + "\n")
-
- def check_santiment_key(self, show_output: bool = False) -> None:
- """Check Santiment key"""
- self.cfg_dict["SANTIMENT"] = "santiment"
- if cfg.API_SANTIMENT_KEY == "REPLACE_ME":
- logger.info("santiment key not defined")
- self.key_dict["SANTIMENT"] = "not defined"
- else:
- headers = {
- "Content-Type": "application/graphql",
- "Authorization": f"Apikey {cfg.API_SANTIMENT_KEY}",
- }
-
- # pylint: disable=line-too-long
- data = '\n{{ getMetric(metric: "dev_activity"){{ timeseriesData( slug: "ethereum" from: ""2020-02-10T07:00:00Z"" to: "2020-03-10T07:00:00Z" interval: "1w"){{ datetime value }} }} }}' # noqa: E501
-
- response = requests.post(
- "https://api.santiment.net/graphql", headers=headers, data=data
- )
- try:
- if response.status_code == 200:
- logger.info("santiment key defined, test passed")
- self.key_dict["SANTIMENT"] = "defined, test passed"
- else:
- logger.warning("santiment key defined, test failed")
- self.key_dict["SANTIMENT"] = "defined, test failed"
- except Exception as _: # noqa: F841
- logger.exception("santiment key defined, test failed")
- self.key_dict["SANTIMENT"] = "defined, test failed"
-
- if show_output:
- console.print(self.key_dict["SANTIMENT"] + "\n")
-
def check_keys_status(self) -> None:
"""Check keys status"""
- self.check_av_key()
- self.check_fmp_key()
- self.check_quandl_key()
- self.check_polygon_key()
- self.check_fred_key()
- self.check_news_key()
- self.check_tradier_key()
- self.check_cmc_key()
- self.check_finnhub_key()
- self.check_iex_key()
- self.check_reddit_key()
- self.check_twitter_key()
- self.check_rh_key()
- self.check_degiro_key()
- self.check_oanda_key()
- self.check_binance_key()
- self.check_bitquery_key()
- self.check_si_key()
- self.check_coinbase_key()
- self.check_walert_key()
- self.check_glassnode_key()
- self.check_coinglass_key()
- self.check_cpanic_key()
- self.check_ethplorer_key()
- self.check_smartstake_key()
- self.check_github_key()
- self.check_messari_key()
- self.check_eodhd_key()
- self.check_santiment_key()
+
+ for api in tqdm(self.API_LIST, desc="Checking keys status"):
+ self.status_dict[api] = getattr(keys_model, "check_" + str(api) + "_key")()
def print_help(self):
"""Print help"""
@@ -860,54 +93,53 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
mt = MenuText("keys/")
mt.add_info("_keys_")
mt.add_raw("\n")
- for k, v in self.key_dict.items():
- cmd_name = self.cfg_dict[k]
- c = "red"
- if v == "defined, test passed":
+ mt.add_cmd("mykeys")
+ mt.add_raw("\n")
+ mt.add_info("_status_")
+
+ for cmd_name, status_msg in self.status_dict.items():
+ api_name = self.API_DICT[cmd_name]
+
+ c = "grey30"
+ if status_msg == str(keys_model.KeyStatus.DEFINED_TEST_PASSED):
c = "green"
- elif v == "defined":
- c = "green"
- elif v == "defined, test inconclusive":
+ elif status_msg == str(keys_model.KeyStatus.DEFINED_TEST_FAILED):
+ c = "red"
+ elif status_msg == str(keys_model.KeyStatus.DEFINED_NOT_TESTED):
c = "yellow"
- elif v == "not defined":
+ elif status_msg == str(keys_model.KeyStatus.DEFINED_TEST_INCONCLUSIVE):
+ c = "yellow"
+ elif status_msg == str(keys_model.KeyStatus.NOT_DEFINED):
c = "grey30"
+
mt.add_raw(
- f" [cmds]{cmd_name}[/cmds] {(20 - len(cmd_name)) * ' '}"
- f" [{c}] {k} {(25 - len(k)) * ' '} {translate(v)} [/{c}]\n"
+ f" [cmds]{cmd_name}[/cmds] {(20 - len(cmd_name)) * ' '}"
+ f" [{c}] {api_name} {(25 - len(api_name)) * ' '} {translate(status_msg)} [/{c}]\n"
)
console.print(text=mt.menu_text, menu="Keys")
@log_start_end(log=logger)
- def call_github(self, other_args: List[str]):
- """Process github command"""
+ def call_mykeys(self, other_args: List[str]):
+ """Display current keys"""
parser = argparse.ArgumentParser(
add_help=False,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
- prog="github",
- description="Set GitHub API key.",
+ prog="mykeys",
+ description="Display current keys.",
)
parser.add_argument(
- "-k",
- "--key",
- type=str,
- dest="key",
- help="key",
+ "-s", "--show", type=bool, dest="show", help="show", default=False
+ )
+ if other_args and "-s" in other_args[0]:
+ other_args.insert(1, "True")
+
+ ns_parser = self.parse_known_args_and_warn(
+ parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED
)
- if not other_args:
- console.print(
- "For your API Key, visit: https://docs.github.com/en/rest/guides/getting-started-with-the-rest-api\n"
- )
- return
- if other_args and "-" not in other_args[0][0]:
- other_args.insert(0, "-k")
- ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_GITHUB_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_GITHUB_KEY", ns_parser.key)
- cfg.API_GITHUB_KEY = ns_parser.key
- self.check_github_key(show_output=True)
+ keys_view.display_keys(show=ns_parser.show, export=ns_parser.export)
@log_start_end(log=logger)
def call_av(self, other_args: List[str]):
@@ -935,10 +167,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_KEY_ALPHAVANTAGE"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_KEY_ALPHAVANTAGE", ns_parser.key)
- cfg.API_KEY_ALPHAVANTAGE = ns_parser.key
- self.check_av_key(show_output=True)
+ self.status_dict["av"] = keys_model.set_av_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_fmp(self, other_args: List[str]):
@@ -966,12 +197,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_KEY_FINANCIALMODELINGPREP"] = ns_parser.key
- dotenv.set_key(
- self.env_file, "OPENBB_API_KEY_FINANCIALMODELINGPREP", ns_parser.key
+ self.status_dict["fmp"] = keys_model.set_fmp_key(
+ key=ns_parser.key, persist=True, show_output=True
)
- cfg.API_KEY_FINANCIALMODELINGPREP = ns_parser.key
- self.check_fmp_key(show_output=True)
@log_start_end(log=logger)
def call_quandl(self, other_args: List[str]):
@@ -997,10 +225,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_KEY_QUANDL"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_KEY_QUANDL", ns_parser.key)
- cfg.API_KEY_QUANDL = ns_parser.key
- self.check_quandl_key(show_output=True)
+ self.status_dict["quandl"] = keys_model.set_quandl_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_polygon(self, other_args: List[str]):
@@ -1026,10 +253,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_POLYGON_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_POLYGON_KEY", ns_parser.key)
- cfg.API_POLYGON_KEY = ns_parser.key
- self.check_polygon_key(show_output=True)
+ self.status_dict["polygon"] = keys_model.set_polygon_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_fred(self, other_args: List[str]):
@@ -1055,10 +281,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_FRED_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_FRED_KEY", ns_parser.key)
- cfg.API_FRED_KEY = ns_parser.key
- self.check_fred_key(show_output=True)
+ self.status_dict["fred"] = keys_model.set_fred_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_news(self, other_args: List[str]):
@@ -1084,10 +309,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_NEWS_TOKEN"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_NEWS_TOKEN", ns_parser.key)
- cfg.API_NEWS_TOKEN = ns_parser.key
- self.check_news_key(show_output=True)
+ self.status_dict["news"] = keys_model.set_news_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_tradier(self, other_args: List[str]):
@@ -1113,10 +337,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_TRADIER_TOKEN"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_TRADIER_TOKEN", ns_parser.key)
- cfg.TRADIER_TOKEN = ns_parser.key
- self.check_tradier_key(show_output=True)
+ self.status_dict["tradier"] = keys_model.set_tradier_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_cmc(self, other_args: List[str]):
@@ -1141,10 +364,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_CMC_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_CMC_KEY", ns_parser.key)
- cfg.API_CMC_KEY = ns_parser.key
- self.check_cmc_key(show_output=True)
+ self.status_dict["cmc"] = keys_model.set_cmc_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_finnhub(self, other_args: List[str]):
@@ -1169,10 +391,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_FINNHUB_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_FINNHUB_KEY", ns_parser.key)
- cfg.API_FINNHUB_KEY = ns_parser.key
- self.check_finnhub_key(show_output=True)
+ self.status_dict["finnhub"] = keys_model.set_finnhub_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_iex(self, other_args: List[str]):
@@ -1197,10 +418,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_IEX_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_IEX_KEY", ns_parser.key)
- cfg.API_IEX_TOKEN = ns_parser.key
- self.check_iex_key(show_output=True)
+ self.status_dict["iex"] = keys_model.set_iex_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_reddit(self, other_args: List[str]):
@@ -1257,42 +477,21 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
return
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_REDDIT_CLIENT_ID"] = ns_parser.client_id
- dotenv.set_key(
- self.env_file, "OPENBB_API_REDDIT_CLIENT_ID", ns_parser.client_id
- )
- cfg.API_REDDIT_CLIENT_ID = ns_parser.client_id
-
- os.environ["OPENBB_API_REDDIT_CLIENT_SECRET"] = ns_parser.client_secret
- dotenv.set_key(
- self.env_file,
- "OPENBB_API_REDDIT_CLIENT_SECRET",
- ns_parser.client_secret,
- )
- cfg.API_REDDIT_CLIENT_SECRET = ns_parser.client_secret
-
- os.environ["OPENBB_API_REDDIT_PASSWORD"] = ns_parser.password
- dotenv.set_key(
- self.env_file, "OPENBB_API_REDDIT_PASSWORD", ns_parser.password
- )
- cfg.API_REDDIT_PASSWORD = ns_parser.password
-
- os.environ["OPENBB_API_REDDIT_USERNAME"] = ns_parser.username
- dotenv.set_key(
- self.env_file, "OPENBB_API_REDDIT_USERNAME", ns_parser.username
- )
- cfg.API_REDDIT_USERNAME = ns_parser.username
slash_components = "".join([f"/{val}" for val in self.queue])
useragent = " ".join(ns_parser.user_agent) + " " + slash_components
useragent = useragent.replace('"', "")
self.queue = []
- os.environ["OPENBB_API_REDDIT_USER_AGENT"] = useragent
- dotenv.set_key(self.env_file, "OPENBB_API_REDDIT_USER_AGENT", useragent)
- cfg.API_REDDIT_USER_AGENT = useragent
-
- self.check_reddit_key(show_output=True)
+ self.status_dict["reddit"] = keys_model.set_reddit_key(
+ client_id=ns_parser.client_id,
+ client_secret=ns_parser.client_secret,
+ password=ns_parser.password,
+ username=ns_parser.username,
+ useragent=useragent,
+ persist=True,
+ show_output=True,
+ )
@log_start_end(log=logger)
def call_twitter(self, other_args: List[str]):
@@ -1315,7 +514,7 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
"-s",
"--secret",
type=str,
- dest="secret_key",
+ dest="secret",
help="Secret key",
required="-h" not in other_args,
)
@@ -1323,7 +522,7 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
"-t",
"--token",
type=str,
- dest="bearer_token",
+ dest="token",
help="Bearer token",
required="-h" not in other_args,
)
@@ -1332,23 +531,13 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
return
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_TWITTER_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_TWITTER_KEY", ns_parser.key)
- cfg.API_TWITTER_KEY = ns_parser.key
-
- os.environ["OPENBB_API_TWITTER_SECRET_KEY"] = ns_parser.secret_key
- dotenv.set_key(
- self.env_file, "OPENBB_API_TWITTER_SECRET_KEY", ns_parser.secret_key
+ self.status_dict["twitter"] = keys_model.set_twitter_key(
+ key=ns_parser.key,
+ secret=ns_parser.secret,
+ access_token=ns_parser.token,
+ persist=True,
+ show_output=True,
)
- cfg.API_TWITTER_SECRET_KEY = ns_parser.secret_key
-
- os.environ["OPENBB_API_TWITTER_BEARER_TOKEN"] = ns_parser.bearer_token
- dotenv.set_key(
- self.env_file, "OPENBB_API_TWITTER_BEARER_TOKEN", ns_parser.bearer_token
- )
- cfg.API_TWITTER_BEARER_TOKEN = ns_parser.bearer_token
-
- self.check_twitter_key(show_output=True)
@log_start_end(log=logger)
def call_rh(self, other_args: List[str]):
@@ -1378,15 +567,12 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
return
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_RH_USERNAME"] = ns_parser.username
- dotenv.set_key(self.env_file, "OPENBB_RH_USERNAME", ns_parser.username)
- cfg.RH_USERNAME = ns_parser.username
-
- os.environ["OPENBB_RH_PASSWORD"] = ns_parser.password
- dotenv.set_key(self.env_file, "OPENBB_RH_PASSWORD", ns_parser.password)
- cfg.RH_PASSWORD = ns_parser.password
-
- self.check_rh_key(show_output=True)
+ self.status_dict["rh"] = keys_model.set_rh_key(
+ username=ns_parser.username,
+ password=ns_parser.password,
+ persist=True,
+ show_output=True,
+ )
@log_start_end(log=logger)
def call_degiro(self, other_args: List[str]):
@@ -1417,26 +603,20 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
type=str,
dest="secret",
help="TOPT Secret",
+ default="",
)
if not other_args:
console.print("For your API Key, visit: https://www.degiro.fr\n")
return
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_DG_USERNAME"] = ns_parser.username
- dotenv.set_key(self.env_file, "OPENBB_DG_USERNAME", ns_parser.username)
- cfg.DG_USERNAME = ns_parser.username
-
- os.environ["OPENBB_DG_PASSWORD"] = ns_parser.password
- dotenv.set_key(self.env_file, "OPENBB_DG_PASSWORD", ns_parser.password)
- cfg.DG_PASSWORD = ns_parser.password
-
- if ns_parser.secret:
- os.environ["OPENBB_DG_TOTP_SECRET"] = ns_parser.secret
- dotenv.set_key(self.env_file, "OPENBB_DG_TOTP_SECRET", ns_parser.secret)
- cfg.DG_TOTP_SECRET = ns_parser.secret
-
- self.check_degiro_key(show_output=True)
+ self.status_dict["degiro"] = keys_model.set_degiro_key(
+ username=ns_parser.username,
+ password=ns_parser.password,
+ secret=ns_parser.secret,
+ persist=True,
+ show_output=True,
+ )
@log_start_end(log=logger)
def call_oanda(self, other_args: List[str]):
@@ -1472,24 +652,14 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
console.print("For your API Key, visit: https://developer.oanda.com\n")
return
ns_parser = parse_simple_args(parser, other_args)
- if not ns_parser:
- return
- if ns_parser.account:
- os.environ["OPENBB_OANDA_ACCOUNT"] = ns_parser.account
- dotenv.set_key(self.env_file, "OPENBB_OANDA_ACCOUNT", ns_parser.account)
- cfg.OANDA_ACCOUNT = ns_parser.account
- if ns_parser.token:
- os.environ["OPENBB_OANDA_TOKEN"] = ns_parser.token
- dotenv.set_key(self.env_file, "OPENBB_OANDA_TOKEN", ns_parser.token)
- cfg.OANDA_TOKEN = ns_parser.token
- if ns_parser.account_type:
- os.environ["OPENBB_OANDA_ACCOUNT_TYPE"] = ns_parser.account_type
- dotenv.set_key(
- self.env_file, "OPENBB_OANDA_ACCOUNT_TYPE", ns_parser.account_type
+ if ns_parser:
+ self.status_dict["oanda"] = keys_model.set_oanda_key(
+ account=ns_parser.account,
+ access_token=ns_parser.token,
+ account_type=ns_parser.account_type,
+ persist=True,
+ show_output=True,
)
- cfg.OANDA_ACCOUNT_TYPE = ns_parser.account_type
-
- self.check_oanda_key(show_output=True)
@log_start_end(log=logger)
def call_binance(self, other_args: List[str]):
@@ -1511,7 +681,7 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
"-s",
"--secret",
type=str,
- dest="secret_key",
+ dest="secret",
help="Secret key",
)
if not other_args:
@@ -1519,17 +689,12 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
return
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_BINANCE_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_BINANCE_KEY", ns_parser.key)
- cfg.API_BINANCE_KEY = ns_parser.key
-
- os.environ["OPENBB_API_BINANCE_SECRET"] = ns_parser.secret_key
- dotenv.set_key(
- self.env_file, "OPENBB_API_BINANCE_SECRET", ns_parser.secret_key
+ self.status_dict["binance"] = keys_model.set_binance_key(
+ key=ns_parser.key,
+ secret=ns_parser.secret,
+ persist=True,
+ show_output=True,
)
- cfg.API_BINANCE_SECRET = ns_parser.secret_key
-
- self.check_binance_key(show_output=True)
@log_start_end(log=logger)
def call_bitquery(self, other_args: List[str]):
@@ -1554,11 +719,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_BITQUERY_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_BITQUERY_KEY", ns_parser.key)
- cfg.API_BITQUERY_KEY = ns_parser.key
-
- self.check_bitquery_key(show_output=True)
+ self.status_dict["bitquery"] = keys_model.set_bitquery_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_si(self, other_args: List[str]):
@@ -1583,13 +746,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_SENTIMENTINVESTOR_TOKEN"] = ns_parser.key
- dotenv.set_key(
- self.env_file, "OPENBB_API_SENTIMENTINVESTOR_TOKEN", ns_parser.key
+ self.status_dict["si"] = keys_model.set_si_key(
+ key=ns_parser.key, persist=True, show_output=True
)
- cfg.API_SENTIMENTINVESTOR_TOKEN = ns_parser.key
-
- self.check_si_key(show_output=True)
@log_start_end(log=logger)
def call_coinbase(self, other_args: List[str]):
@@ -1611,7 +770,7 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
"-s",
"--secret",
type=str,
- dest="secret_key",
+ dest="secret",
help="Secret key",
)
parser.add_argument(
@@ -1626,23 +785,13 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
return
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_COINBASE_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_COINBASE_KEY", ns_parser.key)
- cfg.API_COINBASE_KEY = ns_parser.key
-
- os.environ["OPENBB_API_COINBASE_SECRET"] = ns_parser.secret_key
- dotenv.set_key(
- self.env_file, "OPENBB_API_COINBASE_SECRET", ns_parser.secret_key
+ self.status_dict["coinbase"] = keys_model.set_coinbase_key(
+ key=ns_parser.key,
+ secret=ns_parser.secret,
+ passphrase=ns_parser.passphrase,
+ persist=True,
+ show_output=True,
)
- cfg.API_COINBASE_SECRET = ns_parser.secret_key
-
- os.environ["OPENBB_API_COINBASE_PASS_PHRASE"] = ns_parser.passphrase
- dotenv.set_key(
- self.env_file, "OPENBB_API_COINBASE_PASS_PHRASE", ns_parser.passphrase
- )
- cfg.API_COINBASE_PASS_PHRASE = ns_parser.passphrase
-
- self.check_coinbase_key(show_output=True)
@log_start_end(log=logger)
def call_walert(self, other_args: List[str]):
@@ -1667,11 +816,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_WHALE_ALERT_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_WHALE_ALERT_KEY", ns_parser.key)
- cfg.API_WHALE_ALERT_KEY = ns_parser.key
-
- self.check_walert_key(show_output=True)
+ self.status_dict["walert"] = keys_model.set_walert_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_glassnode(self, other_args: List[str]):
@@ -1680,7 +827,7 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
add_help=False,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
prog="glassnode",
- description="Set Whale Alert API key.",
+ description="Set Glassnode API key.",
)
parser.add_argument(
"-k",
@@ -1698,11 +845,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_GLASSNODE_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_GLASSNODE_KEY", ns_parser.key)
- cfg.API_GLASSNODE_KEY = ns_parser.key
-
- self.check_glassnode_key(show_output=True)
+ self.status_dict["glassnode"] = keys_model.set_glassnode_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_coinglass(self, other_args: List[str]):
@@ -1729,12 +874,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- print(type(ns_parser.key))
- os.environ["OPENBB_API_COINGLASS_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_COINGLASS_KEY", ns_parser.key)
- cfg.API_COINGLASS_KEY = ns_parser.key
-
- self.check_coinglass_key(show_output=True)
+ self.status_dict["coinglass"] = keys_model.set_coinglass_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_cpanic(self, other_args: List[str]):
@@ -1761,11 +903,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_CRYPTO_PANIC_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_CRYPTO_PANIC_KEY", ns_parser.key)
- cfg.API_CRYPTO_PANIC_KEY = ns_parser.key
-
- self.check_cpanic_key(show_output=True)
+ self.status_dict["cpanic"] = keys_model.set_cpanic_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_ethplorer(self, other_args: List[str]):
@@ -1792,11 +932,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_ETHPLORER_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_ETHPLORER_KEY", ns_parser.key)
- cfg.API_ETHPLORER_KEY = ns_parser.key
-
- self.check_ethplorer_key(show_output=True)
+ self.status_dict["ethplorer"] = keys_model.set_ethplorer_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_smartstake(self, other_args: List[str]):
@@ -1827,17 +965,42 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_SMARTSTAKE_TOKEN"] = ns_parser.token
- dotenv.set_key(
- self.env_file, "OPENBB_API_SMARTSTAKE_TOKEN", ns_parser.token
+ self.status_dict["smartstake"] = keys_model.set_smartstake_key(
+ key=ns_parser.key,
+ access_token=ns_parser.token,
+ persist=True,
+ show_output=True,
)
- cfg.API_SMARTSTAKE_TOKEN = ns_parser.token
- os.environ["OPENBB_API_SMARTSTAKE_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_SMARTSTAKE_KEY", ns_parser.key)
- cfg.API_SMARTSTAKE_KEY = ns_parser.key
+ @log_start_end(log=logger)
+ def call_github(self, other_args: List[str]):
+ """Process github command"""
+ parser = argparse.ArgumentParser(
+ add_help=False,
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+ prog="github",
+ description="Set GitHub API key.",
+ )
+ parser.add_argument(
+ "-k",
+ "--key",
+ type=str,
+ dest="key",
+ help="key",
+ )
+ if not other_args:
+ console.print(
+ "For your API Key, visit: https://docs.github.com/en/rest/guides/getting-started-with-the-rest-api\n"
+ )
+ return
- self.check_smartstake_key(show_output=True)
+ if other_args and "-" not in other_args[0][0]:
+ other_args.insert(0, "-k")
+ ns_parser = parse_simple_args(parser, other_args)
+ if ns_parser:
+ self.status_dict["github"] = keys_model.set_github_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_messari(self, other_args: List[str]):
@@ -1863,10 +1026,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_MESSARI_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_MESSARI_KEY", ns_parser.key)
- cfg.API_MESSARI_KEY = ns_parser.key
- self.check_messari_key(show_output=True)
+ self.status_dict["messari"] = keys_model.set_messari_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
@log_start_end(log=logger)
def call_eodhd(self, other_args: List[str]):
@@ -1893,10 +1055,9 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["API_EODHD_TOKEN"] = ns_parser.key
- dotenv.set_key(self.env_file, "API_EODHD_TOKEN", ns_parser.key)
- cfg.API_EODHD_TOKEN = ns_parser.key
- self.check_eodhd_key(show_output=True)
+ self.status_dict["eodhd"] = keys_model.set_eodhd_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
def call_santiment(self, other_args: List[str]):
"""Process santiment command"""
@@ -1923,7 +1084,6 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
other_args.insert(0, "-k")
ns_parser = parse_simple_args(parser, other_args)
if ns_parser:
- os.environ["OPENBB_API_SANTIMENT_KEY"] = ns_parser.key
- dotenv.set_key(self.env_file, "OPENBB_API_SANTIMENT_KEY", ns_parser.key)
- cfg.API_SANTIMENT_KEY = ns_parser.key
- self.check_santiment_key(show_output=True)
+ self.status_dict["santiment"] = keys_model.set_santiment_key(
+ key=ns_parser.key, persist=True, show_output=True
+ )
diff --git a/openbb_terminal/keys_model.py b/openbb_terminal/keys_model.py
new file mode 100644
index 00000000000..bccfae7c044
--- /dev/null
+++ b/openbb_terminal/keys_model.py
@@ -0,0 +1,2034 @@
+"""Keys model"""
+__docformat__ = "numpy"
+
+import sys
+import logging
+import os
+from enum import Enum
+import binance
+import dotenv
+import pandas as pd
+import quandl
+import requests
+from prawcore.exceptions import ResponseException
+import praw
+import pyEX
+import oandapyV20.endpoints.pricing
+from oandapyV20 import API as oanda_API
+from coinmarketcapapi import CoinMarketCapAPI
+from alpha_vantage.timeseries import TimeSeries
+from openbb_terminal.cryptocurrency.coinbase_helpers import (
+ CoinbaseProAuth,
+ make_coinbase_request,
+ CoinbaseApiException,
+)
+from openbb_terminal import config_terminal as cfg
+from openbb_terminal.core.config.paths import USER_ENV_FILE
+from openbb_terminal.rich_config import console
+
+from openbb_terminal.terminal_helper import suppress_stdout
+
+# pylint: disable=too-many-lines
+
+logger = logging.getLogger(__name__)
+
+sys.tracebacklimit = 0
+
+
+class KeyStatus(str, Enum):
+ """Class to handle status messages and colors"""
+
+ DEFINED_TEST_FAILED = "defined, test failed"
+ NOT_DEFINED = "not defined"
+ DEFINED_TEST_PASSED = "defined, test passed"
+ DEFINED_TEST_INCONCLUSIVE = "defined, test inconclusive"
+ DEFINED_NOT_TESTED = "defined, not tested"
+
+ def __str__(self):
+ return self.value
+
+ def colorize(self):
+ if self.name == self.DEFINED_TEST_FAILED.name:
+ c = "red"
+ elif self.name == self.NOT_DEFINED.name:
+ c = "grey30"
+ elif self.name == self.DEFINED_TEST_PASSED.name:
+ c = "green"
+ elif self.name == self.DEFINED_TEST_INCONCLUSIVE.name:
+ c = "yellow"
+ elif self.name == self.DEFINED_NOT_TESTED.name:
+ c = "yellow"
+
+ return f"[{c}]{self.value}[/{c}]"
+
+
+def set_key(env_var_name: str, env_var_value: str, persist: bool = False) -> None:
+ """Set API key.
+
+ Parameters
+ ----------
+ env_var_name: str
+ API name
+ env_var_value: str
+ API key
+ 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.
+ """
+ if persist:
+ os.environ[env_var_name] = env_var_value
+ dotenv.set_key(str(USER_ENV_FILE), env_var_name, env_var_value)
+
+ # Remove "OPENBB_" prefix from env_var
+ if env_var_name.startswith("OPENBB_"):
+ env_var_name = env_var_name[7:]
+
+ # Set cfg.env_var_name = env_var_value
+ setattr(cfg, env_var_name, env_var_value)
+
+
+def get_keys(show: bool = False) -> pd.DataFrame:
+ """Get currently set API keys.
+
+ Parameters
+ ----------
+ show: bool
+ Flag to choose whether to show actual keys or not.
+ By default, False.
+
+ Returns:
+ pd.DataFrame: currents keys
+ """
+
+ # TODO: Refactor api variables without prefix API_ and extend API_SOURCE_KEY format
+
+ var_list = [v for v in dir(cfg) if v.startswith("API_")]
+
+ current_keys = {}
+
+ for cfg_var_name in var_list:
+ cfg_var_value = getattr(cfg, cfg_var_name)
+ if cfg_var_value != "REPLACE_ME":
+ current_keys[cfg_var_name[4:]] = cfg_var_value
+
+ if current_keys:
+ df = pd.DataFrame.from_dict(current_keys, orient="index")
+ df.index.name = "API"
+ df = df.rename(columns={0: "Key"})
+ if show:
+ return df
+ df["Key"] = "*******"
+ return df
+
+ return pd.DataFrame()
+
+
+def set_av_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Alpha Vantage key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_KEY_ALPHAVANTAGE", key, persist)
+ return check_av_key(show_output)
+
+
+def check_av_key(show_output: bool = False) -> str:
+ """Check Alpha Vantage key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_KEY_ALPHAVANTAGE == "REPLACE_ME": # pragma: allowlist secret
+ logger.info("Alpha Vantage key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ df = TimeSeries(
+ key=cfg.API_KEY_ALPHAVANTAGE, output_format="pandas"
+ ).get_intraday(symbol="AAPL")
+ if df[0].empty: # pylint: disable=no-member
+ logger.warning("Alpha Vantage key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ else:
+ logger.info("Alpha Vantage key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_fmp_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Financial Modeling Prep key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_KEY_FINANCIALMODELINGPREP", key, persist)
+ return check_fmp_key(show_output)
+
+
+def check_fmp_key(show_output: bool = False) -> str:
+ """Check Financial Modeling Prep key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if (
+ cfg.API_KEY_FINANCIALMODELINGPREP == "REPLACE_ME" # pragma: allowlist secret
+ ): # pragma: allowlist secret
+ logger.info("Financial Modeling Prep key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ r = requests.get(
+ f"https://financialmodelingprep.com/api/v3/profile/AAPL?apikey={cfg.API_KEY_FINANCIALMODELINGPREP}"
+ )
+ if r.status_code in [403, 401] or "Error Message" in str(r.content):
+ logger.warning("Financial Modeling Prep key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ elif r.status_code == 200:
+ logger.info("Financial Modeling Prep key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Financial Modeling Prep key defined, test inconclusive")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_quandl_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Quandl key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_KEY_QUANDL", key, persist)
+ return check_quandl_key(show_output)
+
+
+def check_quandl_key(show_output: bool = False) -> str:
+ """Check Quandl key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_KEY_QUANDL == "REPLACE_ME": # pragma: allowlist secret
+ logger.info("Quandl key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ try:
+ quandl.save_key(cfg.API_KEY_QUANDL)
+ quandl.get("EIA/PET_RWTC_D")
+ logger.info("Quandl key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ except Exception as _: # noqa: F841
+ logger.warning("Quandl key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_polygon_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Polygon key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_POLYGON_KEY", key, persist)
+ return check_polygon_key(show_output)
+
+
+def check_polygon_key(show_output: bool = False) -> str:
+ """Check Polygon key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_POLYGON_KEY == "REPLACE_ME":
+ logger.info("Polygon key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ r = requests.get(
+ "https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/day/2020-06-01/2020-06-17"
+ f"?apiKey={cfg.API_POLYGON_KEY}"
+ )
+ if r.status_code in [403, 401]:
+ logger.warning("Polygon key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ elif r.status_code == 200:
+ logger.info("Polygon key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Polygon key defined, test inconclusive")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_fred_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set FRED key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_FRED_KEY", key, persist)
+ return check_fred_key(show_output)
+
+
+def check_fred_key(show_output: bool = False) -> str:
+ """Check FRED key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_FRED_KEY == "REPLACE_ME":
+ logger.info("FRED key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ r = requests.get(
+ f"https://api.stlouisfed.org/fred/series?series_id=GNPCA&api_key={cfg.API_FRED_KEY}"
+ )
+ if r.status_code in [403, 401, 400]:
+ logger.warning("FRED key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ elif r.status_code == 200:
+ logger.info("FRED key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("FRED key defined, test inconclusive")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_news_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set News key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_NEWS_TOKEN", key, persist)
+ return check_news_key(show_output)
+
+
+def check_news_key(show_output: bool = False) -> str:
+ """Check News key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_NEWS_TOKEN == "REPLACE_ME": # nosec
+ logger.info("News API key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ r = requests.get(
+ f"https://newsapi.org/v2/everything?q=keyword&apiKey={cfg.API_NEWS_TOKEN}"
+ )
+ if r.status_code in [401, 403]:
+ logger.warning("News API key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ elif r.status_code == 200:
+ logger.info("News API key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("News API key defined, test inconclusive")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_tradier_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Tradier key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_TRADIER_TOKEN", key, persist)
+ return check_tradier_key(show_output)
+
+
+def check_tradier_key(show_output: bool = False) -> str:
+ """Check Tradier key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_TRADIER_TOKEN == "REPLACE_ME": # nosec
+ logger.info("Tradier key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ r = requests.get(
+ "https://sandbox.tradier.com/v1/markets/quotes",
+ params={"symbols": "AAPL"},
+ headers={
+ "Authorization": f"Bearer {cfg.API_TRADIER_TOKEN}",
+ "Accept": "application/json",
+ },
+ )
+ if r.status_code in [401, 403]:
+ logger.warning("Tradier key not defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ elif r.status_code == 200:
+ logger.info("Tradier key not defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Tradier key not defined, test inconclusive")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_cmc_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Coinmarketcap key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_CMC_KEY", key, persist)
+ return check_cmc_key(show_output)
+
+
+def check_cmc_key(show_output: bool = False) -> str:
+ """Check Coinmarketcap key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_CMC_KEY == "REPLACE_ME":
+ logger.info("Coinmarketcap key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ cmc = CoinMarketCapAPI(cfg.API_CMC_KEY)
+
+ try:
+ cmc.cryptocurrency_map()
+ logger.info("Coinmarketcap key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ except Exception:
+ logger.info("Coinmarketcap key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_finnhub_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Finnhub key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_FINNHUB_KEY", key, persist)
+ return check_finnhub_key(show_output)
+
+
+def check_finnhub_key(show_output: bool = False) -> str:
+ """Check Finnhub key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_FINNHUB_KEY == "REPLACE_ME":
+ logger.info("Finnhub key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ r = r = requests.get(
+ f"https://finnhub.io/api/v1/quote?symbol=AAPL&token={cfg.API_FINNHUB_KEY}"
+ )
+ if r.status_code in [403, 401, 400]:
+ logger.warning("Finnhub key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ elif r.status_code == 200:
+ logger.info("Finnhub key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Finnhub key defined, test inconclusive")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_iex_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set IEX Cloud key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_IEX_TOKEN", key, persist)
+ return check_iex_key(show_output)
+
+
+def check_iex_key(show_output: bool = False) -> str:
+ """Check IEX Cloud key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_IEX_TOKEN == "REPLACE_ME": # nosec
+ logger.info("IEX Cloud key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ try:
+ pyEX.Client(api_token=cfg.API_IEX_TOKEN, version="v1").quote(symbol="AAPL")
+ logger.info("IEX Cloud key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ except Exception as _: # noqa: F841
+ logger.warning("IEX Cloud key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_reddit_key(
+ client_id: str,
+ client_secret: str,
+ password: str,
+ username: str,
+ useragent: str,
+ persist: bool = False,
+ show_output: bool = False,
+) -> str:
+ """Set Reddit key
+
+ Parameters
+ ----------
+ client_id: str
+ client_secret: str
+ password: str
+ username: str
+ useragent: str
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_REDDIT_CLIENT_ID", client_id, persist)
+ set_key("OPENBB_API_REDDIT_CLIENT_SECRET", client_secret, persist)
+ set_key("OPENBB_API_REDDIT_PASSWORD", password, persist)
+ set_key("OPENBB_API_REDDIT_USERNAME", username, persist)
+ set_key("OPENBB_API_REDDIT_USER_AGENT", useragent, persist)
+
+ return check_reddit_key(show_output)
+
+
+def check_reddit_key(show_output: bool = False) -> str:
+ """Check Reddit key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ reddit_keys = [
+ cfg.API_REDDIT_CLIENT_ID,
+ cfg.API_REDDIT_CLIENT_SECRET,
+ cfg.API_REDDIT_USERNAME,
+ cfg.API_REDDIT_PASSWORD,
+ cfg.API_REDDIT_USER_AGENT,
+ ]
+ if "REPLACE_ME" in reddit_keys:
+ logger.info("Reddit key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+
+ try:
+ with suppress_stdout():
+ praw_api = praw.Reddit(
+ client_id=cfg.API_REDDIT_CLIENT_ID,
+ client_secret=cfg.API_REDDIT_CLIENT_SECRET,
+ username=cfg.API_REDDIT_USERNAME,
+ user_agent=cfg.API_REDDIT_USER_AGENT,
+ password=cfg.API_REDDIT_PASSWORD,
+ check_for_updates=False,
+ comment_kind="t1",
+ message_kind="t4",
+ redditor_kind="t2",
+ submission_kind="t3",
+ subreddit_kind="t5",
+ trophy_kind="t6",
+ oauth_url="https://oauth.reddit.com",
+ reddit_url="https://www.reddit.com",
+ short_url="https://redd.it",
+ ratelimit_seconds=5,
+ timeout=16,
+ )
+
+ praw_api.user.me()
+ logger.info("Reddit key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ except (Exception, ResponseException):
+ logger.warning("Reddit key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_bitquery_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Bitquery key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_BITQUERY_KEY", key, persist)
+ return check_bitquery_key(show_output)
+
+
+def check_bitquery_key(show_output: bool = False) -> str:
+ """Check Bitquery key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ bitquery = cfg.API_BITQUERY_KEY
+ if "REPLACE_ME" in bitquery:
+ logger.info("Bitquery key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ headers = {"x-api-key": cfg.API_BITQUERY_KEY}
+ query = """
+ {
+ ethereum {
+ dexTrades(options: {limit: 10, desc: "count"}) {
+ count
+ protocol
+ }}}
+ """
+ r = requests.post(
+ "https://graphql.bitquery.io", json={"query": query}, headers=headers
+ )
+ if r.status_code == 200:
+ logger.info("Bitquery key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Bitquery key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_twitter_key(
+ key: str,
+ secret: str,
+ access_token: str,
+ persist: bool = False,
+ show_output: bool = False,
+) -> str:
+ """Set Twitter key
+
+ Parameters
+ ----------
+ key: str
+ secret: str
+ access_token: str
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_TWITTER_KEY", key, persist)
+ set_key("OPENBB_API_TWITTER_SECRET_KEY", secret, persist)
+ set_key("OPENBB_API_TWITTER_BEARER_TOKEN", access_token, persist)
+
+ return check_twitter_key(show_output)
+
+
+def check_twitter_key(show_output: bool = False) -> str:
+ """Check Twitter key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ twitter_keys = [
+ cfg.API_TWITTER_KEY,
+ cfg.API_TWITTER_SECRET_KEY,
+ cfg.API_TWITTER_BEARER_TOKEN,
+ ]
+ if "REPLACE_ME" in twitter_keys:
+ logger.info("Twitter key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ params = {
+ "query": "(\\$AAPL) (lang:en)",
+ "max_results": "10",
+ "tweet.fields": "created_at,lang",
+ }
+ r = requests.get(
+ "https://api.twitter.com/2/tweets/search/recent",
+ params=params, # type: ignore
+ headers={"authorization": "Bearer " + cfg.API_TWITTER_BEARER_TOKEN},
+ )
+ if r.status_code == 200:
+ logger.info("Twitter key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ elif r.status_code in [401, 403]:
+ logger.warning("Twitter key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ else:
+ logger.warning("Twitter key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_rh_key(
+ username: str,
+ password: str,
+ persist: bool = False,
+ show_output: bool = False,
+) -> str:
+ """Set Robinhood key
+
+ Parameters
+ ----------
+ username: str
+ password: str
+ 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: str
+
+ """
+
+ set_key("OPENBB_RH_USERNAME", username, persist)
+ set_key("OPENBB_RH_PASSWORD", password, persist)
+
+ return check_rh_key(show_output)
+
+
+def check_rh_key(show_output: bool = False) -> str:
+ """Check Robinhood key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ rh_keys = [cfg.RH_USERNAME, cfg.RH_PASSWORD]
+ if "REPLACE_ME" in rh_keys:
+ logger.info("Robinhood key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ logger.info("Robinhood key defined, not tested")
+ status = KeyStatus.DEFINED_NOT_TESTED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_degiro_key(
+ username: str,
+ password: str,
+ secret: str = "",
+ persist: bool = False,
+ show_output: bool = False,
+) -> str:
+ """Set Degiro key
+
+ Parameters
+ ----------
+ username: str
+ password: str
+ secret: str
+ 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: str
+
+ """
+
+ set_key("OPENBB_DG_USERNAME", username, persist)
+ set_key("OPENBB_DG_PASSWORD", password, persist)
+ set_key("OPENBB_DG_TOTP_SECRET", secret, persist)
+
+ return check_degiro_key(show_output)
+
+
+def check_degiro_key(show_output: bool = False) -> str:
+ """Check Degiro key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ dg_keys = [cfg.DG_USERNAME, cfg.DG_PASSWORD, cfg.DG_TOTP_SECRET]
+ if "REPLACE_ME" in dg_keys:
+ logger.info("Degiro key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ logger.info("Degiro key defined, not tested")
+ status = KeyStatus.DEFINED_NOT_TESTED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_oanda_key(
+ account: str,
+ access_token: str,
+ account_type: str = "",
+ persist: bool = False,
+ show_output: bool = False,
+) -> str:
+ """Set Oanda key
+
+ Parameters
+ ----------
+ account: str
+ access_token: str
+ account_type: str
+ 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: str
+
+ """
+
+ set_key("OPENBB_OANDA_ACCOUNT", account, persist)
+ set_key("OPENBB_OANDA_TOKEN", access_token, persist)
+ set_key("OPENBB_OANDA_ACCOUNT_TYPE", account_type, persist)
+
+ return check_oanda_key(show_output)
+
+
+def check_oanda_key(show_output: bool = False) -> str:
+ """Check Oanda key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ oanda_keys = [cfg.OANDA_TOKEN, cfg.OANDA_ACCOUNT]
+ if "REPLACE_ME" in oanda_keys:
+ logger.info("Oanda key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ client = oanda_API(access_token=cfg.OANDA_TOKEN)
+ account = cfg.OANDA_ACCOUNT
+ try:
+ parameters = {"instruments": "EUR_USD"}
+ request = oandapyV20.endpoints.pricing.PricingInfo(
+ accountID=account, params=parameters
+ )
+ client.request(request)
+ logger.info("Oanda key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+
+ except Exception:
+ logger.info("Oanda key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_binance_key(
+ key: str,
+ secret: str,
+ persist: bool = False,
+ show_output: bool = False,
+) -> str:
+ """Set Binance key
+
+ Parameters
+ ----------
+ key: str
+ secret: str
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_BINANCE_KEY", key, persist)
+ set_key("OPENBB_API_BINANCE_SECRET", secret, persist)
+
+ return check_binance_key(show_output)
+
+
+def check_binance_key(show_output: bool = False) -> str:
+ """Check Binance key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if "REPLACE_ME" in [cfg.API_BINANCE_KEY, cfg.API_BINANCE_SECRET]:
+ logger.info("Binance key not defined")
+ status = KeyStatus.NOT_DEFINED
+
+ else:
+ try:
+ client = binance.Client(cfg.API_BINANCE_KEY, cfg.API_BINANCE_SECRET)
+ client.get_account_api_permissions()
+ logger.info("Binance key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ except Exception:
+ logger.warning("Binance key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_si_key(
+ key: str,
+ persist: bool = False,
+ show_output: bool = False,
+) -> str:
+ """Set Sentimentinvestor key.
+
+ Parameters
+ ----------
+ key: str
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_SENTIMENTINVESTOR_TOKEN", key, persist)
+
+ return check_si_key(show_output)
+
+
+def check_si_key(show_output: bool = False) -> str:
+ """Check Sentimentinvestor key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+
+ """
+
+ si_keys = [cfg.API_SENTIMENTINVESTOR_TOKEN]
+ if "REPLACE_ME" in si_keys:
+ logger.info("Sentiment Investor key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ try:
+ account = requests.get(
+ f"https://api.sentimentinvestor.com/v1/trending"
+ f"?token={cfg.API_SENTIMENTINVESTOR_TOKEN}"
+ )
+ if account.ok and account.json().get("success", False):
+ logger.info("Sentiment Investor key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Sentiment Investor key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ except Exception:
+ logger.warning("Sentiment Investor key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_coinbase_key(
+ key: str,
+ secret: str,
+ passphrase: str,
+ persist: bool = False,
+ show_output: bool = False,
+) -> str:
+ """Set Coinbase key
+
+ Parameters
+ ----------
+ key: str
+ secret: str
+ passphrase: str
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_COINBASE_KEY", key, persist)
+ set_key("OPENBB_API_COINBASE_SECRET", secret, persist)
+ set_key("OPENBB_API_COINBASE_PASS_PHRASE", passphrase, persist)
+
+ return check_coinbase_key(show_output)
+
+
+def check_coinbase_key(show_output: bool = False) -> str:
+ """Check Coinbase key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if "REPLACE_ME" in [
+ cfg.API_COINBASE_KEY,
+ cfg.API_COINBASE_SECRET,
+ cfg.API_COINBASE_PASS_PHRASE,
+ ]:
+ logger.info("Coinbase key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ auth = CoinbaseProAuth(
+ cfg.API_COINBASE_KEY,
+ cfg.API_COINBASE_SECRET,
+ cfg.API_COINBASE_PASS_PHRASE,
+ )
+ try:
+ resp = make_coinbase_request("/accounts", auth=auth)
+ except CoinbaseApiException:
+ resp = None
+ if not resp:
+ logger.warning("Coinbase key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ else:
+ logger.info("Coinbase key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_walert_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Walert key
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_WHALE_ALERT_KEY", key, persist)
+ return check_walert_key(show_output)
+
+
+def check_walert_key(show_output: bool = False) -> str:
+ """Check Walert key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_WHALE_ALERT_KEY == "REPLACE_ME":
+ logger.info("Walert key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ url = (
+ "https://api.whale-alert.io/v1/transactions?api_key="
+ + cfg.API_WHALE_ALERT_KEY
+ )
+ try:
+ response = requests.get(url, timeout=2)
+ if not 200 <= response.status_code < 300:
+ logger.warning("Walert key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ else:
+ logger.info("Walert key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ except Exception:
+ logger.info("Walert key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_glassnode_key(
+ key: str, persist: bool = False, show_output: bool = False
+) -> str:
+ """Set Glassnode key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_GLASSNODE_KEY", key, persist)
+ return check_glassnode_key(show_output)
+
+
+def check_glassnode_key(show_output: bool = False) -> str:
+ """Check Glassnode key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_GLASSNODE_KEY == "REPLACE_ME":
+ logger.info("Glassnode key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ url = "https://api.glassnode.com/v1/metrics/market/price_usd_close"
+
+ parameters = {
+ "api_key": cfg.API_GLASSNODE_KEY,
+ "a": "BTC",
+ "i": "24h",
+ "s": str(1_614_556_800),
+ "u": str(1_641_227_783_561),
+ }
+
+ r = requests.get(url, params=parameters)
+ if r.status_code == 200:
+ logger.info("Glassnode key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Glassnode key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_coinglass_key(
+ key: str, persist: bool = False, show_output: bool = False
+) -> str:
+ """Set Coinglass key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_COINGLASS_KEY", key, persist)
+ return check_coinglass_key(show_output)
+
+
+def check_coinglass_key(show_output: bool = False) -> str:
+ """Check Coinglass key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_COINGLASS_KEY == "REPLACE_ME":
+ logger.info("Coinglass key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ url = "https://open-api.coinglass.com/api/pro/v1/futures/openInterest/chart?&symbol=BTC&interval=0"
+
+ headers = {"coinglassSecret": cfg.API_COINGLASS_KEY}
+
+ response = requests.request("GET", url, headers=headers)
+
+ if """success":false""" in str(response.content):
+ logger.warning("Coinglass key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ elif response.status_code == 200:
+ logger.info("Coinglass key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Coinglass key defined, test inconclusive")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_cpanic_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Cpanic key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_CRYPTO_PANIC_KEY", key, persist)
+ return check_cpanic_key(show_output)
+
+
+def check_cpanic_key(show_output: bool = False) -> str:
+ """Check Cpanic key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_CRYPTO_PANIC_KEY == "REPLACE_ME":
+ logger.info("cpanic key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ crypto_panic_url = f"https://cryptopanic.com/api/v1/posts/?auth_token={cfg.API_CRYPTO_PANIC_KEY}"
+ response = requests.get(crypto_panic_url)
+
+ if response.status_code == 200:
+ logger.info("Cpanic key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Cpanic key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_ethplorer_key(
+ key: str, persist: bool = False, show_output: bool = False
+) -> str:
+ """Set Ethplorer key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_ETHPLORER_KEY", key, persist)
+ return check_ethplorer_key(show_output)
+
+
+def check_ethplorer_key(show_output: bool = False) -> str:
+ """Check Ethplorer key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_ETHPLORER_KEY == "REPLACE_ME":
+ logger.info("ethplorer key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ ethplorer_url = "https://api.ethplorer.io/getTokenInfo/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984?apiKey="
+ ethplorer_url += cfg.API_ETHPLORER_KEY
+
+ try:
+ response = requests.get(ethplorer_url)
+ if response.status_code == 200:
+ logger.info("ethplorer key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("ethplorer key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ except Exception as _: # noqa: F841
+ logger.info("ethplorer key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_smartstake_key(
+ key: str, access_token: str, persist: bool = False, show_output: bool = False
+):
+ """Set Smartstake key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ access_token: str
+ API token
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_SMARTSTAKE_KEY", key, persist)
+ set_key("OPENBB_API_SMARTSTAKE_TOKEN", access_token, persist)
+ return check_smartstake_key(show_output)
+
+
+def check_smartstake_key(show_output: bool = False) -> str:
+ """Check Smartstake key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if "REPLACE_ME" in [
+ cfg.API_SMARTSTAKE_TOKEN,
+ cfg.API_SMARTSTAKE_KEY,
+ ]:
+ status = KeyStatus.NOT_DEFINED
+ else:
+ payload = {
+ "type": "history",
+ "dayCount": 30,
+ "key": cfg.API_SMARTSTAKE_KEY,
+ "token": cfg.API_SMARTSTAKE_TOKEN,
+ }
+
+ smartstake_url = "https://prod.smartstakeapi.com/listData?app=TERRA"
+ response = requests.get(smartstake_url, params=payload) # type: ignore
+
+ try:
+ if (
+ "errors" in str(response.content)
+ or response.status_code < 200
+ or response.status_code >= 300
+ ):
+ logger.warning("Smartstake key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ elif 200 <= response.status_code < 300:
+ logger.info("Smartstake key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Smartstake key defined, test inconclusive")
+ status = KeyStatus.DEFINED_TEST_INCONCLUSIVE
+ except Exception as _: # noqa: F841
+ logger.warning("Smartstake key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_github_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set GitHub key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_GITHUB_KEY", key, persist)
+ return check_github_key(show_output)
+
+
+def check_github_key(show_output: bool = False) -> str:
+ """Check GitHub key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_GITHUB_KEY == "REPLACE_ME": # pragma: allowlist secret
+ logger.info("GitHub key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ status = KeyStatus.DEFINED_NOT_TESTED
+ # github api will not fail for the first requests without key
+ # only after certain amount of requests the user will get rate limited
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_messari_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Messari key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_MESSARI_KEY", key, persist)
+ return check_messari_key(show_output)
+
+
+def check_messari_key(show_output: bool = False) -> str:
+ """Check Messari key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if (
+ cfg.API_MESSARI_KEY == "REPLACE_ME" # pragma: allowlist secret
+ ): # pragma: allowlist secret
+ logger.info("Messari key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+
+ url = "https://data.messari.io/api/v2/assets/bitcoin/profile"
+ headers = {"x-messari-api-key": cfg.API_MESSARI_KEY}
+ params = {"fields": "profile/general/overview/official_links"}
+ r = requests.get(url, headers=headers, params=params)
+
+ if r.status_code == 200:
+ logger.info("Messari key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Messari key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_eodhd_key(key: str, persist: bool = False, show_output: bool = False) -> str:
+ """Set Eodhd key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_EODHD_KEY", key, persist)
+ return check_eodhd_key(show_output)
+
+
+def check_eodhd_key(show_output: bool = False) -> str:
+ """Check Eodhd key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_EODHD_KEY == "REPLACE_ME": # nosec
+ logger.info("End of Day Historical Data key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ request_url = f"https://eodhistoricaldata.com/api/exchanges-list/?api_token={cfg.API_EODHD_KEY}&fmt=json"
+ r = requests.get(request_url)
+ if r.status_code == 200:
+ logger.info("Eodhd key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("Eodhd key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
+
+
+def set_santiment_key(
+ key: str, persist: bool = False, show_output: bool = False
+) -> str:
+ """Set Santiment key.
+
+ Parameters
+ ----------
+ key: str
+ API key
+ 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: str
+
+ """
+
+ set_key("OPENBB_API_SANTIMENT_KEY", key, persist)
+ return check_santiment_key(show_output)
+
+
+def check_santiment_key(show_output: bool = False) -> str:
+ """Check Santiment key
+
+ Parameters
+ ----------
+ show_output: bool
+ Display status string or not. By default, False.
+
+ Returns
+ -------
+ status: str
+
+ """
+
+ if cfg.API_SANTIMENT_KEY == "REPLACE_ME":
+ logger.info("santiment key not defined")
+ status = KeyStatus.NOT_DEFINED
+ else:
+ headers = {
+ "Content-Type": "application/graphql",
+ "Authorization": f"Apikey {cfg.API_SANTIMENT_KEY}",
+ }
+
+ # pylint: disable=line-too-long
+ data = '\n{{ getMetric(metric: "dev_activity"){{ timeseriesData( slug: "ethereum" from: ""2020-02-10T07:00:00Z"" to: "2020-03-10T07:00:00Z" interval: "1w"){{ datetime value }} }} }}' # noqa: E501
+
+ response = requests.post(
+ "https://api.santiment.net/graphql", headers=headers, data=data
+ )
+ try:
+ if response.status_code == 200:
+ logger.info("santiment key defined, test passed")
+ status = KeyStatus.DEFINED_TEST_PASSED
+ else:
+ logger.warning("santiment key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+ except Exception as _: # noqa: F841
+ logger.info("santiment key defined, test failed")
+ status = KeyStatus.DEFINED_TEST_FAILED
+
+ if show_output:
+ console.print(status.colorize() + "\n")
+
+ return str(status)
diff --git a/openbb_terminal/keys_view.py b/openbb_terminal/keys_view.py
new file mode 100644
index 00000000000..c47ddb7f33f
--- /dev/null
+++ b/openbb_terminal/keys_view.py
@@ -0,0 +1,45 @@
+"""Keys view"""
+__docformat__ = "numpy"
+
+import logging
+import os
+from openbb_terminal import keys_model
+
+from openbb_terminal.decorators import log_start_end
+from openbb_terminal.helper_funcs import export_data, print_rich_table
+from openbb_terminal.rich_config import console
+
+logger = logging.getLogger(__name__)
+
+
+@log_start_end(log=logger)
+def display_keys(show: bool = False, export: str = ""):
+ """Display currently set API keys.
+
+ Parameters
+ ----------
+ show: bool
+ Flag to choose whether to show actual keys or not.
+ By default, False.
+ export : str
+ Export dataframe data to csv,json,xlsx file
+ """
+
+ df = keys_model.get_keys(show=show)
+ if df.empty:
+ console.print("No keys available\n")
+ return
+
+ print_rich_table(
+ df,
+ show_index=True,
+ index_name="API",
+ title="Current keys",
+ )
+
+ export_data(
+ export,
+ os.path.dirname(os.path.abspath(__file__)),
+ "mykeys",
+ df,
+ )
diff --git a/openbb_terminal/stocks/fundamental_analysis/eodhd_model.py b/openbb_terminal/stocks/fundamental_analysis/eodhd_model.py
index f1e51e2ad7c..9f1fed9dfa1 100644
--- a/openbb_terminal/stocks/fundamental_analysis/eodhd_model.py
+++ b/openbb_terminal/stocks/fundamental_analysis/eodhd_model.py
@@ -41,7 +41,7 @@ def get_financials(
request_url = (
"https://eodhistoricaldata.com/api/fundamentals/"
f"{symbol}?"
- f"api_token={cfg.API_EODHD_TOKEN}"
+ f"api_token={cfg.API_EODHD_KEY}"
f"&filter=Financials::{statement}"
f"::{['yearly', 'quarterly'][quarterly]}"
)
diff --git a/openbb_terminal/stocks/fundamental_analysis/eodhd_view.py b/openbb_terminal/stocks/fundamental_analysis/eodhd_view.py
index 052f0ed0179..7798abc09cc 100644
--- a/openbb_terminal/stocks/fundamental_analysis/eodhd_view.py
+++ b/openbb_terminal/stocks/fundamental_analysis/eodhd_view.py
@@ -20,7 +20,7 @@ logger = logging.getLogger(__name__)
@log_start_end(log=logger)
-@check_api_key(["API_EODHD_TOKEN"])
+@check_api_key(["API_EODHD_KEY"])
def display_fundamentals(
symbol: str,
statement: str,
diff --git a/openbb_terminal/stocks/options/options_controller.py b/openbb_terminal/stocks/options/options_controller.py
index 151eb569968..747443e297f 100644
--- a/openbb_terminal/stocks/options/options_controller.py
+++ b/openbb_terminal/stocks/options/options_controller.py
@@ -10,7 +10,7 @@ import pandas as pd
from prompt_toolkit.completion import NestedCompleter
from openbb_terminal import feature_flags as obbff
-from openbb_terminal.config_terminal import TRADIER_TOKEN
+from openbb_terminal.config_terminal import API_TRADIER_TOKEN
from openbb_terminal.decorators import log_start_end
from openbb_terminal.helper_funcs import (
EXPORT_BOTH_RAW_DATA_AND_FIGURES,
@@ -121,7 +121,7 @@ class OptionsController(BaseController):
self.source = ""
if ticker:
- if TRADIER_TOKEN == "REPLACE_ME": # nosec
+ if API_TRADIER_TOKEN == "REPLACE_ME": # nosec
console.print("Loaded expiry dates from Yahoo Finance")
self.expiry_dates = yfinance_model.option_expirations(self.ticker)
else:
@@ -696,7 +696,7 @@ class OptionsController(BaseController):
ns_parser.export,
)
- elif TRADIER_TOKEN != "REPLACE_ME": # nosec
+ elif API_TRADIER_TOKEN != "REPLACE_ME": # nosec
tradier_view.display_historical(
symbol=self.ticker,
expiry=self.selected_date,
@@ -766,7 +766,7 @@ class OptionsController(BaseController):
if self.ticker:
if self.selected_date:
if ns_parser.source == "Tradier" or self.source == "Tradier":
- if TRADIER_TOKEN != "REPLACE_ME": # nosec
+ if API_TRADIER_TOKEN != "REPLACE_ME": # nosec
tradier_view.display_chains(
symbol=self.ticker,
expiry=self.selected_date,
@@ -852,7 +852,7 @@ class OptionsController(BaseController):
if self.selected_date:
if (
ns_parser.source == "Tradier"
- and TRADIER_TOKEN != "REPLACE_ME" # nosec
+ and API_TRADIER_TOKEN != "REPLACE_ME" # nosec
) or self.source == "Tradier":
tradier_view.plot_vol(
symbol=self.ticker,
@@ -930,7 +930,7 @@ class OptionsController(BaseController):
if self.selected_date:
if (
ns_parser.source == "Tradier"
- and TRADIER_TOKEN != "REPLACE_ME" # nosec
+ and API_TRADIER_TOKEN != "REPLACE_ME" # nosec
) or self.source == "Tradier":
tradier_view.plot_volume_open_interest(
symbol=self.ticker,
@@ -1018,7 +1018,7 @@ class OptionsController(BaseController):
if self.selected_date:
if (
ns_parser.source == "Tradier"
- and TRADIER_TOKEN != "REPLACE_ME" # nosec
+ and API_TRADIER_TOKEN != "REPLACE_ME" # nosec
) or self.source == "Tradier":
tradier_view.plot_oi(
symbol=self.ticker,
diff --git a/openbb_terminal/stocks/options/tradier_model.py b/openbb_terminal/stocks/options/tradier_model.py
index c8c38cb73d0..d239ed3709a 100644
--- a/openbb_terminal/stocks/options/tradier_model.py
+++ b/openbb_terminal/stocks/options/tradier_model.py
@@ -90,7 +90,7 @@ def get_historical_options(
"https://sandbox.tradier.com/v1/markets/history",
params={"symbol": {symbol}, "interval": "daily"},
headers={
- "Authorization": f"Bearer {cfg.TRADIER_TOKEN}",
+ "Authorization": f"Bearer {cfg.API_TRADIER_TOKEN}",
"Accept": "application/json",
},
)
@@ -131,7 +131,7 @@ def option_expirations(symbol: str) -> List[str]:
"https://sandbox.tradier.com/v1/markets/options/expirations",
params={"symbol": symbol, "includeAllRoots": "true", "strikes": "false"},
headers={
- "Authorization": f"Bearer {cfg.TRADIER_TOKEN}",
+ "Authorization": f"Bearer {cfg.API_TRADIER_TOKEN}",
"Accept": "application/json",
},
)
@@ -167,7 +167,7 @@ def get_option_chains(symbol: str, expiry: str) -> pd.DataFrame:
params = {"symbol": symbol, "expiration": expiry, "greeks": "true"}
headers = {
- "Authorization": f"Bearer {cfg.TRADIER_TOKEN}",
+ "Authorization": f"Bearer {cfg.API_TRADIER_TOKEN}",
"Accept": "application/json",
}
@@ -177,7 +177,7 @@ def get_option_chains(symbol: str, expiry: str) -> pd.DataFrame:
headers=headers,
)
if response.status_code != 200:
- console.print("Error in request. Check TRADIER_TOKEN\n")
+ console.print("Error in request. Check API_TRADIER_TOKEN\n")
return pd.DataFrame()
chains = process_chains(response)
@@ -239,7 +239,7 @@ def last_price(symbol: str):
"https://sandbox.tradier.com/v1/markets/quotes",
params={"symbols": symbol, "includeAllRoots": "true", "strikes": "false"},
headers={
- "Authorization": f"Bearer {cfg.TRADIER_TOKEN}",
+ "Authorization": f"Bearer {cfg.API_TRADIER_TOKEN}",
"Accept": "application/json",
},
)
diff --git a/openbb_terminal/stocks/stocks_models.py b/openbb_terminal/stocks/stocks_models.py
index 5bc708c5e70..4c8a74aac04 100644
--- a/openbb_terminal/stocks/stocks_models.py
+++ b/openbb_terminal/stocks/stocks_models.py
@@ -99,7 +99,7 @@ def load_stock_eodhd(
f"{start_date.strftime('%Y-%m-%d')}&"
f"to={end_date.strftime('%Y-%m-%d')}&"
f"period={int_}&"
- f"api_token={cfg.API_EODHD_TOKEN}&"
+ f"api_token={cfg.API_EODHD_KEY}&"
f"fmt=json&"
f"order=d"
)
diff --git a/scripts/test_keys_.openbb b/scripts/test_keys_.openbb
new file mode 100644
index 00000000000..249f8938396
--- /dev/null
+++ b/scripts/test_keys_.openbb
@@ -0,0 +1,3 @@
+keys
+mykeys
+exit
\ No newline at end of file
diff --git a/tests/formatting/test_best_practices.py b/tests/formatting/test_best_practices.py
index 45f6c342050..ca1482102c5 100644
--- a/tests/formatting/test_best_practices.py
+++ b/tests/formatting/test_best_practices.py
@@ -79,7 +79,7 @@ def test_bad_parameters():
if all_overlaps:
for overlaps, func_name, func_path, overlap_str in all_overlaps:
final_str += (
- f"Forbidden parameter{'s' if len(overlaps) > 1 else ''} in funcition"
+ f"Forbidden parameter{'s' if len(overlaps) > 1 else ''} in function"
f" '{func_name}' at {func_path}. Replace the following: {overlap_str}\n\n"
)
diff --git a/tests/openbb_terminal/.tmp b/tests/openbb_terminal/.tmp
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/cassettes/test_keys_controller/test_call_av[other1].yaml b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_av[other1].yaml
new file mode 100644
index 00000000000..648ded0e19f
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_av[other1].yaml
@@ -0,0 +1,87 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=AAPL&interval=15min&outputsize=compact&apikey=1234&datatype=json
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAA7yVwU+DMBTG7/4VLz1pgrUtFAo3ox6WzGicXrzVrToSoAt0M9P4vxswTKbEvsNi
+ wqn9eLzf9/XR9yMAAHJtnIZL7TTJ4L1b6pY5hUn1bOtSu9xWJAMyqVytF3oLx1yWeXUCdmWqAJb5
+ yzKAwr4GMC9sY2BV53PTgK4WsLHFujQk+C4rKMy25ZMt2orn57fT4WZIYaobB3fmuTbN0ixakWBC
+ nLL0NGQgWMbaZ/hO1PbpTL3RXcmuteG+pHCzdqu1g1n+ZlrJhS1Xeu6GopjCfV4aeLRVJ3mYnV3p
+ xpm6Ip3o40tLOtHM1Llpehf2XRtrdijorW2t69oNEyrFHlFvU+trL4lHJCFtTd8VYb8VEf1K5K8P
+ SdqHlAGRLJSC7AQfwSgYT7NIYsBiBJj0ggkEWOgB44lSMQYsxCWW+sHSQyQW+8DCSEkUGMclxvxg
+ ygumEIkpX2IpZxwDhpuxsXP2AyxhBwFLfYlxHiMSU8gZS/yJJYkPbMydX0fRl5hgTCgM2H/OGCKx
+ 2JuY4EpgwHAzNvaz+gnGDvJX9CYmOUMlhrzH5AHAIsyMcd89FjMW+cES7IyNJfYJAAD//6yZ2a3d
+ QAxDOxpoX/pvLHA+gvjG1ySQ14CBMxQlWvrwWCAwUwKsUVccy6LIGJPNUdQ95qjC7kGQPb3PnUxk
+ ehkyxmVzxCGZAc3mCHTZHEWhamasGDD5KckMumwSgwmSzExUCLKibDbHDJM1lEwIyQSRRXQqQ8bZ
+ LBSQ7RlFZEpoZgaHdMokQ0baDFdjwmrcJsiQZhEpasugMUbb0wNF2/qJchSYhSt7aokMkozVQo70
+ O1vIMRCulhjVz494l61kIp1Bc0o2lPRD4Egj0L684R1NRI1pI0mZbU8rRPNEaBlYtcru90jc6t3C
+ oBFmuyQJXJCS+Y6Gg8jzG95V05RIImMF6bWIXYA276pdxaa4INUTLQvMu4tBc0o1d6haNUKzTIgW
+ IfE+19y1ehg0pVTzgmjRCdC0sGqOVjzmJs4VJOc1r0RoCQtSuxaiVShIkDkRRBxxymt6BKHp0fzX
+ jnc0F0K1hhHSpt0ZNM5rA/YhF5qJvqM97TruaNcbwtxvqqUMmlKq6UA02/V3tFms2grcOrZSf2tO
+ eU0f298HWr+HyOt9GqumC0Pk/h79EM1IrxkuyF41hKYQrbod7YozIhg0p1Tzhm0kDXVI+I/95Q0/
+ vNbrvgwa5zU4svWEobm2gtFwh7QWb6ogOa81Clp6xpHXxBKjwb/stakk5ppSXrPrkuavaHY6EdrT
+ MekT7ekr9wwpmpPNoDFes8dauqH5477mbzQ7ATukndIZcJnZsFoGTSnVYIe0s/OeRvRsYrSBJ4xp
+ X2aBoJTX7JhvAjQPVJADk79dGz8FBbkRToxsIb2G1pBf3vtekJKrEM0TFORW1wiDxs21xmgJO6QT
+ XoN7SK8a82DQOK8pRrNNgBZKdEh4kt+KMGXQyLlmOgCtoGpmWDV4yqgMt8AFKctmyIGqgZPh9VPD
+ qIaOGbPXjjUYNM5rKTBoIdXkzBAZEl4zSmaUIeMiZON/mh3YRQqTJSTTKOIfW5acaqq4iQiMWUQ4
+ Hrj0kbAgNBtyqMFqNHSnuWJ/ET0E7VfdrcIYMs5nq//dQvQMQRbwD1vKShgybqSt+Z++/wsAAP//
+ rJxLjiM5DET3cxhD/Ini4frugxxvpm1Xx2s494UCniV+FAzmD51xzHtP+0IGbuOYb2E7WF6HkLE4
+ W/o2LlNn1kDLmi0r2jaQ9BuGWebXYWaPAxosOcLuthwCxl5podurlE2xHxBlqlBfc6cmYCzITuk3
+ WkqwpcFCndjUHgRGYiw+zh5e39VbgTXIiy0fnxMD0iKyiWR89IC8pkUhzgWYzMTDlRZyLq0IcAU6
+ MNkLx0fj2wtXaa7UDeP1egVghg5MWbGuA1sKTBopfvgvLzbwYWAsxFbeEGJ6bgH0nXIwIFxFI6zu
+ ODDXByYtZrYjjICxEAvTYOeWmyhtLza+CBgLsdRgKXOHrxtyh+0edGIsxGTfER9tzr+DBQAreRV9
+ A1FnJYyxWDdUMRJjoaU4t03AYBnTyUN1iuwqymzvfjYCYzGmFhJ++JO/Tx5a0Kml1rR84P7ZPdqA
+ PwKUsZTaQF2jXgXG9s9+aLn/HmzdIA14Gzgxtn92vTf0o0XVMf9of397tJhcSGhvAgZVfD0xC/ka
+ M3AV5eDdapRT7gkGlUV9FXWruMAo0PSjJY7mOlDAn9BccjYxdoPgYXNU4/EEgyGmwVR9tsc4kKik
+ meDkDgLG1PvTWsmxOyQqVxr3zix0YtBqpV1kI09sA9OOfI151AJJsWGMnZRgp+6YSsgVz4ghV7Gp
+ dK/BRpoImpyYXBis3ejEWBlba7lKHlIGHgA20q6Trvy1TzAo3OvGI8/3YP7xZfPqr10k32/aK9rX
+ ZA66e9drI+7blOPvScYqWfYNZHGHwh2RJzYhY2GW2j0wIcliWvb3ci93sjycoLFiNjrQdn2fGl1/
+ r2CmYi9wagXLGTg1b+nUSW3THLUPU94nBqGxgpZ3VGoHlTpP/3kfJmNrc+0Tje3DdEhLdKYyEDTo
+ h+UAMO3sbiNoLNbkpMweKfdhGixoSRNShLe0jl1oSf1VGm1vFWsGLqS1bETOzCRBY7Fm4EJq6xjx
+ V7U2/C2kWyV8oqV+yZR8ohlwxZm8kLnW2ehCwgZyA4fVe0F+Sf5FMuSINOLLy0CfFbiDNIXWshtZ
+ QJRb1yq4ssXtDIIGW8j1tcfq0rfe93ff9cZSeqPlIqpBUMUxS2rEsmQPkENSvmj29cmrTdBYrAG3
+ d58/bwx+Vu/etLmsEYLIVJEe0mGsHZ1GjughXX9D6b/fsJRRc2x7ETQ2Pyvt21Gdv6PO/2yF1mfO
+ HIJ22wRN6T0BjMOhv6PkZ/bUEDQ4p9Yel5Hj3DCAdtSS/xqT6+IXGt09O9qXpDYGHdhQ4+Nk53X3
+ 7PQ4QWN1rfwOAYHEmlZWe1cjNBZrNsARki4yJBjMlP6ghsXk/5P/85Oq//z6FwAA//8DAGHlm8aB
+ VgAA
+ headers:
+ Allow:
+ - GET, HEAD, OPTIONS
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 75408923a87103b6-LIS
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Sun, 02 Oct 2022 21:29:49 GMT
+ Server:
+ - cloudflare
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Cookie
+ Via:
+ - 1.1 vegur
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_controller/test_call_av[other2].yaml b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_av[other2].yaml
new file mode 100644
index 00000000000..cffef4a8e18
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_av[other2].yaml
@@ -0,0 +1,87 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=AAPL&interval=15min&outputsize=compact&apikey=1234&datatype=json
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAA7yaS28bRxCE7/kVC54SQJn0Yx49uhlJDgYcJIiSS26MvY4JSKRA0Q4cw/89WBpy
+ RGrFKsBEAJ2o0YrfVFd3T89++GoYhmHx07hbDj8sd8vF5fBh/9H+Y03D8/XrzfZmuVtt1ovLYfF8
+ vdsuXy3fD19ruVmtvxk2t+P6Yniz+uvNxXC9+ftieHm9uRuH2+3q5Xg3LNevhneb67c34+Liv8da
+ Gq7e3/y5uZ6e+OzZLy8e/tLT8GJ5txt+HV9vx7s346tpkYnZt9K/dRlMLmX6efg3efqeu3H7brl/
+ 5P6rPfx9ScPPb3e3b3fD1eqfcVry/ebmdvly93BRTcNvq5tx+GOz3i/5/eq7H5d3u3G7XuwXffy0
+ drFfdDVuV+Pd/S4c7trcl3244H5rp63bf11vqdgB0f02Tft6v6TOLPE0bfrnh8jjFTl9UuTUPyrp
+ XqTLYVHEiy0+L/h4MQum/TIXBqwSYAWCGQHmAExbRGXAnFOsY7B+DsUqAvMchQJTTjHBYAHBglAs
+ kGJdRRkwzmNzcXYE1uQsYB0pploJxYL0WMOKtYbA5nbnUSgixUzEggH7Pz1GKFahYqZhDBjnsblk
+ dQwmZ8mKULGiQilG1rFyBrDMeExRHasiGYM11mNYsZYRmCkB1lBWDCuVImNMFklR9oikCrMHQTa3
+ P4dkItE6Q8a4LJI4JDOgWSSBLoukqKmKCKsMmJxLMoMui4LBBElmJioEWaVsFskMkzUomRCSCSLL
+ uRVlyDibZQVkPYUiMiU0M4NFukgUhoy0GY7GAqOxN4IMaZZzEbXOoDFG66kFFK3Xc4SjwF64lha1
+ Ez1IYayWJUk7zZYlGWiuOlGq5zfxULYqkYszaE7Jhjr9LLCkEWhP7OEhmogak0YKZbaemkI0Lwit
+ ZKxaLa2dbombemvCoBFmmyTJOCCllNNouBGZ38ND1bRILkSPlUmv5dw7QIvTqk3Bpjgg1QsaFpi3
+ Vhk0p1Rzh6rVhtCsFIiWs+TTdc1dawsGTSnVvEK03ApA04pVczTiMTdxLiA5r3ktCK3AgNRWO0Sr
+ WUEHWSJnoh1xymuaBKFp0vLYjodoLoRqDbaQFs2dQeO8FmAeMqGZ6Gm0uVnHIdq0h7DvN9WqDJpS
+ qmlANOvdT6NFx6p1gVPHptRpzSmv6Wz6O0Jrp5vIaX8aVk07bCL7vvRDNCO9ZjggW1dDaArRamuO
+ ZsUl58ygOaWaN5hGiqEMCc/YT+zhkddad+8MGuc1WLI1ZUN1rQtGwxnSmnijApLzWkONlqZw5DWx
+ gtHgKbtb1ELUNaW8ZtNNmp9Es9QKQpu7TDpGm3vKYQ8pWqI0Bo3xms3G0gGaz85rHqJZyjBDWqoa
+ AW5merbaGTSlVIMZ0lKP092Ipl4wWsArjGjemQGCUl6zZN4LQPOMAjJg52/TxE9BQPacnSjZQnoN
+ jSGf2O/DgJTSFaJ5AQHZa6shDBpX1xpGKzBDOuE1OIf0WsM8M2ic1xSjWS8ALSuRIeGVfK85mzJo
+ ZF0zDYBWoWpmWDV4lVFLdss4IKWzPWRA1cCV4XSoYVRDlxnRpxlrZtA4rxWBjRZSTVIE0UPC24wq
+ EcqQcS1kw2eaHjCLVExWIJnmSpyxpZNVTRUnEYFtFtEcBxz6SLZMaBZkUYPRaOieZmr7K5FD0HzV
+ 3Wo2hozzWdcvTiGagiDL8IQt1aowZFxJ6+YBOmPvj3vaIzIiGrtaBa8diJVgyDifCY5GUaRZI2ZZ
+ vcKKVpVI+o20Wc5fbDNNQTRY8Aq7Nc2dAeNOaY7bqwybYgvCZahQT/dOjQHjTBYFn9EyBBMM5kix
+ XmqnwBiP+ezdw/G5uiKwRuTFBg+f3TuRFqnXRLLPvgNynBbBcM6JmxlPhmYhMc2KCC6nBIO9sM++
+ +HbEVTBXxg3jdHolwJQSDL2KNQkmCAy+SPHEU45eA+8cGGcxyWewGL63IOY7xYgLQimsw8o5BDMs
+ GHzFTKu7MmCMxf4FAAD//6ycSZJbMQxD9zmMS5xE8XC5e8rxJrHdjdflv/cGFkcQ+HEL08DOJZEo
+ ZS82vggwlmKpgaWsHb4uqB22e9CLsRSTc0e8lTn/DywAsJKh6BuQOithjsW6oIuRHAtNxbltAgy2
+ MV081KTIQlFWe/ezETCWY8qQ8MVPfl48NKFTS9m0fKD/7BpuwG8B2lhKbqDup14FjPnPvhi5fw5s
+ XUANeBt4MeY/u+8bemlRfczfyt9flhaThoT2JsAgi68vZiG3MQOhKA/vVqOUcg9gkFnUoahHxQVO
+ gaaXljga14EE/oTGJW8TYxcQHjZHDR4PYDDFNDDVn+02DigqKSY4uYMAY+z9ac3k2BUUlSuOe2cW
+ ejEotdIqspEvtoFoR25jHrVAUWyYYyclsFNXXCWkxTNiSCg2pe41sJEigiYvJg2DtRu9GGtjay1X
+ xUPSwAOAjZTrpCt97QMYJO714JHnc2D+drN51tcuUu83nRXtY2QOpnvXthH3bUrx90DGOln2Bcji
+ CoY7Ik9sgoylWWr1wIREFtNyvpe+3MnycAKNNbPRibbr89Lo+nsFMxV7gVcr2M7Aq3lLpU5qmeYo
+ P0x5nxgEjTW0vKJTO+jUefp7P0zG1uLaBzTmh+mQkuhMJSBoMA/LA2Da2d1GoLFck5cyu6X0wzQw
+ aEkRUoS3lI7doSXVV2loe6tcMxCQ1nIQOTOTBBrLNQMBqaVjRF/VWvC3EG+VcEVLvcmUXNEMqOJM
+ BmSudTYKSDhAbqCwem3IT8W/SIUcUUZ8eRmYswJPkKagtZxGFiDl1t0KrmRxO4NAgyPk+lhjdee3
+ Xv27r3xjKb7RchHWICjjmCU5YtmyB9AhKTeaff/k1SbQWK4BtXef7x2D79m7F24uawQhMlVkhnSY
+ a0eXkSNmSNffUPr7H5YSao5tLwKN3c9K63bU5O9o8j9bQeszZw6BdtkFTfE9AYTDob+j5Gf21BBo
+ 8E6tNS4jz7lhANpRJv81Ju3id2jUe3a0Lkk5Bh3IUOPtZefZe3Z6nEBjfa38CgKB5JpmVntXI2gs
+ 12yAIiRdVEhwmCn9QQ2LyX+L/+OTqr9+/wEAAP//AwBh5ZvGgVYAAA==
+ headers:
+ Allow:
+ - GET, HEAD, OPTIONS
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754089271a1d03de-LIS
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Sun, 02 Oct 2022 21:29:50 GMT
+ Server:
+ - cloudflare
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Cookie
+ Via:
+ - 1.1 vegur
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_controller/test_call_cpanic[other1].yaml b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_cpanic[other1].yaml
index c1302ba10df..1d4c61d10ed 100644
--- a/tests/openbb_terminal/cassettes/test_keys_controller/test_call_cpanic[other1].yaml
+++ b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_cpanic[other1].yaml
@@ -11,7 +11,7 @@ interactions:
User-Agent:
- python-requests/2.28.1
method: GET
- uri: https://cryptopanic.com/api/v1/posts/?auth_token=1234&kind=all
+ uri: https://cryptopanic.com/api/v1/posts/?auth_token=1234
response:
body:
string: '{"status":"Incomplete","info":"Token not found"}'
@@ -23,7 +23,7 @@ interactions:
Content-Type:
- application/json
Date:
- - Thu, 22 Sep 2022 07:06:53 GMT
+ - Tue, 04 Oct 2022 10:22:30 GMT
Server:
- nginx/1.19.3
Strict-Transport-Security:
diff --git a/tests/openbb_terminal/cassettes/test_keys_controller/test_call_cpanic[other2].yaml b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_cpanic[other2].yaml
index c1302ba10df..8b31abbb418 100644
--- a/tests/openbb_terminal/cassettes/test_keys_controller/test_call_cpanic[other2].yaml
+++ b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_cpanic[other2].yaml
@@ -11,7 +11,7 @@ interactions:
User-Agent:
- python-requests/2.28.1
method: GET
- uri: https://cryptopanic.com/api/v1/posts/?auth_token=1234&kind=all
+ uri: https://cryptopanic.com/api/v1/posts/?auth_token=1234
response:
body:
string: '{"status":"Incomplete","info":"Token not found"}'
@@ -23,7 +23,7 @@ interactions:
Content-Type:
- application/json
Date:
- - Thu, 22 Sep 2022 07:06:53 GMT
+ - Tue, 04 Oct 2022 10:22:31 GMT
Server:
- nginx/1.19.3
Strict-Transport-Security:
diff --git a/tests/openbb_terminal/cassettes/test_keys_controller/test_call_iex[other1].yaml b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_iex[other1].yaml
new file mode 100644
index 00000000000..b37326992ef
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_iex[other1].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://cloud.iexapis.com/v1/stock/AAPL/quote?token=1234
+ response:
+ body:
+ string: The API key provided is not valid.
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Origin, X-Requested-With, Content-Type, Accept, Request-Source
+ Access-Control-Allow-Methods:
+ - GET, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Date:
+ - Tue, 04 Oct 2022 10:22:23 GMT
+ Server:
+ - nginx
+ Set-Cookie:
+ - ctoken=15bbf3161b68483fa51c4fa4837aae04; Max-Age=43200; Path=/; Expires=Tue,
+ 04 Oct 2022 22:22:23 GMT
+ Strict-Transport-Security:
+ - max-age=15768000
+ Transfer-Encoding:
+ - chunked
+ status:
+ code: 403
+ message: The API key provided is not valid.
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_controller/test_call_iex[other2].yaml b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_iex[other2].yaml
new file mode 100644
index 00000000000..b658ed46ad5
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_controller/test_call_iex[other2].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://cloud.iexapis.com/v1/stock/AAPL/quote?token=1234
+ response:
+ body:
+ string: The API key provided is not valid.
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Origin, X-Requested-With, Content-Type, Accept, Request-Source
+ Access-Control-Allow-Methods:
+ - GET, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Date:
+ - Tue, 04 Oct 2022 10:22:23 GMT
+ Server:
+ - nginx
+ Set-Cookie:
+ - ctoken=23f725d8baeb433aa0abdd164cd7a4dc; Max-Age=43200; Path=/; Expires=Tue,
+ 04 Oct 2022 22:22:23 GMT
+ Strict-Transport-Security:
+ - max-age=15768000
+ Transfer-Encoding:
+ - chunked
+ status:
+ code: 403
+ message: The API key provided is not valid.
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args0-False-True-defined, test passed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args0-False-True-defined, test passed].yaml
new file mode 100644
index 00000000000..9acfca3a66e
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args0-False-True-defined, test passed].yaml
@@ -0,0 +1,87 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=AAPL&interval=15min&outputsize=compact&apikey=test_key&datatype=json
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAA6yVT2vcMBDF7/kUg08tOKqsP5a8t9D2EEhIyaaX3tRdpWtYW4utTUhCvnuRFycO
+ 6zJTWPBJehrmN09PfjkDAMiufXTwzUWXLeBlWBqWCwaX7X3oGhfr0GYLyC7b2Lm1e4JPhW7q9jOE
+ nW9z2NR/Njlsw2MOq23oPey6euV7cO0aHsJ23/gsfy8rGCyfmt9hmypeXPy4mm5KBleuj3Dr7zvf
+ b/w6iQQX4rzg51yC4AuevukZlfqMvntwQ8mhtem+ZnCzj7t9hGX97JPka2h2bhWnopLBXd14+BXa
+ QfJz+eW766Pv2mwQvR602SBa+q72/TiFj1Oba3YqGEebRje0qwSz1QeicUxprgeJZJwfSyRLQx+L
+ mJkiih0cGTWVOdZoNpqUREYImb0JXvNZsKJaKI2DzXf932C2JIBpFExqSwGTNMdOAsZP4JgwWmgK
+ WKEpYFoiYIJZiYFpgYNZgYBZK0lctIipEuXSFcalCFy6xG6isKbCwSwpYoIZ3DCDGqY0AUwhYFKa
+ QlDAaBEzBr+JGgMrDQ5mOOaYrYyigNEiZgkRU+hrX54iYoWwFC5axEqrLXYTccNmihwZhj32UhUE
+ LkNMWPmPv/NfAAAA//+8mlmO5DAMQ29kaLd0/4sN8tepcocEOpgLFOqZJrU4P7mi++8OK0dZ317C
+ gJEOUwxmUDAiEwtlYu0uhoszWG1CsDe4Tgd4F8wznAEjHZYYTN7I+moAtnc2cROLtVhjsH4FDBex
+ 2d0MGecxJjz6v0jWGRoMGGeywHdxYHiEE2CDTBZlOcqgcTbb+ULnYUR+BLqN23YJE/lJGm2IuQVH
+ fhDRmAmMliNjm0EjR7JUiLaf0XQFM5IJQAtp9woGTd9Rzdb0G61wJ5w29/ahVCO91vlX1c7V/Att
+ 1J9V26rpxAATpNe63/DaJPZaiyLVdCYZNM5rgTusgap5E6o18JqNdVczaJzXZBIuCqBqUli1qM5n
+ tNQ0oy4k5zVxiGaBErIJ1WR6QF8s3UlsQZz0muCExGhDqCae9YwmWlPFoDFe0+Ne9wNNG6EZEf6C
+ 9iBRrqbJoDFe0xUKLqTCRkuJGDmf4UdCjsreDJpQqvk0QgtHaBIYLeAMqmo2RDdilNdkDVobnNuo
+ n2iyWr4j4gsNL+ZKjJlDjfSa2iA089oIDakmx9HoI0bK1YtBU0o1uHXUZQVVU3whVVHJLguqrhnl
+ NVmOLqQcX9juaCYKVWu4oIvZwXQjSnqt7bu1+0CbQGjS+EK6iMFGK5iEVNJrJjD8Daq2N0br60nz
+ ea0qmU6hcXXNsNdyQ6/lwIQ0NIr6dF5+JNDIupYY7dCz3+uaDo4RM7jkF3NmgSDv1TWfQeFPlGwP
+ tECIzE5l0Aiv+ayJjdBOI8sPNJ/VhNcG9pDdpk2hEV7zOfY/HwkZzwnps3yDzv86Q3QhsyOCeSik
+ PgvxXlXPCXnRP7fH3svQ7viXM7y/z7iPEAkp1Ich178Cql2aPE/Zvq+3QoB2PsN7D6nbQwnZhPo2
+ xPvokxtbH21yl01KGrEZMptb21CqKaVaDiTrRmSJupFffuWuWkW0M2Sc1bKwZthqgslKYOOv3rg5
+ liad5uYNyLIQmQYmwx++dI9SZJzPTgudD7KSN8gczqEzMc2QMT7bR4v8AwAA//+8nNGOJDcIRd/z
+ LzsCY8D+uPx75ERaqaur+1xpS3kfjeo0YGO4cCGL78WDqJ82TzxBqAE1LX1KNlPirFE3dyzidO6n
+ YDOnK23XEor9JolEFJP1rY7xAkYZ1odf8DUNqZGpgIVkMRJTfPikV7C5GSzpzJ+ZsRQwLchITHHA
+ 2BWNwaqxyxtCpcdajDEqhxywSWDDGayxHCJ1nazEGJsbwWoRWAwGC0r13XuYAqbFWBiDscWmEGN4
+ R+/0rYBpMRYTwUB1++GfXMEmgqW35IpajHkgGD3N+scFVxyo//ZlQoqfYozdfdMFLNAVXTg8HGMs
+ oyUwJcYK22jnkwxzKuEeM2zIlNKOMUkcEoXikA9/8grGmUfd1lqv7RihsmOSNOR89WSwRWBrMBhP
+ xUS74IqSMOT8kM5gTWC1BDCOMd9DAdNijGScxx5osSrBFUOYY1oKmPgg4+M+8UGG2rIDTwKsNb53
+ BW3/ChMnz85X83Ff44kkOLF6apEDwbTJsw9ffQXDCzqFCzrZFdcqBUzLFVNIgvcjz5bABsxKCUx8
+ j9kD2T0XF4WHpm83V8C0GBMemm2PgJHKJdxLsNgSY6zZYt1YxE/BFRcWTe3rcf8b7P+MMcFiqG2P
+ 4WsoYI/dY2WPnIposXSTLCbeY/kA2FRizLH8ZjYZTK0rNlusHynmJGf3I0si08r3/kQpuJQyFRW5
+ 3ez7SO5vMq1NZoFkIEY9/2QIRW6eoV6jFDB7ymQDo2wlgxmZbBy5lkBWaj96MFmjyYT+n2P/b85O
+ V8i0MJvcaacy9/pxwWaDJY1pKxUyMczYGxO9cbdAhqKWmeZjK2gm6XV6odF2PeGOxo327FVbyEFS
+ lFlZo2AHdH9HsbJY1dLYUCpbM0NB02RWOJ9reKUJaB9+w0vf1nwox0iKMqtmmVUkoXHj9vyG3d9T
+ 4vboNgVNkw/7ZIe0zO9onIhsHhc/8xAzhRxrirE257uG9KqMTpQPOzukBwlR54juUtBCE30HWq1Q
+ YzsyEW1OmzDMFF69FDRNqh/FksZOQPMSRN/YwI1hoTmkKNUHSeO026fcBa1rI1pNmIkcR68ppCPa
+ CNq9gPaisfUbSfcrWgizI4EtwTlWRyhoWqzhfrIzOfM+qPCKVoLo2wrz/uFerqBpUn1fPBazd4Do
+ ez+gjPbdLr3W1BE0XIPit1uELlL9FiZ+NiaR+9+rH9GGGGuDHbKP1hDQHNGqO6hWnHNOBU0bi7mT
+ ol8HLAbPjggDFjgTOXpHbAVNi7XgsZg56F7bJgxYNKNZtOSQWqw1JVqOa/P8x0YyGr6y91iVwr3m
+ 6m6eYfGHa738tpn0NqSLa73Mc2UraNoaA2EbivM+JWG0uvx9P9ilM7PnqK2gaWsMBk+N7/U9G/Fb
+ yfv7Xg2y2urYLwWE/xaq/vX3PwAAAP//AwB6g930f1YAAA==
+ headers:
+ Allow:
+ - GET, HEAD, OPTIONS
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e825f581203d6-LIS
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:11:53 GMT
+ Server:
+ - cloudflare
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Cookie
+ Via:
+ - 1.1 vegur
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args1-False-False-defined, test passed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args1-False-False-defined, test passed].yaml
new file mode 100644
index 00000000000..08d5055ad81
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args1-False-False-defined, test passed].yaml
@@ -0,0 +1,88 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=AAPL&interval=15min&outputsize=compact&apikey=test_key&datatype=json
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAA7yaT28bNxDF7/0UC51awNkOZzjk0Leg7SFAihZ1e+lNtTe1AFsyZDlFGuS7F6vA
+ qf5s9F4RoYBPEk3sj4/vcTir9191XdfNfhw28+77+WY+u+zebz/afpz67tXyzWp9P98sVsvZZTd7
+ tdys5zfzd93Xye8Xy2+61cOwvOhuF3/eXnR3q78uuuu71ePQPawX18NjN1/edG9Xd0/3w+zi32m1
+ 767e3f+xuhtnfPny59e7X1rfvZ4/brpfhjfr4fF2uBkHqai+SPJCrFO5lPFv93/y+JybYf12vp1y
+ +2i733vf/fS0eXjadFeLv4dxyHer+4f59WZ3UOm7Xxf3Q/f7arkd8tvVtz/MHzfDejnbDvrwcexs
+ O+hqWC+Gx+dV2F+1qYfdHfC8tOPSbR83ax9tj+h5mcZ1/TjEepHjIdaPi/48SZ2YJPcfFXke0+rx
+ GO+fRRoHVVWbfRrw4WISLLXL7Bhs+qn/M1gUAswhmHkwYMYpdhYwOYNiWl2dAUvOgLkBMO3DEJgr
+ BgsFYBFGcXEWywVyeUNcmeDygnaiRm0YLCiLaV+xYBUKlp0AywDMrCZlwDiL1Yp3oiOwUjFYFaRY
+ tJoZMM5iQVgsw7Qv57BY0mC4OIuV8EA7EQs2McmRYCjsLSeCq5IOKw07LEd8ucOKoawPK8KAkQ5L
+ GEyhYEQmFpSJpUZhuDiDlUoIdg6uqQXcF8w8GwNGOswxmJwj60sAsFo9iJ1YWIsFBouzgOFDrNUI
+ hozzGBMe8b9IFp5TZsA4k2W8FxsMj2wEWEMmy0W9JQaNs1n1M1QeSuRHRruxai3CRL6TRmvEvQVH
+ fiai0R0YzZs0rQwaeSXzBNHqabTUZ+ZKJgAtS5iVzKCl86imfYtzlMLh8LZZqzVKNdJr4V+q2vRp
+ foTWkp1WrabkRlxgMum1iHN4rTn2WkhCqqXWnEHjvJZxhdWgahaEagG8pk0jSjBonNekOWwUQNWk
+ YNVyCT+N5slVqQ3JeU0MomlGCRmEatKigbpYIpzoghjpNcEJidEaoZqYl9NokkorhUFjvJYm+7oH
+ aCkQmhLhL6gPkoslTc6gMV5LfU5gQyZYaCUiRqbX8CAhW5JaGTShVLMWCC0bQpOM0TK8g6ak2ohq
+ RCmvSd9Q22C6jNpFkz7kOCKO0HBjrogy91AlvZa0ITS1UhEaUk0mr0YHMVIsWWHQEqUa7DqmXgtU
+ LeENmRI6sotm6lxTymvSG9qQMvmGbR9NJUHVAjbocquZqUYS6bXQ49LuAK1lhCaBN6SJKCy0MpOQ
+ ifSaCgx/harVitFifKV5uq0q7kahceeaYq95hV7zBhNS0VXUWvjoRwKNPNcco03U7PvnWmo4RlRh
+ k1/UmAaCnO9cs9ZQ+BNHtmXUQMju4YlBI7xmrW+5IrSpK8sOmrU+CK81WENGaAoKjfCatcn65yAh
+ 8+mEtNZbBZX/uIZoQ3rknJkXhdTPQiz6Uk4n5Eh/ujy26BX1jj+zhvvvZ8yaEAkp1A9DxqcCqo2a
+ nL5lWx3fFQK06TXcryFTtZwI2YT6bYjFpE/22GLSJvuySZFAbIrMZhraKNUSpZo3SBaByBxVI5+Z
+ ZV+1knMYQ8ZZzQvWDFtNMFkRWPgnC1wcS5BOM7UAZF4QWcqYDP/wJaIliozz2VRD54CsyDnIDN5D
+ W8stGDLGZ3XSIv8AAAD//7yc0Y4kNwhF3/MvOwJjwP64/HvkRFqpq6v7XGlLeR+N6jRgY7hwIYvv
+ xYOonzZPPEGoATUtfUo2U+KsUTd3LOJ07qdgM6crbdcSiv0miUQUk/WtjvECRhnWh1/wNQ2pkamA
+ hWQxElN8+KRXsLkZLOnMn5mxFDAtyEhMccDYFY3BqrHLG0Klx1qMMSqHHLBJYMMZrLEcInWdrMQY
+ mxvBahFYDAYLSvXde5gCpsVYGIOxxaYQY3hH7/StgGkxFhPBQHX74Z9cwSaCpbfkilqMeSAYPc36
+ xwVXHKj/9mVCip9ijN190wUs0BVdODwcYyyjJTAlxgrbaOeTDHMq4R4zbMiU0o4xSRwSheKQD3/y
+ CsaZR93WWq/tGKGyY5I05Hz1ZLBFYGswGE/FRLvgipIw5PyQzmBNYLUEMI4x30MB02KMZJzHHmix
+ KsEVQ5hjWgqY+CDj4z7xQYbasgNPAqw1vncFbf8KEyfPzlfzcV/jiSQ4sXpqkQPBtMmzD199BcML
+ OoULOtkV1yoFTMsVU0iC9yPPlsAGzEoJTHyP2QPZPRcXhYembzdXwLQYEx6abY+Akcol3Euw2BJj
+ rNli3VjET8EVFxZN7etx/xvs/4wxwWKobY/hayhgj91jZY+cimixdJMsJt5j+QDYVGLMsfxmNhlM
+ rSs2W6wfKeYkZ/cjSyLTyvf+RCm4lDIVFbnd7PtI7m8yrU1mgWQgRj3/ZAhFbp6hXqMUMHvKZAOj
+ bCWDGZlsHLmWQFZqP3owWaPJhP6fY/9vzk5XyLQwm9xppzL3+nHBZoMljWkrFTIxzNgbE71xt0CG
+ opaZ5mMraCbpdXqh0XY94Y7GjfbsVVvIQVKUWVmjYAd0f0exsljV0thQKlszQ0HTZFY4n2t4pQlo
+ H37DS9/WfCjHSIoyq2aZVSShceP2/Ibd31Pi9ug2BU2TD/tkh7TM72iciGweFz/zEDOFHGuKsTbn
+ u4b0qoxOlA87O6QHCVHniO5S0EITfQdarVBjOzIRbU6bMMwUXr0UNE2qH8WSxk5A8xJE39jAjWGh
+ OaQo1QdJ47Tbp9wFrWsjWk2YiRxHrymkI9oI2r2A9qKx9RtJ9ytaCLMjgS3BOVZHKGharOF+sjM5
+ 8z6o8IpWgujbCvP+4V6uoGlSfV88FrN3gOh7P6CM9t0uvdbUETRcg+K3W4QuUv0WJn42JpH736sf
+ 0YYYa4Mdso/WENAc0ao7qFacc04FTRuLuZOiXwcsBs+OCAMWOBM5ekdsBU2LteCxmDnoXtsmDFg0
+ o1m05JBarDUlWo5r8/zHRjIavrL3WJXCvebqbp5h8Ydrvfy2mfQ2pItrvcxzZSto2hoDYRuK8z4l
+ YbS6/H0/2KUzs+eoraBpawwGT43v9T0b8VvJ+/teDbLa6tgvBYT/Fqr+9fc/AAAA//8DAHqD3fR/
+ VgAA
+ headers:
+ Allow:
+ - GET, HEAD, OPTIONS
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82627b219504-LIS
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:11:53 GMT
+ Server:
+ - cloudflare
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Cookie
+ Via:
+ - 1.1 vegur
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args2-True-True-defined, test passed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args2-True-True-defined, test passed].yaml
new file mode 100644
index 00000000000..60e9cfda80e
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_av_key[args2-True-True-defined, test passed].yaml
@@ -0,0 +1,88 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=AAPL&interval=15min&outputsize=compact&apikey=test_key&datatype=json
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAAwAAAP//vJpPbxs3EMXv/RQLnVrA2Q5nOOTQt6DtIUCKFnV76U21N7UAWzJkOUUa
+ 5LsXq8Cp/mz0XhGhgE8STeyPj+9xOKv3X3Vd181+HDbz7vv5Zj677N5vP9p+nPru1fLNan0/3yxW
+ y9llN3u13KznN/N33dfJ7xfLb7rVw7C86G4Xf95edHervy6667vV49A9rBfXw2M3X950b1d3T/fD
+ 7OLfabXvrt7d/7G6G2d8+fLn17tfWt+9nj9uul+GN+vh8Xa4GQepqL5I8kKsU7mU8W/3f/L4nJth
+ /Xa+nXL7aLvfe9/99LR5eNp0V4u/h3HId6v7h/n1ZndQ6btfF/dD9/tquR3y29W3P8wfN8N6OdsO
+ +vBx7Gw76GpYL4bH51XYX7Wph90d8Ly049JtHzdrH22P6HmZxnX9OMR6keMh1o+L/jxJnZgk9x8V
+ eR7T6vEY759FGgdVVZt9GvDhYhIstcvsGGz6qf8zWBQCzCGYeTBgxil2FjA5g2JaXZ0BS86AuQEw
+ 7cMQmCsGCwVgEUZxcRbLBXJ5Q1yZ4PKCdqJGbRgsKItpX7FgFQqWnQDLAMysJmXAOIvVineiI7BS
+ MVgVpFi0mhkwzmJBWCzDtC/nsFjSYLg4i5XwQDsRCzYxyZFgKOwtJ4Krkg4rDTssR3y5w4qhrA8r
+ woCRDksYTKFgRCYWlImlRmG4OIOVSgh2Dq6pBdwXzDwbA0Y6zDGYnCPrSwCwWj2InVhYiwUGi7OA
+ 4UOs1QiGjPMYEx7xv0gWnlNmwDiTZbwXGwyPbARYQybLRb0lBo2zWfUzVB5K5EdGu7FqLcJEvpNG
+ a8S9BUd+JqLRHRjNmzStDBp5JfME0epptNRn5komAC1LmJXMoKXzqKZ9i3OUwuHwtlmrNUo10mvh
+ X6ra9Gl+hNaSnVatpuRGXGAy6bWIc3itOfZaSEKqpdacQeO8lnGF1aBqFoRqAbymTSNKMGic16Q5
+ bBRA1aRg1XIJP43myVWpDcl5TQyiaUYJGYRq0qKBulginOiCGOk1wQmJ0RqhmpiX02iSSiuFQWO8
+ lib7ugdoKRCaEuEvqA+SiyVNzqAxXkt9TmBDJlhoJSJGptfwICFbkloZNKFUsxYILRtCk4zRMryD
+ pqTaiGpEKa9J31DbYLqM2kWTPuQ4Io7QcGOuiDL3UCW9lrQhNLVSERpSTSavRgcxUixZYdASpRrs
+ OqZeC1Qt4Q2ZEjqyi2bqXFPKa9Ib2pAy+YZtH00lQdUCNuhyq5mpRhLptdDj0u4ArWWEJoE3pIko
+ LLQyk5CJ9JoKDH+FqtWK0WJ8pXm6rSruRqFx55pir3mFXvMGE1LRVdRa+OhHAo081xyjTdTs++da
+ ajhGVGGTX9SYBoKc71yz1lD4E0e2ZdRAyO7hiUEjvGatb7kitKkryw6atT4IrzVYQ0ZoCgqN8Jq1
+ yfrnICHz6YS01lsFlf+4hmhDeuScmReF1M9CLPpSTifkSH+6PLboFfWOP7OG++9nzJoQCSnUD0PG
+ pwKqjZqcvmVbHd8VArTpNdyvIVO1nAjZhPptiMWkT/bYYtIm+7JJkUBsisxmGtoo1RKlmjdIFoHI
+ HFUjn5llX7WScxhDxlnNC9YMW00wWRFY+CcLXBxLkE4ztQBkXhBZypgM//AloiWKjPPZVEPngKzI
+ OcgM3kNbyy0YMsZnddIi/wAAAP//vJzRjiQ3CEXf8y87AmPA/rj8e+REWqmrq/tcaUt5H43qNGBj
+ uHAhi+/Fg6ifNk88QagBNS19SjZT4qxRN3cs4nTup2Azpytt1xKK/SaJRBST9a2O8QJGGdaHX/A1
+ DamRqYCFZDESU3z4pFewuRks6cyfmbEUMC3ISExxwNgVjcGqscsbQqXHWowxKoccsElgwxmssRwi
+ dZ2sxBibG8FqEVgMBgtK9d17mAKmxVgYg7HFphBjeEfv9K2AaTEWE8FAdfvhn1zBJoKlt+SKWox5
+ IBg9zfrHBVccqP/2ZUKKn2KM3X3TBSzQFV04PBxjLKMlMCXGCtto55MMcyrhHjNsyJTSjjFJHBKF
+ 4pAPf/IKxplH3dZar+0YobJjkjTkfPVksEVgazAYT8VEu+CKkjDk/JDOYE1gtQQwjjHfQwHTYoxk
+ nMceaLEqwRVDmGNaCpj4IOPjPvFBhtqyA08CrDW+dwVt/woTJ8/OV/NxX+OJJDixemqRA8G0ybMP
+ X30Fwws6hQs62RXXKgVMyxVTSIL3I8+WwAbMSglMfI/ZA9k9FxeFh6ZvN1fAtBgTHpptj4CRyiXc
+ S7DYEmOs2WLdWMRPwRUXFk3t63H/G+z/jDHBYqhtj+FrKGCP3WNlj5yKaLF0kywm3mP5ANhUYsyx
+ /GY2GUytKzZbrB8p5iRn9yNLItPK9/5EKbiUMhUVud3s+0jubzKtTWaBZCBGPf9kCEVunqFeoxQw
+ e8pkA6NsJYMZmWwcuZZAVmo/ejBZo8mE/p9j/2/OTlfItDCb3GmnMvf6ccFmgyWNaSsVMjHM2BsT
+ vXG3QIailpnmYytoJul1eqHRdj3hjsaN9uxVW8hBUpRZWaNgB3R/R7GyWNXS2FAqWzNDQdNkVjif
+ a3ilCWgffsNL39Z8KMdIijKrZplVJKFx4/b8ht3fU+L26DYFTZMP+2SHtMzvaJyIbB4XP/MQM4Uc
+ a4qxNue7hvSqjE6UDzs7pAcJUeeI7lLQQhN9B1qtUGM7MhFtTpswzBRevRQ0TaofxZLGTkDzEkTf
+ 2MCNYaE5pCjVB0njtNun3AWtayNaTZiJHEevKaQj2gjavYD2orH1G0n3K1oIsyOBLcE5VkcoaFqs
+ 4X6yMznzPqjwilaC6NsK8/7hXq6gaVJ9XzwWs3eA6Hs/oIz23S691tQRNFyD4rdbhC5S/RYmfjYm
+ kfvfqx/Rhhhrgx2yj9YQ0BzRqjuoVpxzTgVNG4u5k6JfBywGz44IAxY4Ezl6R2wFTYu14LGYOehe
+ 2yYMWDSjWbTkkFqsNSVajmvz/MdGMhq+svdYlcK95upunmHxh2u9/LaZ9Daki2u9zHNlK2jaGgNh
+ G4rzPiVhtLr8fT/YpTOz56itoGlrDAZPje/1PRvxW8n7+14Nstrq2C8FhP8Wqv719z8AAAD//wMA
+ eoPd9H9WAAA=
+ headers:
+ Allow:
+ - GET, HEAD, OPTIONS
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e8265a942950c-LIS
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:11:54 GMT
+ Server:
+ - cloudflare
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Cookie
+ Via:
+ - 1.1 vegur
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..bf06b92f71d
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,134 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87
+ Safari/537.36
+ X-MBX-APIKEY:
+ - test_key
+ method: GET
+ uri: https://api.binance.com/api/v3/ping
+ response:
+ body:
+ string: '{}'
+ headers:
+ Access-Control-Allow-Methods:
+ - GET, HEAD, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Cache-Control:
+ - no-cache, no-store, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '2'
+ Content-Security-Policy:
+ - default-src 'self'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:10 GMT
+ Expires:
+ - '0'
+ Pragma:
+ - no-cache
+ Server:
+ - nginx
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 79a6afa6a11c254cebe52d84950e0d76.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - nCHRyWu55jLvRtsDNLy9HqcXbzCQ69HdLXTV-_XLrGeW_--TSpK3tA==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Miss from cloudfront
+ X-Content-Security-Policy:
+ - default-src 'self'
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-WebKit-CSP:
+ - default-src 'self'
+ X-Xss-Protection:
+ - 1; mode=block
+ x-mbx-used-weight:
+ - '1'
+ x-mbx-used-weight-1m:
+ - '1'
+ x-mbx-uuid:
+ - 72fbf1bb-e2f9-4cb5-ac9d-cdb0fd440707
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87
+ Safari/537.36
+ X-MBX-APIKEY:
+ - test_key
+ method: GET
+ uri: https://api.binance.com/sapi/v1/account/apiRestrictions?timestamp=1664892728004&signature=23890d508f8c897a37371a64edcee7240b865da874b48dd4d61aa34ebb8ffba0
+ response:
+ body:
+ string: '{"code":-2008,"msg":"Invalid Api-Key ID."}'
+ headers:
+ Cache-Control:
+ - no-cache, no-store, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '42'
+ Content-Security-Policy:
+ - default-src 'self'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:10 GMT
+ Expires:
+ - '0'
+ Pragma:
+ - no-cache
+ Server:
+ - nginx
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 79a6afa6a11c254cebe52d84950e0d76.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - 4w0_iUeGNkUFn6Q9lv-bHI3fEAgmt6XNg9P0bYZG4NquieFQg0gYwA==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Error from cloudfront
+ X-Content-Security-Policy:
+ - default-src 'self'
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-WebKit-CSP:
+ - default-src 'self'
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 400
+ message: ''
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..082428e29f6
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,134 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87
+ Safari/537.36
+ X-MBX-APIKEY:
+ - test_key
+ method: GET
+ uri: https://api.binance.com/api/v3/ping
+ response:
+ body:
+ string: '{}'
+ headers:
+ Access-Control-Allow-Methods:
+ - GET, HEAD, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Cache-Control:
+ - no-cache, no-store, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '2'
+ Content-Security-Policy:
+ - default-src 'self'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:11 GMT
+ Expires:
+ - '0'
+ Pragma:
+ - no-cache
+ Server:
+ - nginx
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 590ad044183138a492a9344ba0b0a7ac.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - SQrvV5aih38a1Tp4mw-itGBCnXBosr3QhtUNsimJdrGsQ2JwJldSQw==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Miss from cloudfront
+ X-Content-Security-Policy:
+ - default-src 'self'
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-WebKit-CSP:
+ - default-src 'self'
+ X-Xss-Protection:
+ - 1; mode=block
+ x-mbx-used-weight:
+ - '2'
+ x-mbx-used-weight-1m:
+ - '2'
+ x-mbx-uuid:
+ - 0785405a-361e-4002-886b-66ec81c14013
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87
+ Safari/537.36
+ X-MBX-APIKEY:
+ - test_key
+ method: GET
+ uri: https://api.binance.com/sapi/v1/account/apiRestrictions?timestamp=1664892728598&signature=887e290954eee47e9749f93076164023ba4bdd8f2000c2788b882f9f261ade60
+ response:
+ body:
+ string: '{"code":-2008,"msg":"Invalid Api-Key ID."}'
+ headers:
+ Cache-Control:
+ - no-cache, no-store, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '42'
+ Content-Security-Policy:
+ - default-src 'self'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:11 GMT
+ Expires:
+ - '0'
+ Pragma:
+ - no-cache
+ Server:
+ - nginx
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 590ad044183138a492a9344ba0b0a7ac.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - 0AM6Rc4yMFaN-mgbgSYAEBZPNoIvrn-Dm4k8n-URbno389i-av16Vw==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Error from cloudfront
+ X-Content-Security-Policy:
+ - default-src 'self'
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-WebKit-CSP:
+ - default-src 'self'
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 400
+ message: ''
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..8af2e3c7659
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_binance_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,134 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87
+ Safari/537.36
+ X-MBX-APIKEY:
+ - test_key
+ method: GET
+ uri: https://api.binance.com/api/v3/ping
+ response:
+ body:
+ string: '{}'
+ headers:
+ Access-Control-Allow-Methods:
+ - GET, HEAD, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Cache-Control:
+ - no-cache, no-store, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '2'
+ Content-Security-Policy:
+ - default-src 'self'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:11 GMT
+ Expires:
+ - '0'
+ Pragma:
+ - no-cache
+ Server:
+ - nginx
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 96d159daae033b1bb1f9f14f4fc55aae.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - 9DQPbCtC_91_5aPUvDoZc_YwPk6pjEFVjlx5GS7peC0Z7VFYlmGC7w==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Miss from cloudfront
+ X-Content-Security-Policy:
+ - default-src 'self'
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-WebKit-CSP:
+ - default-src 'self'
+ X-Xss-Protection:
+ - 1; mode=block
+ x-mbx-used-weight:
+ - '3'
+ x-mbx-used-weight-1m:
+ - '3'
+ x-mbx-uuid:
+ - db85ea6c-d855-4c94-a1ad-b76c4f1e3759
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87
+ Safari/537.36
+ X-MBX-APIKEY:
+ - test_key
+ method: GET
+ uri: https://api.binance.com/sapi/v1/account/apiRestrictions?timestamp=1664892729222&signature=1996f1d370189ad66ac44603fe80ea1abaa30bc5bf162ee9b85ae984fffbb784
+ response:
+ body:
+ string: '{"code":-2008,"msg":"Invalid Api-Key ID."}'
+ headers:
+ Cache-Control:
+ - no-cache, no-store, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '42'
+ Content-Security-Policy:
+ - default-src 'self'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:11 GMT
+ Expires:
+ - '0'
+ Pragma:
+ - no-cache
+ Server:
+ - nginx
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 96d159daae033b1bb1f9f14f4fc55aae.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - vURjjoVoqeFj3Rbn2eg808K2k6l4QBOArL6u_VyKLOh2bP12vKkUFA==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Error from cloudfront
+ X-Content-Security-Policy:
+ - default-src 'self'
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-WebKit-CSP:
+ - default-src 'self'
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 400
+ message: ''
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..9e7ea8f9161
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: '{"query": "\n {\n ethereum {\n dexTrades(options:
+ {limit: 10, desc: \"count\"}) {\n count\n protocol\n }}}\n "}'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '168'
+ Content-Type:
+ - application/json
+ User-Agent:
+ - python-requests/2.28.1
+ x-api-key:
+ - test_key
+ method: POST
+ uri: https://graphql.bitquery.io/
+ response:
+ body:
+ string: "\r\n
401 Authorization Required\r\n\r\n401
+ Authorization Required
\r\n
nginx\r\n\r\n\r\n"
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET, POST, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:07 GMT
+ Server:
+ - nginx
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..3452cf0a1b5
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: '{"query": "\n {\n ethereum {\n dexTrades(options:
+ {limit: 10, desc: \"count\"}) {\n count\n protocol\n }}}\n "}'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '168'
+ Content-Type:
+ - application/json
+ User-Agent:
+ - python-requests/2.28.1
+ x-api-key:
+ - test_key
+ method: POST
+ uri: https://graphql.bitquery.io/
+ response:
+ body:
+ string: "\r\n401 Authorization Required\r\n\r\n401
+ Authorization Required
\r\n
nginx\r\n\r\n\r\n"
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET, POST, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:08 GMT
+ Server:
+ - nginx
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..3452cf0a1b5
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_bitquery_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: '{"query": "\n {\n ethereum {\n dexTrades(options:
+ {limit: 10, desc: \"count\"}) {\n count\n protocol\n }}}\n "}'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '168'
+ Content-Type:
+ - application/json
+ User-Agent:
+ - python-requests/2.28.1
+ x-api-key:
+ - test_key
+ method: POST
+ uri: https://graphql.bitquery.io/
+ response:
+ body:
+ string: "\r\n401 Authorization Required\r\n\r\n401
+ Authorization Required
\r\n
nginx\r\n\r\n\r\n"
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET, POST, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:08 GMT
+ Server:
+ - nginx
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..7ccf5b03482
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,66 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - deflate, gzip
+ Accepts:
+ - application/json
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ X-CMC_PRO_API_KEY:
+ - test_key
+ method: GET
+ uri: https://pro-api.coinmarketcap.com/v1/cryptocurrency/map
+ response:
+ body:
+ string: "{\n \"status\": {\n \"timestamp\": \"2022-10-04T14:12:02.906Z\",\n
+ \ \"error_code\": 1001,\n \"error_message\": \"This API Key is
+ invalid.\",\n \"elapsed\": 0,\n \"credit_count\": 0\n }\n}"
+ headers:
+ Cache-Control:
+ - no-cache
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '203'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:02 GMT
+ Referrer-Policy:
+ - origin-when-cross-origin
+ Server:
+ - Tengine
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Vary:
+ - origin
+ Via:
+ - 1.1 60d5d039ddd1dfa7f8fb545bcd965e3a.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - qbJ1ukKUhoed9l7Ps7uv6M5c3bJzFJVF0ovpb_7Kt6Bqt6dByxF5Hg==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Error from cloudfront
+ X-Content-Type-Options:
+ - nosniff
+ X-Envoy-Decorator-Operation:
+ - coinmarketcap-pro-apis.cmc-api.svc.cluster.local:80/*
+ X-Envoy-Upstream-Service-Time:
+ - '3'
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Traefik-Route:
+ - coinmarketcap-pro-apis
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..feedaec8bf8
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,66 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - deflate, gzip
+ Accepts:
+ - application/json
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ X-CMC_PRO_API_KEY:
+ - test_key
+ method: GET
+ uri: https://pro-api.coinmarketcap.com/v1/cryptocurrency/map
+ response:
+ body:
+ string: "{\n \"status\": {\n \"timestamp\": \"2022-10-04T14:12:03.105Z\",\n
+ \ \"error_code\": 1001,\n \"error_message\": \"This API Key is
+ invalid.\",\n \"elapsed\": 0,\n \"credit_count\": 0\n }\n}"
+ headers:
+ Cache-Control:
+ - no-cache
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '203'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:03 GMT
+ Referrer-Policy:
+ - origin-when-cross-origin
+ Server:
+ - Tengine
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Vary:
+ - origin
+ Via:
+ - 1.1 6cda321fa7ffaa5f463d18f171e22d8e.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - rmKrPjs7NUkW7LeBxi63gOUCMEym8roHw6VhVdY0d7pUnxZ0MSMfCg==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Error from cloudfront
+ X-Content-Type-Options:
+ - nosniff
+ X-Envoy-Decorator-Operation:
+ - coinmarketcap-pro-apis.cmc-api.svc.cluster.local:80/*
+ X-Envoy-Upstream-Service-Time:
+ - '2'
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Traefik-Route:
+ - coinmarketcap-pro-apis
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..a7d092731bd
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cmc_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,66 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - deflate, gzip
+ Accepts:
+ - application/json
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ X-CMC_PRO_API_KEY:
+ - test_key
+ method: GET
+ uri: https://pro-api.coinmarketcap.com/v1/cryptocurrency/map
+ response:
+ body:
+ string: "{\n \"status\": {\n \"timestamp\": \"2022-10-04T14:12:03.295Z\",\n
+ \ \"error_code\": 1001,\n \"error_message\": \"This API Key is
+ invalid.\",\n \"elapsed\": 0,\n \"credit_count\": 0\n }\n}"
+ headers:
+ Cache-Control:
+ - no-cache
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '203'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:03 GMT
+ Referrer-Policy:
+ - origin-when-cross-origin
+ Server:
+ - Tengine
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Vary:
+ - origin
+ Via:
+ - 1.1 fd9cb9e48122da1a05d6c3c1a873d502.cloudfront.net (CloudFront)
+ X-Amz-Cf-Id:
+ - xvL6RO0nJkIRHLGiTLux8t3UqXXPge1-4DuqzZ5PtdBSOQX_vdpudw==
+ X-Amz-Cf-Pop:
+ - LIS50-C1
+ X-Cache:
+ - Error from cloudfront
+ X-Content-Type-Options:
+ - nosniff
+ X-Envoy-Decorator-Operation:
+ - coinmarketcap-pro-apis.cmc-api.svc.cluster.local:80/*
+ X-Envoy-Upstream-Service-Time:
+ - '2'
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Traefik-Route:
+ - coinmarketcap-pro-apis
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..32a4605c7c0
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,74 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ CB-ACCESS-KEY:
+ - test_key
+ CB-ACCESS-PASSPHRASE:
+ - test_passphrase
+ CB-ACCESS-SIGN:
+ - ''
+ CB-ACCESS-TIMESTAMP:
+ - '1664892730.9341774'
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.pro.coinbase.com/accounts
+ response:
+ body:
+ string: '{"message":"Invalid API Key"}'
+ headers:
+ Access-Control-Allow-Headers:
+ - Content-Type, Accept, cb-session, cb-fp, cb-form-factor
+ Access-Control-Allow-Methods:
+ - GET,POST,DELETE,PUT
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - cb-before, cb-after, cb-gdpr
+ Access-Control-Max-Age:
+ - '7200'
+ CF-Cache-Status:
+ - MISS
+ CF-RAY:
+ - 754e82e0acbb5d2b-LIS
+ Cache-Control:
+ - no-store
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '29'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:13 GMT
+ Etag:
+ - W/"1d-mmRSeO9uba2rhQtGfy4YjixIkt4"
+ Server:
+ - cloudflare
+ Strict-Transport-Security:
+ - max-age=15552000; includeSubDomains
+ Vary:
+ - Accept-Encoding
+ X-Content-Type-Options:
+ - nosniff
+ X-Dns-Prefetch-Control:
+ - 'off'
+ X-Download-Options:
+ - noopen
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..eb55e6a65ec
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,74 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ CB-ACCESS-KEY:
+ - test_key
+ CB-ACCESS-PASSPHRASE:
+ - test_passphrase
+ CB-ACCESS-SIGN:
+ - ''
+ CB-ACCESS-TIMESTAMP:
+ - '1664892731.1623147'
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.pro.coinbase.com/accounts
+ response:
+ body:
+ string: '{"message":"Invalid API Key"}'
+ headers:
+ Access-Control-Allow-Headers:
+ - Content-Type, Accept, cb-session, cb-fp, cb-form-factor
+ Access-Control-Allow-Methods:
+ - GET,POST,DELETE,PUT
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - cb-before, cb-after, cb-gdpr
+ Access-Control-Max-Age:
+ - '7200'
+ CF-Cache-Status:
+ - MISS
+ CF-RAY:
+ - 754e82e1fd1fda76-LIS
+ Cache-Control:
+ - no-store
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '29'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:13 GMT
+ Etag:
+ - W/"1d-mmRSeO9uba2rhQtGfy4YjixIkt4"
+ Server:
+ - cloudflare
+ Strict-Transport-Security:
+ - max-age=15552000; includeSubDomains
+ Vary:
+ - Accept-Encoding
+ X-Content-Type-Options:
+ - nosniff
+ X-Dns-Prefetch-Control:
+ - 'off'
+ X-Download-Options:
+ - noopen
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..3d982b810a7
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinbase_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,74 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ CB-ACCESS-KEY:
+ - test_key
+ CB-ACCESS-PASSPHRASE:
+ - test_passphrase
+ CB-ACCESS-SIGN:
+ - ''
+ CB-ACCESS-TIMESTAMP:
+ - '1664892731.3799975'
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.pro.coinbase.com/accounts
+ response:
+ body:
+ string: '{"message":"Invalid API Key"}'
+ headers:
+ Access-Control-Allow-Headers:
+ - Content-Type, Accept, cb-session, cb-fp, cb-form-factor
+ Access-Control-Allow-Methods:
+ - GET,POST,DELETE,PUT
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - cb-before, cb-after, cb-gdpr
+ Access-Control-Max-Age:
+ - '7200'
+ CF-Cache-Status:
+ - MISS
+ CF-RAY:
+ - 754e82e36d69da82-LIS
+ Cache-Control:
+ - no-store
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '29'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:14 GMT
+ Etag:
+ - W/"1d-mmRSeO9uba2rhQtGfy4YjixIkt4"
+ Server:
+ - cloudflare
+ Strict-Transport-Security:
+ - max-age=15552000; includeSubDomains
+ Vary:
+ - Accept-Encoding
+ X-Content-Type-Options:
+ - nosniff
+ X-Dns-Prefetch-Control:
+ - 'off'
+ X-Download-Options:
+ - noopen
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Xss-Protection:
+ - 1; mode=block
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..b388cba9f50
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,56 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ coinglassSecret:
+ - test_key
+ method: GET
+ uri: https://open-api.coinglass.com/api/pro/v1/futures/openInterest/chart?&symbol=BTC&interval=0
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAAKpWSs5PSVWyUjI2MDAwVNJRyi1OB/KKU5OLUksUMvPKEnMyU4DCxaXJyanFxUpW
+ aYk5xam1AAAAAP//AwANMldNNwAAAA==
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - rt,obe,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
+ Access-Control-Allow-Methods:
+ - GET,POST,OPTIONS,DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Max-Age:
+ - '1728000'
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:16 GMT
+ Server:
+ - nginx
+ Transfer-Encoding:
+ - chunked
+ X-RateLimit-Burst-Capacity:
+ - '20'
+ X-RateLimit-Remaining:
+ - '19'
+ X-RateLimit-Replenish-Rate:
+ - '3'
+ vary:
+ - accept-encoding
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..4474f638181
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,56 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ coinglassSecret:
+ - test_key
+ method: GET
+ uri: https://open-api.coinglass.com/api/pro/v1/futures/openInterest/chart?&symbol=BTC&interval=0
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAAKpWSs5PSVWyUjI2MDAwVNJRyi1OB/KKU5OLUksUMvPKEnMyU4DCxaXJyanFxUpW
+ aYk5xam1AAAAAP//AwANMldNNwAAAA==
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - rt,obe,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
+ Access-Control-Allow-Methods:
+ - GET,POST,OPTIONS,DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Max-Age:
+ - '1728000'
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:17 GMT
+ Server:
+ - nginx
+ Transfer-Encoding:
+ - chunked
+ X-RateLimit-Burst-Capacity:
+ - '20'
+ X-RateLimit-Remaining:
+ - '19'
+ X-RateLimit-Replenish-Rate:
+ - '3'
+ vary:
+ - accept-encoding
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..e778a1ee905
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_coinglass_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,56 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ coinglassSecret:
+ - test_key
+ method: GET
+ uri: https://open-api.coinglass.com/api/pro/v1/futures/openInterest/chart?&symbol=BTC&interval=0
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAAKpWSs5PSVWyUjI2MDAwVNJRyi1OB/KKU5OLUksUMvPKEnMyU4DCxaXJyanFxUpW
+ aYk5xam1AAAAAP//AwANMldNNwAAAA==
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - rt,obe,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
+ Access-Control-Allow-Methods:
+ - GET,POST,OPTIONS,DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Max-Age:
+ - '1728000'
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:18 GMT
+ Server:
+ - nginx
+ Transfer-Encoding:
+ - chunked
+ X-RateLimit-Burst-Capacity:
+ - '20'
+ X-RateLimit-Remaining:
+ - '19'
+ X-RateLimit-Replenish-Rate:
+ - '3'
+ vary:
+ - accept-encoding
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..ff0b710f172
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,38 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://cryptopanic.com/api/v1/posts/?auth_token=test_key
+ response:
+ body:
+ string: '{"status":"Incomplete","info":"Token not found"}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '48'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:18 GMT
+ Server:
+ - nginx/1.19.3
+ Strict-Transport-Security:
+ - max-age=31536000
+ Vary:
+ - Cookie
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..96e8243e0b1
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,38 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://cryptopanic.com/api/v1/posts/?auth_token=test_key
+ response:
+ body:
+ string: '{"status":"Incomplete","info":"Token not found"}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '48'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:19 GMT
+ Server:
+ - nginx/1.19.3
+ Strict-Transport-Security:
+ - max-age=31536000
+ Vary:
+ - Cookie
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..96e8243e0b1
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_cpanic_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,38 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://cryptopanic.com/api/v1/posts/?auth_token=test_key
+ response:
+ body:
+ string: '{"status":"Incomplete","info":"Token not found"}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '48'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:19 GMT
+ Server:
+ - nginx/1.19.3
+ Strict-Transport-Security:
+ - max-age=31536000
+ Vary:
+ - Cookie
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..44f7aa51438
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://eodhistoricaldata.com/api/exchanges-list/?api_token=test_key&fmt=json
+ response:
+ body:
+ string: Unauthenticated
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With
+ Access-Control-Allow-Methods:
+ - GET, POST, PUT, DELETE, OPTIONS
+ Cache-Control:
+ - max-age=0, no-cache
+ Connection:
+ - keep-alive
+ Content-Type:
+ - text/html; charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:24 GMT
+ Server:
+ - nginx/1.19.10
+ Transfer-Encoding:
+ - chunked
+ X-Page-Speed:
+ - 1.13.35.2-0
+ X-RateLimit-Limit:
+ - '2000'
+ X-RateLimit-Remaining:
+ - '1999'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..49877b71ffd
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://eodhistoricaldata.com/api/exchanges-list/?api_token=test_key&fmt=json
+ response:
+ body:
+ string: Unauthenticated
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With
+ Access-Control-Allow-Methods:
+ - GET, POST, PUT, DELETE, OPTIONS
+ Cache-Control:
+ - max-age=0, no-cache
+ Connection:
+ - keep-alive
+ Content-Type:
+ - text/html; charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:24 GMT
+ Server:
+ - nginx/1.19.10
+ Transfer-Encoding:
+ - chunked
+ X-Page-Speed:
+ - 1.13.35.2-0
+ X-RateLimit-Limit:
+ - '2000'
+ X-RateLimit-Remaining:
+ - '1998'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..e2856b3a890
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_eodhd_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://eodhistoricaldata.com/api/exchanges-list/?api_token=test_key&fmt=json
+ response:
+ body:
+ string: Unauthenticated
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With
+ Access-Control-Allow-Methods:
+ - GET, POST, PUT, DELETE, OPTIONS
+ Cache-Control:
+ - max-age=0, no-cache
+ Connection:
+ - keep-alive
+ Content-Type:
+ - text/html; charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:25 GMT
+ Server:
+ - nginx/1.19.10
+ Transfer-Encoding:
+ - chunked
+ X-Page-Speed:
+ - 1.13.35.2-0
+ X-RateLimit-Limit:
+ - '2000'
+ X-RateLimit-Remaining:
+ - '1997'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..cd95463f59d
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,34 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.ethplorer.io/getTokenInfo/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984?apiKey=test_key
+ response:
+ body:
+ string: '{"error":{"code":1,"message":"Invalid API key"}}'
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '48'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:19 GMT
+ ETag:
+ - '"5e85ab36-30"'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..cd95463f59d
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,34 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.ethplorer.io/getTokenInfo/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984?apiKey=test_key
+ response:
+ body:
+ string: '{"error":{"code":1,"message":"Invalid API key"}}'
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '48'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:19 GMT
+ ETag:
+ - '"5e85ab36-30"'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..cd95463f59d
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_ethplorer_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,34 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.ethplorer.io/getTokenInfo/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984?apiKey=test_key
+ response:
+ body:
+ string: '{"error":{"code":1,"message":"Invalid API key"}}'
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '48'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:19 GMT
+ ETag:
+ - '"5e85ab36-30"'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..b7c80c8f859
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,52 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://finnhub.io/api/v1/quote?symbol=AAPL&token=test_key
+ response:
+ body:
+ string: '{"error":"Invalid API key"}'
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Origin
+ Access-Control-Allow-Methods:
+ - POST, GET, OPTIONS, PUT, DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - Content-Length
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82a2b8a30b3f-AMS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '27'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:03 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=y28J3p3ND7mH15e9FUJyxMVLr28GKf8qkS9LJjdv4RC7F8BMYc0QlRqAck%2FgWQjgaL%2BJUH%2FSeO%2B9Mtb92XdsYkVVNZj7DUGseg8mlGlJbrkHWjgKhA0g5BegqBQ9"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ alt-svc:
+ - h3=":443"; ma=86400, h3-29=":443"; ma=86400
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..a9db8f2688a
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,52 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://finnhub.io/api/v1/quote?symbol=AAPL&token=test_key
+ response:
+ body:
+ string: '{"error":"Invalid API key"}'
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Origin
+ Access-Control-Allow-Methods:
+ - POST, GET, OPTIONS, PUT, DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - Content-Length
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82a51801b35a-PRG
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '27'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:04 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=I7kQaN5DjT%2F%2BD6inbHovlNoesLGgz5FdGP%2BsPHPhtvxXQlwNKoOrw%2F%2FVsfjFqCy9kqqq2jfBAUcr40aAu3cNlmPK90r4HRq%2Fq3a9PxImO4QuS3x8GVTsikIXMSTd"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ alt-svc:
+ - h3=":443"; ma=86400, h3-29=":443"; ma=86400
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..e7823921f71
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_finnhub_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,52 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://finnhub.io/api/v1/quote?symbol=AAPL&token=test_key
+ response:
+ body:
+ string: '{"error":"Invalid API key"}'
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Origin
+ Access-Control-Allow-Methods:
+ - POST, GET, OPTIONS, PUT, DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - Content-Length
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82a759c8b75a-AMS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '27'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:04 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=crrZHeERwnM9feC%2FeMWGd6UPyQ24C5SJhx%2FfxlMiLvbtz%2FN7jEQiOIdK3zoSUzAIYryZzGcSPdV9v7tejkLlRXBylyGNFnO6O5fgcFtbcBrbbHjSOy2KODBz3Pol"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ alt-svc:
+ - h3=":443"; ma=86400, h3-29=":443"; ma=86400
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..636844fc3cd
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,41 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://financialmodelingprep.com/api/v3/profile/AAPL?apikey=test_key
+ response:
+ body:
+ string: '{"Error Message" : "Invalid API KEY. Please retry or visit our documentation
+ to create one FREE https://financialmodelingprep.com/developer/docs"}'
+ headers:
+ Access-Control-Allow-Headers:
+ - origin, content-type, accept, Authorization, authorization
+ Access-Control-Allow-Methods:
+ - GET, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Max-Age:
+ - '3600'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '146'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:11:54 GMT
+ Server:
+ - nginx/1.14.0 (Ubuntu)
+ status:
+ code: 200
+ message: ''
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..fe455e4ca1f
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,41 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://financialmodelingprep.com/api/v3/profile/AAPL?apikey=test_key
+ response:
+ body:
+ string: '{"Error Message" : "Invalid API KEY. Please retry or visit our documentation
+ to create one FREE https://financialmodelingprep.com/developer/docs"}'
+ headers:
+ Access-Control-Allow-Headers:
+ - origin, content-type, accept, Authorization, authorization
+ Access-Control-Allow-Methods:
+ - GET, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Max-Age:
+ - '3600'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '146'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:11:55 GMT
+ Server:
+ - nginx/1.14.0 (Ubuntu)
+ status:
+ code: 200
+ message: ''
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..960a452db26
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fmp_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://financialmodelingprep.com/api/v3/profile/AAPL?apikey=test_key
+ response:
+ body:
+ string: '{"Error Message" : "Invalid API KEY. Please retry or visit our documentation
+ to create one FREE https://financialmodelingprep.com/developer/docs"}'
+ headers:
+ Access-Control-Allow-Headers:
+ - origin, content-type, accept, Authorization, authorization
+ Access-Control-Allow-Methods:
+ - GET, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Max-Age:
+ - '3600'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '146'
+ Content-Type:
+ - application/json;charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:11:55 GMT
+ Server:
+ - nginx/1.14.0 (Ubuntu)
+ X-Frame-Options:
+ - SAMEORIGIN
+ status:
+ code: 200
+ message: ''
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..753ee6674fc
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,39 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.stlouisfed.org/fred/series?series_id=GNPCA&api_key=test_key
+ response:
+ body:
+ string: '
+
+
+
+
+
+
+ '
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '252'
+ Content-Type:
+ - text/xml; charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:11:59 GMT
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..753ee6674fc
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,39 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.stlouisfed.org/fred/series?series_id=GNPCA&api_key=test_key
+ response:
+ body:
+ string: '
+
+
+
+
+
+
+ '
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '252'
+ Content-Type:
+ - text/xml; charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:11:59 GMT
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..8b5e7f7ddba
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_fred_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,39 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.stlouisfed.org/fred/series?series_id=GNPCA&api_key=test_key
+ response:
+ body:
+ string: '
+
+
+
+
+
+
+ '
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '252'
+ Content-Type:
+ - text/xml; charset=UTF-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:00 GMT
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..a11521bffc5
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.glassnode.com/v1/metrics/market/price_usd_close?api_key=test_key&a=BTC&i=24h&s=1614556800&u=1641227783561
+ response:
+ body:
+ string: "\r\n401 Authorization Required\r\n\r\n401
+ Authorization Required
\r\n
nginx\r\n\r\n\r\n"
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Origin:
+ - https://studio.glassnode.com
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:15 GMT
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..a11521bffc5
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.glassnode.com/v1/metrics/market/price_usd_close?api_key=test_key&a=BTC&i=24h&s=1614556800&u=1641227783561
+ response:
+ body:
+ string: "\r\n401 Authorization Required\r\n\r\n401
+ Authorization Required
\r\n
nginx\r\n\r\n\r\n"
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Origin:
+ - https://studio.glassnode.com
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:15 GMT
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..a11521bffc5
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_glassnode_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.glassnode.com/v1/metrics/market/price_usd_close?api_key=test_key&a=BTC&i=24h&s=1614556800&u=1641227783561
+ response:
+ body:
+ string: "\r\n401 Authorization Required\r\n\r\n401
+ Authorization Required
\r\n
nginx\r\n\r\n\r\n"
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Origin:
+ - https://studio.glassnode.com
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - text/html
+ Date:
+ - Tue, 04 Oct 2022 14:12:15 GMT
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..e31755566c3
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://cloud.iexapis.com/v1/stock/AAPL/quote?token=test_key
+ response:
+ body:
+ string: The API key provided is not valid.
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Origin, X-Requested-With, Content-Type, Accept, Request-Source
+ Access-Control-Allow-Methods:
+ - GET, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Date:
+ - Tue, 04 Oct 2022 14:12:05 GMT
+ Server:
+ - nginx
+ Set-Cookie:
+ - ctoken=4374ad8b67b644cf9b9cf68f9380b9c4; Max-Age=43200; Path=/; Expires=Wed,
+ 05 Oct 2022 02:12:05 GMT
+ Strict-Transport-Security:
+ - max-age=15768000
+ Transfer-Encoding:
+ - chunked
+ status:
+ code: 403
+ message: The API key provided is not valid.
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..492ad8b407c
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://cloud.iexapis.com/v1/stock/AAPL/quote?token=test_key
+ response:
+ body:
+ string: The API key provided is not valid.
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Origin, X-Requested-With, Content-Type, Accept, Request-Source
+ Access-Control-Allow-Methods:
+ - GET, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Date:
+ - Tue, 04 Oct 2022 14:12:05 GMT
+ Server:
+ - nginx
+ Set-Cookie:
+ - ctoken=aac42812e9ab40a9895fe2f9d125b01b; Max-Age=43200; Path=/; Expires=Wed,
+ 05 Oct 2022 02:12:05 GMT
+ Strict-Transport-Security:
+ - max-age=15768000
+ Transfer-Encoding:
+ - chunked
+ status:
+ code: 403
+ message: The API key provided is not valid.
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..310d8290ec0
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_iex_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://cloud.iexapis.com/v1/stock/AAPL/quote?token=test_key
+ response:
+ body:
+ string: The API key provided is not valid.
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - Origin, X-Requested-With, Content-Type, Accept, Request-Source
+ Access-Control-Allow-Methods:
+ - GET, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Date:
+ - Tue, 04 Oct 2022 14:12:06 GMT
+ Server:
+ - nginx
+ Set-Cookie:
+ - ctoken=44466ca5782e48079f471b59e01d91e2; Max-Age=43200; Path=/; Expires=Wed,
+ 05 Oct 2022 02:12:06 GMT
+ Strict-Transport-Security:
+ - max-age=15768000
+ Transfer-Encoding:
+ - chunked
+ status:
+ code: 403
+ message: The API key provided is not valid.
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..bc5cece8c36
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ x-messari-api-key:
+ - test_key
+ method: GET
+ uri: https://data.messari.io/api/v2/assets/bitcoin/profile?fields=profile%2Fgeneral%2Foverview%2Fofficial_links
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAA/zTIsQrCMBAG4N2nKP/cyiXEUu8N3J1c5LCnBBsTclGQ0nd3cv1WWJP2NvAKXaSY
+ zmDq0WJSa5IKGJ68HxwNFM4usPPs3f4QpnE6Ohov6KG15nq95VnBgegPSc3koWCcXh9Z4txJid1T
+ v9091yQN27b7BQAA//8vl4T4gAAAAA==
+ headers:
+ content-encoding:
+ - gzip
+ content-length:
+ - '136'
+ content-type:
+ - application/json; charset=UTF-8
+ date:
+ - Tue, 04 Oct 2022 14:12:21 GMT
+ vary:
+ - Accept-Encoding,Origin
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..0f71086163e
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ x-messari-api-key:
+ - test_key
+ method: GET
+ uri: https://data.messari.io/api/v2/assets/bitcoin/profile?fields=profile%2Fgeneral%2Foverview%2Fofficial_links
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAA/zTIsQrCMBAG4N2nKP/cyuWMIvcG7k4ucthTio0JuShI6bs7uX4LvGl7O2SBzVrc
+ Rgj1aFMyb5oKBEzMQ6CB4jlECSzM290hUIx83F/Qw2rN9XrLo0Ei0R+SuevDIDi9PjpPY6dl6p72
+ 7e65Jm1Y180vAAD//1z4o6OAAAAA
+ headers:
+ content-encoding:
+ - gzip
+ content-length:
+ - '135'
+ content-type:
+ - application/json; charset=UTF-8
+ date:
+ - Tue, 04 Oct 2022 14:12:22 GMT
+ vary:
+ - Accept-Encoding,Origin
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..94ae3690659
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_messari_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ x-messari-api-key:
+ - test_key
+ method: GET
+ uri: https://data.messari.io/api/v2/assets/bitcoin/profile?fields=profile%2Fgeneral%2Foverview%2Fofficial_links
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAA/zTIscrCMBAH8P17ivKf24/LGYreG7g7uchhTyk2JuSiIKXv7uT6W+FN28shK2zR
+ 4jZBqEebk3nTVCBgYh4CDRRPIUpg4d1/GHl/GOPIZ/SwWnO9XPNkkEj0g2TuejcIjs+3LvPUaZm7
+ h326W65JG7bt7xsAAP//9LV/XoAAAAA=
+ headers:
+ content-encoding:
+ - gzip
+ content-length:
+ - '137'
+ content-type:
+ - application/json; charset=UTF-8
+ date:
+ - Tue, 04 Oct 2022 14:12:23 GMT
+ vary:
+ - Accept-Encoding,Origin
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..ecfa77bb3bd
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,50 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://newsapi.org/v2/everything?q=keyword&apiKey=test_key
+ response:
+ body:
+ string: '{"status":"error","code":"apiKeyInvalid","message":"Your API key is
+ invalid or incorrect. Check your key, or go to https://newsapi.org to create
+ a free API key."}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e828dcaf094e9-LIS
+ Cache-Control:
+ - no-cache
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '162'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:00 GMT
+ Expires:
+ - '-1'
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Pragma:
+ - no-cache
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=satBmgeFc0SUZbmrJA8miZMXviDJk%2Bidvs9zGOft7xQn68GRZz8NX3QyxDv%2FTyZr5HcG2KzuUhSmSIjIIStUHW%2FvaeFkW6cyRJiIJLoX3uBjm4Y598zDdxX6emcV"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ X-Cached-Result:
+ - 'false'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..45605ad89b1
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,50 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://newsapi.org/v2/everything?q=keyword&apiKey=test_key
+ response:
+ body:
+ string: '{"status":"error","code":"apiKeyInvalid","message":"Your API key is
+ invalid or incorrect. Check your key, or go to https://newsapi.org to create
+ a free API key."}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e828f7be65d3f-LIS
+ Cache-Control:
+ - no-cache
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '162'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:00 GMT
+ Expires:
+ - '-1'
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Pragma:
+ - no-cache
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=JhbCZGdb4BPvUSUGU7rB4fgskaHIJdUH9HGtWpOQYp5h9gRbQCt2ZkcuvBCbTKntmDJHwAepRmqfHXi36OvFu1x3RvmARdHRrfT4vgTCOSjb8%2BUs5CDNqQJztfFv"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ X-Cached-Result:
+ - 'false'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..876408c5af9
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_news_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,50 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://newsapi.org/v2/everything?q=keyword&apiKey=test_key
+ response:
+ body:
+ string: '{"status":"error","code":"apiKeyInvalid","message":"Your API key is
+ invalid or incorrect. Check your key, or go to https://newsapi.org to create
+ a free API key."}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e8290989a94e9-LIS
+ Cache-Control:
+ - no-cache
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '162'
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:00 GMT
+ Expires:
+ - '-1'
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Pragma:
+ - no-cache
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Gzu7JsPRszgutgQgmKZn37C8vZutiW6ja%2BjcEtsxxafx5RTA1HMbz2z9fVq%2Btt1jwuHHkeSoKOrTEyKYAePDecCT7Ncy7BY0yGdndOlD1enL961k9XN%2BGyISvo9f"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ X-Cached-Result:
+ - 'false'
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..cd369f4271f
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Bearer test_access_token
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api-fxpractice.oanda.com/v3/accounts/test_account/pricing?instruments=EUR_USD
+ response:
+ body:
+ string: '{"errorMessage":"Invalid value specified for ''accountID''"}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82c81fa3da76-LIS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '58'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:09 GMT
+ RequestID:
+ - '0'
+ Server:
+ - cloudflare
+ Set-Cookie:
+ - __cf_bm=QdbY2YyfstsQDRakhXTkWbwn3q_nuYjOHwWlfWb0KtE-1664892729-0-AfJjas3MxMCR/blCjGuFbl0fx9Q61uKwBxSCGevI2XURLNa0jregshQuziZifPqoxPKxhqqrkcsIEblbeOr0ytc=;
+ path=/; expires=Tue, 04-Oct-22 14:42:09 GMT; domain=.api-fxpractice.oanda.com;
+ HttpOnly; Secure; SameSite=None
+ Vary:
+ - Origin, Accept-Encoding
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..d84d14932b8
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Bearer test_access_token
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api-fxpractice.oanda.com/v3/accounts/test_account/pricing?instruments=EUR_USD
+ response:
+ body:
+ string: '{"errorMessage":"Invalid value specified for ''accountID''"}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82c97d41da7e-LIS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '58'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:09 GMT
+ RequestID:
+ - '0'
+ Server:
+ - cloudflare
+ Set-Cookie:
+ - __cf_bm=q_TOQOf3L2HIMu26EuEwncYIQXT9PB6hu4LAqwISNRA-1664892729-0-ASRBsufjw/Y412F5/ihq02v3kw3I0IIn0B5dIiAp1fGn7zohtWsggcY1b3ZfGZnd2IHaxeFB3MslixHMB+PWci0=;
+ path=/; expires=Tue, 04-Oct-22 14:42:09 GMT; domain=.api-fxpractice.oanda.com;
+ HttpOnly; Secure; SameSite=None
+ Vary:
+ - Origin, Accept-Encoding
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..ad7c97c5fd4
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_oanda_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,46 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Bearer test_access_token
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api-fxpractice.oanda.com/v3/accounts/test_account/pricing?instruments=EUR_USD
+ response:
+ body:
+ string: '{"errorMessage":"Invalid value specified for ''accountID''"}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82caef8e5d2f-LIS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '58'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:10 GMT
+ RequestID:
+ - '0'
+ Server:
+ - cloudflare
+ Set-Cookie:
+ - __cf_bm=bMYAAvxCIn1pk33uwICyuvC9hYFypI3yNJs4yhkuu68-1664892730-0-ARGpc/IDtvrNkxMZYVHugsnsPD2A0Q7kwQ+6jA9n9nbNFs7lTFZHjY0tdVEsYK3AxN1xPKpTgGmVsMg2L30abMs=;
+ path=/; expires=Tue, 04-Oct-22 14:42:10 GMT; domain=.api-fxpractice.oanda.com;
+ HttpOnly; Secure; SameSite=None
+ Vary:
+ - Origin, Accept-Encoding
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..176e5509f96
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/day/2020-06-01/2020-06-17?apiKey=test_key
+ response:
+ body:
+ string: '{"status":"ERROR","request_id":"934c1435b85f13ef00ed70c0945ff651","error":"Unknown
+ API Key"}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '92'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:11:57 GMT
+ Server:
+ - nginx/1.19.2
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ X-Request-Id:
+ - 934c1435b85f13ef00ed70c0945ff651
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..05aa354d260
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/day/2020-06-01/2020-06-17?apiKey=test_key
+ response:
+ body:
+ string: '{"status":"ERROR","request_id":"0230763a38f6aa17d239ad0d13bf5a89","error":"Unknown
+ API Key"}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '92'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:11:57 GMT
+ Server:
+ - nginx/1.19.2
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ X-Request-Id:
+ - 0230763a38f6aa17d239ad0d13bf5a89
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..8e74ca49768
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_polygon_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/day/2020-06-01/2020-06-17?apiKey=test_key
+ response:
+ body:
+ string: '{"status":"ERROR","request_id":"80a5646d2f8c4844d37d23e42137c46f","error":"Unknown
+ API Key"}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '92'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:11:58 GMT
+ Server:
+ - nginx/1.19.2
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ X-Request-Id:
+ - 80a5646d2f8c4844d37d23e42137c46f
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..03cf2a7b231
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,76 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ accept:
+ - application/json
+ request-source:
+ - python
+ request-source-version:
+ - 3.7.0
+ x-api-token:
+ - test_key
+ method: GET
+ uri: https://data.nasdaq.com/api/v3/datasets/EIA/PET_RWTC_D/data?order=asc
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAA/1WNsQ7CMAxEf8XyjCpYu3VgYCsTYqqixISoxRaOI7VU/XeCmDrd6emdbsV3cRym
+ gVRFsV3RSyBs8Xru5uMJD/iinF38oRuBlzIFYDFQ8hI5fQgWKQpdf4GRlhaMsg21NdBP5HKdPMmP
+ OwnqIZjWjC5xA3cp4B3DI1W+EwsH0j9yvn6zQSazxDE3uG1feayDMb0AAAA=
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - '*'
+ Access-Control-Allow-Methods:
+ - GET, POST, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - X-RateLimit-Limit, X-RateLimit-Remaining
+ Access-Control-Max-Age:
+ - '1728000'
+ Allow:
+ - GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:11:56 GMT
+ Server:
+ - openresty
+ Set-Cookie:
+ - visid_incap_2170999=1CofJCbpRoWyLby+w6MBqSs/PGMAAAAAQUIPAAAAAAB4QPjOO5THL62c/mw/CPzG;
+ expires=Wed, 04 Oct 2023 06:16:11 GMT; HttpOnly; path=/; Domain=.nasdaq.com
+ - nlbi_2170999=u+1bFOPMOW8J8pV/Kj7S7QAAAAD5I9gUHA/pmC6ngTuPTCAf; path=/; Domain=.nasdaq.com
+ - incap_ses_1170_2170999=aZY9QVdZiE8FDrrSkK08ECs/PGMAAAAAy0E8FukUuVhuc9Jh3bkxKQ==;
+ path=/; Domain=.nasdaq.com
+ Transfer-Encoding:
+ - chunked
+ X-CDN:
+ - Imperva
+ X-Iinfo:
+ - 2-69778184-69778213 NNYN CT(56 33 0) RT(1664892715526 129) q(0 0 1 0) r(1
+ 1) U11
+ X-RateLimit-Limit:
+ - '50'
+ X-RateLimit-Remaining:
+ - '40'
+ X-Request-Id:
+ - 5686807e-748a-4a33-a6f8-1ad5de9cc66a
+ X-Runtime:
+ - '0.008569'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..efdfdef9d96
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,76 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ accept:
+ - application/json
+ request-source:
+ - python
+ request-source-version:
+ - 3.7.0
+ x-api-token:
+ - test_key
+ method: GET
+ uri: https://data.nasdaq.com/api/v3/datasets/EIA/PET_RWTC_D/data?order=asc
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAA/1WNsQ7CMAxEf8XyjCpYu3VgYCsTYqqixISoxRaOI7VU/XeCmDrd6emdbsV3cRym
+ gVRFsV3RSyBs8Xru5uMJD/iinF38oRuBlzIFYDFQ8hI5fQgWKQpdf4GRlhaMsg21NdBP5HKdPMmP
+ OwnqIZjWjC5xA3cp4B3DI1W+EwsH0j9yvn6zQSazxDE3uG1feayDMb0AAAA=
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - '*'
+ Access-Control-Allow-Methods:
+ - GET, POST, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - X-RateLimit-Limit, X-RateLimit-Remaining
+ Access-Control-Max-Age:
+ - '1728000'
+ Allow:
+ - GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:11:56 GMT
+ Server:
+ - openresty
+ Set-Cookie:
+ - visid_incap_2170999=1CofJCbpRoWyLby+w6MBqSs/PGMAAAAAQUIPAAAAAAB4QPjOO5THL62c/mw/CPzG;
+ expires=Wed, 04 Oct 2023 06:16:13 GMT; HttpOnly; path=/; Domain=.nasdaq.com
+ - nlbi_2170999=npScGs0UgVIcm/ZuKj7S7QAAAAB2bM3KAgW1BDafFCheDnqn; path=/; Domain=.nasdaq.com
+ - incap_ses_1170_2170999=1T4rBDeDQUIFDrrSkK08ECw/PGMAAAAAwrsYYgk442gkR+t88eggpA==;
+ path=/; Domain=.nasdaq.com
+ Transfer-Encoding:
+ - chunked
+ X-CDN:
+ - Imperva
+ X-Iinfo:
+ - 0-34837951-34837955 NNYY CT(7 20 0) RT(1664892716021 122) q(0 0 0 0) r(0 0)
+ U11
+ X-RateLimit-Limit:
+ - '50'
+ X-RateLimit-Remaining:
+ - '39'
+ X-Request-Id:
+ - 6e10972d-46cf-437e-8d22-8a0ee1442a0a
+ X-Runtime:
+ - '0.007796'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..6755152858c
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_quandl_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,76 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ accept:
+ - application/json
+ request-source:
+ - python
+ request-source-version:
+ - 3.7.0
+ x-api-token:
+ - test_key
+ method: GET
+ uri: https://data.nasdaq.com/api/v3/datasets/EIA/PET_RWTC_D/data?order=asc
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAA/1WNsQ7CMAxEf8XyjCpYu3VgYCsTYqqixISoxRaOI7VU/XeCmDrd6emdbsV3cRym
+ gVRFsV3RSyBs8Xru5uMJD/iinF38oRuBlzIFYDFQ8hI5fQgWKQpdf4GRlhaMsg21NdBP5HKdPMmP
+ OwnqIZjWjC5xA3cp4B3DI1W+EwsH0j9yvn6zQSazxDE3uG1feayDMb0AAAA=
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - '*'
+ Access-Control-Allow-Methods:
+ - GET, POST, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Expose-Headers:
+ - X-RateLimit-Limit, X-RateLimit-Remaining
+ Access-Control-Max-Age:
+ - '1728000'
+ Allow:
+ - GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:11:57 GMT
+ Server:
+ - openresty
+ Set-Cookie:
+ - visid_incap_2170999=1CofJCbpRoWyLby+w6MBqSs/PGMAAAAAQUIPAAAAAAB4QPjOO5THL62c/mw/CPzG;
+ expires=Wed, 04 Oct 2023 06:16:12 GMT; HttpOnly; path=/; Domain=.nasdaq.com
+ - nlbi_2170999=ObekPRMQah154flOKj7S7QAAAAAFH/DiR93HvfTOxbLhn4em; path=/; Domain=.nasdaq.com
+ - incap_ses_1170_2170999=At2sR4tSCUQFDrrSkK08ECw/PGMAAAAAWOMTH8G3nGrwAcHcP6aauQ==;
+ path=/; Domain=.nasdaq.com
+ Transfer-Encoding:
+ - chunked
+ X-CDN:
+ - Imperva
+ X-Iinfo:
+ - 13-192935658-192935688 NNYY CT(7 19 0) RT(1664892716414 131) q(0 0 0 0) r(0
+ 0) U11
+ X-RateLimit-Limit:
+ - '50'
+ X-RateLimit-Remaining:
+ - '38'
+ X-Request-Id:
+ - deb8bce2-5957-43fc-beda-ada425d5732f
+ X-Runtime:
+ - '0.008970'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..5e0951a80c5
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,68 @@
+interactions:
+- request:
+ body: grant_type=password&password=test_pass&username=test_user
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Basic dGVzdF9pZDp0ZXN0X3NlY3JldA==
+ Connection:
+ - close
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - test_agent PRAW/7.6.0 prawcore/2.3.0
+ method: POST
+ uri: https://www.reddit.com/api/v1/access_token
+ response:
+ body:
+ string: '{"message": "Unauthorized", "error": 401}'
+ headers:
+ Accept-Ranges:
+ - bytes
+ Cache-Control:
+ - private, max-age=3600
+ Connection:
+ - close
+ Content-Length:
+ - '41'
+ Date:
+ - Tue, 04 Oct 2022 14:12:06 GMT
+ NEL:
+ - '{"report_to": "w3-reporting-nel", "max_age": 14400, "include_subdomains":
+ false, "success_fraction": 0.2, "failure_fraction": 0.2}'
+ Report-To:
+ - '{"group": "w3-reporting-nel", "max_age": 14400, "include_subdomains": true, "endpoints":
+ [{ "url": "https://w3-reporting-nel.reddit.com/reports" }]}, {"group": "w3-reporting",
+ "max_age": 14400, "include_subdomains": true, "endpoints": [{ "url": "https://w3-reporting.reddit.com/reports"
+ }]}'
+ Server:
+ - snooserv
+ Set-Cookie:
+ - edgebucket=aGNHJAEO0Y3jFVDZt2; Domain=reddit.com; Max-Age=63071999; Path=/; secure
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 varnish
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-type:
+ - application/json; charset=UTF-8
+ www-authenticate:
+ - Basic realm="reddit"
+ x-moose:
+ - majestic
+ x-ua-compatible:
+ - IE=edge
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..f00289fd24d
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,68 @@
+interactions:
+- request:
+ body: grant_type=password&password=test_pass&username=test_user
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Basic dGVzdF9pZDp0ZXN0X3NlY3JldA==
+ Connection:
+ - close
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - test_agent PRAW/7.6.0 prawcore/2.3.0
+ method: POST
+ uri: https://www.reddit.com/api/v1/access_token
+ response:
+ body:
+ string: '{"message": "Unauthorized", "error": 401}'
+ headers:
+ Accept-Ranges:
+ - bytes
+ Cache-Control:
+ - private, max-age=3600
+ Connection:
+ - close
+ Content-Length:
+ - '41'
+ Date:
+ - Tue, 04 Oct 2022 14:12:07 GMT
+ NEL:
+ - '{"report_to": "w3-reporting-nel", "max_age": 14400, "include_subdomains":
+ false, "success_fraction": 0.2, "failure_fraction": 0.2}'
+ Report-To:
+ - '{"group": "w3-reporting-nel", "max_age": 14400, "include_subdomains": true, "endpoints":
+ [{ "url": "https://w3-reporting-nel.reddit.com/reports" }]}, {"group": "w3-reporting",
+ "max_age": 14400, "include_subdomains": true, "endpoints": [{ "url": "https://w3-reporting.reddit.com/reports"
+ }]}'
+ Server:
+ - snooserv
+ Set-Cookie:
+ - edgebucket=H3hyRQbqYeztzihFZt; Domain=reddit.com; Max-Age=63071999; Path=/; secure
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 varnish
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-type:
+ - application/json; charset=UTF-8
+ www-authenticate:
+ - Basic realm="reddit"
+ x-moose:
+ - majestic
+ x-ua-compatible:
+ - IE=edge
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..86431ce3aa0
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_reddit_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,68 @@
+interactions:
+- request:
+ body: grant_type=password&password=test_pass&username=test_user
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Basic dGVzdF9pZDp0ZXN0X3NlY3JldA==
+ Connection:
+ - close
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - test_agent PRAW/7.6.0 prawcore/2.3.0
+ method: POST
+ uri: https://www.reddit.com/api/v1/access_token
+ response:
+ body:
+ string: '{"message": "Unauthorized", "error": 401}'
+ headers:
+ Accept-Ranges:
+ - bytes
+ Cache-Control:
+ - private, max-age=3600
+ Connection:
+ - close
+ Content-Length:
+ - '41'
+ Date:
+ - Tue, 04 Oct 2022 14:12:07 GMT
+ NEL:
+ - '{"report_to": "w3-reporting-nel", "max_age": 14400, "include_subdomains":
+ false, "success_fraction": 0.2, "failure_fraction": 0.2}'
+ Report-To:
+ - '{"group": "w3-reporting-nel", "max_age": 14400, "include_subdomains": true, "endpoints":
+ [{ "url": "https://w3-reporting-nel.reddit.com/reports" }]}, {"group": "w3-reporting",
+ "max_age": 14400, "include_subdomains": true, "endpoints": [{ "url": "https://w3-reporting.reddit.com/reports"
+ }]}'
+ Server:
+ - snooserv
+ Set-Cookie:
+ - edgebucket=iALI4KfWGMoECUNJSL; Domain=reddit.com; Max-Age=63071999; Path=/; secure
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubdomains
+ Via:
+ - 1.1 varnish
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-type:
+ - application/json; charset=UTF-8
+ www-authenticate:
+ - Basic realm="reddit"
+ x-moose:
+ - majestic
+ x-ua-compatible:
+ - IE=edge
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..dab40de624f
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,60 @@
+interactions:
+- request:
+ body: '
+
+ {{ getMetric(metric: "dev_activity"){{ timeseriesData( slug: "ethereum" from:
+ ""2020-02-10T07:00:00Z"" to: "2020-03-10T07:00:00Z" interval: "1w"){{ datetime
+ value }} }} }}'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Apikey test_key
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - application/graphql
+ User-Agent:
+ - python-requests/2.28.1
+ method: POST
+ uri: https://api.santiment.net/graphql
+ response:
+ body:
+ string: '{"errors":{"details":"Apikey ''test_key'' is not valid"}}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e832cfd9e950c-LIS
+ Cache-Control:
+ - max-age=0, private, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '55'
+ Date:
+ - Tue, 04 Oct 2022 14:12:25 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=wtM3RbEm%2FCuR29Ru%2FlXHnEEnG84XHFDcm%2B8U%2BTUaFbjkq6VfWApnXDELV0QbxCj6UXt%2B9%2BlwyfXfY3POm42%2BE6GMFO%2B6RLgWRQD0VHnhTp51VopaqbSi0QOhX59hhHMiz6a6"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ access-control-allow-credentials:
+ - 'true'
+ access-control-allow-headers:
+ - DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-SharedAccess-Authorization
+ access-control-allow-methods:
+ - GET, POST, OPTIONS
+ set-cookie:
+ - INGRESSCOOKIE=1664892746.904.11247.492222; Path=/.+; Secure; HttpOnly
+ x-request-id:
+ - a7495d3f7084c8e35492c70576bf4b6d
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..db8eee72736
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,60 @@
+interactions:
+- request:
+ body: '
+
+ {{ getMetric(metric: "dev_activity"){{ timeseriesData( slug: "ethereum" from:
+ ""2020-02-10T07:00:00Z"" to: "2020-03-10T07:00:00Z" interval: "1w"){{ datetime
+ value }} }} }}'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Apikey test_key
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - application/graphql
+ User-Agent:
+ - python-requests/2.28.1
+ method: POST
+ uri: https://api.santiment.net/graphql
+ response:
+ body:
+ string: '{"errors":{"details":"Apikey ''test_key'' is not valid"}}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e832e69a05d2f-LIS
+ Cache-Control:
+ - max-age=0, private, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '55'
+ Date:
+ - Tue, 04 Oct 2022 14:12:26 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=73uHjVWlQQnZw5NxPCRh7%2BZsXfbjULPTSI3S9ps5tJx8w8pG8R5ltf8CtdtRTM9Y9sDAarDtYHpg6u5SH7Jz4SlRcV5t1t5HtUwzbZKEykx23Whrrt5FQFFBs%2B0%2BS8i%2FLb4W"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ access-control-allow-credentials:
+ - 'true'
+ access-control-allow-headers:
+ - DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-SharedAccess-Authorization
+ access-control-allow-methods:
+ - GET, POST, OPTIONS
+ set-cookie:
+ - INGRESSCOOKIE=1664892747.059.11247.844562; Path=/.+; Secure; HttpOnly
+ x-request-id:
+ - 525b7df0250e9951c40efbf9ac28f266
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..f6c25742a25
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_santiment_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,60 @@
+interactions:
+- request:
+ body: '
+
+ {{ getMetric(metric: "dev_activity"){{ timeseriesData( slug: "ethereum" from:
+ ""2020-02-10T07:00:00Z"" to: "2020-03-10T07:00:00Z" interval: "1w"){{ datetime
+ value }} }} }}'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Apikey test_key
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '172'
+ Content-Type:
+ - application/graphql
+ User-Agent:
+ - python-requests/2.28.1
+ method: POST
+ uri: https://api.santiment.net/graphql
+ response:
+ body:
+ string: '{"errors":{"details":"Apikey ''test_key'' is not valid"}}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e832f6c8503ba-LIS
+ Cache-Control:
+ - max-age=0, private, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '55'
+ Date:
+ - Tue, 04 Oct 2022 14:12:26 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=eVAoNvpy%2BtpkFc5M%2F%2BYl3ZBEw3Pc2%2Fng2SfsqeuceivAiBW4qqEcJ1rh2LVrQk5lcz8VKA6%2Fa5tHuTfhBP3UimhhGlL3%2FqFADY00i%2BDTVY26qzu3jeOqM5SyDYyPbcNn7ao7"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ access-control-allow-credentials:
+ - 'true'
+ access-control-allow-headers:
+ - DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-SharedAccess-Authorization
+ access-control-allow-methods:
+ - GET, POST, OPTIONS
+ set-cookie:
+ - INGRESSCOOKIE=1664892747.192.11247.98702; Path=/.+; Secure; HttpOnly
+ x-request-id:
+ - 9cd1b3e5b206c535b223949f8a23c0d9
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..e6453f39868
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,28 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.sentimentinvestor.com/v1/trending?token=test_key
+ response:
+ body:
+ string: Service Unavailable
+ headers:
+ Content-Length:
+ - '19'
+ Content-Type:
+ - text/plain; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:12 GMT
+ status:
+ code: 503
+ message: Service Unavailable
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..e6453f39868
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,28 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.sentimentinvestor.com/v1/trending?token=test_key
+ response:
+ body:
+ string: Service Unavailable
+ headers:
+ Content-Length:
+ - '19'
+ Content-Type:
+ - text/plain; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:12 GMT
+ status:
+ code: 503
+ message: Service Unavailable
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..33d77414146
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_si_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,28 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.sentimentinvestor.com/v1/trending?token=test_key
+ response:
+ body:
+ string: Service Unavailable
+ headers:
+ Content-Length:
+ - '19'
+ Content-Type:
+ - text/plain; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:13 GMT
+ status:
+ code: 503
+ message: Service Unavailable
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..5feb6a5d08d
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,50 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://prod.smartstakeapi.com/listData?app=TERRA&type=history&dayCount=30&key=test_key&token=test_access_token
+ response:
+ body:
+ string: '{"errors": "DENIED"}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e8308f91203ba-LIS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '20'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:20 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=k9Asqsb5taHwbKsVvw61b9Ygs7VvhMfMLv5iJ4L%2FT787oPlH5rYaNJTndNHj7tyowQx1UaEWu%2Bn4mmBl1XU5Dnd4EVofpafbIZPSSiMYrWmJhe7D6UwQf7bB9lV9fGFbJDyxHtinn6Q%3D"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ access-control-allow-credentials:
+ - 'true'
+ access-control-allow-origin:
+ - '*'
+ x-amz-apigw-id:
+ - Ze7StGFaIAMFzsw=
+ x-amzn-requestid:
+ - 0e6f5a5c-c041-4c4c-826f-476b974a3ae9
+ x-amzn-trace-id:
+ - Root=1-633c3f44-6874ebdd0da59a4f09bef655;Sampled=0
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..96fa3a82131
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,50 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://prod.smartstakeapi.com/listData?app=TERRA&type=history&dayCount=30&key=test_key&token=test_access_token
+ response:
+ body:
+ string: '{"errors": "DENIED"}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e830bbf8703ee-LIS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '20'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:20 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=YHNBnp2YblqRepvgBmvlpkZsByLf89TCng7ZIvs1iWWKcCeyCEalBqqF6RuHSe9WQo3JcOmtgMWo8Jo51Ch98GBMuiESZ8ANnKcolTr2lmLUH%2Fwx%2F%2FVheEh4yM9J12HMCA5d%2BvqlhKw%3D"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ access-control-allow-credentials:
+ - 'true'
+ access-control-allow-origin:
+ - '*'
+ x-amz-apigw-id:
+ - Ze7SuFtPoAMFYNQ=
+ x-amzn-requestid:
+ - 31689984-2b19-45d7-bd18-4d3e480797f6
+ x-amzn-trace-id:
+ - Root=1-633c3f44-0684c3657b0178ce4d77b551;Sampled=0
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..b16fe9113f5
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_smartstake_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,50 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://prod.smartstakeapi.com/listData?app=TERRA&type=history&dayCount=30&key=test_key&token=test_access_token
+ response:
+ body:
+ string: '{"errors": "DENIED"}'
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e830cefc394fa-LIS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '20'
+ Content-Type:
+ - application/json
+ Date:
+ - Tue, 04 Oct 2022 14:12:20 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=S7PX7iRFWsq2ZRQiLVbrgMRgyZZwlYHUfWWgonu5kBr5QLaSVHoO%2F8SmJCgzUrlBJ%2F40YHRNhlCcNgQ7feTE4%2BzNeJktmXsu8uqKBQ%2BSXmfdHqizvs%2BjBH2BNX2fcRGtB0amUy79t4M%3D"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ access-control-allow-credentials:
+ - 'true'
+ access-control-allow-origin:
+ - '*'
+ x-amz-apigw-id:
+ - Ze7SwH8moAMFWcw=
+ x-amzn-requestid:
+ - 37aa0e4b-43a1-48e6-bc58-f4f2051e63a8
+ x-amzn-trace-id:
+ - Root=1-633c3f44-27f1355108b1006577b6f617;Sampled=0
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..84f5bb6104f
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,38 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Bearer test_key
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://sandbox.tradier.com/v1/markets/quotes?symbols=AAPL
+ response:
+ body:
+ string: Invalid Access Token
+ headers:
+ Access-Control-Allow-Headers:
+ - accept, authorization
+ Access-Control-Allow-Methods:
+ - GET, PUT, POST, DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '20'
+ Content-Type:
+ - plain/text
+ Date:
+ - Tue, 04 Oct 2022 14:12:01 GMT
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..84f5bb6104f
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,38 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Bearer test_key
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://sandbox.tradier.com/v1/markets/quotes?symbols=AAPL
+ response:
+ body:
+ string: Invalid Access Token
+ headers:
+ Access-Control-Allow-Headers:
+ - accept, authorization
+ Access-Control-Allow-Methods:
+ - GET, PUT, POST, DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '20'
+ Content-Type:
+ - plain/text
+ Date:
+ - Tue, 04 Oct 2022 14:12:01 GMT
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..e4651ffefaa
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_tradier_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,38 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Authorization:
+ - Bearer test_key
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://sandbox.tradier.com/v1/markets/quotes?symbols=AAPL
+ response:
+ body:
+ string: Invalid Access Token
+ headers:
+ Access-Control-Allow-Headers:
+ - accept, authorization
+ Access-Control-Allow-Methods:
+ - GET, PUT, POST, DELETE
+ Access-Control-Allow-Origin:
+ - '*'
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '20'
+ Content-Type:
+ - plain/text
+ Date:
+ - Tue, 04 Oct 2022 14:12:02 GMT
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..3cbdae2369d
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ authorization:
+ - Bearer test_access_token
+ method: GET
+ uri: https://api.twitter.com/2/tweets/search/recent?query=%28%5C%24AAPL%29+%28lang%3Aen%29&max_results=10&tweet.fields=created_at%2Clang
+ response:
+ body:
+ string: "{\n \"title\": \"Unauthorized\",\n \"type\": \"about:blank\",\n \"status\":
+ 401,\n \"detail\": \"Unauthorized\"\n}"
+ headers:
+ cache-control:
+ - no-cache, no-store, max-age=0
+ content-length:
+ - '99'
+ content-type:
+ - application/problem+json
+ date:
+ - Tue, 04 Oct 2022 14:12:08 GMT
+ perf:
+ - '7626143928'
+ server:
+ - tsa_f
+ x-connection-hash:
+ - 1a1975af5733283ca199c311b7565d85caee1d5ef43d7058791912d59789b846
+ x-response-time:
+ - '99'
+ x-transaction-id:
+ - 117e76d2ed30aa1b
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..73c275b9118
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ authorization:
+ - Bearer test_access_token
+ method: GET
+ uri: https://api.twitter.com/2/tweets/search/recent?query=%28%5C%24AAPL%29+%28lang%3Aen%29&max_results=10&tweet.fields=created_at%2Clang
+ response:
+ body:
+ string: "{\n \"title\": \"Unauthorized\",\n \"type\": \"about:blank\",\n \"status\":
+ 401,\n \"detail\": \"Unauthorized\"\n}"
+ headers:
+ cache-control:
+ - no-cache, no-store, max-age=0
+ content-length:
+ - '99'
+ content-type:
+ - application/problem+json
+ date:
+ - Tue, 04 Oct 2022 14:12:08 GMT
+ perf:
+ - '7626143928'
+ server:
+ - tsa_f
+ x-connection-hash:
+ - 27a26e3a151b37777bd51cc82c68c8634b08fd5140b74590917af8bdbe25b907
+ x-response-time:
+ - '99'
+ x-transaction-id:
+ - eff7767f74df1e1d
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..4bdfb33e0d8
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_twitter_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,43 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ authorization:
+ - Bearer test_access_token
+ method: GET
+ uri: https://api.twitter.com/2/tweets/search/recent?query=%28%5C%24AAPL%29+%28lang%3Aen%29&max_results=10&tweet.fields=created_at%2Clang
+ response:
+ body:
+ string: "{\n \"title\": \"Unauthorized\",\n \"type\": \"about:blank\",\n \"status\":
+ 401,\n \"detail\": \"Unauthorized\"\n}"
+ headers:
+ cache-control:
+ - no-cache, no-store, max-age=0
+ content-length:
+ - '99'
+ content-type:
+ - application/problem+json
+ date:
+ - Tue, 04 Oct 2022 14:12:09 GMT
+ perf:
+ - '7626143928'
+ server:
+ - tsa_f
+ x-connection-hash:
+ - 1e182b3237f6bb0c3a00ce53985d58aa7b50ae4f3a2ee4f67a19628eb0dce8fd
+ x-response-time:
+ - '99'
+ x-transaction-id:
+ - bfda8c6b5d23a375
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args0-False-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args0-False-True-defined, test failed].yaml
new file mode 100644
index 00000000000..eeea535f60b
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args0-False-True-defined, test failed].yaml
@@ -0,0 +1,48 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.whale-alert.io/v1/transactions?api_key=test_key
+ response:
+ body:
+ string: '{"result":"error","message":"invalid api_key"}
+
+ '
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82e55b32734a-MRS
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47'
+ Content-Type:
+ - text/plain; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:14 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=COnAbSOXJebcXGqQUhLXdh%2Bf756mX%2BOd1P6g11vO%2B2FEkBJ4gbXdbFDGNeGmIul9R2naqsCW4YcY3zM%2Bivdq2L%2B8cb0tmdqjQT0t1AiNiZvvNrJ7blZvgNs%2FY3i1epPZ7f12huw%3D"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ alt-svc:
+ - h3=":443"; ma=86400, h3-29=":443"; ma=86400
+ x-content-type-options:
+ - nosniff
+ x-frame-options:
+ - deny
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args1-False-False-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args1-False-False-defined, test failed].yaml
new file mode 100644
index 00000000000..086a8cea8b2
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args1-False-False-defined, test failed].yaml
@@ -0,0 +1,48 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.whale-alert.io/v1/transactions?api_key=test_key
+ response:
+ body:
+ string: '{"result":"error","message":"invalid api_key"}
+
+ '
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82e79ed4be38-CPH
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47'
+ Content-Type:
+ - text/plain; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:14 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=pNRNsg5GlM73gyEJW8cA84uyafK1C%2B%2FmdTZXKYgZHzgIV6NKfxnjDlg0PVmETjFB7HII%2BWe2P6%2BW9naOf7D2z9OVwy%2BUFsKGOXgYqbY7gLxZbb7nbuLN5Rr0B9xaIitDPvE5bT0%3D"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ alt-svc:
+ - h3=":443"; ma=86400, h3-29=":443"; ma=86400
+ x-content-type-options:
+ - nosniff
+ x-frame-options:
+ - deny
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args2-True-True-defined, test failed].yaml b/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args2-True-True-defined, test failed].yaml
new file mode 100644
index 00000000000..3d04518bef4
--- /dev/null
+++ b/tests/openbb_terminal/cassettes/test_keys_model/test_set_walert_key[args2-True-True-defined, test failed].yaml
@@ -0,0 +1,48 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.28.1
+ method: GET
+ uri: https://api.whale-alert.io/v1/transactions?api_key=test_key
+ response:
+ body:
+ string: '{"result":"error","message":"invalid api_key"}
+
+ '
+ headers:
+ CF-Cache-Status:
+ - DYNAMIC
+ CF-RAY:
+ - 754e82e9cdd3b35d-PRG
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47'
+ Content-Type:
+ - text/plain; charset=utf-8
+ Date:
+ - Tue, 04 Oct 2022 14:12:15 GMT
+ NEL:
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
+ Report-To:
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=yoqOokDdG2jaDLPTpc5Y%2Bh6wOuCBTXrXYFYYE5IfE%2Bd4%2BsRR0oSReTAHF64CyFMoCw6zU5%2FEs9dNbt%2BkSkMKcklTUQ1IolK9i9tgAdPnnVypM0mUz0yyRm87%2FWSdDgzFiejx%2F3o%3D"}],"group":"cf-nel","max_age":604800}'
+ Server:
+ - cloudflare
+ alt-svc:
+ - h3=":443"; ma=86400, h3-29=":443"; ma=86400
+ x-content-type-options:
+ - nosniff
+ x-frame-options:
+ - deny
+ status:
+ code: 401
+ message: Unauthorized
+version: 1
diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_glassnode_view/test_display_btc_rainbow.yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_glassnode_view/test_display_btc_rainbow.yaml
index ae109767fe2..03ff4eb6cfa 100644
--- a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_glassnode_view/test_display_btc_rainbow.yaml
+++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_glassnode_view/test_display_btc_rainbow.yaml
@@ -9,10 +9,11 @@ interactions:
Connection:
- keep-alive
method: GET
- uri: https://api.glassnode.com/v1/metrics/market/price_usd_close?a=BTC&api_key=MOCK_API_KEY&i=24h&s=1325376000&u=1641641877
+ uri: https://api.glassnode.com/v1/metrics/market/price_usd_close?a=BTC&api_key=MOCK_API_KEY&i=24h&s=1325376000&u=1641600000
response:
body:
- string: '[{"t":1325376000,"v":5.27839909090909},{"t":1325462400,"v":5.21678},{"t":1325548800,"v":4.883427777777778},{"t":1325635200,"v":5.58749},{"t":1325721600,"v":6.982924814814817},{"t":1325808000,"v":6.696863333333334},{"t":1325894400,"v":6.811656666666668},{"t":1325980800,"v":7.13009076923077},{"t":1326067200,"v":6.3162949999999976},{"t":1326153600,"v":6.449687599999999},{"t":1326240000,"v":6.899966666666668},{"t":1326326400,"v":6.797846666666668},{"t":1326412800,"v":6.413502074303406},{"t":1326499200,"v":6.750014999999999},{"t":1326585600,"v":7.0275609090909095},{"t":1326672000,"v":6.648461904761903},{"t":1326758400,"v":5.56730760869565},{"t":1326844800,"v":5.9170500000000015},{"t":1326931200,"v":6.3543171428571465},{"t":1327017600,"v":6.37286},{"t":1327104000,"v":6.165864},{"t":1327190400,"v":6.3065940000000005},{"t":1327276800,"v":6.343111578947367},{"t":1327363200,"v":6.2675833333333335},{"t":1327449600,"v":5.795209444444442},{"t":1327536000,"v":5.335037058823528},{"t":1327622400,"v":5.288307142857144},{"t":1327708800,"v":5.630534444444443},{"t":1327795200,"v":5.38777},{"t":1327881600,"v":5.490466666666666},{"t":1327968000,"v":5.4956314285714285},{"t":1328054400,"v":6.07439125},{"t":1328140800,"v":6.100066666666666},{"t":1328227200,"v":5.95465},{"t":1328313600,"v":5.872845},{"t":1328400000,"v":5.684396666666667},{"t":1328486400,"v":5.48982},{"t":1328572800,"v":5.633037777777778},{"t":1328659200,"v":5.59998},{"t":1328745600,"v":5.839615431034474},{"t":1328832000,"v":5.9169264},{"t":1328918400,"v":5.6005},{"t":1329004800,"v":5.51468},{"t":1329091200,"v":5.2851921875},{"t":1329177600,"v":4.433381818181816},{"t":1329264000,"v":4.271745454545455},{"t":1329350400,"v":4.26945},{"t":1329436800,"v":4.39621},{"t":1329523200,"v":4.2372890909090914},{"t":1329609600,"v":4.3784025},{"t":1329696000,"v":4.3729900000000015},{"t":1329782400,"v":4.3025400000000005},{"t":1329868800,"v":4.446645833333334},{"t":1329955200,"v":5.019525199999999},{"t":1330041600,"v":5.02920125},{"t":1330128000,"v":4.7802454545454545},{"t":1330214400,"v":4.9259825},{"t":1330300800,"v":4.959988},{"t":1330387200,"v":4.862755},{"t":1330473600,"v":4.860007083333335},{"t":1330560000,"v":4.92133},{"t":1330646400,"v":4.71674142857143},{"t":1330732800,"v":4.617961428571427},{"t":1330819200,"v":4.825593333333333},{"t":1330905600,"v":4.978101428571429},{"t":1330992000,"v":4.9941958333333325},{"t":1331078400,"v":4.922407499999999},{"t":1331164800,"v":4.93016},{"t":1331251200,"v":4.862108},{"t":1331337600,"v":4.46},{"t":1331424000,"v":4.882311538461538},{"t":1331510400,"v":4.903366666666667},{"t":1331596800,"v":5.274977999999999},{"t":1331683200,"v":5.386665000000002},{"t":1331769600,"v":5.197815},{"t":1331856000,"v":5.34374},{"t":1331942400,"v":5.180602500000001},{"t":1332028800,"v":5.279683333333334},{"t":1332115200,"v":4.6945440000000005},{"t":1332201600,"v":4.8374558333333315},{"t":1332288000,"v":4.80403},{"t":1332374400,"v":4.7301400000000005},{"t":1332460800,"v":4.675243333333333},{"t":1332547200,"v":4.6669599999999996},{"t":1332633600,"v":4.5500099999999986},{"t":1332720000,"v":4.621338333333333},{"t":1332806400,"v":4.810291537920626},{"t":1332892800,"v":4.8102475},{"t":1332979200,"v":4.756541363636363},{"t":1333065600,"v":4.8591425},{"t":1333152000,"v":4.8943925},{"t":1333238400,"v":4.8207049999999985},{"t":1333324800,"v":4.980836000000001},{"t":1333411200,"v":4.952},{"t":1333497600,"v":4.920066666666667},{"t":1333584000,"v":4.919},{"t":1333670400,"v":4.9333922222222215},{"t":1333756800,"v":4.681678461538461},{"t":1333843200,"v":4.794499999999998},{"t":1333929600,"v":4.850681428571427},{"t":1334016000,"v":4.833646666666667},{"t":1334102400,"v":4.928101666666668},{"t":1334188800,"v":4.90060875},{"t":1334275200,"v":4.936494705882354},{"t":1334361600,"v":4.96381},{"t":1334448000,"v":4.968925833333332},{"t":1334534400,"v":4.94573},{"t":1334620800,"v":4.974027142857142},{"t":1334707200,"v":5.1133},{"t":1334793600,"v":5.1059575000000015},{"t":1334880000,"v":5.367622000000001},{"t":1334966400,"v":5.2347825},{"t":1335052800,"v":5.203516666666666},{"t":1335139200,"v":4.9993401395352315},{"t":1335225600,"v":5.09822},{"t":1335312000,"v":5.1318199999999985},{"t":1335398400,"v":5.0976550000000005},{"t":1335484800,"v":5.104490196078428},{"t":1335571200,"v":4.9793},{"t":1335657600,"v":4.88741},{"t":1335744000,"v":4.936656000000001},{"t":1335830400,"v":4.99750857142857},{"t":1335916800,"v":5.03139375},{"t":1336003200,"v":5.100782499999999},{"t":1336089600,"v":5.0675050000000015},{"t":1336176000,"v":5.0766175},{"t":1336262400,"v":5.04991},{"t":1336348800,"v":5.073795},{"t":1336435200,"v":5.04494},{"t":1336521600,"v":4.98185},{"t":1336608000,"v":4.863997236842108},{"t":1336694400,"v":4.953752},{"t":1336780800,"v":4.9461900000000005},{"t":1336867200,"v":4.92996},{"t":1336953600,"v":5.007936428571427},{"t":1337040000,"v":5.03501},{"t":1337126400,"v":5.052466666666667},{"t":1337212800,"v":5.0884583333333335},{"t":1337299200,"v":5.11801},{"t":1337385600,"v":5.1096499999999985},{"t":1337472000,"v":5.09002},{"t":1337558400,"v":5.089795},{"t":1337644800,"v":5.0830275},{"t":1337731200,"v":5.132372500000002},{"t":1337817600,"v":5.11904},{"t":1337904000,"v":5.135513333333333},{"t":1337990400,"v":5.103236666666667},{"t":1338076800,"v":5.1044800000000015},{"t":1338163200,"v":5.1358},{"t":1338249600,"v":5.14997},{"t":1338336000,"v":5.134995},{"t":1338422400,"v":5.191893846153846},{"t":1338508800,"v":5.257021428571427},{"t":1338595200,"v":5.24898},{"t":1338681600,"v":5.207307777777777},{"t":1338768000,"v":5.259519999999999},{"t":1338854400,"v":5.4058790494853435},{"t":1338940800,"v":5.461776666666666},{"t":1339027200,"v":5.591628},{"t":1339113600,"v":5.631736666666666},{"t":1339200000,"v":5.55997},{"t":1339286400,"v":5.46525},{"t":1339372800,"v":5.581583333333334},{"t":1339459200,"v":5.7100133333333325},{"t":1339545600,"v":5.920347499999999},{"t":1339632000,"v":5.964776315789472},{"t":1339718400,"v":6.532364516129032},{"t":1339804800,"v":6.43582},{"t":1339891200,"v":6.17805125},{"t":1339977600,"v":6.294876808510639},{"t":1340064000,"v":6.498756666666666},{"t":1340150400,"v":6.6717150000000025},{"t":1340236800,"v":6.6615142857142855},{"t":1340323200,"v":6.5253525},{"t":1340409600,"v":6.439432000000003},{"t":1340496000,"v":6.350021666666668},{"t":1340582400,"v":6.308441428571429},{"t":1340668800,"v":6.4195},{"t":1340755200,"v":6.622337272727273},{"t":1340841600,"v":6.605946666666667},{"t":1340928000,"v":6.6512055555555545},{"t":1341014400,"v":6.689967499999999},{"t":1341100800,"v":6.628989999999999},{"t":1341187200,"v":6.7600609090909085},{"t":1341273600,"v":6.449972},{"t":1341360000,"v":6.5101},{"t":1341446400,"v":6.658883333333333},{"t":1341532800,"v":6.6287400000000005},{"t":1341619200,"v":6.7784274999999985},{"t":1341705600,"v":6.79898},{"t":1341792000,"v":6.9465625},{"t":1341878400,"v":7.199859999999998},{"t":1341964800,"v":7.167266666666667},{"t":1342051200,"v":7.688739230769229},{"t":1342137600,"v":7.646275},{"t":1342224000,"v":7.544697999999999},{"t":1342310400,"v":7.621010000000001},{"t":1342396800,"v":8.478222222222222},{"t":1342483200,"v":8.747044166666667},{"t":1342569600,"v":9.087988571428571},{"t":1342656000,"v":8.858418333333333},{"t":1342742400,"v":8.538545},{"t":1342828800,"v":8.84553},{"t":1342915200,"v":8.433048},{"t":1343001600,"v":8.444405714285713},{"t":1343088000,"v":8.562244999999999},{"t":1343174400,"v":8.801195},{"t":1343260800,"v":8.890338181818182},{"t":1343347200,"v":8.9},{"t":1343433600,"v":8.853267500000001},{"t":1343520000,"v":8.709648888888887},{"t":1343606400,"v":9.085184444444444},{"t":1343692800,"v":9.321236874999997},{"t":1343779200,"v":9.504267500000001},{"t":1343865600,"v":10.573568846153846},{"t":1343952000,"v":10.8454475},{"t":1344038400,"v":10.904964000000005},{"t":1344124800,"v":10.844743333333335},{"t":1344211200,"v":10.841448},{"t":1344297600,"v":10.951328521408579},{"t":1344384000,"v":11.06151},{"t":1344470400,"v":11.127167857142858},{"t":1344556800,"v":11.362767142857145},{"t":1344643200,"v":11.51378333333333},{"t":1344729600,"v":11.62340818181818},{"t":1344816000,"v":12.02189375},{"t":1344902400,"v":12.185994},{"t":1344988800,"v":13.24609681818182},{"t":1345075200,"v":13.476283333333335},{"t":1345161600,"v":11.679850689655176},{"t":1345248000,"v":11.40391125},{"t":1345334400,"v":7.920336249999999},{"t":1345420800,"v":10.073154202864243},{"t":1345507200,"v":9.906821111111112},{"t":1345593600,"v":9.763395},{"t":1345680000,"v":10.0999925},{"t":1345766400,"v":10.613777777777775},{"t":1345852800,"v":10.555836666666666},{"t":1345939200,"v":10.556},{"t":1346025600,"v":10.928728333333332},{"t":1346112000,"v":10.868043333333333},{"t":1346198400,"v":10.866303333333335},{"t":1346284800,"v":10.772274000000001},{"t":1346371200,"v":10.12176},{"t":1346457600,"v":9.97696},{"t":1346544000,"v":10.206460000000002},{"t":1346630400,"v":10.528666666666666},{"t":1346716800,"v":10.36613},{"t":1346803200,"v":10.976521111111113},{"t":1346889600,"v":11.18497},{"t":1346976000,"v":11.003323333333334},{"t":1347062400,"v":11.038995},{"t":1347148800,"v":11.073326666666668},{"t":1347235200,"v":11.127033333333333},{"t":1347321600,"v":11.2258135},{"t":1347408000,"v":11.3389225},{"t":1347494400,"v":11.373003333333335},{"t":1347580800,"v":11.7316},{"t":1347667200,"v":11.682625},{"t":1347753600,"v":11.863090555555553},{"t":1347840000,"v":11.897081666666665},{"t":1347926400,"v":12.294733333333333},{"t":1348012800,"v":12.521989999999999},{"t":1348099200,"v":12.337124285714285},{"t":1348185600,"v":12.344472857142858},{"t":1348272000,"v":12.2159},{"t":1348358400,"v":12.0983275},{"t":1348444800,"v":12.09198},{"t":1348531200,"v":12.134418},{"t":1348617600,"v":12.33285857142857},{"t":1348704000,"v":12.317598333333335},{"t":1348790400,"v":12.28},{"t":1348876800,"v":12.363095},{"t":1348963200,"v":12.37475},{"t":1349049600,"v":12.047820654016881},{"t":1349136000,"v":12.693781666666665},{"t":1349222400,"v":12.9395},{"t":1349308800,"v":12.766666666666666},{"t":1349395200,"v":12.7},{"t":1349481600,"v":12.505},{"t":1349568000,"v":11.815475},{"t":1349654400,"v":11.754278333333332},{"t":1349740800,"v":11.883887142857144},{"t":1349827200,"v":12.094166666666665},{"t":1349913600,"v":12.03},{"t":1350000000,"v":11.923916666666674},{"t":1350086400,"v":11.865472857142858},{"t":1350172800,"v":11.728699230769232},{"t":1350259200,"v":11.801467777777773},{"t":1350345600,"v":11.81490142857143},{"t":1350432000,"v":11.923778333333333},{"t":1350518400,"v":11.916797777777774},{"t":1350604800,"v":11.765486629213502},{"t":1350691200,"v":11.70436789473684},{"t":1350777600,"v":11.660545},{"t":1350864000,"v":11.732331666666667},{"t":1350950400,"v":11.7110025},{"t":1351036800,"v":11.64999},{"t":1351123200,"v":10.754429},{"t":1351209600,"v":10.17753181818182},{"t":1351296000,"v":10.321827857142855},{"t":1351382400,"v":10.68099},{"t":1351468800,"v":10.59333},{"t":1351555200,"v":10.846225},{"t":1351641600,"v":11.038845714285717},{"t":1351728000,"v":10.588944699114066},{"t":1351814400,"v":10.415661304347829},{"t":1351900800,"v":10.6425},{"t":1351987200,"v":10.823336666666668},{"t":1352073600,"v":10.705152857142858},{"t":1352160000,"v":10.831798999999998},{"t":1352246400,"v":10.875523333333335},{"t":1352332800,"v":10.855767777777777},{"t":1352419200,"v":10.815263157894735},{"t":1352505600,"v":10.875083999999998},{"t":1352592000,"v":10.53394},{"t":1352678400,"v":10.9172},{"t":1352764800,"v":10.881670588235293},{"t":1352851200,"v":10.94934},{"t":1352937600,"v":11.120750384615386},{"t":1353024000,"v":11.744632},{"t":1353110400,"v":11.788836999999996},{"t":1353196800,"v":11.606691818181815},{"t":1353283200,"v":11.76062},{"t":1353369600,"v":11.66508},{"t":1353456000,"v":11.697982666666665},{"t":1353542400,"v":12.32543923076923},{"t":1353628800,"v":12.33623153846154},{"t":1353715200,"v":12.370765},{"t":1353801600,"v":12.50539},{"t":1353888000,"v":12.221585},{"t":1353974400,"v":12.187300000000002},{"t":1354060800,"v":12.296015833333335},{"t":1354147200,"v":12.45},{"t":1354233600,"v":12.55498},{"t":1354320000,"v":12.578930297707243},{"t":1354406400,"v":12.4360175},{"t":1354492800,"v":12.654310844398156},{"t":1354579200,"v":13.41},{"t":1354665600,"v":13.201336666666664},{"t":1354752000,"v":13.357560006819973},{"t":1354838400,"v":13.455864444444439},{"t":1354924800,"v":13.5414715},{"t":1355011200,"v":13.348245714285715},{"t":1355097600,"v":13.461103846153845},{"t":1355184000,"v":13.605317586206901},{"t":1355270400,"v":13.646908214285714},{"t":1355356800,"v":13.728511052631578},{"t":1355443200,"v":13.604542499999999},{"t":1355529600,"v":13.510539047619051},{"t":1355616000,"v":13.395528571428573},{"t":1355702400,"v":13.23335},{"t":1355788800,"v":13.25036589147287},{"t":1355875200,"v":13.530313333333332},{"t":1355961600,"v":13.555235},{"t":1356048000,"v":13.323996},{"t":1356134400,"v":13.402473333333335},{"t":1356220800,"v":13.335932000000001},{"t":1356307200,"v":13.1285},{"t":1356393600,"v":13.37277},{"t":1356480000,"v":13.456875000000002},{"t":1356566400,"v":13.342924545454547},{"t":1356652800,"v":13.420328571428572},{"t":1356739200,"v":13.34399},{"t":1356825600,"v":13.45713},{"t":1356912000,"v":13.512004999999998},{"t":1356998400,"v":13.220000000000002},{"t":1357084800,"v":13.034},{"t":1357171200,"v":13.190000000000001},{"t":1357257600,"v":13.174000000000001},{"t":1357344000,"v":13.15},{"t":1357430400,"v":13.15},{"t":1357516800,"v":13.2},{"t":1357603200,"v":13.5},{"t":1357689600,"v":13.580000000000002},{"t":1357776000,"v":14.000000000000004},{"t":1357862400,"v":14},{"t":1357948800,"v":13.89},{"t":1358035200,"v":13.64},{"t":1358121600,"v":14.046000000000001},{"t":1358208000,"v":14.214000000000002},{"t":1358294400,"v":14.530000000000001},{"t":1358380800,"v":15.34},{"t":1358467200,"v":15.566000000000003},{"t":1358553600,"v":15.38},{"t":1358640000,"v":15.5},{"t":1358726400,"v":16.588},{"t":1358812800,"v":17.35},{"t":1358899200,"v":17.5},{"t":1358985600,"v":17.29},{"t":1359072000,"v":17.49},{"t":1359158400,"v":17.411405772},{"t":1359244800,"v":17.6},{"t":1359331200,"v":18.67},{"t":1359417600,"v":19.35},{"t":1359504000,"v":19.45},{"t":1359590400,"v":20.46},{"t":1359676800,"v":20.363142521},{"t":1359763200,"v":19.821209783},{"t":1359849600,"v":20.296},{"t":1359936000,"v":20.3},{"t":1360022400,"v":20.512},{"t":1360108800,"v":20.91},{"t":1360195200,"v":21.71},{"t":1360281600,"v":22.400970678},{"t":1360368000,"v":23.133565506},{"t":1360454400,"v":23.660000000000004},{"t":1360540800,"v":23.94},{"t":1360627200,"v":25.466},{"t":1360713600,"v":25.089999999999996},{"t":1360800000,"v":27.4},{"t":1360886400,"v":27},{"t":1360972800,"v":27.5},{"t":1361059200,"v":26.98},{"t":1361145600,"v":26.920000000000005},{"t":1361232000,"v":29.389999999999997},{"t":1361318400,"v":30.031999999999993},{"t":1361404800,"v":30},{"t":1361491200,"v":30.4},{"t":1361577600,"v":29.54},{"t":1361664000,"v":29.78},{"t":1361750400,"v":30.43},{"t":1361836800,"v":31.1},{"t":1361923200,"v":31.393769999999996},{"t":1362009600,"v":33.49101492460001},{"t":1362096000,"v":34.552},{"t":1362182400,"v":34.16},{"t":1362268800,"v":34.33},{"t":1362355200,"v":36.548158722},{"t":1362441600,"v":40.949999999999996},{"t":1362528000,"v":42.4250868578},{"t":1362614400,"v":41.6804369272},{"t":1362700800,"v":43.76},{"t":1362787200,"v":46},{"t":1362873600,"v":45.29},{"t":1362960000,"v":48.25},{"t":1363046400,"v":44.84},{"t":1363132800,"v":46.99},{"t":1363219200,"v":46.95},{"t":1363305600,"v":47.056},{"t":1363392000,"v":46.735095501},{"t":1363478400,"v":47.08816512040001},{"t":1363564800,"v":50.4324924394},{"t":1363651200,"v":59.40999999999999},{"t":1363737600,"v":64.45797156040001},{"t":1363824000,"v":72.23},{"t":1363910400,"v":69.9},{"t":1363996800,"v":63.9},{"t":1364083200,"v":70.388},{"t":1364169600,"v":75.11},{"t":1364256000,"v":79.81},{"t":1364342400,"v":89.3},{"t":1364428800,"v":88.976531972},{"t":1364515200,"v":90},{"t":1364601600,"v":92.2521875764},{"t":1364688000,"v":96.1491459096},{"t":1364774400,"v":104.70599999999999},{"t":1364860800,"v":115.803181554},{"t":1364947200,"v":132.54567795},{"t":1365033600,"v":134.94032495599998},{"t":1365120000,"v":141.78941638999999},{"t":1365206400,"v":141},{"t":1365292800,"v":164.96912500000002},{"t":1365379200,"v":185.21723709000003},{"t":1365465600,"v":229.47235258199998},{"t":1365552000,"v":160.082621718},{"t":1365638400,"v":81.2033201272},{"t":1365724800,"v":108.311396838},{"t":1365811200,"v":92.8058935256},{"t":1365897600,"v":91.11},{"t":1365984000,"v":74},{"t":1366070400,"v":67.9798189258},{"t":1366156800,"v":89.88799999999999},{"t":1366243200,"v":109.05463468},{"t":1366329600,"v":117.86900352799998},{"t":1366416000,"v":126.363163676},{"t":1366502400,"v":117.612451752},{"t":1366588800,"v":123.944},{"t":1366675200,"v":137.034},{"t":1366761600,"v":149.4},{"t":1366848000,"v":141.892},{"t":1366934400,"v":137.32},{"t":1367020800,"v":128.749986266},{"t":1367107200,"v":135.288855642},{"t":1367193600,"v":143.29557655399998},{"t":1367280000,"v":139.584},{"t":1367366400,"v":116.75},{"t":1367452800,"v":106.435208518},{"t":1367539200,"v":97.959073549},{"t":1367625600,"v":112.830658892},{"t":1367712000,"v":116.829559784},{"t":1367798400,"v":112.5799},{"t":1367884800,"v":110.939616114},{"t":1367971200,"v":113.50619419},{"t":1368057600,"v":111.644},{"t":1368144000,"v":117.882657834},{"t":1368230400,"v":115.39099999999999},{"t":1368316800,"v":114.5},{"t":1368403200,"v":115.928315862},{"t":1368489600,"v":107.06204360199999},{"t":1368576000,"v":108.59263393400002},{"t":1368662400,"v":113.320324916},{"t":1368748800,"v":117.45716305199998},{"t":1368835200,"v":118.4838},{"t":1368921600,"v":116.38},{"t":1369008000,"v":117.599041804},{"t":1369094400,"v":117.348},{"t":1369180800,"v":119.07552183600001},{"t":1369267200,"v":123.83527744400001},{"t":1369353600,"v":128.66391794400002},{"t":1369440000,"v":128.88057261},{"t":1369526400,"v":130.002080756},{"t":1369612800,"v":126.247715494},{"t":1369699200,"v":125.8736908},{"t":1369785600,"v":130.25148722199998},{"t":1369872000,"v":126.96199999999999},{"t":1369958400,"v":127.88138951199998},{"t":1370044800,"v":128.737533108},{"t":1370131200,"v":122.34617757000001},{"t":1370217600,"v":123.15253922},{"t":1370304000,"v":120.321727896},{"t":1370390400,"v":121.19039534999999},{"t":1370476800,"v":118.81145690400001},{"t":1370563200,"v":110.31002074400001},{"t":1370649600,"v":109.12055701599999},{"t":1370736000,"v":99.6530898088},{"t":1370822400,"v":104.314550266},{"t":1370908800,"v":107.362},{"t":1370995200,"v":106.01216110199998},{"t":1371081600,"v":102.075927028},{"t":1371168000,"v":99.22391874860003},{"t":1371254400,"v":99.701081323},{"t":1371340800,"v":98.9963649952},{"t":1371427200,"v":100},{"t":1371513600,"v":104.21250556},{"t":1371600000,"v":105.2384867},{"t":1371686400,"v":102.995886484},{"t":1371772800,"v":101.578550412},{"t":1371859200,"v":100},{"t":1371945600,"v":100.41},{"t":1372032000,"v":99.1983071558},{"t":1372118400,"v":97.8348793632},{"t":1372204800,"v":98.5186222374},{"t":1372291200,"v":96.83983022980001},{"t":1372377600,"v":89.8270149586},{"t":1372464000,"v":88.98},{"t":1372550400,"v":89.48303703719998},{"t":1372636800,"v":83.866379937},{"t":1372723200,"v":87.92027565880001},{"t":1372809600,"v":77.8700280454},{"t":1372896000,"v":79.2388480802},{"t":1372982400,"v":67.0842065048},{"t":1373068800,"v":66.1934263416},{"t":1373155200,"v":73.7175890654},{"t":1373241600,"v":74.14869562359999},{"t":1373328000,"v":75.0001833866},{"t":1373414400,"v":86.0265657156},{"t":1373500800,"v":87.6346673952},{"t":1373587200,"v":90.17199152959999},{"t":1373673600,"v":91.6386140104},{"t":1373760000,"v":90.042},{"t":1373846400,"v":93.77187021220001},{"t":1373932800,"v":91.5859280438},{"t":1374019200,"v":91.072269566},{"t":1374105600,"v":85.16284213280001},{"t":1374192000,"v":86.4897668956},{"t":1374278400,"v":84.936084413},{"t":1374364800,"v":85.85354587460002},{"t":1374451200,"v":85.60135641320001},{"t":1374537600,"v":86.88681211480001},{"t":1374624000,"v":88.331511862},{"t":1374710400,"v":90.12030622519998},{"t":1374796800,"v":89.98675950980001},{"t":1374883200,"v":88.16},{"t":1374969600,"v":92.51399999999998},{"t":1375056000,"v":93.39},{"t":1375142400,"v":96.7757675278},{"t":1375228800,"v":98.232},{"t":1375315200,"v":96.578561074},{"t":1375401600,"v":95.83013763459999},{"t":1375488000,"v":95.55000000000001},{"t":1375574400,"v":96.38},{"t":1375660800,"v":97.80096671999999},{"t":1375747200,"v":97.688},{"t":1375833600,"v":97.06288436099999},{"t":1375920000,"v":94.2685705668},{"t":1376006400,"v":92.292406246},{"t":1376092800,"v":93.51},{"t":1376179200,"v":94.144},{"t":1376265600,"v":95.3870275228},{"t":1376352000,"v":97.82929394779998},{"t":1376438400,"v":99.1806789844},{"t":1376524800,"v":98.10729879179999},{"t":1376611200,"v":98.25},{"t":1376697600,"v":99.76486319799999},{"t":1376784000,"v":99.3},{"t":1376870400,"v":102.85},{"t":1376956800,"v":104.803518056},{"t":1377043200,"v":110.43000000000002},{"t":1377129600,"v":109.543050212},{"t":1377216000,"v":107.70232008800001},{"t":1377302400,"v":109.050068334},{"t":1377388800,"v":113.173148148},{"t":1377475200,"v":111.826038408},{"t":1377561600,"v":117.70984706999998},{"t":1377648000,"v":117.94199999999998},{"t":1377734400,"v":118.54657146},{"t":1377820800,"v":124.85496511599999},{"t":1377907200,"v":128.36893722000002},{"t":1377993600,"v":130.66799999999998},{"t":1378080000,"v":130.07072},{"t":1378166400,"v":129.179367224},{"t":1378252800,"v":122.179969596},{"t":1378339200,"v":122.619851268},{"t":1378425600,"v":117.215590382},{"t":1378512000,"v":119.922},{"t":1378598400,"v":118.34},{"t":1378684800,"v":121.243895666},{"t":1378771200,"v":122.066102166},{"t":1378857600,"v":127.30356871400002},{"t":1378944000,"v":126.657381216},{"t":1379030400,"v":127.578944306},{"t":1379116800,"v":124.48999999999998},{"t":1379203200,"v":125.341818674},{"t":1379289600,"v":126.144560294},{"t":1379376000,"v":126.89807517},{"t":1379462400,"v":127.050300348},{"t":1379548800,"v":124.15599999999999},{"t":1379635200,"v":122.981812394},{"t":1379721600,"v":123.404},{"t":1379808000,"v":123.15527895400001},{"t":1379894400,"v":122.64674409},{"t":1379980800,"v":123.772},{"t":1380067200,"v":123.29541168800002},{"t":1380153600,"v":124.84045830800001},{"t":1380240000,"v":126.858838722},{"t":1380326400,"v":126.76026403200001},{"t":1380412800,"v":127.01000000000002},{"t":1380499200,"v":126.25},{"t":1380585600,"v":127.49537500000001},{"t":1380672000,"v":103.71981338600001},{"t":1380758400,"v":117.57163172},{"t":1380844800,"v":121.94000000000001},{"t":1380931200,"v":121.25},{"t":1381017600,"v":122.48999999999998},{"t":1381104000,"v":123.58300197999999},{"t":1381190400,"v":124.35379779999998},{"t":1381276800,"v":125.9},{"t":1381363200,"v":126.8},{"t":1381449600,"v":127.4028133},{"t":1381536000,"v":127.66401765200001},{"t":1381622400,"v":132.546798864},{"t":1381708800,"v":135.36291349799998},{"t":1381795200,"v":144.037009566},{"t":1381881600,"v":137.725951932},{"t":1381968000,"v":143.925082672},{"t":1382054400,"v":152.89},{"t":1382140800,"v":166},{"t":1382227200,"v":166.577402846},{"t":1382313600,"v":180.04214545399998},{"t":1382400000,"v":189.671875},{"t":1382486400,"v":203.67647213},{"t":1382572800,"v":194.20567046800002},{"t":1382659200,"v":187.41013911199997},{"t":1382745600,"v":179.56},{"t":1382832000,"v":194.21404057},{"t":1382918400,"v":196.15785163200002},{"t":1383004800,"v":204.71721574},{"t":1383091200,"v":198.241483734},{"t":1383177600,"v":203.188263428},{"t":1383264000,"v":202.66000000000003},{"t":1383350400,"v":204.78066666799998},{"t":1383436800,"v":209.97676905199995},{"t":1383523200,"v":227.66147456},{"t":1383609600,"v":242.853461094},{"t":1383696000,"v":263.374069342},{"t":1383782400,"v":290.83761704799997},{"t":1383868800,"v":334.186408682},{"t":1383955200,"v":334.87924823},{"t":1384041600,"v":325.439078968},{"t":1384128000,"v":343.79950985600004},{"t":1384214400,"v":354.930332458},{"t":1384300800,"v":394.190255216},{"t":1384387200,"v":415.85714820000004},{"t":1384473600,"v":413.605101372},{"t":1384560000,"v":436.62648168000004},{"t":1384646400,"v":474.85068540400005},{"t":1384732800,"v":667.042706084},{"t":1384819200,"v":540.536009962},{"t":1384905600,"v":598.564391},{"t":1384992000,"v":719.821885452},{"t":1385078400,"v":796.079284704},{"t":1385164800,"v":829.5318394279999},{"t":1385251200,"v":804.06619701},{"t":1385337600,"v":813.3048949680001},{"t":1385424000,"v":916.060529778},{"t":1385510400,"v":964.312489128},{"t":1385596800,"v":1012.81292734},{"t":1385683200,"v":1133.75527568},{"t":1385769600,"v":1118.0154046600003},{"t":1385856000,"v":953.1359506659999},{"t":1385942400,"v":1041.96372376},{"t":1386028800,"v":1054.16594214},{"t":1386115200,"v":1134.39085984},{"t":1386201600,"v":1026.00829634},{"t":1386288000,"v":811.3518261880001},{"t":1386374400,"v":693.824481394},{"t":1386460800,"v":786.5764829899999},{"t":1386547200,"v":897.73743765},{"t":1386633600,"v":979.69510658},{"t":1386720000,"v":877.395064578},{"t":1386806400,"v":873.043849604},{"t":1386892800,"v":885.3134358740001},{"t":1386979200,"v":852.01974842},{"t":1387065600,"v":861.894691022},{"t":1387152000,"v":690.700953712},{"t":1387238400,"v":675.8618964919999},{"t":1387324800,"v":520.8357772840001},{"t":1387411200,"v":684.727403898},{"t":1387497600,"v":607.9770523139999},{"t":1387584000,"v":597.4978388019999},{"t":1387670400,"v":613.3973363260001},{"t":1387756800,"v":657.355982328},{"t":1387843200,"v":652.445016424},{"t":1387929600,"v":679.4395154160001},{"t":1388016000,"v":747.7618741939999},{"t":1388102400,"v":723.730979262},{"t":1388188800,"v":714.999117648},{"t":1388275200,"v":728.090297256},{"t":1388361600,"v":735.9660303120002},{"t":1388448000,"v":731.9532930060001},{"t":1388534400,"v":753.405480556},{"t":1388620800,"v":784.280603894},{"t":1388707200,"v":807.915916232},{"t":1388793600,"v":828.7459845879999},{"t":1388880000,"v":904.7600750739999},{"t":1388966400,"v":917.382725522},{"t":1389052800,"v":789.593524042},{"t":1389139200,"v":822.864923038},{"t":1389225600,"v":825.8665006040001},{"t":1389312000,"v":854.445450584},{"t":1389398400,"v":893.6831232820001},{"t":1389484800,"v":843.286613774},{"t":1389571200,"v":822.530427934},{"t":1389657600,"v":815.996819406},{"t":1389744000,"v":840.1151583520001},{"t":1389830400,"v":814.4962523859999},{"t":1389916800,"v":794.5266687980001},{"t":1390003200,"v":811.37762176},{"t":1390089600,"v":841.4564324119999},{"t":1390176000,"v":826.696425026},{"t":1390262400,"v":824.875769878},{"t":1390348800,"v":818.534270204},{"t":1390435200,"v":810.869203164},{"t":1390521600,"v":779.3849452420001},{"t":1390608000,"v":805.652675222},{"t":1390694400,"v":814.847146534},{"t":1390780800,"v":746.678657078},{"t":1390867200,"v":785.9504199859999},{"t":1390953600,"v":794.098192396},{"t":1391040000,"v":799.5229998400001},{"t":1391126400,"v":802.998525562},{"t":1391212800,"v":813.159890274},{"t":1391299200,"v":814.932732602},{"t":1391385600,"v":808.5},{"t":1391472000,"v":801.39173376},{"t":1391558400,"v":780.917515036},{"t":1391644800,"v":762.981093598},{"t":1391731200,"v":708.3660443880001},{"t":1391817600,"v":679.578138862},{"t":1391904000,"v":687.314088924},{"t":1391990400,"v":688.4182184199999},{"t":1392076800,"v":675.110840662},{"t":1392163200,"v":652.543163334},{"t":1392249600,"v":605.83889448},{"t":1392336000,"v":670.0066271759999},{"t":1392422400,"v":655.269274756},{"t":1392508800,"v":620.641121662},{"t":1392595200,"v":632.4809440480001},{"t":1392681600,"v":629.1273936299999},{"t":1392768000,"v":624.838114922},{"t":1392854400,"v":562.5895875420001},{"t":1392940800,"v":581.290525096},{"t":1393027200,"v":611.552214376},{"t":1393113600,"v":608.198850544},{"t":1393200000,"v":536.8594994299999},{"t":1393286400,"v":536.2111523420001},{"t":1393372800,"v":585.5174387139999},{"t":1393459200,"v":583.057392048},{"t":1393545600,"v":551.4270378320001},{"t":1393632000,"v":566.7533114280001},{"t":1393718400,"v":563.2946821140001},{"t":1393804800,"v":676.820067156},{"t":1393891200,"v":673.387906086},{"t":1393977600,"v":670.1076203939999},{"t":1394064000,"v":669.219942962},{"t":1394150400,"v":632.308556588},{"t":1394236800,"v":620.6247192339999},{"t":1394323200,"v":638.418612898},{"t":1394409600,"v":629.382},{"t":1394496000,"v":635.03872797},{"t":1394582400,"v":633.854888054},{"t":1394668800,"v":641.6025862160001},{"t":1394755200,"v":629.8350340720001},{"t":1394841600,"v":637.415090218},{"t":1394928000,"v":634.8101052919999},{"t":1395014400,"v":622.84479101},{"t":1395100800,"v":614.438939238},{"t":1395187200,"v":611.19495134},{"t":1395273600,"v":586.953250296},{"t":1395360000,"v":570.012095636},{"t":1395446400,"v":564.545464148},{"t":1395532800,"v":559.690294744},{"t":1395619200,"v":584.911571278},{"t":1395705600,"v":583.845073968},{"t":1395792000,"v":579.087233466},{"t":1395878400,"v":472.14433733800007},{"t":1395964800,"v":501.09610014200007},{"t":1396051200,"v":491.9478371900001},{"t":1396137600,"v":458.77462072399993},{"t":1396224000,"v":457.02355456799995},{"t":1396310400,"v":479.31229068600004},{"t":1396396800,"v":439.626726544},{"t":1396483200,"v":449.53955801},{"t":1396569600,"v":451.900550232},{"t":1396656000,"v":463.62556298400006},{"t":1396742400,"v":457.883594364},{"t":1396828800,"v":448.95518037},{"t":1396915200,"v":453.33637541999997},{"t":1397001600,"v":443.06191353799994},{"t":1397088000,"v":363.851086082},{"t":1397174400,"v":423.4131448},{"t":1397260800,"v":423.368963092},{"t":1397347200,"v":416.86460415399995},{"t":1397433600,"v":459.09800582400004},{"t":1397520000,"v":522.29491627},{"t":1397606400,"v":527.687720992},{"t":1397692800,"v":498.366678046},{"t":1397779200,"v":482.26565610000006},{"t":1397865600,"v":504.842390182},{"t":1397952000,"v":500.39539342999996},{"t":1398038400,"v":497.251879218},{"t":1398124800,"v":489.99280993799994},{"t":1398211200,"v":492.0000000000001},{"t":1398297600,"v":502.220952572},{"t":1398384000,"v":466.88685158400006},{"t":1398470400,"v":461.04532600000005},{"t":1398556800,"v":434.374768044},{"t":1398643200,"v":442.82037402},{"t":1398729600,"v":448},{"t":1398816000,"v":448.89941997000005},{"t":1398902400,"v":460.70126204400003},{"t":1398988800,"v":454.35562384599996},{"t":1399075200,"v":439.87207680600005},{"t":1399161600,"v":437.933060358},{"t":1399248000,"v":433},{"t":1399334400,"v":428.01000000000005},{"t":1399420800,"v":440.92028681400006},{"t":1399507200,"v":439.0813533279999},{"t":1399593600,"v":451.468934602},{"t":1399680000,"v":456.543988148},{"t":1399766400,"v":439.14571257999995},{"t":1399852800,"v":442.46349},{"t":1399939200,"v":439.10721898599996},{"t":1400025600,"v":445.75451883200003},{"t":1400112000,"v":446.33672478999995},{"t":1400198400,"v":447.269647738},{"t":1400284800,"v":450.0057898},{"t":1400371200,"v":446.898},{"t":1400457600,"v":448.17908049199997},{"t":1400544000,"v":489.19391193599995},{"t":1400630400,"v":493.694430672},{"t":1400716800,"v":529.49782271},{"t":1400803200,"v":523.491528154},{"t":1400889600,"v":528.214489126},{"t":1400976000,"v":573.07334608},{"t":1401062400,"v":583.558250216},{"t":1401148800,"v":573.185524618},{"t":1401235200,"v":580.266611644},{"t":1401321600,"v":570.35},{"t":1401408000,"v":621.18},{"t":1401494400,"v":627.3743539159999},{"t":1401580800,"v":629.8553311400001},{"t":1401667200,"v":662.0855888839999},{"t":1401753600,"v":669.938043516},{"t":1401840000,"v":642.357380702},{"t":1401926400,"v":661.48},{"t":1402012800,"v":649.0938278240001},{"t":1402099200,"v":657.122319458},{"t":1402185600,"v":657.9504511279999},{"t":1402272000,"v":648.3175507240001},{"t":1402358400,"v":648.549935972},{"t":1402444800,"v":622.5026906339999},{"t":1402531200,"v":571.006454714},{"t":1402617600,"v":591.983880914},{"t":1402704000,"v":568.1956108239999},{"t":1402790400,"v":590.40657709},{"t":1402876800,"v":586.980456142},{"t":1402963200,"v":606.443230048},{"t":1403049600,"v":607},{"t":1403136000,"v":593.11789317},{"t":1403222400,"v":588.950932812},{"t":1403308800,"v":589.036790108},{"t":1403395200,"v":600.0404249320001},{"t":1403481600,"v":588.193980926},{"t":1403568000,"v":573.3281355759999},{"t":1403654400,"v":560.4947890579999},{"t":1403740800,"v":579.622750878},{"t":1403827200,"v":599.929629306},{"t":1403913600,"v":590.5955207659999},{"t":1404000000,"v":599.89},{"t":1404086400,"v":638.68650652},{"t":1404172800,"v":639.157792748},{"t":1404259200,"v":650.071232986},{"t":1404345600,"v":646.6670635520001},{"t":1404432000,"v":627.258726514},{"t":1404518400,"v":630.747663504},{"t":1404604800,"v":631.4238304700001},{"t":1404691200,"v":622.774120722},{"t":1404777600,"v":624.2982841780001},{"t":1404864000,"v":621.8734082320001},{"t":1404950400,"v":616.775924134},{"t":1405036800,"v":634.129679252},{"t":1405123200,"v":636.46644725},{"t":1405209600,"v":630.5449909639999},{"t":1405296000,"v":619.701223542},{"t":1405382400,"v":623.5592835140001},{"t":1405468800,"v":615.9106732139999},{"t":1405555200,"v":623.7643585440001},{"t":1405641600,"v":631.42881345},{"t":1405728000,"v":629.726},{"t":1405814400,"v":625.846605424},{"t":1405900800,"v":621.830136434},{"t":1405987200,"v":619.567647252},{"t":1406073600,"v":619.926984708},{"t":1406160000,"v":603.820880232},{"t":1406246400,"v":602.8812411219999},{"t":1406332800,"v":595.95700884},{"t":1406419200,"v":591.9597686699999},{"t":1406505600,"v":589.3779206380001},{"t":1406592000,"v":585.1045461199999},{"t":1406678400,"v":563.3470577280001},{"t":1406764800,"v":582.037732788},{"t":1406851200,"v":598.2},{"t":1406937600,"v":589.306},{"t":1407024000,"v":586.489508506},{"t":1407110400,"v":588.479331236},{"t":1407196800,"v":580.340990122},{"t":1407283200,"v":582.416533308},{"t":1407369600,"v":584.81249954},{"t":1407456000,"v":588.78812401},{"t":1407542400,"v":589.242055856},{"t":1407628800,"v":590.785817632},{"t":1407715200,"v":573.9565111500001},{"t":1407801600,"v":567.831212848},{"t":1407888000,"v":549.790349374},{"t":1407974400,"v":507.38701780400004},{"t":1408060800,"v":501.237741262},{"t":1408147200,"v":522.748127092},{"t":1408233600,"v":498.22564087800004},{"t":1408320000,"v":473.215708716},{"t":1408406400,"v":491.00693467},{"t":1408492800,"v":518.0240521100001},{"t":1408579200,"v":520.3913133},{"t":1408665600,"v":514.794876152},{"t":1408752000,"v":496.190259712},{"t":1408838400,"v":507.644099696},{"t":1408924800,"v":503.1851232},{"t":1409011200,"v":513.621734654},{"t":1409097600,"v":511.792230472},{"t":1409184000,"v":506.53819895799995},{"t":1409270400,"v":509.04553304800004},{"t":1409356800,"v":501.001790512},{"t":1409443200,"v":478.87886742800004},{"t":1409529600,"v":475.34660947400005},{"t":1409616000,"v":473.803368534},{"t":1409702400,"v":474.54419272800004},{"t":1409788800,"v":488.60745904},{"t":1409875200,"v":477.642145722},{"t":1409961600,"v":479.74170882},{"t":1410048000,"v":476.11974577},{"t":1410134400,"v":468.030480732},{"t":1410220800,"v":473.375732486},{"t":1410307200,"v":477.60737498399993},{"t":1410393600,"v":477.41388296800005},{"t":1410480000,"v":474.19739259},{"t":1410566400,"v":477.127472342},{"t":1410652800,"v":474.606315074},{"t":1410739200,"v":469.57152418},{"t":1410825600,"v":463.2017233959999},{"t":1410912000,"v":452.3290782179999},{"t":1410998400,"v":425.668635086},{"t":1411084800,"v":395.737689734},{"t":1411171200,"v":410.71515540999997},{"t":1411257600,"v":400.465411766},{"t":1411344000,"v":399.134149668},{"t":1411430400,"v":439.4156581540001},{"t":1411516800,"v":423.56804793000003},{"t":1411603200,"v":409.347515356},{"t":1411689600,"v":404.57418751600005},{"t":1411776000,"v":400.686514188},{"t":1411862400,"v":375.303150224},{"t":1411948800,"v":373.990622608},{"t":1412035200,"v":390.18710973000003},{"t":1412121600,"v":383.94373517800005},{"t":1412208000,"v":375.4928339},{"t":1412294400,"v":357.362980336},{"t":1412380800,"v":326.642468598},{"t":1412467200,"v":323.055049424},{"t":1412553600,"v":328.049174812},{"t":1412640000,"v":334.404218494},{"t":1412726400,"v":355.992247346},{"t":1412812800,"v":364.556226584},{"t":1412899200,"v":360.938671886},{"t":1412985600,"v":362.43268194600006},{"t":1413072000,"v":379.54423350800005},{"t":1413158400,"v":392.32550615599996},{"t":1413244800,"v":402.42857203799997},{"t":1413331200,"v":394.09448195199997},{"t":1413417600,"v":383.085283296},{"t":1413504000,"v":383.06091965599995},{"t":1413590400,"v":390.75379734},{"t":1413676800,"v":388.575872572},{"t":1413763200,"v":381.35682622},{"t":1413849600,"v":385.846074676},{"t":1413936000,"v":382.43631932},{"t":1414022400,"v":356.566155236},{"t":1414108800,"v":358.1904358080001},{"t":1414195200,"v":348.157435614},{"t":1414281600,"v":355.021491172},{"t":1414368000,"v":350.983183486},{"t":1414454400,"v":355.774005564},{"t":1414540800,"v":335.093284832},{"t":1414627200,"v":346.12152948600004},{"t":1414713600,"v":337.813393346},{"t":1414800000,"v":324.573484356},{"t":1414886400,"v":324.36579329},{"t":1414972800,"v":325.965872218},{"t":1415059200,"v":330.07754074400003},{"t":1415145600,"v":338.002215156},{"t":1415232000,"v":349.912207048},{"t":1415318400,"v":342.135011436},{"t":1415404800,"v":345.74628679},{"t":1415491200,"v":365.563844488},{"t":1415577600,"v":365.87042619199997},{"t":1415664000,"v":369.81496743400004},{"t":1415750400,"v":424.36606007599994},{"t":1415836800,"v":420.47480877199996},{"t":1415923200,"v":399.50063883800004},{"t":1416009600,"v":376.62900497399994},{"t":1416096000,"v":389.797810122},{"t":1416182400,"v":388.358},{"t":1416268800,"v":375.089345896},{"t":1416355200,"v":378.896020706},{"t":1416441600,"v":356.462709068},{"t":1416528000,"v":350.462287766},{"t":1416614400,"v":353.31120368},{"t":1416700800,"v":367.699086678},{"t":1416787200,"v":375.8525662779999},{"t":1416873600,"v":376.590034426},{"t":1416960000,"v":367.557562668},{"t":1417046400,"v":369.65427477400004},{"t":1417132800,"v":376.849520466},{"t":1417219200,"v":375.88472041},{"t":1417305600,"v":376.68151586399995},{"t":1417392000,"v":376.62900668896464},{"t":1417478400,"v":379.06941206171257},{"t":1417564800,"v":375.55602754682644},{"t":1417651200,"v":369.19470388},{"t":1417737600,"v":376},{"t":1417824000,"v":375.01795153800003},{"t":1417910400,"v":377.14578302999996},{"t":1417996800,"v":361.6342622220001},{"t":1418083200,"v":351.90854790399993},{"t":1418169600,"v":346.959745012},{"t":1418256000,"v":348.921944692},{"t":1418342400,"v":352.869712602},{"t":1418428800,"v":350.961507326},{"t":1418515200,"v":357.141899984},{"t":1418601600,"v":348.08186068599997},{"t":1418688000,"v":328.90113902},{"t":1418774400,"v":321.598493206},{"t":1418860800,"v":312.28177588799997},{"t":1418947200,"v":318.544134062},{"t":1419033600,"v":331.49050168199994},{"t":1419120000,"v":320.556787554},{"t":1419206400,"v":331.997882986},{"t":1419292800,"v":336.522172414},{"t":1419379200,"v":322.522},{"t":1419465600,"v":319.693281002},{"t":1419552000,"v":329.31228121600003},{"t":1419638400,"v":316.209387338},{"t":1419724800,"v":317.59399999999994},{"t":1419811200,"v":312.45850041200003},{"t":1419897600,"v":311.43002015},{"t":1419984000,"v":320.992712128},{"t":1420070400,"v":314.025456318},{"t":1420156800,"v":315.687160984},{"t":1420243200,"v":283.00653515},{"t":1420329600,"v":263.80788251599995},{"t":1420416000,"v":276.8},{"t":1420502400,"v":276.8},{"t":1420588800,"v":276.8},{"t":1420675200,"v":284.2775},{"t":1420761600,"v":293.956460672},{"t":1420848000,"v":275.178914552},{"t":1420934400,"v":265.104599912},{"t":1421020800,"v":267.0091753},{"t":1421107200,"v":226.23151002694604},{"t":1421193600,"v":172.2093361644184},{"t":1421280000,"v":210.22205401982146},{"t":1421366400,"v":207.400753385583},{"t":1421452800,"v":199.71335481},{"t":1421539200,"v":211.933325656},{"t":1421625600,"v":216.21354573944032},{"t":1421712000,"v":211.21436810323002},{"t":1421798400,"v":227.3673392702163},{"t":1421884800,"v":233.0832877620321},{"t":1421971200,"v":233.64693715257727},{"t":1422057600,"v":249.34753805699575},{"t":1422144000,"v":254.56624312740095},{"t":1422230400,"v":274.3673394383924},{"t":1422316800,"v":263.8566599952122},{"t":1422403200,"v":235.52673814242775},{"t":1422489600,"v":235.37804606435822},{"t":1422576000,"v":228.47145635184606},{"t":1422662400,"v":218.1833214083741},{"t":1422748800,"v":227.6223232278307},{"t":1422835200,"v":237.9709054988361},{"t":1422921600,"v":227.6791825345782},{"t":1423008000,"v":227.08019879655745},{"t":1423094400,"v":216.85577466626742},{"t":1423180800,"v":222.78397787291473},{"t":1423267200,"v":229.00185702084914},{"t":1423353600,"v":223.96367191496202},{"t":1423440000,"v":221.00423895534863},{"t":1423526400,"v":220.600396870975},{"t":1423612800,"v":219.72851613123763},{"t":1423699200,"v":222.82890337317286},{"t":1423785600,"v":236.80501885043395},{"t":1423872000,"v":257.0310272347365},{"t":1423958400,"v":235.04578132021575},{"t":1424044800,"v":234.52568993572527},{"t":1424131200,"v":244.70220039160876},{"t":1424217600,"v":237.4602610895538},{"t":1424304000,"v":241.46005745043004},{"t":1424390400,"v":245.34212468697484},{"t":1424476800,"v":245.57855416287262},{"t":1424563200,"v":236.45729496468238},{"t":1424649600,"v":239.22513276094452},{"t":1424736000,"v":239.84104232259955},{"t":1424822400,"v":238.1139375509444},{"t":1424908800,"v":237.0798280600164},{"t":1424995200,"v":253.82688189441114},{"t":1425081600,"v":253.69150938477878},{"t":1425168000,"v":258.7270505768632},{"t":1425254400,"v":276.09280051627326},{"t":1425340800,"v":282.47608809215455},{"t":1425427200,"v":272.0490118612828},{"t":1425513600,"v":275.79883665960716},{"t":1425600000,"v":273.04917469043914},{"t":1425686400,"v":276.87809766906935},{"t":1425772800,"v":275.2790516535126},{"t":1425859200,"v":288.21420611712483},{"t":1425945600,"v":292.4491012592292},{"t":1426032000,"v":296.5324948519402},{"t":1426118400,"v":295.8481806574898},{"t":1426204800,"v":285.6382567507711},{"t":1426291200,"v":283.2459863615356},{"t":1426377600,"v":287.2991907259144},{"t":1426464000,"v":291.34814111759096},{"t":1426550400,"v":286.2368092015699},{"t":1426636800,"v":258.19452903790227},{"t":1426723200,"v":262.2621084126871},{"t":1426809600,"v":263.0544217347894},{"t":1426896000,"v":261.3618035693705},{"t":1426982400,"v":268.2085121177197},{"t":1427068800,"v":266.23292063440385},{"t":1427155200,"v":245.67390713063523},{"t":1427241600,"v":246.89425507312757},{"t":1427328000,"v":249.57019468149684},{"t":1427414400,"v":247.87280676889836},{"t":1427500800,"v":253.40005072568178},{"t":1427587200,"v":243.3137110161505},{"t":1427673600,"v":248.42738942036203},{"t":1427760000,"v":244.57664205222832},{"t":1427846400,"v":247.63303657656542},{"t":1427932800,"v":253.95538646766772},{"t":1428019200,"v":254.88683613841857},{"t":1428105600,"v":253.99292625441475},{"t":1428192000,"v":261.2126187518514},{"t":1428278400,"v":256.42207301291876},{"t":1428364800,"v":253.9894885279104},{"t":1428451200,"v":245.8480735401531},{"t":1428537600,"v":244.61592088577717},{"t":1428624000,"v":236.51085470525223},{"t":1428710400,"v":236.77240091579887},{"t":1428796800,"v":236.47709775061168},{"t":1428883200,"v":224.97651532966492},{"t":1428969600,"v":219.38748621905415},{"t":1429056000,"v":223.8348000035629},{"t":1429142400,"v":227.870378726502},{"t":1429228800,"v":223.0841719013738},{"t":1429315200,"v":223.5865237125548},{"t":1429401600,"v":223.56744726495444},{"t":1429488000,"v":225.2184300872037},{"t":1429574400,"v":235.52102469647576},{"t":1429660800,"v":233.7009634608557},{"t":1429747200,"v":236.16353681713173},{"t":1429833600,"v":231.02053372487694},{"t":1429920000,"v":226.58547994375857},{"t":1430006400,"v":221.05379960481326},{"t":1430092800,"v":227.44977115968467},{"t":1430179200,"v":225.3984377539342},{"t":1430265600,"v":225.6405442418366},{"t":1430352000,"v":236.70311574991769},{"t":1430438400,"v":232.7740205181823},{"t":1430524800,"v":234.4547062686378},{"t":1430611200,"v":239.8453986375642},{"t":1430697600,"v":239.2673350149646},{"t":1430784000,"v":236.2114911026119},{"t":1430870400,"v":229.65578168538187},{"t":1430956800,"v":237.41283096784377},{"t":1431043200,"v":244.33760132386223},{"t":1431129600,"v":242.61964510761345},{"t":1431216000,"v":240.84372690869867},{"t":1431302400,"v":241.6363056849018},{"t":1431388800,"v":241.3522020526193},{"t":1431475200,"v":236.34631682189985},{"t":1431561600,"v":237.2065240952482},{"t":1431648000,"v":237.88739720451107},{"t":1431734400,"v":236.39271552739993},{"t":1431820800,"v":236.67925526699733},{"t":1431907200,"v":233.59070718131207},{"t":1431993600,"v":231.94833933961522},{"t":1432080000,"v":234.39819597114405},{"t":1432166400,"v":235.60389444679782},{"t":1432252800,"v":239.8753072751549},{"t":1432339200,"v":238.7335530263541},{"t":1432425600,"v":240.2080085180499},{"t":1432512000,"v":236.59160604779555},{"t":1432598400,"v":236.25099422574218},{"t":1432684800,"v":237.03972228175166},{"t":1432771200,"v":237.16309622469356},{"t":1432857600,"v":236.45937825027846},{"t":1432944000,"v":233.42921780934725},{"t":1433030400,"v":229.87046265828167},{"t":1433116800,"v":223.56821041088014},{"t":1433203200,"v":225.49709536567593},{"t":1433289600,"v":225.56818189200266},{"t":1433376000,"v":223.93542023042738},{"t":1433462400,"v":224.59609382064255},{"t":1433548800,"v":225.06047468964124},{"t":1433635200,"v":223.50816929894273},{"t":1433721600,"v":228.7738683609431},{"t":1433808000,"v":229.00326077961145},{"t":1433894400,"v":228.5646397876235},{"t":1433980800,"v":229.32148022612697},{"t":1434067200,"v":229.3949082185111},{"t":1434153600,"v":232.99016074834827},{"t":1434240000,"v":232.2732607782773},{"t":1434326400,"v":236.5940075448309},{"t":1434412800,"v":250.88443111466125},{"t":1434499200,"v":248.91023822223178},{"t":1434585600,"v":248.9536229545178},{"t":1434672000,"v":244.4347548506766},{"t":1434758400,"v":246.03594777095446},{"t":1434844800,"v":244.2264603457139},{"t":1434931200,"v":246.9779718291997},{"t":1435017600,"v":244.36086832501388},{"t":1435104000,"v":240.1896323677801},{"t":1435190400,"v":242.4657489591529},{"t":1435276800,"v":242.94756980246657},{"t":1435363200,"v":251.49174712609874},{"t":1435449600,"v":248.8923275300042},{"t":1435536000,"v":256.91585700923576},{"t":1435622400,"v":263.2627227196955},{"t":1435708800,"v":258.33938010023616},{"t":1435795200,"v":254.7397570388532},{"t":1435881600,"v":256.2885206258173},{"t":1435968000,"v":260.35848089066934},{"t":1436054400,"v":271.63960764862867},{"t":1436140800,"v":269.0768488345606},{"t":1436227200,"v":265.8951663337417},{"t":1436313600,"v":270.6944467211694},{"t":1436400000,"v":269.4970385701621},{"t":1436486400,"v":285.98871451527094},{"t":1436572800,"v":292.3726314342531},{"t":1436659200,"v":312.0321590438759},{"t":1436745600,"v":292.8213347492119},{"t":1436832000,"v":287.35782996192245},{"t":1436918400,"v":285.53537250271336},{"t":1437004800,"v":278.4261692588851},{"t":1437091200,"v":279.9105836013045},{"t":1437177600,"v":276.9949239987578},{"t":1437264000,"v":275.3879562178301},{"t":1437350400,"v":279.74386880723625},{"t":1437436800,"v":276.97419614546396},{"t":1437523200,"v":277.86794799515405},{"t":1437609600,"v":277.25297528994145},{"t":1437696000,"v":289.1761070018832},{"t":1437782400,"v":289.16803970564604},{"t":1437868800,"v":293.1260382264218},{"t":1437955200,"v":294.2216879969626},{"t":1438041600,"v":295.18419440658045},{"t":1438128000,"v":290.17602216358387},{"t":1438214400,"v":288.1899783743672},{"t":1438300800,"v":284.8233479578995},{"t":1438387200,"v":281.53847313579416},{"t":1438473600,"v":282.28631492499073},{"t":1438560000,"v":280.8324962243669},{"t":1438646400,"v":285.17892466424576},{"t":1438732800,"v":281.77046029724886},{"t":1438819200,"v":278.3535861876579},{"t":1438905600,"v":279.4942602464934},{"t":1438992000,"v":262.05419732600524},{"t":1439078400,"v":267.51328940994455},{"t":1439164800,"v":264.79175529822226},{"t":1439251200,"v":271.7186639460532},{"t":1439337600,"v":267.34646970647646},{"t":1439424000,"v":264.50015113146185},{"t":1439510400,"v":265.984485481529},{"t":1439596800,"v":262.3268821607181},{"t":1439683200,"v":258.48440125819116},{"t":1439769600,"v":256.64789609100364},{"t":1439856000,"v":222.30928824760167},{"t":1439942400,"v":227.40809004507705},{"t":1440028800,"v":235.53136721991592},{"t":1440115200,"v":233.03390533616795},{"t":1440201600,"v":231.08649547071286},{"t":1440288000,"v":228.8419084678968},{"t":1440374400,"v":211.04029812016228},{"t":1440460800,"v":223.11452108192162},{"t":1440547200,"v":226.1075134092342},{"t":1440633600,"v":225.56237052087312},{"t":1440720000,"v":231.52008387831285},{"t":1440806400,"v":230.1742717846294},{"t":1440892800,"v":228.8670732204802},{"t":1440979200,"v":230.59809103226553},{"t":1441065600,"v":228.0608584854554},{"t":1441152000,"v":229.3621245778932},{"t":1441238400,"v":227.23996193137782},{"t":1441324800,"v":231.25430337632557},{"t":1441411200,"v":236.0671291026174},{"t":1441497600,"v":240.68976830398393},{"t":1441584000,"v":241.02145890795947},{"t":1441670400,"v":244.23028202966935},{"t":1441756800,"v":238.64699669387738},{"t":1441843200,"v":238.65631371778696},{"t":1441929600,"v":240.72803507045546},{"t":1442016000,"v":235.38640084032153},{"t":1442102400,"v":230.2314716349509},{"t":1442188800,"v":230.66681987336318},{"t":1442275200,"v":230.18311924399845},{"t":1442361600,"v":229.2495574632945},{"t":1442448000,"v":232.7716151933546},{"t":1442534400,"v":233.45600185429976},{"t":1442620800,"v":231.72953491596854},{"t":1442707200,"v":230.68535720681675},{"t":1442793600,"v":226.6662632336626},{"t":1442880000,"v":230.61068690263542},{"t":1442966400,"v":229.82978513470525},{"t":1443052800,"v":234.4753888262895},{"t":1443139200,"v":235.2908548005521},{"t":1443225600,"v":234.5934120623101},{"t":1443312000,"v":233.18068434946878},{"t":1443398400,"v":239.47488643573993},{"t":1443484800,"v":237.09198320316509},{"t":1443571200,"v":236.85368796707021},{"t":1443657600,"v":237.82075625088078},{"t":1443744000,"v":238.17530073042212},{"t":1443830400,"v":239.56040132076637},{"t":1443916800,"v":239.33481153938868},{"t":1444003200,"v":240.78453591961664},{"t":1444089600,"v":246.77201716769088},{"t":1444176000,"v":243.30663642926592},{"t":1444262400,"v":242.9524075126918},{"t":1444348800,"v":244.4255139081272},{"t":1444435200,"v":245.9098072068554},{"t":1444521600,"v":248.94019306744676},{"t":1444608000,"v":246.20617221314052},{"t":1444694400,"v":250.0391563717686},{"t":1444780800,"v":253.12203079360424},{"t":1444867200,"v":254.63318166842015},{"t":1444953600,"v":262.78453429548875},{"t":1445040000,"v":272.5708393360872},{"t":1445126400,"v":264.1076345503976},{"t":1445212800,"v":264.3202634396505},{"t":1445299200,"v":270.7099906978552},{"t":1445385600,"v":268.24522907122025},{"t":1445472000,"v":275.55908332825675},{"t":1445558400,"v":278.69805077486205},{"t":1445644800,"v":283.6091613210242},{"t":1445731200,"v":284.26263600676805},{"t":1445817600,"v":286.86547456086225},{"t":1445904000,"v":295.20093312413206},{"t":1445990400,"v":304.80745035505936},{"t":1446076800,"v":315.21087607896385},{"t":1446163200,"v":328.9191848346569},{"t":1446249600,"v":312.10899213735587},{"t":1446336000,"v":328.4881524558023},{"t":1446422400,"v":362.95298972072004},{"t":1446508800,"v":403.60760015527967},{"t":1446595200,"v":408.40316317328046},{"t":1446681600,"v":385.71264935145183},{"t":1446768000,"v":374.44139240597144},{"t":1446854400,"v":385.76265790586126},{"t":1446940800,"v":372.86695374186934},{"t":1447027200,"v":378.95059536527606},{"t":1447113600,"v":335.79636717053035},{"t":1447200000,"v":310.2309524422893},{"t":1447286400,"v":338.6393034805578},{"t":1447372800,"v":337.0562129246183},{"t":1447459200,"v":333.439122539814},{"t":1447545600,"v":320.3207315551851},{"t":1447632000,"v":331.7085679802535},{"t":1447718400,"v":336.27064502172516},{"t":1447804800,"v":334.72243230786967},{"t":1447891200,"v":326.57191468523297},{"t":1447977600,"v":321.82747201497375},{"t":1448064000,"v":326.3387576784565},{"t":1448150400,"v":323.80777196175893},{"t":1448236800,"v":323.11211587743236},{"t":1448323200,"v":320.2786544058803},{"t":1448409600,"v":328.95709929189985},{"t":1448496000,"v":352.9815835414223},{"t":1448582400,"v":357.7679405226297},{"t":1448668800,"v":356.5316287061623},{"t":1448755200,"v":371.56062339708836},{"t":1448841600,"v":376.9796965739912},{"t":1448928000,"v":362.9135153696589},{"t":1449014400,"v":359.36565308034005},{"t":1449100800,"v":361.4880907867144},{"t":1449187200,"v":363.6694300330024},{"t":1449273600,"v":387.8975263902973},{"t":1449360000,"v":387.6737772689671},{"t":1449446400,"v":394.81581788008197},{"t":1449532800,"v":416.94368780430784},{"t":1449619200,"v":417.5696303375327},{"t":1449705600,"v":415.39939616850705},{"t":1449792000,"v":453.1305854150825},{"t":1449878400,"v":436.75298646387876},{"t":1449964800,"v":433.3545154611923},{"t":1450051200,"v":443.8590702689776},{"t":1450137600,"v":463.9822589592027},{"t":1450224000,"v":454.06528884560765},{"t":1450310400,"v":455.8338169637597},{"t":1450396800,"v":463.12910763070374},{"t":1450483200,"v":461.44159724790654},{"t":1450569600,"v":442.29881918198953},{"t":1450656000,"v":437.2047325783519},{"t":1450742400,"v":434.6732117942569},{"t":1450828800,"v":442.41482089884613},{"t":1450915200,"v":455.74013016062173},{"t":1451001600,"v":455.85591512491953},{"t":1451088000,"v":418.47369385302943},{"t":1451174400,"v":422.2507205514291},{"t":1451260800,"v":421.6523204183636},{"t":1451347200,"v":432.94242916990527},{"t":1451433600,"v":426.97325638352305},{"t":1451520000,"v":430.21143265315385},{"t":1451606400,"v":434.8839824640039},{"t":1451692800,"v":434.92242033909116},{"t":1451779200,"v":430.9997978270536},{"t":1451865600,"v":433.90199131687206},{"t":1451952000,"v":433.16659869576245},{"t":1452038400,"v":429.9253492492494},{"t":1452124800,"v":458.7099236879629},{"t":1452211200,"v":454.05328330860004},{"t":1452297600,"v":449.69718279879146},{"t":1452384000,"v":448.95363526897563},{"t":1452470400,"v":448.69524978182716},{"t":1452556800,"v":435.48555090765376},{"t":1452643200,"v":432.6577823362845},{"t":1452729600,"v":430.0250259843386},{"t":1452816000,"v":362.4305504507852},{"t":1452902400,"v":388.1881730585918},{"t":1452988800,"v":379.148748639874},{"t":1453075200,"v":384.928918248786},{"t":1453161600,"v":376.7663108392438},{"t":1453248000,"v":419.22525017175093},{"t":1453334400,"v":409.26809902414743},{"t":1453420800,"v":383.29492881453876},{"t":1453507200,"v":386.9158595464536},{"t":1453593600,"v":402.8010750231029},{"t":1453680000,"v":391.1212623042642},{"t":1453766400,"v":391.6668140869515},{"t":1453852800,"v":394.4466804448489},{"t":1453939200,"v":379.75057770315664},{"t":1454025600,"v":378.6405195412309},{"t":1454112000,"v":377.3488875787101},{"t":1454198400,"v":367.9508595508954},{"t":1454284800,"v":371.37052319412066},{"t":1454371200,"v":372.96226926144027},{"t":1454457600,"v":368.53490319794935},{"t":1454544000,"v":388.09502866803325},{"t":1454630400,"v":383.9341258581022},{"t":1454716800,"v":375.22738704758757},{"t":1454803200,"v":376.42862922366214},{"t":1454889600,"v":371.21694243336185},{"t":1454976000,"v":372.7623707800957},{"t":1455062400,"v":378.95173421310903},{"t":1455148800,"v":378.14838162107424},{"t":1455235200,"v":382.39209701651856},{"t":1455321600,"v":390.65036662988143},{"t":1455408000,"v":406.5740594276338},{"t":1455494400,"v":398.8081586422428},{"t":1455580800,"v":407.238241647739},{"t":1455667200,"v":414.8979246844353},{"t":1455753600,"v":421.16569563372616},{"t":1455840000,"v":420.44353590336175},{"t":1455926400,"v":434.6179274199626},{"t":1456012800,"v":438.47243072984276},{"t":1456099200,"v":437.4889589178774},{"t":1456185600,"v":419.61022318481594},{"t":1456272000,"v":423.851263269437},{"t":1456358400,"v":423.5093989250703},{"t":1456444800,"v":430.6719637219394},{"t":1456531200,"v":432.1432341275273},{"t":1456617600,"v":431.5065287388273},{"t":1456704000,"v":436.4222492894298},{"t":1456790400,"v":433.2277035606563},{"t":1456876800,"v":420.12615262177826},{"t":1456963200,"v":419.31158198959054},{"t":1457049600,"v":407.2361243772178},{"t":1457136000,"v":398.50243239160943},{"t":1457222400,"v":404.6277893211019},{"t":1457308800,"v":412.8005827105356},{"t":1457395200,"v":411.4093473295935},{"t":1457481600,"v":412.59964953173085},{"t":1457568000,"v":415.96573582904114},{"t":1457654400,"v":419.64531649745595},{"t":1457740800,"v":410.139940852359},{"t":1457827200,"v":412.61530446772593},{"t":1457913600,"v":415.05435298344673},{"t":1458000000,"v":415.4742785335744},{"t":1458086400,"v":416.2381856412929},{"t":1458172800,"v":418.5086720041087},{"t":1458259200,"v":409.2494736684257},{"t":1458345600,"v":409.6114015305549},{"t":1458432000,"v":411.66829833103867},{"t":1458518400,"v":411.7585748667672},{"t":1458604800,"v":416.54761875463345},{"t":1458691200,"v":417.53883195340177},{"t":1458777600,"v":412.68391467188684},{"t":1458864000,"v":416.3595573150922},{"t":1458950400,"v":416.92298328256874},{"t":1459036800,"v":425.01140597187987},{"t":1459123200,"v":422.6782895074445},{"t":1459209600,"v":416.1195712728422},{"t":1459296000,"v":413.08440509498695},{"t":1459382400,"v":415.55633232669516},{"t":1459468800,"v":417.1655761916554},{"t":1459555200,"v":419.7207145718917},{"t":1459641600,"v":419.82532399189205},{"t":1459728000,"v":419.362325459036},{"t":1459814400,"v":422.2472808455297},{"t":1459900800,"v":421.31238406636857},{"t":1459987200,"v":421.15249323824656},{"t":1460073600,"v":418.70082480212614},{"t":1460160000,"v":419.1189017501917},{"t":1460246400,"v":422.06377504107894},{"t":1460332800,"v":423.44435415721694},{"t":1460419200,"v":426.77208468908714},{"t":1460505600,"v":424.9491271718547},{"t":1460592000,"v":425.73829926128775},{"t":1460678400,"v":430.41062868258484},{"t":1460764800,"v":433.2765036183376},{"t":1460851200,"v":428.91892249032605},{"t":1460937600,"v":429.62552571146455},{"t":1461024000,"v":436.6868552636164},{"t":1461110400,"v":442.45631725659206},{"t":1461196800,"v":451.6680756279053},{"t":1461283200,"v":448.09023328498296},{"t":1461369600,"v":455.48689847015464},{"t":1461456000,"v":462.25317862898964},{"t":1461542400,"v":464.57983400980066},{"t":1461628800,"v":469.6017137637834},{"t":1461715200,"v":444.59813801158623},{"t":1461801600,"v":451.7265497426921},{"t":1461888000,"v":457.444408673028},{"t":1461974400,"v":453.35807263852155},{"t":1462060800,"v":454.3377402582147},{"t":1462147200,"v":445.729278648282},{"t":1462233600,"v":451.501854947788},{"t":1462320000,"v":448.00193740466904},{"t":1462406400,"v":449.2282265593353},{"t":1462492800,"v":460.9599712723831},{"t":1462579200,"v":461.138059959326},{"t":1462665600,"v":461.5625344457377},{"t":1462752000,"v":463.8478179625745},{"t":1462838400,"v":452.38923924080063},{"t":1462924800,"v":454.46139296844393},{"t":1463011200,"v":455.53856203692703},{"t":1463097600,"v":457.60834697826897},{"t":1463184000,"v":458.44491586756294},{"t":1463270400,"v":460.9721197500823},{"t":1463356800,"v":454.6210663380606},{"t":1463443200,"v":453.84373845479075},{"t":1463529600,"v":454.9559643049547},{"t":1463616000,"v":438.5470537052079},{"t":1463702400,"v":445.21445461964197},{"t":1463788800,"v":445.7950017281727},{"t":1463875200,"v":441.11737178700224},{"t":1463961600,"v":445.09554932369775},{"t":1464048000,"v":445.74600732461613},{"t":1464134400,"v":451.3402890773279},{"t":1464220800,"v":454.08349108848006},{"t":1464307200,"v":470.6678659296852},{"t":1464393600,"v":523.4010670292037},{"t":1464480000,"v":522.4012688892889},{"t":1464566400,"v":531.7697241514386},{"t":1464652800,"v":531.5451114534147},{"t":1464739200,"v":534.929231166291},{"t":1464825600,"v":538.0219157804956},{"t":1464912000,"v":570.0249109843392},{"t":1464998400,"v":574.1044870799856},{"t":1465084800,"v":574.6507220672327},{"t":1465171200,"v":585.2448605161708},{"t":1465257600,"v":578.1194883937324},{"t":1465344000,"v":583.0049348368627},{"t":1465430400,"v":577.0760450769253},{"t":1465516800,"v":579.8212995235086},{"t":1465603200,"v":607.17430380675},{"t":1465689600,"v":671.0887766935982},{"t":1465776000,"v":705.2537025153345},{"t":1465862400,"v":685.1158454197318},{"t":1465948800,"v":697.4923346649625},{"t":1466035200,"v":768.6542678135833},{"t":1466121600,"v":752.9334092068809},{"t":1466208000,"v":757.3416662071204},{"t":1466294400,"v":767.4518264835016},{"t":1466380800,"v":715.3350485677917},{"t":1466467200,"v":667.217531653078},{"t":1466553600,"v":597.5623930748819},{"t":1466640000,"v":627.9657566291881},{"t":1466726400,"v":667.5468611638372},{"t":1466812800,"v":665.7125861193371},{"t":1466899200,"v":633.8908753967772},{"t":1466985600,"v":657.042473154401},{"t":1467072000,"v":647.9137512329382},{"t":1467158400,"v":637.0942855303231},{"t":1467244800,"v":672.6324199351302},{"t":1467331200,"v":677.7523138559045},{"t":1467417600,"v":703.0031427888437},{"t":1467504000,"v":661.439850366025},{"t":1467590400,"v":681.3720236261811},{"t":1467676800,"v":669.5220391628915},{"t":1467763200,"v":677.0219670928782},{"t":1467849600,"v":640.7836172202872},{"t":1467936000,"v":665.8419667000638},{"t":1468022400,"v":657.3184540890006},{"t":1468108800,"v":651.3047799816928},{"t":1468195200,"v":651.1524242489038},{"t":1468281600,"v":665.2699931763912},{"t":1468368000,"v":655.2105758522562},{"t":1468454400,"v":660.2911244612783},{"t":1468540800,"v":666.4306437343722},{"t":1468627200,"v":663.3188356448769},{"t":1468713600,"v":679.8341644292315},{"t":1468800000,"v":675.0654188097517},{"t":1468886400,"v":674.0658044287677},{"t":1468972800,"v":667.3264934261225},{"t":1469059200,"v":667.2942051820498},{"t":1469145600,"v":653.2611166392969},{"t":1469232000,"v":657.7541150361819},{"t":1469318400,"v":660.8986520111177},{"t":1469404800,"v":656.727918956488},{"t":1469491200,"v":654.174462619276},{"t":1469577600,"v":656.6374550331486},{"t":1469664000,"v":654.8738329724555},{"t":1469750400,"v":657.202841742762},{"t":1469836800,"v":655.0710646480535},{"t":1469923200,"v":626.6782449704231},{"t":1470009600,"v":603.0714699772217},{"t":1470096000,"v":541.1173090967804},{"t":1470182400,"v":570.498084933119},{"t":1470268800,"v":584.2871190374406},{"t":1470355200,"v":578.7203581679671},{"t":1470441600,"v":590.6386563792255},{"t":1470528000,"v":594.2242426379976},{"t":1470614400,"v":591.594596271462},{"t":1470700800,"v":585.9862966427914},{"t":1470787200,"v":593.309228099764},{"t":1470873600,"v":586.8243344160251},{"t":1470960000,"v":587.6670928265272},{"t":1471046400,"v":585.6063890254981},{"t":1471132800,"v":572.7941323513933},{"t":1471219200,"v":567.4857481002539},{"t":1471305600,"v":578.4633278459701},{"t":1471392000,"v":573.999199368756},{"t":1471478400,"v":573.6346051922998},{"t":1471564800,"v":573.6856113314623},{"t":1471651200,"v":580.6772171224967},{"t":1471737600,"v":580.2640710660802},{"t":1471824000,"v":584.5310006792232},{"t":1471910400,"v":582.1403915731989},{"t":1471996800,"v":578.8355713317429},{"t":1472083200,"v":575.7225958239035},{"t":1472169600,"v":578.7497338081189},{"t":1472256000,"v":569.4518502062841},{"t":1472342400,"v":575.0956449603555},{"t":1472428800,"v":572.9005311004324},{"t":1472515200,"v":575.264045416163},{"t":1472601600,"v":571.1965360376626},{"t":1472688000,"v":572.5561672481705},{"t":1472774400,"v":575.0009111070633},{"t":1472860800,"v":598.6908473034971},{"t":1472947200,"v":611.4227799559515},{"t":1473033600,"v":606.1033693815909},{"t":1473120000,"v":610.3828471588885},{"t":1473206400,"v":615.0585387829371},{"t":1473292800,"v":627.3697008597358},{"t":1473379200,"v":622.2820047345849},{"t":1473465600,"v":623.2641908171909},{"t":1473552000,"v":606.3234045793001},{"t":1473638400,"v":607.3223156688099},{"t":1473724800,"v":608.2890249240006},{"t":1473811200,"v":608.7350306744854},{"t":1473897600,"v":605.2743670751692},{"t":1473984000,"v":607.7392757581945},{"t":1474070400,"v":606.886534070155},{"t":1474156800,"v":610.9444636865104},{"t":1474243200,"v":608.5191535319566},{"t":1474329600,"v":606.7807663856313},{"t":1474416000,"v":596.5872229886088},{"t":1474502400,"v":595.3638256212346},{"t":1474588800,"v":601.5785021720683},{"t":1474675200,"v":601.0346316912924},{"t":1474761600,"v":600.5018579499821},{"t":1474848000,"v":606.2001855573536},{"t":1474934400,"v":604.6179169458967},{"t":1475020800,"v":604.9065178321194},{"t":1475107200,"v":605.8710149342171},{"t":1475193600,"v":608.9129588326075},{"t":1475280000,"v":615.4437866654439},{"t":1475366400,"v":611.1847244226493},{"t":1475452800,"v":612.7803428472209},{"t":1475539200,"v":608.7535531170712},{"t":1475625600,"v":611.7243118951259},{"t":1475712000,"v":611.3559903041948},{"t":1475798400,"v":617.7007337644986},{"t":1475884800,"v":619.0011133410942},{"t":1475971200,"v":615.6507746403641},{"t":1476057600,"v":617.885270112388},{"t":1476144000,"v":642.0432135326828},{"t":1476230400,"v":635.7951243678986},{"t":1476316800,"v":635.3288217408204},{"t":1476403200,"v":638.0457908025508},{"t":1476489600,"v":636.7173591554766},{"t":1476576000,"v":640.4330294524818},{"t":1476662400,"v":638.2363785568257},{"t":1476748800,"v":635.2516741913081},{"t":1476835200,"v":628.6662997535108},{"t":1476921600,"v":628.7118242328036},{"t":1477008000,"v":630.4802818461595},{"t":1477094400,"v":652.4767975854163},{"t":1477180800,"v":650.3057909224307},{"t":1477267200,"v":648.7729777619805},{"t":1477353600,"v":652.6148720913783},{"t":1477440000,"v":674.1736532731238},{"t":1477526400,"v":687.4780503021145},{"t":1477612800,"v":688.4962938599248},{"t":1477699200,"v":714.0132049999412},{"t":1477785600,"v":697.5440979156243},{"t":1477872000,"v":697.0695553784091},{"t":1477958400,"v":729.7826819595628},{"t":1478044800,"v":742.1366006752444},{"t":1478131200,"v":687.9545124061295},{"t":1478217600,"v":704.0639814357988},{"t":1478304000,"v":705.4952687890394},{"t":1478390400,"v":716.3226858760313},{"t":1478476800,"v":703.0813011748169},{"t":1478563200,"v":710.8930104497259},{"t":1478649600,"v":721.2385791964598},{"t":1478736000,"v":713.3071442331326},{"t":1478822400,"v":716.6398744331848},{"t":1478908800,"v":704.1206813292735},{"t":1478995200,"v":702.3881415369592},{"t":1479081600,"v":704.8674758914456},{"t":1479168000,"v":712.2453422595772},{"t":1479254400,"v":737.3415145062261},{"t":1479340800,"v":730.3281411168742},{"t":1479427200,"v":748.4639181660784},{"t":1479513600,"v":750.7693031371174},{"t":1479600000,"v":729.8329977409578},{"t":1479686400,"v":736.549441363089},{"t":1479772800,"v":748.0008385885615},{"t":1479859200,"v":741.6163279205991},{"t":1479945600,"v":737.6106062205533},{"t":1480032000,"v":739.7574413834575},{"t":1480118400,"v":732.8834415193076},{"t":1480204800,"v":728.8590062573011},{"t":1480291200,"v":729.9131589550252},{"t":1480377600,"v":732.0910705749118},{"t":1480464000,"v":742.370297121118},{"t":1480550400,"v":753.1630525910048},{"t":1480636800,"v":769.78817671816},{"t":1480723200,"v":766.6808823682435},{"t":1480809600,"v":765.0191934692918},{"t":1480896000,"v":751.8443230070479},{"t":1480982400,"v":759.5092488244851},{"t":1481068800,"v":765.0274254944902},{"t":1481155200,"v":767.1251344839858},{"t":1481241600,"v":772.45075208349},{"t":1481328000,"v":775.4348079091958},{"t":1481414400,"v":769.3897794425235},{"t":1481500800,"v":778.2982728836786},{"t":1481587200,"v":777.1148524611921},{"t":1481673600,"v":777.5387069475062},{"t":1481760000,"v":776.1219368298958},{"t":1481846400,"v":780.9259172614201},{"t":1481932800,"v":788.9255361334598},{"t":1482019200,"v":790.4343388020021},{"t":1482105600,"v":790.9863472149785},{"t":1482192000,"v":799.2034682736746},{"t":1482278400,"v":833.3000276324859},{"t":1482364800,"v":857.6320329591081},{"t":1482451200,"v":916.2689181350572},{"t":1482537600,"v":892.4642177832177},{"t":1482624000,"v":894.8863982560963},{"t":1482710400,"v":901.3421392502881},{"t":1482796800,"v":927.8784235549241},{"t":1482883200,"v":978.6706323804319},{"t":1482969600,"v":970.5916246961866},{"t":1483056000,"v":960.9125488129987},{"t":1483142400,"v":967.7422560147834},{"t":1483228800,"v":995.9339491996291},{"t":1483315200,"v":1014.3551444208006},{"t":1483401600,"v":1024.4356274214406},{"t":1483488000,"v":1120.5665806362429},{"t":1483574400,"v":1002.9225429218841},{"t":1483660800,"v":893.5322212419582},{"t":1483747200,"v":906.0237000544815},{"t":1483833600,"v":920.0144439293053},{"t":1483920000,"v":901.6846047662914},{"t":1484006400,"v":905.3372890525112},{"t":1484092800,"v":788.6627243239802},{"t":1484179200,"v":810.6206346707453},{"t":1484265600,"v":826.8820727986597},{"t":1484352000,"v":824.4725280214013},{"t":1484438400,"v":828.2438456915527},{"t":1484524800,"v":832.2975703857504},{"t":1484611200,"v":905.9891266982038},{"t":1484697600,"v":887.4321969838854},{"t":1484784000,"v":902.51327038944},{"t":1484870400,"v":895.0778348690013},{"t":1484956800,"v":923.9705284416652},{"t":1485043200,"v":926.2267163651608},{"t":1485129600,"v":918.1218197310366},{"t":1485216000,"v":886.5455413735126},{"t":1485302400,"v":897.3617133683149},{"t":1485388800,"v":916.8285986586582},{"t":1485475200,"v":921.5422094299513},{"t":1485561600,"v":924.7673237596504},{"t":1485648000,"v":915.1648754787748},{"t":1485734400,"v":922.0738109942619},{"t":1485820800,"v":968.8802576054234},{"t":1485907200,"v":987.7523632206257},{"t":1485993600,"v":1008.04242305061},{"t":1486080000,"v":1017.4797248413867},{"t":1486166400,"v":1034.9539111460294},{"t":1486252800,"v":1015.6507467246023},{"t":1486339200,"v":1023.1524015508714},{"t":1486425600,"v":1053.850386120103},{"t":1486512000,"v":1053.705061673372},{"t":1486598400,"v":988.412932065044},{"t":1486684800,"v":999.5649259922793},{"t":1486771200,"v":1017.4108314000738},{"t":1486857600,"v":1007.6745400361308},{"t":1486944000,"v":1002.2742943586869},{"t":1487030400,"v":1013.0606096747724},{"t":1487116800,"v":1013.7192202029706},{"t":1487203200,"v":1035.5864430165802},{"t":1487289600,"v":1054.5323358232317},{"t":1487376000,"v":1061.9505209874096},{"t":1487462400,"v":1057.2512244091406},{"t":1487548800,"v":1086.269644280841},{"t":1487635200,"v":1126.8589354029832},{"t":1487721600,"v":1129.850403173692},{"t":1487808000,"v":1176.852176320272},{"t":1487894400,"v":1185.0389520725385},{"t":1487980800,"v":1155.3930852455971},{"t":1488067200,"v":1183.806290863436},{"t":1488153600,"v":1194.828374751376},{"t":1488240000,"v":1195.8369020168036},{"t":1488326400,"v":1228.561442118559},{"t":1488412800,"v":1265.8578469159381},{"t":1488499200,"v":1291.5770036360645},{"t":1488585600,"v":1267.3528520011428},{"t":1488672000,"v":1277.5105061242275},{"t":1488758400,"v":1283.6842084600808},{"t":1488844800,"v":1236.2938477594744},{"t":1488931200,"v":1150.0236036838078},{"t":1489017600,"v":1195.1541699691657},{"t":1489104000,"v":1112.0866738418888},{"t":1489190400,"v":1185.3058442200527},{"t":1489276800,"v":1235.7711375341892},{"t":1489363200,"v":1244.5663616591323},{"t":1489449600,"v":1247.7630042828844},{"t":1489536000,"v":1262.42062405524},{"t":1489622400,"v":1176.9608841733427},{"t":1489708800,"v":1075.7232574298555},{"t":1489795200,"v":968.1089976755732},{"t":1489881600,"v":1018.30455866016},{"t":1489968000,"v":1043.6578375929496},{"t":1490054400,"v":1113.668596508832},{"t":1490140800,"v":1037.2465846063203},{"t":1490227200,"v":1027.283029473309},{"t":1490313600,"v":933.169753947826},{"t":1490400000,"v":961.3879462046255},{"t":1490486400,"v":969.017312400438},{"t":1490572800,"v":1041.3102894200542},{"t":1490659200,"v":1045.4750146764602},{"t":1490745600,"v":1040.4428183683583},{"t":1490832000,"v":1037.7534053277454},{"t":1490918400,"v":1082.7250423311148},{"t":1491004800,"v":1090.4005316487487},{"t":1491091200,"v":1099.0261334054558},{"t":1491177600,"v":1151.1597494764221},{"t":1491264000,"v":1143.029203242978},{"t":1491350400,"v":1133.0626233945623},{"t":1491436800,"v":1193.153771532398},{"t":1491523200,"v":1193.3132640711735},{"t":1491609600,"v":1183.8935053048067},{"t":1491696000,"v":1209.336901236837},{"t":1491782400,"v":1209.8499838383714},{"t":1491868800,"v":1221.5398742759503},{"t":1491955200,"v":1214.4567978728028},{"t":1492041600,"v":1174.836850815525},{"t":1492128000,"v":1172.6691908069777},{"t":1492214400,"v":1177.7152670936362},{"t":1492300800,"v":1164.9733826018726},{"t":1492387200,"v":1189.5375772549985},{"t":1492473600,"v":1201.7158482752238},{"t":1492560000,"v":1210.4839232125657},{"t":1492646400,"v":1235.6649373071261},{"t":1492732800,"v":1249.0561225723527},{"t":1492819200,"v":1241.8951760429159},{"t":1492905600,"v":1250.3472418374583},{"t":1492992000,"v":1256.5417001686506},{"t":1493078400,"v":1278.6417664638177},{"t":1493164800,"v":1294.6780496550286},{"t":1493251200,"v":1346.6851056143641},{"t":1493337600,"v":1350.4576499293476},{"t":1493424000,"v":1354.4069470017698},{"t":1493510400,"v":1383.0539029623956},{"t":1493596800,"v":1425.2481458294692},{"t":1493683200,"v":1465.5810426561522},{"t":1493769600,"v":1526.4207056110508},{"t":1493856000,"v":1554.006848920395},{"t":1493942400,"v":1526.2278035910022},{"t":1494028800,"v":1584.9514134546134},{"t":1494115200,"v":1597.2058531775517},{"t":1494201600,"v":1701.8770462876066},{"t":1494288000,"v":1719.596103326025},{"t":1494374400,"v":1791.2692326528577},{"t":1494460800,"v":1834.8367578988764},{"t":1494547200,"v":1694.4671103687208},{"t":1494633600,"v":1787.7256658652173},{"t":1494720000,"v":1796.7730922386913},{"t":1494806400,"v":1724.769487350055},{"t":1494892800,"v":1738.6013027843976},{"t":1494979200,"v":1803.9774846922924},{"t":1495065600,"v":1891.2189190792064},{"t":1495152000,"v":1966.1600061196114},{"t":1495238400,"v":2052.975727529383},{"t":1495324800,"v":2052.5502115695963},{"t":1495411200,"v":2114.3483953568734},{"t":1495497600,"v":2268.056017841441},{"t":1495584000,"v":2431.179175212533},{"t":1495670400,"v":2331.3462280804974},{"t":1495756800,"v":2272.1649053409087},{"t":1495843200,"v":2078.632375146129},{"t":1495929600,"v":2225.4645712728297},{"t":1496016000,"v":2286.2068610012675},{"t":1496102400,"v":2185.1005053471913},{"t":1496188800,"v":2298.2209745872156},{"t":1496275200,"v":2417.941273911206},{"t":1496361600,"v":2479.5616565385294},{"t":1496448000,"v":2543.8723274892395},{"t":1496534400,"v":2521.845867583053},{"t":1496620800,"v":2695.0334189788464},{"t":1496707200,"v":2873.7969374932436},{"t":1496793600,"v":2701.4140898844944},{"t":1496880000,"v":2803.297016793037},{"t":1496966400,"v":2810.2941602110886},{"t":1497052800,"v":2919.9279707867463},{"t":1497139200,"v":2991.4426584000157},{"t":1497225600,"v":2656.1781794939084},{"t":1497312000,"v":2707.2075876857843},{"t":1497398400,"v":2443.774072635811},{"t":1497484800,"v":2415.092620939786},{"t":1497571200,"v":2485.221578415977},{"t":1497657600,"v":2644.3694299811514},{"t":1497744000,"v":2512.428822086344},{"t":1497830400,"v":2595.047554549299},{"t":1497916800,"v":2734.934233111323},{"t":1498003200,"v":2653.536153083557},{"t":1498089600,"v":2693.67774038443},{"t":1498176000,"v":2687.6564249824446},{"t":1498262400,"v":2568.5925241151367},{"t":1498348800,"v":2501.1788695912824},{"t":1498435200,"v":2419.8281336489827},{"t":1498521600,"v":2565.9955752033557},{"t":1498608000,"v":2554.2217718277343},{"t":1498694400,"v":2537.407710301787},{"t":1498780800,"v":2460.92328207561},{"t":1498867200,"v":2420.539465015463},{"t":1498953600,"v":2508.7110635949434},{"t":1499040000,"v":2543.52055702578},{"t":1499126400,"v":2603.975513520515},{"t":1499212800,"v":2611.9076336687876},{"t":1499299200,"v":2601.1915674691945},{"t":1499385600,"v":2500.606800254712},{"t":1499472000,"v":2559.2909885063527},{"t":1499558400,"v":2505.719367383316},{"t":1499644800,"v":2337.692689997486},{"t":1499731200,"v":2308.5349031275077},{"t":1499817600,"v":2386.6789346825703},{"t":1499904000,"v":2338.834599532397},{"t":1499990400,"v":2218.068399573709},{"t":1500076800,"v":1970.0224148275825},{"t":1500163200,"v":1914.3158613562398},{"t":1500249600,"v":2226.8543703791893},{"t":1500336000,"v":2304.677177796126},{"t":1500422400,"v":2262.4342019699784},{"t":1500508800,"v":2836.4441013378264},{"t":1500595200,"v":2667.799092515772},{"t":1500681600,"v":2828.288843932448},{"t":1500768000,"v":2756.3507669668084},{"t":1500854400,"v":2761.003292649645},{"t":1500940800,"v":2562.1887893065186},{"t":1501027200,"v":2524.004210431266},{"t":1501113600,"v":2662.327736099671},{"t":1501200000,"v":2784.9319075270673},{"t":1501286400,"v":2699.3367794540422},{"t":1501372800,"v":2733.69805187003},{"t":1501459200,"v":2861.355117283544},{"t":1501545600,"v":2731.1154904956556},{"t":1501632000,"v":2700.952019059181},{"t":1501718400,"v":2787.864126953994},{"t":1501804800,"v":2855.544813686132},{"t":1501891200,"v":3246.889857691748},{"t":1501977600,"v":3219.1355141814147},{"t":1502064000,"v":3394.12505196622},{"t":1502150400,"v":3418.0657164880467},{"t":1502236800,"v":3341.931735918988},{"t":1502323200,"v":3432.180554601751},{"t":1502409600,"v":3651.952159554108},{"t":1502496000,"v":3873.840277659997},{"t":1502582400,"v":4055.4301082172656},{"t":1502668800,"v":4321.740878001602},{"t":1502755200,"v":4158.369049307629},{"t":1502841600,"v":4371.898571692489},{"t":1502928000,"v":4278.874565142088},{"t":1503014400,"v":4103.308186665855},{"t":1503100800,"v":4136.02849752025},{"t":1503187200,"v":4047.5907074206807},{"t":1503273600,"v":3993.496766113566},{"t":1503360000,"v":4089.192688098602},{"t":1503446400,"v":4128.20943627659},{"t":1503532800,"v":4309.743233598728},{"t":1503619200,"v":4357.504580234239},{"t":1503705600,"v":4339.185326260464},{"t":1503792000,"v":4343.614657649543},{"t":1503878400,"v":4384.648048638078},{"t":1503964800,"v":4591.973064787884},{"t":1504051200,"v":4578.258041005562},{"t":1504137600,"v":4739.821909609959},{"t":1504224000,"v":4930.913963429657},{"t":1504310400,"v":4635.549367004165},{"t":1504396800,"v":4624.004128836177},{"t":1504483200,"v":4340.747305561161},{"t":1504569600,"v":4426.660414562876},{"t":1504656000,"v":4610.80660274099},{"t":1504742400,"v":4621.992816471082},{"t":1504828800,"v":4341.4884613413},{"t":1504915200,"v":4330.583758430806},{"t":1505001600,"v":4250.088037251141},{"t":1505088000,"v":4207.513611707119},{"t":1505174400,"v":4157.663177008433},{"t":1505260800,"v":3867.7915092908415},{"t":1505347200,"v":3240.896288121997},{"t":1505433600,"v":3710.985860887212},{"t":1505520000,"v":3711.866164171358},{"t":1505606400,"v":3703.312456189187},{"t":1505692800,"v":4094.554920867202},{"t":1505779200,"v":3911.100032919042},{"t":1505865600,"v":3869.9896605976755},{"t":1505952000,"v":3617.6710605707135},{"t":1506038400,"v":3615.9131536078676},{"t":1506124800,"v":3782.0205495431524},{"t":1506211200,"v":3668.2651341463556},{"t":1506297600,"v":3918.890667419078},{"t":1506384000,"v":3886.1024756670427},{"t":1506470400,"v":4199.9683304292685},{"t":1506556800,"v":4187.576245896319},{"t":1506643200,"v":4156.659983678401},{"t":1506729600,"v":4335.467009689982},{"t":1506816000,"v":4382.812284253591},{"t":1506902400,"v":4391.750560395145},{"t":1506988800,"v":4311.3560516755},{"t":1507075200,"v":4215.182333536646},{"t":1507161600,"v":4317.528621996602},{"t":1507248000,"v":4362.980772637618},{"t":1507334400,"v":4427.349482966946},{"t":1507420800,"v":4599.584772520529},{"t":1507507200,"v":4770.758812461939},{"t":1507593600,"v":4742.204586062306},{"t":1507680000,"v":4817.076001241959},{"t":1507766400,"v":5421.25647434388},{"t":1507852800,"v":5622.401537310861},{"t":1507939200,"v":5806.274837910411},{"t":1508025600,"v":5690.443312043671},{"t":1508112000,"v":5751.401295318684},{"t":1508198400,"v":5593.760390967677},{"t":1508284800,"v":5574.307180341964},{"t":1508371200,"v":5700.819182972686},{"t":1508457600,"v":5997.446764076106},{"t":1508544000,"v":6015.723555007538},{"t":1508630400,"v":5998.832263653103},{"t":1508716800,"v":5889.672058049323},{"t":1508803200,"v":5518.766212981871},{"t":1508889600,"v":5744.7936868947845},{"t":1508976000,"v":5890.7143073772},{"t":1509062400,"v":5778.700983300991},{"t":1509148800,"v":5752.944303324972},{"t":1509235200,"v":6150.617275448098},{"t":1509321600,"v":6122.688025941843},{"t":1509408000,"v":6441.3050298221515},{"t":1509494400,"v":6764.760700771038},{"t":1509580800,"v":7032.252143929542},{"t":1509667200,"v":7188.6736621927175},{"t":1509753600,"v":7391.499520881289},{"t":1509840000,"v":7390.662345444837},{"t":1509926400,"v":6960.162148204395},{"t":1510012800,"v":7123.997698968637},{"t":1510099200,"v":7469.009869665808},{"t":1510185600,"v":7135.421301008343},{"t":1510272000,"v":6591.128675365988},{"t":1510358400,"v":6361.587331249312},{"t":1510444800,"v":5909.6447898411725},{"t":1510531200,"v":6525.636966247708},{"t":1510617600,"v":6595.548438738197},{"t":1510704000,"v":7282.068738937433},{"t":1510790400,"v":7845.321979964913},{"t":1510876800,"v":7691.5208803062105},{"t":1510963200,"v":7780.4865522991895},{"t":1511049600,"v":8033.553355586507},{"t":1511136000,"v":8255.867353185347},{"t":1511222400,"v":8096.860431860465},{"t":1511308800,"v":8244.969536672328},{"t":1511395200,"v":8035.893848871559},{"t":1511481600,"v":8215.457903088754},{"t":1511568000,"v":8771.863206570288},{"t":1511654400,"v":9349.11993048534},{"t":1511740800,"v":9754.449718834221},{"t":1511827200,"v":9926.71193188782},{"t":1511913600,"v":9863.795713366324},{"t":1512000000,"v":9953.823255504512},{"t":1512086400,"v":10862.869692666738},{"t":1512172800,"v":10923.741230126276},{"t":1512259200,"v":11285.973817230233},{"t":1512345600,"v":11625.190674511652},{"t":1512432000,"v":11703.703117553547},{"t":1512518400,"v":13919.978430502113},{"t":1512604800,"v":17144.110561770518},{"t":1512691200,"v":16241.254172496809},{"t":1512777600,"v":15065.911139302367},{"t":1512864000,"v":15049.90218056812},{"t":1512950400,"v":16779.839139930325},{"t":1513036800,"v":17220.05994923002},{"t":1513123200,"v":16525.094735035294},{"t":1513209600,"v":16607.882713268962},{"t":1513296000,"v":17644.19185482736},{"t":1513382400,"v":19587.6137328711},{"t":1513468800,"v":19179.66898447647},{"t":1513555200,"v":19007.00933176908},{"t":1513641600,"v":17737.660318944538},{"t":1513728000,"v":16456.22842405836},{"t":1513814400,"v":15651.946610393392},{"t":1513900800,"v":14140.99019347346},{"t":1513987200,"v":14800.695957569356},{"t":1514073600,"v":14170.877791779882},{"t":1514160000,"v":14073.40367072084},{"t":1514246400,"v":15761.316969772965},{"t":1514332800,"v":15382.496060505311},{"t":1514419200,"v":14456.968874713091},{"t":1514505600,"v":14487.223318256161},{"t":1514592000,"v":12743.816886264398},{"t":1514678400,"v":13896.633097402057},{"t":1514764800,"v":13436.40113496533},{"t":1514851200,"v":14732.453355796319},{"t":1514937600,"v":15068.48685294771},{"t":1515024000,"v":15150.044393442426},{"t":1515110400,"v":16929.993584218795},{"t":1515196800,"v":17094.07580827809},{"t":1515283200,"v":16162.813277912608},{"t":1515369600,"v":14998.250127031477},{"t":1515456000,"v":14415.466029217563},{"t":1515542400,"v":14850.283684647908},{"t":1515628800,"v":13310.776623875214},{"t":1515715200,"v":13797.82227939588},{"t":1515801600,"v":14218.51800899828},{"t":1515888000,"v":13655.242181049141},{"t":1515974400,"v":13574.797735438284},{"t":1516060800,"v":11467.380978284651},{"t":1516147200,"v":11136.808735058174},{"t":1516233600,"v":11289.210911409156},{"t":1516320000,"v":11511.09835473365},{"t":1516406400,"v":12763.779462390647},{"t":1516492800,"v":11455.526396495743},{"t":1516579200,"v":10781.268881360418},{"t":1516665600,"v":10801.083131750655},{"t":1516752000,"v":11354.22909940514},{"t":1516838400,"v":11137.878602459845},{"t":1516924800,"v":11091.21651042783},{"t":1517011200,"v":11333.397874991158},{"t":1517097600,"v":11597.080164861141},{"t":1517184000,"v":11149.431210526249},{"t":1517270400,"v":9937.726381160634},{"t":1517356800,"v":10087.724198669412},{"t":1517443200,"v":9014.026207241357},{"t":1517529600,"v":8799.121910617683},{"t":1517616000,"v":9208.45991916458},{"t":1517702400,"v":8176.460615758353},{"t":1517788800,"v":6891.934414416884},{"t":1517875200,"v":7714.392057232828},{"t":1517961600,"v":7575.611196702045},{"t":1518048000,"v":8222.753649455703},{"t":1518134400,"v":8677.910527452475},{"t":1518220800,"v":8537.393208068006},{"t":1518307200,"v":8073.293649217709},{"t":1518393600,"v":8883.2563239916},{"t":1518480000,"v":8519.186103813143},{"t":1518566400,"v":9483.45790621643},{"t":1518652800,"v":10063.90199802283},{"t":1518739200,"v":10236.5},{"t":1518825600,"v":11101.7},{"t":1518912000,"v":10593.2},{"t":1518998400,"v":11230},{"t":1519084800,"v":11403.7},{"t":1519171200,"v":10690.4},{"t":1519257600,"v":10005},{"t":1519344000,"v":10301.1},{"t":1519430400,"v":9813.07},{"t":1519516800,"v":9664.73},{"t":1519603200,"v":10366.7},{"t":1519689600,"v":10725.6},{"t":1519776000,"v":10397.9},{"t":1519862400,"v":10951},{"t":1519948800,"v":11086.4},{"t":1520035200,"v":11489.7},{"t":1520121600,"v":11512.6},{"t":1520208000,"v":11573.3},{"t":1520294400,"v":10779.9},{"t":1520380800,"v":9965.57},{"t":1520467200,"v":9395.01},{"t":1520553600,"v":9337.55},{"t":1520640000,"v":8866},{"t":1520726400,"v":9578.63},{"t":1520812800,"v":9205.12},{"t":1520899200,"v":9194.85},{"t":1520985600,"v":8269.81},{"t":1521072000,"v":8300.86},{"t":1521158400,"v":8338.35},{"t":1521244800,"v":7916.88},{"t":1521331200,"v":8223.68},{"t":1521417600,"v":8630.65},{"t":1521504000,"v":8913.47},{"t":1521590400,"v":8929.28},{"t":1521676800,"v":8721.57},{"t":1521763200,"v":8820.54},{"t":1521849600,"v":8682.62},{"t":1521936000,"v":8494.44},{"t":1522022400,"v":8210.22},{"t":1522108800,"v":7840.16},{"t":1522195200,"v":7980.12},{"t":1522281600,"v":7162.96},{"t":1522368000,"v":6895.3},{"t":1522454400,"v":6978.18},{"t":1522540800,"v":6844.23},{"t":1522627200,"v":7075.72},{"t":1522713600,"v":7458.04},{"t":1522800000,"v":6852.8},{"t":1522886400,"v":6811.29},{"t":1522972800,"v":6629.87},{"t":1523059200,"v":6903.16},{"t":1523145600,"v":7023.38},{"t":1523232000,"v":6763.45},{"t":1523318400,"v":6839.1},{"t":1523404800,"v":6939.18},{"t":1523491200,"v":7926.600582959641},{"t":1523577600,"v":7858.320396825395},{"t":1523664000,"v":7994.162746478875},{"t":1523750400,"v":8355.635478723412},{"t":1523836800,"v":8052.68},{"t":1523923200,"v":7906.81},{"t":1524009600,"v":8162.99},{"t":1524096000,"v":8282.55},{"t":1524182400,"v":8836.46},{"t":1524268800,"v":8883.36},{"t":1524355200,"v":8802.53},{"t":1524441600,"v":8930.91},{"t":1524528000,"v":9732.61},{"t":1524614400,"v":8826.28},{"t":1524700800,"v":9280.92},{"t":1524787200,"v":9011.78},{"t":1524873600,"v":9343.42},{"t":1524960000,"v":9415.09},{"t":1525046400,"v":9247.19},{"t":1525132800,"v":9105.53},{"t":1525219200,"v":9233.72},{"t":1525305600,"v":9755.31},{"t":1525392000,"v":9715.82},{"t":1525478400,"v":9843.13},{"t":1525564800,"v":9646.74},{"t":1525651200,"v":9369.84},{"t":1525737600,"v":9249.75},{"t":1525824000,"v":9324.28},{"t":1525910400,"v":9040.52},{"t":1525996800,"v":8462.5},{"t":1526083200,"v":8499.34},{"t":1526169600,"v":8723.64},{"t":1526256000,"v":8719.89},{"t":1526342400,"v":8515.22},{"t":1526428800,"v":8358.62},{"t":1526515200,"v":8085.7},{"t":1526601600,"v":8251.45},{"t":1526688000,"v":8241.68},{"t":1526774400,"v":8515.58},{"t":1526860800,"v":8409.37},{"t":1526947200,"v":8049.56},{"t":1527033600,"v":7566.26},{"t":1527120000,"v":7593.13},{"t":1527206400,"v":7453.44},{"t":1527292800,"v":7358.47},{"t":1527379200,"v":7364.09},{"t":1527465600,"v":7134.68},{"t":1527552000,"v":7467.58},{"t":1527638400,"v":7406.19},{"t":1527724800,"v":7491.64},{"t":1527811200,"v":7539.14},{"t":1527897600,"v":7646.74},{"t":1527984000,"v":7720.25},{"t":1528070400,"v":7499.48},{"t":1528156800,"v":7625.55},{"t":1528243200,"v":7656.09},{"t":1528329600,"v":7676.55},{"t":1528416000,"v":7631.9},{"t":1528502400,"v":7565},{"t":1528588800,"v":6784.03},{"t":1528675200,"v":6901.13},{"t":1528761600,"v":6566.2},{"t":1528848000,"v":6342.43},{"t":1528934400,"v":6681.42},{"t":1529020800,"v":6460.85},{"t":1529107200,"v":6538.65},{"t":1529193600,"v":6503.94},{"t":1529280000,"v":6733.38},{"t":1529366400,"v":6759.1},{"t":1529452800,"v":6776.84},{"t":1529539200,"v":6737.58},{"t":1529625600,"v":6083.68},{"t":1529712000,"v":6166.8},{"t":1529798400,"v":6168.79},{"t":1529884800,"v":6260.63},{"t":1529971200,"v":6096.19},{"t":1530057600,"v":6154.48},{"t":1530144000,"v":5903.44},{"t":1530230400,"v":6220.76},{"t":1530316800,"v":6396.98},{"t":1530403200,"v":6388.12},{"t":1530489600,"v":6614.92},{"t":1530576000,"v":6533.56},{"t":1530662400,"v":6609.7},{"t":1530748800,"v":6643.34},{"t":1530835200,"v":6674.68},{"t":1530921600,"v":6859.53},{"t":1531008000,"v":6762.01},{"t":1531094400,"v":6746.22},{"t":1531180800,"v":6328.33},{"t":1531267200,"v":6393.59},{"t":1531353600,"v":6228.81},{"t":1531440000,"v":6236.49},{"t":1531526400,"v":6275.18},{"t":1531612800,"v":6359.64},{"t":1531699200,"v":6742.49},{"t":1531785600,"v":7318.74},{"t":1531872000,"v":7370.78},{"t":1531958400,"v":7466.86},{"t":1532044800,"v":7354.94},{"t":1532131200,"v":7418.71},{"t":1532217600,"v":7418.49},{"t":1532304000,"v":7713.31},{"t":1532390400,"v":8424.27},{"t":1532476800,"v":8181.39},{"t":1532563200,"v":7951.58},{"t":1532649600,"v":8167.81},{"t":1532736000,"v":8188.85},{"t":1532822400,"v":8221.44},{"t":1532908800,"v":8183.56562256},{"t":1532995200,"v":7774.87303565},{"t":1533081600,"v":7624.90741594},{"t":1533168000,"v":7567.15160233},{"t":1533254400,"v":7436.26183554},{"t":1533340800,"v":7032.21316739},{"t":1533427200,"v":7064.02626634},{"t":1533513600,"v":6951.2803658},{"t":1533600000,"v":6753.71764839},{"t":1533686400,"v":6305.80304475},{"t":1533772800,"v":6568.02168724},{"t":1533859200,"v":6184.71178367},{"t":1533945600,"v":6289.74605164},{"t":1534032000,"v":6335.06058091},{"t":1534118400,"v":6297.96664043},{"t":1534204800,"v":6199.71276805},{"t":1534291200,"v":6293.27724365},{"t":1534377600,"v":6324.7423257},{"t":1534464000,"v":6580.62933687},{"t":1534550400,"v":6423.68691813},{"t":1534636800,"v":6506.06881185},{"t":1534723200,"v":6305.19259562},{"t":1534809600,"v":6496.258447},{"t":1534896000,"v":6376.83461362},{"t":1534982400,"v":6534.87662447},{"t":1535068800,"v":6717.68298629},{"t":1535155200,"v":6769.94985511},{"t":1535241600,"v":6715.64805358},{"t":1535328000,"v":6881.56612007},{"t":1535414400,"v":7096.27708292},{"t":1535500800,"v":7046.07682983},{"t":1535587200,"v":6981.57685708},{"t":1535673600,"v":7036.75531489},{"t":1535760000,"v":7193.41650052},{"t":1535846400,"v":7269.10081969},{"t":1535932800,"v":7264.79922436},{"t":1536019200,"v":7362.7119946},{"t":1536105600,"v":6818.83022958},{"t":1536192000,"v":6538.48023324},{"t":1536278400,"v":6463.22559639},{"t":1536364800,"v":6223.43011665},{"t":1536451200,"v":6303.80648503},{"t":1536537600,"v":6329.69690852},{"t":1536624000,"v":6324.59015192},{"t":1536710400,"v":6360.69694706},{"t":1536796800,"v":6521.23827161},{"t":1536883200,"v":6512.70548453},{"t":1536969600,"v":6544.13620369},{"t":1537056000,"v":6514.52997091},{"t":1537142400,"v":6281.19609296},{"t":1537228800,"v":6369.18712761},{"t":1537315200,"v":6394.89073566},{"t":1537401600,"v":6523.44829872},{"t":1537488000,"v":6734.95239431},{"t":1537574400,"v":6722.22113413},{"t":1537660800,"v":6707.26095584},{"t":1537747200,"v":6595.41332528},{"t":1537833600,"v":6444.41067269},{"t":1537920000,"v":6498.32602721},{"t":1538006400,"v":6680.71461176},{"t":1538092800,"v":6642.0772968},{"t":1538179200,"v":6601.9553879},{"t":1538265600,"v":6627.99449465},{"t":1538352000,"v":6587.61149413},{"t":1538438400,"v":6556.09866089},{"t":1538524800,"v":6502.59044747},{"t":1538611200,"v":6576.20339269},{"t":1538697600,"v":6622.48483682},{"t":1538784000,"v":6589.05284411},{"t":1538870400,"v":6602.94525849},{"t":1538956800,"v":6652.22623715},{"t":1539043200,"v":6640.64745929},{"t":1539129600,"v":6585.17755768},{"t":1539216000,"v":6249.09003203},{"t":1539302400,"v":6273.19669603},{"t":1539388800,"v":6289.0009018},{"t":1539475200,"v":6292.23246896},{"t":1539561600,"v":6605.26103468},{"t":1539648000,"v":6600.67720695},{"t":1539734400,"v":6546.16332001},{"t":1539820800,"v":6474.64724903},{"t":1539907200,"v":6466.010535},{"t":1539993600,"v":6489.46975308},{"t":1540080000,"v":6482.34812955},{"t":1540166400,"v":6491.98212347},{"t":1540252800,"v":6475.72971532},{"t":1540339200,"v":6495.42836241},{"t":1540425600,"v":6481.17082835},{"t":1540512000,"v":6477.84565348},{"t":1540598400,"v":6480.28670898},{"t":1540684800,"v":6486.38627137},{"t":1540771200,"v":6332.78870464},{"t":1540857600,"v":6334.7409058},{"t":1540944000,"v":6317.75009974},{"t":1541030400,"v":6375.52621667},{"t":1541116800,"v":6390.638615},{"t":1541203200,"v":6361.25774213},{"t":1541289600,"v":6376.12939278},{"t":1541376000,"v":6427.46426537},{"t":1541462400,"v":6455.27908945},{"t":1541548800,"v":6520.93366356},{"t":1541635200,"v":6457.20299168},{"t":1541721600,"v":6387.24987785},{"t":1541808000,"v":6407.74044747},{"t":1541894400,"v":6408.83301083},{"t":1541980800,"v":6373.10496784},{"t":1542067200,"v":6357.23195512},{"t":1542153600,"v":5722.33950975},{"t":1542240000,"v":5645.59292107},{"t":1542326400,"v":5574.75499615},{"t":1542412800,"v":5554.80989136},{"t":1542499200,"v":5622.02160278},{"t":1542585600,"v":4875.14239003},{"t":1542672000,"v":4415.07400339},{"t":1542758400,"v":4602.16771504},{"t":1542844800,"v":4368.73234691},{"t":1542931200,"v":4346.01843265},{"t":1543017600,"v":3883.35938868},{"t":1543104000,"v":4015.13130391},{"t":1543190400,"v":3775.08662841},{"t":1543276800,"v":3813.57141959},{"t":1543363200,"v":4260.82825547},{"t":1543449600,"v":4274.74204089},{"t":1543536000,"v":4016.44911794},{"t":1543622400,"v":4215.68477834},{"t":1543708800,"v":4138.38283552},{"t":1543795200,"v":3892.75933911},{"t":1543881600,"v":3996.74820738},{"t":1543968000,"v":3753.99482663},{"t":1544054400,"v":3521.10172384},{"t":1544140800,"v":3419.93720035},{"t":1544227200,"v":3476.11471452},{"t":1544313600,"v":3616.21025798},{"t":1544400000,"v":3505.47968254},{"t":1544486400,"v":3423.51948812},{"t":1544572800,"v":3481.23667359},{"t":1544659200,"v":3312.00352486},{"t":1544745600,"v":3242.19413359},{"t":1544832000,"v":3237.05708474},{"t":1544918400,"v":3255.22013802},{"t":1545004800,"v":3545.35139009},{"t":1545091200,"v":3695.4306338},{"t":1545177600,"v":3747.42985778},{"t":1545264000,"v":4132.2252904},{"t":1545350400,"v":3894.39321098},{"t":1545436800,"v":4012.16458122},{"t":1545523200,"v":3998.52858546},{"t":1545609600,"v":4080.47896096},{"t":1545696000,"v":3815.49060966},{"t":1545782400,"v":3855.93115879},{"t":1545868800,"v":3659.30990152},{"t":1545955200,"v":3926.3291364},{"t":1546041600,"v":3827.77729964},{"t":1546128000,"v":3867.27236149},{"t":1546214400,"v":3741.29679518},{"t":1546300800,"v":3840.95924899},{"t":1546387200,"v":3943.28984335},{"t":1546473600,"v":3836.55804793},{"t":1546560000,"v":3858.23828002},{"t":1546646400,"v":3841.06117029},{"t":1546732800,"v":4076.20331956},{"t":1546819200,"v":4024.46206645},{"t":1546905600,"v":4033.55475363},{"t":1546992000,"v":4035.71294082},{"t":1547078400,"v":3679.79347408},{"t":1547164800,"v":3686.21992857},{"t":1547251200,"v":3660.89928219},{"t":1547337600,"v":3552.00916983},{"t":1547424000,"v":3706.05222041},{"t":1547510400,"v":3629.3994895},{"t":1547596800,"v":3656.46477524},{"t":1547683200,"v":3679.8126213},{"t":1547769600,"v":3653.6664613},{"t":1547856000,"v":3729.0822985},{"t":1547942400,"v":3602.94669388},{"t":1548028800,"v":3577.02585978},{"t":1548115200,"v":3605.04565371},{"t":1548201600,"v":3585.12306636},{"t":1548288000,"v":3605.01000288},{"t":1548374400,"v":3602.06803677},{"t":1548460800,"v":3601.75215591},{"t":1548547200,"v":3586.69221638},{"t":1548633600,"v":3472.33980503},{"t":1548720000,"v":3447.03376969},{"t":1548806400,"v":3485.3190571},{"t":1548892800,"v":3457.19185903},{"t":1548979200,"v":3488.65467674},{"t":1549065600,"v":3526.76852089},{"t":1549152000,"v":3461.49672071},{"t":1549238400,"v":3456.78537352},{"t":1549324800,"v":3460.72479577},{"t":1549411200,"v":3412.83264537},{"t":1549497600,"v":3400.6012536},{"t":1549584000,"v":3661.6593387},{"t":1549670400,"v":3671.81055872},{"t":1549756800,"v":3684.24956988},{"t":1549843200,"v":3648.09335231},{"t":1549929600,"v":3653.99110555},{"t":1550016000,"v":3631.34329385},{"t":1550102400,"v":3616.36968624},{"t":1550188800,"v":3623.22451873},{"t":1550275200,"v":3631.0060736},{"t":1550361600,"v":3677.11835448},{"t":1550448000,"v":3915.15393},{"t":1550534400,"v":3946.15354458},{"t":1550620800,"v":3996.90234514},{"t":1550707200,"v":3952.2103642},{"t":1550793600,"v":4002.2913313},{"t":1550880000,"v":4145.9880905},{"t":1550966400,"v":3814.93757504},{"t":1551052800,"v":3884.93555836},{"t":1551139200,"v":3857.56107734},{"t":1551225600,"v":3851.0235527},{"t":1551312000,"v":3855.67378101},{"t":1551398400,"v":3861.87069318},{"t":1551484800,"v":3867.57418178},{"t":1551571200,"v":3845.59431118},{"t":1551657600,"v":3761.00685915},{"t":1551744000,"v":3894.06747372},{"t":1551830400,"v":3905.40722269},{"t":1551916800,"v":3911.06208338},{"t":1552003200,"v":3898.25616475},{"t":1552089600,"v":3960.96525724},{"t":1552176000,"v":3953.83492806},{"t":1552262400,"v":3906.12986299},{"t":1552348800,"v":3911.29620526},{"t":1552435200,"v":3906.54189115},{"t":1552521600,"v":3913.51736755},{"t":1552608000,"v":3958.66898443},{"t":1552694400,"v":4048.90849948},{"t":1552780800,"v":4028.84888287},{"t":1552867200,"v":4034.67408291},{"t":1552953600,"v":4070.48878613},{"t":1553040000,"v":4086.37824344},{"t":1553126400,"v":4031.48944687},{"t":1553212800,"v":4023.91043451},{"t":1553299200,"v":4036.5766927},{"t":1553385600,"v":4018.86969869},{"t":1553472000,"v":3963.78397879},{"t":1553558400,"v":3985.08080287},{"t":1553644800,"v":4086.67786266},{"t":1553731200,"v":4069.10714977},{"t":1553817600,"v":4098.37454059},{"t":1553904000,"v":4096.91963725},{"t":1553990400,"v":4104.234233128829},{"t":1554076800,"v":4157.46569937},{"t":1554163200,"v":4886.74969679},{"t":1554249600,"v":4971.30774104},{"t":1554336000,"v":4922.79878778},{"t":1554422400,"v":5036.79302365},{"t":1554508800,"v":5062.79376134},{"t":1554595200,"v":5198.89699014},{"t":1554681600,"v":5289.91798137},{"t":1554768000,"v":5204.95837847},{"t":1554854400,"v":5325.08155529},{"t":1554940800,"v":5064.48767243},{"t":1555027200,"v":5088.84997329},{"t":1555113600,"v":5096.58656276},{"t":1555200000,"v":5167.32198286},{"t":1555286400,"v":5066.18715458},{"t":1555372800,"v":5237.59520905},{"t":1555459200,"v":5251.66380021},{"t":1555545600,"v":5299.16459453},{"t":1555632000,"v":5305.45513705},{"t":1555718400,"v":5337.37851834},{"t":1555804800,"v":5314.5314532},{"t":1555891200,"v":5399.71139699},{"t":1555977600,"v":5571.97722679},{"t":1556064000,"v":5464.86664182},{"t":1556150400,"v":5210.59362141},{"t":1556236800,"v":5280.61484521},{"t":1556323200,"v":5266.45814395},{"t":1556409600,"v":5285.13900822},{"t":1556496000,"v":5248.20427091},{"t":1556582400,"v":5350.03250117},{"t":1556668800,"v":5401.02963619},{"t":1556755200,"v":5505.28367176},{"t":1556841600,"v":5768.28940693},{"t":1556928000,"v":5829.93903031},{"t":1557014400,"v":5790.99875859},{"t":1557100800,"v":5750.26065528},{"t":1557187200,"v":5843.49506628},{"t":1557273600,"v":5983.76061268},{"t":1557360000,"v":6174.13234808},{"t":1557446400,"v":6379.29211794},{"t":1557532800,"v":7212.29317912},{"t":1557619200,"v":6972.37152291},{"t":1557705600,"v":7807.13438133},{"t":1557792000,"v":7994.41615632},{"t":1557878400,"v":8205.16749484},{"t":1557964800,"v":7883.39290525},{"t":1558051200,"v":7332.33362812},{"t":1558137600,"v":7272.8703646},{"t":1558224000,"v":8197.08154991},{"t":1558310400,"v":7977.28172834},{"t":1558396800,"v":7964.08716828},{"t":1558483200,"v":7684.84214611},{"t":1558569600,"v":7881.84672105},{"t":1558656000,"v":7987.37156583},{"t":1558742400,"v":8052.54385907},{"t":1558828800,"v":8674.07240318},{"t":1558915200,"v":8802.75819975},{"t":1559001600,"v":8719.9617362},{"t":1559088000,"v":8658.62021569},{"t":1559174400,"v":8313.21305379},{"t":1559260800,"v":8584.03749936},{"t":1559347200,"v":8567.49579932},{"t":1559433600,"v":8744.99858488},{"t":1559520000,"v":8214.54501611},{"t":1559606400,"v":7694.79046347},{"t":1559692800,"v":7820.49742937},{"t":1559779200,"v":7823.96826187},{"t":1559865600,"v":8042.62455272},{"t":1559952000,"v":7941.75919036},{"t":1560038400,"v":7686.70517038},{"t":1560124800,"v":7994.91667422},{"t":1560211200,"v":7923.19557195},{"t":1560297600,"v":8139.61233897},{"t":1560384000,"v":8226.39499438},{"t":1560470400,"v":8690.3978563},{"t":1560556800,"v":8839.69426128},{"t":1560643200,"v":8993.51985508},{"t":1560729600,"v":9323.18877291},{"t":1560816000,"v":9070.351716},{"t":1560902400,"v":9276.77182364},{"t":1560988800,"v":9527.85336616},{"t":1561075200,"v":10118.5985274},{"t":1561161600,"v":10694.29348},{"t":1561248000,"v":10842.5148341},{"t":1561334400,"v":11006.9875879},{"t":1561420800,"v":11784.6041669},{"t":1561507200,"v":13003.3251831},{"t":1561593600,"v":11151.3707985},{"t":1561680000,"v":12392.3293102},{"t":1561766400,"v":11958.9651413},{"t":1561852800,"v":10817.5692473},{"t":1561939200,"v":10590.7580719},{"t":1562025600,"v":10810.4966905},{"t":1562112000,"v":11953.3879742},{"t":1562198400,"v":11212.6101976},{"t":1562284800,"v":10984.1057812},{"t":1562371200,"v":11209.2110757},{"t":1562457600,"v":11451.3503881},{"t":1562544000,"v":12285.7323738},{"t":1562630400,"v":12560.6272457},{"t":1562716800,"v":12152.5890505},{"t":1562803200,"v":11345.7367321},{"t":1562889600,"v":11816.4282932},{"t":1562976000,"v":11373.0446962},{"t":1563062400,"v":10258.343575},{"t":1563148800,"v":10902.4940933},{"t":1563235200,"v":9493.31755974},{"t":1563321600,"v":9694.45068639},{"t":1563408000,"v":10663.3319664},{"t":1563494400,"v":10533.9668428},{"t":1563580800,"v":10770.4048064},{"t":1563667200,"v":10598.6005555},{"t":1563753600,"v":10339.5348432},{"t":1563840000,"v":9900.10969969},{"t":1563926400,"v":9821.99302633},{"t":1564012800,"v":9912.80914244},{"t":1564099200,"v":9872.51472048},{"t":1564185600,"v":9457.60326361},{"t":1564272000,"v":9555.36758424},{"t":1564358400,"v":9521.49191299},{"t":1564444800,"v":9604.74200395},{"t":1564531200,"v":10085.6277491},{"t":1564617600,"v":10399.6694229},{"t":1564704000,"v":10518.1746772},{"t":1564790400,"v":10821.7265103},{"t":1564876800,"v":10970.1842157},{"t":1564963200,"v":11805.6537253},{"t":1565049600,"v":11478.1693461},{"t":1565136000,"v":11941.9683406},{"t":1565222400,"v":11966.407405},{"t":1565308800,"v":11862.93676},{"t":1565395200,"v":11354.0242177},{"t":1565481600,"v":11523.5793784},{"t":1565568000,"v":11382.6159562},{"t":1565654400,"v":10895.8304358},{"t":1565740800,"v":10038.4217089},{"t":1565827200,"v":10311.545429},{"t":1565913600,"v":10374.3393471},{"t":1566000000,"v":10231.7438454},{"t":1566086400,"v":10345.8103795},{"t":1566172800,"v":10916.0538702},{"t":1566259200,"v":10763.2326304},{"t":1566345600,"v":10138.049355},{"t":1566432000,"v":10131.0561021},{"t":1566518400,"v":10407.965329},{"t":1566604800,"v":10159.9605385},{"t":1566691200,"v":10138.517665},{"t":1566777600,"v":10372.8263035},{"t":1566864000,"v":10185.4998997},{"t":1566950400,"v":9756.78570735},{"t":1567036800,"v":9510.20054413},{"t":1567123200,"v":9598.17364826},{"t":1567209600,"v":9630.59319616},{"t":1567296000,"v":9757.97031807},{"t":1567382400,"v":10346.7607927},{"t":1567468800,"v":10623.5401172},{"t":1567555200,"v":10594.4933536},{"t":1567641600,"v":10575.533284},{"t":1567728000,"v":10353.3025592},{"t":1567814400,"v":10517.254784},{"t":1567900800,"v":10441.275979},{"t":1567987200,"v":10334.9741628},{"t":1568073600,"v":10115.9757913},{"t":1568160000,"v":10178.3718893},{"t":1568246400,"v":10410.1268031},{"t":1568332800,"v":10360.5472773},{"t":1568419200,"v":10358.0491621},{"t":1568505600,"v":10347.7129074},{"t":1568592000,"v":10276.7935649},{"t":1568678400,"v":10241.2721545},{"t":1568764800,"v":10198.2484072},{"t":1568851200,"v":10266.4149694},{"t":1568937600,"v":10181.6413094},{"t":1569024000,"v":10019.7169101},{"t":1569110400,"v":10070.3921064},{"t":1569196800,"v":9729.32376435},{"t":1569283200,"v":8620.56642733},{"t":1569369600,"v":8486.99297206},{"t":1569456000,"v":8118.96756783},{"t":1569542400,"v":8251.84555744},{"t":1569628800,"v":8245.91515478},{"t":1569715200,"v":8104.18567564},{"t":1569801600,"v":8293.86774062},{"t":1569888000,"v":8343.2766814},{"t":1569974400,"v":8393.04164486},{"t":1570060800,"v":8259.99197863},{"t":1570147200,"v":8205.93924121},{"t":1570233600,"v":8151.50052921},{"t":1570320000,"v":7988.15595888},{"t":1570406400,"v":8245.622933},{"t":1570492800,"v":8228.7831528},{"t":1570579200,"v":8595.73981722},{"t":1570665600,"v":8583.1788414},{"t":1570752000,"v":8321.11873109},{"t":1570838400,"v":8342.69554698},{"t":1570924800,"v":8323.08261224},{"t":1571011200,"v":8371.9891356},{"t":1571097600,"v":8208.03348086},{"t":1571184000,"v":8057.29564754},{"t":1571270400,"v":8102.95289694},{"t":1571356800,"v":7977.41883564},{"t":1571443200,"v":7990.31255402},{"t":1571529600,"v":8218.07286805},{"t":1571616000,"v":8236.27737182},{"t":1571702400,"v":8080.61566695},{"t":1571788800,"v":7506.16004227},{"t":1571875200,"v":7497.31006854},{"t":1571961600,"v":8656.17219802},{"t":1572048000,"v":9248.60509745},{"t":1572134400,"v":9559.52904735},{"t":1572220800,"v":9266.54148344},{"t":1572307200,"v":9429.56422378},{"t":1572393600,"v":9209.14008588},{"t":1572480000,"v":9190.15935841},{"t":1572566400,"v":9260.4172551},{"t":1572652800,"v":9324.92966758},{"t":1572739200,"v":9235.20529549},{"t":1572825600,"v":9414.27063268},{"t":1572912000,"v":9348.12927384},{"t":1572998400,"v":9357.01438149},{"t":1573084800,"v":9267.47944726},{"t":1573171200,"v":8816.95087372},{"t":1573257600,"v":8814.88268835},{"t":1573344000,"v":9058.22603921},{"t":1573430400,"v":8756.31731395},{"t":1573516800,"v":8812.71866317},{"t":1573603200,"v":8817.26151868},{"t":1573689600,"v":8710.28507816},{"t":1573776000,"v":8491.55733354},{"t":1573862400,"v":8546.7319707},{"t":1573948800,"v":8572.18503827},{"t":1574035200,"v":8311.81088865},{"t":1574121600,"v":8203.93739828},{"t":1574208000,"v":8027.77939437},{"t":1574294400,"v":7640.63676782},{"t":1574380800,"v":7304.96236288},{"t":1574467200,"v":7384.69785526},{"t":1574553600,"v":7046.14174647},{"t":1574640000,"v":7150.12871408},{"t":1574726400,"v":7223.03582563},{"t":1574812800,"v":7539.34651048},{"t":1574899200,"v":7465.22589107},{"t":1574985600,"v":7762.17959453},{"t":1575072000,"v":7567.97497695},{"t":1575158400,"v":7425.85766438},{"t":1575244800,"v":7325.33487256},{"t":1575331200,"v":7323.81210021},{"t":1575417600,"v":7260.10003443},{"t":1575504000,"v":7447.6673282},{"t":1575590400,"v":7544.37903416},{"t":1575676800,"v":7552.29963464},{"t":1575763200,"v":7566.18173083},{"t":1575849600,"v":7401.01158117},{"t":1575936000,"v":7274.46261839},{"t":1576022400,"v":7218.25648469},{"t":1576108800,"v":7244.48940003},{"t":1576195200,"v":7267.35915452},{"t":1576281600,"v":7130.35799572},{"t":1576368000,"v":7157.82998088},{"t":1576454400,"v":6930.50585768},{"t":1576540800,"v":6611.51046846},{"t":1576627200,"v":7270.46966975},{"t":1576713600,"v":7204.0210376},{"t":1576800000,"v":7217.26972298},{"t":1576886400,"v":7189.90636821},{"t":1576972800,"v":7512.80063541},{"t":1577059200,"v":7355.16830714},{"t":1577145600,"v":7309.21393158},{"t":1577232000,"v":7280.45240018},{"t":1577318400,"v":7240.0270056},{"t":1577404800,"v":7295.60723294},{"t":1577491200,"v":7319.89084853},{"t":1577577600,"v":7419.17941527},{"t":1577664000,"v":7300.67426507},{"t":1577750400,"v":7197.52710917},{"t":1577836800,"v":7199.66110087},{"t":1577923200,"v":6985.65902257},{"t":1578009600,"v":7347.59737791},{"t":1578096000,"v":7415.20244546},{"t":1578182400,"v":7410.81254092},{"t":1578268800,"v":7770.52843473},{"t":1578355200,"v":8166.96310003},{"t":1578441600,"v":8082.95054727},{"t":1578528000,"v":7880.28824913},{"t":1578614400,"v":8164.65571526},{"t":1578700800,"v":8029.64210795},{"t":1578787200,"v":8185.64036985},{"t":1578873600,"v":8148.31886082},{"t":1578960000,"v":8827.76442606},{"t":1579046400,"v":8807.01027532},{"t":1579132800,"v":8723.78576573},{"t":1579219200,"v":8929.0376776},{"t":1579305600,"v":8942.80890321},{"t":1579392000,"v":8706.24512993},{"t":1579478400,"v":8657.64293942},{"t":1579564800,"v":8745.89478833},{"t":1579651200,"v":8680.87604222},{"t":1579737600,"v":8406.5160678},{"t":1579824000,"v":8445.43428152},{"t":1579910400,"v":8367.84777344},{"t":1579996800,"v":8596.82983316},{"t":1580083200,"v":8909.81917753},{"t":1580169600,"v":9358.59031703},{"t":1580256000,"v":9316.62950445},{"t":1580342400,"v":9508.9935947},{"t":1580428800,"v":9350.52936518},{"t":1580515200,"v":9392.87536841},{"t":1580601600,"v":9344.36529292},{"t":1580688000,"v":9293.52108908},{"t":1580774400,"v":9180.9629665},{"t":1580860800,"v":9613.42428895},{"t":1580947200,"v":9729.80223149},{"t":1581033600,"v":9790.33384641},{"t":1581120000,"v":9866.50724373},{"t":1581206400,"v":10119.1248203},{"t":1581292800,"v":9865.59260896},{"t":1581379200,"v":10205.1323621},{"t":1581465600,"v":10322.7164894},{"t":1581552000,"v":10205.6192109},{"t":1581638400,"v":10300.0506266},{"t":1581724800,"v":9891.83650918},{"t":1581811200,"v":9943.25998095},{"t":1581897600,"v":9686.04920977},{"t":1581984000,"v":10147.0726363},{"t":1582070400,"v":9635.05008713},{"t":1582156800,"v":9618.25906453},{"t":1582243200,"v":9690.95528682},{"t":1582329600,"v":9660.91488832},{"t":1582416000,"v":9920.86796684},{"t":1582502400,"v":9645.39833042},{"t":1582588800,"v":9346.53346695},{"t":1582675200,"v":8824.33122732},{"t":1582761600,"v":8786.87893969},{"t":1582848000,"v":8689.11524591},{"t":1582934400,"v":8615.22772355},{"t":1583020800,"v":8563.41168611},{"t":1583107200,"v":8865.83955705},{"t":1583193600,"v":8792.35171065},{"t":1583280000,"v":8742.61166128},{"t":1583366400,"v":9077.87946386},{"t":1583452800,"v":9120.74845437},{"t":1583539200,"v":8909.75828069},{"t":1583625600,"v":8110.25607808},{"t":1583712000,"v":7916.62214092},{"t":1583798400,"v":7915.61754792},{"t":1583884800,"v":7912.81530473},{"t":1583971200,"v":4860.35383012},{"t":1584057600,"v":5547.0651614},{"t":1584144000,"v":5195.85517452},{"t":1584230400,"v":5391.06024919},{"t":1584316800,"v":5014.86830377},{"t":1584403200,"v":5237.76209482},{"t":1584489600,"v":5237.91386092},{"t":1584576000,"v":6193.29577035},{"t":1584662400,"v":6186.21871982},{"t":1584748800,"v":6172.9672775},{"t":1584835200,"v":5833.51061024},{"t":1584921600,"v":6431.81003808},{"t":1585008000,"v":6732.65221467},{"t":1585094400,"v":6677.07432527},{"t":1585180800,"v":6718.96731486},{"t":1585267200,"v":6470.89335934},{"t":1585353600,"v":6241.56512496},{"t":1585440000,"v":5929.677884},{"t":1585526400,"v":6447.72579951},{"t":1585612800,"v":6443.31405026},{"t":1585699200,"v":6589.24919192},{"t":1585785600,"v":6795.04299179},{"t":1585872000,"v":6736.36381431},{"t":1585958400,"v":6858.69700969},{"t":1586044800,"v":6794.47452422},{"t":1586131200,"v":7248.72410192},{"t":1586217600,"v":7172.87828873},{"t":1586304000,"v":7335.36979909},{"t":1586390400,"v":7301.01277516},{"t":1586476800,"v":6862.78799691},{"t":1586563200,"v":6852.50192071},{"t":1586649600,"v":6998.39400574},{"t":1586736000,"v":6845.09526906},{"t":1586822400,"v":6841.27304616},{"t":1586908800,"v":6643.97961617},{"t":1586995200,"v":7106.09484684},{"t":1587081600,"v":7098.68627482},{"t":1587168000,"v":7259.90292944},{"t":1587254400,"v":7191.11311495},{"t":1587340800,"v":6882.34018581},{"t":1587427200,"v":6878.03773926},{"t":1587513600,"v":7118.68335661},{"t":1587600000,"v":7430.16504043},{"t":1587686400,"v":7549.13338764},{"t":1587772800,"v":7569.23791751},{"t":1587859200,"v":7680.48287014},{"t":1587945600,"v":7794.71391216},{"t":1588032000,"v":7807.29683833},{"t":1588118400,"v":8801.03776688},{"t":1588204800,"v":8657.1939924},{"t":1588291200,"v":8855.32022959},{"t":1588377600,"v":8985.17081572},{"t":1588464000,"v":8898.12241256},{"t":1588550400,"v":8915.36266471},{"t":1588636800,"v":8987.61019034},{"t":1588723200,"v":9253.07620782},{"t":1588809600,"v":9982.3230001},{"t":1588896000,"v":9854.15920563},{"t":1588982400,"v":9590.06333149},{"t":1589068800,"v":8761.29974684},{"t":1589155200,"v":8599.78194656},{"t":1589241600,"v":8800.72972155},{"t":1589328000,"v":9274.85620315},{"t":1589414400,"v":9742.73285277},{"t":1589500800,"v":9324.74955892},{"t":1589587200,"v":9378.12485501},{"t":1589673600,"v":9670.02672308},{"t":1589760000,"v":9729.46527585},{"t":1589846400,"v":9723.31137903},{"t":1589932800,"v":9522.46761378},{"t":1590019200,"v":9083.12738671},{"t":1590105600,"v":9182.63979906},{"t":1590192000,"v":9212.38362171},{"t":1590278400,"v":8792.95744169},{"t":1590364800,"v":8910.14065013},{"t":1590451200,"v":8830.00836771},{"t":1590537600,"v":9178.8408253},{"t":1590624000,"v":9521.7710264},{"t":1590710400,"v":9440.88143521},{"t":1590796800,"v":9696.80790406},{"t":1590883200,"v":9452.45408509},{"t":1590969600,"v":10170.4099128},{"t":1591056000,"v":9532.18934947},{"t":1591142400,"v":9646.2557319},{"t":1591228800,"v":9803.70548499},{"t":1591315200,"v":9667.02313814},{"t":1591401600,"v":9650.37975164},{"t":1591488000,"v":9759.69521099},{"t":1591574400,"v":9770.65850938},{"t":1591660800,"v":9795.64961547},{"t":1591747200,"v":9870.78990303},{"t":1591833600,"v":9324.47584156},{"t":1591920000,"v":9481.74838924},{"t":1592006400,"v":9474.74192302},{"t":1592092800,"v":9386.78789214},{"t":1592179200,"v":9454.15015829},{"t":1592265600,"v":9540.67651404},{"t":1592352000,"v":9483.15268772},{"t":1592438400,"v":9412.43597382},{"t":1592524800,"v":9277.04516149},{"t":1592611200,"v":9335.17939289},{"t":1592697600,"v":9301.37004446},{"t":1592784000,"v":9649.2555242},{"t":1592870400,"v":9628.69403752},{"t":1592956800,"v":9308.97002161},{"t":1593043200,"v":9265.12255402},{"t":1593129600,"v":9165.46400925},{"t":1593216000,"v":9050.08021288},{"t":1593302400,"v":9155.73195906},{"t":1593388800,"v":9200.43803941},{"t":1593475200,"v":9138.25078146},{"t":1593561600,"v":9228.16289438},{"t":1593648000,"v":9123.41015432},{"t":1593734400,"v":9087.30391103},{"t":1593820800,"v":9116.09384322},{"t":1593907200,"v":9075.62293143},{"t":1593993600,"v":9294.80678854},{"t":1594080000,"v":9254.80043974},{"t":1594166400,"v":9425.36948916},{"t":1594252800,"v":9294.76603547},{"t":1594339200,"v":9278.8078672},{"t":1594425600,"v":9240.34632654},{"t":1594512000,"v":9276.49985018},{"t":1594598400,"v":9243.61385509},{"t":1594684800,"v":9243.21341642},{"t":1594771200,"v":9192.83736784},{"t":1594857600,"v":9137.21825621},{"t":1594944000,"v":9149.9429538},{"t":1595030400,"v":9158.56462749},{"t":1595116800,"v":9185.45240342},{"t":1595203200,"v":9177.86448262},{"t":1595289600,"v":9374.78345925},{"t":1595376000,"v":9525.36344997},{"t":1595462400,"v":9579.97977007},{"t":1595548800,"v":9537.79707625},{"t":1595635200,"v":9677.11349729},{"t":1595721600,"v":9906.34519401},{"t":1595808000,"v":11023.434646},{"t":1595894400,"v":10909.9046958},{"t":1595980800,"v":11098.4100908},{"t":1596067200,"v":11121.1587554},{"t":1596153600,"v":11332.4012834},{"t":1596240000,"v":11766.9595624},{"t":1596326400,"v":11059.3145305},{"t":1596412800,"v":11245.5240356},{"t":1596499200,"v":11207.6483786},{"t":1596585600,"v":11751.6655847},{"t":1596672000,"v":11785.14051},{"t":1596758400,"v":11595.3530615},{"t":1596844800,"v":11745.8403294},{"t":1596931200,"v":11672.4786076},{"t":1597017600,"v":11872.1227256},{"t":1597104000,"v":11412.1825511},{"t":1597190400,"v":11576.8771692},{"t":1597276800,"v":11796.3961941},{"t":1597363200,"v":11772.9732991},{"t":1597449600,"v":11864.5063121},{"t":1597536000,"v":11895.1527133},{"t":1597622400,"v":12250.136396},{"t":1597708800,"v":11988.7456259},{"t":1597795200,"v":11758.8645702},{"t":1597881600,"v":11881.7212215},{"t":1597968000,"v":11581.8887181},{"t":1598054400,"v":11689.4073895},{"t":1598140800,"v":11667.8605615},{"t":1598227200,"v":11778.4188516},{"t":1598313600,"v":11375.0539617},{"t":1598400000,"v":11487.5574841},{"t":1598486400,"v":11322.8535935},{"t":1598572800,"v":11539.83493},{"t":1598659200,"v":11512.5428548},{"t":1598745600,"v":11711.5398306},{"t":1598832000,"v":11685.3448054},{"t":1598918400,"v":11968.9674207},{"t":1599004800,"v":11418.0179849},{"t":1599091200,"v":10238.457762},{"t":1599177600,"v":10511.8138807},{"t":1599264000,"v":10169.567221},{"t":1599350400,"v":10280.3517032},{"t":1599436800,"v":10369.5637386},{"t":1599523200,"v":10131.5166457},{"t":1599609600,"v":10242.3477803},{"t":1599696000,"v":10363.1390401},{"t":1599782400,"v":10400.9146854},{"t":1599868800,"v":10442.1706031},{"t":1599955200,"v":10323.7557975},{"t":1600041600,"v":10680.8374328},{"t":1600128000,"v":10796.9509861},{"t":1600214400,"v":10974.9048915},{"t":1600300800,"v":10948.9899152},{"t":1600387200,"v":10944.5858045},{"t":1600473600,"v":11094.3462761},{"t":1600560000,"v":10938.2712894},{"t":1600646400,"v":10462.2596185},{"t":1600732800,"v":10538.4603213},{"t":1600819200,"v":10225.8639271},{"t":1600905600,"v":10745.5486217},{"t":1600992000,"v":10702.290491},{"t":1601078400,"v":10754.4375117},{"t":1601164800,"v":10774.4267558},{"t":1601251200,"v":10721.3270409},{"t":1601337600,"v":10848.8304873},{"t":1601424000,"v":10787.6178668},{"t":1601510400,"v":10623.3301247},{"t":1601596800,"v":10575.972665210369},{"t":1601683200,"v":10549.328899609458},{"t":1601769600,"v":10668.427291917362},{"t":1601856000,"v":10793.339427509689},{"t":1601942400,"v":10604.372976655219},{"t":1602028800,"v":10669.002892309303},{"t":1602115200,"v":10915.611170349574},{"t":1602201600,"v":11064.457592443927},{"t":1602288000,"v":11296.361428209482},{"t":1602374400,"v":11384.210120673994},{"t":1602460800,"v":11555.352382617039},{"t":1602547200,"v":11425.899400698005},{"t":1602633600,"v":11429.530525949574},{"t":1602720000,"v":11495.136250345737},{"t":1602806400,"v":11322.122100253333},{"t":1602892800,"v":11357.507699419104},{"t":1602979200,"v":11483.347447046355},{"t":1603065600,"v":11742.056464068413},{"t":1603152000,"v":11916.334474515823},{"t":1603238400,"v":12823.721613011157},{"t":1603324800,"v":12965.938910967061},{"t":1603411200,"v":12928.422292893309},{"t":1603497600,"v":13112.518308892806},{"t":1603584000,"v":13025.152726171285},{"t":1603670400,"v":13072.25343050888},{"t":1603756800,"v":13638.61347118853},{"t":1603843200,"v":13274.101551486901},{"t":1603929600,"v":13449.310773172034},{"t":1604016000,"v":13567.751090472695},{"t":1604102400,"v":13779.026945510965},{"t":1604188800,"v":13712.179226753678},{"t":1604275200,"v":13558.759567504292},{"t":1604361600,"v":13914.806921199463},{"t":1604448000,"v":14127.434501432557},{"t":1604534400,"v":15556.660674219534},{"t":1604620800,"v":15552.789426236757},{"t":1604707200,"v":14849.092332069495},{"t":1604793600,"v":15486.128766242586},{"t":1604880000,"v":15336.738597655203},{"t":1604966400,"v":15289.794466324061},{"t":1605052800,"v":15693.906873452925},{"t":1605139200,"v":16281.414511965559},{"t":1605225600,"v":16311.513322639245},{"t":1605312000,"v":16075.452733873577},{"t":1605398400,"v":15962.09895156044},{"t":1605484800,"v":16709.612283879444},{"t":1605571200,"v":17667.381593434377},{"t":1605657600,"v":17812.23323674995},{"t":1605744000,"v":17797.55269185706},{"t":1605830400,"v":18624.912737033366},{"t":1605916800,"v":18681.88473987622},{"t":1606003200,"v":18406.836393857495},{"t":1606089600,"v":18340.95092402201},{"t":1606176000,"v":19081.11380920774},{"t":1606262400,"v":18764.47654404935},{"t":1606348800,"v":17106.29070146959},{"t":1606435200,"v":17096.724533063225},{"t":1606521600,"v":17714.060585997013},{"t":1606608000,"v":18147.63645981038},{"t":1606694400,"v":19689.81054499716},{"t":1606780800,"v":18863.78086086128},{"t":1606867200,"v":19196.437039164783},{"t":1606953600,"v":19437.08165850093},{"t":1607040000,"v":18756.340876715585},{"t":1607126400,"v":19137.370640297184},{"t":1607212800,"v":19331.057919958297},{"t":1607299200,"v":19198.32218907732},{"t":1607385600,"v":18327.694817576405},{"t":1607472000,"v":18564.904366246454},{"t":1607558400,"v":18272.716243561048},{"t":1607644800,"v":18079.312133207175},{"t":1607731200,"v":18799.9244382663},{"t":1607817600,"v":19148.693456271252},{"t":1607904000,"v":19246.47838730268},{"t":1607990400,"v":19423.81741657513},{"t":1608076800,"v":21344.961281247066},{"t":1608163200,"v":22790.806538276374},{"t":1608249600,"v":23078.763955584098},{"t":1608336000,"v":23851.242514075984},{"t":1608422400,"v":23549.781123366854},{"t":1608508800,"v":22875.455699730974},{"t":1608595200,"v":23758.933628169103},{"t":1608681600,"v":23279.54929310205},{"t":1608768000,"v":23764.75340487314},{"t":1608854400,"v":24688.21152033385},{"t":1608940800,"v":26440.24870020325},{"t":1609027200,"v":26388.149455672108},{"t":1609113600,"v":27098.952753928424},{"t":1609200000,"v":27324.988106434248},{"t":1609286400,"v":28827.007973579824},{"t":1609372800,"v":28988.642493531017},{"t":1609459200,"v":29354.310492680135},{"t":1609545600,"v":32031.61971248076},{"t":1609632000,"v":32939.057471683795},{"t":1609718400,"v":31930.83940605436},{"t":1609804800,"v":34070.20033180983},{"t":1609891200,"v":36850.14715350343},{"t":1609977600,"v":39241.93637401782},{"t":1610064000,"v":40771.75946402795},{"t":1610150400,"v":40388.87363752308},{"t":1610236800,"v":38474.29606929845},{"t":1610323200,"v":35603.36377377936},{"t":1610409600,"v":33879.45142976907},{"t":1610496000,"v":37320.808100849805},{"t":1610582400,"v":39192.56322801528},{"t":1610668800,"v":36732.76292548016},{"t":1610755200,"v":36206.743416714606},{"t":1610841600,"v":35774.02336857131},{"t":1610928000,"v":36642.53189467641},{"t":1611014400,"v":36072.63455672601},{"t":1611100800,"v":35553.550809646295},{"t":1611187200,"v":30818.59900858709},{"t":1611273600,"v":33004.723330040426},{"t":1611360000,"v":32057.57127381432},{"t":1611446400,"v":32293.27014680785},{"t":1611532800,"v":32368.11499830086},{"t":1611619200,"v":32571.321685764407},{"t":1611705600,"v":30438.367004209395},{"t":1611792000,"v":33459.35125206922},{"t":1611878400,"v":34318.52819983214},{"t":1611964800,"v":34258.12290596416},{"t":1612051200,"v":33108.29665129587},{"t":1612137600,"v":33543.85974350085},{"t":1612224000,"v":35524.119952273206},{"t":1612310400,"v":37451.367472916325},{"t":1612396800,"v":36924.74200585988},{"t":1612483200,"v":38123.15354014715},{"t":1612569600,"v":39271.99676818323},{"t":1612656000,"v":38904.21414938871},{"t":1612742400,"v":45981.864589684476},{"t":1612828800,"v":46506.134809077426},{"t":1612915200,"v":44886.381099679624},{"t":1613001600,"v":47812.53533389692},{"t":1613088000,"v":47482.86135240913},{"t":1613174400,"v":47067.939135262444},{"t":1613260800,"v":48747.45244155483},{"t":1613347200,"v":47984.954753679056},{"t":1613433600,"v":49175.90051592181},{"t":1613520000,"v":52138.04498768492},{"t":1613606400,"v":51649.57543629381},{"t":1613692800,"v":55776.18881251338},{"t":1613779200,"v":56134.54415202914},{"t":1613865600,"v":57487.03807408455},{"t":1613952000,"v":54092.68879988714},{"t":1614038400,"v":48548.9572135791},{"t":1614124800,"v":49652.01003172871},{"t":1614211200,"v":47209.544068730516},{"t":1614297600,"v":46243.95205410501},{"t":1614384000,"v":46319.696393610844},{"t":1614470400,"v":45119.12569768188},{"t":1614556800,"v":49768.16035012147},{"t":1614643200,"v":48401.732978524866},{"t":1614729600,"v":50698.56833524798},{"t":1614816000,"v":48515.770213777236},{"t":1614902400,"v":48915.789594568705},{"t":1614988800,"v":48905.87987030982},{"t":1615075200,"v":51282.11369865597},{"t":1615161600,"v":52307.860713183174},{"t":1615248000,"v":54696.82182220556},{"t":1615334400,"v":56128.767227455},{"t":1615420800,"v":57800.36671419076},{"t":1615507200,"v":57372.32951283427},{"t":1615593600,"v":61217.050879895614},{"t":1615680000,"v":59728.59392893374},{"t":1615766400,"v":55813.8936028549},{"t":1615852800,"v":56488.62247040071},{"t":1615939200,"v":58748.92354285633},{"t":1616025600,"v":57887.8812431903},{"t":1616112000,"v":58374.206863912295},{"t":1616198400,"v":58443.52143446477},{"t":1616284800,"v":57521.45671319987},{"t":1616371200,"v":54608.25914921329},{"t":1616457600,"v":54888.85537030697},{"t":1616544000,"v":52774.26369049241},{"t":1616630400,"v":51704.16192519879},{"t":1616716800,"v":55137.31372577932},{"t":1616803200,"v":56067.945548474745},{"t":1616889600,"v":55991.20119647779},{"t":1616976000,"v":57769.14012066299},{"t":1617062400,"v":58937.638886814275},{"t":1617148800,"v":58954.497008149716},{"t":1617235200,"v":59118.97407768802},{"t":1617321600,"v":59392.14948112517},{"t":1617408000,"v":57642.97095819078},{"t":1617494400,"v":58752.80659415484},{"t":1617580800,"v":58898.76589833386},{"t":1617667200,"v":58243.4539402529},{"t":1617753600,"v":56219.39629880624},{"t":1617840000,"v":58321.10713544663},{"t":1617926400,"v":58245.00300108353},{"t":1618012800,"v":59793.23541009381},{"t":1618099200,"v":60226.42360963432},{"t":1618185600,"v":59915.46446523154},{"t":1618272000,"v":63603.70817233695},{"t":1618358400,"v":62922.213180229075},{"t":1618444800,"v":63285.56727067338},{"t":1618531200,"v":61611.99680584272},{"t":1618617600,"v":60803.84653163625},{"t":1618704000,"v":56163.105403277135},{"t":1618790400,"v":55657.83923174755},{"t":1618876800,"v":56379.21247716248},{"t":1618963200,"v":53861.436959475745},{"t":1619049600,"v":51826.89354372698},{"t":1619136000,"v":51027.733327861744},{"t":1619222400,"v":50020.15342145914},{"t":1619308800,"v":49039.862341498076},{"t":1619395200,"v":54006.25201262605},{"t":1619481600,"v":54981.4799948714},{"t":1619568000,"v":54793.39452980505},{"t":1619654400,"v":53558.66206906318},{"t":1619740800,"v":57775.27815155285},{"t":1619827200,"v":57811.517527593925},{"t":1619913600,"v":56613.20264847865},{"t":1620000000,"v":57200.29122289164},{"t":1620086400,"v":53333.53775274298},{"t":1620172800,"v":57424.005948133796},{"t":1620259200,"v":56485.701296946165},{"t":1620345600,"v":57369.55799873567},{"t":1620432000,"v":58766.58487466966},{"t":1620518400,"v":58218.56607679752},{"t":1620604800,"v":55824.86166666395},{"t":1620691200,"v":56714.088910232254},{"t":1620777600,"v":49916.49449913513},{"t":1620864000,"v":49729.30250032533},{"t":1620950400,"v":49873.68639240858},{"t":1621036800,"v":46803.830522483644},{"t":1621123200,"v":46406.33154419618},{"t":1621209600,"v":43382.14785916692},{"t":1621296000,"v":42985.843096399796},{"t":1621382400,"v":37151.95393552557},{"t":1621468800,"v":40512.11108015661},{"t":1621555200,"v":37273.44235496146},{"t":1621641600,"v":37645.72214685647},{"t":1621728000,"v":34888.67831280685},{"t":1621814400,"v":38669.0184494052},{"t":1621900800,"v":38211.78552190482},{"t":1621987200,"v":39266.35535111086},{"t":1622073600,"v":38530.1395731867},{"t":1622160000,"v":35690.74355653414},{"t":1622246400,"v":34613.06385325806},{"t":1622332800,"v":35639.981454563684},{"t":1622419200,"v":37317.276797389924},{"t":1622505600,"v":36642.32959185035},{"t":1622592000,"v":37659.80709526973},{"t":1622678400,"v":39173.79329215054},{"t":1622764800,"v":36975.00656850563},{"t":1622851200,"v":35533.74658759773},{"t":1622937600,"v":35797.42238993168},{"t":1623024000,"v":33577.694225233514},{"t":1623110400,"v":33452.00225490226},{"t":1623196800,"v":37290.99177617837},{"t":1623283200,"v":36744.73930845569},{"t":1623369600,"v":37242.88691336585},{"t":1623456000,"v":35512.90011452891},{"t":1623542400,"v":39019.88742092465},{"t":1623628800,"v":40536.096186703144},{"t":1623715200,"v":40239.188062720765},{"t":1623801600,"v":38287.525924097135},{"t":1623888000,"v":38109.19708064974},{"t":1623974400,"v":35713.84377788781},{"t":1624060800,"v":35668.695876869904},{"t":1624147200,"v":35704.62085788758},{"t":1624233600,"v":31586.754526998815},{"t":1624320000,"v":32477.421130990322},{"t":1624406400,"v":33652.92415463683},{"t":1624492800,"v":34629.99104463987},{"t":1624579200,"v":31670.672544371268},{"t":1624665600,"v":31982.57003176423},{"t":1624752000,"v":34607.288973134804},{"t":1624838400,"v":34408.64609236688},{"t":1624924800,"v":35900.15433447891},{"t":1625011200,"v":35024.606828788485},{"t":1625097600,"v":33568.58643061468},{"t":1625184000,"v":33933.60148407786},{"t":1625270400,"v":34674.53246619413},{"t":1625356800,"v":35285.09656628057},{"t":1625443200,"v":33821.80911722237},{"t":1625529600,"v":34158.92122381347},{"t":1625616000,"v":33850.91409077919},{"t":1625702400,"v":32847.39678991275},{"t":1625788800,"v":33878.23686193274},{"t":1625875200,"v":33517.87334009401},{"t":1625961600,"v":34242.67250669811},{"t":1626048000,"v":33186.37684498091},{"t":1626134400,"v":32616.020911028223},{"t":1626220800,"v":32808.31518654271},{"t":1626307200,"v":31671.443053709256},{"t":1626393600,"v":31426.89947869541},{"t":1626480000,"v":31548.922957613315},{"t":1626566400,"v":31814.34827840592},{"t":1626652800,"v":30834.368390233183},{"t":1626739200,"v":29783.01141710609},{"t":1626825600,"v":32131.635486882926},{"t":1626912000,"v":32328.209838049966},{"t":1626998400,"v":33498.822498185575},{"t":1627084800,"v":34265.55624474202},{"t":1627171200,"v":35242.6443568511},{"t":1627257600,"v":37401.18874998933},{"t":1627344000,"v":39315.132254921446},{"t":1627430400,"v":40021.27288558416},{"t":1627516800,"v":40037.52162230717},{"t":1627603200,"v":42080.75491077187},{"t":1627689600,"v":41692.75732333602},{"t":1627776000,"v":40135.33200074718},{"t":1627862400,"v":39183.67244883457},{"t":1627948800,"v":38160.716653116004},{"t":1628035200,"v":39799.303765271405},{"t":1628121600,"v":40854.599720736376},{"t":1628208000,"v":42826.8312632613},{"t":1628294400,"v":44689.86095932558},{"t":1628380800,"v":43785.48181939978},{"t":1628467200,"v":46284.97398221619},{"t":1628553600,"v":45594.07627236636},{"t":1628640000,"v":45593.63593070519},{"t":1628726400,"v":44428.288466806436},{"t":1628812800,"v":47831.97604291269},{"t":1628899200,"v":47096.94566198037},{"t":1628985600,"v":47064.63037062539},{"t":1629072000,"v":46004.484078602196},{"t":1629158400,"v":44695.35761921304},{"t":1629244800,"v":44801.18871714413},{"t":1629331200,"v":46717.578745203784},{"t":1629417600,"v":49339.17603687802},{"t":1629504000,"v":48905.49058554897},{"t":1629590400,"v":49321.65404941213},{"t":1629676800,"v":49546.147707289056},{"t":1629763200,"v":47756.00188106575},{"t":1629849600,"v":48961.76778660005},{"t":1629936000,"v":46940.70765177846},{"t":1630022400,"v":49024.03094495386},{"t":1630108800,"v":48883.29014045116},{"t":1630195200,"v":48947.258970319264},{"t":1630281600,"v":47093.88091858282},{"t":1630368000,"v":47238.2268323822},{"t":1630454400,"v":48763.85643533685},{"t":1630540800,"v":49341.853804627746},{"t":1630627200,"v":50011.34681209545},{"t":1630713600,"v":49951.92415055585},{"t":1630800000,"v":51741.55077722714},{"t":1630886400,"v":52610.5411520828},{"t":1630972800,"v":46795.20910754369},{"t":1631059200,"v":46039.08212736113},{"t":1631145600,"v":46377.168738477005},{"t":1631232000,"v":44888.12370523385},{"t":1631318400,"v":45147.44035889953},{"t":1631404800,"v":46082.23150321188},{"t":1631491200,"v":45004.701974221185},{"t":1631577600,"v":47031.16732364414},{"t":1631664000,"v":48143.03744946416},{"t":1631750400,"v":47799.18503883096},{"t":1631836800,"v":47204.66266010661},{"t":1631923200,"v":48234.21547366776},{"t":1632009600,"v":47257.2870422188},{"t":1632096000,"v":42907.065767455875},{"t":1632182400,"v":40633.9343353387},{"t":1632268800,"v":43569.17620056878},{"t":1632355200,"v":44890.04746964758},{"t":1632441600,"v":42796.24321532524},{"t":1632528000,"v":42746.97922403371},{"t":1632614400,"v":43247.456876465236},{"t":1632700800,"v":42248.01771773999},{"t":1632787200,"v":41032.26192917951},{"t":1632873600,"v":41538.282988017854},{"t":1632960000,"v":43750.871798624525},{"t":1633046400,"v":48118.17770595206},{"t":1633132800,"v":47756.25428303739},{"t":1633219200,"v":48220.65303746762},{"t":1633305600,"v":49080.66909231698},{"t":1633392000,"v":51559.362044222966},{"t":1633478400,"v":55431.02700201357},{"t":1633564800,"v":53776.5428709291},{"t":1633651200,"v":53884.290533191845},{"t":1633737600,"v":55068.64354562132},{"t":1633824000,"v":54675.093215311404},{"t":1633910400,"v":57434.24099023865},{"t":1633996800,"v":56064.76997697855},{"t":1634083200,"v":57377.79917693812},{"t":1634169600,"v":57354.32086331414},{"t":1634256000,"v":61571.094905218495},{"t":1634342400,"v":60890.14283083667},{"t":1634428800,"v":61640.37510539247},{"t":1634515200,"v":61975.54697314697},{"t":1634601600,"v":64238.27110780218},{"t":1634688000,"v":65996.5661678894},{"t":1634774400,"v":62385.16707125176},{"t":1634860800,"v":60703.42954102141},{"t":1634947200,"v":61342.90825481901},{"t":1635033600,"v":60881.947564871894},{"t":1635120000,"v":62967.41302302343},{"t":1635206400,"v":60449.35530260795},{"t":1635292800,"v":58639.68046139201},{"t":1635379200,"v":60572.27124397584},{"t":1635465600,"v":62234.031011430285},{"t":1635552000,"v":61735.370669844706},{"t":1635638400,"v":61366.99988156578},{"t":1635724800,"v":61058.22626537975},{"t":1635811200,"v":63176.571785319764},{"t":1635897600,"v":62999.122403911184},{"t":1635984000,"v":61434.63281689667},{"t":1636070400,"v":61121.31052072735},{"t":1636156800,"v":61493.6638971142},{"t":1636243200,"v":63252.42476178271},{"t":1636329600,"v":67589.00657928495},{"t":1636416000,"v":66945.69883396852},{"t":1636502400,"v":64818.21602921305},{"t":1636588800,"v":64816.13453056888},{"t":1636675200,"v":64282.438060508306},{"t":1636761600,"v":64468.22210883111},{"t":1636848000,"v":65342.41990215841},{"t":1636934400,"v":63743.399959489085},{"t":1637020800,"v":60312.902355847786},{"t":1637107200,"v":60357.17150473297},{"t":1637193600,"v":56875.86578270761},{"t":1637280000,"v":58130.998447175196},{"t":1637366400,"v":59767.49239601791},{"t":1637452800,"v":58653.93706354738},{"t":1637539200,"v":56345.421342238486},{"t":1637625600,"v":57599.536234919666},{"t":1637712000,"v":57185.986384863936},{"t":1637798400,"v":58927.890687830026},{"t":1637884800,"v":53761.70172458773},{"t":1637971200,"v":54542.06360428747},{"t":1638057600,"v":57201.70801545579},{"t":1638144000,"v":57816.06529203574},{"t":1638230400,"v":56915.51221084483},{"t":1638316800,"v":57182.67601379536},{"t":1638403200,"v":56448.44868071566},{"t":1638489600,"v":53765.79648309126},{"t":1638576000,"v":48962.920993272506},{"t":1638662400,"v":49174.902908060714},{"t":1638748800,"v":50492.43559639025},{"t":1638835200,"v":50592.088497950775},{"t":1638921600,"v":50521.23639994827},{"t":1639008000,"v":47911.076404276886},{"t":1639094400,"v":47262.23744299545},{"t":1639180800,"v":49354.08716867792},{"t":1639267200,"v":50118.920959284056},{"t":1639353600,"v":46762.482528056156},{"t":1639440000,"v":48413.70564738807},{"t":1639526400,"v":48819.849347231386},{"t":1639612800,"v":47695.28039490217},{"t":1639699200,"v":46326.91959569937},{"t":1639785600,"v":46962.91334059254},{"t":1639872000,"v":46791.896055954865},{"t":1639958400,"v":46853.71063454527},{"t":1640044800,"v":48957.19391098451},{"t":1640131200,"v":48646.43337566828},{"t":1640217600,"v":50770.61418965044},{"t":1640304000,"v":50864.328952351185},{"t":1640390400,"v":50649.92614866225},{"t":1640476800,"v":50806.442175331875},{"t":1640563200,"v":50610.956802940294},{"t":1640649600,"v":47669.740372077125},{"t":1640736000,"v":46407.595489642925},{"t":1640822400,"v":47188.3205500879},{"t":1640908800,"v":46328.94313808985},{"t":1640995200,"v":47620.42381093365},{"t":1641081600,"v":47344.843409743444},{"t":1641168000,"v":46467.61579525452},{"t":1641254400,"v":45926.76178657015},{"t":1641340800,"v":43589.355683071975},{"t":1641427200,"v":43154.45522485052},{"t":1641513600,"v":41564.23901043853}]'
+ string: "\r\n401 Authorization Required\r\n\r\n401
+ Authorization Required
\r\n
nginx\r\n\r\n\r\n"
headers:
Access-Control-Allow-Credentials:
- 'true'
@@ -20,21 +21,15 @@ interactions:
- https://studio.glassnode.com
Connection:
- keep-alive
+ Content-Length:
+ - '172'
Content-Type:
- - text/plain; charset=utf-8
+ - text/html
Date:
- - Mon, 20 Jun 2022 09:50:59 GMT
+ - Wed, 28 Sep 2022 09:14:26 GMT
Strict-Transport-Security:
- max-age=15724800; includeSubDomains
- Transfer-Encoding:
- - chunked
- X-Rate-Limit-Limit:
- - '30'
- X-Rate-Limit-Remaining:
- - '28'
- X-Rate-Limit-Reset:
- - '60'
status:
- code: 200
- message: OK
+ code: 401
+ message: Unauthorized
version: 1
diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/test_glassnode_view.py b/tests/openbb_terminal/cryptocurrency/due_diligence/test_glassnode_view.py
index 3d046792efe..032848e067b 100644
--- a/tests/openbb_terminal/cryptocurrency/due_diligence/test_glassnode_view.py
+++ b/tests/openbb_terminal/cryptocurrency/due_diligence/test_glassnode_view.py
@@ -18,4 +18,4 @@ def vcr_config():
def test_display_btc_rainbow(mocker):
# MOCK VISUALIZE_OUTPUT
mocker.patch(target="openbb_terminal.helper_classes.TerminalStyle.visualize_output")
- glassnode_view.display_btc_rainbow(start_date=1_325_376_000, end_date=1_641_641_877)
+ glassnode_view.display_btc_rainbow(start_date="2012-01-01", end_date="2022-01-08")
diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_glassnode_view/test_display_btc_rainbow.txt b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_glassnode_view/test_display_btc_rainbow.txt
index e69de29bb2d..ea7b1de3bfe 100644
--- a/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_glassnode_view/test_display_btc_rainbow.txt
+++ b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_glassnode_view/test_display_btc_rainbow.txt
@@ -0,0 +1,2 @@
+[red]Invalid API Key[/red]
+
diff --git a/tests/openbb_terminal/stocks/options/test_options_controller.py b/tests/openbb_terminal/stocks/options/test_options_controller.py
index a7614f1d100..0a202f9922e 100644
--- a/tests/openbb_terminal/stocks/options/test_options_controller.py
+++ b/tests/openbb_terminal/stocks/options/test_options_controller.py
@@ -874,10 +874,10 @@ def test_call_func(
):
path_controller = "openbb_terminal.stocks.options.options_controller"
- # MOCK TRADIER_TOKEN
+ # MOCK API_TRADIER_TOKEN
mocker.patch.object(
target=options_controller,
- attribute="TRADIER_TOKEN",
+ attribute="API_TRADIER_TOKEN",
new="MOCK_TRADIER_TOKEN",
)
diff --git a/tests/openbb_terminal/test_keys_controller.py b/tests/openbb_terminal/test_keys_controller.py
index ee37c8836b7..9de27f58827 100644
--- a/tests/openbb_terminal/test_keys_controller.py
+++ b/tests/openbb_terminal/test_keys_controller.py
@@ -9,7 +9,7 @@ controller = KeysController(menu_usage=False)
@pytest.fixture(autouse=True)
def no_change_env(mocker):
- mocker.patch("openbb_terminal.keys_controller.dotenv.set_key")
+ mocker.patch("openbb_terminal.keys_model.dotenv.set_key")
class MockCFG:
@@ -21,7 +21,7 @@ class MockCFG:
self.API_POLYGON_KEY = kwargs.get("POLYGON", None)
self.API_FRED_KEY = kwargs.get("FRED", None)
self.API_NEWS_TOKEN = kwargs.get("NEWS", None)
- self.TRADIER_TOKEN = kwargs.get("TRADIER", None)
+ self.API_TRADIER_TOKEN = kwargs.get("TRADIER", None)
self.API_CMC_KEY = kwargs.get("CMC", None)
self.API_FINNHUB_KEY = kwargs.get("FINNHUB", None)
self.API_IEX_TOKEN = kwargs.get("IEX", None)
@@ -58,220 +58,18 @@ class MockCFG:
self.API_MESSARI_KEY = kwargs.get("MESSARI", None)
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_github_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(GITHUB=key))
- controller.check_github_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_av_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(AV=key))
- controller.check_av_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_fmp_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(FMP=key))
- controller.check_fmp_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_quandl_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(QUANDL=key))
- controller.check_quandl_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_polygon_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(POLYGON=key))
- controller.check_polygon_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_fred_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(FRED=key))
- controller.check_fred_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_news_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(NEWS=key))
- controller.check_news_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_tradier_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(TRADIER=key))
- controller.check_tradier_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_cmc_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(CMC=key))
- controller.check_cmc_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_finnhub_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(FINNHUB=key))
- controller.check_finnhub_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_iex_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(IEX=key))
- controller.check_iex_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_reddit_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(REDDIT_CLIENT=key))
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(REDDIT_SECRET=key))
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(REDDIT_USERNAME=key))
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(REDDIT_PASSWORD=key))
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(REDDIT_USER=key))
- controller.check_cmc_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_twitter_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(TWITTER=key))
- controller.check_twitter_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_rh_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(RH=key))
- controller.check_rh_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_degiro_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(DEGIRO=key))
- controller.check_degiro_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_oanda_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(OANDA=key))
- controller.check_oanda_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_binance_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(BINANCE=key))
- controller.check_binance_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_bitquery_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(BITQUERY=key))
- controller.check_bitquery_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_si_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(SI=key))
- controller.check_si_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_coinbase_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(COINBASE=key))
- controller.check_coinbase_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_walert_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(WALERT=key))
- controller.check_walert_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_glassnode_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(GLASSNODE=key))
- controller.check_glassnode_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_coinglass_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(COINGLASS=key))
- controller.check_coinglass_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_cpanic_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(CPANIC=key))
- controller.check_cpanic_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_ethplorer_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(ETHPLOR=key))
- controller.check_ethplorer_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_smartstake_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(SMARTSTAKE=key))
- controller.check_smartstake_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_santiment_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(SANTIMENT=key))
- controller.check_santiment_key(output)
-
-
-@pytest.mark.vcr
-@pytest.mark.parametrize("key, output", [("REPLACE_ME", True), ("VALIDKEY", False)])
-def test_check_messari_key(key, output, mocker):
- mocker.patch("openbb_terminal.keys_controller.cfg", MockCFG(MESSARI=key))
- controller.check_messari_key(output)
+# TODO: add mykeys test to assert df
+# TODO: add refresh test
@pytest.mark.skip
def test_print_help(mocker):
- mocker.patch("openbb_terminal.keys_controller.KeysController.check_coinbase_key")
+ mocker.patch("openbb_terminal.keys_controller.KeysController.check_keys_status")
controller.print_help()
@pytest.mark.vcr
@pytest.mark.parametrize("other", [[], ["-k", "1234"], ["1234"]])
-def test_call_github(other):
- controller.call_github(other)
-
-
-@pytest.mark.skip
-@pytest.mark.parametrize("other", [[], ["-k", "1234"], ["1234"]])
def test_call_av(other):
controller.call_av(other)
@@ -424,11 +222,17 @@ def test_call_smartstake(other):
@pytest.mark.vcr
@pytest.mark.parametrize("other", [[], ["-k", "1234"], ["1234"]])
-def test_call_santiment(other):
- controller.call_santiment(other)
+def test_call_github(other):
+ controller.call_github(other)
@pytest.mark.vcr
@pytest.mark.parametrize("other", [[], ["-k", "1234", "-t", "456"]])
def test_call_messari(other):
controller.call_messari(other)
+
+
+@pytest.mark.vcr
+@pytest.mark.parametrize("other", [[], ["-k", "1234"], ["1234"]])
+def test_call_santiment(other):
+ controller.call_santiment(other)
diff --git a/tests/openbb_terminal/test_keys_model.py b/tests/openbb_terminal/test_keys_model.py
new file mode 100644
index 00000000000..1b822b888fb
--- /dev/null
+++ b/tests/openbb_terminal/test_keys_model.py
@@ -0,0 +1,1592 @@
+import os
+from typing import List
+from unittest.mock import patch
+from pathlib import Path
+import pandas as pd
+import pytest
+
+from openbb_terminal import keys_model
+
+# pylint: disable=R0902,R0903,W1404,C0302
+
+
+# Test persist
+@patch.dict(os.environ, {}, clear=True)
+@pytest.mark.parametrize(
+ "env_var_name, env_var_value, persist",
+ [("OPENBB_API_TEST", "TEST_KEY", True), ("OPENBB_API_TEST", "TEST_KEY", False)],
+)
+def test_set_key(env_var_name: str, env_var_value: str, persist: bool):
+
+ # Route .env file location
+ keys_model.USER_ENV_FILE = Path(os.path.dirname(__file__), ".tmp")
+
+ # Test
+ keys_model.set_key(env_var_name, env_var_value, persist)
+
+ # Get key from temp .env
+ dotenv_key = keys_model.dotenv.get_key(
+ str(keys_model.USER_ENV_FILE), key_to_get=env_var_name
+ )
+
+ # Remove temp .env
+ if keys_model.USER_ENV_FILE.is_file():
+ os.remove(keys_model.USER_ENV_FILE)
+
+ # Get key from patched os.environ
+ os_key = os.getenv(env_var_name)
+
+ # Get key from config_terminal.py
+ if env_var_name.startswith("OPENBB_"):
+ env_var_name = env_var_name[7:]
+ cfg_key = getattr(keys_model.cfg, env_var_name)
+
+ if persist is True:
+ assert dotenv_key == os_key == cfg_key == env_var_value
+ else:
+ assert (dotenv_key is None) and (os_key is None) and (cfg_key == env_var_value)
+
+
+def test_get_keys():
+ df = keys_model.get_keys()
+ assert isinstance(df, pd.DataFrame)
+
+
+def set_naive_environment(env_var_name_list: List[str]) -> None:
+
+ tmp_env = Path(os.path.dirname(__file__), ".tmp")
+
+ # Remove keys from patched os.environ
+ for env_var_name in env_var_name_list:
+ if env_var_name in os.environ:
+ os.environ.pop(env_var_name)
+
+ # Remove .tmp content
+ if tmp_env.is_file():
+ with open(tmp_env, "w") as f:
+ f.close()
+
+ # Set new temporary .env
+ keys_model.USER_ENV_FILE = tmp_env
+
+
+def assert_keys_and_status(
+ args: List[str],
+ persist: bool,
+ expected: str,
+ env_var_name_list: List[str],
+ status: str,
+) -> None:
+
+ for i, env_var_name in enumerate(env_var_name_list):
+
+ dotenv_var = keys_model.dotenv.get_key(
+ str(keys_model.USER_ENV_FILE), key_to_get=env_var_name
+ )
+
+ os_var = os.getenv(env_var_name)
+
+ if env_var_name.startswith("OPENBB_"):
+ env_var_name = env_var_name[7:]
+ cfg_var = getattr(keys_model.cfg, env_var_name)
+
+ if persist is True:
+ assert dotenv_var == os_var == cfg_var == args[i]
+ else:
+ assert (dotenv_var is None) and (os_var is None) and (cfg_var == args[i])
+
+ assert status == expected
+
+
+# Alphavantage api is working with any key you pass, so expected is 1 with dummy keys
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_PASSED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_PASSED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_PASSED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_av_key(args: List[str], persist: bool, show_output: bool, expected: str):
+
+ env_var_name_list = [
+ "OPENBB_API_KEY_ALPHAVANTAGE",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_av_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_fmp_key(args: List[str], persist: bool, show_output: bool, expected: str):
+
+ env_var_name_list = [
+ "OPENBB_API_KEY_FINANCIALMODELINGPREP",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_fmp_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_quandl_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_KEY_QUANDL",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_quandl_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_polygon_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_POLYGON_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_polygon_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_fred_key(args: List[str], persist: bool, show_output: bool, expected: str):
+
+ env_var_name_list = [
+ "OPENBB_API_FRED_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_fred_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_news_key(args: List[str], persist: bool, show_output: bool, expected: str):
+
+ env_var_name_list = [
+ "OPENBB_API_NEWS_TOKEN",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_news_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_tradier_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_TRADIER_TOKEN",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_tradier_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_cmc_key(args: List[str], persist: bool, show_output: bool, expected: str):
+
+ env_var_name_list = [
+ "OPENBB_API_CMC_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_cmc_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_finnhub_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_FINNHUB_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_finnhub_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_iex_key(args: List[str], persist: bool, show_output: bool, expected: str):
+
+ env_var_name_list = [
+ "OPENBB_API_IEX_TOKEN",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_iex_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_id", "test_secret", "test_pass", "test_user", "test_agent"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_id", "test_secret", "test_pass", "test_user", "test_agent"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_id", "test_secret", "test_pass", "test_user", "test_agent"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME", "REPLACE_ME", "REPLACE_ME", "REPLACE_ME", "REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_reddit_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_REDDIT_CLIENT_ID",
+ "OPENBB_API_REDDIT_CLIENT_SECRET",
+ "OPENBB_API_REDDIT_PASSWORD",
+ "OPENBB_API_REDDIT_USERNAME",
+ "OPENBB_API_REDDIT_USER_AGENT",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_reddit_key(
+ client_id=args[0],
+ client_secret=args[1],
+ password=args[2],
+ username=args[3],
+ useragent=args[4],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_bitquery_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_BITQUERY_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_bitquery_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key", "test_secret", "test_access_token"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key", "test_secret", "test_access_token"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key", "test_secret", "test_access_token"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME", "REPLACE_ME", "REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_twitter_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_TWITTER_KEY",
+ "OPENBB_API_TWITTER_SECRET_KEY",
+ "OPENBB_API_TWITTER_BEARER_TOKEN",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_twitter_key(
+ key=args[0],
+ secret=args[1],
+ access_token=args[2],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_username", "test_password"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["test_username", "test_password"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["test_username", "test_password"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["REPLACE_ME", "REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_rh_key(args: List[str], persist: bool, show_output: bool, expected: str):
+
+ env_var_name_list = [
+ "OPENBB_RH_USERNAME",
+ "OPENBB_RH_PASSWORD",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_rh_key(
+ username=args[0],
+ password=args[1],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_username", "test_password", "test_secret"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["test_username", "test_password", "test_secret"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["test_username", "test_password", "test_secret"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["REPLACE_ME", "REPLACE_ME", "REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_degiro_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_DG_USERNAME",
+ "OPENBB_DG_PASSWORD",
+ "OPENBB_DG_TOTP_SECRET",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_degiro_key(
+ username=args[0],
+ password=args[1],
+ secret=args[2],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_account", "test_access_token", "account_type"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_account", "test_access_token", "account_type"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_account", "test_access_token", "account_type"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME", "REPLACE_ME", "REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_oanda_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_OANDA_ACCOUNT",
+ "OPENBB_OANDA_TOKEN",
+ "OPENBB_OANDA_ACCOUNT_TYPE",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_oanda_key(
+ account=args[0],
+ access_token=args[1],
+ account_type=args[2],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key", "test_secret"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key", "test_secret"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key", "test_secret"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME", "REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_binance_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_BINANCE_KEY",
+ "OPENBB_API_BINANCE_SECRET",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_binance_key(
+ key=args[0],
+ secret=args[1],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_si_key(args: List[str], persist: bool, show_output: bool, expected: str):
+
+ env_var_name_list = [
+ "OPENBB_API_SENTIMENTINVESTOR_TOKEN",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_si_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key", "test_secret", "test_passphrase"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key", "test_secret", "test_passphrase"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key", "test_secret", "test_passphrase"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME", "REPLACE_ME", "REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_coinbase_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_COINBASE_KEY",
+ "OPENBB_API_COINBASE_SECRET",
+ "OPENBB_API_COINBASE_PASS_PHRASE",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_coinbase_key(
+ key=args[0],
+ secret=args[1],
+ passphrase=args[2],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_walert_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_WHALE_ALERT_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_walert_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_glassnode_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_GLASSNODE_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_glassnode_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_coinglass_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_COINGLASS_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_coinglass_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_cpanic_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_CRYPTO_PANIC_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_cpanic_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_ethplorer_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_ETHPLORER_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_ethplorer_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key", "test_access_token"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key", "test_access_token"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key", "test_access_token"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME", "REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_smartstake_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_SMARTSTAKE_KEY",
+ "OPENBB_API_SMARTSTAKE_TOKEN",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_smartstake_key(
+ key=args[0],
+ access_token=args[1],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_NOT_TESTED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_github_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_GITHUB_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_github_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_messari_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_MESSARI_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_messari_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_eodhd_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_EODHD_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_eodhd_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
+
+
+@patch.dict(os.environ, {})
+@pytest.mark.vcr
+@pytest.mark.record_stdout
+@pytest.mark.parametrize(
+ "args, persist, show_output, expected",
+ [
+ (
+ ["test_key"],
+ False,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ False,
+ False,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["test_key"],
+ True,
+ True,
+ keys_model.KeyStatus.DEFINED_TEST_FAILED,
+ ),
+ (
+ ["REPLACE_ME"],
+ False,
+ True,
+ keys_model.KeyStatus.NOT_DEFINED,
+ ),
+ ],
+)
+def test_set_santiment_key(
+ args: List[str], persist: bool, show_output: bool, expected: str
+):
+
+ env_var_name_list = [
+ "OPENBB_API_SANTIMENT_KEY",
+ ]
+
+ set_naive_environment(env_var_name_list)
+
+ status = keys_model.set_santiment_key(
+ key=args[0],
+ persist=persist,
+ show_output=show_output,
+ )
+
+ assert_keys_and_status(args, persist, expected, env_var_name_list, status)
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args0-False-True-defined, test passed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args0-False-True-defined, test passed].txt
new file mode 100644
index 00000000000..e8618784af7
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args0-False-True-defined, test passed].txt
@@ -0,0 +1,2 @@
+[green]defined, test passed[/green]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args1-False-False-defined, test passed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args1-False-False-defined, test passed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args2-True-True-defined, test passed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args2-True-True-defined, test passed].txt
new file mode 100644
index 00000000000..e8618784af7
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args2-True-True-defined, test passed].txt
@@ -0,0 +1,2 @@
+[green]defined, test passed[/green]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_av_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_binance_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_bitquery_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_cmc_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_coinbase_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_coinglass_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_cpanic_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args0-False-True-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args0-False-True-defined, not tested].txt
new file mode 100644
index 00000000000..d262038ba82
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args0-False-True-defined, not tested].txt
@@ -0,0 +1,2 @@
+[yellow]defined, not tested[/yellow]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args1-False-False-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args1-False-False-defined, not tested].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args2-True-True-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args2-True-True-defined, not tested].txt
new file mode 100644
index 00000000000..d262038ba82
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args2-True-True-defined, not tested].txt
@@ -0,0 +1,2 @@
+[yellow]defined, not tested[/yellow]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_degiro_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_eodhd_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_ethplorer_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_finnhub_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_fmp_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_fred_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args0-False-True-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args0-False-True-defined, not tested].txt
new file mode 100644
index 00000000000..d262038ba82
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args0-False-True-defined, not tested].txt
@@ -0,0 +1,2 @@
+[yellow]defined, not tested[/yellow]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args1-False-False-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args1-False-False-defined, not tested].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args2-True-True-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args2-True-True-defined, not tested].txt
new file mode 100644
index 00000000000..d262038ba82
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args2-True-True-defined, not tested].txt
@@ -0,0 +1,2 @@
+[yellow]defined, not tested[/yellow]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_github_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_glassnode_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_iex_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_messari_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_news_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_oanda_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_polygon_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_quandl_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_reddit_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args0-False-True-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args0-False-True-defined, not tested].txt
new file mode 100644
index 00000000000..d262038ba82
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args0-False-True-defined, not tested].txt
@@ -0,0 +1,2 @@
+[yellow]defined, not tested[/yellow]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args1-False-False-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args1-False-False-defined, not tested].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args2-True-True-defined, not tested].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args2-True-True-defined, not tested].txt
new file mode 100644
index 00000000000..d262038ba82
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args2-True-True-defined, not tested].txt
@@ -0,0 +1,2 @@
+[yellow]defined, not tested[/yellow]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_rh_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_santiment_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_si_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_smartstake_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_tradier_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_twitter_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args0-False-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args0-False-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args0-False-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args1-False-False-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args1-False-False-defined, test failed].txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args2-True-True-defined, test failed].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args2-True-True-defined, test failed].txt
new file mode 100644
index 00000000000..aff58ff3b92
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args2-True-True-defined, test failed].txt
@@ -0,0 +1,2 @@
+[red]defined, test failed[/red]
+
diff --git a/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args3-False-True-not defined].txt b/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args3-False-True-not defined].txt
new file mode 100644
index 00000000000..4c535d16d4e
--- /dev/null
+++ b/tests/openbb_terminal/txt/test_keys_model/test_set_walert_key[args3-False-True-not defined].txt
@@ -0,0 +1,2 @@
+[grey30]not defined[/grey30]
+