Files
OpenBB/openbb_terminal/cryptocurrency/overview/tokenterminal_model.py
montezdesousa 475ebb5acd [WIP] Migrate user, feature flags and configurations to dataclass (#4309)
* implement user and change is guest

* replace User methods

* move remaining functions to user

* fix bug

* portfolio test

* fix tests

* fix tests

* uncomment skip

* ruff

* start credentials model implementation

* change deault structure

* refacto quandl

* change default struct and file names

* bug

* start using global user

* add comments

* move update flair

* change cfg references in keys model

* reddit & fmp

* refactore additional keys

* remaing config keys

* remove unsude imports and fix hub keys

* ruff

* fix line too long

* unblock unittests

* fix keys model tests

* remove os patch

* fix account controller tests

* fix account controller tests

* fix account model

* account fixed

* fix user tests

* User Model

* User Model

* User Model

* Move session folder

* User Model : grouping the models

* User Model : fix bugs

* Config Plot + bug fix

* User Model : Refactoring plots

* Feature flags

* Remove dup

* clean comments a fix some vars

* fix feature flags controller

* refactor obbff from settings controller

* refactor a bunch of obbff variables

* fix bug blocking terminal

* fix integration tests

* refactor controllers with obbff

* refactor remaining ffs

* remove comments

* log not started

* mispelled variable

* set current user on local model

* User Model : moving files + updating

* User Preferences

* User : Refactor is_guest function + bug fix

* User : refactor is_guest function

* Fix conftest.py

* remove lost obbffs

* typo on fileoverwrite

* Plot config: move variables and start plot dpi

* User : tests

* refactor plot dpi references

* remove plot dpi imports

* refactor some config terminal leftover

* /account/sync : fix bug

* remove configs reload

* start path refactor

* installation paths vs user paths

* remove cfg_plot

* Tests : User Refactoring

* user prefix only for preferences

* user prefix only for preferences

* move user paths

* remove comment

* update apply remote configs

* fix tz not updating

* save some copys

* small fix

* create interface for credentials and preferences

* wrong docstrings fixed

* ruff core

* fix some pref setting

* login is better

* ruff

* ruff

* remove Literal

* add small comment

* Tests : User Refactoring

* Credentials Model : add DataBento

* Fix helper_funcs

* Fixing code

* Tests : fixing

* User Model : freezing the models

* Fixed Income + Databento

* Tests : fixing keys

* black

* ruff

* Tests : user model

* Tests : user model

* Fix linting

* Fix linting

* Linting

* Linting

* Fixing code and tests

* Fix tests

* mypy

* SDK

* Clean ruff cache

* Fix syntax issue

* Update fred_view

* Black

* Linting

* Update code

* Update tests

* Linting

* Linting

* Tests

* Black

* Linting

* Linting

* Mock os.listdir to avoid looking for file that doesnt exist

* Mock options paths

* lint

* Tests : fix

* Code : update

* Tests + Linting

* Tests

* Ruff

* Code : update

* Tests

* Code : update

* Fix workflow

* Code : update

---------

Co-authored-by: Chavithra PARANA <chavithra@gmail.com>
Co-authored-by: luqazino@gmail.com <luqazino@gmail.com>
Co-authored-by: James Maslek <jmaslek11@gmail.com>
2023-03-05 00:37:19 +01:00

302 lines
7.0 KiB
Python

"""Token Terminal Model"""
import logging
from typing import List
import pandas as pd
from tokenterminal import TokenTerminal
from openbb_terminal.core.session.current_user import get_current_user
from openbb_terminal.decorators import log_start_end
logger = logging.getLogger(__name__)
token_terminal = TokenTerminal(
key=get_current_user().credentials.API_TOKEN_TERMINAL_KEY
)
# Fetch all data for projects'
try:
PROJECTS_DATA = token_terminal.get_all_projects()
except Exception as e:
logger.error(e)
PROJECTS_DATA = [
"0x",
"1inch",
"88mph",
"aave",
"abracadabra-money",
"alchemist",
"alchemix-finance",
"algorand",
"alpha-finance",
"arweave",
"autofarm",
"avalanche",
"axie-infinity",
"balancer",
"bancor",
"barnbridge",
"basket-dao",
"benqi",
"binance-smart-chain",
"bitcoin",
"cap",
"cardano",
"centrifuge",
"clipper",
"compound",
"convex-finance",
"cosmos",
"cryptex",
"curve",
"decentral-games",
"decred",
"dforce",
"dhedge",
"dodo",
"dogecoin",
"dydx",
"ellipsis-finance",
"elrond",
"enzyme-finance",
"erasure-protocol",
"ethereum",
"ethereum-name-service",
"euler",
"fantom",
"fei-protocol",
"filecoin",
"futureswap",
"gmx",
"goldfinch",
"harvest-finance",
"helium",
"hurricaneswap",
"idle-finance",
"index-cooperative",
"instadapp",
"integral-protocol",
"karura",
"keeperdao",
"keep-network",
"kusama",
"kyber",
"lido-finance",
"liquity",
"litecoin",
"livepeer",
"looksrare",
"loopring",
"maiar",
"makerdao",
"maple-finance",
"mcdex",
"metamask",
"mstable",
"near-protocol",
"nexus-mutual",
"nftx",
"notional-finance",
"opensea",
"optimism",
"osmosis",
"pancakeswap",
"pangolin",
"perpetual-protocol",
"piedao",
"pocket-network",
"polkadot",
"polygon",
"polymarket",
"pooltogether",
"powerpool",
"quickswap",
"rarible",
"rari-capital",
"reflexer",
"ren",
"ribbon-finance",
"rocket-pool",
"saddle-finance",
"set-protocol",
"solana",
"solend",
"spookyswap",
"stake-dao",
"stellar",
"sushiswap",
"synthetix",
"terra",
"tezos",
"the-graph",
"thorchain",
"tokemak",
"tokenlon",
"tornado-cash",
"trader-joe",
"uma",
"uniswap",
"unit-protocol",
"venus",
"vesper-finance",
"volmex",
"wakaswap",
"yearn-finance",
"yield-guild-games",
"yield-yak",
"zcash",
"zora",
]
TIMELINES = ["24h", "7d", "30d", "90d", "180d", "365d"]
CATEGORIES = [
"Asset Management",
"Blockchain",
"DeFi",
"Exchange",
"Gaming",
"Insurance",
"Interoperability",
"Lending",
"NFT",
"Other",
"Prediction Market",
"Stablecoin",
]
METRICS = [
"twitter_followers",
"gmv_annualized",
"market_cap",
"take_rate",
"revenue",
"revenue_protocol",
"tvl",
"pe",
"pe_circulating",
"ps",
"ps_circulating",
]
@log_start_end(log=logger)
def get_possible_timelines() -> List[str]:
"""This function returns the available timelines.
Returns
-------
List[str]
A list with the available timelines values.
"""
return TIMELINES
@log_start_end(log=logger)
def get_possible_categories() -> List[str]:
"""This function returns the available categories.
Returns
-------
List[str]
A list with the available categories values.
"""
return CATEGORIES
@log_start_end(log=logger)
def get_possible_metrics() -> List[str]:
"""This function returns the available metrics.
Returns
-------
List[str]
A list with the available metrics values.
"""
return METRICS
@log_start_end(log=logger)
def get_fundamental_metrics(
metric: str,
category: str = "",
timeline: str = "24h",
ascend: bool = False,
) -> pd.Series:
"""Get fundamental metrics [Source: Token Terminal]
Parameters
----------
metric : str
The metric of interest. See `get_possible_metrics()` for available metrics.
category : str
The category of interest. See `get_possible_categories()` for available categories.
The default value is an empty string which means that all categories are considered.
timeline : str
The category of interest. See `get_possible_timelines()` for available timelines.
ascend : bool
Direction of the sort. If True, the data is sorted in ascending order.
Returns
-------
pd.Series
Project, Metric value
"""
metric_values = {}
for project in PROJECTS_DATA:
if category and (
(
"," in project["category_tags"]
and category in project["category_tags"].split(",")
)
or project["category_tags"] == category
):
# check that is in metrics with a timeline
if metric in [
"revenue",
"revenue_protocol",
"tvl",
"pe",
"pe_circulating",
"ps",
"ps_circulating",
]:
val = project[metric + "_" + timeline]
else:
val = project[metric]
if isinstance(val, (float, int)):
if project["symbol"]:
metric_values[f"{project['name']} ({project['symbol']})"] = float(
val
)
else:
metric_values[f"{project['name']}"] = float(val)
else:
# check that is in metrics with a timeline
if metric in [
"revenue",
"revenue_protocol",
"tvl",
"pe",
"pe_circulating",
"ps",
"ps_circulating",
]:
val = project[metric + "_" + timeline]
else:
val = project[metric]
if isinstance(val, (float, int)):
if project["symbol"]:
metric_values[f"{project['name']} ({project['symbol']})"] = float(
val
)
else:
metric_values[f"{project['name']}"] = float(val)
metric_values = dict(
sorted(metric_values.items(), key=lambda item: item[1], reverse=not ascend)
)
return pd.Series(metric_values)