diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d6af7e5b343..1c5bc1d0bd3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,7 +10,7 @@ repos: - id: check-merge-conflict - id: detect-private-key - repo: https://github.com/psf/black - rev: 21.11b1 + rev: 22.1.0 hooks: - id: black - repo: https://github.com/pycqa/flake8 diff --git a/gamestonk_terminal/alternative/covid/covid_model.py b/gamestonk_terminal/alternative/covid/covid_model.py index a1fcc4ebbf7..5f2be31dcfc 100644 --- a/gamestonk_terminal/alternative/covid/covid_model.py +++ b/gamestonk_terminal/alternative/covid/covid_model.py @@ -1,10 +1,15 @@ """Covid Model""" __docformat__ = "numpy" +import logging import warnings -import pandas as pd -import numpy as np +import numpy as np +import pandas as pd + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) global_cases_time_series = ( "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_" @@ -16,6 +21,7 @@ global_deaths_time_series = ( ) +@log_start_end(log=logger) def get_global_cases(country: str) -> pd.DataFrame: """Get historical cases for given country @@ -44,6 +50,7 @@ def get_global_cases(country: str) -> pd.DataFrame: return cases +@log_start_end(log=logger) def get_global_deaths(country: str) -> pd.DataFrame: """Get historical deaths for given country @@ -72,6 +79,7 @@ def get_global_deaths(country: str) -> pd.DataFrame: return deaths +@log_start_end(log=logger) def get_case_slopes(days_back: int = 30, threshold: int = 10000) -> pd.DataFrame: """Load cases and find slope over period diff --git a/gamestonk_terminal/alternative/covid/covid_view.py b/gamestonk_terminal/alternative/covid/covid_view.py index 14283006b80..33294521b5f 100644 --- a/gamestonk_terminal/alternative/covid/covid_view.py +++ b/gamestonk_terminal/alternative/covid/covid_view.py @@ -1,23 +1,28 @@ """Covid View""" __docformat__ = "numpy" +import logging import os import matplotlib.dates as mdates import matplotlib.pyplot as plt import pandas as pd -from gamestonk_terminal.rich_config import console import gamestonk_terminal.feature_flags as gtff from gamestonk_terminal.alternative.covid import covid_model from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( - plot_autoscale, export_data, + plot_autoscale, print_rich_table, ) +from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_covid_ov( country, raw: bool = False, limit: int = 10, export: str = "" ) -> None: @@ -82,6 +87,7 @@ def display_covid_ov( export_data(export, os.path.dirname(os.path.abspath(__file__)), "ov", ov) +@log_start_end(log=logger) def display_covid_stat( country, stat: str = "cases", raw: bool = False, limit: int = 10, export: str = "" ) -> None: @@ -150,6 +156,7 @@ def display_covid_stat( export_data(export, os.path.dirname(os.path.abspath(__file__)), stat, data) +@log_start_end(log=logger) def display_country_slopes( days_back: int = 30, limit: int = 10, diff --git a/gamestonk_terminal/common/behavioural_analysis/finbrain_model.py b/gamestonk_terminal/common/behavioural_analysis/finbrain_model.py index 7b08659c93d..3101cff15e2 100644 --- a/gamestonk_terminal/common/behavioural_analysis/finbrain_model.py +++ b/gamestonk_terminal/common/behavioural_analysis/finbrain_model.py @@ -1,10 +1,17 @@ """FinBrain Model""" __docformat__ = "numpy" +import logging + import pandas as pd import requests +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_sentiment(ticker: str) -> pd.DataFrame: """Gets Sentiment analysis provided by FinBrain's API [Source: finbrain] diff --git a/gamestonk_terminal/common/behavioural_analysis/finbrain_view.py b/gamestonk_terminal/common/behavioural_analysis/finbrain_view.py index 63a5bd650cb..78faed483b1 100644 --- a/gamestonk_terminal/common/behavioural_analysis/finbrain_view.py +++ b/gamestonk_terminal/common/behavioural_analysis/finbrain_view.py @@ -1,32 +1,39 @@ """FinBrain View Module""" __docformat__ = "numpy" +import logging import os -from matplotlib import pyplot as plt + import matplotlib.dates as mdates -import pandas as pd -from pandas.plotting import register_matplotlib_converters import numpy as np -from gamestonk_terminal.helper_funcs import ( - plot_autoscale, - export_data, - print_rich_table, -) +import pandas as pd +from matplotlib import pyplot as plt +from pandas.plotting import register_matplotlib_converters + +from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.behavioural_analysis import finbrain_model from gamestonk_terminal.config_plot import PLOT_DPI -from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import ( + export_data, + plot_autoscale, + print_rich_table, +) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) register_matplotlib_converters() +@log_start_end(log=logger) def sentiment_coloring(val: float, last_val: float) -> str: if float(val) > last_val: return f"[green]{val}[/green]" return f"[red]{val}[/red]" +@log_start_end(log=logger) def plot_sentiment(sentiment: pd.DataFrame, ticker: str) -> None: """Plot Sentiment analysis provided by FinBrain's API @@ -83,6 +90,7 @@ def plot_sentiment(sentiment: pd.DataFrame, ticker: str) -> None: plt.show() +@log_start_end(log=logger) def display_sentiment_analysis(ticker: str, export: str = ""): """Sentiment analysis from FinBrain diff --git a/gamestonk_terminal/common/behavioural_analysis/finnhub_model.py b/gamestonk_terminal/common/behavioural_analysis/finnhub_model.py index 95ff851ae52..22a972d341f 100644 --- a/gamestonk_terminal/common/behavioural_analysis/finnhub_model.py +++ b/gamestonk_terminal/common/behavioural_analysis/finnhub_model.py @@ -1,11 +1,18 @@ """Finnhub Model""" __docformat__ = "numpy" +import logging from typing import Dict + import requests + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_sentiment_stats(ticker: str) -> Dict: """Get sentiment stats [Source: finnhub] diff --git a/gamestonk_terminal/common/behavioural_analysis/finnhub_view.py b/gamestonk_terminal/common/behavioural_analysis/finnhub_view.py index 1a1e61f0c89..e9fec97ac8c 100644 --- a/gamestonk_terminal/common/behavioural_analysis/finnhub_view.py +++ b/gamestonk_terminal/common/behavioural_analysis/finnhub_view.py @@ -1,15 +1,20 @@ """Finnhub View""" __docformat__ = "numpy" +import logging import os import pandas as pd -from gamestonk_terminal.helper_funcs import export_data from gamestonk_terminal.common.behavioural_analysis import finnhub_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_sentiment_stats(ticker: str, export: str = ""): """ Sentiment stats which displays buzz, news score, articles last week, articles weekly average, diff --git a/gamestonk_terminal/common/behavioural_analysis/google_model.py b/gamestonk_terminal/common/behavioural_analysis/google_model.py index 407892fc865..6dc73672b23 100644 --- a/gamestonk_terminal/common/behavioural_analysis/google_model.py +++ b/gamestonk_terminal/common/behavioural_analysis/google_model.py @@ -1,10 +1,17 @@ """Google Model""" __docformat__ = "numpy" +import logging + import pandas as pd from pytrends.request import TrendReq +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_mentions(ticker: str) -> pd.DataFrame: """Get interest over time from google api [Source: google] @@ -23,6 +30,7 @@ def get_mentions(ticker: str) -> pd.DataFrame: return pytrend.interest_over_time() +@log_start_end(log=logger) def get_regions(ticker: str) -> pd.DataFrame: """Get interest by region from google api [Source: google] @@ -41,6 +49,7 @@ def get_regions(ticker: str) -> pd.DataFrame: return pytrend.interest_by_region() +@log_start_end(log=logger) def get_queries(ticker: str) -> pd.DataFrame: """Get related queries from google api [Source: google] @@ -59,6 +68,7 @@ def get_queries(ticker: str) -> pd.DataFrame: return pytrend.related_queries() +@log_start_end(log=logger) def get_rise(ticker: str) -> pd.DataFrame: """Get top rising related queries with this stock's query [Source: google] diff --git a/gamestonk_terminal/common/behavioural_analysis/google_view.py b/gamestonk_terminal/common/behavioural_analysis/google_view.py index b6898bff9dc..41e1694a777 100644 --- a/gamestonk_terminal/common/behavioural_analysis/google_view.py +++ b/gamestonk_terminal/common/behavioural_analysis/google_view.py @@ -1,21 +1,27 @@ """Google View""" __docformat__ = "numpy" +import logging import os from datetime import datetime import matplotlib.pyplot as plt +from gamestonk_terminal import config_plot as cfp +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.common.behavioural_analysis import google_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( - plot_autoscale, export_data, + plot_autoscale, print_rich_table, ) -from gamestonk_terminal.common.behavioural_analysis import google_model -from gamestonk_terminal import config_plot as cfp, feature_flags as gtff from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_mentions(ticker: str, start: datetime, export: str = ""): """Plot weekly bars of stock's interest over time. other users watchlist. [Source: Google] @@ -64,6 +70,7 @@ def display_mentions(ticker: str, start: datetime, export: str = ""): ) +@log_start_end(log=logger) def display_regions(ticker: str, num: int = 5, export: str = ""): """Plot bars of regions based on stock's interest. [Source: Google] @@ -98,6 +105,7 @@ def display_regions(ticker: str, num: int = 5, export: str = ""): export_data(export, os.path.dirname(os.path.abspath(__file__)), "regions", df) +@log_start_end(log=logger) def display_queries(ticker: str, num: int = 5, export: str = ""): """Print top related queries with this stock's query. [Source: Google] @@ -126,6 +134,7 @@ def display_queries(ticker: str, num: int = 5, export: str = ""): export_data(export, os.path.dirname(os.path.abspath(__file__)), "queries", df) +@log_start_end(log=logger) def display_rise(ticker: str, num: int, export: str = ""): """Print top rising related queries with this stock's query. [Source: Google] diff --git a/gamestonk_terminal/common/behavioural_analysis/reddit_model.py b/gamestonk_terminal/common/behavioural_analysis/reddit_model.py index d0f751ab791..1b7636611e5 100644 --- a/gamestonk_terminal/common/behavioural_analysis/reddit_model.py +++ b/gamestonk_terminal/common/behavioural_analysis/reddit_model.py @@ -1,17 +1,23 @@ """Reddit Model""" __docformat__ = "numpy" -from typing import List, Dict, Tuple +import logging from datetime import datetime, timedelta -import pandas as pd -from prawcore.exceptions import ResponseException -from requests import HTTPError -from psaw import PushshiftAPI -import praw +from typing import Dict, List, Tuple + import finviz +import pandas as pd +import praw +from prawcore.exceptions import ResponseException +from psaw import PushshiftAPI +from requests import HTTPError + from gamestonk_terminal import config_terminal as cfg -from gamestonk_terminal.rich_config import console from gamestonk_terminal.common.behavioural_analysis.reddit_helpers import find_tickers +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) l_sub_reddits = [ "Superstonk", @@ -27,6 +33,7 @@ l_sub_reddits = [ # pylint:disable=inconsistent-return-statements +@log_start_end(log=logger) def get_watchlists( n_to_get: int, ) -> Tuple[List[praw.models.reddit.submission.Submission], Dict, int]: @@ -95,6 +102,7 @@ def get_watchlists( return subs, d_watchlist_tickers, n_flair_posts_found +@log_start_end(log=logger) def get_popular_tickers( n_top: int, posts_to_look_at: int, subreddits: str = "" ) -> pd.DataFrame: @@ -229,6 +237,7 @@ def get_popular_tickers( return popular_tickers_df +@log_start_end(log=logger) def get_spac_community( limit: int, popular: bool ) -> Tuple[List[praw.models.reddit.submission.Submission], Dict]: @@ -298,6 +307,7 @@ def get_spac_community( return subs, d_watchlist_tickers +@log_start_end(log=logger) def get_spac( limit: int = 5, ) -> Tuple[List[praw.models.reddit.submission.Submission], Dict, int]: @@ -374,6 +384,7 @@ def get_spac( return subs, d_watchlist_tickers, n_flair_posts_found +@log_start_end(log=logger) def get_wsb_community( limit: int = 10, new: bool = False ) -> List[praw.models.reddit.submission.Submission]: @@ -415,6 +426,7 @@ def get_wsb_community( return subs +@log_start_end(log=logger) def get_due_dilligence( ticker: str, limit: int = 5, n_days: int = 3, show_all_flairs: bool = False ) -> List[praw.models.reddit.submission.Submission]: diff --git a/gamestonk_terminal/common/behavioural_analysis/reddit_view.py b/gamestonk_terminal/common/behavioural_analysis/reddit_view.py index 9e03ba12b34..99293ec9584 100644 --- a/gamestonk_terminal/common/behavioural_analysis/reddit_view.py +++ b/gamestonk_terminal/common/behavioural_analysis/reddit_view.py @@ -1,20 +1,25 @@ """Reddit View""" __docformat__ = "numpy" +import logging import os import warnings from datetime import datetime from typing import Dict import finviz -import praw import pandas as pd +import praw from gamestonk_terminal.common.behavioural_analysis import reddit_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def print_and_record_reddit_post( submissions_dict: Dict, submission: praw.models.reddit.submission.Submission ): @@ -68,6 +73,7 @@ def print_and_record_reddit_post( console.print("\n") +@log_start_end(log=logger) def display_watchlist(num: int): """Print other users watchlist. [Source: Reddit] @@ -105,6 +111,7 @@ def display_watchlist(num: int): console.print("") +@log_start_end(log=logger) def display_popular_tickers( n_top: int = 10, posts_to_look_at: int = 50, subreddits: str = "", export: str = "" ): @@ -143,6 +150,7 @@ def display_popular_tickers( ) +@log_start_end(log=logger) def display_spac_community(limit: int = 10, popular: bool = False): """Look at tickers mentioned in r/SPACs [Source: Reddit] @@ -183,6 +191,7 @@ def display_spac_community(limit: int = 10, popular: bool = False): console.print("") +@log_start_end(log=logger) def display_spac(limit: int = 5): """Look at posts containing 'spac' in top communities @@ -220,6 +229,7 @@ def display_spac(limit: int = 5): console.print("") +@log_start_end(log=logger) def display_wsb_community(limit: int = 10, new: bool = False): """Show WSB posts @@ -236,6 +246,7 @@ def display_wsb_community(limit: int = 10, new: bool = False): print_and_record_reddit_post({}, sub) +@log_start_end(log=logger) def display_due_diligence( ticker: str, limit: int = 10, n_days: int = 3, show_all_flairs: bool = False ): diff --git a/gamestonk_terminal/common/behavioural_analysis/sentimentinvestor_model.py b/gamestonk_terminal/common/behavioural_analysis/sentimentinvestor_model.py index 5c660797aa5..454bdcf0fe9 100644 --- a/gamestonk_terminal/common/behavioural_analysis/sentimentinvestor_model.py +++ b/gamestonk_terminal/common/behavioural_analysis/sentimentinvestor_model.py @@ -3,12 +3,16 @@ __docformat__ = "numpy" from typing import Union, Dict from datetime import datetime, timedelta -import requests +import logging import pandas as pd - +import requests from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_historical(ticker: str, start: str, end: str, number: int) -> pd.DataFrame: """Get hour-level sentiment data for the chosen ticker diff --git a/gamestonk_terminal/common/behavioural_analysis/sentimentinvestor_view.py b/gamestonk_terminal/common/behavioural_analysis/sentimentinvestor_view.py index 5add59eb9e6..f7a0ef6a6cb 100644 --- a/gamestonk_terminal/common/behavioural_analysis/sentimentinvestor_view.py +++ b/gamestonk_terminal/common/behavioural_analysis/sentimentinvestor_view.py @@ -1,19 +1,25 @@ """SentimentInvestor View""" __docformat__ = "numpy" +import logging import os from datetime import datetime import matplotlib.dates as mdates from matplotlib import pyplot as plt import pandas as pd -from gamestonk_terminal.common.behavioural_analysis import sentimentinvestor_model -from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.common.behavioural_analysis import sentimentinvestor_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table # pylint: disable=E1101 +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def display_historical( ticker: str, start: str, diff --git a/gamestonk_terminal/common/behavioural_analysis/stocktwits_model.py b/gamestonk_terminal/common/behavioural_analysis/stocktwits_model.py index cd3653e76f6..9b20532c59d 100644 --- a/gamestonk_terminal/common/behavioural_analysis/stocktwits_model.py +++ b/gamestonk_terminal/common/behavioural_analysis/stocktwits_model.py @@ -1,12 +1,18 @@ """Stocktwits Model""" __docformat__ = "numpy" -from typing import Tuple, List, Dict +import logging +from typing import Dict, List, Tuple import pandas as pd import requests +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_bullbear(ticker: str) -> Tuple[int, int, int, int]: """Gets bullbear sentiment for ticker [Source: stocktwits] @@ -44,6 +50,7 @@ def get_bullbear(ticker: str) -> Tuple[int, int, int, int]: return 0, 0, 0, 0 +@log_start_end(log=logger) def get_messages(ticker: str, limit: int = 30) -> List[str]: """Get last messages for a given ticker [Source: stocktwits] @@ -71,6 +78,7 @@ def get_messages(ticker: str, limit: int = 30) -> List[str]: return messages +@log_start_end(log=logger) def get_trending() -> pd.DataFrame: """Get trending tickers from stocktwits [Source: stocktwits] @@ -95,6 +103,7 @@ def get_trending() -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def get_stalker(user: str, limit: int = 30) -> List[Dict]: """Gets messages from given user [Source: stocktwits] diff --git a/gamestonk_terminal/common/behavioural_analysis/stocktwits_view.py b/gamestonk_terminal/common/behavioural_analysis/stocktwits_view.py index 6c24e78c9ce..436f164d1e3 100644 --- a/gamestonk_terminal/common/behavioural_analysis/stocktwits_view.py +++ b/gamestonk_terminal/common/behavioural_analysis/stocktwits_view.py @@ -1,13 +1,19 @@ """Stocktwits View""" __docformat__ = "numpy" +import logging + import pandas as pd from gamestonk_terminal.common.behavioural_analysis import stocktwits_model -from gamestonk_terminal.rich_config import console +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import print_rich_table +from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_bullbear(ticker: str): """ Print bullbear sentiment based on last 30 messages on the board. @@ -29,6 +35,7 @@ def display_bullbear(ticker: str): console.print("") +@log_start_end(log=logger) def display_messages(ticker: str, limit: int = 30): """Print up to 30 of the last messages on the board. [Source: Stocktwits] @@ -49,6 +56,7 @@ def display_messages(ticker: str, limit: int = 30): ) +@log_start_end(log=logger) def display_trending(): """Show trensing stocks on stocktwits""" df_trending = stocktwits_model.get_trending() @@ -61,6 +69,7 @@ def display_trending(): console.print("") +@log_start_end(log=logger) def display_stalker(user: str, limit: int = 10): """Show last posts for given user diff --git a/gamestonk_terminal/common/behavioural_analysis/twitter_model.py b/gamestonk_terminal/common/behavioural_analysis/twitter_model.py index 78e6840ccee..79998cdcdbe 100644 --- a/gamestonk_terminal/common/behavioural_analysis/twitter_model.py +++ b/gamestonk_terminal/common/behavioural_analysis/twitter_model.py @@ -1,6 +1,7 @@ """Twitter Model""" __docformat__ = "numpy" +import logging from typing import Optional import pandas as pd @@ -8,12 +9,16 @@ import requests from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import clean_tweet, get_data from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + analyzer = SentimentIntensityAnalyzer() +@log_start_end(log=logger) def load_analyze_tweets( ticker: str, count: int, diff --git a/gamestonk_terminal/common/behavioural_analysis/twitter_view.py b/gamestonk_terminal/common/behavioural_analysis/twitter_view.py index 3231698373a..8af7ea946ba 100644 --- a/gamestonk_terminal/common/behavioural_analysis/twitter_view.py +++ b/gamestonk_terminal/common/behavioural_analysis/twitter_view.py @@ -1,23 +1,26 @@ """Twitter view""" __docformat__ = "numpy" +import logging import os from datetime import datetime, timedelta - import matplotlib.pyplot as plt import numpy as np import pandas as pd - from dateutil import parser as dparse +import gamestonk_terminal.config_plot as cfg_plot from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.behavioural_analysis import twitter_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale -import gamestonk_terminal.config_plot as cfg_plot from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_inference(ticker: str, num: int, export: str = ""): """Infer sentiment from past n tweets @@ -65,6 +68,7 @@ def display_inference(ticker: str, num: int, export: str = ""): export_data(export, os.path.dirname(os.path.abspath(__file__)), "infer", df_tweets) +@log_start_end(log=logger) def display_sentiment(ticker: str, n_tweets: int, n_days_past: int, export: str = ""): """Plot sentiments from ticker diff --git a/gamestonk_terminal/common/newsapi_view.py b/gamestonk_terminal/common/newsapi_view.py index 8260c3ee90f..919c1294acd 100644 --- a/gamestonk_terminal/common/newsapi_view.py +++ b/gamestonk_terminal/common/newsapi_view.py @@ -1,12 +1,18 @@ """ News View """ __docformat__ = "numpy" +import logging + import requests from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def news( term: str, num: int, diff --git a/gamestonk_terminal/common/prediction_techniques/arima_model.py b/gamestonk_terminal/common/prediction_techniques/arima_model.py index 40946aeb6a7..72491e10227 100644 --- a/gamestonk_terminal/common/prediction_techniques/arima_model.py +++ b/gamestonk_terminal/common/prediction_techniques/arima_model.py @@ -1,14 +1,21 @@ """Arima Prediction Model""" __docformat__ = "numpy" -from typing import Union, List, Tuple, Any +import logging +from typing import Any, List, Tuple, Union + import pandas as pd import pmdarima from statsmodels.tsa.arima.model import ARIMA +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) + ICS = ["aic", "aicc", "bic", "hqic", "oob"] +@log_start_end(log=logger) def get_arima_model( values: Union[pd.Series, pd.DataFrame], arima_order: str, diff --git a/gamestonk_terminal/common/prediction_techniques/arima_view.py b/gamestonk_terminal/common/prediction_techniques/arima_view.py index 1ec2cf13f1d..9e4117574c8 100644 --- a/gamestonk_terminal/common/prediction_techniques/arima_view.py +++ b/gamestonk_terminal/common/prediction_techniques/arima_view.py @@ -3,6 +3,7 @@ __docformat__ = "numpy" import datetime +import logging import os from typing import Union @@ -17,6 +18,7 @@ from gamestonk_terminal.common.prediction_techniques.pred_helper import ( print_pretty_prediction, ) from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, get_next_stock_market_days, @@ -25,12 +27,14 @@ from gamestonk_terminal.helper_funcs import ( ) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) register_matplotlib_converters() # pylint:disable=too-many-arguments +@log_start_end(log=logger) def display_arima( dataset: str, values: Union[pd.DataFrame, pd.Series], diff --git a/gamestonk_terminal/common/prediction_techniques/ets_model.py b/gamestonk_terminal/common/prediction_techniques/ets_model.py index 78653f2ab5a..6cc3a2d0d9d 100644 --- a/gamestonk_terminal/common/prediction_techniques/ets_model.py +++ b/gamestonk_terminal/common/prediction_techniques/ets_model.py @@ -1,16 +1,22 @@ """ETS Prediction Model""" __docformat__ = "numpy" +import logging from typing import Union import numpy as np import pandas as pd from statsmodels.tsa.holtwinters import ExponentialSmoothing +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) + TRENDS = ["N", "A", "Ad"] SEASONS = ["N", "A", "M"] +@log_start_end(log=logger) def get_exponential_smoothing_model( data: Union[pd.Series, np.ndarray], trend: str = "N", diff --git a/gamestonk_terminal/common/prediction_techniques/ets_view.py b/gamestonk_terminal/common/prediction_techniques/ets_view.py index d9fc3041dd8..73c97748ff9 100644 --- a/gamestonk_terminal/common/prediction_techniques/ets_view.py +++ b/gamestonk_terminal/common/prediction_techniques/ets_view.py @@ -2,13 +2,13 @@ __docformat__ = "numpy" import datetime +import logging import os import warnings from typing import Union -import matplotlib.pyplot as plt import matplotlib.dates as mdates - +import matplotlib.pyplot as plt import numpy as np import pandas as pd from pandas.plotting import register_matplotlib_converters @@ -21,6 +21,7 @@ from gamestonk_terminal.common.prediction_techniques.pred_helper import ( print_pretty_prediction, ) from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, get_next_stock_market_days, @@ -29,12 +30,15 @@ from gamestonk_terminal.helper_funcs import ( ) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() warnings.filterwarnings("ignore") # pylint:disable=too-many-arguments +@log_start_end(log=logger) def display_exponential_smoothing( ticker: str, values: Union[pd.DataFrame, pd.Series], diff --git a/gamestonk_terminal/common/prediction_techniques/knn_model.py b/gamestonk_terminal/common/prediction_techniques/knn_model.py index d222df29469..76ac915e5bc 100644 --- a/gamestonk_terminal/common/prediction_techniques/knn_model.py +++ b/gamestonk_terminal/common/prediction_techniques/knn_model.py @@ -1,18 +1,24 @@ """KNN Prediction Model""" __docformat__ = "numpy" -from typing import Tuple, Any, Union -import pandas as pd +import logging +from typing import Any, Tuple, Union + import numpy as np +import pandas as pd from sklearn import neighbors -from gamestonk_terminal.helper_funcs import get_next_stock_market_days from gamestonk_terminal.common.prediction_techniques.pred_helper import ( prepare_scale_train_valid_test, ) +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import get_next_stock_market_days from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_knn_model_data( data: Union[pd.Series, pd.DataFrame], n_input_days: int, diff --git a/gamestonk_terminal/common/prediction_techniques/knn_view.py b/gamestonk_terminal/common/prediction_techniques/knn_view.py index 5b63f03687f..2aeda21b10a 100644 --- a/gamestonk_terminal/common/prediction_techniques/knn_view.py +++ b/gamestonk_terminal/common/prediction_techniques/knn_view.py @@ -1,23 +1,28 @@ """ KNN Prediction View""" __docformat__ = "numpy" +import logging from typing import Union import pandas as pd from pandas.plotting import register_matplotlib_converters -from gamestonk_terminal.common.prediction_techniques.pred_helper import ( - print_pretty_prediction, - plot_data_predictions, -) from gamestonk_terminal.common.prediction_techniques import knn_model +from gamestonk_terminal.common.prediction_techniques.pred_helper import ( + plot_data_predictions, + print_pretty_prediction, +) +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() # pylint:disable=too-many-arguments +@log_start_end(log=logger) def display_k_nearest_neighbors( ticker: str, data: Union[pd.DataFrame, pd.Series], diff --git a/gamestonk_terminal/common/prediction_techniques/mc_model.py b/gamestonk_terminal/common/prediction_techniques/mc_model.py index 6401e9e8526..d7f7b5914b1 100644 --- a/gamestonk_terminal/common/prediction_techniques/mc_model.py +++ b/gamestonk_terminal/common/prediction_techniques/mc_model.py @@ -1,14 +1,21 @@ """Monte Carlo Model""" __docformat__ = "numpy" +import logging from typing import Union -import pandas as pd + import numpy as np +import pandas as pd from scipy.stats import norm +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) + DISTRIBUTIONS = ["normal", "lognormal"] +@log_start_end(log=logger) def get_mc_brownian( data: Union[pd.Series, np.ndarray], n_future: int, n_sims: int, use_log=True ) -> np.ndarray: diff --git a/gamestonk_terminal/common/prediction_techniques/mc_view.py b/gamestonk_terminal/common/prediction_techniques/mc_view.py index b01c35f0c68..6e8d004d597 100644 --- a/gamestonk_terminal/common/prediction_techniques/mc_view.py +++ b/gamestonk_terminal/common/prediction_techniques/mc_view.py @@ -1,26 +1,31 @@ """Monte Carlo View""" __docformat__ = "numpy" -from typing import Union +import logging import os +from typing import Union -import pandas as pd -import numpy as np -import seaborn as sns -import matplotlib.pyplot as plt import matplotlib.dates as mdates +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import seaborn as sns -from gamestonk_terminal.common.prediction_techniques import mc_model -from gamestonk_terminal.helper_funcs import ( - plot_autoscale, - get_next_stock_market_days, - export_data, -) -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.common.prediction_techniques import mc_model +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import ( + export_data, + get_next_stock_market_days, + plot_autoscale, +) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_mc_forecast( data: Union[pd.Series, np.ndarray], n_future: int, diff --git a/gamestonk_terminal/common/prediction_techniques/neural_networks_model.py b/gamestonk_terminal/common/prediction_techniques/neural_networks_model.py index cf84f426b28..f598a14101e 100644 --- a/gamestonk_terminal/common/prediction_techniques/neural_networks_model.py +++ b/gamestonk_terminal/common/prediction_techniques/neural_networks_model.py @@ -1,39 +1,44 @@ """Neural Network Prediction Models""" __docformat__ = "numpy" -from typing import List, Any, Union, Tuple -import pandas as pd +import logging +from typing import Any, List, Tuple, Union + import numpy as np +import pandas as pd from tensorflow.keras.callbacks import EarlyStopping -from tensorflow.keras.models import Sequential from tensorflow.keras.layers import ( LSTM, - SimpleRNN, + AvgPool1D, + Conv1D, Dense, Dropout, - Conv1D, - MaxPool1D, - AvgPool1D, Flatten, + MaxPool1D, + SimpleRNN, ) +from tensorflow.keras.models import Sequential from tensorflow.keras.optimizers import ( + SGD, + Adadelta, + Adagrad, Adam, Adamax, - Adagrad, - Adadelta, Ftrl, Nadam, RMSprop, - SGD, -) -from gamestonk_terminal.helper_funcs import get_next_stock_market_days -from gamestonk_terminal.common.prediction_techniques.pred_helper import ( - prepare_scale_train_valid_test, - forecast, ) + from gamestonk_terminal import config_neural_network_models as cfg_nn_models +from gamestonk_terminal.common.prediction_techniques.pred_helper import ( + forecast, + prepare_scale_train_valid_test, +) +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import get_next_stock_market_days from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) optimizers = { "Adam": Adam, @@ -56,6 +61,7 @@ else: # pylint:disable=too-many-arguments +@log_start_end(log=logger) def build_neural_network_model( Layers: List[Any], n_inputs: int, n_days: int ) -> Sequential: @@ -136,6 +142,7 @@ def build_neural_network_model( return model +@log_start_end(log=logger) def mlp_model( data: Union[pd.Series, pd.DataFrame], n_input: int, @@ -256,6 +263,7 @@ def mlp_model( return forecast_data_df, preds, y_valid, y_dates_valid, scaler +@log_start_end(log=logger) def rnn_model( data: Union[pd.Series, pd.DataFrame], n_input: int, @@ -369,6 +377,7 @@ def rnn_model( return forecast_data_df, preds, y_valid, y_dates_valid, scaler +@log_start_end(log=logger) def lstm_model( data: Union[pd.Series, pd.DataFrame], n_input: int, @@ -482,6 +491,7 @@ def lstm_model( return forecast_data_df, preds, y_valid, y_dates_valid, scaler +@log_start_end(log=logger) def conv1d_model( data: Union[pd.Series, pd.DataFrame], n_input: int, diff --git a/gamestonk_terminal/common/prediction_techniques/neural_networks_view.py b/gamestonk_terminal/common/prediction_techniques/neural_networks_view.py index 85671317c39..91329831e47 100644 --- a/gamestonk_terminal/common/prediction_techniques/neural_networks_view.py +++ b/gamestonk_terminal/common/prediction_techniques/neural_networks_view.py @@ -1,20 +1,27 @@ """ Neural Networks View""" __docformat__ = "numpy" +import logging from typing import Union + import numpy as np import pandas as pd +from gamestonk_terminal.common.prediction_techniques import neural_networks_model from gamestonk_terminal.common.prediction_techniques.pred_helper import ( plot_data_predictions, print_pretty_prediction, ) -from gamestonk_terminal.common.prediction_techniques import neural_networks_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console # pylint:disable=too-many-arguments +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def display_mlp( dataset: str, data: Union[pd.Series, pd.DataFrame], @@ -97,6 +104,7 @@ def display_mlp( console.print("") +@log_start_end(log=logger) def display_rnn( dataset: str, data: Union[pd.Series, pd.DataFrame], @@ -178,6 +186,7 @@ def display_rnn( console.print("") +@log_start_end(log=logger) def display_lstm( dataset: str, data: Union[pd.Series, pd.DataFrame], @@ -259,6 +268,7 @@ def display_lstm( console.print("") +@log_start_end(log=logger) def display_conv1d( dataset: str, data: Union[pd.Series, pd.DataFrame], diff --git a/gamestonk_terminal/common/prediction_techniques/regression_model.py b/gamestonk_terminal/common/prediction_techniques/regression_model.py index 9227a2e2f22..e0c6c39ce80 100644 --- a/gamestonk_terminal/common/prediction_techniques/regression_model.py +++ b/gamestonk_terminal/common/prediction_techniques/regression_model.py @@ -1,16 +1,22 @@ """Regression Model""" __docformat__ = "numpy" -from typing import Tuple, List, Any, Union -import pandas as pd +import logging +from typing import Any, List, Tuple, Union + import numpy as np -from sklearn import linear_model -from sklearn import pipeline -from sklearn import preprocessing +import pandas as pd +from sklearn import linear_model, pipeline, preprocessing + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console # The tsxv dependence was removed so this fails. Taking from didiers source +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def split_train( sequence: np.ndarray, numInputs: int, numOutputs: int, numJumps: int ) -> Tuple[List, List]: @@ -64,6 +70,7 @@ def split_train( return X, y +@log_start_end(log=logger) def get_regression_model( values: Union[pd.Series, pd.DataFrame], poly_order: int, diff --git a/gamestonk_terminal/common/prediction_techniques/regression_view.py b/gamestonk_terminal/common/prediction_techniques/regression_view.py index 2528d8f840e..132c1c3b859 100644 --- a/gamestonk_terminal/common/prediction_techniques/regression_view.py +++ b/gamestonk_terminal/common/prediction_techniques/regression_view.py @@ -1,35 +1,39 @@ """ Regression View""" __docformat__ = "numpy" -from typing import Union +import logging import os +from typing import Union + import matplotlib.pyplot as plt import pandas as pd from pandas.plotting import register_matplotlib_converters -from gamestonk_terminal.helper_funcs import ( - patch_pandas_text_adjustment, - get_next_stock_market_days, - plot_autoscale, - export_data, -) - +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.common.prediction_techniques import regression_model from gamestonk_terminal.common.prediction_techniques.pred_helper import ( - print_pretty_prediction, price_prediction_backtesting_color, print_prediction_kpis, + print_pretty_prediction, ) - -from gamestonk_terminal.common.prediction_techniques import regression_model from gamestonk_terminal.config_plot import PLOT_DPI -from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import ( + export_data, + get_next_stock_market_days, + patch_pandas_text_adjustment, + plot_autoscale, +) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() # pylint:disable=too-many-arguments +@log_start_end(log=logger) def display_regression( dataset: str, values: Union[pd.Series, pd.DataFrame], diff --git a/gamestonk_terminal/common/quantitative_analysis/qa_model.py b/gamestonk_terminal/common/quantitative_analysis/qa_model.py index d9254b47eaf..d3b557db733 100644 --- a/gamestonk_terminal/common/quantitative_analysis/qa_model.py +++ b/gamestonk_terminal/common/quantitative_analysis/qa_model.py @@ -1,6 +1,7 @@ """Quantitative Analysis Model""" __docformat__ = "numpy" +import logging import warnings from typing import Any, Tuple @@ -10,10 +11,16 @@ from scipy import stats from statsmodels.tsa.seasonal import seasonal_decompose from statsmodels.tsa.stattools import adfuller, kpss +from gamestonk_terminal.decorators import log_start_end + # TODO : Since these are common/ they should be independent of 'stock' info. # df_stock should be replaced with a generic df and a column variable +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_summary(df: pd.DataFrame) -> pd.DataFrame: """Print summary statistics @@ -29,6 +36,7 @@ def get_summary(df: pd.DataFrame) -> pd.DataFrame: return df_stats +@log_start_end(log=logger) def get_seasonal_decomposition( df: pd.DataFrame, multiplicative: bool ) -> Tuple[Any, pd.DataFrame, pd.DataFrame]: @@ -65,6 +73,7 @@ def get_seasonal_decomposition( return result, pd.DataFrame(cycle), pd.DataFrame(trend) +@log_start_end(log=logger) def get_normality(data: pd.DataFrame) -> pd.DataFrame: """ Look at the distribution of returns and generate statistics on the relation to the normal curve. @@ -118,6 +127,7 @@ def get_normality(data: pd.DataFrame) -> pd.DataFrame: ) +@log_start_end(log=logger) def get_unitroot(df: pd.DataFrame, fuller_reg: str, kpss_reg: str) -> pd.DataFrame: """Calculate test statistics for unit roots diff --git a/gamestonk_terminal/common/quantitative_analysis/qa_view.py b/gamestonk_terminal/common/quantitative_analysis/qa_view.py index d423020f271..f24fe401018 100644 --- a/gamestonk_terminal/common/quantitative_analysis/qa_view.py +++ b/gamestonk_terminal/common/quantitative_analysis/qa_view.py @@ -1,35 +1,38 @@ """Quantitative Analysis View""" __docformat__ = "numpy" +import logging import os import warnings -from typing import Any from datetime import datetime +from typing import Any -import matplotlib.pyplot as plt -import matplotlib.dates as mdates import matplotlib -from matplotlib import gridspec - +import matplotlib.dates as mdates +import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns import statsmodels.api as sm from detecta import detect_cusum +from matplotlib import gridspec from pandas.plotting import register_matplotlib_converters from scipy import stats from statsmodels.graphics.gofplots import qqplot -from gamestonk_terminal.rich_config import console from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.quantitative_analysis import qa_model from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_classes import LineAnnotateDrawer from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) -from gamestonk_terminal.helper_classes import LineAnnotateDrawer +from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) register_matplotlib_converters() @@ -37,6 +40,7 @@ register_matplotlib_converters() # df_stock should be replaced with a generic df and a column variable +@log_start_end(log=logger) def color_red(val: Any) -> str: """Adds red to dataframe value""" if val > 0.05: @@ -44,6 +48,7 @@ def color_red(val: Any) -> str: return round(val, 4) +@log_start_end(log=logger) def display_summary(df: pd.DataFrame, export: str): """Show summary statistics @@ -72,6 +77,7 @@ def display_summary(df: pd.DataFrame, export: str): ) +@log_start_end(log=logger) def display_hist( name: str, df: pd.DataFrame, @@ -114,6 +120,7 @@ def display_hist( console.print("") +@log_start_end(log=logger) def display_cdf( name: str, df: pd.DataFrame, @@ -194,6 +201,7 @@ def display_cdf( ) +@log_start_end(log=logger) def display_bw( name: str, df: pd.DataFrame, @@ -254,6 +262,7 @@ def display_bw( console.print("") +@log_start_end(log=logger) def display_acf(name: str, df: pd.DataFrame, target: str, lags: int): """Show Auto and Partial Auto Correlation of returns and change in returns @@ -304,6 +313,7 @@ def display_acf(name: str, df: pd.DataFrame, target: str, lags: int): console.print("") +@log_start_end(log=logger) def display_cusum(df: pd.DataFrame, target: str, threshold: float, drift: float): """Cumulative sum algorithm (CUSUM) to detect abrupt changes in data @@ -325,6 +335,7 @@ def display_cusum(df: pd.DataFrame, target: str, threshold: float, drift: float) console.print("") +@log_start_end(log=logger) def display_seasonal( name: str, df: pd.DataFrame, @@ -409,6 +420,7 @@ def display_seasonal( ) +@log_start_end(log=logger) def display_normality(df: pd.DataFrame, target: str, export: str = ""): """View normality statistics @@ -443,6 +455,7 @@ def display_normality(df: pd.DataFrame, target: str, export: str = ""): ) +@log_start_end(log=logger) def display_qqplot(name: str, df: pd.DataFrame, target: str): """Show QQ plot for data against normal quantiles @@ -472,6 +485,7 @@ def display_qqplot(name: str, df: pd.DataFrame, target: str): console.print("") +@log_start_end(log=logger) def display_unitroot( df: pd.DataFrame, target: str, fuller_reg: str, kpss_reg: str, export: str = "" ): @@ -508,6 +522,7 @@ def display_unitroot( ) +@log_start_end(log=logger) def display_raw( df: pd.DataFrame, sort: str = "", des: bool = False, num: int = 20, export: str = "" ) -> None: @@ -551,6 +566,7 @@ def display_raw( console.print("") +@log_start_end(log=logger) def display_line( data: pd.Series, title: str = "", diff --git a/gamestonk_terminal/common/quantitative_analysis/rolling_model.py b/gamestonk_terminal/common/quantitative_analysis/rolling_model.py index 5e4bd290eb1..f71b84b7124 100644 --- a/gamestonk_terminal/common/quantitative_analysis/rolling_model.py +++ b/gamestonk_terminal/common/quantitative_analysis/rolling_model.py @@ -1,12 +1,18 @@ """Rolling Statistics""" __docformat__ = "numpy" +import logging from typing import Tuple import pandas as pd import pandas_ta as ta +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_rolling_avg(df: pd.DataFrame, length: int) -> Tuple[pd.DataFrame, pd.DataFrame]: """Return rolling mean and standard deviation @@ -30,6 +36,7 @@ def get_rolling_avg(df: pd.DataFrame, length: int) -> Tuple[pd.DataFrame, pd.Dat return pd.DataFrame(rolling_mean), pd.DataFrame(rolling_std) +@log_start_end(log=logger) def get_spread(df: pd.DataFrame, length: int) -> Tuple[pd.DataFrame, pd.DataFrame]: """Standard Deviation and Variance @@ -57,6 +64,7 @@ def get_spread(df: pd.DataFrame, length: int) -> Tuple[pd.DataFrame, pd.DataFram return pd.DataFrame(df_sd), pd.DataFrame(df_var) +@log_start_end(log=logger) def get_quantile( df: pd.DataFrame, length: int, quantile_pct: float ) -> Tuple[pd.DataFrame, pd.DataFrame]: @@ -88,6 +96,7 @@ def get_quantile( return pd.DataFrame(df_med), pd.DataFrame(df_quantile) +@log_start_end(log=logger) def get_skew(df: pd.DataFrame, length: int) -> pd.DataFrame: """Skewness Indicator @@ -107,6 +116,7 @@ def get_skew(df: pd.DataFrame, length: int) -> pd.DataFrame: return df_skew +@log_start_end(log=logger) def get_kurtosis(df: pd.DataFrame, length: int) -> pd.DataFrame: """Kurtosis Indicator diff --git a/gamestonk_terminal/common/quantitative_analysis/rolling_view.py b/gamestonk_terminal/common/quantitative_analysis/rolling_view.py index 285ecd43393..788c465eff1 100644 --- a/gamestonk_terminal/common/quantitative_analysis/rolling_view.py +++ b/gamestonk_terminal/common/quantitative_analysis/rolling_view.py @@ -1,6 +1,7 @@ """Rolling Statistics View""" __docformat__ = "numpy" +import logging import os import matplotlib.pyplot as plt @@ -10,12 +11,16 @@ from pandas.plotting import register_matplotlib_converters from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.quantitative_analysis import rolling_model from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def display_mean_std( name: str, df: pd.DataFrame, target: str, length: int, export: str = "" ): @@ -86,6 +91,7 @@ def display_mean_std( ) +@log_start_end(log=logger) def display_spread( name: str, df: pd.DataFrame, target: str, length: int, export: str = "" ): @@ -147,6 +153,7 @@ def display_spread( ) +@log_start_end(log=logger) def display_quantile( name: str, df: pd.DataFrame, @@ -203,6 +210,7 @@ def display_quantile( ) +@log_start_end(log=logger) def display_skew( name: str, df: pd.DataFrame, target: str, length: int, export: str = "" ): @@ -256,6 +264,7 @@ def display_skew( ) +@log_start_end(log=logger) def display_kurtosis( name: str, df: pd.DataFrame, target: str, length: int, export: str = "" ): diff --git a/gamestonk_terminal/common/technical_analysis/custom_indicators_model.py b/gamestonk_terminal/common/technical_analysis/custom_indicators_model.py index b38f5f59ff8..8181fb1a261 100644 --- a/gamestonk_terminal/common/technical_analysis/custom_indicators_model.py +++ b/gamestonk_terminal/common/technical_analysis/custom_indicators_model.py @@ -1,13 +1,18 @@ """Custom Indicator Models""" __docformat__ = "numpy" +import logging from typing import Any, Tuple import pandas as pd +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def calculate_fib_levels( df_stock: pd.DataFrame, period: int = 120, diff --git a/gamestonk_terminal/common/technical_analysis/custom_indicators_view.py b/gamestonk_terminal/common/technical_analysis/custom_indicators_view.py index 2cb274ec1f5..d80dc13d526 100644 --- a/gamestonk_terminal/common/technical_analysis/custom_indicators_view.py +++ b/gamestonk_terminal/common/technical_analysis/custom_indicators_view.py @@ -1,6 +1,7 @@ """Custom TA indicators""" __docformat__ = "numpy" +import logging import os from typing import Any @@ -10,6 +11,7 @@ import pandas as pd from gamestonk_terminal import config_plot as cfp from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.technical_analysis import custom_indicators_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, @@ -17,7 +19,10 @@ from gamestonk_terminal.helper_funcs import ( ) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def fibonacci_retracement( df_stock: pd.DataFrame, period: int = 120, diff --git a/gamestonk_terminal/common/technical_analysis/momentum_model.py b/gamestonk_terminal/common/technical_analysis/momentum_model.py index 6bc77c05bac..88f1c5a89aa 100644 --- a/gamestonk_terminal/common/technical_analysis/momentum_model.py +++ b/gamestonk_terminal/common/technical_analysis/momentum_model.py @@ -1,10 +1,17 @@ """Momentum Technical Analysis""" __docformat__ = "numpy" +import logging + import pandas as pd import pandas_ta as ta +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def cci( high_vals: pd.Series, low_vals: pd.Series, @@ -43,6 +50,7 @@ def cci( ) +@log_start_end(log=logger) def macd( values: pd.DataFrame, n_fast: int = 12, @@ -71,6 +79,7 @@ def macd( ) +@log_start_end(log=logger) def rsi(values: pd.Series, length: int, scalar: float, drift: int) -> pd.DataFrame: """Relative strength index @@ -95,6 +104,7 @@ def rsi(values: pd.Series, length: int, scalar: float, drift: int) -> pd.DataFra ) +@log_start_end(log=logger) def stoch( high_vals: pd.Series, low_vals: pd.Series, @@ -136,6 +146,7 @@ def stoch( ) +@log_start_end(log=logger) def fisher(high_vals: pd.Series, low_vals: pd.Series, length: int = 14) -> pd.DataFrame: """Fisher Transform @@ -156,6 +167,7 @@ def fisher(high_vals: pd.Series, low_vals: pd.Series, length: int = 14) -> pd.Da return pd.DataFrame(ta.fisher(high=high_vals, low=low_vals, length=length).dropna()) +@log_start_end(log=logger) def cg(values: pd.Series, length: int) -> pd.DataFrame: """Center of gravity diff --git a/gamestonk_terminal/common/technical_analysis/momentum_view.py b/gamestonk_terminal/common/technical_analysis/momentum_view.py index b8b4c5c2b80..303ddd868a1 100644 --- a/gamestonk_terminal/common/technical_analysis/momentum_view.py +++ b/gamestonk_terminal/common/technical_analysis/momentum_view.py @@ -1,6 +1,7 @@ """Momentum View""" __docformat__ = "numpy" +import logging import os import matplotlib.pyplot as plt @@ -11,12 +12,16 @@ from pandas.plotting import register_matplotlib_converters from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.technical_analysis import momentum_model from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def display_cci( df: pd.DataFrame, length: int = 14, @@ -81,6 +86,7 @@ def display_cci( ) +@log_start_end(log=logger) def display_macd( values: pd.Series, n_fast: int = 12, @@ -147,6 +153,7 @@ def display_macd( ) +@log_start_end(log=logger) def display_rsi( prices: pd.Series, length: int = 14, @@ -212,6 +219,7 @@ def display_rsi( ) +@log_start_end(log=logger) def display_stoch( df_stock: pd.DataFrame, fastkperiod: int = 14, @@ -289,6 +297,7 @@ def display_stoch( ) +@log_start_end(log=logger) def display_fisher( df_stock: pd.DataFrame, length: int = 14, @@ -367,6 +376,7 @@ def display_fisher( ) +@log_start_end(log=logger) def display_cg( values: pd.Series, length: int = 14, diff --git a/gamestonk_terminal/common/technical_analysis/overlap_model.py b/gamestonk_terminal/common/technical_analysis/overlap_model.py index b4c7e45a6ed..cfd65f3834d 100644 --- a/gamestonk_terminal/common/technical_analysis/overlap_model.py +++ b/gamestonk_terminal/common/technical_analysis/overlap_model.py @@ -1,13 +1,20 @@ """Overlap Technical Analysis""" ___docformat__ = "numpy" +import logging + import pandas as pd import pandas_ta as ta +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) + WINDOW_LENGTHS = [20, 50] WINDOW_LENGTHS2 = [10, 20] +@log_start_end(log=logger) def ema(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: """Gets exponential moving average (EMA) for stock @@ -28,6 +35,7 @@ def ema(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: return pd.DataFrame(ta.ema(values, length=length, offset=offset)).dropna() +@log_start_end(log=logger) def sma(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: """Gets simple moving average (EMA) for stock @@ -48,6 +56,7 @@ def sma(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: return pd.DataFrame(ta.sma(values, length=length, offset=offset)).dropna() +@log_start_end(log=logger) def wma(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: """Gets weighted moving average (WMA) for stock @@ -68,6 +77,7 @@ def wma(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: return pd.DataFrame(ta.wma(values, length=length, offset=offset)).dropna() +@log_start_end(log=logger) def hma(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: """Gets hull moving average (HMA) for stock @@ -88,6 +98,7 @@ def hma(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: return pd.DataFrame(ta.hma(values, length=length, offset=offset)).dropna() +@log_start_end(log=logger) def zlma(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: """Gets zero-lagged exponential moving average (ZLEMA) for stock @@ -108,6 +119,7 @@ def zlma(values: pd.DataFrame, length: int, offset: int) -> pd.DataFrame: return pd.DataFrame(ta.zlma(values, length=length, offset=offset)).dropna() +@log_start_end(log=logger) def vwap(day_df: pd.DataFrame, offset: int) -> pd.DataFrame: """Gets volume weighted average price (VWAP) diff --git a/gamestonk_terminal/common/technical_analysis/overlap_view.py b/gamestonk_terminal/common/technical_analysis/overlap_view.py index f630199800c..cf4f0f9d028 100644 --- a/gamestonk_terminal/common/technical_analysis/overlap_view.py +++ b/gamestonk_terminal/common/technical_analysis/overlap_view.py @@ -1,6 +1,7 @@ """TA Overlap View""" __docformat__ = "numpy" +import logging import os from typing import List @@ -12,12 +13,16 @@ from pandas.plotting import register_matplotlib_converters import gamestonk_terminal.feature_flags as gtff from gamestonk_terminal.common.technical_analysis import overlap_model from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def view_ma( values: pd.Series, length: List[int] = None, @@ -98,6 +103,7 @@ def view_ma( ) +@log_start_end(log=logger) def view_vwap( s_ticker: str, df_stock: pd.DataFrame, diff --git a/gamestonk_terminal/common/technical_analysis/trend_indicators_model.py b/gamestonk_terminal/common/technical_analysis/trend_indicators_model.py index f1cf7df3729..01e2351fbe4 100644 --- a/gamestonk_terminal/common/technical_analysis/trend_indicators_model.py +++ b/gamestonk_terminal/common/technical_analysis/trend_indicators_model.py @@ -1,10 +1,17 @@ """Trend Indicators Technical Analysis Model""" __docformat__ = "numpy" +import logging + import pandas as pd import pandas_ta as ta +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def adx( high_values: pd.Series, low_values: pd.Series, @@ -47,6 +54,7 @@ def adx( ) +@log_start_end(log=logger) def aroon( high_values: pd.Series, low_values: pd.Series, length: int = 25, scalar: int = 100 ) -> pd.DataFrame: diff --git a/gamestonk_terminal/common/technical_analysis/trend_indicators_view.py b/gamestonk_terminal/common/technical_analysis/trend_indicators_view.py index aaca67b351d..67d4f558da0 100644 --- a/gamestonk_terminal/common/technical_analysis/trend_indicators_view.py +++ b/gamestonk_terminal/common/technical_analysis/trend_indicators_view.py @@ -1,6 +1,7 @@ """Trend Indicators View""" __docformat__ = "numpy" +import logging import os import matplotlib.pyplot as plt @@ -10,12 +11,16 @@ from pandas.plotting import register_matplotlib_converters from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.technical_analysis import trend_indicators_model from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def display_adx( df_stock: pd.DataFrame, length: int = 14, @@ -93,6 +98,7 @@ def display_adx( ) +@log_start_end(log=logger) def display_aroon( df_stock: pd.DataFrame, length: int = 25, diff --git a/gamestonk_terminal/common/technical_analysis/volatility_model.py b/gamestonk_terminal/common/technical_analysis/volatility_model.py index 6f0b997381c..6bcd9db1332 100644 --- a/gamestonk_terminal/common/technical_analysis/volatility_model.py +++ b/gamestonk_terminal/common/technical_analysis/volatility_model.py @@ -1,12 +1,19 @@ """Volatility Technical Indicators""" __docformat__ = "numpy" +import logging + import pandas as pd import pandas_ta as ta +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) + MAMODES = ["ema", "sma", "wma", "hma", "zlma"] +@log_start_end(log=logger) def bbands( close_values: pd.Series, length: int = 15, n_std: float = 2, mamode: str = "ema" ) -> pd.DataFrame: @@ -38,6 +45,7 @@ def bbands( ).dropna() +@log_start_end(log=logger) def donchian( high_prices: pd.Series, low_prices: pd.Series, @@ -72,6 +80,7 @@ def donchian( ) +@log_start_end(log=logger) def kc( high_prices: pd.Series, low_prices: pd.Series, diff --git a/gamestonk_terminal/common/technical_analysis/volatility_view.py b/gamestonk_terminal/common/technical_analysis/volatility_view.py index b90f313098c..c002f547461 100644 --- a/gamestonk_terminal/common/technical_analysis/volatility_view.py +++ b/gamestonk_terminal/common/technical_analysis/volatility_view.py @@ -1,6 +1,7 @@ """Volatility Technical Indicators View""" __docformat__ = "numpy" +import logging import os import matplotlib.pyplot as plt @@ -10,12 +11,16 @@ from pandas.plotting import register_matplotlib_converters from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.technical_analysis import volatility_model from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def display_bbands( df_stock: pd.DataFrame, length: int = 15, @@ -82,6 +87,7 @@ def display_bbands( ) +@log_start_end(log=logger) def display_donchian( df_stock: pd.DataFrame, upper_length: int = 20, @@ -149,6 +155,7 @@ def display_donchian( ) +@log_start_end(log=logger) def view_kc( df_stock: pd.DataFrame, length: int = 20, diff --git a/gamestonk_terminal/common/technical_analysis/volume_model.py b/gamestonk_terminal/common/technical_analysis/volume_model.py index 4b78cf19072..9646890eff7 100644 --- a/gamestonk_terminal/common/technical_analysis/volume_model.py +++ b/gamestonk_terminal/common/technical_analysis/volume_model.py @@ -1,10 +1,17 @@ """Volume Technical Analysis""" __docformat__ = "numpy" +import logging + import pandas as pd import pandas_ta as ta +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def ad(df_stock: pd.DataFrame, use_open: bool = False) -> pd.DataFrame: """Calculate AD technical indicator @@ -39,6 +46,7 @@ def ad(df_stock: pd.DataFrame, use_open: bool = False) -> pd.DataFrame: return pd.DataFrame(df_ta) +@log_start_end(log=logger) def adosc( df_stock: pd.DataFrame, use_open: bool = False, fast: int = 3, slow: int = 10 ) -> pd.DataFrame: @@ -78,6 +86,7 @@ def adosc( return pd.DataFrame(df_ta) +@log_start_end(log=logger) def obv(df_stock: pd.DataFrame) -> pd.DataFrame: """On Balance Volume diff --git a/gamestonk_terminal/common/technical_analysis/volume_view.py b/gamestonk_terminal/common/technical_analysis/volume_view.py index 7e165ebb397..b417394c71e 100644 --- a/gamestonk_terminal/common/technical_analysis/volume_view.py +++ b/gamestonk_terminal/common/technical_analysis/volume_view.py @@ -1,20 +1,26 @@ """Volume View""" __docformat__ = "numpy" +import logging import os import matplotlib.pyplot as plt import pandas as pd from pandas.plotting import register_matplotlib_converters + from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.common.technical_analysis import volume_model from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def display_ad( df_stock: pd.DataFrame, use_open: bool = False, @@ -95,6 +101,7 @@ def display_ad( ) +@log_start_end(log=logger) def display_adosc( df_stock: pd.DataFrame, fast: int = 3, @@ -180,6 +187,7 @@ def display_adosc( ) +@log_start_end(log=logger) def display_obv(df_stock: pd.DataFrame, s_ticker: str = "", export: str = ""): """Plot OBV technical indicator diff --git a/gamestonk_terminal/cryptocurrency/defi/coindix_model.py b/gamestonk_terminal/cryptocurrency/defi/coindix_model.py index 530508fbf67..c79332069b7 100644 --- a/gamestonk_terminal/cryptocurrency/defi/coindix_model.py +++ b/gamestonk_terminal/cryptocurrency/defi/coindix_model.py @@ -1,10 +1,15 @@ """Coindix model""" __docformat__ = "numpy" +import logging from typing import Optional -import requests import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) VAULTS_FILTERS = ["name", "chain", "protocol", "apy", "tvl", "risk", "link"] CHAINS = [ @@ -65,6 +70,7 @@ VAULT_KINDS = [ ] +@log_start_end(log=logger) def _risk_mapper(risk_level: int) -> str: """Helper methods Parameters @@ -81,6 +87,7 @@ def _risk_mapper(risk_level: int) -> str: return mappings.get(risk_level, "Non Eligible") +@log_start_end(log=logger) def _prepare_params(**kwargs) -> dict: """Helper method, which handles preparation of parameters for requests to coindix api. @@ -103,6 +110,7 @@ def _prepare_params(**kwargs) -> dict: return {k: v.lower() for k, v in params.items()} +@log_start_end(log=logger) def get_defi_vaults( chain: Optional[str] = None, protocol: Optional[str] = None, diff --git a/gamestonk_terminal/cryptocurrency/defi/coindix_view.py b/gamestonk_terminal/cryptocurrency/defi/coindix_view.py index 836cbd2e451..3e64ed228b7 100644 --- a/gamestonk_terminal/cryptocurrency/defi/coindix_view.py +++ b/gamestonk_terminal/cryptocurrency/defi/coindix_view.py @@ -1,10 +1,12 @@ """Coindix view""" __docformat__ = "numpy" +import logging import os from typing import Optional from gamestonk_terminal.cryptocurrency.defi import coindix_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, long_number_format, @@ -12,7 +14,10 @@ from gamestonk_terminal.helper_funcs import ( ) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_defi_vaults( chain: Optional[str] = None, protocol: Optional[str] = None, diff --git a/gamestonk_terminal/cryptocurrency/defi/defipulse_model.py b/gamestonk_terminal/cryptocurrency/defi/defipulse_model.py index 46d638807b5..d8578983406 100644 --- a/gamestonk_terminal/cryptocurrency/defi/defipulse_model.py +++ b/gamestonk_terminal/cryptocurrency/defi/defipulse_model.py @@ -1,11 +1,18 @@ """DeFi Pulse model""" __docformat__ = "numpy" +import logging + +import pandas as pd import requests from bs4 import BeautifulSoup -import pandas as pd + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_defipulse_index() -> pd.DataFrame: """Scrapes data from DeFi Pulse with all DeFi Pulse crypto protocols. [Source: https://defipulse.com/] diff --git a/gamestonk_terminal/cryptocurrency/defi/defipulse_view.py b/gamestonk_terminal/cryptocurrency/defi/defipulse_view.py index b968042fc65..5bcfab04a22 100644 --- a/gamestonk_terminal/cryptocurrency/defi/defipulse_view.py +++ b/gamestonk_terminal/cryptocurrency/defi/defipulse_view.py @@ -1,12 +1,18 @@ """DeFi Pulse view""" __docformat__ = "numpy" +import logging import os + from gamestonk_terminal.cryptocurrency.defi import defipulse_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_defipulse(top: int, sortby: str, descend: bool, export: str = "") -> None: """Displays all DeFi Pulse crypto protocols. [Source: https://defipulse.com/] diff --git a/gamestonk_terminal/cryptocurrency/defi/defirate_model.py b/gamestonk_terminal/cryptocurrency/defi/defirate_model.py index 41fdb7d0de4..e30cbf5039b 100644 --- a/gamestonk_terminal/cryptocurrency/defi/defirate_model.py +++ b/gamestonk_terminal/cryptocurrency/defi/defirate_model.py @@ -1,12 +1,19 @@ """DeFi Rate model""" __docformat__ = "numpy" +import logging + +import pandas as pd import requests from bs4 import BeautifulSoup from bs4.element import Tag -import pandas as pd + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def _scrape_defirate(url: str, current: bool = True) -> Tag: """Helper method that scrapes table object from defirate.com [Source: https://defirate.com/] @@ -36,6 +43,7 @@ def _scrape_defirate(url: str, current: bool = True) -> Tag: return table +@log_start_end(log=logger) def get_funding_rates(current: bool = True) -> pd.DataFrame: """Funding rates are transfer payments made between long and short positions on perpetual swap futures markets. They’re designed to keep contract prices consistent with the underlying asset. @@ -63,6 +71,7 @@ def get_funding_rates(current: bool = True) -> pd.DataFrame: return pd.DataFrame(columns=headers, data=fundings) +@log_start_end(log=logger) def get_lending_rates(current: bool = True) -> pd.DataFrame: """Decentralized Finance lending – or DeFi lending for short – allows users to supply cryptocurrencies in exchange for earning an annualized return. @@ -92,6 +101,7 @@ def get_lending_rates(current: bool = True) -> pd.DataFrame: return pd.DataFrame(columns=headers, data=lendings) +@log_start_end(log=logger) def get_borrow_rates(current: bool = True) -> pd.DataFrame: """One aspect of Decentralized Finance (DeFi) is the ability to take out a loan on top cryptocurrencies at any time in an entirely permissionless fashion.By using smart contracts, borrowers are able to lock collateral to protect diff --git a/gamestonk_terminal/cryptocurrency/defi/defirate_view.py b/gamestonk_terminal/cryptocurrency/defi/defirate_view.py index fee810ddc34..69a503d9aac 100644 --- a/gamestonk_terminal/cryptocurrency/defi/defirate_view.py +++ b/gamestonk_terminal/cryptocurrency/defi/defirate_view.py @@ -1,12 +1,18 @@ """DeFi Rate View""" __docformat__ = "numpy" +import logging import os -from gamestonk_terminal.helper_funcs import export_data, print_rich_table + from gamestonk_terminal.cryptocurrency.defi import defirate_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_funding_rates(top: int, current: bool = True, export: str = "") -> None: """Display Funding rates - transfer payments made between long and short positions on perpetual swap futures markets [Source: https://defirate.com/] @@ -40,6 +46,7 @@ def display_funding_rates(top: int, current: bool = True, export: str = "") -> N ) +@log_start_end(log=logger) def display_lending_rates(top: int, current: bool = True, export: str = "") -> None: """Displays top DeFi lendings. Decentralized Finance lending – allows users to supply cryptocurrencies in exchange for earning an annualized return @@ -75,6 +82,7 @@ def display_lending_rates(top: int, current: bool = True, export: str = "") -> N ) +@log_start_end(log=logger) def display_borrow_rates(top: int, current: bool = True, export: str = "") -> None: """Displays DeFi borrow rates. By using smart contracts, borrowers are able to lock collateral to protect against defaults while seamlessly adding to or closing their diff --git a/gamestonk_terminal/cryptocurrency/defi/graph_model.py b/gamestonk_terminal/cryptocurrency/defi/graph_model.py index 5330c75ca09..b901d0a7727 100644 --- a/gamestonk_terminal/cryptocurrency/defi/graph_model.py +++ b/gamestonk_terminal/cryptocurrency/defi/graph_model.py @@ -2,12 +2,17 @@ __docformat__ = "numpy" import datetime -import requests +import logging + import pandas as pd +import requests from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( very_long_number_formatter, ) +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) UNI_URL = "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2" @@ -45,6 +50,7 @@ PAIRS_FILTERS = [ # TODO: convert USD values to int. otherwise sort by these columns won't work +@log_start_end(log=logger) def query_graph(url: str, query: str) -> dict: """Helper methods for querying graphql api. [Source: https://thegraph.com/en/] @@ -67,6 +73,7 @@ def query_graph(url: str, query: str) -> dict: return {} +@log_start_end(log=logger) def get_uni_tokens(skip: int = 0, limit: int = 100) -> pd.DataFrame: """Get list of tokens trade-able on Uniswap DEX. [Source: https://thegraph.com/en/] @@ -103,6 +110,7 @@ def get_uni_tokens(skip: int = 0, limit: int = 100) -> pd.DataFrame: return pd.DataFrame(data["tokens"]).reset_index() +@log_start_end(log=logger) def get_uniswap_stats() -> pd.DataFrame: """Get base statistics about Uniswap DEX. [Source: https://thegraph.com/en/] @@ -142,6 +150,7 @@ def get_uniswap_stats() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_uniswap_pool_recently_added( last_days: int = 14, min_volume: int = 100, @@ -230,6 +239,7 @@ def get_uniswap_pool_recently_added( ] +@log_start_end(log=logger) def get_uni_pools_by_volume() -> pd.DataFrame: """Get uniswap pools by volume. [Source: https://thegraph.com/en/] @@ -272,6 +282,7 @@ def get_uni_pools_by_volume() -> pd.DataFrame: ] +@log_start_end(log=logger) def get_last_uni_swaps(limit: int = 100) -> pd.DataFrame: """Get the last 100 swaps done on Uniswap [Source: https://thegraph.com/en/] diff --git a/gamestonk_terminal/cryptocurrency/defi/graph_view.py b/gamestonk_terminal/cryptocurrency/defi/graph_view.py index 5ea5e48953f..13cb4deb4de 100644 --- a/gamestonk_terminal/cryptocurrency/defi/graph_view.py +++ b/gamestonk_terminal/cryptocurrency/defi/graph_view.py @@ -1,15 +1,21 @@ """The Graph view""" __docformat__ = "numpy" +import logging import os -from gamestonk_terminal.cryptocurrency.defi import graph_model -from gamestonk_terminal.helper_funcs import export_data, print_rich_table + from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( very_long_number_formatter, ) +from gamestonk_terminal.cryptocurrency.defi import graph_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_uni_tokens( skip: int = 0, limit: int = 20, @@ -59,6 +65,7 @@ def display_uni_tokens( ) +@log_start_end(log=logger) def display_uni_stats(export: str = "") -> None: """Displays base statistics about Uniswap DEX. [Source: https://thegraph.com/en/] [Source: https://thegraph.com/en/] @@ -89,6 +96,7 @@ def display_uni_stats(export: str = "") -> None: ) +@log_start_end(log=logger) def display_recently_added( top: int = 20, days: int = 7, @@ -152,6 +160,7 @@ def display_recently_added( ) +@log_start_end(log=logger) def display_uni_pools( top: int = 20, sortby: str = "volumeUSD", descend: bool = False, export: str = "" ) -> None: @@ -189,6 +198,7 @@ def display_uni_pools( ) +@log_start_end(log=logger) def display_last_uni_swaps( top: int = 20, sortby: str = "timestamp", descend: bool = False, export: str = "" ) -> None: diff --git a/gamestonk_terminal/cryptocurrency/defi/llama_model.py b/gamestonk_terminal/cryptocurrency/defi/llama_model.py index 87449e1e778..59b2d49ac6e 100644 --- a/gamestonk_terminal/cryptocurrency/defi/llama_model.py +++ b/gamestonk_terminal/cryptocurrency/defi/llama_model.py @@ -1,11 +1,17 @@ """Llama model""" __docformat__ = "numpy" -from datetime import datetime +import logging import textwrap -import requests -import pandas as pd +from datetime import datetime + import numpy as np +import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) API_URL = "https://api.llama.fi" @@ -21,6 +27,7 @@ LLAMA_FILTERS = [ ] +@log_start_end(log=logger) def get_defi_protocols() -> pd.DataFrame: """Returns information about listed DeFi protocols, their current TVL and changes to it in the last hour/day/week. [Source: https://docs.llama.fi/api] @@ -62,6 +69,7 @@ def get_defi_protocols() -> pd.DataFrame: raise ValueError("Wrong response type\n") from e +@log_start_end(log=logger) def get_defi_protocol(protocol: str) -> pd.DataFrame: """Returns information about historical tvl of a defi protocol. [Source: https://docs.llama.fi/api] @@ -81,6 +89,7 @@ def get_defi_protocol(protocol: str) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_defi_tvl() -> pd.DataFrame: """Returns historical values of the total sum of TVLs from all listed protocols. [Source: https://docs.llama.fi/api] diff --git a/gamestonk_terminal/cryptocurrency/defi/llama_view.py b/gamestonk_terminal/cryptocurrency/defi/llama_view.py index 6cae8042063..4a3a4c5caa8 100644 --- a/gamestonk_terminal/cryptocurrency/defi/llama_view.py +++ b/gamestonk_terminal/cryptocurrency/defi/llama_view.py @@ -1,25 +1,33 @@ """Llama View""" __docformat__ = "numpy" +import logging import os -from matplotlib import ticker, dates as mdates + import matplotlib.pyplot as plt +from matplotlib import dates as mdates +from matplotlib import ticker + +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal.cryptocurrency.cryptocurrency_helpers import read_data_file from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( replace_underscores_in_column_names, ) from gamestonk_terminal.cryptocurrency.defi import llama_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, - plot_autoscale, long_number_format, + plot_autoscale, print_rich_table, ) -from gamestonk_terminal import feature_flags as gtff -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_grouped_defi_protocols(num: int = 50, export: str = "") -> None: """Display top dApps (in terms of TVL) grouped by chain. [Source: https://docs.llama.fi/api] @@ -65,6 +73,7 @@ def display_grouped_defi_protocols(num: int = 50, export: str = "") -> None: ) +@log_start_end(log=logger) def display_defi_protocols( top: int, sortby: str, descend: bool, description: bool, export: str = "" ) -> None: @@ -128,6 +137,7 @@ def display_defi_protocols( ) +@log_start_end(log=logger) def display_historical_tvl(dapps: str = "", export: str = ""): """Displays historical TVL of different dApps [Source: https://docs.llama.fi/api] @@ -179,6 +189,7 @@ def display_historical_tvl(dapps: str = "", export: str = ""): ) +@log_start_end(log=logger) def display_defi_tvl(top: int, export: str = "") -> None: """Displays historical values of the total sum of TVLs from all listed protocols. [Source: https://docs.llama.fi/api] diff --git a/gamestonk_terminal/cryptocurrency/defi/substack_model.py b/gamestonk_terminal/cryptocurrency/defi/substack_model.py index d831ef80a78..784ce567f03 100644 --- a/gamestonk_terminal/cryptocurrency/defi/substack_model.py +++ b/gamestonk_terminal/cryptocurrency/defi/substack_model.py @@ -1,16 +1,22 @@ """Substack model""" __docformat__ = "numpy" -import textwrap import concurrent.futures +import logging +import textwrap + import pandas as pd import requests from bs4 import BeautifulSoup from dateutil import parser +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def scrape_substack(url: str) -> list: """Helper method to scrape newsletters from substack. [Source: substack.com] @@ -42,6 +48,7 @@ def scrape_substack(url: str) -> list: return results +@log_start_end(log=logger) def get_newsletters() -> pd.DataFrame: """Scrape all substack newsletters from url list. [Source: substack.com] diff --git a/gamestonk_terminal/cryptocurrency/defi/substack_view.py b/gamestonk_terminal/cryptocurrency/defi/substack_view.py index cb3034cabd5..4fabe9f0434 100644 --- a/gamestonk_terminal/cryptocurrency/defi/substack_view.py +++ b/gamestonk_terminal/cryptocurrency/defi/substack_view.py @@ -2,12 +2,18 @@ __docformat__ = "numpy" +import logging import os + from gamestonk_terminal.cryptocurrency.defi import substack_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_newsletters(top: int = 10, export: str = "") -> None: """Display DeFi related substack newsletters. [Source: substack.com] diff --git a/gamestonk_terminal/cryptocurrency/defi/terraengineer_model.py b/gamestonk_terminal/cryptocurrency/defi/terraengineer_model.py index b982628268e..b6a1e408d2e 100644 --- a/gamestonk_terminal/cryptocurrency/defi/terraengineer_model.py +++ b/gamestonk_terminal/cryptocurrency/defi/terraengineer_model.py @@ -1,14 +1,21 @@ """Terra Engineer model""" __docformat__ = "numpy" -import requests +import logging + import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) api_url = "https://terra.engineer/en" ASSETS = ["ust", "luna", "sdt"] +@log_start_end(log=logger) def get_history_asset_from_terra_address( asset: str = "ust", address: str = "" ) -> pd.DataFrame: diff --git a/gamestonk_terminal/cryptocurrency/defi/terraengineer_view.py b/gamestonk_terminal/cryptocurrency/defi/terraengineer_view.py index 44001d2d167..ad6b52a7bae 100644 --- a/gamestonk_terminal/cryptocurrency/defi/terraengineer_view.py +++ b/gamestonk_terminal/cryptocurrency/defi/terraengineer_view.py @@ -1,19 +1,27 @@ """Terra Engineer View""" __docformat__ = "numpy" +import logging import os + import matplotlib.pyplot as plt -from matplotlib import ticker, dates as mdates -from gamestonk_terminal.cryptocurrency.defi import terraengineer_model -from gamestonk_terminal.helper_funcs import ( - export_data, - plot_autoscale, - long_number_format, -) +from matplotlib import dates as mdates +from matplotlib import ticker + from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.cryptocurrency.defi import terraengineer_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import ( + export_data, + long_number_format, + plot_autoscale, +) + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_terra_asset_history( asset: str = "", address: str = "", export: str = "" ) -> None: @@ -63,6 +71,7 @@ def display_terra_asset_history( ) +@log_start_end(log=logger) def display_anchor_yield_reserve(export: str = "") -> None: """Displays the 30-day history of the Anchor Yield Reserve. [Source: https://docs.llama.fi/api] diff --git a/gamestonk_terminal/cryptocurrency/defi/terramoney_fcd_model.py b/gamestonk_terminal/cryptocurrency/defi/terramoney_fcd_model.py index 3fae390733b..ba6fc0ea65d 100644 --- a/gamestonk_terminal/cryptocurrency/defi/terramoney_fcd_model.py +++ b/gamestonk_terminal/cryptocurrency/defi/terramoney_fcd_model.py @@ -1,16 +1,22 @@ """Terra Money FCD model""" __docformat__ = "numpy" +import logging import textwrap -from typing import Any, Tuple from datetime import datetime -import requests +from typing import Any, Tuple + import pandas as pd +import requests + from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( denominate_number, prettify_column_names, replace_unicode, ) +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) GOV_COLUMNS = [ "submitTime", @@ -33,6 +39,7 @@ VALIDATORS_COLUMNS = [ ] +@log_start_end(log=logger) def _make_request(endpoint: str) -> dict: """Helper method handles terra fcd api requests. [Source: https://fcd.terra.dev/v1] @@ -58,6 +65,7 @@ def _make_request(endpoint: str) -> dict: raise ValueError(f"Invalid Response: {response.text}") from e +@log_start_end(log=logger) def _adjust_delegation_info(delegation: dict) -> dict: """Helper method which removes redundant fields from delegation info dictionary, and denominate value fields. [Source: https://fcd.terra.dev/v1] @@ -84,6 +92,7 @@ def _adjust_delegation_info(delegation: dict) -> dict: return delegation_info +@log_start_end(log=logger) def get_staking_account_info(address: str = "") -> Tuple[pd.DataFrame, str]: """Get staking info for provided terra account [Source: https://fcd.terra.dev/swagger] @@ -131,6 +140,7 @@ def get_staking_account_info(address: str = "") -> Tuple[pd.DataFrame, str]: return df, report +@log_start_end(log=logger) def get_validators() -> pd.DataFrame: """Get information about terra validators [Source: https://fcd.terra.dev/swagger] @@ -162,6 +172,7 @@ def get_validators() -> pd.DataFrame: return pd.DataFrame(results).sort_values(by="votingPower") +@log_start_end(log=logger) def get_proposals(status: str = "") -> pd.DataFrame: """Get terra blockchain governance proposals list [Source: https://fcd.terra.dev/swagger] @@ -217,6 +228,7 @@ def get_proposals(status: str = "") -> pd.DataFrame: return df +@log_start_end(log=logger) def get_account_growth(cumulative: bool = True) -> pd.DataFrame: """Get terra blockchain account growth history [Source: https://fcd.terra.dev/swagger] @@ -239,6 +251,7 @@ def get_account_growth(cumulative: bool = True) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_staking_ratio_history(): """Get terra blockchain staking ratio history [Source: https://fcd.terra.dev/swagger] @@ -255,6 +268,7 @@ def get_staking_ratio_history(): return df[["date", "stakingRatio"]] +@log_start_end(log=logger) def get_staking_returns_history(): """Get terra blockchain staking returns history [Source: https://fcd.terra.dev/v1] diff --git a/gamestonk_terminal/cryptocurrency/defi/terramoney_fcd_view.py b/gamestonk_terminal/cryptocurrency/defi/terramoney_fcd_view.py index 0b666e7edae..a6e9b8f8a3d 100644 --- a/gamestonk_terminal/cryptocurrency/defi/terramoney_fcd_view.py +++ b/gamestonk_terminal/cryptocurrency/defi/terramoney_fcd_view.py @@ -1,25 +1,33 @@ """Terra Money FCD view""" __docformat__ = "numpy" +import logging import os + import matplotlib.pyplot as plt -from matplotlib import ticker, dates as mdates +from matplotlib import dates as mdates +from matplotlib import ticker + +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( + prettify_column_names, + very_long_number_formatter, +) from gamestonk_terminal.cryptocurrency.defi import terramoney_fcd_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, long_number_format, plot_autoscale, print_rich_table, ) -from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( - prettify_column_names, - very_long_number_formatter, -) -from gamestonk_terminal import feature_flags as gtff -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_account_staking_info( address: str = "", top: int = 10, export: str = "" ) -> None: @@ -50,6 +58,7 @@ def display_account_staking_info( ) +@log_start_end(log=logger) def display_validators( top: int = 10, sortby: str = "votingPower", descend: bool = False, export: str = "" ) -> None: @@ -94,6 +103,7 @@ def display_validators( ) +@log_start_end(log=logger) def display_gov_proposals( top: int = 10, status: str = "all", @@ -138,6 +148,7 @@ def display_gov_proposals( ) +@log_start_end(log=logger) def display_account_growth( kind: str = "total", cumulative: bool = False, top: int = 90, export: str = "" ) -> None: @@ -198,6 +209,7 @@ def display_account_growth( ) +@log_start_end(log=logger) def display_staking_ratio_history(top: int = 90, export: str = "") -> None: """Display terra blockchain staking ratio history [Source: https://fcd.terra.dev/v1] @@ -239,6 +251,7 @@ def display_staking_ratio_history(top: int = 90, export: str = "") -> None: ) +@log_start_end(log=logger) def display_staking_returns_history(top: int = 90, export: str = "") -> None: """Display terra blockchain staking returns history [Source: https://fcd.terra.dev/swagger] diff --git a/gamestonk_terminal/cryptocurrency/discovery/coinmarketcap_model.py b/gamestonk_terminal/cryptocurrency/discovery/coinmarketcap_model.py index 6cf96e479e7..4c3c94ffdd0 100644 --- a/gamestonk_terminal/cryptocurrency/discovery/coinmarketcap_model.py +++ b/gamestonk_terminal/cryptocurrency/discovery/coinmarketcap_model.py @@ -1,13 +1,20 @@ """CoinMarketCap model""" __docformat__ = "numpy" +import logging + import pandas as pd from coinmarketcapapi import CoinMarketCapAPI + import gamestonk_terminal.config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) FILTERS = ["Symbol", "CMC_Rank", "LastPrice", "DayPctChange", "MarketCap"] +@log_start_end(log=logger) def get_cmc_top_n() -> pd.DataFrame: """Shows top n coins. [Source: CoinMarketCap] diff --git a/gamestonk_terminal/cryptocurrency/discovery/coinmarketcap_view.py b/gamestonk_terminal/cryptocurrency/discovery/coinmarketcap_view.py index 24ae3e49127..96ba7ac82f0 100644 --- a/gamestonk_terminal/cryptocurrency/discovery/coinmarketcap_view.py +++ b/gamestonk_terminal/cryptocurrency/discovery/coinmarketcap_view.py @@ -1,11 +1,16 @@ """CoinMarketCap view""" __docformat__ = "numpy" +import logging import os + from gamestonk_terminal.cryptocurrency.discovery import coinmarketcap_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + sort_map = { "Symbol": "Symbol", "CMC_Rank": "CMC_Rank", @@ -15,6 +20,7 @@ sort_map = { } +@log_start_end(log=logger) def display_cmc_top_coins( top: int = 15, sortby: str = "CMC_Rank", diff --git a/gamestonk_terminal/cryptocurrency/discovery/coinpaprika_model.py b/gamestonk_terminal/cryptocurrency/discovery/coinpaprika_model.py index dc77041621f..7add080e2c2 100644 --- a/gamestonk_terminal/cryptocurrency/discovery/coinpaprika_model.py +++ b/gamestonk_terminal/cryptocurrency/discovery/coinpaprika_model.py @@ -1,9 +1,15 @@ """CoinPaprika model""" __docformat__ = "numpy" -from typing import Optional, Any +import logging +from typing import Any, Optional + import pandas as pd + from gamestonk_terminal.cryptocurrency.coinpaprika_helpers import PaprikaSession +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) CATEGORIES = [ "currencies", @@ -17,6 +23,7 @@ CATEGORIES = [ FILTERS = ["category", "id", "name"] +@log_start_end(log=logger) def get_search_results( query: str, category: Optional[Any] = None, modifier: Optional[Any] = None ) -> pd.DataFrame: diff --git a/gamestonk_terminal/cryptocurrency/discovery/coinpaprika_view.py b/gamestonk_terminal/cryptocurrency/discovery/coinpaprika_view.py index 407994995df..59f89251c44 100644 --- a/gamestonk_terminal/cryptocurrency/discovery/coinpaprika_view.py +++ b/gamestonk_terminal/cryptocurrency/discovery/coinpaprika_view.py @@ -1,12 +1,18 @@ """CoinPaprika view""" __docformat__ = "numpy" +import logging import os -from gamestonk_terminal.helper_funcs import export_data, print_rich_table + import gamestonk_terminal.cryptocurrency.discovery.coinpaprika_model as paprika +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_search_results( query: str, category: str, diff --git a/gamestonk_terminal/cryptocurrency/discovery/dappradar_model.py b/gamestonk_terminal/cryptocurrency/discovery/dappradar_model.py index a08afb94e68..482679f3d0c 100644 --- a/gamestonk_terminal/cryptocurrency/discovery/dappradar_model.py +++ b/gamestonk_terminal/cryptocurrency/discovery/dappradar_model.py @@ -3,10 +3,16 @@ __docformat__ = "numpy" # pylint: disable=C0301,E1137 -import requests +import logging + import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + NFT_COLUMNS = [ "Name", "Protocols", @@ -31,6 +37,7 @@ DEX_COLUMNS = [ ] +@log_start_end(log=logger) def _make_request(url: str) -> dict: """Helper method handles dappradar api requests. [Source: https://dappradar.com/] @@ -55,6 +62,7 @@ def _make_request(url: str) -> dict: raise ValueError(f"Invalid Response: {response.text}") from e +@log_start_end(log=logger) def get_top_nfts() -> pd.DataFrame: """Get top nft collections [Source: https://dappradar.com/] @@ -92,6 +100,7 @@ def get_top_nfts() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_top_dexes() -> pd.DataFrame: """Get top dexes by daily volume and users [Source: https://dappradar.com/] @@ -119,6 +128,7 @@ def get_top_dexes() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_top_games() -> pd.DataFrame: """Get top blockchain games by daily volume and users [Source: https://dappradar.com/] @@ -149,6 +159,7 @@ def get_top_games() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_top_dapps() -> pd.DataFrame: """Get top decentralized applications by daily volume and users [Source: https://dappradar.com/] diff --git a/gamestonk_terminal/cryptocurrency/discovery/dappradar_view.py b/gamestonk_terminal/cryptocurrency/discovery/dappradar_view.py index 07c74499236..2abd5cf6696 100644 --- a/gamestonk_terminal/cryptocurrency/discovery/dappradar_view.py +++ b/gamestonk_terminal/cryptocurrency/discovery/dappradar_view.py @@ -1,18 +1,21 @@ """DappRadar view""" __docformat__ = "numpy" +import logging import os + from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( very_long_number_formatter, ) from gamestonk_terminal.cryptocurrency.discovery import dappradar_model -from gamestonk_terminal.helper_funcs import ( - export_data, - print_rich_table, -) +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_top_nfts(top: int = 10, sortby: str = "", export: str = "") -> None: """Displays top nft collections [Source: https://dappradar.com/] @@ -51,6 +54,7 @@ def display_top_nfts(top: int = 10, sortby: str = "", export: str = "") -> None: ) +@log_start_end(log=logger) def display_top_games(top: int = 10, export: str = "", sortby: str = "") -> None: """Displays top blockchain games [Source: https://dappradar.com/] @@ -89,6 +93,7 @@ def display_top_games(top: int = 10, export: str = "", sortby: str = "") -> None ) +@log_start_end(log=logger) def display_top_dexes(top: int = 10, export: str = "", sortby: str = "") -> None: """Displays top decentralized exchanges [Source: https://dappradar.com/] @@ -127,6 +132,7 @@ def display_top_dexes(top: int = 10, export: str = "", sortby: str = "") -> None ) +@log_start_end(log=logger) def display_top_dapps(top: int = 10, export: str = "", sortby: str = "") -> None: """Displays top decentralized exchanges [Source: https://dappradar.com/] diff --git a/gamestonk_terminal/cryptocurrency/discovery/pycoingecko_model.py b/gamestonk_terminal/cryptocurrency/discovery/pycoingecko_model.py index 4b38509f76f..c2e0c68322f 100644 --- a/gamestonk_terminal/cryptocurrency/discovery/pycoingecko_model.py +++ b/gamestonk_terminal/cryptocurrency/discovery/pycoingecko_model.py @@ -1,11 +1,15 @@ """CoinGecko model""" __docformat__ = "numpy" -import os import json +import logging +import os from typing import List import pandas as pd from pycoingecko import CoinGeckoAPI +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) PERIODS = { "1h": "?time=h1", @@ -76,6 +80,7 @@ DEX_FILTERS = [ ] +@log_start_end(log=logger) def read_file_data(file_name: str) -> dict: if file_name.split(".")[1] != "json": raise TypeError("Please load json file") @@ -87,12 +92,15 @@ def read_file_data(file_name: str) -> dict: return data +@log_start_end(log=logger) def get_categories_keys() -> List[str]: categories = read_file_data("coingecko_categories.json") return list(categories.keys()) +@log_start_end(log=logger) def get_coins(top: int = 250, category: str = "") -> pd.DataFrame: + """Get N coins from CoinGecko [Source: CoinGecko] Parameters @@ -149,6 +157,7 @@ GAINERS_LOSERS_COLUMNS = [ ] +@log_start_end(log=logger) def get_gainers_or_losers( top: int = 20, period: str = "1h", typ: str = "gainers" ) -> pd.DataFrame: @@ -198,6 +207,7 @@ def get_gainers_or_losers( return sorted_df +@log_start_end(log=logger) def get_trending_coins() -> pd.DataFrame: """Returns trending coins [Source: CoinGecko] @@ -219,6 +229,7 @@ def get_trending_coins() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_coin_list() -> pd.DataFrame: """Get list of coins available on CoinGecko [Source: CoinGecko] @@ -236,6 +247,7 @@ def get_coin_list() -> pd.DataFrame: ).reset_index() +@log_start_end(log=logger) def get_coins_for_given_exchange(exchange_id: str = "binance", page: int = 1) -> dict: """Helper method to get all coins available on binance exchange [Source: CoinGecko] @@ -257,6 +269,7 @@ def get_coins_for_given_exchange(exchange_id: str = "binance", page: int = 1) -> return binance_coins["tickers"] +@log_start_end(log=logger) def get_mapping_matrix_for_exchange(exchange_id: str, pages: int = 12) -> dict: """Creates a matrix with all coins available on Binance with corresponding coingecko coin_id. [Source: CoinGecko] diff --git a/gamestonk_terminal/cryptocurrency/discovery/pycoingecko_view.py b/gamestonk_terminal/cryptocurrency/discovery/pycoingecko_view.py index a6c91ebc4e0..9a97d50443a 100644 --- a/gamestonk_terminal/cryptocurrency/discovery/pycoingecko_view.py +++ b/gamestonk_terminal/cryptocurrency/discovery/pycoingecko_view.py @@ -1,15 +1,21 @@ """CoinGecko view""" __docformat__ = "numpy" +import logging import os + from pandas.plotting import register_matplotlib_converters + from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( very_long_number_formatter, ) from gamestonk_terminal.cryptocurrency.discovery import pycoingecko_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() # pylint: disable=inconsistent-return-statements @@ -26,6 +32,7 @@ COINS_COLUMNS = [ ] +@log_start_end(log=logger) def display_coins( category: str, top: int = 250, sortby: str = "Symbol", export: str = "" ) -> None: @@ -82,6 +89,7 @@ def display_coins( console.print("\nUnable to retrieve data from CoinGecko.\n") +@log_start_end(log=logger) def display_gainers( period: str = "1h", top: int = 20, sortby: str = "Symbol", export: str = "" ) -> None: @@ -123,6 +131,7 @@ def display_gainers( console.print("\nUnable to retrieve data from CoinGecko.\n") +@log_start_end(log=logger) def display_losers( period: str = "1h", top: int = 20, export: str = "", sortby: str = "Symbol" ) -> None: @@ -164,6 +173,7 @@ def display_losers( console.print("\nUnable to retrieve data from CoinGecko.\n") +@log_start_end(log=logger) def display_trending(export: str = "") -> None: """Display trending coins [Source: CoinGecko] diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/binance_model.py b/gamestonk_terminal/cryptocurrency/due_diligence/binance_model.py index 48f47a722c4..81c2cde99a1 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/binance_model.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/binance_model.py @@ -2,20 +2,26 @@ __docformat__ = "numpy" import argparse - -from typing import Tuple, Union, List +import logging from collections import defaultdict +from typing import List, Tuple, Union + import matplotlib.pyplot as plt import mplfinance as mpf import pandas as pd from binance.client import Client from binance.exceptions import BinanceAPIException + import gamestonk_terminal.config_terminal as cfg -from gamestonk_terminal.helper_funcs import plot_autoscale +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.feature_flags import USE_ION as ion +from gamestonk_terminal.helper_funcs import plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def _get_trading_pairs() -> List[dict]: """Helper method that return all trading pairs on binance. Other methods are use this data as an input for e.g building dataframe with all coins, or to build dict of all trading pairs. [Source: Binance] @@ -51,6 +57,7 @@ def _get_trading_pairs() -> List[dict]: return trading_pairs +@log_start_end(log=logger) def get_all_binance_trading_pairs() -> pd.DataFrame: """Returns all available pairs on Binance in DataFrame format. DataFrame has 3 columns symbol, baseAsset, quoteAsset example row: ETHBTC | ETH | BTC @@ -68,6 +75,7 @@ def get_all_binance_trading_pairs() -> pd.DataFrame: return pd.DataFrame(trading_pairs)[["symbol", "baseAsset", "quoteAsset"]] +@log_start_end(log=logger) def get_binance_available_quotes_for_each_coin() -> dict: """Helper methods that for every coin available on Binance add all quote assets. [Source: Binance] @@ -85,6 +93,7 @@ def get_binance_available_quotes_for_each_coin() -> dict: return results +@log_start_end(log=logger) def check_valid_binance_str(symbol: str) -> str: """Check if symbol is in defined binance. [Source: Binance]""" client = Client(cfg.API_BINANCE_KEY, cfg.API_BINANCE_SECRET) @@ -97,6 +106,7 @@ def check_valid_binance_str(symbol: str) -> str: ) from e +@log_start_end(log=logger) def show_available_pairs_for_given_symbol( symbol: str = "ETH", ) -> Tuple[Union[str, None], list]: @@ -124,6 +134,7 @@ def show_available_pairs_for_given_symbol( return None, [] +@log_start_end(log=logger) def plot_candles(candles_df: pd.DataFrame, title: str) -> None: """Plot candle chart from dataframe. [Source: Binance] diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/binance_view.py b/gamestonk_terminal/cryptocurrency/due_diligence/binance_view.py index 2d842e5453f..a1b1515ace5 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/binance_view.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/binance_view.py @@ -1,19 +1,23 @@ """Binance view""" __docformat__ = "numpy" +import logging import os -from binance.client import Client + import numpy as np import pandas as pd -from gamestonk_terminal.helper_funcs import ( - export_data, - print_rich_table, -) -from gamestonk_terminal.cryptocurrency.cryptocurrency_helpers import plot_order_book +from binance.client import Client + import gamestonk_terminal.config_terminal as cfg +from gamestonk_terminal.cryptocurrency.cryptocurrency_helpers import plot_order_book +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_order_book(coin: str, limit: int, currency: str, export: str) -> None: """Get order book for currency. [Source: Binance] @@ -48,6 +52,7 @@ def display_order_book(coin: str, limit: int, currency: str, export: str) -> Non ) +@log_start_end(log=logger) def display_balance(coin: str, currency: str, export: str) -> None: """Get account holdings for asset. [Source: Binance] diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/coinbase_model.py b/gamestonk_terminal/cryptocurrency/due_diligence/coinbase_model.py index 7276d52c083..be6839f313e 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/coinbase_model.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/coinbase_model.py @@ -1,16 +1,23 @@ """Coinbase model""" __docformat__ = "numpy" -from typing import Optional, Any, Tuple -import pandas as pd +import logging +from typing import Any, Optional, Tuple + import numpy as np +import pandas as pd + from gamestonk_terminal.cryptocurrency.coinbase_helpers import ( check_validity_of_product, make_coinbase_request, ) +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def show_available_pairs_for_given_symbol(symbol: str = "ETH") -> Tuple[str, list]: pairs = make_coinbase_request("/products") df = pd.DataFrame(pairs)[["base_currency", "quote_currency"]] @@ -25,6 +32,7 @@ def show_available_pairs_for_given_symbol(symbol: str = "ETH") -> Tuple[str, lis return symbol, coin_df["quote_currency"].to_list() +@log_start_end(log=logger) def get_trading_pair_info(product_id: str) -> pd.DataFrame: """Get information about chosen trading pair. [Source: Coinbase] @@ -47,6 +55,7 @@ def get_trading_pair_info(product_id: str) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_order_book(product_id: str) -> Tuple[np.ndarray, np.ndarray, str, dict]: """Get orders book for chosen trading pair. [Source: Coinbase] @@ -88,6 +97,7 @@ def get_order_book(product_id: str) -> Tuple[np.ndarray, np.ndarray, str, dict]: return bids, asks, product_id, market_book +@log_start_end(log=logger) def get_trades( product_id: str, limit: int = 1000, side: Optional[Any] = None ) -> pd.DataFrame: @@ -116,6 +126,7 @@ def get_trades( return pd.DataFrame(product)[["time", "price", "size", "side"]] +@log_start_end(log=logger) def get_candles(product_id: str, interval: str = "24h") -> pd.DataFrame: """Get candles for chosen trading pair and time interval. [Source: Coinbase] @@ -174,6 +185,7 @@ def get_candles(product_id: str, interval: str = "24h") -> pd.DataFrame: ] +@log_start_end(log=logger) def get_product_stats(product_id: str) -> pd.DataFrame: """Get 24 hr stats for the product. Volume is in base currency units. Open, high and low are in quote currency units. [Source: Coinbase] diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/coinbase_view.py b/gamestonk_terminal/cryptocurrency/due_diligence/coinbase_view.py index fec27ffaa5d..fc275ea8409 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/coinbase_view.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/coinbase_view.py @@ -1,18 +1,23 @@ """Coinbase view""" __docformat__ = "numpy" +import logging import os from typing import Optional import pandas as pd from pandas.plotting import register_matplotlib_converters -from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.cryptocurrency.due_diligence import coinbase_model from gamestonk_terminal.cryptocurrency.cryptocurrency_helpers import plot_order_book +from gamestonk_terminal.cryptocurrency.due_diligence import coinbase_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def display_order_book(product_id: str, export: str = "") -> None: """Displays a list of available currency pairs for trading. [Source: Coinbase] @@ -34,6 +39,7 @@ def display_order_book(product_id: str, export: str = "") -> None: ) +@log_start_end(log=logger) def display_trades( product_id: str, limit: int = 1000, side: Optional[str] = None, export: str = "" ) -> None: @@ -69,6 +75,7 @@ def display_trades( ) +@log_start_end(log=logger) def display_candles(product_id: str, interval: str = "24h", export: str = "") -> None: """Get candles for chosen trading pair and time interval. [Source: Coinbase] @@ -97,6 +104,7 @@ def display_candles(product_id: str, interval: str = "24h", export: str = "") -> ) +@log_start_end(log=logger) def display_stats(product_id: str, export: str = "") -> None: """Get 24 hr stats for the product. Volume is in base currency units. Open, high and low are in quote currency units. [Source: Coinbase] diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/coinglass_model.py b/gamestonk_terminal/cryptocurrency/due_diligence/coinglass_model.py index 9157e5b9458..45ce9f5d347 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/coinglass_model.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/coinglass_model.py @@ -1,14 +1,21 @@ -import json import datetime as dt +import json +import logging + import pandas as pd import requests + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) api_url = "https://open-api.coinglass.com/api/pro/v1/" INTERVALS = [0, 1, 2, 4] +@log_start_end(log=logger) def get_open_interest_per_exchange(symbol: str, interval: int) -> pd.DataFrame: """Returns open interest by exchange for a certain symbol [Source: https://coinglass.github.io/API-Reference/] diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/coinglass_view.py b/gamestonk_terminal/cryptocurrency/due_diligence/coinglass_view.py index 2398ac50b7c..3d8d007595e 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/coinglass_view.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/coinglass_view.py @@ -1,16 +1,23 @@ +import logging import os -from matplotlib import pyplot as plt, dates as mdates -import pandas as pd +import pandas as pd +from matplotlib import dates as mdates +from matplotlib import pyplot as plt + +from gamestonk_terminal import config_plot as cfgPlot +from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.cryptocurrency.due_diligence.coinglass_model import ( get_open_interest_per_exchange, ) +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale -from gamestonk_terminal import config_plot as cfgPlot -from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_open_interest(symbol: str, interval: int, export: str) -> None: """Displays open interest by exchange for a certain cryptocurrency [Source: https://coinglass.github.io/API-Reference/] @@ -38,6 +45,7 @@ def display_open_interest(symbol: str, interval: int, export: str) -> None: ) +@log_start_end(log=logger) def plot_data(df: pd.DataFrame, symbol: str): df_price = df[["price"]].copy() diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/coinpaprika_model.py b/gamestonk_terminal/cryptocurrency/due_diligence/coinpaprika_model.py index e3169ac39dd..2cc487387e1 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/coinpaprika_model.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/coinpaprika_model.py @@ -1,15 +1,22 @@ """CoinPaprika model""" __docformat__ = "numpy" -from typing import Tuple, Optional, Any -from datetime import datetime, timedelta +import logging import textwrap +from datetime import datetime, timedelta +from typing import Any, Optional, Tuple + import pandas as pd from dateutil import parser + from gamestonk_terminal.cryptocurrency.coinpaprika_helpers import PaprikaSession +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_coin(coin_id: str = "eth-ethereum") -> dict: """Get coin by id [Source: CoinPaprika] @@ -28,6 +35,7 @@ def get_coin(coin_id: str = "eth-ethereum") -> dict: return coin +@log_start_end(log=logger) def get_coin_twitter_timeline(coin_id: str = "eth-ethereum") -> pd.DataFrame: """Get twitter timeline for given coin id. Not more than last 50 tweets [Source: CoinPaprika] @@ -62,6 +70,7 @@ def get_coin_twitter_timeline(coin_id: str = "eth-ethereum") -> pd.DataFrame: return df +@log_start_end(log=logger) def get_coin_events_by_id(coin_id: str = "eth-ethereum") -> pd.DataFrame: """Get all events related to given coin like conferences, start date of futures trading etc. [Source: CoinPaprika] @@ -112,6 +121,7 @@ def get_coin_events_by_id(coin_id: str = "eth-ethereum") -> pd.DataFrame: return data +@log_start_end(log=logger) def get_coin_exchanges_by_id(coin_id: str = "eth-ethereum") -> pd.DataFrame: """Get all exchanges for given coin id. [Source: CoinPaprika] @@ -134,6 +144,7 @@ def get_coin_exchanges_by_id(coin_id: str = "eth-ethereum") -> pd.DataFrame: return df +@log_start_end(log=logger) def get_coin_markets_by_id( coin_id: str = "eth-ethereum", quotes: str = "USD" ) -> pd.DataFrame: @@ -182,6 +193,7 @@ def get_coin_markets_by_id( return pd.DataFrame(data) +@log_start_end(log=logger) def get_ohlc_historical( coin_id: str = "eth-ethereum", quotes: str = "USD", days: int = 90 ) -> pd.DataFrame: @@ -228,6 +240,7 @@ def get_ohlc_historical( return pd.DataFrame(data) +@log_start_end(log=logger) def get_tickers_info_for_coin( coin_id: str = "btc-bitcoin", quotes: str = "USD" ) -> pd.DataFrame: @@ -313,6 +326,7 @@ def get_tickers_info_for_coin( return df +@log_start_end(log=logger) def validate_coin(coin: str, coins_dct: dict) -> Tuple[str, Optional[Any]]: """Helper method that validates if proper coin id or symbol was provided [Source: CoinPaprika] @@ -345,6 +359,7 @@ def validate_coin(coin: str, coins_dct: dict) -> Tuple[str, Optional[Any]]: return coin_found, symbol +@log_start_end(log=logger) def basic_coin_info(coin_id: str = "btc-bitcoin") -> pd.DataFrame: """Basic coin information [Source: CoinPaprika] diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/coinpaprika_view.py b/gamestonk_terminal/cryptocurrency/due_diligence/coinpaprika_view.py index 8ac74c0f1d3..07f95ec6874 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/coinpaprika_view.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/coinpaprika_view.py @@ -1,18 +1,21 @@ """CoinPaprika view""" __docformat__ = "numpy" +import logging import os + from pandas.plotting import register_matplotlib_converters -from gamestonk_terminal.helper_funcs import ( - export_data, - print_rich_table, -) -from gamestonk_terminal.cryptocurrency.due_diligence import coinpaprika_model + from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( long_number_format_with_type_check, ) +from gamestonk_terminal.cryptocurrency.due_diligence import coinpaprika_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() # pylint: disable=inconsistent-return-statements @@ -79,6 +82,7 @@ CURRENCIES = [ ] +@log_start_end(log=logger) def display_twitter( coin_id: str = "btc-bitcoin", top: int = 10, @@ -129,6 +133,7 @@ def display_twitter( ) +@log_start_end(log=logger) def display_events( coin_id: str = "btc-bitcoin", top: int = 10, @@ -183,6 +188,7 @@ def display_events( ) +@log_start_end(log=logger) def display_exchanges( coin_id: str = "btc-bitcoin", top: int = 10, @@ -227,6 +233,7 @@ def display_exchanges( ) +@log_start_end(log=logger) def display_markets( coin_id: str = "btc-bitcoin", currency: str = "USD", @@ -287,6 +294,7 @@ def display_markets( ) +@log_start_end(log=logger) def display_price_supply( coin_id: str = "btc-bitcoin", currency: str = "USD", @@ -326,6 +334,7 @@ def display_price_supply( ) +@log_start_end(log=logger) def display_basic( coin_id: str = "btc-bitcoin", export: str = "", diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/finbrain_crypto_view.py b/gamestonk_terminal/cryptocurrency/due_diligence/finbrain_crypto_view.py index d8e802ef69c..4124f24b6a1 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/finbrain_crypto_view.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/finbrain_crypto_view.py @@ -1,17 +1,23 @@ """Finbrain Crypto Sentiment Analysis""" __docformat__ = "numpy" +import logging import os + import pandas as pd + from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.common.behavioural_analysis.finbrain_model import get_sentiment from gamestonk_terminal.common.behavioural_analysis.finbrain_view import ( plot_sentiment, sentiment_coloring, ) -from gamestonk_terminal.common.behavioural_analysis.finbrain_model import get_sentiment +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) try: @@ -21,6 +27,7 @@ except ValueError: COINS = None +@log_start_end(log=logger) def display_crypto_sentiment_analysis(coin: str, export: str) -> None: """Sentiment analysis from FinBrain for Cryptocurrencies diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/glassnode_model.py b/gamestonk_terminal/cryptocurrency/due_diligence/glassnode_model.py index 365defaf398..c5178508dcc 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/glassnode_model.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/glassnode_model.py @@ -1,7 +1,13 @@ import json +import logging + import pandas as pd import requests + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) api_url = "https://api.glassnode.com/v1/metrics/" @@ -167,6 +173,7 @@ INTERVALS_DISPLAY_EXCHANGE_NET_POSITION_CHANGE = ["24h"] INTERVALS_EXCHANGE_BALANCES = ["24h"] +@log_start_end(log=logger) def get_close_price(asset: str, interval: str, since: int, until: int) -> pd.DataFrame: """Returns the price of a cryptocurrency [Source: https://glassnode.com] @@ -208,6 +215,7 @@ def get_close_price(asset: str, interval: str, since: int, until: int) -> pd.Dat return pd.DataFrame() +@log_start_end(log=logger) def get_non_zero_addresses( asset: str, interval: str, since: int, until: int ) -> pd.DataFrame: @@ -251,6 +259,7 @@ def get_non_zero_addresses( return pd.DataFrame() +@log_start_end(log=logger) def get_active_addresses( asset: str, interval: str, since: int, until: int ) -> pd.DataFrame: @@ -294,6 +303,7 @@ def get_active_addresses( return pd.DataFrame() +@log_start_end(log=logger) def get_hashrate(asset: str, interval: str, since: int, until: int) -> pd.DataFrame: """Returns dataframe with mean hashrate of btc or eth blockchain and asset price [Source: https://glassnode.com] @@ -340,6 +350,7 @@ def get_hashrate(asset: str, interval: str, since: int, until: int) -> pd.DataFr return pd.DataFrame() +@log_start_end(log=logger) def get_exchange_balances( asset: str, exchange: str, interval: str, since: int, until: int ) -> pd.DataFrame: @@ -398,6 +409,7 @@ def get_exchange_balances( return pd.DataFrame() +@log_start_end(log=logger) def get_exchange_net_position_change( asset: str, exchange: str, interval: str, since: int, until: int ) -> pd.DataFrame: diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/glassnode_view.py b/gamestonk_terminal/cryptocurrency/due_diligence/glassnode_view.py index ef83a250715..2544cd5a9b9 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/glassnode_view.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/glassnode_view.py @@ -1,10 +1,15 @@ -from datetime import datetime +import logging import os -from matplotlib import pyplot as plt, dates as mdates, ticker +from datetime import datetime + import matplotlib import numpy as np -from gamestonk_terminal.helper_funcs import export_data, plot_autoscale +from matplotlib import dates as mdates +from matplotlib import pyplot as plt +from matplotlib import ticker + from gamestonk_terminal import config_plot as cfgPlot +from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.cryptocurrency.due_diligence.glassnode_model import ( get_active_addresses, get_close_price, @@ -13,10 +18,14 @@ from gamestonk_terminal.cryptocurrency.due_diligence.glassnode_model import ( get_hashrate, get_non_zero_addresses, ) -from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_btc_rainbow(since: int, until: int, export: str = ""): """Displays bitcoin rainbow chart [Price data from source: https://glassnode.com] @@ -136,6 +145,7 @@ def display_btc_rainbow(since: int, until: int, export: str = ""): ) +@log_start_end(log=logger) def display_active_addresses( asset: str, since: int, until: int, interval: str, export: str = "" ) -> None: @@ -190,6 +200,7 @@ def display_active_addresses( ) +@log_start_end(log=logger) def display_non_zero_addresses( asset: str, since: int, until: int, interval: str, export: str = "" ) -> None: @@ -244,6 +255,7 @@ def display_non_zero_addresses( ) +@log_start_end(log=logger) def display_exchange_net_position_change( asset: str, exchange: str, since: int, until: int, interval: str, export: str = "" ) -> None: @@ -315,6 +327,7 @@ def display_exchange_net_position_change( ) +@log_start_end(log=logger) def display_exchange_balances( asset: str, exchange: str, @@ -386,6 +399,7 @@ def display_exchange_balances( ) +@log_start_end(log=logger) def display_hashrate( asset: str, since: int, diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/pycoingecko_model.py b/gamestonk_terminal/cryptocurrency/due_diligence/pycoingecko_model.py index d73a48a8e53..9ee9178477b 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/pycoingecko_model.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/pycoingecko_model.py @@ -1,25 +1,31 @@ """CoinGecko model""" __docformat__ = "numpy" -from typing import Tuple, Union, Any, Dict, List, Optional -import regex as re +import logging +from typing import Any, Dict, List, Optional, Tuple, Union + import pandas as pd +import regex as re from pycoingecko import CoinGeckoAPI -from gamestonk_terminal.cryptocurrency.discovery.pycoingecko_model import read_file_data -from gamestonk_terminal.cryptocurrency.pycoingecko_helpers import ( - remove_keys, - filter_list, - find_discord, - rename_columns_in_dct, - create_dictionary_with_prefixes, - DENOMINATION, - calc_change, -) + from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( replace_underscores_in_column_names, ) +from gamestonk_terminal.cryptocurrency.discovery.pycoingecko_model import read_file_data +from gamestonk_terminal.cryptocurrency.pycoingecko_helpers import ( + DENOMINATION, + calc_change, + create_dictionary_with_prefixes, + filter_list, + find_discord, + remove_keys, + rename_columns_in_dct, +) +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + CHANNELS = { "telegram_channel_identifier": "telegram", "twitter_screen_name": "twitter", @@ -41,6 +47,7 @@ BASE_INFO = [ ] +@log_start_end(log=logger) def get_coin_potential_returns( main_coin: str, vs: Union[str, None] = None, @@ -185,6 +192,7 @@ def get_coin_potential_returns( return pd.DataFrame() +@log_start_end(log=logger) def check_coin(coin_id: str): coins = read_file_data("coingecko_coins.json") for coin in coins: @@ -195,6 +203,7 @@ def check_coin(coin_id: str): return None +@log_start_end(log=logger) def get_coin_market_chart( coin_id: str = "", vs_currency: str = "usd", days: int = 30, **kwargs: Any ) -> pd.DataFrame: @@ -227,6 +236,7 @@ def get_coin_market_chart( class Coin: """Coin class, it holds loaded coin""" + @log_start_end(log=logger) def __init__(self, symbol: str, load_from_api: bool = False): self.client = CoinGeckoAPI() if load_from_api: @@ -238,9 +248,11 @@ class Coin: if self.coin_symbol: self.coin: Dict[Any, Any] = self._get_coin_info() + @log_start_end(log=logger) def __str__(self): return f"{self.coin_symbol}" + @log_start_end(log=logger) def _validate_coin(self, search_coin: str) -> Tuple[Optional[Any], Optional[Any]]: """Validate if given coin symbol or id exists in list of available coins on CoinGecko. If yes it returns coin id. [Source: CoinGecko] @@ -269,6 +281,7 @@ class Coin: return coin, symbol raise ValueError(f"Could not find coin with the given id: {search_coin}\n") + @log_start_end(log=logger) def coin_list(self) -> list: """List all available coins [Source: CoinGecko] @@ -280,6 +293,7 @@ class Coin: return [token.get("id") for token in self._coin_list] + @log_start_end(log=logger) def _get_coin_info(self) -> dict: """Helper method which fetch the coin information by id from CoinGecko API like: (name, price, market, ... including exchange tickers) [Source: CoinGecko] @@ -293,6 +307,7 @@ class Coin: params = dict(localization="false", tickers="false", sparkline=True) return self.client.get_coin_by_id(self.coin_symbol, **params) + @log_start_end(log=logger) def _get_links(self) -> Dict: """Helper method that extracts links from coin [Source: CoinGecko] @@ -304,7 +319,7 @@ class Coin: return self.coin.get("links", {}) - @property + @log_start_end(log=logger) def get_repositories(self) -> Optional[Any]: """Get list of all repositories for given coin [Source: CoinGecko] @@ -316,7 +331,7 @@ class Coin: return self._get_links().get("repos_url") - @property + @log_start_end(log=logger) def get_developers_data(self) -> pd.DataFrame: """Get coin development data from GitHub or BitBucket like: number of pull requests, contributor etc [Source: CoinGecko] @@ -344,7 +359,7 @@ class Coin: return df[df["Value"].notna()] - @property + @log_start_end(log=logger) def get_blockchain_explorers(self) -> Union[pd.DataFrame, Any]: """Get list of URLs to blockchain explorers for given coin. [Source: CoinGecko] @@ -368,7 +383,7 @@ class Coin: return df[df["Value"].notna()] return None - @property + @log_start_end(log=logger) def get_social_media(self) -> pd.DataFrame: """Get list of URLs to social media like twitter, facebook, reddit... [Source: CoinGecko] @@ -402,7 +417,7 @@ class Coin: ) return df[df["Value"].notna()] - @property + @log_start_end(log=logger) def get_websites(self) -> pd.DataFrame: """Get list of URLs to websites like homepage of coin, forum. [Source: CoinGecko] @@ -428,7 +443,7 @@ class Coin: ) return df[df["Value"].notna()] - @property + @log_start_end(log=logging) def get_categories(self) -> Union[Dict[Any, Any], List[Any]]: """Coins categories. [Source: CoinGecko] @@ -440,6 +455,7 @@ class Coin: return self.coin.get("categories", {}) + @log_start_end(log=logger) def _get_base_market_data_info(self) -> dict: """Helper method that fetches all the base market/price information about given coin. [Source: CoinGecko] @@ -465,7 +481,7 @@ class Coin: market_dct.update(prices) return market_dct - @property + @log_start_end(log=logger) def get_base_info(self) -> pd.DataFrame: """Get all the base information about given coin. [Source: CoinGecko] @@ -496,7 +512,7 @@ class Coin: return df[df["Value"].notna()] - @property + @log_start_end(log=logger) def get_market_data(self) -> pd.DataFrame: """Get all the base market information about given coin. [Source: CoinGecko] @@ -551,6 +567,7 @@ class Coin: ) return df[df["Value"].notna()] + @log_start_end(log=logger) def get_all_time_high(self, currency: str = "usd") -> pd.DataFrame: """Get all time high data for given coin. [Source: CoinGecko] @@ -586,6 +603,7 @@ class Coin: df["Metric"] = df["Metric"] + f" {currency.upper()}" return df[df["Value"].notna()] + @log_start_end(log=logger) def get_all_time_low(self, currency: str = "usd") -> pd.DataFrame: """Get all time low data for given coin. [Source: CoinGecko] @@ -621,7 +639,7 @@ class Coin: df["Metric"] = df["Metric"] + f" {currency.upper()}" return df[df["Value"].notna()] - @property + @log_start_end(log=logger) def get_scores(self) -> pd.DataFrame: """Get different kind of scores for given coin. [Source: CoinGecko] @@ -666,6 +684,7 @@ class Coin: ) return df[df["Value"].notna()] + @log_start_end(log=logger) def get_coin_market_chart( self, vs_currency: str = "usd", days: int = 30, **kwargs: Any ) -> pd.DataFrame: @@ -696,6 +715,7 @@ class Coin: df["currency"] = vs_currency return df + @log_start_end(log=logger) def get_ohlc(self, vs_currency: str = "usd", days: int = 90) -> pd.DataFrame: """Get Open, High, Low, Close prices for given coin. [Source: CoinGecko] diff --git a/gamestonk_terminal/cryptocurrency/due_diligence/pycoingecko_view.py b/gamestonk_terminal/cryptocurrency/due_diligence/pycoingecko_view.py index 4bd53f64e49..715dec25a53 100644 --- a/gamestonk_terminal/cryptocurrency/due_diligence/pycoingecko_view.py +++ b/gamestonk_terminal/cryptocurrency/due_diligence/pycoingecko_view.py @@ -1,23 +1,22 @@ """CoinGecko view""" __docformat__ = "numpy" -# pylint: disable=C0209 + +import logging import os from typing import Union from pandas.plotting import register_matplotlib_converters -from gamestonk_terminal.helper_funcs import ( - export_data, - print_rich_table, -) import gamestonk_terminal.cryptocurrency.due_diligence.pycoingecko_model as gecko from gamestonk_terminal.cryptocurrency.dataframe_helpers import wrap_text_in_df +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() -# pylint: disable=inconsistent-return-statements -# pylint: disable=R0904, C0302 - +@log_start_end(log=logger) def display_coin_potential_returns( main_coin: str, vs: Union[str, None] = None, @@ -41,11 +40,13 @@ def display_coin_potential_returns( Export dataframe data to csv,json,xlsx file """ df = gecko.get_coin_potential_returns(main_coin, vs, top, price) + df["Potential Market Cap ($)"] = df.apply( - lambda x: "{:,}".format(int(x["Potential Market Cap ($)"])), axis=1 + lambda x: f"{int(x['Potential Market Cap ($)']):n}", axis=1 ) + df["Current Market Cap ($)"] = df.apply( - lambda x: "{:,}".format(int(x["Current Market Cap ($)"])), axis=1 + lambda x: f"{int(x['Current Market Cap ($)']):n}", axis=1 ) print_rich_table( @@ -61,6 +62,7 @@ def display_coin_potential_returns( ) +@log_start_end(log=logger) def display_info(symbol: str, export: str) -> None: """Shows basic information about loaded coin. [Source: CoinGecko] @@ -74,7 +76,7 @@ def display_info(symbol: str, export: str) -> None: coin = gecko.Coin(symbol) - df = wrap_text_in_df(coin.get_base_info, w=80) + df = wrap_text_in_df(coin.get_base_info(), w=80) print_rich_table( df, headers=list(df.columns), show_index=False, title="Basic Coin Information" @@ -89,6 +91,7 @@ def display_info(symbol: str, export: str) -> None: ) +@log_start_end(log=logger) def display_web(symbol: str, export: str) -> None: """Shows found websites corresponding to loaded coin. [Source: CoinGecko] @@ -102,7 +105,7 @@ def display_web(symbol: str, export: str) -> None: coin = gecko.Coin(symbol) - df = coin.get_websites + df = coin.get_websites() print_rich_table( df, headers=list(df.columns), show_index=False, title="Websites for Loaded Coin" @@ -117,6 +120,7 @@ def display_web(symbol: str, export: str) -> None: ) +@log_start_end(log=logger) def display_social(symbol: str, export: str) -> None: """Shows social media corresponding to loaded coin. [Source: CoinGecko] @@ -128,7 +132,7 @@ def display_social(symbol: str, export: str) -> None: Export dataframe data to csv,json,xlsx file """ coin = gecko.Coin(symbol) - df = coin.get_social_media + df = coin.get_social_media() print_rich_table( df, @@ -146,6 +150,7 @@ def display_social(symbol: str, export: str) -> None: ) +@log_start_end(log=logger) def display_dev(symbol: str, export: str) -> None: """Shows developers data for loaded coin. [Source: CoinGecko] @@ -158,7 +163,7 @@ def display_dev(symbol: str, export: str) -> None: """ coin = gecko.Coin(symbol) - df = coin.get_developers_data + df = coin.get_developers_data() print_rich_table( df, @@ -176,6 +181,7 @@ def display_dev(symbol: str, export: str) -> None: ) +@log_start_end(log=logger) def display_ath(symbol: str, currency: str, export: str) -> None: """Shows all time high data for loaded coin. [Source: CoinGecko] @@ -204,6 +210,7 @@ def display_ath(symbol: str, currency: str, export: str) -> None: ) +@log_start_end(log=logger) def display_atl(symbol: str, currency: str, export: str) -> None: """Shows all time low data for loaded coin. [Source: CoinGecko] @@ -232,6 +239,7 @@ def display_atl(symbol: str, currency: str, export: str) -> None: ) +@log_start_end(log=logger) def display_score(symbol: str, export: str) -> None: """Shows different kind of scores for loaded coin. [Source: CoinGecko] @@ -244,7 +252,7 @@ def display_score(symbol: str, export: str) -> None: """ coin = gecko.Coin(symbol) - df = coin.get_scores + df = coin.get_scores() print_rich_table( df, @@ -262,6 +270,7 @@ def display_score(symbol: str, export: str) -> None: ) +@log_start_end(log=logger) def display_bc(symbol: str, export: str) -> None: """Shows urls to blockchain explorers. [Source: CoinGecko] @@ -274,7 +283,7 @@ def display_bc(symbol: str, export: str) -> None: """ coin = gecko.Coin(symbol) - df = coin.get_blockchain_explorers + df = coin.get_blockchain_explorers() print_rich_table( df, headers=list(df.columns), show_index=False, title="Blockchain URLs" @@ -289,6 +298,7 @@ def display_bc(symbol: str, export: str) -> None: ) +@log_start_end(log=logger) def display_market(symbol: str, export: str) -> None: """Shows market data for loaded coin. [Source: CoinGecko] @@ -301,7 +311,7 @@ def display_market(symbol: str, export: str) -> None: """ coin = gecko.Coin(symbol) - df = coin.get_market_data + df = coin.get_market_data() print_rich_table( df, headers=list(df.columns), show_index=False, title="Market Data" diff --git a/gamestonk_terminal/cryptocurrency/nft/nftcalendar_model.py b/gamestonk_terminal/cryptocurrency/nft/nftcalendar_model.py index ace81d70db1..c66e642ac57 100644 --- a/gamestonk_terminal/cryptocurrency/nft/nftcalendar_model.py +++ b/gamestonk_terminal/cryptocurrency/nft/nftcalendar_model.py @@ -1,12 +1,19 @@ """ nftcalendar.io Model """ __docformat__ = "numpy" +import logging + import pandas as pd import requests from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_nft_drops(url: str) -> pd.DataFrame: """Get NFT drops [Source: nftcalendar.io] @@ -56,6 +63,7 @@ def get_nft_drops(url: str) -> pd.DataFrame: ) +@log_start_end(log=logger) def get_nft_today_drops() -> pd.DataFrame: """Get NFT today drops [Source: nftcalendar.io] @@ -67,6 +75,7 @@ def get_nft_today_drops() -> pd.DataFrame: return get_nft_drops("https://nftcalendar.io/") +@log_start_end(log=logger) def get_nft_upcoming_drops() -> pd.DataFrame: """Get NFT upcoming drops [Source: nftcalendar.io] @@ -78,6 +87,7 @@ def get_nft_upcoming_drops() -> pd.DataFrame: return get_nft_drops("https://nftcalendar.io/events") +@log_start_end(log=logger) def get_nft_ongoing_drops() -> pd.DataFrame: """Get NFT ongoing drops [Source: nftcalendar.io] @@ -89,6 +99,7 @@ def get_nft_ongoing_drops() -> pd.DataFrame: return get_nft_drops("https://nftcalendar.io/events/ongoing/") +@log_start_end(log=logger) def get_nft_newest_drops() -> pd.DataFrame: """Get NFT newest drops [Source: nftcalendar.io] diff --git a/gamestonk_terminal/cryptocurrency/nft/nftcalendar_view.py b/gamestonk_terminal/cryptocurrency/nft/nftcalendar_view.py index b5730916b5c..fd91fe64e62 100644 --- a/gamestonk_terminal/cryptocurrency/nft/nftcalendar_view.py +++ b/gamestonk_terminal/cryptocurrency/nft/nftcalendar_view.py @@ -1,12 +1,18 @@ """ nftcalendar.io View """ __docformat__ = "numpy" +import logging import os -from gamestonk_terminal.helper_funcs import export_data + from gamestonk_terminal.cryptocurrency.nft import nftcalendar_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_nft_today_drops(num: int, export: str): """Display NFT today drops. [Source: nftcalendar.io] @@ -36,6 +42,7 @@ def display_nft_today_drops(num: int, export: str): ) +@log_start_end(log=logger) def display_nft_upcoming_drops(num: int, export: str): """Display NFT upcoming drops. [Source: nftcalendar.io] @@ -65,6 +72,7 @@ def display_nft_upcoming_drops(num: int, export: str): ) +@log_start_end(log=logger) def display_nft_ongoing_drops(num: int, export: str): """Display NFT ongoing drops. [Source: nftcalendar.io] @@ -94,6 +102,7 @@ def display_nft_ongoing_drops(num: int, export: str): ) +@log_start_end(log=logger) def display_nft_newest_drops(num: int, export: str): """Display NFT newest drops. [Source: nftcalendar.io] diff --git a/gamestonk_terminal/cryptocurrency/nft/opensea_model.py b/gamestonk_terminal/cryptocurrency/nft/opensea_model.py index 2440e260e87..f75ff69ab24 100644 --- a/gamestonk_terminal/cryptocurrency/nft/opensea_model.py +++ b/gamestonk_terminal/cryptocurrency/nft/opensea_model.py @@ -1,12 +1,19 @@ """ opensea.io Model """ +import logging from datetime import datetime -import requests + import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) API_URL = "https://api.opensea.io/api/v1" +@log_start_end(log=logger) def get_collection_stats(slug: str) -> pd.DataFrame: """Get stats of a nft collection [Source: opensea.io] diff --git a/gamestonk_terminal/cryptocurrency/nft/opensea_view.py b/gamestonk_terminal/cryptocurrency/nft/opensea_view.py index 1c6800f98d1..1f550669f17 100644 --- a/gamestonk_terminal/cryptocurrency/nft/opensea_view.py +++ b/gamestonk_terminal/cryptocurrency/nft/opensea_view.py @@ -1,11 +1,17 @@ """ opensea.io View """ +import logging import os -from gamestonk_terminal.helper_funcs import export_data, print_rich_table + from gamestonk_terminal.cryptocurrency.nft.opensea_model import get_collection_stats +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_collection_stats(slug: str, export: str): """Display collection stats. [Source: opensea.io] diff --git a/gamestonk_terminal/cryptocurrency/onchain/bitquery_model.py b/gamestonk_terminal/cryptocurrency/onchain/bitquery_model.py index 34f5a46feae..988d0a86230 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/bitquery_model.py +++ b/gamestonk_terminal/cryptocurrency/onchain/bitquery_model.py @@ -3,25 +3,31 @@ __docformat__ = "numpy" import datetime import json +import logging import os from typing import Optional import numpy as np -from requests.exceptions import HTTPError -from requests.adapters import HTTPAdapter - -import requests import pandas as pd +import requests +from requests.adapters import HTTPAdapter +from requests.exceptions import HTTPError + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) class BitQueryApiKeyException(Exception): """Bit Query Api Key Exception object""" + @log_start_end(log=logger) def __init__(self, message: str): super().__init__(message) self.message = message + @log_start_end(log=logger) def __str__(self) -> str: return f"BitQueryApiKeyException: {self.message}" @@ -123,6 +129,7 @@ DECENTRALIZED_EXCHANGES_MAP = {e.lower(): e for e in DECENTRALIZED_EXCHANGES} NETWORKS = ["bsc", "ethereum", "matic"] +@log_start_end(log=logger) def _extract_dex_trades(data: dict) -> pd.DataFrame: """Helper method that extracts from bitquery api response data from nested dictionary: response = {'ethereum' : {'dexTrades' : }}. If 'dexTrades' is None, raises Exception. @@ -144,6 +151,7 @@ def _extract_dex_trades(data: dict) -> pd.DataFrame: return pd.json_normalize(dex_trades) +@log_start_end(log=logger) def query_graph(url: str, query: str) -> dict: """Helper methods for querying graphql api. [Source: https://bitquery.io/] @@ -191,6 +199,7 @@ def query_graph(url: str, query: str) -> dict: return data["data"] +@log_start_end(log=logger) def get_erc20_tokens() -> pd.DataFrame: """Helper method that loads ~1500 most traded erc20 token. [Source: json file] @@ -211,6 +220,7 @@ def get_erc20_tokens() -> pd.DataFrame: return df[["name", "symbol", "address", "count"]] +@log_start_end(log=logger) def find_token_address(token: str) -> Optional[str]: """Helper methods that search for ERC20 coin base on provided symbol or token address. If erc20 token address is provided, then function checks if it's proper address and returns it back. @@ -244,6 +254,7 @@ def find_token_address(token: str) -> Optional[str]: return found_token.iloc[0]["address"] +@log_start_end(log=logger) def get_dex_trades_by_exchange( trade_amount_currency: str = "USD", limit: int = 90 ) -> pd.DataFrame: @@ -296,6 +307,7 @@ def get_dex_trades_by_exchange( ) +@log_start_end(log=logger) def get_dex_trades_monthly( trade_amount_currency: str = "USD", limit: int = 90 ) -> pd.DataFrame: @@ -352,6 +364,7 @@ def get_dex_trades_monthly( return df[["date", "trades", "tradeAmount"]] +@log_start_end(log=logger) def get_daily_dex_volume_for_given_pair( limit: int = 100, token: str = "UNI", @@ -449,6 +462,7 @@ def get_daily_dex_volume_for_given_pair( ].sort_values(by="date", ascending=False) +@log_start_end(log=logger) def get_token_volume_on_dexes( token: str = "UNI", trade_amount_currency: str = "USD", @@ -507,6 +521,7 @@ def get_token_volume_on_dexes( ) +@log_start_end(log=logger) def get_ethereum_unique_senders(interval: str = "day", limit: int = 90) -> pd.DataFrame: """Get number of unique ethereum addresses which made a transaction in given time interval. @@ -562,6 +577,7 @@ def get_ethereum_unique_senders(interval: str = "day", limit: int = 90) -> pd.Da return df[UEAT_FILTERS] +@log_start_end(log=logger) def get_most_traded_pairs( network: str = "ethereum", exchange: str = "Uniswap", limit: int = 90 ) -> pd.DataFrame: @@ -611,6 +627,7 @@ def get_most_traded_pairs( return df[TTCP_FILTERS] +@log_start_end(log=logger) def get_spread_for_crypto_pair( token: str = "WETH", vs: str = "USDT", limit: int = 30 ) -> pd.DataFrame: diff --git a/gamestonk_terminal/cryptocurrency/onchain/bitquery_view.py b/gamestonk_terminal/cryptocurrency/onchain/bitquery_view.py index 4a81332d7f9..1db3d37f3f3 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/bitquery_view.py +++ b/gamestonk_terminal/cryptocurrency/onchain/bitquery_view.py @@ -1,17 +1,22 @@ """The BitQuery view""" __docformat__ = "numpy" +import logging import os from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( - very_long_number_formatter, prettify_column_names, + very_long_number_formatter, ) from gamestonk_terminal.cryptocurrency.onchain import bitquery_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_dex_trades( trade_amount_currency: str = "USD", kind: str = "dex", @@ -73,6 +78,7 @@ def display_dex_trades( ) +@log_start_end(log=logger) def display_daily_volume_for_given_pair( token: str = "WBTC", vs: str = "USDT", @@ -137,6 +143,7 @@ def display_daily_volume_for_given_pair( ) +@log_start_end(log=logger) def display_dex_volume_for_token( token: str = "WBTC", trade_amount_currency: str = "USD", @@ -195,6 +202,7 @@ def display_dex_volume_for_token( ) +@log_start_end(log=logger) def display_ethereum_unique_senders( interval: str = "days", limit: int = 10, @@ -253,6 +261,7 @@ def display_ethereum_unique_senders( ) +@log_start_end(log=logger) def display_most_traded_pairs( exchange="Uniswap", days: int = 10, @@ -307,6 +316,7 @@ def display_most_traded_pairs( ) +@log_start_end(log=logger) def display_spread_for_crypto_pair( token="ETH", vs="USDC", diff --git a/gamestonk_terminal/cryptocurrency/onchain/blockchain_model.py b/gamestonk_terminal/cryptocurrency/onchain/blockchain_model.py index e4c8d1c3cc7..224400bc019 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/blockchain_model.py +++ b/gamestonk_terminal/cryptocurrency/onchain/blockchain_model.py @@ -1,10 +1,17 @@ """Blockchain model""" __docformat__ = "numpy" -import requests +import logging + import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def _make_request(endpoint: str) -> dict: """Helper method handles Blockchain API requests. [Source: https://api.blockchain.info/] @@ -30,6 +37,7 @@ def _make_request(endpoint: str) -> dict: raise ValueError(f"Invalid Response: {response.text}") from e +@log_start_end(log=logger) def get_btc_circulating_supply() -> pd.DataFrame: """Returns BTC circulating supply [Source: https://api.blockchain.info/] @@ -48,6 +56,7 @@ def get_btc_circulating_supply() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_btc_confirmed_transactions() -> pd.DataFrame: """Returns BTC confirmed transactions [Source: https://api.blockchain.info/] diff --git a/gamestonk_terminal/cryptocurrency/onchain/blockchain_view.py b/gamestonk_terminal/cryptocurrency/onchain/blockchain_view.py index c47c106ba7e..72c51b997f0 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/blockchain_view.py +++ b/gamestonk_terminal/cryptocurrency/onchain/blockchain_view.py @@ -1,20 +1,28 @@ """Blockchain View""" __docformat__ = "numpy" +import logging import os from datetime import datetime + import matplotlib.pyplot as plt -from matplotlib import ticker, dates as mdates -from gamestonk_terminal.cryptocurrency.onchain import blockchain_model -from gamestonk_terminal.helper_funcs import ( - export_data, - plot_autoscale, - long_number_format, -) +from matplotlib import dates as mdates +from matplotlib import ticker + from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.cryptocurrency.onchain import blockchain_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import ( + export_data, + long_number_format, + plot_autoscale, +) + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_btc_circulating_supply(since: int, until: int, export: str) -> None: """Returns BTC circulating supply [Source: https://api.blockchain.info/] @@ -62,6 +70,7 @@ def display_btc_circulating_supply(since: int, until: int, export: str) -> None: ) +@log_start_end(log=logger) def display_btc_confirmed_transactions(since: int, until: int, export: str) -> None: """Returns BTC confirmed transactions [Source: https://api.blockchain.info/] diff --git a/gamestonk_terminal/cryptocurrency/onchain/ethgasstation_model.py b/gamestonk_terminal/cryptocurrency/onchain/ethgasstation_model.py index 341104c3944..c3798ae6d56 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/ethgasstation_model.py +++ b/gamestonk_terminal/cryptocurrency/onchain/ethgasstation_model.py @@ -1,8 +1,15 @@ """ETH Gas Station model""" +import logging + import pandas as pd import requests +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_gwei_fees() -> pd.DataFrame: """Returns the most recent Ethereum gas fees in gwei [Source: https://ethgasstation.info] diff --git a/gamestonk_terminal/cryptocurrency/onchain/ethgasstation_view.py b/gamestonk_terminal/cryptocurrency/onchain/ethgasstation_view.py index cc734c41061..fa08684bc5d 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/ethgasstation_view.py +++ b/gamestonk_terminal/cryptocurrency/onchain/ethgasstation_view.py @@ -1,11 +1,16 @@ """ETH Gas Station view""" +import logging import os -from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.cryptocurrency.onchain.ethgasstation_model import get_gwei_fees +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_gwei_fees(export: str) -> None: """Current gwei fees [Source: https://ethgasstation.info] diff --git a/gamestonk_terminal/cryptocurrency/onchain/ethplorer_model.py b/gamestonk_terminal/cryptocurrency/onchain/ethplorer_model.py index 2b9b9124da2..4897ef812b7 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/ethplorer_model.py +++ b/gamestonk_terminal/cryptocurrency/onchain/ethplorer_model.py @@ -1,15 +1,20 @@ """Ethplorer model""" __docformat__ = "numpy" +import logging import textwrap - from datetime import datetime -from typing import Any, Optional from time import sleep +from typing import Any, Optional + import pandas as pd import requests -from gamestonk_terminal.cryptocurrency.dataframe_helpers import create_df_index + import gamestonk_terminal.config_terminal as cfg +from gamestonk_terminal.cryptocurrency.dataframe_helpers import create_df_index +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) PRICES_FILTERS = [ "date", @@ -50,6 +55,7 @@ HOLDERS_FILTERS = [ ] +@log_start_end(log=logger) def split_cols_with_dot(column: str) -> str: """Split column name in data frame columns whenever there is a dot between 2 words. E.g. price.availableSupply -> priceAvailableSupply. @@ -65,6 +71,7 @@ def split_cols_with_dot(column: str) -> str: Value of column with replaced format. """ + @log_start_end(log=logger) def replace(string: str, char: str, index: int) -> str: """Helper method which replaces values with dot as a separator and converts it to camelCase format @@ -92,6 +99,7 @@ def split_cols_with_dot(column: str) -> str: return column +@log_start_end(log=logger) def enrich_social_media(dct: dict) -> None: """Searching inside dictionary if there are any information about twitter, reddit or coingecko. If yes it updates dictionary with url to given social media site. @@ -113,6 +121,7 @@ def enrich_social_media(dct: dict) -> None: dct[k] = v + dct[k] +@log_start_end(log=logger) def make_request(endpoint: str, address: Optional[str] = None, **kwargs: Any) -> dict: """Helper method that handles request for Ethplorer API [Source: https://ethplorer.io/] @@ -152,6 +161,7 @@ def make_request(endpoint: str, address: Optional[str] = None, **kwargs: Any) -> return response +@log_start_end(log=logger) def get_token_decimals(address: str) -> Optional[int]: """Helper methods that gets token decimals number. [Source: Ethplorer] @@ -171,6 +181,7 @@ def get_token_decimals(address: str) -> Optional[int]: return None +@log_start_end(log=logger) def get_address_info(address: str) -> pd.DataFrame: """Get info about tokens on you ethereum blockchain balance. Eth balance, balance of all tokens which have name and symbol. [Source: Ethplorer] @@ -237,6 +248,7 @@ def get_address_info(address: str) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_top_tokens() -> pd.DataFrame: """Get top 50 tokens. [Source: Ethplorer] @@ -265,6 +277,7 @@ def get_top_tokens() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_top_token_holders(address) -> pd.DataFrame: """Get info about top token holders. [Source: Ethplorer] @@ -288,6 +301,7 @@ def get_top_token_holders(address) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_address_history(address) -> pd.DataFrame: """Get information about balance historical transactions. [Source: Ethplorer] @@ -321,6 +335,7 @@ def get_address_history(address) -> pd.DataFrame: return df[cols] +@log_start_end(log=logger) def get_token_info(address) -> pd.DataFrame: """Get info about ERC20 token. [Source: Ethplorer] @@ -382,6 +397,7 @@ def get_token_info(address) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_tx_info(tx_hash) -> pd.DataFrame: """Get info about transaction. [Source: Ethplorer] @@ -424,6 +440,7 @@ def get_tx_info(tx_hash) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_token_history(address) -> pd.DataFrame: """Get info about token historical transactions. [Source: Ethplorer] @@ -467,6 +484,7 @@ def get_token_history(address) -> pd.DataFrame: return df[["timestamp", "name", "symbol", "value", "from", "to", "transactionHash"]] +@log_start_end(log=logger) def get_token_historical_price(address) -> pd.DataFrame: """Get token historical prices with volume and market cap, and average price. [Source: Ethplorer] diff --git a/gamestonk_terminal/cryptocurrency/onchain/ethplorer_view.py b/gamestonk_terminal/cryptocurrency/onchain/ethplorer_view.py index 297e52356d0..944886efd88 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/ethplorer_view.py +++ b/gamestonk_terminal/cryptocurrency/onchain/ethplorer_view.py @@ -1,15 +1,21 @@ """Ethplorer view""" __docformat__ = "numpy" +import logging import os -from gamestonk_terminal.helper_funcs import export_data, print_rich_table + from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( very_long_number_formatter, ) from gamestonk_terminal.cryptocurrency.onchain import ethplorer_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_address_info( address: str, top: int = 15, @@ -57,6 +63,7 @@ def display_address_info( ) +@log_start_end(log=logger) def display_top_tokens( top: int = 15, sortby: str = "rank", @@ -101,6 +108,7 @@ def display_top_tokens( ) +@log_start_end(log=logger) def display_top_token_holders( address: str, top: int = 10, @@ -145,6 +153,7 @@ def display_top_token_holders( ) +@log_start_end(log=logger) def display_address_history( address: str, top: int = 10, @@ -191,6 +200,7 @@ def display_address_history( ) +@log_start_end(log=logger) def display_token_info( address: str, social: bool = False, @@ -231,6 +241,7 @@ def display_token_info( ) +@log_start_end(log=logger) def display_tx_info( tx_hash: str, export: str = "", @@ -263,6 +274,7 @@ def display_tx_info( ) +@log_start_end(log=logger) def display_token_history( address: str, top: int = 10, @@ -319,6 +331,7 @@ def display_token_history( ) +@log_start_end(log=logger) def display_token_historical_prices( address: str, top: int = 30, diff --git a/gamestonk_terminal/cryptocurrency/onchain/whale_alert_model.py b/gamestonk_terminal/cryptocurrency/onchain/whale_alert_model.py index d5e67f9005f..4183c671751 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/whale_alert_model.py +++ b/gamestonk_terminal/cryptocurrency/onchain/whale_alert_model.py @@ -1,12 +1,18 @@ """Whale Alert model""" __docformat__ = "numpy" -from typing import Optional +import logging import textwrap -import requests -import pandas as pd +from typing import Optional + import numpy as np +import pandas as pd +import requests + import gamestonk_terminal.config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) FILTERS = [ "date", @@ -22,14 +28,17 @@ FILTERS = [ class ApiKeyException(Exception): """Api Key Exception object""" + @log_start_end(log=logger) def __init__(self, message: str): super().__init__(message) self.message = message + @log_start_end(log=logger) def __str__(self) -> str: return f"ApiKeyException: {self.message}" +@log_start_end(log=logger) def make_request(params: Optional[dict] = None) -> dict: """Helper methods for requests [Source: https://docs.whale-alert.io/] @@ -56,6 +65,7 @@ def make_request(params: Optional[dict] = None) -> dict: raise ValueError(f"Invalid Response: {response.text}") from e +@log_start_end(log=logger) def get_whales_transactions(min_value: int = 800000, limit: int = 100) -> pd.DataFrame: """Whale Alert's API allows you to retrieve live and historical transaction data from major blockchains. Supported blockchain: Bitcoin, Ethereum, Ripple, NEO, EOS, Stellar and Tron. [Source: https://docs.whale-alert.io/] diff --git a/gamestonk_terminal/cryptocurrency/onchain/whale_alert_view.py b/gamestonk_terminal/cryptocurrency/onchain/whale_alert_view.py index 41b8c8e4ac1..cb2045307e9 100644 --- a/gamestonk_terminal/cryptocurrency/onchain/whale_alert_view.py +++ b/gamestonk_terminal/cryptocurrency/onchain/whale_alert_view.py @@ -1,16 +1,22 @@ """Whale Alert view""" __docformat__ = "numpy" +import logging import os + +from gamestonk_terminal.cryptocurrency.onchain import whale_alert_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, long_number_format, print_rich_table, ) -from gamestonk_terminal.cryptocurrency.onchain import whale_alert_model from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_whales_transactions( min_value: int = 800000, top: int = 100, diff --git a/gamestonk_terminal/cryptocurrency/overview/blockchaincenter_model.py b/gamestonk_terminal/cryptocurrency/overview/blockchaincenter_model.py index e7dc0f1e30a..96ef6afcc8f 100644 --- a/gamestonk_terminal/cryptocurrency/overview/blockchaincenter_model.py +++ b/gamestonk_terminal/cryptocurrency/overview/blockchaincenter_model.py @@ -1,15 +1,21 @@ """Blockchain Center Model""" import json +import logging from datetime import datetime + import pandas as pd import requests from bs4 import BeautifulSoup +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + DAYS = [30, 90, 365] +@log_start_end(log=logger) def get_altcoin_index(period: int, since: int, until: int) -> pd.DataFrame: """Get altcoin index overtime [Source: https://blockchaincenter.net] diff --git a/gamestonk_terminal/cryptocurrency/overview/blockchaincenter_view.py b/gamestonk_terminal/cryptocurrency/overview/blockchaincenter_view.py index 723f8ecd04f..4f0c5224b81 100644 --- a/gamestonk_terminal/cryptocurrency/overview/blockchaincenter_view.py +++ b/gamestonk_terminal/cryptocurrency/overview/blockchaincenter_view.py @@ -1,16 +1,24 @@ """Blockchain Center View""" +import logging import os -from matplotlib import pyplot as plt, dates as mdates + +from matplotlib import dates as mdates +from matplotlib import pyplot as plt + +from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal.cryptocurrency.overview.blockchaincenter_model import ( - get_altcoin_index, DAYS, + get_altcoin_index, ) +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale -from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_altcoin_index( period: int, since: int, until: int, export: str = "" ) -> None: diff --git a/gamestonk_terminal/cryptocurrency/overview/coinbase_model.py b/gamestonk_terminal/cryptocurrency/overview/coinbase_model.py index 59bdc182869..1bfae04d992 100644 --- a/gamestonk_terminal/cryptocurrency/overview/coinbase_model.py +++ b/gamestonk_terminal/cryptocurrency/overview/coinbase_model.py @@ -1,10 +1,12 @@ """Coinbase model""" __docformat__ = "numpy" +import logging import pandas as pd -from gamestonk_terminal.cryptocurrency.coinbase_helpers import ( - make_coinbase_request, -) +from gamestonk_terminal.cryptocurrency.coinbase_helpers import make_coinbase_request +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) PAIRS_FILTERS = [ "id", @@ -18,6 +20,7 @@ PAIRS_FILTERS = [ ] +@log_start_end(log=logger) def get_trading_pairs() -> pd.DataFrame: """Get a list of available currency pairs for trading. [Source: Coinbase] diff --git a/gamestonk_terminal/cryptocurrency/overview/coinbase_view.py b/gamestonk_terminal/cryptocurrency/overview/coinbase_view.py index 1cd7fe9daa7..dcbf254c2a7 100644 --- a/gamestonk_terminal/cryptocurrency/overview/coinbase_view.py +++ b/gamestonk_terminal/cryptocurrency/overview/coinbase_view.py @@ -1,14 +1,22 @@ """Coinbase view""" __docformat__ = "numpy" +import logging import os -from gamestonk_terminal.helper_funcs import export_data from gamestonk_terminal.cryptocurrency.overview import coinbase_model -from gamestonk_terminal.helper_funcs import long_number_format, print_rich_table +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import ( + export_data, + long_number_format, + print_rich_table, +) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_trading_pairs(top: int, sortby: str, descend: bool, export: str) -> None: """Displays a list of available currency pairs for trading. [Source: Coinbase] diff --git a/gamestonk_terminal/cryptocurrency/overview/coinpaprika_model.py b/gamestonk_terminal/cryptocurrency/overview/coinpaprika_model.py index ccbc1785d72..34d62bdba99 100644 --- a/gamestonk_terminal/cryptocurrency/overview/coinpaprika_model.py +++ b/gamestonk_terminal/cryptocurrency/overview/coinpaprika_model.py @@ -1,13 +1,19 @@ """CoinPaprika model""" __docformat__ = "numpy" -from datetime import datetime +import logging import textwrap +from datetime import datetime + import pandas as pd from dateutil import parser + from gamestonk_terminal.cryptocurrency.coinpaprika_helpers import PaprikaSession +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + MARKETS_FILTERS = [ "rank", "name", @@ -62,6 +68,7 @@ EXCHANGES_FILTERS = [ CONTRACTS_FILTERS = ["id", "type", "active"] +@log_start_end(log=logger) def get_global_market() -> pd.DataFrame: """Return data frame with most important global crypto statistics like: market_cap_usd, volume_24h_usd, bitcoin_dominance_percentage, cryptocurrencies_number, @@ -92,6 +99,7 @@ def get_global_market() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_list_of_coins() -> pd.DataFrame: """Get list of all available coins on CoinPaprika [Source: CoinPaprika] @@ -109,6 +117,7 @@ def get_list_of_coins() -> pd.DataFrame: return df[["rank", "id", "name", "symbol", "type"]] +@log_start_end(log=logger) def _get_coins_info_helper(quotes: str = "USD") -> pd.DataFrame: """Helper method that call /tickers endpoint which returns for all coins quoted in provided currency/crypto @@ -183,6 +192,7 @@ def _get_coins_info_helper(quotes: str = "USD") -> pd.DataFrame: return data +@log_start_end(log=logger) def get_coins_info(quotes: str = "USD") -> pd.DataFrame: # > format big numbers fix """Returns basic coin information for all coins from CoinPaprika API [Source: CoinPaprika] @@ -214,6 +224,7 @@ def get_coins_info(quotes: str = "USD") -> pd.DataFrame: # > format big numbers return _get_coins_info_helper(quotes)[cols].sort_values(by="rank") +@log_start_end(log=logger) def get_coins_market_info(quotes: str = "USD") -> pd.DataFrame: """Returns basic coin information for all coins from CoinPaprika API [Source: CoinPaprika] @@ -244,6 +255,7 @@ def get_coins_market_info(quotes: str = "USD") -> pd.DataFrame: return _get_coins_info_helper(quotes=quotes)[cols].sort_values(by="rank") +@log_start_end(log=logger) def get_list_of_exchanges(quotes: str = "USD") -> pd.DataFrame: """ List exchanges from CoinPaprika API [Source: CoinPaprika] @@ -296,6 +308,7 @@ def get_list_of_exchanges(quotes: str = "USD") -> pd.DataFrame: return df.sort_values(by="rank") +@log_start_end(log=logger) def get_exchanges_market( exchange_id: str = "binance", quotes: str = "USD" ) -> pd.DataFrame: @@ -337,6 +350,7 @@ def get_exchanges_market( return df[cols] +@log_start_end(log=logger) def get_all_contract_platforms() -> pd.DataFrame: """List all smart contract platforms like ethereum, solana, cosmos, polkadot, kusama ... [Source: CoinPaprika] @@ -357,6 +371,7 @@ def get_all_contract_platforms() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_contract_platform(platform_id: str = "eth-ethereum") -> pd.DataFrame: """Gets all contract addresses for given platform [Source: CoinPaprika] Parameters diff --git a/gamestonk_terminal/cryptocurrency/overview/coinpaprika_view.py b/gamestonk_terminal/cryptocurrency/overview/coinpaprika_view.py index 798e0f44028..f28c61bde79 100644 --- a/gamestonk_terminal/cryptocurrency/overview/coinpaprika_view.py +++ b/gamestonk_terminal/cryptocurrency/overview/coinpaprika_view.py @@ -1,15 +1,21 @@ """CoinPaprika view""" __docformat__ = "numpy" +import logging import os + from pandas.plotting import register_matplotlib_converters -from gamestonk_terminal.helper_funcs import export_data, print_rich_table + import gamestonk_terminal.cryptocurrency.overview.coinpaprika_model as paprika from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( long_number_format_with_type_check, ) +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() # pylint: disable=inconsistent-return-statements @@ -64,6 +70,7 @@ CURRENCIES = [ # EXCHANGES = paprika.get_list_of_exchanges() +@log_start_end(log=logger) def display_global_market(export: str) -> None: """Return data frame with most important global crypto statistics like: market_cap_usd, volume_24h_usd, bitcoin_dominance_percentage, cryptocurrencies_number, @@ -93,6 +100,7 @@ def display_global_market(export: str) -> None: ) +@log_start_end(log=logger) def display_all_coins_market_info( currency: str, sortby: str, descend: bool, top: int, export: str ) -> None: @@ -145,6 +153,7 @@ def display_all_coins_market_info( ) +@log_start_end(log=logger) def display_all_coins_info( currency: str, sortby: str, descend: bool, top: int, export: str ) -> None: @@ -196,6 +205,7 @@ def display_all_coins_info( ) +@log_start_end(log=logger) def display_all_exchanges( currency: str, sortby: str, descend: bool, top: int, export: str ) -> None: @@ -245,6 +255,7 @@ def display_all_exchanges( ) +@log_start_end(log=logger) def display_exchange_markets( exchange: str, sortby: str, descend: bool, top: int, links: bool, export: str ) -> None: @@ -297,6 +308,7 @@ def display_exchange_markets( ) +@log_start_end(log=logger) def display_all_platforms(export: str) -> None: """List all smart contract platforms like ethereum, solana, cosmos, polkadot, kusama. [Source: CoinPaprika] @@ -321,6 +333,7 @@ def display_all_platforms(export: str) -> None: ) +@log_start_end(log=logger) def display_contracts( platform: str, sortby: str, descend: bool, top: int, export: str ) -> None: diff --git a/gamestonk_terminal/cryptocurrency/overview/cryptopanic_model.py b/gamestonk_terminal/cryptocurrency/overview/cryptopanic_model.py index f03f6eaf7f8..ff953cc8f42 100644 --- a/gamestonk_terminal/cryptocurrency/overview/cryptopanic_model.py +++ b/gamestonk_terminal/cryptocurrency/overview/cryptopanic_model.py @@ -1,15 +1,19 @@ """Cryptopanic model""" __docformat__ = "numpy" -import time +import logging import math import textwrap -from typing import Optional, Any +import time +from typing import Any, Optional + import pandas as pd import requests - import gamestonk_terminal.config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) CATEGORIES = ["news", "media"] @@ -37,14 +41,17 @@ REGIONS = ["en", "de", "es", "fr", "nl", "it", "pt", "ru"] class ApiKeyException(Exception): """Api Key Exception object""" + @log_start_end(log=logger) def __init__(self, message: str): super().__init__(message) self.message = message + @log_start_end(log=logger) def __str__(self) -> str: return f"ApiKeyException: {self.message}" +@log_start_end(log=logger) def make_request(**kwargs: Any) -> dict: """Helper methods for requests [Source: https://cryptopanic.com/developers/api/] @@ -95,6 +102,7 @@ def make_request(**kwargs: Any) -> dict: raise ValueError(f"Invalid Response: {response.text}") from e +@log_start_end(log=logger) def _parse_post(post: dict) -> dict: """Helper method - parse news response object to dictionary with target structure. [Source: https://cryptopanic.com/] @@ -120,6 +128,7 @@ def _parse_post(post: dict) -> dict: } +@log_start_end(log=logger) def get_news( limit: int = 60, post_kind: str = "news", diff --git a/gamestonk_terminal/cryptocurrency/overview/cryptopanic_view.py b/gamestonk_terminal/cryptocurrency/overview/cryptopanic_view.py index 604092046c6..c4fc50a1265 100644 --- a/gamestonk_terminal/cryptocurrency/overview/cryptopanic_view.py +++ b/gamestonk_terminal/cryptocurrency/overview/cryptopanic_view.py @@ -1,14 +1,19 @@ """Cryptopanic view""" __docformat__ = "numpy" +import logging import os from typing import Optional -from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.cryptocurrency.overview import cryptopanic_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_news( post_kind: str = "news", region: str = "en", diff --git a/gamestonk_terminal/cryptocurrency/overview/pycoingecko_model.py b/gamestonk_terminal/cryptocurrency/overview/pycoingecko_model.py index dc464df17a2..43d24af5d41 100644 --- a/gamestonk_terminal/cryptocurrency/overview/pycoingecko_model.py +++ b/gamestonk_terminal/cryptocurrency/overview/pycoingecko_model.py @@ -3,17 +3,23 @@ __docformat__ = "numpy" # pylint: disable=C0301, E1101 -from typing import Any, List +import logging import re -import pandas as pd +from typing import Any, List + import numpy as np +import pandas as pd from pycoingecko import CoinGeckoAPI -from gamestonk_terminal.cryptocurrency.discovery.pycoingecko_model import get_coins + from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( create_df_index, long_number_format_with_type_check, replace_underscores_in_column_names, ) +from gamestonk_terminal.cryptocurrency.discovery.pycoingecko_model import get_coins +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) HOLD_COINS = ["ethereum", "bitcoin"] @@ -90,6 +96,7 @@ COINS_COLUMNS = [ ] +@log_start_end(log=logger) def get_holdings_overview(endpoint: str = "bitcoin") -> List[Any]: """Returns public companies that holds ethereum or bitcoin [Source: CoinGecko] @@ -133,6 +140,7 @@ SORT_VALUES = [ ] +@log_start_end(log=logger) def coin_formatter(n): # TODO: can be improved coins = [] @@ -142,6 +150,7 @@ def coin_formatter(n): return ",".join(coins) +@log_start_end(log=logger) def get_top_crypto_categories(sort_filter: str = SORT_VALUES[0]) -> pd.DataFrame: """Returns top crypto categories [Source: CoinGecko] @@ -167,6 +176,7 @@ def get_top_crypto_categories(sort_filter: str = SORT_VALUES[0]) -> pd.DataFrame # TODO: add string with overview +@log_start_end(log=logger) def get_stable_coins(top: int = 20) -> pd.DataFrame: """Returns top stable coins [Source: CoinGecko] @@ -180,6 +190,7 @@ def get_stable_coins(top: int = 20) -> pd.DataFrame: return df[COINS_COLUMNS] +@log_start_end(log=logger) def get_exchanges() -> pd.DataFrame: """Get list of top exchanges from CoinGecko API [Source: CoinGecko] @@ -216,6 +227,7 @@ def get_exchanges() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_financial_platforms() -> pd.DataFrame: """Get list of financial platforms from CoinGecko API [Source: CoinGecko] @@ -233,6 +245,7 @@ def get_financial_platforms() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_finance_products() -> pd.DataFrame: """Get list of financial products from CoinGecko API @@ -257,6 +270,7 @@ def get_finance_products() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_indexes() -> pd.DataFrame: """Get list of crypto indexes from CoinGecko API [Source: CoinGecko] @@ -273,6 +287,7 @@ def get_indexes() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_derivatives() -> pd.DataFrame: """Get list of crypto derivatives from CoinGecko API [Source: CoinGecko] @@ -311,6 +326,7 @@ def get_derivatives() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_exchange_rates() -> pd.DataFrame: """Get list of crypto, fiats, commodity exchange rates from CoinGecko API [Source: CoinGecko] @@ -328,6 +344,7 @@ def get_exchange_rates() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_global_info() -> pd.DataFrame: """Get global statistics about crypto from CoinGecko API like: - market cap change @@ -361,6 +378,7 @@ def get_global_info() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_global_markets_info() -> pd.DataFrame: """Get global statistics about crypto markets from CoinGecko API like: Market_Cap, Volume, Market_Cap_Percentage @@ -389,6 +407,7 @@ def get_global_markets_info() -> pd.DataFrame: return df.reset_index() +@log_start_end(log=logger) def get_global_defi_info() -> pd.DataFrame: """Get global statistics about Decentralized Finances [Source: CoinGecko] diff --git a/gamestonk_terminal/cryptocurrency/overview/pycoingecko_view.py b/gamestonk_terminal/cryptocurrency/overview/pycoingecko_view.py index 3ee93a7873c..e6b26627d52 100644 --- a/gamestonk_terminal/cryptocurrency/overview/pycoingecko_view.py +++ b/gamestonk_terminal/cryptocurrency/overview/pycoingecko_view.py @@ -1,28 +1,36 @@ """CoinGecko view""" __docformat__ = "numpy" +import logging import os + +from matplotlib import pyplot as plt +from matplotlib import ticker from pandas.plotting import register_matplotlib_converters -from matplotlib import pyplot as plt, ticker + +import gamestonk_terminal.cryptocurrency.overview.pycoingecko_model as gecko from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal.cryptocurrency.dataframe_helpers import ( long_number_format_with_type_check, ) +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) -import gamestonk_terminal.cryptocurrency.overview.pycoingecko_model as gecko from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() # pylint: disable=inconsistent-return-statements # pylint: disable=R0904, C0302 +@log_start_end(log=logger) def display_holdings_overview(coin: str, show_bar: bool, export: str, top: int) -> None: """Shows overview of public companies that holds ethereum or bitcoin. [Source: CoinGecko] @@ -75,6 +83,7 @@ def display_holdings_overview(coin: str, show_bar: bool, export: str, top: int) ) +@log_start_end(log=logger) def display_exchange_rates(sortby: str, descend: bool, top: int, export: str) -> None: """Shows list of crypto, fiats, commodity exchange rates. [Source: CoinGecko] @@ -113,6 +122,7 @@ def display_exchange_rates(sortby: str, descend: bool, top: int, export: str) -> console.print("") +@log_start_end(log=logger) def display_global_market_info(pie: bool, export: str) -> None: """Shows global statistics about crypto. [Source: CoinGecko] - market cap change @@ -176,6 +186,7 @@ def display_global_market_info(pie: bool, export: str) -> None: console.print("") +@log_start_end(log=logger) def display_global_defi_info(export: str) -> None: """Shows global statistics about Decentralized Finances. [Source: CoinGecko] @@ -208,6 +219,7 @@ def display_global_defi_info(export: str) -> None: console.print("") +@log_start_end(log=logger) def display_stablecoins( top: int, export: str, sortby: str, descend: bool, pie: bool ) -> None: @@ -293,6 +305,7 @@ First {top} stablecoins have a total {long_number_format_with_type_check(total_m console.print("\nUnable to retrieve data from CoinGecko.\n") +@log_start_end(log=logger) def display_categories(sortby: str, top: int, export: str, pie: bool) -> None: """Shows top cryptocurrency categories by market capitalization @@ -352,6 +365,7 @@ def display_categories(sortby: str, top: int, export: str, pie: bool) -> None: console.print("\nUnable to retrieve data from CoinGecko.\n") +@log_start_end(log=logger) def display_exchanges( sortby: str, descend: bool, top: int, links: bool, export: str ) -> None: @@ -401,6 +415,7 @@ def display_exchanges( console.print("") +@log_start_end(log=logger) def display_platforms(sortby: str, descend: bool, top: int, export: str) -> None: """Shows list of financial platforms. [Source: CoinGecko] @@ -441,6 +456,7 @@ def display_platforms(sortby: str, descend: bool, top: int, export: str) -> None console.print("") +@log_start_end(log=logger) def display_products(sortby: str, descend: bool, top: int, export: str) -> None: """Shows list of financial products. [Source: CoinGecko] @@ -481,6 +497,7 @@ def display_products(sortby: str, descend: bool, top: int, export: str) -> None: console.print("") +@log_start_end(log=logger) def display_indexes(sortby: str, descend: bool, top: int, export: str) -> None: """Shows list of crypto indexes. [Source: CoinGecko] @@ -520,6 +537,7 @@ def display_indexes(sortby: str, descend: bool, top: int, export: str) -> None: console.print("") +@log_start_end(log=logger) def display_derivatives(sortby: str, descend: bool, top: int, export: str) -> None: """Shows list of crypto derivatives. [Source: CoinGecko] diff --git a/gamestonk_terminal/cryptocurrency/overview/rekt_model.py b/gamestonk_terminal/cryptocurrency/overview/rekt_model.py index 65b54d73fa4..03084b4797a 100644 --- a/gamestonk_terminal/cryptocurrency/overview/rekt_model.py +++ b/gamestonk_terminal/cryptocurrency/overview/rekt_model.py @@ -1,16 +1,23 @@ """Blockchain Center Model""" +import logging from typing import List, Union + import pandas as pd import requests +from bs4 import BeautifulSoup from requests.adapters import HTTPAdapter, RetryError from urllib3.util.retry import Retry -from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + HACKS_COLUMNS = ["Platform", "Date", "Amount [$]", "Audit", "Slug", "URL"] +@log_start_end(log=logger) def _retry_session( url: str, retries: int = 3, backoff_factor: float = 1.0 ) -> requests.Session: @@ -45,6 +52,7 @@ def _retry_session( return session +@log_start_end(log=logger) def _make_request(url: str) -> Union[BeautifulSoup, None]: """Helper method to scrap @@ -79,6 +87,7 @@ def _make_request(url: str) -> Union[BeautifulSoup, None]: return BeautifulSoup(req.text, features="lxml") +@log_start_end(log=logger) def get_crypto_hacks() -> pd.DataFrame: """Get major crypto-related hacks [Source: https://rekt.news] @@ -118,6 +127,7 @@ def get_crypto_hacks() -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def get_crypto_hack(slug: str) -> Union[str, None]: """Get crypto hack [Source: https://rekt.news] @@ -160,6 +170,7 @@ def get_crypto_hack(slug: str) -> Union[str, None]: return final_str +@log_start_end(log=logger) def get_crypto_hack_slugs() -> List[str]: """Get all crypto hack slugs [Source: https://rekt.news] diff --git a/gamestonk_terminal/cryptocurrency/overview/rekt_view.py b/gamestonk_terminal/cryptocurrency/overview/rekt_view.py index 66174130dc2..51406baf00d 100644 --- a/gamestonk_terminal/cryptocurrency/overview/rekt_view.py +++ b/gamestonk_terminal/cryptocurrency/overview/rekt_view.py @@ -1,7 +1,9 @@ """Rekt view""" +import logging import os from gamestonk_terminal.cryptocurrency.overview import rekt_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, long_number_format, @@ -9,7 +11,10 @@ from gamestonk_terminal.helper_funcs import ( ) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_crypto_hacks( top: int, sortby: str, descend: bool, slug: str, export: str = "" ) -> None: diff --git a/gamestonk_terminal/cryptocurrency/overview/withdrawalfees_model.py b/gamestonk_terminal/cryptocurrency/overview/withdrawalfees_model.py index e292a979da8..a38558cd536 100644 --- a/gamestonk_terminal/cryptocurrency/overview/withdrawalfees_model.py +++ b/gamestonk_terminal/cryptocurrency/overview/withdrawalfees_model.py @@ -1,12 +1,17 @@ """Withdrawal Fees model""" -from typing import Any, List +import logging import math +from typing import Any, List + +import pandas as pd import requests from bs4 import BeautifulSoup -import pandas as pd +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + POSSIBLE_CRYPTOS = [ "bitcoin", "ethereum", @@ -111,6 +116,7 @@ POSSIBLE_CRYPTOS = [ ] +@log_start_end(log=logger) def get_overall_withdrawal_fees(top: int = 100) -> pd.DataFrame: """Scrapes top coins withdrawal fees [Source: https://withdrawalfees.com/] @@ -171,6 +177,7 @@ def get_overall_withdrawal_fees(top: int = 100) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_overall_exchange_withdrawal_fees() -> pd.DataFrame: """Scrapes exchange withdrawal fees [Source: https://withdrawalfees.com/] @@ -198,6 +205,7 @@ def get_overall_exchange_withdrawal_fees() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_crypto_withdrawal_fees( symbol: str, ) -> List[Any]: diff --git a/gamestonk_terminal/cryptocurrency/overview/withdrawalfees_view.py b/gamestonk_terminal/cryptocurrency/overview/withdrawalfees_view.py index 6ea0f6e67ec..9150fed8d2e 100644 --- a/gamestonk_terminal/cryptocurrency/overview/withdrawalfees_view.py +++ b/gamestonk_terminal/cryptocurrency/overview/withdrawalfees_view.py @@ -1,4 +1,5 @@ """Withdrawal Fees view""" +import logging import os from gamestonk_terminal.cryptocurrency.overview.withdrawalfees_model import ( @@ -6,10 +7,14 @@ from gamestonk_terminal.cryptocurrency.overview.withdrawalfees_model import ( get_overall_exchange_withdrawal_fees, get_overall_withdrawal_fees, ) +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_overall_withdrawal_fees(top: int, export: str = "") -> None: """Top coins withdrawal fees [Source: https://withdrawalfees.com/] @@ -45,6 +50,7 @@ def display_overall_withdrawal_fees(top: int, export: str = "") -> None: ) +@log_start_end(log=logger) def display_overall_exchange_withdrawal_fees(export: str) -> None: """Exchange withdrawal fees [Source: https://withdrawalfees.com/] @@ -78,6 +84,7 @@ def display_overall_exchange_withdrawal_fees(export: str) -> None: ) +@log_start_end(log=logger) def display_crypto_withdrawal_fees(symbol: str, export: str = "") -> None: """Coin withdrawal fees per exchange [Source: https://withdrawalfees.com/] diff --git a/gamestonk_terminal/custom/custom_model.py b/gamestonk_terminal/custom/custom_model.py index 405481870fb..de443c132db 100644 --- a/gamestonk_terminal/custom/custom_model.py +++ b/gamestonk_terminal/custom/custom_model.py @@ -1,10 +1,17 @@ """Custom Controller Model""" __docformat__ = "numpy" +import logging from pathlib import Path + import pandas as pd +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def load(file: str) -> pd.DataFrame: """Load custom file into dataframe. Currently will work with csv diff --git a/gamestonk_terminal/custom/custom_view.py b/gamestonk_terminal/custom/custom_view.py index 2a384f7a5e7..40f1f785ce3 100644 --- a/gamestonk_terminal/custom/custom_view.py +++ b/gamestonk_terminal/custom/custom_view.py @@ -1,17 +1,22 @@ """Custom Controller View""" __docformat__ = "numpy" +import logging import os import matplotlib.pyplot as plt import pandas as pd -from gamestonk_terminal.helper_funcs import plot_autoscale, export_data -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def custom_plot( data: pd.DataFrame, y_col: str, diff --git a/gamestonk_terminal/economy/alphavantage_model.py b/gamestonk_terminal/economy/alphavantage_model.py index 1528d3c72ac..95df5d00360 100644 --- a/gamestonk_terminal/economy/alphavantage_model.py +++ b/gamestonk_terminal/economy/alphavantage_model.py @@ -1,14 +1,20 @@ """ Alpha Vantage Model """ __docformat__ = "numpy" +import logging + import pandas as pd -from alpha_vantage.sectorperformance import SectorPerformances import requests +from alpha_vantage.sectorperformance import SectorPerformances from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_sector_data() -> pd.DataFrame: """Get real-time performance sector data @@ -25,6 +31,7 @@ def get_sector_data() -> pd.DataFrame: return df_sectors +@log_start_end(log=logger) def get_real_gdp(interval: str = "a") -> pd.DataFrame: """Get annual or quarterly Real GDP for US @@ -51,6 +58,7 @@ def get_real_gdp(interval: str = "a") -> pd.DataFrame: return data +@log_start_end(log=logger) def get_gdp_capita() -> pd.DataFrame: """Real GDP per Capita for United States @@ -70,6 +78,7 @@ def get_gdp_capita() -> pd.DataFrame: return data +@log_start_end(log=logger) def get_inflation() -> pd.DataFrame: """Get historical Inflation for United States from AlphaVantage @@ -90,6 +99,7 @@ def get_inflation() -> pd.DataFrame: return data +@log_start_end(log=logger) def get_cpi(interval: str) -> pd.DataFrame: """Get Consumer Price Index from Alpha Vantage @@ -118,6 +128,7 @@ def get_cpi(interval: str) -> pd.DataFrame: return data +@log_start_end(log=logger) def get_treasury_yield(interval: str, maturity: str) -> pd.DataFrame: """Get historical yield for a given maturity @@ -150,6 +161,7 @@ def get_treasury_yield(interval: str, maturity: str) -> pd.DataFrame: return data +@log_start_end(log=logger) def get_unemployment() -> pd.DataFrame: """Get historical unemployment for United States diff --git a/gamestonk_terminal/economy/alphavantage_view.py b/gamestonk_terminal/economy/alphavantage_view.py index ea508ffd628..fb4895ab7d4 100644 --- a/gamestonk_terminal/economy/alphavantage_view.py +++ b/gamestonk_terminal/economy/alphavantage_view.py @@ -1,21 +1,26 @@ """ Alpha Vantage View """ __docformat__ = "numpy" +import logging import os import matplotlib.pyplot as plt +from gamestonk_terminal import config_plot as cfp from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.economy import alphavantage_model from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) -from gamestonk_terminal import config_plot as cfp from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def realtime_performance_sector(raw: bool, export: str): """Display Real-Time Performance sector. [Source: AlphaVantage] @@ -60,6 +65,7 @@ def realtime_performance_sector(raw: bool, export: str): plt.show() +@log_start_end(log=logger) def display_real_gdp( interval: str, start_year: int = 2010, raw: bool = False, export: str = "" ): @@ -107,6 +113,7 @@ def display_real_gdp( console.print("") +@log_start_end(log=logger) def display_gdp_capita(start_year: int = 2010, raw: bool = False, export: str = ""): """Display US GDP per Capita from AlphaVantage @@ -151,6 +158,7 @@ def display_gdp_capita(start_year: int = 2010, raw: bool = False, export: str = console.print("") +@log_start_end(log=logger) def display_inflation(start_year: int = 2010, raw: bool = False, export: str = ""): """Display US Inflation from AlphaVantage @@ -195,6 +203,7 @@ def display_inflation(start_year: int = 2010, raw: bool = False, export: str = " console.print("") +@log_start_end(log=logger) def display_cpi( interval: str, start_year: int = 2010, raw: bool = False, export: str = "" ): @@ -242,6 +251,7 @@ def display_cpi( console.print("") +@log_start_end(log=logger) def display_treasury_yield( interval: str, maturity: str, start_date: str, raw: bool = False, export: str = "" ): @@ -293,6 +303,7 @@ def display_treasury_yield( console.print("") +@log_start_end(log=logger) def display_unemployment(start_year: int = 2015, raw: bool = False, export: str = ""): """Display US unemployment AlphaVantage diff --git a/gamestonk_terminal/economy/cnn_model.py b/gamestonk_terminal/economy/cnn_model.py index aa231384956..f5f7401df33 100644 --- a/gamestonk_terminal/economy/cnn_model.py +++ b/gamestonk_terminal/economy/cnn_model.py @@ -1,15 +1,21 @@ """ CNN Model """ __docformat__ = "numpy" +import logging from typing import Tuple import matplotlib.pyplot as plt from fear_greed_index.CNNFearAndGreedIndex import CNNFearAndGreedIndex from pandas.plotting import register_matplotlib_converters +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def get_feargreed_report(indicator: str, fig: plt.figure) -> Tuple[str, plt.figure]: """Display CNN Fear And Greed Index. diff --git a/gamestonk_terminal/economy/cnn_view.py b/gamestonk_terminal/economy/cnn_view.py index ef722552a6e..4dc56ca18c8 100644 --- a/gamestonk_terminal/economy/cnn_view.py +++ b/gamestonk_terminal/economy/cnn_view.py @@ -1,19 +1,25 @@ """ CNN View """ __docformat__ = "numpy" +import logging import os + import matplotlib.pyplot as plt from pandas.plotting import register_matplotlib_converters from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.economy import cnn_model -from gamestonk_terminal.helper_funcs import plot_autoscale, export_data +from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + register_matplotlib_converters() +@log_start_end(log=logger) def fear_and_greed_index(indicator: str, export: str): """Display CNN Fear And Greed Index. [Source: CNN Business] diff --git a/gamestonk_terminal/economy/finnhub_model.py b/gamestonk_terminal/economy/finnhub_model.py index bee87060574..3f6d9f8d413 100644 --- a/gamestonk_terminal/economy/finnhub_model.py +++ b/gamestonk_terminal/economy/finnhub_model.py @@ -1,9 +1,15 @@ +import logging + import pandas as pd import requests from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_economy_calendar_events() -> pd.DataFrame: """Get economic calendar events diff --git a/gamestonk_terminal/economy/finnhub_view.py b/gamestonk_terminal/economy/finnhub_view.py index 68a606ba033..31f5913709b 100644 --- a/gamestonk_terminal/economy/finnhub_view.py +++ b/gamestonk_terminal/economy/finnhub_view.py @@ -1,10 +1,15 @@ +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.economy import finnhub_model from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def economy_calendar_events(country: str, num: int, impact: str, export: str): """Output economy calendar impact events. [Source: Finnhub] diff --git a/gamestonk_terminal/economy/finviz_model.py b/gamestonk_terminal/economy/finviz_model.py index c86d2c0293e..70034850031 100644 --- a/gamestonk_terminal/economy/finviz_model.py +++ b/gamestonk_terminal/economy/finviz_model.py @@ -1,14 +1,20 @@ """ Finviz Model """ __docformat__ = "numpy" +import logging from ast import literal_eval -import requests + import pandas as pd +import requests from finvizfinance.group import performance, spectrum, valuation +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_valuation_performance_data(group: str, data_type: str) -> pd.DataFrame: """Get group (sectors, industry or country) valuation/performance data. [Source: Finviz] @@ -29,6 +35,7 @@ def get_valuation_performance_data(group: str, data_type: str) -> pd.DataFrame: return performance.Performance().ScreenerView(group=group) +@log_start_end(log=logger) def get_spectrum_data(group: str): """Get group (sectors, industry or country) valuation/performance data. [Source: Finviz] @@ -40,6 +47,7 @@ def get_spectrum_data(group: str): spectrum.Spectrum().ScreenerView(group=group) +@log_start_end(log=logger) def get_futures() -> dict: """Get futures data. [Source: Finviz] diff --git a/gamestonk_terminal/economy/finviz_view.py b/gamestonk_terminal/economy/finviz_view.py index bbd9e3fb199..8513c21fbc4 100644 --- a/gamestonk_terminal/economy/finviz_view.py +++ b/gamestonk_terminal/economy/finviz_view.py @@ -1,17 +1,22 @@ """ Finviz View """ __docformat__ = "numpy" +import logging import os import webbrowser -import pandas as pd +import pandas as pd from PIL import Image +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.economy import finviz_model from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def map_sp500_view(period: str, map_type: str): """Opens Finviz map website in a browser. [Source: Finviz] @@ -32,6 +37,7 @@ def map_sp500_view(period: str, map_type: str): console.print("") +@log_start_end(log=logger) def display_performance( s_group: str, sort_col: str = "Name", @@ -88,6 +94,7 @@ def display_performance( ) +@log_start_end(log=logger) def display_valuation( s_group: str, sort_col: str = "Name", @@ -131,6 +138,7 @@ def display_valuation( ) +@log_start_end(log=logger) def display_spectrum(s_group: str, export: str = ""): """Display finviz spectrum in system viewer [Source: Finviz] @@ -155,6 +163,7 @@ def display_spectrum(s_group: str, export: str = ""): img.show() +@log_start_end(log=logger) def display_future( future_type: str = "Indices", sort_col: str = "ticker", diff --git a/gamestonk_terminal/economy/fred/fred_model.py b/gamestonk_terminal/economy/fred/fred_model.py index cd653df69de..df295510840 100644 --- a/gamestonk_terminal/economy/fred/fred_model.py +++ b/gamestonk_terminal/economy/fred/fred_model.py @@ -1,16 +1,22 @@ """ Fred Model """ __docformat__ = "numpy" -from typing import List, Tuple, Dict -import requests +import logging +from typing import Dict, List, Tuple + import fred import pandas as pd +import requests from fredapi import Fred from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def check_series_id(series_id: str) -> Tuple[bool, Dict]: """Checks if series ID exists in fred @@ -35,6 +41,7 @@ def check_series_id(series_id: str) -> Tuple[bool, Dict]: return r.status_code == 200, r.json() +@log_start_end(log=logger) def get_series_notes(series_term: str) -> pd.DataFrame: """Get Series notes. [Source: FRED] Parameters @@ -59,6 +66,7 @@ def get_series_notes(series_term: str) -> pd.DataFrame: return df_fred +@log_start_end(log=logger) def get_series_ids(series_term: str, num: int) -> Tuple[List[str], List[str]]: """Get Series IDs. [Source: FRED] Parameters @@ -88,6 +96,7 @@ def get_series_ids(series_term: str, num: int) -> Tuple[List[str], List[str]]: return df_series["id"].values, df_series["title"].values +@log_start_end(log=logger) def get_series_data(series_id: str, start: str) -> pd.DataFrame: """Get Series data. [Source: FRED] Parameters diff --git a/gamestonk_terminal/economy/fred/fred_view.py b/gamestonk_terminal/economy/fred/fred_view.py index be0ac2c1282..a78a1c4aa95 100644 --- a/gamestonk_terminal/economy/fred/fred_view.py +++ b/gamestonk_terminal/economy/fred/fred_view.py @@ -1,27 +1,33 @@ """ Fred View """ __docformat__ = "numpy" +import logging import os import textwrap from typing import Dict + import matplotlib.pyplot as plt -import pandas as pd import numpy as np +import pandas as pd from pandas.plotting import register_matplotlib_converters -from gamestonk_terminal.rich_config import console from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.economy.fred import fred_model from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) +from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) register_matplotlib_converters() +@log_start_end(log=logger) def format_units(num: int) -> str: """Helper to format number into string with K,M,B,T. Number will be in form of 10^n""" number_zeros = int(np.log10(num)) @@ -38,6 +44,7 @@ def format_units(num: int) -> str: return f"10^{number_zeros}" +@log_start_end(log=logger) def notes(series_term: str, num: int): """Print Series notes. [Source: FRED] Parameters @@ -66,6 +73,7 @@ def notes(series_term: str, num: int): console.print("") +@log_start_end(log=logger) def display_fred_series( d_series: Dict[str, Dict[str, str]], start_date: str, diff --git a/gamestonk_terminal/economy/nasdaq_model.py b/gamestonk_terminal/economy/nasdaq_model.py index e9ac640ebac..37a0e12a138 100644 --- a/gamestonk_terminal/economy/nasdaq_model.py +++ b/gamestonk_terminal/economy/nasdaq_model.py @@ -2,14 +2,20 @@ __docformat__ = "numpy" import argparse +import logging import os from typing import List import pandas as pd import requests + from gamestonk_terminal.config_terminal import API_KEY_QUANDL +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def check_country_code_type(list_of_codes: str) -> List[str]: """Check that codes are valid for NASDAQ API""" nasdaq_codes = list( @@ -26,6 +32,7 @@ def check_country_code_type(list_of_codes: str) -> List[str]: raise argparse.ArgumentTypeError("No valid codes provided.") +@log_start_end(log=logger) def get_big_mac_index(country_code: str) -> pd.DataFrame: """Gets the Big Mac index calculated by the Economist diff --git a/gamestonk_terminal/economy/nasdaq_view.py b/gamestonk_terminal/economy/nasdaq_view.py index 0c873aa2c29..0cb85759798 100644 --- a/gamestonk_terminal/economy/nasdaq_view.py +++ b/gamestonk_terminal/economy/nasdaq_view.py @@ -1,22 +1,28 @@ """NASDAQ Data Link View""" __docformat__ = "numpy" -from typing import List +import logging import os +from typing import List import matplotlib.pyplot as plt import pandas as pd + from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.economy import nasdaq_model from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_big_mac_index( country_codes: List[str], raw: bool = False, export: str = "" ): diff --git a/gamestonk_terminal/economy/wsj_model.py b/gamestonk_terminal/economy/wsj_model.py index 19de63e0f68..c068ae9dfd3 100644 --- a/gamestonk_terminal/economy/wsj_model.py +++ b/gamestonk_terminal/economy/wsj_model.py @@ -1,10 +1,17 @@ """WSJ model""" __docformat__ = "numpy" +import logging + import pandas as pd import requests + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def us_indices() -> pd.DataFrame: """Get the top US indices @@ -42,6 +49,7 @@ def us_indices() -> pd.DataFrame: return indices +@log_start_end(log=logger) def market_overview() -> pd.DataFrame: """Scrape data for market overview @@ -77,6 +85,7 @@ def market_overview() -> pd.DataFrame: return overview +@log_start_end(log=logger) def top_commodities() -> pd.DataFrame: """Scrape data for top commodities @@ -113,6 +122,7 @@ def top_commodities() -> pd.DataFrame: return commodities +@log_start_end(log=logger) def us_bonds() -> pd.DataFrame: """Scrape data for us bonds @@ -150,6 +160,7 @@ def us_bonds() -> pd.DataFrame: return bonds +@log_start_end(log=logger) def global_bonds() -> pd.DataFrame: """Scrape data for global bonds @@ -182,6 +193,7 @@ def global_bonds() -> pd.DataFrame: return bonds +@log_start_end(log=logger) def global_currencies() -> pd.DataFrame: """Scrape data for global currencies diff --git a/gamestonk_terminal/economy/wsj_view.py b/gamestonk_terminal/economy/wsj_view.py index a138c04c628..02dc2b6460a 100644 --- a/gamestonk_terminal/economy/wsj_view.py +++ b/gamestonk_terminal/economy/wsj_view.py @@ -1,13 +1,18 @@ """WSJ view """ __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.economy import wsj_model from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_overview(export: str): """Market overview. [Source: Wall St. Journal] @@ -38,6 +43,7 @@ def display_overview(export: str): ) +@log_start_end(log=logger) def display_indices(export: str): """US indices. [Source: Wall St. Journal] @@ -64,6 +70,7 @@ def display_indices(export: str): ) +@log_start_end(log=logger) def display_futures(export: str): """Futures/Commodities. [Source: Wall St. Journal] @@ -93,6 +100,7 @@ def display_futures(export: str): ) +@log_start_end(log=logger) def display_usbonds(export: str): """US bonds. [Source: Wall St. Journal] @@ -119,6 +127,7 @@ def display_usbonds(export: str): ) +@log_start_end(log=logger) def display_glbonds(export: str): """Global bonds. [Source: Wall St. Journal] @@ -145,6 +154,7 @@ def display_glbonds(export: str): ) +@log_start_end(log=logger) def display_currencies(export: str): """Display currencies. [Source: Wall St. Journal] diff --git a/gamestonk_terminal/etf/discovery/wsj_model.py b/gamestonk_terminal/etf/discovery/wsj_model.py index d25c398ea83..51576a5a42c 100644 --- a/gamestonk_terminal/etf/discovery/wsj_model.py +++ b/gamestonk_terminal/etf/discovery/wsj_model.py @@ -1,10 +1,17 @@ """WSJ model""" __docformat__ = "numpy" +import logging + import pandas as pd import requests + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def etf_movers(sort_type: str = "gainers") -> pd.DataFrame: """ Scrape data for top etf movers. diff --git a/gamestonk_terminal/etf/discovery/wsj_view.py b/gamestonk_terminal/etf/discovery/wsj_view.py index 77852aa9c6d..78e42d27e60 100644 --- a/gamestonk_terminal/etf/discovery/wsj_view.py +++ b/gamestonk_terminal/etf/discovery/wsj_view.py @@ -1,13 +1,18 @@ """WSJ view""" __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.etf.discovery import wsj_model from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def show_top_mover(sort_type: str, limit: int = 10, export=""): """ Show top ETF movers from wsj.com diff --git a/gamestonk_terminal/etf/financedatabase_model.py b/gamestonk_terminal/etf/financedatabase_model.py index 6abc058d2ec..af0c021a5ce 100644 --- a/gamestonk_terminal/etf/financedatabase_model.py +++ b/gamestonk_terminal/etf/financedatabase_model.py @@ -1,10 +1,17 @@ """Finance Database model""" __docformat__ = "numpy" +import logging from typing import Dict, List + import financedatabase as fd +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_etfs_by_name(name: str) -> Dict: """Return a selection of ETFs based on name filtered by total assets. [Source: Finance Database] @@ -24,6 +31,7 @@ def get_etfs_by_name(name: str) -> Dict: return data +@log_start_end(log=logger) def get_etfs_by_description(description: str) -> Dict: """Return a selection of ETFs based on description filtered by total assets. [Source: Finance Database] @@ -43,6 +51,7 @@ def get_etfs_by_description(description: str) -> Dict: return data +@log_start_end(log=logger) def get_etfs_by_category(category: str) -> Dict: """Return a selection of ETFs based on category filtered by total assets. [Source: Finance Database] @@ -61,6 +70,7 @@ def get_etfs_by_category(category: str) -> Dict: return data +@log_start_end(log=logger) def get_etfs_categories() -> List[str]: """Return a selection of ETF categories. [Source: Finance Database] diff --git a/gamestonk_terminal/etf/financedatabase_view.py b/gamestonk_terminal/etf/financedatabase_view.py index fa9030a1632..57dc81f46a2 100644 --- a/gamestonk_terminal/etf/financedatabase_view.py +++ b/gamestonk_terminal/etf/financedatabase_view.py @@ -1,13 +1,20 @@ """Finance Database view""" __docformat__ = "numpy" +import logging import os + import pandas as pd + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.etf import financedatabase_model from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_etf_by_name( name: str, limit: int, @@ -46,6 +53,7 @@ def display_etf_by_name( export_data(export, os.path.dirname(os.path.abspath(__file__)), "ln_fd", data) +@log_start_end(log=logger) def display_etf_by_description( description: str, limit: int, @@ -84,6 +92,7 @@ def display_etf_by_description( export_data(export, os.path.dirname(os.path.abspath(__file__)), "ld", data) +@log_start_end(log=logger) def display_etf_by_category( category: str, limit: int, diff --git a/gamestonk_terminal/etf/screener/screener_model.py b/gamestonk_terminal/etf/screener/screener_model.py index 349dd250c55..b584bc38d08 100644 --- a/gamestonk_terminal/etf/screener/screener_model.py +++ b/gamestonk_terminal/etf/screener/screener_model.py @@ -2,11 +2,17 @@ __docformat__ = "numpy" import configparser +import logging import os import pandas as pd +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def etf_screener(preset: str): """ Screens the etfs pulled from my repo (https://github.com/jmaslek/etf_scraper), diff --git a/gamestonk_terminal/etf/screener/screener_view.py b/gamestonk_terminal/etf/screener/screener_view.py index 14338fe2e65..83fa607a639 100644 --- a/gamestonk_terminal/etf/screener/screener_view.py +++ b/gamestonk_terminal/etf/screener/screener_view.py @@ -1,8 +1,10 @@ """ETF Screener view""" __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.etf.screener import screener_model from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console @@ -10,6 +12,10 @@ from gamestonk_terminal.rich_config import console # pylint:disable=no-member +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def view_screener( preset: str, num_to_show: int, sortby: str, ascend: bool, export: str = "" ): diff --git a/gamestonk_terminal/etf/stockanalysis_model.py b/gamestonk_terminal/etf/stockanalysis_model.py index 0b7d24f9294..ac4879051ca 100644 --- a/gamestonk_terminal/etf/stockanalysis_model.py +++ b/gamestonk_terminal/etf/stockanalysis_model.py @@ -1,15 +1,21 @@ """Stockanalysis.com/etf Model""" __docformat__ = "numpy" -from typing import List, Tuple import json +import logging +from typing import List, Tuple import pandas as pd import requests from bs4 import BeautifulSoup as bs + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_all_names_symbols() -> Tuple[List[str], List[str]]: """Gets all etf names and symbols @@ -32,6 +38,7 @@ def get_all_names_symbols() -> Tuple[List[str], List[str]]: return etf_symbols, etf_names +@log_start_end(log=logger) def get_etf_overview(etf_symbol: str) -> pd.DataFrame: """Get overview data for selected etf @@ -65,6 +72,7 @@ def get_etf_overview(etf_symbol: str) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_etf_holdings(symbol: str) -> pd.DataFrame: """Get ETF holdings @@ -101,6 +109,7 @@ def get_etf_holdings(symbol: str) -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def compare_etfs(symbols: List[str]) -> pd.DataFrame: """Compare selected ETFs @@ -122,6 +131,7 @@ def compare_etfs(symbols: List[str]) -> pd.DataFrame: return df_compare +@log_start_end(log=logger) def get_etfs_by_name(name_to_search: str) -> pd.DataFrame: """Get an ETF symbol and name based on ETF string to search. [Source: StockAnalysis] diff --git a/gamestonk_terminal/etf/stockanalysis_view.py b/gamestonk_terminal/etf/stockanalysis_view.py index f35e60d8f4d..65e8167fc4b 100644 --- a/gamestonk_terminal/etf/stockanalysis_view.py +++ b/gamestonk_terminal/etf/stockanalysis_view.py @@ -1,14 +1,19 @@ """StockAnalysis.com view functions""" __docformat__ = "numpy" +import logging import os from typing import List +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.etf import stockanalysis_model from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def view_overview(symbol: str, export: str = ""): """Print etf overview information @@ -32,6 +37,7 @@ def view_overview(symbol: str, export: str = ""): export_data(export, os.path.dirname(os.path.abspath(__file__)), "overview", data) +@log_start_end(log=logger) def view_holdings(symbol: str, num_to_show: int, export: str): """ @@ -56,6 +62,7 @@ def view_holdings(symbol: str, num_to_show: int, export: str): export_data(export, os.path.dirname(os.path.abspath(__file__)), "holdings", data) +@log_start_end(log=logger) def view_comparisons(symbols: List[str], export: str): """Show ETF comparisons @@ -82,6 +89,7 @@ def view_comparisons(symbols: List[str], export: str): export_data(export, os.path.dirname(os.path.abspath(__file__)), "overview", data) +@log_start_end(log=logger) def display_etf_by_name(name: str, limit: int, export: str): """Display ETFs matching search string. [Source: StockAnalysis] diff --git a/gamestonk_terminal/etf/yfinance_model.py b/gamestonk_terminal/etf/yfinance_model.py index 51988ac645c..677c53f8534 100644 --- a/gamestonk_terminal/etf/yfinance_model.py +++ b/gamestonk_terminal/etf/yfinance_model.py @@ -1,10 +1,17 @@ """Yahoo Finance model""" __docformat__ = "numpy" +import logging from typing import Dict + import yfinance as yf +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_etf_sector_weightings(name: str) -> Dict: """Return sector weightings allocation of ETF. [Source: Yahoo Finance] @@ -33,6 +40,7 @@ def get_etf_sector_weightings(name: str) -> Dict: return dict() +@log_start_end(log=logger) def get_etf_summary_description(name: str) -> str: """Return summary description of ETF. [Source: Yahoo Finance] diff --git a/gamestonk_terminal/etf/yfinance_view.py b/gamestonk_terminal/etf/yfinance_view.py index b7aff6c0894..fc5a28cd961 100644 --- a/gamestonk_terminal/etf/yfinance_view.py +++ b/gamestonk_terminal/etf/yfinance_view.py @@ -1,20 +1,27 @@ """Yahoo Finance view""" __docformat__ = "numpy" +import logging import os + import pandas as pd from matplotlib import pyplot as plt -from gamestonk_terminal.etf import yfinance_model + from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.etf import yfinance_model from gamestonk_terminal.helper_funcs import ( - plot_autoscale, export_data, + plot_autoscale, print_rich_table, ) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_etf_weightings( name: str, raw: bool = False, @@ -83,6 +90,7 @@ def display_etf_weightings( export_data(export, os.path.dirname(os.path.abspath(__file__)), "weights", holdings) +@log_start_end(log=logger) def display_etf_description( name: str, ): diff --git a/gamestonk_terminal/forex/av_model.py b/gamestonk_terminal/forex/av_model.py index cbeb0a667b3..53cce616631 100644 --- a/gamestonk_terminal/forex/av_model.py +++ b/gamestonk_terminal/forex/av_model.py @@ -1,13 +1,20 @@ """AlphaVantage FX Model.""" import argparse -from typing import Dict, List +import logging import os +from typing import Dict, List + import pandas as pd import requests + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_currency_list() -> List: """Load AV currency codes from a local file.""" path = os.path.join(os.path.dirname(__file__), "av_forex_currencies.csv") @@ -17,6 +24,7 @@ def get_currency_list() -> List: CURRENCY_LIST = get_currency_list() +@log_start_end(log=logger) def check_valid_forex_currency(fx_symbol: str) -> str: """Check if given symbol is supported on alphavantage. @@ -43,6 +51,7 @@ def check_valid_forex_currency(fx_symbol: str) -> str: ) +@log_start_end(log=logger) def get_quote(to_symbol: str, from_symbol: str) -> Dict: """Get current exchange rate quote from alpha vantage. @@ -70,6 +79,7 @@ def get_quote(to_symbol: str, from_symbol: str) -> Dict: return r.json() +@log_start_end(log=logger) def get_historical( to_symbol: str, from_symbol: str, diff --git a/gamestonk_terminal/forex/av_view.py b/gamestonk_terminal/forex/av_view.py index 4b1d60bb57d..20c48d10546 100644 --- a/gamestonk_terminal/forex/av_view.py +++ b/gamestonk_terminal/forex/av_view.py @@ -1,15 +1,22 @@ """AlphaVantage Forex View.""" __docformat__ = "numpy" -import pandas as pd -import mplfinance as mpf +import logging + import matplotlib.pyplot as plt -from gamestonk_terminal.forex import av_model +import mplfinance as mpf +import pandas as pd + from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.forex import av_model from gamestonk_terminal.helper_funcs import plot_autoscale, print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_quote(to_symbol: str, from_symbol: str): """Display current forex pair exchange rate. @@ -37,6 +44,7 @@ def display_quote(to_symbol: str, from_symbol: str): console.print("") +@log_start_end(log=logger) def display_candle(data: pd.DataFrame, to_symbol: str, from_symbol: str): """Show candle plot for fx data. diff --git a/gamestonk_terminal/forex/oanda/oanda_model.py b/gamestonk_terminal/forex/oanda/oanda_model.py index 5d8929ee2f8..9a5c7329f4a 100644 --- a/gamestonk_terminal/forex/oanda/oanda_model.py +++ b/gamestonk_terminal/forex/oanda/oanda_model.py @@ -2,10 +2,11 @@ __docformat__ = "numpy" import json +import logging from datetime import datetime from typing import Dict, Union -import pandas as pd +import pandas as pd from oandapyV20 import API from oandapyV20.endpoints import ( accounts, @@ -19,13 +20,17 @@ from oandapyV20.endpoints import ( from oandapyV20.exceptions import V20Error from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + if cfg.OANDA_ACCOUNT_TYPE != "REPLACE_ME": client = API(access_token=cfg.OANDA_TOKEN, environment=cfg.OANDA_ACCOUNT_TYPE) account = cfg.OANDA_ACCOUNT +@log_start_end(log=logger) def fx_price_request( accountID: str = account, instrument: Union[str, None] = None ) -> Union[Dict[str, str], bool]: @@ -62,6 +67,7 @@ def fx_price_request( return False +@log_start_end(log=logger) def account_summary_request(accountID: str = account) -> Union[pd.DataFrame, bool]: """Request Oanda account summary. @@ -120,6 +126,7 @@ def account_summary_request(accountID: str = account) -> Union[pd.DataFrame, boo return False +@log_start_end(log=logger) def orderbook_plot_data_request( instrument: Union[str, None] = None, accountID: str = account ) -> Union[pd.DataFrame, bool]: @@ -159,6 +166,7 @@ def orderbook_plot_data_request( return False +@log_start_end(log=logger) def positionbook_plot_data_request( instrument: Union[str, None] = None, accountID: str = account ) -> Union[pd.DataFrame, bool]: @@ -197,6 +205,7 @@ def positionbook_plot_data_request( return False +@log_start_end(log=logger) def order_history_request( order_state: str, order_count: int, accountID: str = account ) -> Union[pd.DataFrame, bool]: @@ -236,6 +245,7 @@ def order_history_request( return False +@log_start_end(log=logger) def create_order_request( price: int, units: int, @@ -305,6 +315,7 @@ def create_order_request( return False +@log_start_end(log=logger) def cancel_pending_order_request( orderID: str, accountID: str = account ) -> Union[str, bool]: @@ -331,6 +342,7 @@ def cancel_pending_order_request( return False +@log_start_end(log=logger) def open_positions_request(accountID: str = account) -> Union[pd.DataFrame, bool]: """Request information on open positions. @@ -370,6 +382,7 @@ def open_positions_request(accountID: str = account) -> Union[pd.DataFrame, bool return False +@log_start_end(log=logger) def pending_orders_request(accountID: str = account) -> Union[pd.DataFrame, bool]: """Request information on pending orders. @@ -413,6 +426,7 @@ def pending_orders_request(accountID: str = account) -> Union[pd.DataFrame, bool return False +@log_start_end(log=logger) def open_trades_request(accountID: str = account) -> Union[pd.DataFrame, bool]: """Request open trades data. @@ -463,6 +477,7 @@ def open_trades_request(accountID: str = account) -> Union[pd.DataFrame, bool]: return False +@log_start_end(log=logger) def close_trades_request( orderID: str, units: Union[int, None], accountID: str = account ) -> Union[pd.DataFrame, bool]: @@ -512,6 +527,7 @@ def close_trades_request( return False +@log_start_end(log=logger) def get_candles_dataframe( instrument: Union[str, None] = None, granularity: str = "D", candlecount: int = 180 ) -> Union[pd.DataFrame, bool]: @@ -570,6 +586,7 @@ def get_candles_dataframe( return False +@log_start_end(log=logger) def get_calendar_request( days: int, instrument: Union[str, None] = None ) -> Union[pd.DataFrame, bool]: diff --git a/gamestonk_terminal/forex/oanda/oanda_view.py b/gamestonk_terminal/forex/oanda/oanda_view.py index d4602ec2b01..0ebd6490cb8 100644 --- a/gamestonk_terminal/forex/oanda/oanda_view.py +++ b/gamestonk_terminal/forex/oanda/oanda_view.py @@ -1,6 +1,7 @@ """Oanda View.""" __docformat__ = "numpy" +import logging from typing import Dict, Union import matplotlib.pyplot as plt @@ -12,28 +13,29 @@ import seaborn as sns from gamestonk_terminal import config_plot as cfgPlot from gamestonk_terminal import feature_flags as gtff -from gamestonk_terminal.helper_funcs import ( - plot_autoscale, -) - +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.forex.oanda.oanda_model import ( + account_summary_request, cancel_pending_order_request, close_trades_request, + create_order_request, fx_price_request, - account_summary_request, + get_calendar_request, + get_candles_dataframe, open_positions_request, open_trades_request, + order_history_request, orderbook_plot_data_request, pending_orders_request, positionbook_plot_data_request, - order_history_request, - create_order_request, - get_candles_dataframe, - get_calendar_request, ) +from gamestonk_terminal.helper_funcs import plot_autoscale from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_fx_price(account: str, instrument: Union[str, None]): """View price for loaded currency pair. @@ -55,6 +57,7 @@ def get_fx_price(account: str, instrument: Union[str, None]): console.print("No data was retrieved.\n") +@log_start_end(log=logger) def get_account_summary(accountID: str): """Print Oanda account summary. @@ -70,6 +73,7 @@ def get_account_summary(accountID: str): console.print("No data was retrieved.\n") +@log_start_end(log=logger) def get_order_book(accountID: str, instrument: str): """ Plot the orderbook for the instrument if Oanda provides one. @@ -98,6 +102,7 @@ def get_order_book(accountID: str, instrument: str): console.print("No data was retrieved.\n") +@log_start_end(log=logger) def get_position_book(accountID: str, instrument: str): """Plot a position book for an instrument if Oanda provides one. @@ -125,6 +130,7 @@ def get_position_book(accountID: str, instrument: str): console.print("No data was retrieved.\n") +@log_start_end(log=logger) def list_orders(accountID: str, order_state: str, order_count: int): """List order history. @@ -145,6 +151,7 @@ def list_orders(accountID: str, order_state: str, order_count: int): console.print("No data was retrieved.\n") +@log_start_end(log=logger) def create_order(accountID: str, instrument: str, price: int, units: int): """Create a buy/sell order. @@ -167,6 +174,7 @@ def create_order(accountID: str, instrument: str, price: int, units: int): console.print("No data was returned from Oanda.\n") +@log_start_end(log=logger) def cancel_pending_order(accountID: str, orderID: str): """Cancel a Pending Order. @@ -185,6 +193,7 @@ def cancel_pending_order(accountID: str, orderID: str): console.print("No data was returned from Oanda.\n") +@log_start_end(log=logger) def get_open_positions(accountID: str): """Get information about open positions. @@ -201,6 +210,7 @@ def get_open_positions(accountID: str): console.print("No data was returned from Oanda.\n") +@log_start_end(log=logger) def get_pending_orders(accountID: str): """Get information about pending orders. @@ -222,6 +232,7 @@ def get_pending_orders(accountID: str): # Pylint raises no-member error because the df_trades can be either # a dataframe or a boolean (False) value that has no .empty and no .to_string # pylint: disable=no-member +@log_start_end(log=logger) def get_open_trades(accountID: str): """View open trades. @@ -240,6 +251,7 @@ def get_open_trades(accountID: str): console.print("No data was returned from Oanda.\n") +@log_start_end(log=logger) def close_trade(accountID: str, orderID: str, units: Union[int, None]): """Close a trade. @@ -262,6 +274,7 @@ def close_trade(accountID: str, orderID: str, units: Union[int, None]): console.print("No data was returned from Oanda.\n") +@log_start_end(log=logger) def show_candles( instrument: str, granularity: str, @@ -310,6 +323,7 @@ def show_candles( console.print("") +@log_start_end(log=logger) def calendar(instrument: str, days: int): """View calendar of significant events. @@ -333,6 +347,7 @@ def calendar(instrument: str, days: int): # Utilities +@log_start_end(log=logger) def add_plots(df: pd.DataFrame, additional_charts: Dict[str, bool]): """Add additional plots to the candle chart. @@ -411,6 +426,7 @@ def add_plots(df: pd.DataFrame, additional_charts: Dict[str, bool]): return plots_to_add, legends, subplot_legends +@log_start_end(log=logger) def book_plot(df: pd.DataFrame, instrument: str, book_type: str): """Plot the order book for a given instrument. diff --git a/gamestonk_terminal/mutual_funds/investpy_model.py b/gamestonk_terminal/mutual_funds/investpy_model.py index 88f1fbbb3b0..bed84c2b83e 100644 --- a/gamestonk_terminal/mutual_funds/investpy_model.py +++ b/gamestonk_terminal/mutual_funds/investpy_model.py @@ -1,14 +1,20 @@ """Investpy Model""" __docformat__ = "numpy" +import logging from datetime import datetime, timedelta from typing import Tuple import investpy import pandas as pd + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def search_funds(by: str = "name", value: str = "") -> pd.DataFrame: """Search investpy for matching funds @@ -30,6 +36,7 @@ def search_funds(by: str = "name", value: str = "") -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def get_overview(country: str = "united states", limit: int = 20) -> pd.DataFrame: """ @@ -45,6 +52,7 @@ def get_overview(country: str = "united states", limit: int = 20) -> pd.DataFram ) +@log_start_end(log=logger) def get_fund_symbol_from_name(name: str) -> Tuple[str, str]: """Get fund symbol from name through investpy @@ -71,6 +79,7 @@ def get_fund_symbol_from_name(name: str) -> Tuple[str, str]: return symbol, country +@log_start_end(log=logger) def get_fund_name_from_symbol(symbol: str) -> Tuple[str, str]: """Get fund name from symbol from investpy @@ -97,6 +106,7 @@ def get_fund_name_from_symbol(symbol: str) -> Tuple[str, str]: return name, country +@log_start_end(log=logger) def get_fund_info(fund: str, country: str = "united states") -> pd.DataFrame: """ @@ -115,6 +125,7 @@ def get_fund_info(fund: str, country: str = "united states") -> pd.DataFrame: return investpy.funds.get_fund_information(fund, country).T +@log_start_end(log=logger) def get_fund_historical( fund: str, country: str = "united states", diff --git a/gamestonk_terminal/mutual_funds/investpy_view.py b/gamestonk_terminal/mutual_funds/investpy_view.py index f27b1123ad5..9b42f3c1667 100644 --- a/gamestonk_terminal/mutual_funds/investpy_view.py +++ b/gamestonk_terminal/mutual_funds/investpy_view.py @@ -1,23 +1,28 @@ """Investpy View""" __docformat__ = "numpy" +import logging import os import matplotlib.pyplot as plt import numpy as np import pandas as pd -from gamestonk_terminal.rich_config import console from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) from gamestonk_terminal.mutual_funds import investpy_model +from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_search( by: str = "name", value: str = "", @@ -65,6 +70,7 @@ def display_search( console.print("\n") +@log_start_end(log=logger) def display_overview(country: str = "united states", limit: int = 10, export: str = ""): """Displays an overview of the main funds from a country. @@ -92,6 +98,7 @@ def display_overview(country: str = "united states", limit: int = 10, export: st console.print("\n") +@log_start_end(log=logger) def display_fund_info(fund_name: str, country: str = "united states"): """Display fund infomration. Finds name from symbol first if name is false @@ -117,6 +124,7 @@ def display_fund_info(fund_name: str, country: str = "united states"): console.print("\n") +@log_start_end(log=logger) def display_historical(data: pd.DataFrame, fund: str = "", export: str = ""): """ diff --git a/gamestonk_terminal/mutual_funds/yfinance_model.py b/gamestonk_terminal/mutual_funds/yfinance_model.py index 1d44cfb6169..998b0305eca 100644 --- a/gamestonk_terminal/mutual_funds/yfinance_model.py +++ b/gamestonk_terminal/mutual_funds/yfinance_model.py @@ -1,11 +1,17 @@ """Yahoo Finance Mutual Fund Model""" __docformat__ = "numpy" +import logging from typing import Dict import yfinance as yf +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_information(fund: str) -> Dict: """Get fund information for fund symbol diff --git a/gamestonk_terminal/mutual_funds/yfinance_view.py b/gamestonk_terminal/mutual_funds/yfinance_view.py index 157450ebecc..1f0ebbea152 100644 --- a/gamestonk_terminal/mutual_funds/yfinance_view.py +++ b/gamestonk_terminal/mutual_funds/yfinance_view.py @@ -1,22 +1,27 @@ """Yahoo Finance Mutual Fund Model""" __docformat__ = "numpy" +import logging import os -import pandas as pd import matplotlib.pyplot as plt -from gamestonk_terminal.rich_config import console +import pandas as pd -from gamestonk_terminal.helper_funcs import ( - print_rich_table, - export_data, - plot_autoscale, -) -from gamestonk_terminal.mutual_funds import yfinance_model from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import ( + export_data, + plot_autoscale, + print_rich_table, +) +from gamestonk_terminal.mutual_funds import yfinance_model +from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_sector(fund: str, min_pct_to_display: float = 5, export: str = ""): """Display sector weightings for fund @@ -83,6 +88,7 @@ def display_sector(fund: str, min_pct_to_display: float = 5, export: str = ""): export_data(export, os.path.dirname(os.path.abspath(__file__)), "sector", df_weight) +@log_start_end(log=logger) def display_equity(fund: str): """Display equity holdings for fund diff --git a/gamestonk_terminal/portfolio/brokers/ally/ally_model.py b/gamestonk_terminal/portfolio/brokers/ally/ally_model.py index 3872d8af8fc..ca0246e58d7 100644 --- a/gamestonk_terminal/portfolio/brokers/ally/ally_model.py +++ b/gamestonk_terminal/portfolio/brokers/ally/ally_model.py @@ -1,10 +1,17 @@ """Ally Model""" __docformat__ = "numpy" +import logging + import ally import pandas as pd +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_holdings() -> pd.DataFrame: """Get holdings from Ally account in pandas df @@ -17,6 +24,7 @@ def get_holdings() -> pd.DataFrame: return ally_positions_to_df(a.holdings(dataframe=True)) +@log_start_end(log=logger) def ally_positions_to_df(df: pd.DataFrame) -> pd.DataFrame: """Clean up ally holdings dataframe @@ -45,6 +53,7 @@ def ally_positions_to_df(df: pd.DataFrame) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_history() -> pd.DataFrame: """Gets transaction history for the account." @@ -57,6 +66,7 @@ def get_history() -> pd.DataFrame: return a.history(dataframe=True) +@log_start_end(log=logger) def get_balances() -> pd.DataFrame: """Gets balance details for the account." @@ -69,6 +79,7 @@ def get_balances() -> pd.DataFrame: return a.balances(dataframe=True) +@log_start_end(log=logger) def get_stock_quote(ticker: str) -> pd.DataFrame: """Gets quote for stock ticker @@ -89,6 +100,7 @@ def get_stock_quote(ticker: str) -> pd.DataFrame: ) +@log_start_end(log=logger) def get_top_movers(list_type: str, exchange: str) -> pd.DataFrame: """ Gets top lists from ally Invest API. Documentation for parameters below: diff --git a/gamestonk_terminal/portfolio/brokers/ally/ally_view.py b/gamestonk_terminal/portfolio/brokers/ally/ally_view.py index 60879acc37d..ecafa42fbda 100644 --- a/gamestonk_terminal/portfolio/brokers/ally/ally_view.py +++ b/gamestonk_terminal/portfolio/brokers/ally/ally_view.py @@ -1,12 +1,18 @@ """Ally View""" __docformat__ = "numpy" +import logging import os + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.portfolio.brokers.ally import ally_model from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_history(n_to_show: int = 15, export: str = "") -> None: history = ally_model.get_history() show_history = history[["amount", "date", "symbol", "transactiontype", "quantity"]] @@ -22,6 +28,7 @@ def display_history(n_to_show: int = 15, export: str = "") -> None: ) +@log_start_end(log=logger) def display_holdings(export: str = "") -> None: """Display holdings from ally account @@ -44,6 +51,7 @@ def display_holdings(export: str = "") -> None: ) +@log_start_end(log=logger) def display_balances(export: str = "") -> None: """Display balances from ally account @@ -79,6 +87,7 @@ def display_balances(export: str = "") -> None: console.print("") +@log_start_end(log=logger) def display_stock_quote(ticker: str) -> None: """Displays stock quote for ticker/tickers @@ -94,6 +103,7 @@ def display_stock_quote(ticker: str) -> None: console.print("") +@log_start_end(log=logger) def display_top_lists( list_type: str, exchange: str, num_to_show: int = 20, export: str = "" ): diff --git a/gamestonk_terminal/portfolio/brokers/coinbase/coinbase_model.py b/gamestonk_terminal/portfolio/brokers/coinbase/coinbase_model.py index c77e787e2f2..7744f255b92 100644 --- a/gamestonk_terminal/portfolio/brokers/coinbase/coinbase_model.py +++ b/gamestonk_terminal/portfolio/brokers/coinbase/coinbase_model.py @@ -1,16 +1,23 @@ """Coinbase model""" __docformat__ = "numpy" +import logging + import pandas as pd + import gamestonk_terminal.config_terminal as cfg from gamestonk_terminal.cryptocurrency.coinbase_helpers import ( CoinbaseProAuth, _check_account_validity, make_coinbase_request, ) +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_accounts(add_current_price: bool = True, currency: str = "USD") -> pd.DataFrame: """Get list of all your trading accounts. [Source: Coinbase] @@ -76,6 +83,7 @@ def get_accounts(add_current_price: bool = True, currency: str = "USD") -> pd.Da return df[["id", "currency", "balance", "available", "hold"]] +@log_start_end(log=logger) def get_account_history(account: str) -> pd.DataFrame: """Get your account history. Account activity either increases or decreases your account balance. [Source: Coinbase] @@ -131,6 +139,7 @@ def get_account_history(account: str) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_orders() -> pd.DataFrame: """List your current open orders. Only open or un-settled orders are returned. [Source: Coinbase] @@ -185,6 +194,7 @@ def get_orders() -> pd.DataFrame: ] +@log_start_end(log=logger) def get_deposits(deposit_type: str = "deposit") -> pd.DataFrame: """Get a list of deposits for your account. [Source: Coinbase] diff --git a/gamestonk_terminal/portfolio/brokers/coinbase/coinbase_view.py b/gamestonk_terminal/portfolio/brokers/coinbase/coinbase_view.py index cd5dd061d0d..9c69351669a 100644 --- a/gamestonk_terminal/portfolio/brokers/coinbase/coinbase_view.py +++ b/gamestonk_terminal/portfolio/brokers/coinbase/coinbase_view.py @@ -1,12 +1,18 @@ """Coinbase view""" __docformat__ = "numpy" +import logging import os + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.portfolio.brokers.coinbase import coinbase_model from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def display_account(currency: str = "USD", export: str = "") -> None: """Display list of all your trading accounts. [Source: Coinbase] @@ -39,6 +45,7 @@ def display_account(currency: str = "USD", export: str = "") -> None: ) +@log_start_end(log=logger) def display_history(account: str, export: str = "", limit: int = 20) -> None: """Display account history. [Source: Coinbase] @@ -77,6 +84,7 @@ def display_history(account: str, export: str = "", limit: int = 20) -> None: ) +@log_start_end(log=logger) def display_orders(limit: int, sortby: str, descend: bool, export: str = "") -> None: """List your current open orders [Source: Coinbase] @@ -117,6 +125,7 @@ def display_orders(limit: int, sortby: str, descend: bool, export: str = "") -> ) +@log_start_end(log=logger) def display_deposits( limit: int, sortby: str, deposit_type: str, descend: bool, export: str = "" ) -> None: diff --git a/gamestonk_terminal/portfolio/brokers/degiro/degiro_model.py b/gamestonk_terminal/portfolio/brokers/degiro/degiro_model.py index 73b06655fdd..1ab23c30a0a 100644 --- a/gamestonk_terminal/portfolio/brokers/degiro/degiro_model.py +++ b/gamestonk_terminal/portfolio/brokers/degiro/degiro_model.py @@ -1,32 +1,36 @@ # IMPORTATION STANDARD +import logging import math - from typing import Union # IMPORTATION THIRDPARTY import pandas as pd from degiro_connector.core.helpers import pb_handler - from degiro_connector.trading.api import API as TradingAPI from degiro_connector.trading.models.trading_pb2 import ( Credentials, LatestNews, NewsByCompany, Order, - ProductsInfo, ProductSearch, + ProductsInfo, TopNewsPreview, Update, ) # IMPORTATION INTERNAL import gamestonk_terminal.config_terminal as config +from gamestonk_terminal.decorators import log_start_end # pylint: disable=no-member # pylint: disable=no-else-return +logger = logging.getLogger(__name__) + + class DegiroModel: + @log_start_end(log=logger) def __init__(self): self.__default_credentials = Credentials( int_account=None, @@ -39,6 +43,7 @@ class DegiroModel: credentials=self.__default_credentials, ) + @log_start_end(log=logger) def __hold_fetch_additional_information( self, positions: pd.DataFrame, @@ -87,6 +92,7 @@ class DegiroModel: return positions_full + @log_start_end(log=logger) def __hold_fetch_current_positions(self) -> pd.DataFrame: # GET ATTRIBUTES trading_api = self.__trading_api @@ -123,6 +129,7 @@ class DegiroModel: return positions @staticmethod + @log_start_end(log=logger) def __hold_filter_current_positions( portfolio: Update.Portfolio, ) -> pd.DataFrame: @@ -153,15 +160,18 @@ class DegiroModel: return positions + @log_start_end(log=logger) def __setup_extra_credentials(self): trading_api = self.__trading_api client_details_table = trading_api.get_client_details() int_account = client_details_table["data"]["intAccount"] trading_api.credentials.int_account = int_account + @log_start_end(log=logger) def cancel(self, order_id: str) -> bool: return self.__trading_api.delete_order(order_id=order_id) + @log_start_end(log=logger) def companynews(self, isin: str) -> NewsByCompany: trading_api = self.__trading_api request = NewsByCompany.Request( @@ -179,6 +189,7 @@ class DegiroModel: return news + @log_start_end(log=logger) def create_calculate_product_id( self, product: int, @@ -210,6 +221,7 @@ class DegiroModel: else: return product + @log_start_end(log=logger) def create_calculate_size( self, price: float, @@ -221,9 +233,11 @@ class DegiroModel: else: return size + @log_start_end(log=logger) def create_check(self, order: Order) -> Union[Order.CheckingResponse, bool]: return self.__trading_api.check_order(order=order) + @log_start_end(log=logger) def create_confirm( self, confirmation_id: str, @@ -234,9 +248,11 @@ class DegiroModel: order=order, ) + @log_start_end(log=logger) def hold_positions(self) -> pd.DataFrame: return self.__hold_fetch_current_positions() + @log_start_end(log=logger) def lastnews(self, limit: int) -> LatestNews: trading_api = self.__trading_api request = LatestNews.Request( @@ -248,17 +264,21 @@ class DegiroModel: return news + @log_start_end(log=logger) def login(self, credentials: Credentials): self.__trading_api.credentials.CopyFrom(credentials) self.__trading_api.connect() self.__setup_extra_credentials() + @log_start_end(log=logger) def login_default_credentials(self): return self.__default_credentials + @log_start_end(log=logger) def logout(self) -> bool: return self.__trading_api.logout() + @log_start_end(log=logger) def lookup( self, limit: int, @@ -278,6 +298,7 @@ class DegiroModel: return product_search + @log_start_end(log=logger) def pending(self) -> Update.Orders: trading_api = self.__trading_api request_list = Update.RequestList() @@ -290,12 +311,15 @@ class DegiroModel: return update.orders + @log_start_end(log=logger) def topnews(self) -> TopNewsPreview: return self.__trading_api.get_top_news_preview(raw=False) + @log_start_end(log=logger) def update(self, order: Order) -> Update.Orders: return self.__trading_api.update_order(order=order) + @log_start_end(log=logger) def update_pending_order(self, order_id: str) -> Union[None, Order]: trading_api = self.__trading_api request_list = Update.RequestList() diff --git a/gamestonk_terminal/portfolio/brokers/degiro/degiro_view.py b/gamestonk_terminal/portfolio/brokers/degiro/degiro_view.py index e4e7eb6ab1b..ee8cac4c729 100644 --- a/gamestonk_terminal/portfolio/brokers/degiro/degiro_view.py +++ b/gamestonk_terminal/portfolio/brokers/degiro/degiro_view.py @@ -1,8 +1,9 @@ # IMPORTATION THIRDPARTY +import logging from argparse import Namespace + import pandas as pd from degiro_connector.core.helpers import pb_handler - from degiro_connector.trading.models.trading_pb2 import ( Credentials, LatestNews, @@ -13,6 +14,8 @@ from degiro_connector.trading.models.trading_pb2 import ( Update, ) +from gamestonk_terminal.decorators import log_start_end + # IMPORTATION INTERNAL from gamestonk_terminal.portfolio.brokers.degiro.degiro_model import DegiroModel from gamestonk_terminal.rich_config import console @@ -20,6 +23,9 @@ from gamestonk_terminal.rich_config import console # pylint: disable=no-member +logger = logging.getLogger(__name__) + + class DegiroView: ORDER_ACTION = { "buy": Order.Action.BUY, @@ -38,10 +44,12 @@ class DegiroView: "stop-loss": Order.OrderType.STOP_LOSS, } + @log_start_end(log=logger) def __init__(self): self.__degiro_model = DegiroModel() @staticmethod + @log_start_end(log=logger) def help_display(): console.print( "\nDegiro:\n" @@ -61,6 +69,7 @@ class DegiroView: " topnews view top news preview\n" ) + @log_start_end(log=logger) def cancel(self, ns_parser: Namespace): # GET ATTRIBUTES degiro_model = self.__degiro_model @@ -75,13 +84,16 @@ class DegiroView: DegiroView.__cancel_display_fail(order_id=order_id) @staticmethod + @log_start_end(log=logger) def __cancel_display_success(order_id: str): console.print(f"Following `Order` was canceled : {order_id}") @staticmethod + @log_start_end(log=logger) def __cancel_display_fail(order_id: str): console.print(f"Following `Order` cancellation failed : {order_id}") + @log_start_end(log=logger) def companynews(self, ns_parser: Namespace): # GET ATTRIBUTES degiro_model = self.__degiro_model @@ -93,6 +105,7 @@ class DegiroView: DegiroView.__companynews_display(news_by_company=news_by_company) @staticmethod + @log_start_end(log=logger) def __companynews_display(news_by_company: NewsByCompany): news_dict = pb_handler.message_to_dict( message=news_by_company, @@ -104,6 +117,7 @@ class DegiroView: console.print("isins", article["isins"]) console.print("---") + @log_start_end(log=logger) def create(self, ns_parser: Namespace): # GET CONSTANTS ORDER_ACTION = self.ORDER_ACTION @@ -160,10 +174,12 @@ class DegiroView: DegiroView.__create_display_canceled() @staticmethod + @log_start_end(log=logger) def __create_display_canceled(): console.print("`Order` creation canceled.\n") @staticmethod + @log_start_end(log=logger) def __create_display_check( order: Order, checking_response: Order.CheckingResponse, @@ -193,6 +209,7 @@ class DegiroView: ) @staticmethod + @log_start_end(log=logger) def __create_display_created_order(order: Order): order_dict = pb_handler.message_to_dict(message=order) order_df = pd.DataFrame([order_dict]) @@ -212,9 +229,11 @@ class DegiroView: ) @staticmethod + @log_start_end(log=logger) def __create_message_ask_confirmation(): return "\nDo you confirm this `Order`?\n" + @log_start_end(log=logger) def hold(self, ns_parser: Namespace): _ = ns_parser @@ -230,10 +249,12 @@ class DegiroView: DegiroView.__hold_display_positions(positions=positions) @staticmethod + @log_start_end(log=logger) def __hold_display_no_position(): console.print("0 position found.") @staticmethod + @log_start_end(log=logger) def __hold_display_positions(positions: pd.DataFrame): selected_columns = [ "id", @@ -261,6 +282,7 @@ class DegiroView: console.print(fmt_positions) + @log_start_end(log=logger) def lastnews(self, ns_parser: Namespace): # GET ATTRIBUTES degiro_model = self.__degiro_model @@ -270,6 +292,7 @@ class DegiroView: DegiroView.__lastnews_display(latest_news=latest_news) @staticmethod + @log_start_end(log=logger) def __lastnews_display(latest_news: LatestNews): news_dict = pb_handler.message_to_dict( message=latest_news, @@ -280,6 +303,7 @@ class DegiroView: console.print("content", article["content"]) console.print("---") + @log_start_end(log=logger) def login(self, ns_parser: Namespace): # GET ATTRIBUTES degiro_model = self.__degiro_model @@ -304,9 +328,11 @@ class DegiroView: DegiroView.__login_display_success() @staticmethod + @log_start_end(log=logger) def __login_display_success(): console.print("You are now logged in !") + @log_start_end(log=logger) def logout(self, ns_parser: Namespace): _ = ns_parser @@ -320,13 +346,16 @@ class DegiroView: DegiroView.__logout_display_fail() @staticmethod + @log_start_end(log=logger) def __logout_display_fail(): console.print("Logged out failed.") @staticmethod + @log_start_end(log=logger) def __logout_display_success(): console.print("You are now logged out !") + @log_start_end(log=logger) def lookup(self, ns_parser: Namespace): # GET ATTRIBUTES degiro_model = self.__degiro_model @@ -345,6 +374,7 @@ class DegiroView: DegiroView.__lookup_display_no_result() @staticmethod + @log_start_end(log=logger) def __lookup_display(product_search: ProductSearch): products_dict = pb_handler.message_to_dict( message=product_search, @@ -365,9 +395,11 @@ class DegiroView: console.print(products_selected) @staticmethod + @log_start_end(log=logger) def __lookup_display_no_result(): console.print("0 result found.") + @log_start_end(log=logger) def pending(self, ns_parser: Namespace): _ = ns_parser @@ -384,6 +416,7 @@ class DegiroView: DegiroView.__pending_display_no_result() @staticmethod + @log_start_end(log=logger) def __pending_display(orders: Update.Orders): orders_dict = pb_handler.message_to_dict(message=orders) orders_df = pd.DataFrame(orders_dict["values"]) @@ -402,9 +435,11 @@ class DegiroView: console.print(orders_df[orders_df.columns.intersection(fields)]) @staticmethod + @log_start_end(log=logger) def __pending_display_no_result(): console.print("No pending orders.") + @log_start_end(log=logger) def topnews(self, ns_parser: Namespace): _ = ns_parser @@ -418,6 +453,7 @@ class DegiroView: DegiroView.__topnews_display(top_news=top_news) @staticmethod + @log_start_end(log=logger) def __topnews_display(top_news: TopNewsPreview): news_dict = pb_handler.message_to_dict( message=top_news, @@ -430,6 +466,7 @@ class DegiroView: console.print("brief", article["brief"]) console.print("---") + @log_start_end(log=logger) def update(self, ns_parser: Namespace): # GET ATTRIBUTES degiro_model = self.__degiro_model @@ -451,13 +488,16 @@ class DegiroView: DegiroView.__update_display_fail() @staticmethod + @log_start_end(log=logger) def __update_display_fail(): console.print("`Order` update failed.") @staticmethod + @log_start_end(log=logger) def __update_display_not_found(order_id: str): console.print("The following `order` was not found:", order_id) @staticmethod + @log_start_end(log=logger) def __update_display_success(): console.print("`Order` updated .") diff --git a/gamestonk_terminal/portfolio/brokers/robinhood/robinhood_model.py b/gamestonk_terminal/portfolio/brokers/robinhood/robinhood_model.py index 24bccbe3ea8..9122f31ef7f 100644 --- a/gamestonk_terminal/portfolio/brokers/robinhood/robinhood_model.py +++ b/gamestonk_terminal/portfolio/brokers/robinhood/robinhood_model.py @@ -1,6 +1,7 @@ """Robinhood Model""" __docformat__ = "numpy" +import logging from datetime import datetime, timedelta import numpy as np @@ -9,22 +10,28 @@ from robin_stocks import robinhood from gamestonk_terminal.config_terminal import RH_PASSWORD as pw from gamestonk_terminal.config_terminal import RH_USERNAME as user +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + dt_format = "%Y-%m-%dT%H:%M:%SZ" +@log_start_end(log=logger) def login(): """Robinhood login""" robinhood.login(user, pw) console.print("") +@log_start_end(log=logger) def logoff(): """Robinhood logoff""" robinhood.logout() +@log_start_end(log=logger) def get_holdings() -> pd.DataFrame: """Return Robinhood holdings @@ -37,6 +44,7 @@ def get_holdings() -> pd.DataFrame: return rh_positions_to_df(holds) +@log_start_end(log=logger) def rh_positions_to_df(holds: dict) -> pd.DataFrame: """Process robinhood holdings to dataframe @@ -67,6 +75,7 @@ def rh_positions_to_df(holds: dict) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_historical(interval: str = "day", span: str = "3month") -> pd.DataFrame: """Get historical portfolio in candle form diff --git a/gamestonk_terminal/portfolio/brokers/robinhood/robinhood_view.py b/gamestonk_terminal/portfolio/brokers/robinhood/robinhood_view.py index 8a8a1908bb3..255c0517b50 100644 --- a/gamestonk_terminal/portfolio/brokers/robinhood/robinhood_view.py +++ b/gamestonk_terminal/portfolio/brokers/robinhood/robinhood_view.py @@ -1,10 +1,14 @@ """Robinhood View""" __docformat__ = "numpy" +import logging import os + import matplotlib.pyplot as plt import mplfinance as mpf + from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, @@ -13,6 +17,7 @@ from gamestonk_terminal.helper_funcs import ( from gamestonk_terminal.portfolio.brokers.robinhood import robinhood_model from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) span_title_dict = { "day": "Day", @@ -25,6 +30,7 @@ span_title_dict = { } +@log_start_end(log=logger) def display_holdings(export: str = ""): """Display stock holdings in robinhood @@ -46,6 +52,7 @@ def display_holdings(export: str = ""): ) +@log_start_end(log=logger) def display_historical(interval: str = "day", span: str = "3month", export: str = ""): """Display historical portfolio diff --git a/gamestonk_terminal/portfolio/portfolio_analysis/portfolio_model.py b/gamestonk_terminal/portfolio/portfolio_analysis/portfolio_model.py index 480c4a7948f..439abf07b82 100644 --- a/gamestonk_terminal/portfolio/portfolio_analysis/portfolio_model.py +++ b/gamestonk_terminal/portfolio/portfolio_analysis/portfolio_model.py @@ -1,15 +1,23 @@ """Portfolio Model""" __docformat__ = "numpy" +import logging + import pandas as pd import yfinance as yf -from gamestonk_terminal.rich_config import console + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import print_rich_table from gamestonk_terminal.portfolio.portfolio_analysis import yfinance_model +from gamestonk_terminal.rich_config import console # pylint: disable=no-member,unsupported-assignment-operation,unsubscriptable-object +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def load_portfolio( full_path: str, sector: bool = False, diff --git a/gamestonk_terminal/portfolio/portfolio_analysis/portfolio_view.py b/gamestonk_terminal/portfolio/portfolio_analysis/portfolio_view.py index 3ce54ac2b44..c60c37f7a9a 100644 --- a/gamestonk_terminal/portfolio/portfolio_analysis/portfolio_view.py +++ b/gamestonk_terminal/portfolio/portfolio_analysis/portfolio_view.py @@ -1,11 +1,18 @@ """Portfolio View""" __docformat__ = "numpy" +import logging + import pandas as pd -from gamestonk_terminal.rich_config import console + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import print_rich_table +from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_group_holdings( portfolio: pd.DataFrame, group_column: str, diff --git a/gamestonk_terminal/portfolio/portfolio_analysis/yfinance_model.py b/gamestonk_terminal/portfolio/portfolio_analysis/yfinance_model.py index 06692d71b86..afc601f6a45 100644 --- a/gamestonk_terminal/portfolio/portfolio_analysis/yfinance_model.py +++ b/gamestonk_terminal/portfolio/portfolio_analysis/yfinance_model.py @@ -2,10 +2,17 @@ __docformat__ = "numpy" import difflib +import logging + import yfinance as yf + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.stocks.sector_industry_analysis import financedatabase_model +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_country(ticker): country = "NA" data = yf.utils.get_json(f"https://finance.yahoo.com/quote/{ticker}") diff --git a/gamestonk_terminal/portfolio/portfolio_model.py b/gamestonk_terminal/portfolio/portfolio_model.py index 248bc0ca52a..bd2acdf8a18 100644 --- a/gamestonk_terminal/portfolio/portfolio_model.py +++ b/gamestonk_terminal/portfolio/portfolio_model.py @@ -1,9 +1,10 @@ """Portfolio Model""" __docformat__ = "numpy" -import os +import logging import math -from datetime import date, timedelta, datetime +import os +from datetime import date, datetime, timedelta from typing import List import numpy as np @@ -11,18 +12,23 @@ import pandas as pd import statsmodels.api as sm from statsmodels.regression.rolling import RollingOLS +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.etf import stockanalysis_model from gamestonk_terminal.portfolio import ( + portfolio_helper, portfolio_view, yfinance_model, - portfolio_helper, ) -from gamestonk_terminal.etf import stockanalysis_model from gamestonk_terminal.rich_config import console # pylint: disable=E1136 # pylint: disable=unsupported-assignment-operation +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def save_df(df: pd.DataFrame, name: str) -> None: """Saves the portfolio as a csv @@ -43,6 +49,7 @@ def save_df(df: pd.DataFrame, name: str) -> None: df.to_excel(path, index=False, engine="openpyxl") +@log_start_end(log=logger) def load_df(name: str) -> pd.DataFrame: """Load the portfolio from a csv @@ -108,6 +115,7 @@ def load_df(name: str) -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def add_values( log: pd.DataFrame, changes: pd.DataFrame, cashes: pd.DataFrame ) -> pd.DataFrame: @@ -203,6 +211,7 @@ def add_values( return log +@log_start_end(log=logger) def merge_dataframes( log: pd.DataFrame, hist: pd.DataFrame, @@ -259,6 +268,7 @@ def merge_dataframes( return comb +@log_start_end(log=logger) def convert_df(portfolio: pd.DataFrame) -> pd.DataFrame: """Converts a df from activity to daily holdings @@ -304,6 +314,7 @@ def convert_df(portfolio: pd.DataFrame) -> pd.DataFrame: return comb, hist +@log_start_end(log=logger) def get_return(df: pd.DataFrame, df_m: pd.DataFrame, n: int) -> pd.DataFrame: """Adds cumulative returns to a holdings df @@ -343,6 +354,7 @@ def get_return(df: pd.DataFrame, df_m: pd.DataFrame, n: int) -> pd.DataFrame: return comb, variance +@log_start_end(log=logger) def get_rolling_beta( df: pd.DataFrame, hist: pd.DataFrame, mark: pd.DataFrame, n: pd.DataFrame ) -> pd.DataFrame: @@ -388,6 +400,7 @@ def get_rolling_beta( return comb +@log_start_end(log=logger) def fix_etf_allocation( data: pd.DataFrame, df_new: pd.DataFrame, @@ -448,6 +461,7 @@ def fix_etf_allocation( return data +@log_start_end(log=logger) def get_allocation( data: pd.DataFrame, hist: pd.DataFrame, @@ -519,6 +533,7 @@ def get_allocation( return df +@log_start_end(log=logger) def get_main_text(df: pd.DataFrame) -> str: """Get main performance summary from a dataframe with returns @@ -561,6 +576,7 @@ def get_main_text(df: pd.DataFrame) -> str: return text +@log_start_end(log=logger) def get_beta_text(df: pd.DataFrame) -> str: """Get beta summary for a dataframe @@ -599,6 +615,7 @@ performance_text = ( ) +@log_start_end(log=logger) def calculate_drawdown(input_series: pd.Series, is_returns: bool = False) -> pd.Series: """Calculate the drawdown (MDD) of historical series. Note that the calculation is done on cumulative returns (or prices). The definition of drawdown is diff --git a/gamestonk_terminal/portfolio/portfolio_optimization/optimizer_model.py b/gamestonk_terminal/portfolio/portfolio_optimization/optimizer_model.py index d21ed685e09..27dc6de51b4 100644 --- a/gamestonk_terminal/portfolio/portfolio_optimization/optimizer_model.py +++ b/gamestonk_terminal/portfolio/portfolio_optimization/optimizer_model.py @@ -1,17 +1,23 @@ """Optimization Model""" __docformat__ = "numpy" -from typing import List, Dict, Tuple +import logging +from typing import Dict, List, Tuple import numpy as np import pandas as pd import yfinance as yf -from pypfopt.efficient_frontier import EfficientFrontier from pypfopt import expected_returns, risk_models +from pypfopt.efficient_frontier import EfficientFrontier + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.portfolio.portfolio_optimization import yahoo_finance_model from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_equal_weights(stocks: List[str], value: float = 1.0) -> Dict: """Equally weighted portfolio, where weight = 1/# of stocks @@ -30,6 +36,7 @@ def get_equal_weights(stocks: List[str], value: float = 1.0) -> Dict: return {stock: value * round(1 / len(stocks), 5) for stock in stocks} +@log_start_end(log=logger) def get_property_weights( stocks: List[str], s_property: str, value: float = 1.0 ) -> Dict: @@ -65,6 +72,7 @@ def get_property_weights( return {k: value * v / prop_sum for k, v in prop.items()} +@log_start_end(log=logger) def get_maxsharpe_portfolio( stocks: List[str], period: str, rfrate: float ) -> Tuple[Dict, EfficientFrontier]: @@ -91,6 +99,7 @@ def get_maxsharpe_portfolio( return dict(ef.max_sharpe(rfrate)), ef +@log_start_end(log=logger) def get_minvol_portfolio( stocks: List[str], period: str = "3mo" ) -> Tuple[Dict, EfficientFrontier]: @@ -115,6 +124,7 @@ def get_minvol_portfolio( return dict(ef.min_volatility()), ef +@log_start_end(log=logger) def get_maxquadutil_portfolio( stocks: List[str], period: str = "3mo", @@ -146,6 +156,7 @@ def get_maxquadutil_portfolio( return ef.max_quadratic_utility(risk_aversion, market_neutral), ef +@log_start_end(log=logger) def get_efficient_risk_portfolio( stocks: List[str], period: str = "3mo", @@ -177,6 +188,7 @@ def get_efficient_risk_portfolio( return ef.efficient_risk(target_vol, market_neutral), ef +@log_start_end(log=logger) def get_efficient_return_portfolio( stocks: List[str], period: str = "3mo", @@ -208,6 +220,7 @@ def get_efficient_return_portfolio( return ef.efficient_return(target_return, market_neutral), ef +@log_start_end(log=logger) def prepare_efficient_frontier(stock_prices: pd.DataFrame): """Take in a dataframe of prices and return an efficient frontier object @@ -227,6 +240,7 @@ def prepare_efficient_frontier(stock_prices: pd.DataFrame): return EfficientFrontier(mu, S) +@log_start_end(log=logger) def generate_random_portfolios( stocks: List[str], period: str = "3mo", n_portfolios: int = 300 ): diff --git a/gamestonk_terminal/portfolio/portfolio_optimization/optimizer_view.py b/gamestonk_terminal/portfolio/portfolio_optimization/optimizer_view.py index c183482edb7..6b851766598 100644 --- a/gamestonk_terminal/portfolio/portfolio_optimization/optimizer_view.py +++ b/gamestonk_terminal/portfolio/portfolio_optimization/optimizer_view.py @@ -2,21 +2,25 @@ __docformat__ = "numpy" import copy +import logging import math from typing import List import matplotlib.pyplot as plt -from matplotlib.lines import Line2D import numpy as np import pandas as pd +from matplotlib.lines import Line2D from pypfopt import plotting from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI -from gamestonk_terminal.helper_funcs import plot_autoscale, get_rf, print_rich_table +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import get_rf, plot_autoscale, print_rich_table from gamestonk_terminal.portfolio.portfolio_optimization import optimizer_model from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + d_period = { "1d": "[1 Day]", "5d": "[5 Days]", @@ -34,6 +38,7 @@ d_period = { # pylint:disable=no-member +@log_start_end(log=logger) def display_weights(weights: dict, market_neutral: bool = False): """Print weights in a nice format @@ -69,6 +74,7 @@ def display_weights(weights: dict, market_neutral: bool = False): console.print("") +@log_start_end(log=logger) def display_equal_weight(stocks: List[str], value: float, pie: bool = False): """Equally weighted portfolio, where weight = 1/# of stocks @@ -88,6 +94,7 @@ def display_equal_weight(stocks: List[str], value: float, pie: bool = False): display_weights(values) +@log_start_end(log=logger) def display_property_weighting( stocks: List[str], s_property: str, value: float = 1.0, pie: bool = False ): @@ -112,6 +119,7 @@ def display_property_weighting( display_weights(values) +@log_start_end(log=logger) def display_max_sharpe( stocks: List[str], period: str, @@ -147,6 +155,7 @@ def display_max_sharpe( console.print("") +@log_start_end(log=logger) def display_min_volatility( stocks: List[str], period: str = "3mo", value: float = 1.0, pie: bool = False ): @@ -175,6 +184,7 @@ def display_min_volatility( console.print("") +@log_start_end(log=logger) def display_max_quadratic_utility( stocks: List[str], period: str = "3mo", @@ -218,6 +228,7 @@ def display_max_quadratic_utility( console.print("") +@log_start_end(log=logger) def display_efficient_risk( stocks: List[str], period: str = "3mo", @@ -261,6 +272,7 @@ def display_efficient_risk( console.print("") +@log_start_end(log=logger) def display_efficient_return( stocks: List[str], period: str = "3mo", @@ -304,6 +316,7 @@ def display_efficient_return( console.print("") +@log_start_end(log=logger) def display_ef( stocks: List[str], period: str = "3mo", @@ -363,6 +376,7 @@ def display_ef( console.print("") +@log_start_end(log=logger) def my_autopct(x): """Function for autopct of plt.pie. This results in values not being printed in the pie if they are 'too small'""" if x > 4: @@ -371,6 +385,7 @@ def my_autopct(x): return "" +@log_start_end(log=logger) def pie_chart_weights(weights: dict, title_opt: str): """Show a pie chart of holdings diff --git a/gamestonk_terminal/portfolio/portfolio_optimization/yahoo_finance_model.py b/gamestonk_terminal/portfolio/portfolio_optimization/yahoo_finance_model.py index 218b44382a6..b089cd4bb1c 100644 --- a/gamestonk_terminal/portfolio/portfolio_optimization/yahoo_finance_model.py +++ b/gamestonk_terminal/portfolio/portfolio_optimization/yahoo_finance_model.py @@ -1,12 +1,18 @@ """YFinance Model""" __docformat__ = "numpy" +import logging from typing import List import pandas as pd import yfinance as yf +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def process_stocks(list_of_stocks: List[str], period: str = "3mo") -> pd.DataFrame: """Get adjusted closing price for each stock in the list diff --git a/gamestonk_terminal/portfolio/portfolio_view.py b/gamestonk_terminal/portfolio/portfolio_view.py index 43d892df233..a403de9afc0 100644 --- a/gamestonk_terminal/portfolio/portfolio_view.py +++ b/gamestonk_terminal/portfolio/portfolio_view.py @@ -1,39 +1,44 @@ """Portfolio View""" __docformat__ = "numpy" -from typing import List +import logging +import os from datetime import datetime from io import BytesIO from os import path -import os +from typing import List +import matplotlib.ticker as mtick import numpy as np import pandas as pd -from reportlab.lib.pagesizes import letter -from reportlab.pdfgen import canvas -from reportlab.lib.utils import ImageReader -from matplotlib.lines import Line2D from matplotlib import pyplot as plt -import matplotlib.ticker as mtick +from matplotlib.lines import Line2D from pypfopt import plotting +from reportlab.lib.pagesizes import letter +from reportlab.lib.utils import ImageReader +from reportlab.pdfgen import canvas -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal import feature_flags as gtff -from gamestonk_terminal.portfolio import ( - portfolio_model, - yfinance_model, -) -from gamestonk_terminal.portfolio import reportlab_helpers +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( + export_data, get_rf, plot_autoscale, - export_data, print_rich_table, ) +from gamestonk_terminal.portfolio import ( + portfolio_model, + reportlab_helpers, + yfinance_model, +) from gamestonk_terminal.portfolio.portfolio_optimization import optimizer_model from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def load_info(): """Prints instructions to load a CSV @@ -59,6 +64,7 @@ In order to load a CSV do the following: console.print(text) +@log_start_end(log=logger) def show_df(df: pd.DataFrame, show: bool) -> None: """Shows the given dataframe @@ -80,6 +86,7 @@ def show_df(df: pd.DataFrame, show: bool) -> None: console.print("") +@log_start_end(log=logger) def plot_overall_return( comb: pd.DataFrame, m_tick: str, plot: bool = False ) -> ImageReader: @@ -137,6 +144,7 @@ def plot_overall_return( return ImageReader(imgdata) +@log_start_end(log=logger) def plot_rolling_beta(df: pd.DataFrame) -> ImageReader: """Returns a chart with the portfolio's rolling beta @@ -185,6 +193,7 @@ def plot_rolling_beta(df: pd.DataFrame) -> ImageReader: return ImageReader(imgdata) +@log_start_end(log=logger) def plot_ef( stocks: List[str], variance: float, @@ -249,6 +258,7 @@ def plot_ef( return ImageReader(imgdata) +@log_start_end(log=logger) def display_allocation(data: pd.DataFrame, graph: bool): """Displays allocation Parameters @@ -283,6 +293,7 @@ def display_allocation(data: pd.DataFrame, graph: bool): plt.show() +@log_start_end(log=logger) def display_drawdown(holdings: pd.DataFrame, export: str = ""): """Display drawdown curve @@ -318,6 +329,7 @@ def display_drawdown(holdings: pd.DataFrame, export: str = ""): class Report: + @log_start_end(log=logger) def __init__(self, df: pd.DataFrame, hist: pd.DataFrame, m_tick: str, n: int): """Generate financial reports. Financial reports allow users to show the how they have been performing in @@ -355,6 +367,7 @@ class Report: self.df, self.hist, self.df_m, 365 ) + @log_start_end(log=logger) def generate_report(self) -> None: d = path.dirname(path.abspath(__file__)).replace( "gamestonk_terminal", "exports" @@ -372,6 +385,7 @@ class Report: report.save() console.print("File save in:\n", loc, "\n") + @log_start_end(log=logger) def generate_pg1(self, report: canvas.Canvas) -> None: report.drawImage( plot_overall_return(self.returns, self.m_tick, False), 15, 400, 600, 300 @@ -399,6 +413,7 @@ class Report: ) report.showPage() + @log_start_end(log=logger) def generate_pg2(self, report: canvas.Canvas) -> None: reportlab_helpers.base_format(report, "Portfolio Analysis") if "Holding" in self.df.columns: diff --git a/gamestonk_terminal/portfolio/yfinance_model.py b/gamestonk_terminal/portfolio/yfinance_model.py index a998c0380d0..64d4d107e33 100644 --- a/gamestonk_terminal/portfolio/yfinance_model.py +++ b/gamestonk_terminal/portfolio/yfinance_model.py @@ -2,14 +2,20 @@ __docformat__ = "numpy" import difflib -from typing import List +import logging from datetime import datetime, timedelta +from typing import List -import yfinance as yf import pandas as pd +import yfinance as yf + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.stocks.sector_industry_analysis import financedatabase_model +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_stocks(tickers: List[str], start: datetime) -> pd.DataFrame: """Gets historic data for list of tickers @@ -43,6 +49,7 @@ def get_stocks(tickers: List[str], start: datetime) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_dividends(tickers: List[str]) -> pd.DataFrame: """Past dividends for list of tickers @@ -64,6 +71,7 @@ def get_dividends(tickers: List[str]) -> pd.DataFrame: return pd.concat(dfs) +@log_start_end(log=logger) def get_market(start: datetime, ticker: str = "SPY") -> pd.DataFrame: """Get historical data for market asset @@ -87,6 +95,7 @@ def get_market(start: datetime, ticker: str = "SPY") -> pd.DataFrame: return df.to_frame(name=("Market", "Close")) +@log_start_end(log=logger) def get_country(ticker): country = "NA" data = yf.utils.get_json(f"https://finance.yahoo.com/quote/{ticker}") diff --git a/gamestonk_terminal/stocks/backtesting/bt_model.py b/gamestonk_terminal/stocks/backtesting/bt_model.py index 29802bbe486..66a57e31cc8 100644 --- a/gamestonk_terminal/stocks/backtesting/bt_model.py +++ b/gamestonk_terminal/stocks/backtesting/bt_model.py @@ -1,12 +1,19 @@ """Backtesting Model""" __docformat__ = "numpy" +import logging + import bt import pandas as pd import pandas_ta as ta import yfinance as yf +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_data(ticker: str, start_date: str) -> pd.DataFrame: """Function to replace bt.get, Gets Adjusted close of ticker using yfinance @@ -28,6 +35,7 @@ def get_data(ticker: str, start_date: str) -> pd.DataFrame: return prices +@log_start_end(log=logger) def buy_and_hold(ticker: str, start_date: str, name: str) -> bt.Backtest: """Generates a buy and hold backtest object for the given ticker @@ -58,6 +66,7 @@ def buy_and_hold(ticker: str, start_date: str, name: str) -> bt.Backtest: return bt.Backtest(bt_strategy, prices) +@log_start_end(log=logger) def ema_strategy( ticker: str, df_stock: pd.DataFrame, @@ -112,6 +121,7 @@ def ema_strategy( return res +@log_start_end(log=logger) def ema_cross_strategy( ticker: str, df_stock: pd.DataFrame, @@ -182,6 +192,7 @@ def ema_cross_strategy( return res +@log_start_end(log=logger) def rsi_strategy( ticker: str, df_stock: pd.DataFrame, diff --git a/gamestonk_terminal/stocks/backtesting/bt_view.py b/gamestonk_terminal/stocks/backtesting/bt_view.py index 2623da3f464..bc0109739c4 100644 --- a/gamestonk_terminal/stocks/backtesting/bt_view.py +++ b/gamestonk_terminal/stocks/backtesting/bt_view.py @@ -1,26 +1,31 @@ """bt view module""" __docformat__ = "numpy" +import logging import os - from datetime import datetime -import yfinance as yf + import matplotlib.pyplot as plt import numpy as np import pandas as pd +import yfinance as yf from pandas.plotting import register_matplotlib_converters from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale -from gamestonk_terminal.stocks.backtesting import bt_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.backtesting import bt_model + +logger = logging.getLogger(__name__) register_matplotlib_converters() np.seterr(divide="ignore") +@log_start_end(log=logger) def display_whatif_scenario( ticker: str, num_shares_acquired: float, @@ -101,6 +106,7 @@ def display_whatif_scenario( ) +@log_start_end(log=logger) def display_simple_ema( ticker: str, df_stock: pd.DataFrame, @@ -141,6 +147,7 @@ def display_simple_ema( ) +@log_start_end(log=logger) def display_ema_cross( ticker: str, df_stock: pd.DataFrame, @@ -190,6 +197,7 @@ def display_ema_cross( # pylint:disable=too-many-arguments +@log_start_end(log=logger) def display_rsi_strategy( ticker: str, df_stock: pd.DataFrame, diff --git a/gamestonk_terminal/stocks/comparison_analysis/finbrain_model.py b/gamestonk_terminal/stocks/comparison_analysis/finbrain_model.py index 0684e80da32..86416940391 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/finbrain_model.py +++ b/gamestonk_terminal/stocks/comparison_analysis/finbrain_model.py @@ -1,13 +1,19 @@ """ Comparison Analysis FinBrain Model """ __docformat__ = "numpy" +import logging from typing import List + import pandas as pd import requests +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_sentiments(tickers: List[str]) -> pd.DataFrame: """Gets Sentiment analysis from several tickers provided by FinBrain's API diff --git a/gamestonk_terminal/stocks/comparison_analysis/finbrain_view.py b/gamestonk_terminal/stocks/comparison_analysis/finbrain_view.py index abd25c1c7b0..d0f3fe7c49e 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/finbrain_view.py +++ b/gamestonk_terminal/stocks/comparison_analysis/finbrain_view.py @@ -1,6 +1,7 @@ """ Comparison Analysis FinBrain View """ __docformat__ = "numpy" +import logging import os from typing import List @@ -8,23 +9,26 @@ import matplotlib.dates as mdates import numpy as np import pandas as pd import seaborn as sns - from matplotlib import pyplot as plt from pandas.plotting import register_matplotlib_converters from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) -from gamestonk_terminal.stocks.comparison_analysis import finbrain_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.comparison_analysis import finbrain_model + +logger = logging.getLogger(__name__) register_matplotlib_converters() +@log_start_end(log=logger) def display_sentiment_compare(similar: List[str], raw: bool = False, export: str = ""): """Display sentiment for all ticker. [Source: FinBrain] @@ -104,6 +108,7 @@ def display_sentiment_compare(similar: List[str], raw: bool = False, export: str console.print("") +@log_start_end(log=logger) def display_sentiment_correlation( similar: List[str], raw: bool = False, export: str = "" ): diff --git a/gamestonk_terminal/stocks/comparison_analysis/finnhub_model.py b/gamestonk_terminal/stocks/comparison_analysis/finnhub_model.py index 527700c8b57..94fafc0869f 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/finnhub_model.py +++ b/gamestonk_terminal/stocks/comparison_analysis/finnhub_model.py @@ -1,12 +1,19 @@ """Finnhub model""" __docformat__ = "numpy" +import logging from typing import List, Tuple + import requests + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_similar_companies(ticker: str) -> Tuple[List[str], str]: result = requests.get( f"https://finnhub.io/api/v1/stock/peers?symbol={ticker}&token={cfg.API_FINNHUB_KEY}" diff --git a/gamestonk_terminal/stocks/comparison_analysis/finviz_compare_model.py b/gamestonk_terminal/stocks/comparison_analysis/finviz_compare_model.py index 8815ec6a6ce..3e7e07c3cc6 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/finviz_compare_model.py +++ b/gamestonk_terminal/stocks/comparison_analysis/finviz_compare_model.py @@ -1,20 +1,27 @@ """ Finviz Comparison Model """ __docformat__ = "numpy" +import logging from typing import List, Tuple + import pandas as pd from finvizfinance.screener import ( - technical, - overview, - valuation, financial, + overview, ownership, performance, + technical, + valuation, ) from finvizfinance.screener.overview import Overview + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_similar_companies( ticker: str, compare_list: List[str] ) -> Tuple[List[str], str]: @@ -46,6 +53,7 @@ def get_similar_companies( return similar, user +@log_start_end(log=logger) def get_comparison_data(data_type: str, similar: List[str]): """Screener Overview diff --git a/gamestonk_terminal/stocks/comparison_analysis/finviz_compare_view.py b/gamestonk_terminal/stocks/comparison_analysis/finviz_compare_view.py index 3af4aa1de43..76c57c267b7 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/finviz_compare_view.py +++ b/gamestonk_terminal/stocks/comparison_analysis/finviz_compare_view.py @@ -1,14 +1,19 @@ """ Finviz Comparison View """ __docformat__ = "numpy" -from typing import List +import logging import os +from typing import List +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.comparison_analysis import finviz_compare_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.comparison_analysis import finviz_compare_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def screener(similar: List[str], data_type: str, export: str = ""): """Screener diff --git a/gamestonk_terminal/stocks/comparison_analysis/marketwatch_model.py b/gamestonk_terminal/stocks/comparison_analysis/marketwatch_model.py index 9c501dc48c7..cb0e14ae836 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/marketwatch_model.py +++ b/gamestonk_terminal/stocks/comparison_analysis/marketwatch_model.py @@ -1,16 +1,21 @@ """ Comparison Analysis Marketwatch Model """ __docformat__ = "numpy" +import logging from typing import Dict, List, Tuple import pandas as pd import requests from bs4 import BeautifulSoup +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_financial_comparisons( all_stocks: List[str], data: str, timeframe: str, quarter: bool ) -> pd.DataFrame: @@ -57,6 +62,7 @@ def get_financial_comparisons( return combine_similar_financials(ddf_financials, all_stocks, s_timeframe, quarter) +@log_start_end(log=logger) def prepare_df_financials( ticker: str, statement: str, quarter: bool = False ) -> pd.DataFrame: @@ -155,6 +161,7 @@ def prepare_df_financials( return df_financials +@log_start_end(log=logger) def prepare_comparison_financials( similar: List[str], statement: str, quarter: bool ) -> Tuple[List[str], Dict[str, pd.DataFrame]]: @@ -202,6 +209,7 @@ def prepare_comparison_financials( return list(items), financials +@log_start_end(log=logger) def combine_similar_financials( financials: Dict[str, pd.DataFrame], similar: List[str], diff --git a/gamestonk_terminal/stocks/comparison_analysis/marketwatch_view.py b/gamestonk_terminal/stocks/comparison_analysis/marketwatch_view.py index 02a5aaf915f..860ef7de878 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/marketwatch_view.py +++ b/gamestonk_terminal/stocks/comparison_analysis/marketwatch_view.py @@ -1,20 +1,25 @@ """ Comparison Analysis Marketwatch View """ __docformat__ = "numpy" +import logging import os from typing import List from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, financials_colored_values, patch_pandas_text_adjustment, print_rich_table, ) -from gamestonk_terminal.stocks.comparison_analysis import marketwatch_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.comparison_analysis import marketwatch_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_income_comparison( similar: List[str], timeframe: str, @@ -63,6 +68,7 @@ def display_income_comparison( console.print("") +@log_start_end(log=logger) def display_balance_comparison( similar: List[str], timeframe: str, @@ -111,6 +117,7 @@ def display_balance_comparison( console.print("") +@log_start_end(log=logger) def display_cashflow_comparison( similar: List[str], timeframe: str, diff --git a/gamestonk_terminal/stocks/comparison_analysis/polygon_model.py b/gamestonk_terminal/stocks/comparison_analysis/polygon_model.py index 43aa99a99b6..70b7433b8c5 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/polygon_model.py +++ b/gamestonk_terminal/stocks/comparison_analysis/polygon_model.py @@ -1,13 +1,19 @@ "Polygon Model" __docformat__ = "numpy" +import logging from typing import List, Tuple import requests + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_similar_companies(ticker: str, us_only: bool) -> Tuple[List[str], str]: """Get similar companies from Polygon diff --git a/gamestonk_terminal/stocks/comparison_analysis/yahoo_finance_model.py b/gamestonk_terminal/stocks/comparison_analysis/yahoo_finance_model.py index ea60aca8926..0f86e3cc062 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/yahoo_finance_model.py +++ b/gamestonk_terminal/stocks/comparison_analysis/yahoo_finance_model.py @@ -1,6 +1,7 @@ """Yahoo Finance Comparison Model""" __docformat__ = "numpy" +import logging from datetime import datetime, timedelta from typing import List @@ -10,9 +11,12 @@ import yfinance as yf from sklearn.manifold import TSNE from sklearn.preprocessing import normalize -from gamestonk_terminal.config_plot import PLOT_DPI -from gamestonk_terminal.helper_funcs import plot_autoscale from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import plot_autoscale + +logger = logging.getLogger(__name__) d_candle_types = { "o": "Open", @@ -24,6 +28,7 @@ d_candle_types = { } +@log_start_end(log=logger) def get_historical( similar_tickers: List[str], start: str = (datetime.now() - timedelta(days=366)).strftime("%Y-%m-%d"), @@ -52,6 +57,7 @@ def get_historical( ][similar_tickers] +@log_start_end(log=logger) def get_1y_sp500() -> pd.DataFrame: """ Gets the last year of Adj Close prices for all current SP 500 stocks. @@ -71,6 +77,7 @@ def get_1y_sp500() -> pd.DataFrame: # pylint:disable=E1137,E1101 +@log_start_end(log=logger) def get_sp500_comps_tsne( ticker: str, lr: int = 200, no_plot: bool = False, num_tickers: int = 10 ) -> List[str]: diff --git a/gamestonk_terminal/stocks/comparison_analysis/yahoo_finance_view.py b/gamestonk_terminal/stocks/comparison_analysis/yahoo_finance_view.py index 5f34d32845c..83984e4880b 100644 --- a/gamestonk_terminal/stocks/comparison_analysis/yahoo_finance_view.py +++ b/gamestonk_terminal/stocks/comparison_analysis/yahoo_finance_view.py @@ -1,6 +1,7 @@ """ Comparison Analysis Yahoo Finance View """ __docformat__ = "numpy" +import logging import os from datetime import datetime, timedelta from typing import List @@ -11,13 +12,15 @@ import pandas as pd import seaborn as sns from pandas.plotting import register_matplotlib_converters from sklearn.preprocessing import MinMaxScaler + from gamestonk_terminal import feature_flags as gtff - from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, plot_autoscale -from gamestonk_terminal.stocks.comparison_analysis import yahoo_finance_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.comparison_analysis import yahoo_finance_model +logger = logging.getLogger(__name__) register_matplotlib_converters() @@ -31,6 +34,7 @@ d_candle_types = { } +@log_start_end(log=logger) def display_historical( similar_tickers: List[str], start: str = (datetime.now() - timedelta(days=366)).strftime("%Y-%m-%d"), @@ -89,6 +93,7 @@ def display_historical( console.print("") +@log_start_end(log=logger) def display_volume( similar_tickers: List[str], start: str = (datetime.now() - timedelta(days=366)).strftime("%Y-%m-%d"), @@ -130,6 +135,7 @@ def display_volume( console.print("") +@log_start_end(log=logger) def display_correlation( similar_tickers: List[str], start: str = (datetime.now() - timedelta(days=366)).strftime("%Y-%m-%d"), diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/finra_model.py b/gamestonk_terminal/stocks/dark_pool_shorts/finra_model.py index 6510aabb5c7..86549262381 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/finra_model.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/finra_model.py @@ -1,14 +1,20 @@ """ FINRA Model """ __docformat__ = "numpy" -from typing import List, Tuple, Dict -import requests +import logging +from typing import Dict, List, Tuple + import pandas as pd +import requests from scipy import stats +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def getFINRAweeks(tier: str, is_ats: bool) -> List: """Get FINRA weeks. [Source: FINRA] @@ -55,6 +61,7 @@ def getFINRAweeks(tier: str, is_ats: bool) -> List: return response.json() if response.status_code == 200 else list() +@log_start_end(log=logger) def getFINRAdata_offset( weekStartDate: str, tier: str, ticker: str, is_ats: bool, offset: int ) -> requests.Response: @@ -126,6 +133,7 @@ def getFINRAdata_offset( ) +@log_start_end(log=logger) def getFINRAdata( weekStartDate: str, tier: str, ticker: str, is_ats: bool ) -> Tuple[int, List]: @@ -201,6 +209,7 @@ def getFINRAdata( ) +@log_start_end(log=logger) def getATSdata(num_tickers_to_filter: int, tier_ats: str) -> Tuple[pd.DataFrame, Dict]: """Get all FINRA ATS data, and parse most promising tickers based on linear regression @@ -278,6 +287,7 @@ def getATSdata(num_tickers_to_filter: int, tier_ats: str) -> Tuple[pd.DataFrame, return df_ats, d_ats_reg +@log_start_end(log=logger) def getTickerFINRAdata(ticker: str) -> Tuple[pd.DataFrame, pd.DataFrame]: """Get all FINRA data associated with a ticker diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/finra_view.py b/gamestonk_terminal/stocks/dark_pool_shorts/finra_view.py index 658eb97dfee..31c3a3681e4 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/finra_view.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/finra_view.py @@ -1,18 +1,25 @@ """ FINRA View """ __docformat__ = "numpy" +import logging import os from typing import List + +import matplotlib.dates as mdates import pandas as pd from matplotlib import pyplot as plt -import matplotlib.dates as mdates -from gamestonk_terminal.stocks.dark_pool_shorts import finra_model -from gamestonk_terminal.config_plot import PLOT_DPI + from gamestonk_terminal import feature_flags as gtff -from gamestonk_terminal.helper_funcs import plot_autoscale, export_data +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.dark_pool_shorts import finra_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def plot_dark_pools(ticker: str, ats: pd.DataFrame, otc: pd.DataFrame): """Plots ATS and NON-ATS data @@ -96,6 +103,7 @@ def plot_dark_pools(ticker: str, ats: pd.DataFrame, otc: pd.DataFrame): plt.show() +@log_start_end(log=logger) def darkpool_ats_otc(ticker: str, export: str): """Display barchart of dark pool (ATS) and OTC (Non ATS) data. [Source: FINRA] @@ -128,6 +136,7 @@ def darkpool_ats_otc(ticker: str, export: str): ) +@log_start_end(log=logger) def plot_dark_pools_ats(ats: pd.DataFrame, top_ats_tickers: List): """Plots promising tickers based on growing ATS data @@ -162,6 +171,7 @@ def plot_dark_pools_ats(ats: pd.DataFrame, top_ats_tickers: List): plt.show() +@log_start_end(log=logger) def darkpool_otc(num: int, promising: int, tier: str, export: str): """Display dark pool (ATS) data of tickers with growing trades activity. [Source: FINRA] diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/nyse_model.py b/gamestonk_terminal/stocks/dark_pool_shorts/nyse_model.py index 4e77da63995..5392b27eba2 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/nyse_model.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/nyse_model.py @@ -1,10 +1,17 @@ """NYSE Short Data Model""" __docformat__ = "numpy" +import logging + import pandas as pd import pymongo +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_short_data_by_exchange(ticker: str) -> pd.DataFrame: """Gets short data for 5 exchanges [https://ftp.nyse.com] starting at 1/1/2021 diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/nyse_view.py b/gamestonk_terminal/stocks/dark_pool_shorts/nyse_view.py index d847bf6077c..668b75436de 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/nyse_view.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/nyse_view.py @@ -2,21 +2,28 @@ __docformat__ = "numpy" +import logging import os + import matplotlib.pyplot as plt import seaborn as sns from plotly import express as px -from gamestonk_terminal.stocks.dark_pool_shorts import nyse_model + +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.feature_flags import USE_ION from gamestonk_terminal.helper_funcs import ( - plot_autoscale, export_data, + plot_autoscale, print_rich_table, ) -from gamestonk_terminal.feature_flags import USE_ION -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.dark_pool_shorts import nyse_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_short_by_exchange( ticker: str, raw: bool = False, diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/quandl_model.py b/gamestonk_terminal/stocks/dark_pool_shorts/quandl_model.py index ee698fb5c82..ae203e44dfe 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/quandl_model.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/quandl_model.py @@ -1,11 +1,18 @@ """ Quandl Model """ __docformat__ = "numpy" -import quandl +import logging + import pandas as pd +import quandl + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_short_interest(ticker: str, nyse: bool) -> pd.DataFrame: """Plots the short interest of a stock. This corresponds to the number of shares that have been sold short but have not yet been diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/quandl_view.py b/gamestonk_terminal/stocks/dark_pool_shorts/quandl_view.py index e4a6a57ba10..aa6517cfc89 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/quandl_view.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/quandl_view.py @@ -1,20 +1,27 @@ """ Quandl View """ __docformat__ = "numpy" +import logging import os + import matplotlib.ticker -from matplotlib import pyplot as plt import pandas as pd -from gamestonk_terminal.stocks.dark_pool_shorts import quandl_model +from matplotlib import pyplot as plt + +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( - long_number_format, export_data, + long_number_format, print_rich_table, ) -from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.dark_pool_shorts import quandl_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def plot_short_interest(ticker: str, nyse: bool, df_short_interest: pd.DataFrame): """Plots the short interest of a stock. This corresponds to the number of shares that have been sold short but have not yet been @@ -66,6 +73,7 @@ def plot_short_interest(ticker: str, nyse: bool, df_short_interest: pd.DataFrame plt.show() +@log_start_end(log=logger) def short_interest(ticker: str, nyse: bool, days: int, raw: bool, export: str): """Plots the short interest of a stock. This corresponds to the number of shares that have been sold short but have not yet been diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/sec_model.py b/gamestonk_terminal/stocks/dark_pool_shorts/sec_model.py index 63a5e97e649..31f986cd05f 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/sec_model.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/sec_model.py @@ -1,13 +1,20 @@ """ SEC Model """ __docformat__ = "numpy" +import logging from datetime import datetime -import requests + import pandas as pd +import requests from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_fails_to_deliver( ticker: str, start: datetime, diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/sec_view.py b/gamestonk_terminal/stocks/dark_pool_shorts/sec_view.py index a0f7a13bfa6..52832fb63eb 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/sec_view.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/sec_view.py @@ -1,17 +1,24 @@ """ SEC View """ __docformat__ = "numpy" +import logging import os from datetime import datetime, timedelta + +import matplotlib.dates as mdates import pandas as pd from matplotlib import pyplot as plt -import matplotlib.dates as mdates -from gamestonk_terminal.stocks.dark_pool_shorts import sec_model + from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.dark_pool_shorts import sec_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def fails_to_deliver( ticker: str, stock: pd.DataFrame, diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/shortinterest_model.py b/gamestonk_terminal/stocks/dark_pool_shorts/shortinterest_model.py index 25b3b5104d0..a7dae81da9d 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/shortinterest_model.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/shortinterest_model.py @@ -1,14 +1,20 @@ """ Short Interest View """ __docformat__ = "numpy" +import logging + +import pandas as pd import requests from bs4 import BeautifulSoup -import pandas as pd from pandas.core.frame import DataFrame +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_high_short_interest() -> DataFrame: """Returns a high short interest DataFrame diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/shortinterest_view.py b/gamestonk_terminal/stocks/dark_pool_shorts/shortinterest_view.py index e80f414d578..ba4e6aff786 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/shortinterest_view.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/shortinterest_view.py @@ -1,13 +1,18 @@ """ Short Interest View """ __docformat__ = "numpy" +import logging import os + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table - -from gamestonk_terminal.stocks.dark_pool_shorts import shortinterest_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.dark_pool_shorts import shortinterest_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def high_short_interest(num: int, export: str): """Prints top N high shorted interest stocks from https://www.highshortinterest.com diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/stockgrid_model.py b/gamestonk_terminal/stocks/dark_pool_shorts/stockgrid_model.py index d9200a88c02..ea3f6b28158 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/stockgrid_model.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/stockgrid_model.py @@ -1,11 +1,18 @@ """ Stockgrid View """ __docformat__ = "numpy" +import logging from typing import List, Tuple -import requests + import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_dark_pool_short_positions(sort_field: str, ascending: bool) -> pd.DataFrame: """Get dark pool short positions. [Source: Stockgrid] @@ -61,6 +68,7 @@ def get_dark_pool_short_positions(sort_field: str, ascending: bool) -> pd.DataFr return df +@log_start_end(log=logger) def get_short_interest_days_to_cover(sort_field: str) -> pd.DataFrame: """Get short interest and days to cover. [Source: Stockgrid] @@ -95,6 +103,7 @@ def get_short_interest_days_to_cover(sort_field: str) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_short_interest_volume(ticker: str) -> Tuple[pd.DataFrame, List]: """Get price vs short interest volume. [Source: Stockgrid] @@ -119,6 +128,7 @@ def get_short_interest_volume(ticker: str) -> Tuple[pd.DataFrame, List]: return df, response.json()["prices"]["prices"] +@log_start_end(log=logger) def get_net_short_position(ticker: str) -> pd.DataFrame: """Get net short position. [Source: Stockgrid] diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/stockgrid_view.py b/gamestonk_terminal/stocks/dark_pool_shorts/stockgrid_view.py index 2c34fbdcb56..cd1425a3cc8 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/stockgrid_view.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/stockgrid_view.py @@ -1,20 +1,27 @@ """ Stockgrid View """ __docformat__ = "numpy" +import logging import os from datetime import timedelta + import matplotlib.pyplot as plt + from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.feature_flags import USE_ION -from gamestonk_terminal.stocks.dark_pool_shorts import stockgrid_model from gamestonk_terminal.helper_funcs import ( - plot_autoscale, export_data, + plot_autoscale, print_rich_table, ) from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.dark_pool_shorts import stockgrid_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def dark_pool_short_positions(num: int, sort_field: str, ascending: bool, export: str): """Get dark pool short positions. [Source: Stockgrid] @@ -69,6 +76,7 @@ def dark_pool_short_positions(num: int, sort_field: str, ascending: bool, export ) +@log_start_end(log=logger) def short_interest_days_to_cover(num: int, sort_field: str, export: str): """Print short interest and days to cover. [Source: Stockgrid] @@ -112,6 +120,7 @@ def short_interest_days_to_cover(num: int, sort_field: str, export: str): ) +@log_start_end(log=logger) def short_interest_volume(ticker: str, num: int, raw: bool, export: str): """Plot price vs short interest volume. [Source: Stockgrid] @@ -233,6 +242,7 @@ def short_interest_volume(ticker: str, num: int, raw: bool, export: str): ) +@log_start_end(log=logger) def net_short_position(ticker: str, num: int, raw: bool, export: str): """Plot net short position. [Source: Stockgrid] diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/yahoofinance_model.py b/gamestonk_terminal/stocks/dark_pool_shorts/yahoofinance_model.py index a5dfb0953c9..c9031e1cc6b 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/yahoofinance_model.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/yahoofinance_model.py @@ -1,10 +1,17 @@ """ Yahoo Finance Model """ __docformat__ = "numpy" +import logging + import pandas as pd import requests +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_most_shorted() -> pd.DataFrame: """Get most shorted stock screener [Source: Yahoo Finance] diff --git a/gamestonk_terminal/stocks/dark_pool_shorts/yahoofinance_view.py b/gamestonk_terminal/stocks/dark_pool_shorts/yahoofinance_view.py index 1daf30fbb73..4a9b9686375 100644 --- a/gamestonk_terminal/stocks/dark_pool_shorts/yahoofinance_view.py +++ b/gamestonk_terminal/stocks/dark_pool_shorts/yahoofinance_view.py @@ -1,12 +1,18 @@ """ Yahoo Finance View """ __docformat__ = "numpy" +import logging import os + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.dark_pool_shorts import yahoofinance_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.dark_pool_shorts import yahoofinance_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_most_shorted(num_stocks: int, export: str): """Display most shorted stocks screener. [Source: Yahoo Finance] diff --git a/gamestonk_terminal/stocks/discovery/ark_model.py b/gamestonk_terminal/stocks/discovery/ark_model.py index 27afe2b8cd6..b2b313b023e 100644 --- a/gamestonk_terminal/stocks/discovery/ark_model.py +++ b/gamestonk_terminal/stocks/discovery/ark_model.py @@ -1,19 +1,25 @@ """ ARK Model """ __docformat__ = "numpy" -from datetime import timedelta import json -import requests -from bs4 import BeautifulSoup +import logging +from datetime import timedelta + import numpy as np import pandas as pd -from pandas.core.frame import DataFrame +import requests import yfinance as yf +from bs4 import BeautifulSoup +from pandas.core.frame import DataFrame +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_ark_orders() -> DataFrame: """Returns ARK orders in a Dataframe @@ -69,6 +75,7 @@ def get_ark_orders() -> DataFrame: return df_orders +@log_start_end(log=logger) def add_order_total(df_orders: DataFrame) -> DataFrame: """Takes an ARK orders dataframe and pulls data from Yahoo Finance to add volume, open, close, high, low, and total columns diff --git a/gamestonk_terminal/stocks/discovery/ark_view.py b/gamestonk_terminal/stocks/discovery/ark_view.py index 47f34bad2af..e94a3d59b56 100644 --- a/gamestonk_terminal/stocks/discovery/ark_view.py +++ b/gamestonk_terminal/stocks/discovery/ark_view.py @@ -1,13 +1,19 @@ """ ARK View """ __docformat__ = "numpy" +import logging import os + from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.discovery import ark_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.discovery import ark_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def direction_color_red_green(val: str) -> str: """Adds color tags to the Direction information: Buy -> Green, Sell -> Red @@ -25,6 +31,7 @@ def direction_color_red_green(val: str) -> str: return f"[{color}]{val}[/{color}]" +@log_start_end(log=logger) def ark_orders_view( num: int, sort_col: str = "", diff --git a/gamestonk_terminal/stocks/discovery/fidelity_model.py b/gamestonk_terminal/stocks/discovery/fidelity_model.py index 5fb37c0333e..10e7497def7 100644 --- a/gamestonk_terminal/stocks/discovery/fidelity_model.py +++ b/gamestonk_terminal/stocks/discovery/fidelity_model.py @@ -1,15 +1,21 @@ """ Fidelity Model """ __docformat__ = "numpy" +import logging from typing import Tuple + +import pandas as pd import requests from bs4 import BeautifulSoup -import pandas as pd from pandas.core.frame import DataFrame +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_orders() -> Tuple[str, DataFrame]: """Returns Fidelity orders in a Dataframe diff --git a/gamestonk_terminal/stocks/discovery/fidelity_view.py b/gamestonk_terminal/stocks/discovery/fidelity_view.py index 661c25fee91..5243adf7c3b 100644 --- a/gamestonk_terminal/stocks/discovery/fidelity_view.py +++ b/gamestonk_terminal/stocks/discovery/fidelity_view.py @@ -1,17 +1,22 @@ """ Fidelity View """ __docformat__ = "numpy" +import logging import os import re + import pandas as pd -from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal import feature_flags as gtff - -from gamestonk_terminal.stocks.discovery import fidelity_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.discovery import fidelity_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def buy_sell_ratio_color_red_green(val: str) -> str: """Add color tags to the Buys/Sells ratio cell @@ -40,6 +45,7 @@ def buy_sell_ratio_color_red_green(val: str) -> str: return f"{buys}% Buys, [red]{sells}%[/red] Sells" +@log_start_end(log=logger) def price_change_color_red_green(val: str) -> str: """Add color tags to the price change cell @@ -60,6 +66,7 @@ def price_change_color_red_green(val: str) -> str: return f"[red]{val}[/red]" +@log_start_end(log=logger) def orders_view(num: int, export: str): """Prints last N orders by Fidelity customers. [Source: Fidelity] diff --git a/gamestonk_terminal/stocks/discovery/financedatabase_view.py b/gamestonk_terminal/stocks/discovery/financedatabase_view.py index c76be607806..218aed7b0ed 100644 --- a/gamestonk_terminal/stocks/discovery/financedatabase_view.py +++ b/gamestonk_terminal/stocks/discovery/financedatabase_view.py @@ -2,12 +2,19 @@ __docformat__ = "numpy" # pylint:disable=too-many-arguments +import logging + import financedatabase as fd import pandas as pd + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import print_rich_table from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def show_equities( country: str, sector: str, diff --git a/gamestonk_terminal/stocks/discovery/finnhub_model.py b/gamestonk_terminal/stocks/discovery/finnhub_model.py index 7e41de5096e..7c01de43f39 100644 --- a/gamestonk_terminal/stocks/discovery/finnhub_model.py +++ b/gamestonk_terminal/stocks/discovery/finnhub_model.py @@ -1,8 +1,15 @@ -import requests +import logging + import pandas as pd +import requests + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_ipo_calendar(from_date: str, to_date: str) -> pd.DataFrame: """Get IPO calendar diff --git a/gamestonk_terminal/stocks/discovery/finnhub_view.py b/gamestonk_terminal/stocks/discovery/finnhub_view.py index 88bad2d25bd..1057ac13097 100644 --- a/gamestonk_terminal/stocks/discovery/finnhub_view.py +++ b/gamestonk_terminal/stocks/discovery/finnhub_view.py @@ -1,11 +1,18 @@ +import logging import os from datetime import datetime, timedelta + import pandas as pd + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.discovery import finnhub_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.discovery import finnhub_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def past_ipo(num_days_behind: int, export: str) -> pd.DataFrame: """Past IPOs dates. [Source: Finnhub] @@ -51,6 +58,7 @@ def past_ipo(num_days_behind: int, export: str) -> pd.DataFrame: ) +@log_start_end(log=logger) def future_ipo(num_days_ahead: int, export: str) -> pd.DataFrame: """Future IPOs dates. [Source: Finnhub] diff --git a/gamestonk_terminal/stocks/discovery/geekofwallstreet_model.py b/gamestonk_terminal/stocks/discovery/geekofwallstreet_model.py index 1b62aa55384..514fbc53e42 100644 --- a/gamestonk_terminal/stocks/discovery/geekofwallstreet_model.py +++ b/gamestonk_terminal/stocks/discovery/geekofwallstreet_model.py @@ -2,10 +2,17 @@ __docformat__ = "numpy" import io -import requests +import logging + import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def download_file_from_google_drive(file_id: str) -> bytes: """Custom function from rkornmeyer for pulling csv from google drive @@ -20,6 +27,7 @@ def download_file_from_google_drive(file_id: str) -> bytes: Content from request response """ + @log_start_end(log=logger) def get_confirm_token(response): for key, value in response.cookies.items(): if key.startswith("download_warning"): @@ -41,6 +49,7 @@ def download_file_from_google_drive(file_id: str) -> bytes: return response.content +@log_start_end(log=logger) def get_realtime_earnings() -> pd.DataFrame: """Pulls realtime earnings from geek of wallstreet diff --git a/gamestonk_terminal/stocks/discovery/geekofwallstreet_view.py b/gamestonk_terminal/stocks/discovery/geekofwallstreet_view.py index 2a49796c760..493296905cb 100644 --- a/gamestonk_terminal/stocks/discovery/geekofwallstreet_view.py +++ b/gamestonk_terminal/stocks/discovery/geekofwallstreet_view.py @@ -1,15 +1,21 @@ """Geek of wall street view""" __docformat__ = "numpy" +import logging import os import pandas as pd +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.stocks.discovery import geekofwallstreet_model as gwt_model # pylint:disable=no-member +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def display_realtime_earnings(export: str = ""): """Displays real time earnings data from geekofwallstreet.com diff --git a/gamestonk_terminal/stocks/discovery/nasdaq_model.py b/gamestonk_terminal/stocks/discovery/nasdaq_model.py index 1bd5660fa42..682e0dfb037 100644 --- a/gamestonk_terminal/stocks/discovery/nasdaq_model.py +++ b/gamestonk_terminal/stocks/discovery/nasdaq_model.py @@ -1,12 +1,19 @@ """NASDAQ DataLink Model""" __docformat__ = "numpy" +import logging + import pandas as pd import requests + import gamestonk_terminal.config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_retail_tickers() -> pd.DataFrame: """Gets the top 10 retail stocks per day @@ -26,6 +33,7 @@ def get_retail_tickers() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_dividend_cal(date: str) -> pd.DataFrame: """Gets dividend calendar for given date. Date represents Ex-Dividend Date diff --git a/gamestonk_terminal/stocks/discovery/nasdaq_view.py b/gamestonk_terminal/stocks/discovery/nasdaq_view.py index 17bd0a1f3cc..f0d5e96ddcb 100644 --- a/gamestonk_terminal/stocks/discovery/nasdaq_view.py +++ b/gamestonk_terminal/stocks/discovery/nasdaq_view.py @@ -1,15 +1,21 @@ """NASDAQ DataLink View""" __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.discovery import nasdaq_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.discovery import nasdaq_model # pylint: disable=E1123 +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def display_top_retail(n_days: int = 3, export: str = ""): """Display the top 10 retail traded stocks for last days @@ -35,6 +41,7 @@ def display_top_retail(n_days: int = 3, export: str = ""): export_data(export, os.path.dirname(os.path.abspath(__file__)), "rtat", retails) +@log_start_end(log=logger) def display_dividend_calendar( date: str, sort_col: str = "Dividend", diff --git a/gamestonk_terminal/stocks/discovery/seeking_alpha_model.py b/gamestonk_terminal/stocks/discovery/seeking_alpha_model.py index 3451e5abc8c..ea99bd1a429 100644 --- a/gamestonk_terminal/stocks/discovery/seeking_alpha_model.py +++ b/gamestonk_terminal/stocks/discovery/seeking_alpha_model.py @@ -1,16 +1,22 @@ """ Seeking Alpha Model """ __docformat__ = "numpy" -from typing import List, Dict +import logging +from typing import Dict, List + +import pandas as pd import requests from bs4 import BeautifulSoup -import pandas as pd from pandas.core.frame import DataFrame +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_earnings_html(url_next_earnings: str) -> str: """Wraps HTTP requests.get for testibility @@ -31,6 +37,7 @@ def get_earnings_html(url_next_earnings: str) -> str: return earnings_html +@log_start_end(log=logger) def get_next_earnings(pages: int) -> DataFrame: """Returns a DataFrame with upcoming earnings @@ -70,6 +77,7 @@ def get_next_earnings(pages: int) -> DataFrame: return df_earnings +@log_start_end(log=logger) def get_articles_html(url_articles: str) -> str: """Wraps HTTP requests.get for testibility @@ -90,6 +98,7 @@ def get_articles_html(url_articles: str) -> str: return articles_html +@log_start_end(log=logger) def get_trending_list(num: int) -> list: """Returns a list of trending articles @@ -129,6 +138,7 @@ def get_trending_list(num: int) -> list: return articles[:num] +@log_start_end(log=logger) def get_article_data(article_id: int) -> dict: """Returns an article @@ -159,6 +169,7 @@ def get_article_data(article_id: int) -> dict: return article +@log_start_end(log=logger) def get_news_html(news_type: str = "Top-News") -> dict: """Gets news. [Source: SeekingAlpha] @@ -186,6 +197,7 @@ def get_news_html(news_type: str = "Top-News") -> dict: return articles_html +@log_start_end(log=logger) def get_news(news_type: str = "Top-News", num: int = 5) -> List: """Gets news. [Source: SeekingAlpha] diff --git a/gamestonk_terminal/stocks/discovery/seeking_alpha_view.py b/gamestonk_terminal/stocks/discovery/seeking_alpha_view.py index ded1fa7a8a0..f9a1054c325 100644 --- a/gamestonk_terminal/stocks/discovery/seeking_alpha_view.py +++ b/gamestonk_terminal/stocks/discovery/seeking_alpha_view.py @@ -1,15 +1,21 @@ """ Seeking Alpha View """ __docformat__ = "numpy" -from typing import List +import logging import os +from typing import List + import pandas as pd +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.discovery import seeking_alpha_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.discovery import seeking_alpha_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def upcoming_earning_release_dates(num_pages: int, num_earnings: int, export: str): """Displays upcoming earnings release dates @@ -74,6 +80,7 @@ def upcoming_earning_release_dates(num_pages: int, num_earnings: int, export: st ) +@log_start_end(log=logger) def news(article_id: int, num: int, export: str): """Prints the latest news article list. [Source: Seeking Alpha] @@ -135,6 +142,7 @@ def news(article_id: int, num: int, export: str): ) +@log_start_end(log=logger) def display_news(news_type: str = "Top-News", num: int = 5, export: str = ""): """Display news. [Source: SeekingAlpha] diff --git a/gamestonk_terminal/stocks/discovery/shortinterest_model.py b/gamestonk_terminal/stocks/discovery/shortinterest_model.py index 1a2b146fb67..ea4323c9629 100644 --- a/gamestonk_terminal/stocks/discovery/shortinterest_model.py +++ b/gamestonk_terminal/stocks/discovery/shortinterest_model.py @@ -1,14 +1,20 @@ """ Short Interest View """ __docformat__ = "numpy" +import logging + +import pandas as pd import requests from bs4 import BeautifulSoup -import pandas as pd from pandas.core.frame import DataFrame +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_low_float() -> DataFrame: """Returns low float DataFrame @@ -54,6 +60,7 @@ def get_low_float() -> DataFrame: return df_low_float +@log_start_end(log=logger) def get_today_hot_penny_stocks() -> DataFrame: """Returns today hot penny stocks diff --git a/gamestonk_terminal/stocks/discovery/shortinterest_view.py b/gamestonk_terminal/stocks/discovery/shortinterest_view.py index d6c607b94f0..75b2277837d 100644 --- a/gamestonk_terminal/stocks/discovery/shortinterest_view.py +++ b/gamestonk_terminal/stocks/discovery/shortinterest_view.py @@ -1,12 +1,17 @@ """ Short Interest View """ __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.stocks.discovery import shortinterest_model +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def low_float(num: int, export: str): """Prints top N low float stocks from https://www.lowfloat.com @@ -35,6 +40,7 @@ def low_float(num: int, export: str): ) +@log_start_end(log=logger) def hot_penny_stocks(num: int, export: str): """Prints top N hot penny stocks from https://www.pennystockflow.com diff --git a/gamestonk_terminal/stocks/discovery/yahoofinance_model.py b/gamestonk_terminal/stocks/discovery/yahoofinance_model.py index 0b357bb07ad..938e3bbb6bf 100644 --- a/gamestonk_terminal/stocks/discovery/yahoofinance_model.py +++ b/gamestonk_terminal/stocks/discovery/yahoofinance_model.py @@ -1,10 +1,17 @@ """ Yahoo Finance Model """ __docformat__ = "numpy" +import logging + import pandas as pd import requests +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_gainers() -> pd.DataFrame: """Get top gainers. [Source: Yahoo Finance] @@ -18,6 +25,7 @@ def get_gainers() -> pd.DataFrame: return pd.read_html(requests.get(url_gainers).text)[0] +@log_start_end(log=logger) def get_losers() -> pd.DataFrame: """Get top losers. [Source: Yahoo Finance] @@ -31,6 +39,7 @@ def get_losers() -> pd.DataFrame: return pd.read_html(requests.get(url_losers).text)[0] +@log_start_end(log=logger) def get_ugs() -> pd.DataFrame: """Get stocks with earnings growth rates better than 25% and relatively low PE and PEG ratios. [Source: Yahoo Finance] @@ -46,6 +55,7 @@ def get_ugs() -> pd.DataFrame: return data +@log_start_end(log=logger) def get_gtech() -> pd.DataFrame: """Get technology stocks with revenue and earnings growth in excess of 25%. [Source: Yahoo Finance] @@ -61,6 +71,7 @@ def get_gtech() -> pd.DataFrame: return data +@log_start_end(log=logger) def get_active() -> pd.DataFrame: """Get stocks ordered in descending order by intraday trade volume. [Source: Yahoo Finance] @@ -75,6 +86,7 @@ def get_active() -> pd.DataFrame: return data +@log_start_end(log=logger) def get_ulc() -> pd.DataFrame: """Get Yahoo Finance potentially undervalued large cap stocks. [Source: Yahoo Finance] @@ -89,6 +101,7 @@ def get_ulc() -> pd.DataFrame: return data +@log_start_end(log=logger) def get_asc() -> pd.DataFrame: """Get Yahoo Finance small cap stocks with earnings growth rates better than 25%. [Source: Yahoo Finance] diff --git a/gamestonk_terminal/stocks/discovery/yahoofinance_view.py b/gamestonk_terminal/stocks/discovery/yahoofinance_view.py index abb005d5eca..e950c5313d1 100644 --- a/gamestonk_terminal/stocks/discovery/yahoofinance_view.py +++ b/gamestonk_terminal/stocks/discovery/yahoofinance_view.py @@ -1,16 +1,20 @@ """ Yahoo Finance View """ __docformat__ = "numpy" -import os import logging +import os + from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.discovery import yahoofinance_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.discovery import yahoofinance_model + +logger = logging.getLogger(__name__) logger = logging.getLogger(__name__) +@log_start_end(log=logger) @log_start_end(log=logger) def display_gainers(num_stocks: int, export: str) -> None: """Display gainers. [Source: Yahoo Finance] @@ -46,6 +50,7 @@ def display_gainers(num_stocks: int, export: str) -> None: ) +@log_start_end(log=logger) @log_start_end(log=logger) def display_losers(num_stocks: int, export: str) -> None: """Display losers. [Source: Yahoo Finance] @@ -81,6 +86,7 @@ def display_losers(num_stocks: int, export: str) -> None: ) +@log_start_end(log=logger) @log_start_end(log=logger) def display_ugs(num_stocks: int, export: str) -> None: """Display most undervalued growth stock. [Source: Yahoo Finance] @@ -116,6 +122,7 @@ def display_ugs(num_stocks: int, export: str) -> None: ) +@log_start_end(log=logger) @log_start_end(log=logger) def display_gtech(num_stocks: int, export: str) -> None: """Display growth technology stocks. [Source: Yahoo Finance] @@ -151,6 +158,7 @@ def display_gtech(num_stocks: int, export: str) -> None: ) +@log_start_end(log=logger) @log_start_end(log=logger) def display_active(num_stocks: int, export: str) -> None: """Display most active stocks. [Source: Yahoo Finance] @@ -186,6 +194,7 @@ def display_active(num_stocks: int, export: str) -> None: ) +@log_start_end(log=logger) @log_start_end(log=logger) def display_ulc(num_stocks: int, export: str) -> None: """Display potentially undervalued large cap stocks. [Source: Yahoo Finance] @@ -221,6 +230,7 @@ def display_ulc(num_stocks: int, export: str) -> None: ) +@log_start_end(log=logger) @log_start_end(log=logger) def display_asc(num_stocks: int, export: str) -> None: """Display small cap stocks with earnings growth rates better than 25%. [Source: Yahoo Finance] diff --git a/gamestonk_terminal/stocks/due_diligence/ark_model.py b/gamestonk_terminal/stocks/due_diligence/ark_model.py index 394309c1412..590abee65a4 100644 --- a/gamestonk_terminal/stocks/due_diligence/ark_model.py +++ b/gamestonk_terminal/stocks/due_diligence/ark_model.py @@ -2,13 +2,20 @@ __docformat__ = "numpy" import json -import requests -from bs4 import BeautifulSoup +import logging + import pandas as pd +import requests import yfinance as yf +from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_ark_trades_by_ticker(ticker: str) -> pd.DataFrame: """Gets a dataframe of ARK trades for ticker diff --git a/gamestonk_terminal/stocks/due_diligence/ark_view.py b/gamestonk_terminal/stocks/due_diligence/ark_view.py index b5b2e1abeae..97542b4aae6 100644 --- a/gamestonk_terminal/stocks/due_diligence/ark_view.py +++ b/gamestonk_terminal/stocks/due_diligence/ark_view.py @@ -1,15 +1,20 @@ """ARK View""" __docformat__ = "numpy" +import logging import os import pandas as pd -from gamestonk_terminal.stocks.due_diligence import ark_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.due_diligence import ark_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_ark_trades( ticker: str, num: int = 20, export: str = "", show_ticker: bool = False ): diff --git a/gamestonk_terminal/stocks/due_diligence/business_insider_model.py b/gamestonk_terminal/stocks/due_diligence/business_insider_model.py index ef42a13d412..d1cda8112ef 100644 --- a/gamestonk_terminal/stocks/due_diligence/business_insider_model.py +++ b/gamestonk_terminal/stocks/due_diligence/business_insider_model.py @@ -2,16 +2,21 @@ __docformat__ = "numpy" import json +import logging import re from typing import Tuple -import requests + import pandas as pd +import requests from bs4 import BeautifulSoup -from gamestonk_terminal.helper_funcs import ( - get_user_agent, -) + +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import get_user_agent + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_price_target_from_analysts(ticker: str) -> pd.DataFrame: """Get analysts' price targets for a given stock. [Source: Business Insider] @@ -59,6 +64,7 @@ def get_price_target_from_analysts(ticker: str) -> pd.DataFrame: return df_analyst_data +@log_start_end(log=logger) def get_estimates(ticker: str) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: """Get analysts' estimates for a given ticker. [Source: Business Insider] diff --git a/gamestonk_terminal/stocks/due_diligence/business_insider_view.py b/gamestonk_terminal/stocks/due_diligence/business_insider_view.py index 88cffeb828f..fbff9c373e5 100644 --- a/gamestonk_terminal/stocks/due_diligence/business_insider_view.py +++ b/gamestonk_terminal/stocks/due_diligence/business_insider_view.py @@ -1,24 +1,30 @@ """ Business Insider View """ __docformat__ = "numpy" +import logging import os + +import matplotlib.pyplot as plt from pandas.core.frame import DataFrame from pandas.plotting import register_matplotlib_converters -import matplotlib.pyplot as plt -from gamestonk_terminal.stocks.due_diligence import business_insider_model +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, + plot_autoscale, print_rich_table, ) -from gamestonk_terminal.config_plot import PLOT_DPI -from gamestonk_terminal.helper_funcs import plot_autoscale -from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.due_diligence import business_insider_model + +logger = logging.getLogger(__name__) register_matplotlib_converters() +@log_start_end(log=logger) def price_target_from_analysts( ticker: str, start: str, @@ -101,6 +107,7 @@ def price_target_from_analysts( ) +@log_start_end(log=logger) def estimates(ticker: str, export: str): """Display analysts' estimates for a given ticker. [Source: Business Insider] diff --git a/gamestonk_terminal/stocks/due_diligence/csimarket_model.py b/gamestonk_terminal/stocks/due_diligence/csimarket_model.py index 1633622debb..2dcc289ed85 100644 --- a/gamestonk_terminal/stocks/due_diligence/csimarket_model.py +++ b/gamestonk_terminal/stocks/due_diligence/csimarket_model.py @@ -1,10 +1,17 @@ """CSIMarket Model""" __docformat__ = "numpy" -from bs4 import BeautifulSoup +import logging + import requests +from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_suppliers(ticker: str) -> str: """Get suppliers from ticker provided. [Source: CSIMarket] @@ -36,6 +43,7 @@ def get_suppliers(ticker: str) -> str: return "No suppliers found.\n" +@log_start_end(log=logger) def get_customers(ticker: str) -> str: """Print customers from ticker provided diff --git a/gamestonk_terminal/stocks/due_diligence/csimarket_view.py b/gamestonk_terminal/stocks/due_diligence/csimarket_view.py index 3075eb7fdb0..5f6520abcff 100644 --- a/gamestonk_terminal/stocks/due_diligence/csimarket_view.py +++ b/gamestonk_terminal/stocks/due_diligence/csimarket_view.py @@ -1,15 +1,20 @@ """CSIMarket View""" __docformat__ = "numpy" +import logging import os + import pandas as pd -from gamestonk_terminal.stocks.due_diligence import csimarket_model -from gamestonk_terminal.helper_funcs import ( - export_data, -) + +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.due_diligence import csimarket_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def suppliers(ticker: str, export: str): """Display suppliers from ticker provided. [Source: CSIMarket] @@ -31,6 +36,7 @@ def suppliers(ticker: str, export: str): ) +@log_start_end(log=logger) def customers(ticker: str, export: str): """Display customers from ticker provided. [Source: CSIMarket] diff --git a/gamestonk_terminal/stocks/due_diligence/finnhub_model.py b/gamestonk_terminal/stocks/due_diligence/finnhub_model.py index 22fffa1a2fe..ac953bdc847 100644 --- a/gamestonk_terminal/stocks/due_diligence/finnhub_model.py +++ b/gamestonk_terminal/stocks/due_diligence/finnhub_model.py @@ -1,11 +1,18 @@ """ Finnhub Model """ __docformat__ = "numpy" -import requests +import logging + import pandas as pd +import requests + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_rating_over_time(ticker: str) -> pd.DataFrame: """Get rating over time data. [Source: Finnhub] diff --git a/gamestonk_terminal/stocks/due_diligence/finnhub_view.py b/gamestonk_terminal/stocks/due_diligence/finnhub_view.py index 7ead591ebb0..ed02526138e 100644 --- a/gamestonk_terminal/stocks/due_diligence/finnhub_view.py +++ b/gamestonk_terminal/stocks/due_diligence/finnhub_view.py @@ -1,23 +1,30 @@ """ Finnhub View """ __docformat__ = "numpy" +import logging import os + import pandas as pd from matplotlib import pyplot as plt from pandas.plotting import register_matplotlib_converters -from gamestonk_terminal.stocks.due_diligence import finnhub_model + +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( - plot_autoscale, export_data, + plot_autoscale, print_rich_table, ) -from gamestonk_terminal.config_plot import PLOT_DPI -from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.due_diligence import finnhub_model + +logger = logging.getLogger(__name__) register_matplotlib_converters() +@log_start_end(log=logger) def plot_rating_over_time(df_rot: pd.DataFrame, ticker: str): """Plot rating over time @@ -53,6 +60,7 @@ def plot_rating_over_time(df_rot: pd.DataFrame, ticker: str): plt.show() +@log_start_end(log=logger) def rating_over_time(ticker: str, num: int, raw: bool, export: str): """Rating over time (monthly). [Source: Finnhub] diff --git a/gamestonk_terminal/stocks/due_diligence/finviz_model.py b/gamestonk_terminal/stocks/due_diligence/finviz_model.py index 14584cc18d6..c7a376633d8 100644 --- a/gamestonk_terminal/stocks/due_diligence/finviz_model.py +++ b/gamestonk_terminal/stocks/due_diligence/finviz_model.py @@ -1,12 +1,19 @@ """ Finviz Model """ __docformat__ = "numpy" -from typing import List, Any +import logging +from typing import Any, List + import finviz import pandas as pd from pandas.core.frame import DataFrame +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_news(ticker: str) -> List[Any]: """Get news from Finviz @@ -23,6 +30,7 @@ def get_news(ticker: str) -> List[Any]: return finviz.get_news(ticker) +@log_start_end(log=logger) def get_analyst_data(ticker: str) -> DataFrame: """Get analyst data. [Source: Finviz] diff --git a/gamestonk_terminal/stocks/due_diligence/finviz_view.py b/gamestonk_terminal/stocks/due_diligence/finviz_view.py index 7f679098ca0..bb8ea60adb7 100644 --- a/gamestonk_terminal/stocks/due_diligence/finviz_view.py +++ b/gamestonk_terminal/stocks/due_diligence/finviz_view.py @@ -1,14 +1,20 @@ """ Finviz View """ __docformat__ = "numpy" +import logging import os -from typing import List, Any -from gamestonk_terminal.stocks.due_diligence import finviz_model -from gamestonk_terminal.helper_funcs import export_data, print_rich_table +from typing import Any, List + from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.due_diligence import finviz_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def category_color_red_green(val: str) -> str: """Add color to analyst rating @@ -32,6 +38,7 @@ def category_color_red_green(val: str) -> str: return val +@log_start_end(log=logger) def news(ticker: str, num: int): """Display news for a given stock ticker @@ -55,6 +62,7 @@ def news(ticker: str, num: int): console.print("No news found for this ticker") +@log_start_end(log=logger) def analyst(ticker: str, export: str = ""): """Display analyst ratings. [Source: Finviz] diff --git a/gamestonk_terminal/stocks/due_diligence/fmp_model.py b/gamestonk_terminal/stocks/due_diligence/fmp_model.py index abbae39febc..b9786301ac9 100644 --- a/gamestonk_terminal/stocks/due_diligence/fmp_model.py +++ b/gamestonk_terminal/stocks/due_diligence/fmp_model.py @@ -1,11 +1,18 @@ """ Financial Modeling Prep Model """ __docformat__ = "numpy" -import pandas as pd +import logging + import FundamentalAnalysis as fa +import pandas as pd + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_rating(ticker: str) -> pd.DataFrame: """Get ratings for a given ticker. [Source: Financial Modeling Prep] diff --git a/gamestonk_terminal/stocks/due_diligence/fmp_view.py b/gamestonk_terminal/stocks/due_diligence/fmp_view.py index 34a69cdbf41..cf366e08471 100644 --- a/gamestonk_terminal/stocks/due_diligence/fmp_view.py +++ b/gamestonk_terminal/stocks/due_diligence/fmp_view.py @@ -1,12 +1,18 @@ """ Financial Modeling Prep View """ __docformat__ = "numpy" +import logging import os + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.due_diligence import fmp_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.due_diligence import fmp_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def rating(ticker: str, num: int, export: str): """Display ratings for a given ticker. [Source: Financial Modeling Prep] diff --git a/gamestonk_terminal/stocks/due_diligence/marketwatch_model.py b/gamestonk_terminal/stocks/due_diligence/marketwatch_model.py index 3dbfdf00315..b6da0c055fc 100644 --- a/gamestonk_terminal/stocks/due_diligence/marketwatch_model.py +++ b/gamestonk_terminal/stocks/due_diligence/marketwatch_model.py @@ -1,14 +1,22 @@ """ Market Watch Model """ __docformat__ = "numpy" -import requests +import logging + import pandas as pd +import requests from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent # pylint: disable=too-many-branches +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_sec_filings(ticker: str) -> pd.DataFrame: """Get SEC filings for a given stock ticker. [Source: Market Watch] diff --git a/gamestonk_terminal/stocks/due_diligence/marketwatch_view.py b/gamestonk_terminal/stocks/due_diligence/marketwatch_view.py index 808a79930d6..27704fc7f4b 100644 --- a/gamestonk_terminal/stocks/due_diligence/marketwatch_view.py +++ b/gamestonk_terminal/stocks/due_diligence/marketwatch_view.py @@ -1,13 +1,18 @@ """ Market Watch View """ __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.due_diligence import marketwatch_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.due_diligence import marketwatch_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def sec_filings(ticker: str, num: int, export: str): """Display SEC filings for a given stock ticker. [Source: Market Watch] diff --git a/gamestonk_terminal/stocks/fundamental_analysis/av_model.py b/gamestonk_terminal/stocks/fundamental_analysis/av_model.py index 7ea5584c9c0..a3d7c223e1c 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/av_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/av_model.py @@ -1,19 +1,24 @@ """Alpha Vantage Model""" __docformat__ = "numpy" -from typing import Dict, Tuple, List +import logging +from typing import Dict, List, Tuple -import requests - -from alpha_vantage.fundamentaldata import FundamentalData -import pandas as pd import numpy as np -from gamestonk_terminal.stocks.fundamental_analysis.fa_helper import clean_df_index -from gamestonk_terminal.helper_funcs import long_number_format +import pandas as pd +import requests +from alpha_vantage.fundamentaldata import FundamentalData + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import long_number_format from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.fundamental_analysis.fa_helper import clean_df_index + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_overview(ticker: str) -> pd.DataFrame: """Get alpha vantage company overview @@ -70,6 +75,7 @@ def get_overview(ticker: str) -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def get_key_metrics(ticker: str) -> pd.DataFrame: """Get key metrics from overview @@ -122,6 +128,7 @@ def get_key_metrics(ticker: str) -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def get_income_statements( ticker: str, number: int, quarterly: bool = False ) -> pd.DataFrame: @@ -163,6 +170,7 @@ def get_income_statements( return pd.DataFrame() +@log_start_end(log=logger) def get_balance_sheet( ticker: str, number: int, quarterly: bool = False ) -> pd.DataFrame: @@ -204,6 +212,7 @@ def get_balance_sheet( return pd.DataFrame() +@log_start_end(log=logger) def get_cash_flow(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: """Get cash flows for company @@ -243,6 +252,7 @@ def get_cash_flow(ticker: str, number: int, quarterly: bool = False) -> pd.DataF return pd.DataFrame() +@log_start_end(log=logger) def get_earnings(ticker: str, quarterly: bool = False) -> pd.DataFrame: """Get earnings calendar for ticker @@ -302,6 +312,7 @@ def get_earnings(ticker: str, quarterly: bool = False) -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def df_values(df: pd.DataFrame, item: str) -> List[int]: """Clean the values from the df @@ -322,6 +333,7 @@ def df_values(df: pd.DataFrame, item: str) -> List[int]: return values.tolist() +@log_start_end(log=logger) def get_fraud_ratios(ticker: str) -> Tuple[Dict[str, float], float, float]: """Get fraud ratios based on fundamentals diff --git a/gamestonk_terminal/stocks/fundamental_analysis/av_view.py b/gamestonk_terminal/stocks/fundamental_analysis/av_view.py index 356c97c047c..45b562881f5 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/av_view.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/av_view.py @@ -1,15 +1,20 @@ """ Alpha Vantage View """ __docformat__ = "numpy" +import logging import os import numpy as np +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.fundamental_analysis import av_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.fundamental_analysis import av_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_overview(ticker: str): """Alpha Vantage stock ticker overview @@ -31,6 +36,7 @@ def display_overview(ticker: str): console.print("") +@log_start_end(log=logger) def display_key(ticker: str): """Alpha Vantage key metrics @@ -49,6 +55,7 @@ def display_key(ticker: str): console.print("") +@log_start_end(log=logger) def display_income_statement( ticker: str, limit: int, quarterly: bool = False, export: str = "" ): @@ -78,6 +85,7 @@ def display_income_statement( export_data(export, os.path.dirname(os.path.abspath(__file__)), "income", df_income) +@log_start_end(log=logger) def display_balance_sheet( ticker: str, limit: int, quarterly: bool = False, export: str = "" ): @@ -109,6 +117,7 @@ def display_balance_sheet( ) +@log_start_end(log=logger) def display_cash_flow( ticker: str, limit: int, quarterly: bool = False, export: str = "" ): @@ -138,6 +147,7 @@ def display_cash_flow( export_data(export, os.path.dirname(os.path.abspath(__file__)), "cash", df_cash) +@log_start_end(log=logger) def display_earnings(ticker: str, limit: int, quarterly: bool = False): """Alpha Vantage earnings @@ -164,6 +174,7 @@ def display_earnings(ticker: str, limit: int, quarterly: bool = False): console.print("") +@log_start_end(log=logger) def display_fraud(ticker: str): """Fraud indicators for given ticker Parameters diff --git a/gamestonk_terminal/stocks/fundamental_analysis/business_insider_model.py b/gamestonk_terminal/stocks/fundamental_analysis/business_insider_model.py index 4b873be65ed..a525e8a388c 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/business_insider_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/business_insider_model.py @@ -1,14 +1,21 @@ """Business Insider Model""" __docformat__ = "numpy" +import logging + +import pandas as pd import requests from bs4 import BeautifulSoup -import pandas as pd from rapidfuzz import fuzz + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_management(ticker: str) -> pd.DataFrame: """Get company managers from Business Insider diff --git a/gamestonk_terminal/stocks/fundamental_analysis/business_insider_view.py b/gamestonk_terminal/stocks/fundamental_analysis/business_insider_view.py index 4eae04c508e..4c3e6365201 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/business_insider_view.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/business_insider_view.py @@ -1,14 +1,19 @@ """ Business Insider View """ __docformat__ = "numpy" +import logging import os import textwrap +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.fundamental_analysis import business_insider_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.fundamental_analysis import business_insider_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_management(ticker: str, export: str = ""): """Display company's managers diff --git a/gamestonk_terminal/stocks/fundamental_analysis/dcf_model.py b/gamestonk_terminal/stocks/fundamental_analysis/dcf_model.py index 75260e947a5..6f3a813f2de 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/dcf_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/dcf_model.py @@ -1,25 +1,30 @@ """ DCF Model """ __docformat__ = "numpy" -from urllib.request import urlopen -from typing import List, Union, Dict, Any, Tuple -from pathlib import Path -from zipfile import ZipFile -from io import BytesIO -import re +import logging import os +import re +from io import BytesIO +from pathlib import Path +from typing import Any, Dict, List, Tuple, Union +from urllib.request import urlopen +from zipfile import ZipFile -from sklearn.linear_model import LinearRegression -from openpyxl import worksheet -from bs4 import BeautifulSoup import financedatabase as fd -import yfinance as yf import pandas as pd import requests +import yfinance as yf +from bs4 import BeautifulSoup +from openpyxl import worksheet +from sklearn.linear_model import LinearRegression +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.stocks.fundamental_analysis import dcf_static +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def string_float(string: str) -> float: """Convert a string to a float @@ -38,6 +43,7 @@ def string_float(string: str) -> float: return float(string.strip().replace(",", "").replace("-", "")) +@log_start_end(log=logger) def insert_row( name: str, index: str, df: pd.DataFrame, row_v: List[str] ) -> pd.DataFrame: @@ -70,6 +76,7 @@ def insert_row( return df +@log_start_end(log=logger) def set_cell( ws: worksheet, cell: str, @@ -115,6 +122,7 @@ def set_cell( ws[cell].number_format = num_form +@log_start_end(log=logger) def get_fama_raw() -> pd.DataFrame: """Get Fama French data @@ -152,6 +160,7 @@ def get_fama_raw() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_historical_5(ticker: str) -> pd.DataFrame: """Get 5 year monthly historical performance for a ticker with dividends filtered @@ -173,6 +182,7 @@ def get_historical_5(ticker: str) -> pd.DataFrame: return df +@log_start_end(log=logger) def get_fama_coe(ticker: str) -> float: """Use Fama and French to get the cost of equity for a company @@ -206,6 +216,7 @@ def get_fama_coe(ticker: str) -> float: ) * 12 +@log_start_end(log=logger) def others_in_sector( ticker: str, sector: str, industry: str, no_filter: bool = False ) -> List[str]: @@ -244,6 +255,7 @@ def others_in_sector( return similars +@log_start_end(log=logger) def create_dataframe(ticker: str, statement: str): """ Creates a df financial statement for a given ticker @@ -338,6 +350,7 @@ def create_dataframe(ticker: str, statement: str): return df, rounding +@log_start_end(log=logger) def get_similar_dfs(ticker: str, info: Dict[str, Any], n: int, no_filter: bool = False): """ Get dataframes for similar companies @@ -372,6 +385,7 @@ def get_similar_dfs(ticker: str, info: Dict[str, Any], n: int, no_filter: bool = return new_list +@log_start_end(log=logger) def clean_dataframes(*args) -> List[pd.DataFrame]: """ All dataframes in the list take on the length of the shortest dataframe @@ -392,6 +406,7 @@ def clean_dataframes(*args) -> List[pd.DataFrame]: return dfs +@log_start_end(log=logger) def get_value(df: pd.DataFrame, row: str, column: int) -> Tuple[float, float]: """ Gets a specific value from the dataframe @@ -417,6 +432,7 @@ def get_value(df: pd.DataFrame, row: str, column: int) -> Tuple[float, float]: return fin_val1, fin_val2 +@log_start_end(log=logger) def frac(num: float, denom: float) -> Union[str, float]: """ Converts a numerator and a denominator in a fraction, checking for invalid denominators @@ -436,6 +452,7 @@ def frac(num: float, denom: float) -> Union[str, float]: return "N/A" if denom == 0 else num / denom +@log_start_end(log=logger) def generate_path(n: int, ticker: str, date: str) -> Path: """ Create the path to save an excel file to diff --git a/gamestonk_terminal/stocks/fundamental_analysis/dcf_view.py b/gamestonk_terminal/stocks/fundamental_analysis/dcf_view.py index 60f998de69d..95fd960fa46 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/dcf_view.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/dcf_view.py @@ -1,25 +1,31 @@ """ DCF View """ __docformat__ = "numpy" -from typing import List, Union, Dict, Any +import logging from datetime import datetime +from typing import Any, Dict, List, Union -from openpyxl.styles.numbers import FORMAT_PERCENTAGE_00 +import numpy as np +import pandas as pd +import yfinance as yf from openpyxl import Workbook from openpyxl.styles import Font +from openpyxl.styles.numbers import FORMAT_PERCENTAGE_00 from sklearn.linear_model import LinearRegression -import yfinance as yf -import pandas as pd -import numpy as np -from gamestonk_terminal.stocks.fundamental_analysis import dcf_model, dcf_static +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_rf from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.fundamental_analysis import dcf_model, dcf_static # pylint: disable=C0302 +logger = logging.getLogger(__name__) + + class CreateExcelFA: + @log_start_end(log=logger) def __init__( self, ticker: str, @@ -77,6 +83,7 @@ class CreateExcelFA: "r_ff": dcf_model.get_fama_coe(self.info["ticker"]), } + @log_start_end(log=logger) def create_workbook(self): self.ws[1].title = "Financials" self.ws[1].column_dimensions["A"].width = 25 @@ -110,6 +117,7 @@ class CreateExcelFA: break i += 1 + @log_start_end(log=logger) def get_data(self, statement: str, row: int, header: bool) -> pd.DataFrame: df, rounding = dcf_model.create_dataframe(self.info["ticker"], statement) if df.empty: @@ -166,6 +174,7 @@ class CreateExcelFA: return df + @log_start_end(log=logger) def add_estimates(self): last_year = self.df["BS"].columns[-1] # Replace with columns in DF col = self.info["len_data"] + 1 @@ -340,6 +349,7 @@ class CreateExcelFA: font=dcf_static.red, ) + @log_start_end(log=logger) def create_dcf(self): self.ws[2]["A5"] = "Net Income" self.ws[2]["A6"] = "Change in NWC" @@ -583,6 +593,7 @@ class CreateExcelFA: self.ws[2], "B18", float(self.data["info"]["regularMarketPrice"]) ) + @log_start_end(log=logger) def create_header(self, ws: Workbook): for i in range(10): dcf_model.set_cell( @@ -602,6 +613,7 @@ class CreateExcelFA: ws, "A2", f"DCF for {self.info['ticker']} generated on {self.data['now']}" ) + @log_start_end(log=logger) def run_audit(self): start = 67 for i, value in enumerate(dcf_static.sum_rows): @@ -750,6 +762,7 @@ class CreateExcelFA: True, ) + @log_start_end(log=logger) def get_linear(self, x_ind: str, y_ind: str, no_neg: bool = False): x_type = "IS" if x_ind in self.df["IS"].index else "BS" y_type = "IS" if y_ind in self.df["IS"].index else "BS" @@ -842,6 +855,7 @@ class CreateExcelFA: self.letter += 1 + @log_start_end(log=logger) def get_sum( self, row: Union[int, str], @@ -868,6 +882,7 @@ class CreateExcelFA: if text: self.custom_exp(row, text) + @log_start_end(log=logger) def title_to_row(self, title: str) -> int: df = ( self.df["IS"] @@ -889,6 +904,7 @@ class CreateExcelFA: ) return ind + @log_start_end(log=logger) def custom_exp( self, row: Union[int, str], text: str, ws: int = 1, column: str = None ): @@ -918,6 +934,7 @@ class CreateExcelFA: dcf_model.set_cell(self.ws[3], f"B{self.letter+4}", text) self.letter += 1 + @log_start_end(log=logger) def add_ratios(self): self.ws[4] = self.wb.create_sheet("Ratios") self.create_header(self.ws[4]) diff --git a/gamestonk_terminal/stocks/fundamental_analysis/eclect_us_model.py b/gamestonk_terminal/stocks/fundamental_analysis/eclect_us_model.py index e6a11eb69ea..aa9f68e49fc 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/eclect_us_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/eclect_us_model.py @@ -1,12 +1,20 @@ """Eclect.us model""" __docformat__ = "numpy" +import logging from collections import OrderedDict + import requests +from gamestonk_terminal.decorators import log_start_end + # pylint: disable=R1718 +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_filings_analysis(ticker: str) -> str: """Save time reading SEC filings with the help of machine learning. [Source: https://eclect.us] diff --git a/gamestonk_terminal/stocks/fundamental_analysis/eclect_us_view.py b/gamestonk_terminal/stocks/fundamental_analysis/eclect_us_view.py index 1a3e8130537..e0312636752 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/eclect_us_view.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/eclect_us_view.py @@ -1,10 +1,16 @@ """Eclect.us view""" __docformat__ = "numpy" -from gamestonk_terminal.stocks.fundamental_analysis import eclect_us_model +import logging + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.fundamental_analysis import eclect_us_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_analysis( ticker: str, ) -> None: diff --git a/gamestonk_terminal/stocks/fundamental_analysis/financial_modeling_prep/fmp_model.py b/gamestonk_terminal/stocks/fundamental_analysis/financial_modeling_prep/fmp_model.py index 864334ef351..01fba8b6d68 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/financial_modeling_prep/fmp_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/financial_modeling_prep/fmp_model.py @@ -1,16 +1,22 @@ """ Financial Modeling Prep Model""" __docformat__ = "numpy" +import logging from datetime import datetime import FundamentalAnalysis as fa # Financial Modeling Prep import numpy as np import pandas as pd import valinvest + from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import long_number_format from gamestonk_terminal.stocks.fundamental_analysis.fa_helper import clean_df_index +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_score(ticker: str) -> np.number: """Gets value score from fmp @@ -28,11 +34,13 @@ def get_score(ticker: str) -> np.number: return 100 * (valstock.fscore() / 9) +@log_start_end(log=logger) def get_profile(ticker: str) -> pd.DataFrame: """Get ticker profile from FMP""" return fa.profile(ticker, cfg.API_KEY_FINANCIALMODELINGPREP) +@log_start_end(log=logger) def get_quote(ticker) -> pd.DataFrame: """Gets ticker quote from FMP""" df_fa = fa.quote(ticker, cfg.API_KEY_FINANCIALMODELINGPREP) @@ -55,6 +63,7 @@ def get_quote(ticker) -> pd.DataFrame: return df_fa +@log_start_end(log=logger) def get_enterprise(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: """Financial Modeling Prep ticker enterprise @@ -84,6 +93,7 @@ def get_enterprise(ticker: str, number: int, quarterly: bool = False) -> pd.Data return df_fa +@log_start_end(log=logger) def get_dcf(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: """Get stocks dcf from FMP @@ -112,6 +122,7 @@ def get_dcf(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: return df_fa +@log_start_end(log=logger) def get_income(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: """Get income statements @@ -140,6 +151,7 @@ def get_income(ticker: str, number: int, quarterly: bool = False) -> pd.DataFram return df_fa +@log_start_end(log=logger) def get_balance(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: """Get balance sheets @@ -168,6 +180,7 @@ def get_balance(ticker: str, number: int, quarterly: bool = False) -> pd.DataFra return df_fa +@log_start_end(log=logger) def get_cash(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: """Get cash flow @@ -196,6 +209,7 @@ def get_cash(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: return df_fa +@log_start_end(log=logger) def get_key_metrics(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: """Get key metrics @@ -224,6 +238,7 @@ def get_key_metrics(ticker: str, number: int, quarterly: bool = False) -> pd.Dat return df_fa +@log_start_end(log=logger) def get_key_ratios(ticker: str, number: int, quarterly: bool = False) -> pd.DataFrame: """Get key ratios @@ -252,6 +267,7 @@ def get_key_ratios(ticker: str, number: int, quarterly: bool = False) -> pd.Data return df_fa +@log_start_end(log=logger) def get_financial_growth( ticker: str, number: int, quarterly: bool = False ) -> pd.DataFrame: @@ -282,6 +298,7 @@ def get_financial_growth( return df_fa +@log_start_end(log=logger) def clean_metrics_df(df_fa: pd.DataFrame, num: int, mask: bool = True) -> pd.DataFrame: """Clean metrics data frame diff --git a/gamestonk_terminal/stocks/fundamental_analysis/financial_modeling_prep/fmp_view.py b/gamestonk_terminal/stocks/fundamental_analysis/financial_modeling_prep/fmp_view.py index fb470ce39c4..25f9d4c8cd2 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/financial_modeling_prep/fmp_view.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/financial_modeling_prep/fmp_view.py @@ -1,17 +1,22 @@ """ Financial Modeling Prep View """ __docformat__ = "numpy" +import logging import os import pandas as pd +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table +from gamestonk_terminal.rich_config import console from gamestonk_terminal.stocks.fundamental_analysis.financial_modeling_prep import ( fmp_model, ) -from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def valinvest_score(ticker: str): """Value investing tool based on Warren Buffett, Joseph Piotroski and Benjamin Graham thoughts [Source: FMP] @@ -27,6 +32,7 @@ def valinvest_score(ticker: str): console.print("") +@log_start_end(log=logger) def display_profile(ticker: str): """Financial Modeling Prep ticker profile @@ -47,6 +53,7 @@ def display_profile(ticker: str): console.print("") +@log_start_end(log=logger) def display_quote(ticker: str): """Financial Modeling Prep ticker quote @@ -61,6 +68,7 @@ def display_quote(ticker: str): console.print("") +@log_start_end(log=logger) def display_enterprise( ticker: str, number: int, quarterly: bool = False, export: str = "" ): @@ -84,6 +92,7 @@ def display_enterprise( export_data(export, os.path.dirname(os.path.abspath(__file__)), "enterprise", df_fa) +@log_start_end(log=logger) def display_discounted_cash_flow( ticker: str, number: int, quarterly: bool = False, export: str = "" ): @@ -108,6 +117,7 @@ def display_discounted_cash_flow( export_data(export, os.path.dirname(os.path.abspath(__file__)), "dcf", dcf) +@log_start_end(log=logger) def display_income_statement( ticker: str, number: int, quarterly: bool = False, export: str = "" ): @@ -141,6 +151,7 @@ def display_income_statement( export_data(export, os.path.dirname(os.path.abspath(__file__)), "income", income) +@log_start_end(log=logger) def display_balance_sheet( ticker: str, number: int, quarterly: bool = False, export: str = "" ): @@ -174,6 +185,7 @@ def display_balance_sheet( export_data(export, os.path.dirname(os.path.abspath(__file__)), "balance", balance) +@log_start_end(log=logger) def display_cash_flow( ticker: str, number: int, quarterly: bool = False, export: str = "" ): @@ -207,6 +219,7 @@ def display_cash_flow( export_data(export, os.path.dirname(os.path.abspath(__file__)), "cash", cash) +@log_start_end(log=logger) def display_key_metrics( ticker: str, number: int, quarterly: bool = False, export: str = "" ): @@ -234,6 +247,7 @@ def display_key_metrics( ) +@log_start_end(log=logger) def display_financial_ratios( ticker: str, number: int, quarterly: bool = False, export: str = "" ): @@ -259,6 +273,7 @@ def display_financial_ratios( ) +@log_start_end(log=logger) def display_financial_statement_growth( ticker: str, number: int, quarterly: bool = False, export: str = "" ): diff --git a/gamestonk_terminal/stocks/fundamental_analysis/finviz_model.py b/gamestonk_terminal/stocks/fundamental_analysis/finviz_model.py index 564408a3b0f..7806f61b02c 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/finviz_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/finviz_model.py @@ -1,10 +1,17 @@ """Finviz Model""" __docformat__ = "numpy" +import logging + import finviz import pandas as pd +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_data(ticker: str) -> pd.DataFrame: """Get fundamental data from finviz diff --git a/gamestonk_terminal/stocks/fundamental_analysis/finviz_view.py b/gamestonk_terminal/stocks/fundamental_analysis/finviz_view.py index 69bfe1faa4f..fd2e5ce11c0 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/finviz_view.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/finviz_view.py @@ -1,13 +1,18 @@ """ FinViz View """ __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.fundamental_analysis import finviz_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.fundamental_analysis import finviz_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_screen_data(ticker: str, export: str = ""): """FinViz ticker screener diff --git a/gamestonk_terminal/stocks/fundamental_analysis/market_watch_model.py b/gamestonk_terminal/stocks/fundamental_analysis/market_watch_model.py index a6660f1a5b2..58af19b132f 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/market_watch_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/market_watch_model.py @@ -1,6 +1,7 @@ """ Fundamental Analysis Market Watch Model """ __docformat__ = "numpy" +import logging import re from typing import List, Tuple @@ -8,6 +9,8 @@ import numpy as np import pandas as pd import requests from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( clean_data_values_to_float, get_user_agent, @@ -15,7 +18,10 @@ from gamestonk_terminal.helper_funcs import ( ) from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def prepare_df_financials( ticker: str, statement: str, quarter: bool = False ) -> pd.DataFrame: @@ -121,6 +127,7 @@ def prepare_df_financials( return df_financials +@log_start_end(log=logger) def get_sean_seah_warnings( ticker: str, debug: bool = False ) -> Tuple[pd.DataFrame, List[str], List[str]]: diff --git a/gamestonk_terminal/stocks/fundamental_analysis/market_watch_view.py b/gamestonk_terminal/stocks/fundamental_analysis/market_watch_view.py index 272143844c7..c2ea985471c 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/market_watch_view.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/market_watch_view.py @@ -6,24 +6,29 @@ So this code is not being used for the time being, it may be at a later stage. __docformat__ = "numpy" import argparse +import logging from typing import List import pandas as pd from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( financials_colored_values, parse_known_args_and_warn, patch_pandas_text_adjustment, print_rich_table, ) -from gamestonk_terminal.stocks.fundamental_analysis import market_watch_model as mwm from gamestonk_terminal.rich_config import console - +from gamestonk_terminal.stocks.fundamental_analysis import market_watch_model as mwm # pylint: disable=too-many-branches +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def income(other_args: List[str], ticker: str): """Market Watch ticker income statement @@ -88,6 +93,7 @@ def income(other_args: List[str], ticker: str): console.print("") +@log_start_end(log=logger) def balance(other_args: List[str], ticker: str): """Market Watch ticker balance statement @@ -164,6 +170,7 @@ def balance(other_args: List[str], ticker: str): console.print("") +@log_start_end(log=logger) def cash(other_args: List[str], ticker: str): """Market Watch ticker cash flow statement @@ -236,6 +243,7 @@ def cash(other_args: List[str], ticker: str): console.print("") +@log_start_end(log=logger) def display_sean_seah_warnings(ticker: str, debug: bool = False): """Display Sean Seah warnings diff --git a/gamestonk_terminal/stocks/fundamental_analysis/yahoo_finance_model.py b/gamestonk_terminal/stocks/fundamental_analysis/yahoo_finance_model.py index 48733b8a403..30150d4cb5a 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/yahoo_finance_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/yahoo_finance_model.py @@ -1,16 +1,21 @@ """Yahoo Finance Model""" __docformat__ = "numpy" +import logging from datetime import datetime from typing import Tuple -import yfinance as yf + import pandas as pd -from gamestonk_terminal.helper_funcs import ( - long_number_format, -) +import yfinance as yf + +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import long_number_format from gamestonk_terminal.stocks.fundamental_analysis.fa_helper import clean_df_index +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_info(ticker: str) -> pd.DataFrame: """Gets ticker info @@ -54,6 +59,7 @@ def get_info(ticker: str) -> pd.DataFrame: return df_info +@log_start_end(log=logger) def get_shareholders(ticker: str) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: """Get shareholders from yahoo @@ -112,6 +118,7 @@ def get_shareholders(ticker: str) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFr return df_major_holders, df_institutional_shareholders, df_mutualfund_shareholders +@log_start_end(log=logger) def get_sustainability(ticker) -> pd.DataFrame: """Get sustainability metrics from yahoo @@ -152,6 +159,7 @@ def get_sustainability(ticker) -> pd.DataFrame: return df_sustainability +@log_start_end(log=logger) def get_calendar_earnings(ticker: str) -> pd.DataFrame: """Get calendar earnings for ticker @@ -182,6 +190,7 @@ def get_calendar_earnings(ticker: str) -> pd.DataFrame: return df_calendar +@log_start_end(log=logger) def get_website(ticker: str) -> str: """Gets website of company from yfinance""" stock = yf.Ticker(ticker) @@ -189,6 +198,7 @@ def get_website(ticker: str) -> str: return df_info[df_info["Metric"] == "website"]["Value"].values[0] +@log_start_end(log=logger) def get_hq(ticker: str) -> str: """Gets google map url for headquarter""" stock = yf.Ticker(ticker) @@ -205,6 +215,7 @@ def get_hq(ticker: str) -> str: return maps[:-1] +@log_start_end(log=logger) def get_dividends(ticker: str) -> pd.DataFrame: """Get historical dividend for ticker diff --git a/gamestonk_terminal/stocks/fundamental_analysis/yahoo_finance_view.py b/gamestonk_terminal/stocks/fundamental_analysis/yahoo_finance_view.py index 207407fbd5e..79acff49c51 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/yahoo_finance_view.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/yahoo_finance_view.py @@ -1,22 +1,28 @@ """ Yahoo Finance View """ __docformat__ = "numpy" +import logging import os import webbrowser + import matplotlib.pyplot as plt import pandas as pd -from gamestonk_terminal.stocks.fundamental_analysis import yahoo_finance_model from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.fundamental_analysis import yahoo_finance_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def open_headquarters_map(ticker: str): """Headquarters location of the company Parameters @@ -28,6 +34,7 @@ def open_headquarters_map(ticker: str): console.print("") +@log_start_end(log=logger) def open_web(ticker: str): """Website of the company Parameters @@ -39,6 +46,7 @@ def open_web(ticker: str): console.print("") +@log_start_end(log=logger) def display_info(ticker: str): """Yahoo Finance ticker info Parameters @@ -61,6 +69,7 @@ def display_info(ticker: str): console.print("") +@log_start_end(log=logger) def display_shareholders(ticker: str): """Yahoo Finance ticker shareholders Parameters @@ -85,6 +94,7 @@ def display_shareholders(ticker: str): console.print("") +@log_start_end(log=logger) def display_sustainability(ticker: str): """Yahoo Finance ticker sustainability Parameters @@ -110,6 +120,7 @@ def display_sustainability(ticker: str): console.print("") +@log_start_end(log=logger) def display_calendar_earnings(ticker: str): """Yahoo Finance ticker calendar earnings Parameters @@ -130,6 +141,7 @@ def display_calendar_earnings(ticker: str): console.print("") +@log_start_end(log=logger) def display_dividends( ticker: str, limit: int = 12, plot: bool = False, export: str = "" ): diff --git a/gamestonk_terminal/stocks/fundamental_analysis/yield_curve_model.py b/gamestonk_terminal/stocks/fundamental_analysis/yield_curve_model.py index f9cfb8e5676..aaf44d7e693 100644 --- a/gamestonk_terminal/stocks/fundamental_analysis/yield_curve_model.py +++ b/gamestonk_terminal/stocks/fundamental_analysis/yield_curve_model.py @@ -1,17 +1,21 @@ """ Fundamental Analysis Yield Curve Model """ __docformat__ = "numpy" +import logging from datetime import datetime -from bs4 import BeautifulSoup + import pandas as pd -from pandas.core.frame import DataFrame import requests +from bs4 import BeautifulSoup +from pandas.core.frame import DataFrame -from gamestonk_terminal.helper_funcs import ( - get_user_agent, -) +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import get_user_agent + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_yield_curve(start: datetime, end: datetime) -> DataFrame: """Returns a US Treasury Yield Curve from start date to end date @@ -45,6 +49,7 @@ def get_yield_curve(start: datetime, end: datetime) -> DataFrame: return df_yield_curve[start:end] # type: ignore +@log_start_end(log=logger) def get_yield_curve_year(year: str) -> DataFrame: """Returns a US Treasury Yield Curve for a given year diff --git a/gamestonk_terminal/stocks/government/quiverquant_model.py b/gamestonk_terminal/stocks/government/quiverquant_model.py index 8e1ce64f4ef..6f526105388 100644 --- a/gamestonk_terminal/stocks/government/quiverquant_model.py +++ b/gamestonk_terminal/stocks/government/quiverquant_model.py @@ -1,17 +1,24 @@ """Quiverquant Model""" __docformat__ = "numpy" -import requests -import pandas as pd -from sklearn.linear_model import LinearRegression -import numpy as np - # Provided by Quiverquant guys to GST users +import logging + +import numpy as np +import pandas as pd +import requests +from sklearn.linear_model import LinearRegression + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) + API_QUIVERQUANT_KEY = ( "5cd2a65e96d0486efbe926a7cdbc1e8d8ab6c7b3" # pragma: allowlist secret ) +@log_start_end(log=logger) def get_government_trading(gov_type: str, ticker: str = "") -> pd.DataFrame: """Returns the most recent transactions by members of government @@ -87,6 +94,7 @@ def get_government_trading(gov_type: str, ticker: str = "") -> pd.DataFrame: return pd.DataFrame() +@log_start_end(log=logger) def analyze_qtr_contracts(analysis: str, num: int = 5) -> pd.DataFrame: """Analyzes quarterly contracts by ticker diff --git a/gamestonk_terminal/stocks/government/quiverquant_view.py b/gamestonk_terminal/stocks/government/quiverquant_view.py index 144b8ff73a1..a77ec4ab709 100644 --- a/gamestonk_terminal/stocks/government/quiverquant_view.py +++ b/gamestonk_terminal/stocks/government/quiverquant_view.py @@ -1,27 +1,34 @@ """Quiverquant View""" __docformat__ = "numpy" +import logging import os import textwrap - from datetime import datetime, timedelta + +import matplotlib.dates as mdates import numpy as np import pandas as pd from matplotlib import pyplot as plt -import matplotlib.dates as mdates -from gamestonk_terminal.stocks.government import quiverquant_model + +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( - plot_autoscale, export_data, + plot_autoscale, print_rich_table, ) -from gamestonk_terminal.config_plot import PLOT_DPI -from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.government import quiverquant_model # pylint: disable=C0302 +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def display_last_government( gov_type: str, past_days: int = 5, representative: str = "", export: str = "" ): @@ -109,6 +116,7 @@ def display_last_government( ) +@log_start_end(log=logger) def display_government_buys( gov_type: str, past_transactions_months: int = 6, @@ -200,6 +208,7 @@ def display_government_buys( export_data(export, os.path.dirname(os.path.abspath(__file__)), "topbuys", df_gov) +@log_start_end(log=logger) def display_government_sells( gov_type: str, past_transactions_months: int = 6, @@ -302,6 +311,7 @@ def display_government_sells( export_data(export, os.path.dirname(os.path.abspath(__file__)), "topsells", df_gov) +@log_start_end(log=logger) def display_last_contracts( past_transaction_days: int = 2, num: int = 20, @@ -364,6 +374,7 @@ def display_last_contracts( export_data(export, os.path.dirname(os.path.abspath(__file__)), "lastcontracts", df) +@log_start_end(log=logger) def plot_government(government: pd.DataFrame, ticker: str, gov_type: str): """Helper for plotting government trading @@ -403,6 +414,7 @@ def plot_government(government: pd.DataFrame, ticker: str, gov_type: str): plt.show() +@log_start_end(log=logger) def display_government_trading( ticker: str, gov_type: str, @@ -481,6 +493,7 @@ def display_government_trading( console.print("") +@log_start_end(log=logger) def display_contracts( ticker: str, past_transaction_days: int, raw: bool, export: str = "" ): @@ -537,6 +550,7 @@ def display_contracts( console.print("") +@log_start_end(log=logger) def display_qtr_contracts(analysis: str, num: int, raw: bool = False, export: str = ""): """Quarterly contracts [Source: quiverquant.com] @@ -625,6 +639,7 @@ def display_qtr_contracts(analysis: str, num: int, raw: bool = False, export: st console.print("") +@log_start_end(log=logger) def display_hist_contracts(ticker: str, raw: bool = False, export: str = ""): """Show historical quarterly government contracts [Source: quiverquant.com] @@ -683,6 +698,7 @@ def display_hist_contracts(ticker: str, raw: bool = False, export: str = ""): console.print("") +@log_start_end(log=logger) def display_top_lobbying(num: int, raw: bool = False, export: str = ""): """Top lobbying tickers based on total spent @@ -731,6 +747,7 @@ def display_top_lobbying(num: int, raw: bool = False, export: str = ""): ) +@log_start_end(log=logger) def display_lobbying(ticker: str, num: int = 10): """Corporate lobbying details diff --git a/gamestonk_terminal/stocks/insider/businessinsider_model.py b/gamestonk_terminal/stocks/insider/businessinsider_model.py index 0ceb114448f..99c0c374991 100644 --- a/gamestonk_terminal/stocks/insider/businessinsider_model.py +++ b/gamestonk_terminal/stocks/insider/businessinsider_model.py @@ -1,12 +1,19 @@ """ Business Insider Model """ __docformat__ = "numpy" -import requests +import logging + import pandas as pd +import requests from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_insider_activity(ticker: str) -> pd.DataFrame: """Get insider activity. [Source: Business Insider] diff --git a/gamestonk_terminal/stocks/insider/businessinsider_view.py b/gamestonk_terminal/stocks/insider/businessinsider_view.py index 8669285cc69..c01548d1ddd 100644 --- a/gamestonk_terminal/stocks/insider/businessinsider_view.py +++ b/gamestonk_terminal/stocks/insider/businessinsider_view.py @@ -1,22 +1,29 @@ """ Business Insider View """ __docformat__ = "numpy" +import logging import os -import pandas as pd + import matplotlib.pyplot as plt +import pandas as pd from pandas.plotting import register_matplotlib_converters + +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, get_next_stock_market_days, print_rich_table, ) -from gamestonk_terminal import feature_flags as gtff -from gamestonk_terminal.stocks.insider import businessinsider_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.insider import businessinsider_model + +logger = logging.getLogger(__name__) register_matplotlib_converters() +@log_start_end(log=logger) def insider_activity( stock: pd.DataFrame, ticker: str, diff --git a/gamestonk_terminal/stocks/insider/finviz_model.py b/gamestonk_terminal/stocks/insider/finviz_model.py index 33b489f8bb5..3f8ce7eb7ed 100644 --- a/gamestonk_terminal/stocks/insider/finviz_model.py +++ b/gamestonk_terminal/stocks/insider/finviz_model.py @@ -1,10 +1,17 @@ """ Finviz Model """ __docformat__ = "numpy" +import logging from typing import Dict + import finviz +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_last_insider_activity(ticker: str) -> Dict: """Get last insider activity for a given stock ticker. [Source: Finviz] diff --git a/gamestonk_terminal/stocks/insider/finviz_view.py b/gamestonk_terminal/stocks/insider/finviz_view.py index 715c6788511..ce0c5df7b34 100644 --- a/gamestonk_terminal/stocks/insider/finviz_view.py +++ b/gamestonk_terminal/stocks/insider/finviz_view.py @@ -1,13 +1,20 @@ """ Finviz View """ __docformat__ = "numpy" +import logging import os + import pandas as pd -from gamestonk_terminal.stocks.insider import finviz_model + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.insider import finviz_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def last_insider_activity(ticker: str, num: int, export: str): """Display insider activity for a given stock ticker. [Source: Finviz] diff --git a/gamestonk_terminal/stocks/insider/openinsider_model.py b/gamestonk_terminal/stocks/insider/openinsider_model.py index 96ac96af2d4..81078533847 100644 --- a/gamestonk_terminal/stocks/insider/openinsider_model.py +++ b/gamestonk_terminal/stocks/insider/openinsider_model.py @@ -1,12 +1,18 @@ +import configparser +import logging +import os from datetime import datetime from typing import Dict, List -import os -import configparser + +import pandas as pd import requests from bs4 import BeautifulSoup -import pandas as pd + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + presets_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "presets/") @@ -526,6 +532,7 @@ d_SectorSubsectorIndustry = { } +@log_start_end(log=logger) def check_valid_range( category: str, field: str, val: str, min_range: int, max_range: int ) -> str: @@ -566,6 +573,7 @@ def check_valid_range( return error +@log_start_end(log=logger) def check_dates(d_date: Dict) -> str: """Check valid dates @@ -633,6 +641,7 @@ def check_dates(d_date: Dict) -> str: return error +@log_start_end(log=logger) def check_valid_multiple(category: str, field: str, val: str, multiple: int) -> str: """Check valid value being a multiple @@ -666,6 +675,7 @@ def check_valid_multiple(category: str, field: str, val: str, multiple: int) -> return error +@log_start_end(log=logger) def check_boolean_list(category: str, d_data: Dict, l_fields_to_check: List) -> str: """Check list of fields being bools @@ -692,6 +702,7 @@ def check_boolean_list(category: str, d_data: Dict, l_fields_to_check: List) -> return error +@log_start_end(log=logger) def check_in_list( category: str, field: str, val: int, l_possible_vals: List[str] ) -> str: @@ -725,6 +736,7 @@ def check_in_list( return error +@log_start_end(log=logger) def check_int_in_list( category: str, field: str, val: str, l_possible_vals: List[int] ) -> str: @@ -764,6 +776,7 @@ def check_int_in_list( return error +@log_start_end(log=logger) def check_open_insider_general(d_general) -> str: """Check valid open insider general @@ -796,6 +809,7 @@ def check_open_insider_general(d_general) -> str: return error +@log_start_end(log=logger) def check_open_insider_date(d_date: Dict) -> str: """Check valid open insider date @@ -821,6 +835,7 @@ def check_open_insider_date(d_date: Dict) -> str: return error +@log_start_end(log=logger) def check_open_insider_transaction_filing(d_transaction_filing: Dict) -> str: """Check valid open insider transaction filing @@ -876,6 +891,7 @@ def check_open_insider_transaction_filing(d_transaction_filing: Dict) -> str: return error +@log_start_end(log=logger) def check_open_insider_industry(d_industry: Dict) -> str: """Check valid open insider industry @@ -896,6 +912,7 @@ def check_open_insider_industry(d_industry: Dict) -> str: return "" +@log_start_end(log=logger) def check_open_insider_insider_title(d_insider_title: Dict) -> str: """Check valid open insider title @@ -928,6 +945,7 @@ def check_open_insider_insider_title(d_insider_title: Dict) -> str: return error +@log_start_end(log=logger) def check_open_insider_others(d_others: Dict) -> str: """Check valid open insider others @@ -957,6 +975,7 @@ def check_open_insider_others(d_others: Dict) -> str: return error +@log_start_end(log=logger) def check_open_insider_company_totals(d_company_totals: Dict) -> str: """Check valid open insider company totals @@ -1013,6 +1032,7 @@ def check_open_insider_company_totals(d_company_totals: Dict) -> str: return error +@log_start_end(log=logger) def check_open_insider_screener( d_general: Dict, d_date: Dict, @@ -1058,6 +1078,7 @@ def check_open_insider_screener( return error +@log_start_end(log=logger) def get_open_insider_link(preset_loaded: str) -> str: """Get open insider link @@ -1226,6 +1247,7 @@ def get_open_insider_link(preset_loaded: str) -> str: return link +@log_start_end(log=logger) def get_open_insider_data(url: str, has_company_name: bool) -> pd.DataFrame: """Get open insider link diff --git a/gamestonk_terminal/stocks/insider/openinsider_view.py b/gamestonk_terminal/stocks/insider/openinsider_view.py index 5e8d3620bf4..6cc9b3123f0 100644 --- a/gamestonk_terminal/stocks/insider/openinsider_view.py +++ b/gamestonk_terminal/stocks/insider/openinsider_view.py @@ -1,22 +1,28 @@ -import os -from typing import List -import textwrap import itertools -from bs4 import BeautifulSoup -import requests +import logging +import os +import textwrap +from typing import List + import numpy as np import pandas as pd +import requests +from bs4 import BeautifulSoup + +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( - patch_pandas_text_adjustment, export_data, + patch_pandas_text_adjustment, print_rich_table, ) -from gamestonk_terminal.stocks.insider.openinsider_model import ( - get_open_insider_link, - get_open_insider_data, -) -from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.insider.openinsider_model import ( + get_open_insider_data, + get_open_insider_link, +) + +logger = logging.getLogger(__name__) d_open_insider = { "lcb": "latest-cluster-buys", @@ -59,6 +65,7 @@ d_trade_types = { } +@log_start_end(log=logger) def red_highlight(values) -> List[str]: """Red highlight @@ -75,6 +82,7 @@ def red_highlight(values) -> List[str]: return [f"[red]{val}[/red]" for val in values] +@log_start_end(log=logger) def yellow_highlight(values) -> List[str]: """Yellow highlight @@ -91,6 +99,7 @@ def yellow_highlight(values) -> List[str]: return [f"[yellow]{val}[/yellow]" for val in values] +@log_start_end(log=logger) def magenta_highlight(values): """Magenta highlight @@ -107,6 +116,7 @@ def magenta_highlight(values): return [f"[magenta]{val}[/magenta]" for val in values] +@log_start_end(log=logger) def green_highlight(values): """Green highlight @@ -123,6 +133,7 @@ def green_highlight(values): return [f"[green]{val}[/green]" for val in values] +@log_start_end(log=logger) def print_insider_data(type_insider: str, limit: int = 10, export: str = ""): """Print insider data @@ -204,6 +215,7 @@ def print_insider_data(type_insider: str, limit: int = 10, export: str = ""): console.print("") +@log_start_end(log=logger) def print_insider_filter( preset_loaded: str, ticker: str, diff --git a/gamestonk_terminal/stocks/options/alphaquery_model.py b/gamestonk_terminal/stocks/options/alphaquery_model.py index 0401d232e60..478a74e6808 100644 --- a/gamestonk_terminal/stocks/options/alphaquery_model.py +++ b/gamestonk_terminal/stocks/options/alphaquery_model.py @@ -1,11 +1,18 @@ """AlphaQuery Model""" __docformat__ = "numpy" +import logging from datetime import datetime, timedelta -import requests + import pandas as pd +import requests + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_put_call_ratio( ticker: str, window: int = 30, diff --git a/gamestonk_terminal/stocks/options/alphaquery_view.py b/gamestonk_terminal/stocks/options/alphaquery_view.py index ec5fd5d69b4..be9842022a8 100644 --- a/gamestonk_terminal/stocks/options/alphaquery_view.py +++ b/gamestonk_terminal/stocks/options/alphaquery_view.py @@ -1,19 +1,24 @@ """AlphaQuery View""" __docforma__ = "numpy" -from datetime import datetime, timedelta +import logging import os +from datetime import datetime, timedelta -import matplotlib.pyplot as plt import matplotlib.dates as mdates +import matplotlib.pyplot as plt -from gamestonk_terminal.stocks.options import alphaquery_model -from gamestonk_terminal.helper_funcs import export_data, plot_autoscale -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options import alphaquery_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_put_call_ratio( ticker: str, window: int = 30, diff --git a/gamestonk_terminal/stocks/options/barchart_model.py b/gamestonk_terminal/stocks/options/barchart_model.py index 1b00dccc13f..9482afb952f 100644 --- a/gamestonk_terminal/stocks/options/barchart_model.py +++ b/gamestonk_terminal/stocks/options/barchart_model.py @@ -1,12 +1,19 @@ """Barchart Model""" __docformat__ = "numpy" +import logging + import pandas as pd import requests from bs4 import BeautifulSoup + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_options_info(ticker: str) -> pd.DataFrame: """Scrape barchart for options info diff --git a/gamestonk_terminal/stocks/options/barchart_view.py b/gamestonk_terminal/stocks/options/barchart_view.py index 6c4c63c70e5..ff2fc851dc6 100644 --- a/gamestonk_terminal/stocks/options/barchart_view.py +++ b/gamestonk_terminal/stocks/options/barchart_view.py @@ -1,13 +1,18 @@ """Helper functions for scraping options data""" __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.options import barchart_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options import barchart_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def print_options_data(ticker: str, export: str): """Scrapes Barchart.com for the options information diff --git a/gamestonk_terminal/stocks/options/calculator_model.py b/gamestonk_terminal/stocks/options/calculator_model.py index cd8bef473f0..9310446bdf3 100644 --- a/gamestonk_terminal/stocks/options/calculator_model.py +++ b/gamestonk_terminal/stocks/options/calculator_model.py @@ -1,11 +1,17 @@ """Calculator Model""" ___docformat__ = "numpy" +import logging from typing import Dict, Tuple import numpy as np +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def pnl_calculator( strike: float, premium: float, put: bool, sell: bool, **kwargs: Dict[str, int] ) -> Tuple[np.ndarray, np.ndarray, float]: diff --git a/gamestonk_terminal/stocks/options/calculator_view.py b/gamestonk_terminal/stocks/options/calculator_view.py index 1cfadbf730a..a7f1688b076 100644 --- a/gamestonk_terminal/stocks/options/calculator_view.py +++ b/gamestonk_terminal/stocks/options/calculator_view.py @@ -1,14 +1,19 @@ +import logging from typing import Dict from matplotlib import pyplot as plt from gamestonk_terminal import config_plot as cfp from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import plot_autoscale -from gamestonk_terminal.stocks.options import calculator_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options import calculator_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def view_calculator( strike: float, premium: float, put: bool, sell: bool, **kwargs: Dict[str, int] ): diff --git a/gamestonk_terminal/stocks/options/chartexchange_model.py b/gamestonk_terminal/stocks/options/chartexchange_model.py index c312f263f72..fa6145191bc 100644 --- a/gamestonk_terminal/stocks/options/chartexchange_model.py +++ b/gamestonk_terminal/stocks/options/chartexchange_model.py @@ -1,15 +1,21 @@ """Chartexchange model""" __docformat__ = "numpy" -import requests +import logging + import pandas as pd +import requests from bs4 import BeautifulSoup -from gamestonk_terminal.stocks.options.op_helpers import convert +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options.op_helpers import convert + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_option_history(ticker: str, date: str, call: bool, price: str) -> pd.DataFrame: """Historic prices for a specific option [chartexchange] diff --git a/gamestonk_terminal/stocks/options/chartexchange_view.py b/gamestonk_terminal/stocks/options/chartexchange_view.py index b10297347d5..280b9fe2be1 100644 --- a/gamestonk_terminal/stocks/options/chartexchange_view.py +++ b/gamestonk_terminal/stocks/options/chartexchange_view.py @@ -1,13 +1,18 @@ """Chartexchange view""" __docformat__ = "numpy" +import logging import os +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.options import chartexchange_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options import chartexchange_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_raw( ticker: str, date: str, call: bool, price: str, num: int = 20, export: str = "" ) -> None: diff --git a/gamestonk_terminal/stocks/options/fdscanner_model.py b/gamestonk_terminal/stocks/options/fdscanner_model.py index a201a704966..b04f20d390c 100644 --- a/gamestonk_terminal/stocks/options/fdscanner_model.py +++ b/gamestonk_terminal/stocks/options/fdscanner_model.py @@ -1,13 +1,20 @@ """FDScanner model""" __docformat__ = "numpy" +import logging + import numpy as np import pandas as pd import requests + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import get_user_agent from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def unusual_options(num: int): """Get unusual option activity from fdscanner.com diff --git a/gamestonk_terminal/stocks/options/fdscanner_view.py b/gamestonk_terminal/stocks/options/fdscanner_view.py index e1733fccb55..930bc673cb5 100644 --- a/gamestonk_terminal/stocks/options/fdscanner_view.py +++ b/gamestonk_terminal/stocks/options/fdscanner_view.py @@ -1,15 +1,20 @@ """Fdscanner view""" __docformat__ = "numpy" +import logging import os import pandas as pd +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table -from gamestonk_terminal.stocks.options import fdscanner_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options import fdscanner_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_options( num: int, sort_column: pd.Timestamp, diff --git a/gamestonk_terminal/stocks/options/syncretism_model.py b/gamestonk_terminal/stocks/options/syncretism_model.py index fb1801fdaf2..dc396d83e9e 100644 --- a/gamestonk_terminal/stocks/options/syncretism_model.py +++ b/gamestonk_terminal/stocks/options/syncretism_model.py @@ -2,15 +2,18 @@ __docformat__ = "numpy" import configparser +import logging from typing import Tuple import pandas as pd import requests import yfinance as yf -from gamestonk_terminal.stocks.options import yfinance_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options import yfinance_model +logger = logging.getLogger(__name__) accepted_orders = [ "e_desc", @@ -28,6 +31,7 @@ accepted_orders = [ ] +@log_start_end(log=logger) def get_historical_greeks( ticker: str, expiry: str, chain_id: str, strike: float, put: bool ) -> pd.DataFrame: @@ -107,6 +111,7 @@ def get_historical_greeks( return df +@log_start_end(log=logger) def get_screener_output(preset: str, presets_path: str) -> Tuple[pd.DataFrame, str]: """Screen options based on preset filters @@ -198,6 +203,7 @@ def get_screener_output(preset: str, presets_path: str) -> Tuple[pd.DataFrame, s # pylint: disable=eval-used +@log_start_end(log=logger) def check_presets(preset_dict: dict) -> str: """Checks option screener preset values diff --git a/gamestonk_terminal/stocks/options/syncretism_view.py b/gamestonk_terminal/stocks/options/syncretism_view.py index 9494da29da7..fad5da8fc09 100644 --- a/gamestonk_terminal/stocks/options/syncretism_view.py +++ b/gamestonk_terminal/stocks/options/syncretism_view.py @@ -2,6 +2,7 @@ __docformat__ = "numpy" import configparser +import logging import os from typing import List @@ -9,15 +10,19 @@ import matplotlib.pyplot as plt from gamestonk_terminal import config_plot as cfp from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, plot_autoscale, print_rich_table, ) -from gamestonk_terminal.stocks.options import syncretism_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options import syncretism_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def view_available_presets(preset: str, presets_path: str): """View available presets. @@ -50,6 +55,7 @@ def view_available_presets(preset: str, presets_path: str): console.print("") +@log_start_end(log=logger) def view_screener_output( preset: str, presets_path: str, n_show: int, export: str ) -> List: @@ -97,6 +103,7 @@ def view_screener_output( # pylint:disable=too-many-arguments +@log_start_end(log=logger) def view_historical_greeks( ticker: str, expiry: str, diff --git a/gamestonk_terminal/stocks/options/tradier_model.py b/gamestonk_terminal/stocks/options/tradier_model.py index 770d93bae5f..a587df7d274 100644 --- a/gamestonk_terminal/stocks/options/tradier_model.py +++ b/gamestonk_terminal/stocks/options/tradier_model.py @@ -1,14 +1,18 @@ """Tradier options model""" __docformat__ = "numpy" +import logging from typing import List, Optional import pandas as pd import requests from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + option_columns = [ "symbol", "bid", @@ -36,6 +40,7 @@ default_columns = [ ] +@log_start_end(log=logger) def get_historical_options( ticker: str, expiry: str, strike: float, put: bool, chain_id: Optional[str] ) -> pd.DataFrame: @@ -101,6 +106,7 @@ def get_historical_options( # pylint: disable=no-else-return +@log_start_end(log=logger) def option_expirations(ticker: str) -> List[str]: """Get available expiration dates for given ticker @@ -134,6 +140,7 @@ def option_expirations(ticker: str) -> List[str]: return [] +@log_start_end(log=logger) def get_option_chains(symbol: str, expiry: str) -> pd.DataFrame: """Display option chains [Source: Tradier]" @@ -169,6 +176,7 @@ def get_option_chains(symbol: str, expiry: str) -> pd.DataFrame: return chains +@log_start_end(log=logger) def process_chains(response: requests.models.Response) -> pd.DataFrame: """Function to take in the requests.get and return a DataFrame @@ -208,6 +216,7 @@ def process_chains(response: requests.models.Response) -> pd.DataFrame: return opt_chain +@log_start_end(log=logger) def last_price(ticker: str): """Makes api request for last price diff --git a/gamestonk_terminal/stocks/options/tradier_view.py b/gamestonk_terminal/stocks/options/tradier_view.py index 2ab8613a419..c908de1c4bc 100644 --- a/gamestonk_terminal/stocks/options/tradier_view.py +++ b/gamestonk_terminal/stocks/options/tradier_view.py @@ -2,6 +2,7 @@ __docformat__ = "numpy" import argparse +import logging import os from bisect import bisect_left from typing import List @@ -14,18 +15,22 @@ import seaborn as sns from gamestonk_terminal import config_plot as cfp from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( export_data, patch_pandas_text_adjustment, plot_autoscale, print_rich_table, ) -from gamestonk_terminal.stocks.options import op_helpers, tradier_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.options import op_helpers, tradier_model + +logger = logging.getLogger(__name__) column_map = {"mid_iv": "iv", "open_interest": "oi", "volume": "vol"} +@log_start_end(log=logger) def red_highlight(val) -> str: """Red highlight @@ -42,6 +47,7 @@ def red_highlight(val) -> str: return f"[red]{val}[/red]" +@log_start_end(log=logger) def green_highlight(val) -> str: """Green highlight @@ -58,6 +64,7 @@ def green_highlight(val) -> str: return f"[green]{val}[/green]" +@log_start_end(log=logger) def check_valid_option_chains_headers(headers: str) -> List[str]: """Check valid option chains headers @@ -80,6 +87,7 @@ def check_valid_option_chains_headers(headers: str) -> List[str]: return columns +@log_start_end(log=logger) def display_chains( ticker: str, expiry: str, @@ -176,6 +184,7 @@ def display_chains( ) +@log_start_end(log=logger) def plot_oi( ticker: str, expiry: str, @@ -280,6 +289,7 @@ def plot_oi( console.print("") +@log_start_end(log=logger) def plot_vol( ticker: str, expiry: str, @@ -376,6 +386,7 @@ def plot_vol( console.print("") +@log_start_end(log=logger) def plot_volume_open_interest( ticker: str, expiry: str, @@ -564,6 +575,7 @@ def plot_volume_open_interest( console.print("") +@log_start_end(log=logger) def display_historical( ticker: str, expiry: str, diff --git a/gamestonk_terminal/stocks/options/yfinance_model.py b/gamestonk_terminal/stocks/options/yfinance_model.py index 172d4fb5fe1..7c828793e55 100644 --- a/gamestonk_terminal/stocks/options/yfinance_model.py +++ b/gamestonk_terminal/stocks/options/yfinance_model.py @@ -1,13 +1,20 @@ """Yfinance options model""" __docformat__ = "numpy" -from typing import List, Dict, Tuple, Any +import logging from datetime import datetime -import yfinance as yf +from typing import Any, Dict, List, Tuple + import pandas as pd +import yfinance as yf + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def option_expirations(ticker: str): """Get available expiration dates for given ticker @@ -28,6 +35,7 @@ def option_expirations(ticker: str): return dates +@log_start_end(log=logger) def get_option_chain(ticker: str, expiration: str) -> pd.DataFrame: """Gets option chain from yf for given ticker and expiration @@ -48,6 +56,7 @@ def get_option_chain(ticker: str, expiration: str) -> pd.DataFrame: return chains +@log_start_end(log=logger) def get_dividend(ticker: str) -> pd.Series: """Gets option chain from yf for given ticker and expiration @@ -66,6 +75,7 @@ def get_dividend(ticker: str) -> pd.Series: return dividend +@log_start_end(log=logger) def get_x_values(current_price: float, options: List[Dict[str, int]]) -> List[float]: """Generates different price values that need to be tested""" x_list = list(range(101)) @@ -83,6 +93,7 @@ def get_x_values(current_price: float, options: List[Dict[str, int]]) -> List[fl return [(x / 100) * num_range + mini for x in x_list] +@log_start_end(log=logger) def get_y_values( base: float, price: float, @@ -102,6 +113,7 @@ def get_y_values( return (change * underlying) + option_change +@log_start_end(log=logger) def generate_data( current_price: float, options: List[Dict[str, int]], underlying: int ) -> Tuple[List[float], List[float], List[float]]: @@ -118,6 +130,7 @@ def generate_data( return x_vals, before, [] +@log_start_end(log=logger) def get_price(ticker: str) -> float: """Get current price for a given ticker @@ -137,6 +150,7 @@ def get_price(ticker: str) -> float: return last_quote +@log_start_end(log=logger) def get_info(ticker: str): """Get info for a given ticker @@ -154,6 +168,7 @@ def get_info(ticker: str): return tick.info +@log_start_end(log=logger) def get_closing(ticker: str) -> pd.Series: """Get closing prices for a given ticker @@ -171,11 +186,13 @@ def get_closing(ticker: str) -> pd.Series: return tick.history(period="1y")["Close"] +@log_start_end(log=logger) def get_dte(date: str) -> int: """Gets days to expiration from yfinance option date""" return (datetime.strptime(date, "%Y-%m-%d") - datetime.now()).days +@log_start_end(log=logger) def get_iv_surface(ticker: str) -> pd.DataFrame: """Gets IV surface for calls and puts for ticker diff --git a/gamestonk_terminal/stocks/options/yfinance_view.py b/gamestonk_terminal/stocks/options/yfinance_view.py index 5eb283c5f28..4951370655b 100644 --- a/gamestonk_terminal/stocks/options/yfinance_view.py +++ b/gamestonk_terminal/stocks/options/yfinance_view.py @@ -1,43 +1,49 @@ """Yfinance options view""" __docformat__ = "numpy" -import os +import logging import math +import os from bisect import bisect_left -from typing import List, Dict, Any -from datetime import datetime, date, timedelta +from datetime import date, datetime, timedelta +from typing import Any, Dict, List -import matplotlib.pyplot as plt import matplotlib.dates as mdates +import matplotlib.pyplot as plt import matplotlib.ticker as mtick -from scipy.stats import binom import numpy as np import pandas as pd import seaborn as sns import yfinance as yf from openpyxl import Workbook +from scipy.stats import binom import gamestonk_terminal.config_plot as cfp import gamestonk_terminal.feature_flags as gtff +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( - export_data, - plot_autoscale, excel_columns, - print_rich_table, + export_data, get_rf, + plot_autoscale, + print_rich_table, ) +from gamestonk_terminal.rich_config import console from gamestonk_terminal.stocks.options import op_helpers, yfinance_model +from gamestonk_terminal.stocks.options.op_helpers import Option from gamestonk_terminal.stocks.options.yfinance_model import ( generate_data, get_option_chain, get_price, ) -from gamestonk_terminal.rich_config import console -from gamestonk_terminal.stocks.options.op_helpers import Option # pylint: disable=C0302 +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def plot_oi( ticker: str, expiry: str, @@ -141,6 +147,7 @@ def plot_oi( console.print("") +@log_start_end(log=logger) def plot_vol( ticker: str, expiry: str, @@ -236,6 +243,7 @@ def plot_vol( console.print("") +@log_start_end(log=logger) def plot_volume_open_interest( ticker: str, expiry: str, @@ -422,6 +430,7 @@ def plot_volume_open_interest( console.print("") +@log_start_end(log=logger) def plot_plot( ticker: str, expiration: str, put: bool, x: str, y: str, custom: str, export: str ) -> None: @@ -495,6 +504,7 @@ def plot_plot( console.print("") +@log_start_end(log=logger) def plot_payoff( current_price: float, options: List[Dict[Any, Any]], @@ -522,6 +532,7 @@ def plot_payoff( console.print("") +@log_start_end(log=logger) def show_parity( ticker: str, exp: str, put: bool, ask: bool, mini: float, maxi: float, export: str ) -> None: @@ -625,6 +636,7 @@ def show_parity( console.print("") +@log_start_end(log=logger) def risk_neutral_vals( ticker: str, exp: str, @@ -691,6 +703,7 @@ def risk_neutral_vals( console.print("") +@log_start_end(log=logger) def plot_expected_prices( und_vals: List[List[float]], p: float, ticker: str, expiration: str ) -> None: @@ -721,6 +734,7 @@ def plot_expected_prices( plt.show() +@log_start_end(log=logger) def export_binomial_calcs( up: float, prob_up: float, @@ -787,6 +801,7 @@ def export_binomial_calcs( ) +@log_start_end(log=logger) def show_binom( ticker: str, expiration: str, @@ -895,6 +910,7 @@ def show_binom( ) +@log_start_end(log=logger) def display_vol_surface(ticker: str, export: str = "", z: str = "IV"): """Display vol surface @@ -942,6 +958,7 @@ def display_vol_surface(ticker: str, export: str = "", z: str = "IV"): console.print("") +@log_start_end(log=logger) def show_greeks( ticker: str, div_cont: float, diff --git a/gamestonk_terminal/stocks/quantitative_analysis/factors_model.py b/gamestonk_terminal/stocks/quantitative_analysis/factors_model.py index 8f8b014f7d0..e511bb29aa7 100644 --- a/gamestonk_terminal/stocks/quantitative_analysis/factors_model.py +++ b/gamestonk_terminal/stocks/quantitative_analysis/factors_model.py @@ -1,16 +1,22 @@ """Factors model""" __docformat__ = "numpy" -from urllib.request import urlopen -from zipfile import ZipFile +import logging from io import BytesIO from typing import Tuple +from urllib.request import urlopen +from zipfile import ZipFile +import pandas as pd import statsmodels.api as sm import yfinance as yf -import pandas as pd + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_fama_raw() -> pd.DataFrame: """Gets base Fama French data to calculate risk @@ -48,6 +54,7 @@ def get_fama_raw() -> pd.DataFrame: return df +@log_start_end(log=logger) def get_historical_5(ticker: str): """Get 5 year monthly historical performance for a ticker with dividends filtered @@ -69,6 +76,7 @@ def get_historical_5(ticker: str): return df +@log_start_end(log=logger) def capm_information(ticker) -> Tuple[float, float]: """Provides information that relates to the CAPM model diff --git a/gamestonk_terminal/stocks/quantitative_analysis/factors_view.py b/gamestonk_terminal/stocks/quantitative_analysis/factors_view.py index ebee7aebf52..7cc1a6478b7 100644 --- a/gamestonk_terminal/stocks/quantitative_analysis/factors_view.py +++ b/gamestonk_terminal/stocks/quantitative_analysis/factors_view.py @@ -1,12 +1,18 @@ """Factors view""" __docformat__ = "numpy" +import logging + +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.rich_config import console from gamestonk_terminal.stocks.quantitative_analysis.factors_model import ( capm_information, ) -from gamestonk_terminal.rich_config import console + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def capm_view(ticker: str) -> None: """Displays information for the CAPM model. diff --git a/gamestonk_terminal/stocks/screener/finviz_model.py b/gamestonk_terminal/stocks/screener/finviz_model.py index 6a40458d0a5..54247dbf175 100644 --- a/gamestonk_terminal/stocks/screener/finviz_model.py +++ b/gamestonk_terminal/stocks/screener/finviz_model.py @@ -1,16 +1,22 @@ -import os import configparser +import logging +import os + import pandas as pd from finvizfinance.screener import ( - technical, - overview, - valuation, financial, + overview, ownership, performance, + technical, + valuation, ) + +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + presets_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "presets/") # pylint: disable=C0302 @@ -52,6 +58,7 @@ d_signals = { } +@log_start_end(log=logger) def get_screener_data(preset_loaded: str, data_type: str, limit: int, ascend: bool): """Screener Overview diff --git a/gamestonk_terminal/stocks/screener/finviz_view.py b/gamestonk_terminal/stocks/screener/finviz_view.py index b5b17d163ad..653accaaa04 100644 --- a/gamestonk_terminal/stocks/screener/finviz_view.py +++ b/gamestonk_terminal/stocks/screener/finviz_view.py @@ -1,19 +1,19 @@ """ Finviz View """ __docformat__ = "numpy" -from typing import List -import os import difflib -import pandas as pd -from gamestonk_terminal.helper_funcs import ( - export_data, - print_rich_table, -) -from gamestonk_terminal.stocks.screener.finviz_model import ( - get_screener_data, -) -from gamestonk_terminal.rich_config import console +import logging +import os +from typing import List +import pandas as pd + +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, print_rich_table +from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.screener.finviz_model import get_screener_data + +logger = logging.getLogger(__name__) d_cols_to_sort = { "overview": [ @@ -118,6 +118,7 @@ d_cols_to_sort = { } +@log_start_end(log=logger) def screener( loaded_preset: str, data_type: str, diff --git a/gamestonk_terminal/stocks/screener/yahoofinance_view.py b/gamestonk_terminal/stocks/screener/yahoofinance_view.py index 15a7d3de096..0d691e47ead 100644 --- a/gamestonk_terminal/stocks/screener/yahoofinance_view.py +++ b/gamestonk_terminal/stocks/screener/yahoofinance_view.py @@ -2,25 +2,27 @@ __docformat__ = "numpy" import configparser import datetime +import logging import os import random from typing import List + +import matplotlib.pyplot as plt import numpy as np import pandas as pd - -from pandas.plotting import register_matplotlib_converters -from sklearn.preprocessing import MinMaxScaler -import matplotlib.pyplot as plt import yfinance as yf from finvizfinance.screener import ticker +from pandas.plotting import register_matplotlib_converters +from sklearn.preprocessing import MinMaxScaler + from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI -from gamestonk_terminal.helper_funcs import ( - export_data, - plot_autoscale, -) -from gamestonk_terminal.stocks.screener import finviz_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.screener import finviz_model + +logger = logging.getLogger(__name__) register_matplotlib_converters() @@ -35,6 +37,7 @@ d_candle_types = { } +@log_start_end(log=logger) def historical( preset_loaded: str, limit: int = 10, diff --git a/gamestonk_terminal/stocks/sector_industry_analysis/financedatabase_model.py b/gamestonk_terminal/stocks/sector_industry_analysis/financedatabase_model.py index cb54a4d60e6..6c024cc05b8 100644 --- a/gamestonk_terminal/stocks/sector_industry_analysis/financedatabase_model.py +++ b/gamestonk_terminal/stocks/sector_industry_analysis/financedatabase_model.py @@ -2,11 +2,18 @@ __docformat__ = "numpy" # pylint:disable=too-many-arguments,unexpected-keyword-arg -from tqdm import tqdm +import logging + import financedatabase as fd import yfinance as yf +from tqdm import tqdm + +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def get_countries(industry: str = "", sector: str = ""): """Get all countries in Yahoo Finance data based on sector or industry. [Source: Finance Database] @@ -30,6 +37,7 @@ def get_countries(industry: str = "", sector: str = ""): return fd.show_options("equities", "countries") +@log_start_end(log=logger) def get_sectors(industry: str = "", country: str = ""): """Get all sectors in Yahoo Finance data based on country or industry. [Source: Finance Database] @@ -54,6 +62,7 @@ def get_sectors(industry: str = "", country: str = ""): return fd.show_options("equities", "sectors") +@log_start_end(log=logger) def get_industries(country: str = "", sector: str = ""): """Get all industries in Yahoo Finance data based on country or sector. [Source: Finance Database] @@ -81,6 +90,7 @@ def get_industries(country: str = "", sector: str = ""): return fd.show_options("equities", "industries") +@log_start_end(log=logger) def get_marketcap(): """Get all market cap division in Yahoo Finance data. [Source: Finance Database] @@ -92,6 +102,7 @@ def get_marketcap(): return list(["Small Cap", "Mid Cap", "Large Cap"]) +@log_start_end(log=logger) def filter_stocks( country: str, sector: str, @@ -179,6 +190,7 @@ def filter_stocks( return list() +@log_start_end(log=logger) def get_stocks_data( country: str, sector: str, @@ -217,6 +229,7 @@ def get_stocks_data( return stocks_data +@log_start_end(log=logger) def get_companies_per_sector_in_country( country: str, mktcap: str = "", exclude_exchanges: bool = True ): @@ -256,6 +269,7 @@ def get_companies_per_sector_in_country( return companies_per_sector +@log_start_end(log=logger) def get_companies_per_industry_in_country( country: str, mktcap: str = "", exclude_exchanges: bool = True ): @@ -298,6 +312,7 @@ def get_companies_per_industry_in_country( return companies_per_industry +@log_start_end(log=logger) def get_companies_per_industry_in_sector( sector: str, mktcap: str = "", exclude_exchanges: bool = True ): @@ -339,6 +354,7 @@ def get_companies_per_industry_in_sector( return companies_per_industry +@log_start_end(log=logger) def get_companies_per_country_in_sector( sector: str, mktcap: str = "", exclude_exchanges: bool = True ): @@ -380,6 +396,7 @@ def get_companies_per_country_in_sector( return companies_per_country +@log_start_end(log=logger) def get_companies_per_country_in_industry( industry: str, mktcap: str = "", exclude_exchanges: bool = True ): diff --git a/gamestonk_terminal/stocks/sector_industry_analysis/financedatabase_view.py b/gamestonk_terminal/stocks/sector_industry_analysis/financedatabase_view.py index 0db5d425b20..8fe781f4b40 100644 --- a/gamestonk_terminal/stocks/sector_industry_analysis/financedatabase_view.py +++ b/gamestonk_terminal/stocks/sector_industry_analysis/financedatabase_view.py @@ -2,24 +2,30 @@ __docformat__ = "numpy" # pylint:disable=too-many-arguments,too-many-lines +import logging import os from collections import OrderedDict from typing import Dict + import numpy as np import pandas as pd from matplotlib import pyplot as plt from gamestonk_terminal import feature_flags as gtff from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import ( - plot_autoscale, export_data, + plot_autoscale, print_rich_table, ) -from gamestonk_terminal.stocks.sector_industry_analysis import financedatabase_model from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.sector_industry_analysis import financedatabase_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def display_bars_financials( finance_key: str, finance_metric: str, @@ -223,6 +229,7 @@ def display_bars_financials( return dict(), list() +@log_start_end(log=logger) def display_companies_per_sector_in_country( country: str, mktcap: str = "", @@ -368,6 +375,7 @@ def display_companies_per_sector_in_country( ) +@log_start_end(log=logger) def display_companies_per_industry_in_country( country: str, mktcap: str = "", @@ -522,6 +530,7 @@ def display_companies_per_industry_in_country( ) +@log_start_end(log=logger) def display_companies_per_industry_in_sector( sector: str, mktcap: str = "", @@ -679,6 +688,7 @@ def display_companies_per_industry_in_sector( ) +@log_start_end(log=logger) def display_companies_per_country_in_sector( sector: str, mktcap: str = "", @@ -829,6 +839,7 @@ def display_companies_per_country_in_sector( ) +@log_start_end(log=logger) def display_companies_per_country_in_industry( industry: str, mktcap: str = "", diff --git a/gamestonk_terminal/stocks/technical_analysis/finbrain_model.py b/gamestonk_terminal/stocks/technical_analysis/finbrain_model.py index c7a679f49ec..1e8a35ddfbe 100644 --- a/gamestonk_terminal/stocks/technical_analysis/finbrain_model.py +++ b/gamestonk_terminal/stocks/technical_analysis/finbrain_model.py @@ -1,11 +1,17 @@ """Finbrain model""" __docformat__ = "numpy" +import logging + import requests +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_technical_summary_report(ticker: str) -> str: """Get technical summary report provided by FinBrain's API diff --git a/gamestonk_terminal/stocks/technical_analysis/finbrain_view.py b/gamestonk_terminal/stocks/technical_analysis/finbrain_view.py index d598222113a..1705aaad11f 100644 --- a/gamestonk_terminal/stocks/technical_analysis/finbrain_view.py +++ b/gamestonk_terminal/stocks/technical_analysis/finbrain_view.py @@ -1,11 +1,16 @@ """Finbrain view""" __docformat__ = "numpy" +import logging + +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.rich_config import console from gamestonk_terminal.stocks.technical_analysis import finbrain_model -from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def technical_summary_report(ticker: str): """Print technical summary report provided by FinBrain's API diff --git a/gamestonk_terminal/stocks/technical_analysis/finnhub_model.py b/gamestonk_terminal/stocks/technical_analysis/finnhub_model.py index 269862246d6..148bcebca8a 100644 --- a/gamestonk_terminal/stocks/technical_analysis/finnhub_model.py +++ b/gamestonk_terminal/stocks/technical_analysis/finnhub_model.py @@ -1,14 +1,19 @@ """Finnhub model""" __docformat__ = "numpy" -import requests +import logging + import pandas as pd +import requests from gamestonk_terminal import config_terminal as cfg - +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.rich_config import console +logger = logging.getLogger(__name__) + +@log_start_end(log=logger) def get_pattern_recognition(ticker: str, resolution: str) -> pd.DataFrame: """Get pattern recognition data diff --git a/gamestonk_terminal/stocks/technical_analysis/finnhub_view.py b/gamestonk_terminal/stocks/technical_analysis/finnhub_view.py index 4cd1760b675..1a4033521b8 100644 --- a/gamestonk_terminal/stocks/technical_analysis/finnhub_view.py +++ b/gamestonk_terminal/stocks/technical_analysis/finnhub_view.py @@ -1,18 +1,23 @@ """Finnhub view""" __docformat__ = "numpy" -import os - +import logging import math +import os from datetime import datetime -import yfinance as yf + import mplfinance as mpf +import yfinance as yf -from gamestonk_terminal.helper_funcs import plot_autoscale, export_data -from gamestonk_terminal.stocks.technical_analysis import finnhub_model +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import export_data, plot_autoscale from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.technical_analysis import finnhub_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def plot_pattern_recognition(ticker: str, resolution: str, export: str): """Plot pattern recognition signal diff --git a/gamestonk_terminal/stocks/technical_analysis/finviz_model.py b/gamestonk_terminal/stocks/technical_analysis/finviz_model.py index 9cd244e7505..33a0038f04f 100644 --- a/gamestonk_terminal/stocks/technical_analysis/finviz_model.py +++ b/gamestonk_terminal/stocks/technical_analysis/finviz_model.py @@ -1,11 +1,18 @@ """Finviz model""" __docformat__ = "numpy" +import logging + import requests from finvizfinance.quote import finvizfinance from finvizfinance.util import headers +from gamestonk_terminal.decorators import log_start_end +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) def get_finviz_image(ticker: str) -> bytes: """Get finviz image for given ticker diff --git a/gamestonk_terminal/stocks/technical_analysis/finviz_view.py b/gamestonk_terminal/stocks/technical_analysis/finviz_view.py index ba6fd9290b5..2915db1bb6f 100644 --- a/gamestonk_terminal/stocks/technical_analysis/finviz_view.py +++ b/gamestonk_terminal/stocks/technical_analysis/finviz_view.py @@ -3,19 +3,22 @@ __docformat__ = "numpy" import io -import matplotlib.pyplot as plt +import logging +import matplotlib.pyplot as plt from PIL import Image -from gamestonk_terminal.helper_funcs import ( - plot_autoscale, -) -from gamestonk_terminal.stocks.technical_analysis import finviz_model -from gamestonk_terminal.config_plot import PLOT_DPI from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal.decorators import log_start_end +from gamestonk_terminal.helper_funcs import plot_autoscale from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.technical_analysis import finviz_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def view(ticker: str): """View finviz image for ticker diff --git a/gamestonk_terminal/stocks/technical_analysis/tradingview_model.py b/gamestonk_terminal/stocks/technical_analysis/tradingview_model.py index 5752cee5858..ada0b1fa909 100644 --- a/gamestonk_terminal/stocks/technical_analysis/tradingview_model.py +++ b/gamestonk_terminal/stocks/technical_analysis/tradingview_model.py @@ -1,11 +1,16 @@ """Tradingview model""" __docformat__ = "numpy" +import logging + +import pandas as pd import requests from tradingview_ta import TA_Handler -import pandas as pd from gamestonk_terminal import config_terminal as cfg +from gamestonk_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) INTERVALS = { "1m": "1 min", @@ -21,6 +26,7 @@ INTERVALS = { SCREENERS = ["crypto", "forex", "cfd"] +@log_start_end(log=logger) def get_tradingview_recommendation( ticker: str, screener: str, exchange: str, interval: str ) -> pd.DataFrame: diff --git a/gamestonk_terminal/stocks/technical_analysis/tradingview_view.py b/gamestonk_terminal/stocks/technical_analysis/tradingview_view.py index 9eb119e3d69..04e2c5905f9 100644 --- a/gamestonk_terminal/stocks/technical_analysis/tradingview_view.py +++ b/gamestonk_terminal/stocks/technical_analysis/tradingview_view.py @@ -1,14 +1,18 @@ """Tradingview view""" __docformat__ = "numpy" +import logging import os -from gamestonk_terminal.rich_config import console - -from gamestonk_terminal.stocks.technical_analysis import tradingview_model +from gamestonk_terminal.decorators import log_start_end from gamestonk_terminal.helper_funcs import export_data, print_rich_table +from gamestonk_terminal.rich_config import console +from gamestonk_terminal.stocks.technical_analysis import tradingview_model + +logger = logging.getLogger(__name__) +@log_start_end(log=logger) def print_recommendation( ticker: str, screener: str, exchange: str, interval: str, export: str ): diff --git a/tests/gamestonk_terminal/cryptocurrency/cassettes/test_crypto_controller/test_call_load.yaml b/tests/gamestonk_terminal/cryptocurrency/cassettes/test_crypto_controller/test_call_load.yaml index 5d2c4bc2a6c..e5ae770df14 100644 --- a/tests/gamestonk_terminal/cryptocurrency/cassettes/test_crypto_controller/test_call_load.yaml +++ b/tests/gamestonk_terminal/cryptocurrency/cassettes/test_crypto_controller/test_call_load.yaml @@ -15,7 +15,7 @@ interactions: response: body: string: !!binary | - H4sIABhz9mEAA5S963LjuJIu+io8szvirIlYrF226+La/yTbVeVVvo3lunRPTEyQFCWxRRJqXmTJ + H4sIACgb+GEAA5S963LjuJIu+io8szvirIlYrF226+La/yTbVeVVvo3lunRPTEyQFCWxRRJqXmTJ O86b7X/7xQ4SICV8iaSsju7oNpPfl4BAXBJAIvGf//vfsum//a9/e3uSqKz8t3/+W70tYpVryYtK 9GMZFen+9f/3zx4evt+EuSrnYZTPVRWV07BRyxQU0JtFlM8cLW/e/wpuNCsYdazgybBEvQ0lGWbl NN1Iypth3YYZXBPzQAJ1ku51CynU08EUDPWqUz6cRJzZ35BE9cJPIE4WQwmMLTG40MTX1XuaX1M7 @@ -242,2551 +242,2554 @@ interactions: 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 headers: Access-Control-Allow-Headers: - Origin, X-Requested-With, Content-Type, Accept, Authorization @@ -2799,13 +2802,13 @@ interactions: Access-Control-Request-Method: - '*' Age: - - '21' + - '114' Alternate-Protocol: - 443:npn-spdy/2 CF-Cache-Status: - HIT CF-RAY: - - 6d5a4779ab4132aa-CDG + - 6d64a4247d6f0fae-VIE Cache-Control: - max-age=30, public, must-revalidate, s-maxage=300 Connection: @@ -2815,9 +2818,9 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Sun, 30 Jan 2022 11:14:53 GMT + - Mon, 31 Jan 2022 17:25:46 GMT ETag: - - W/"f7ec4fcbbe003f5443c9da7e3bd1cd7f" + - W/"389db0ea6a6e58463c1db4cae9395b9e" Expect-CT: - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" Server: @@ -2827,9 +2830,9 @@ interactions: Vary: - Accept-Encoding, Origin X-Request-Id: - - 239db41c-129a-48e1-a52e-cb9619211588 + - a50ba5a9-066c-4149-b5d9-492a957e7dc3 X-Runtime: - - '0.304668' + - '0.293723' status: code: 200 message: OK @@ -2845,248 +2848,576 @@ interactions: User-Agent: - python-requests/2.27.1 method: GET - uri: https://api.coingecko.com/api/v3/coins/bitcoin/?localization=false&tickers=false&sparkline=true + uri: https://api.coingecko.com/api/v3/coins/bitcoin/?localization=false&sparkline=true&tickers=false response: body: string: !!binary | - H4sIAC1z9mEAA6R9aW8bSZbtXyH0WUzHvvhhMJhuPOAN3gp0ferphkBJtMUxRWq42KVq1H9/59yI - G0lZljw9XeWudjIjI2O55+438m9Xm/urj1e3m9PdfrO7ur46Pj/e7rf86XSHy93qcY2LP4z7q+Nx - fbp52q5On/aHxxs+vTtvt9dX+tPx6uPfrvDI1e/XV7fb/d2Xm9PmcX2z2d08bnbn0xr3rbm+elgd - Hza7zzer7ef9YXN6eMQjf/of/7J0MeEtd6vTmr+z9b9d/fHw/HTa350Ph/Xu7vnqr3jZ+Xa7ubvZ - 7U+bu7WOYHV/vzlt9rvVtt/gw2h8vz7eHTZPvMWxrXfzhBab4+L0sF582hyOp8XxfIeHjp/O28Vm - d1ofduvT4nG/Wz8vblfH9f1iv1s8rdeH5Wm/5P8vTuu7h91+u//8/N8W3x7Wh/Xt82K3X9ytd6fD - aouHdl8W+8NidT49cI7PfNtm93W//YrO8HK+GS13x9UdB7dY7e4XT4f9/bld7j9JCx2qzn9a/Otp - 8W11XNwd1lim+wXeuuLD+93z4/7MV9xvvm7uz6vth8+H/flpcd7dc7Toi9t5vfjT6rTH6i/+z+rL - 6nF/2k+LX3DvuD8f7taLu/39mgNdfV1ttqvb7XrRFnuLtxz5ov3TeqeNMdp/X9+drvH78+3+/nlx - hwbb/f7LYnVabE4yo1s0Wx1OOp379df1dv/0iEXCGqEDLvn0l8Nfdvzfxb7cPax2n0Ei8tS31fPi - G8a4XvcdwVh4/bRefWnD39yvV7Isp31fxPVitXhcY3n56vWv0h9mj+VZYwr3GABvYORjx8ZOXeOl - mMHd/ryVCcgufVpjA+4X6y1mfNjvNnerLRYFg11hXNgd9P11fdh82siqceqbx8fzSa4wftk3LiyW - oL9w8xv6e0FSg+50txePqy9chMf97YZ7sXrmyi3Wq+OzvO4Zy/3tBRV9Wq+P11wCkOfpuHjGTnFx - dieZlwwL9LM/fOFuPgvdLjCTRo2A6uIb4HhJxzP9ynaCqn+4X4DZ5vMOE8IGPKy+rgEXLI+zi8fN - dsuB/eGXPy6w+QclXC4yyLVPkNSCPj6BjRDDmNhM8PqW83Hd8PqXszH+brV4OKw//dNfrh5Op6fj - xw8fvn37NrHh5/Xdlz3+9vhhvfvnV5zmnzqf+cuVdLPWS+nzw6r9uOiPLcZjbV2INMxh9fkldO/2 - O/CQRxl7W0WQljWLzvOmxf/e7NYHEuc9KHmFJccddj9PjVf/8qd//SMIf/OElbjf3Am8sZyyki8f - aDvJteBAFwc05d8Wx4f9aQHMEwXr00ruri/2a62IesXy8BKMEZtDZvv5sHp6mLfgeoyT79jsjk8b - QmGPjsDftqRZTB173h8A42bXD4Tp37FXH/jD8cN2A9LF33SD/pdev9ih6/9Cz8TYZc//T6//8Z4P - 2PQXXY8fvuub+3bkno5NIfu6eyHjuEOgIzLS/adPjfK4aZvdbv91dSkdTucDxrPEWJ62a9DA8ZG8 - FuQI6rw7UTb8/XNZc1vX50edyn/X65cI+fawwQ5vG4l+x9o5vE4dj6vfSHNdVPwjdLHeH8eQ/u+f - /vE9IxfXDn/h33+wU5jSrm8OFnlL3r8BQ/8vTOP2/NtvY2mXxxO44pKcb3m/eno6Lts7vmxOJ4Bn - uVuv75d2edtY5xJ/Libf9KH/2Zq+HPREtQs4/iJq2MP+cf0EVkUligPr4+ra3rQ/fIauxT9/7boa - ZCQUtSPwpo9wLuPWoU2kPf4BD44Wpzu59d1PmM9693Wz/qY3f/AHrwaJb+42UNugP54fb86H7Yu3 - t9dBW/jCEX+Yn8OQTtp6/nUFjJx3d2uS4eVd3DoBSOBVN9AH1+vdTVduZ+X30+pufQvQ3UDQHF7e - PeL2xUhuTtjv1f1NE6yfNuuDaqEn6Afgno831Dd26+2LJhzI8XwL3glVtQ3uBcW0G7Jahw9/mNf5 - sH7aH1v7v119Bjc4314uUfvlxebMk3q30dNR9n5zuj3ffVmfqDD/DgraPArV/O0KjzzeXgxS1P/j - d5Td0CTPHD/YD/KMvmN62n3+ZxtDNt7HXDn/R2gbf2eX8szbXW5XBw737+pSnnmrSywBdD/w0Ocb - CH9ooW3rPq93UHKON/crAuTKGVOXxi6N57S4y0JzX6F5YbOebp4gXKjmcmy5Tsa9bnW//7Z70c6Z - qZbrK3BxbMfN3erpBlrGF9hMHFGfzo9+Ot7tD3i8mCkGS5tHWLHQutyoZarG8wnopDsoc3oj2ynl - QKbxH+fN/cUNa8xkoxvGlqim6+NJ75sJazVGiiVZkWCaBIOFeBDL7G9XqzVMRBuMp9W3OoAv+VqT - cZjk6oxbMaSMl9zePaCZS1MuFVf3IEXvcq4x4+pBuvDVTw5TuH3EpS+2suHuts8NQ7klPpyJxvMO - 7NePdjI0JtE+lBwTWcYnPBtj5O/bJ/zdFJ9cwQjuds94Orha2O43LHDx1Tq8//4LLhye4Xzv9ye+ - xOJ3sGS8IjmLp8HYOUasfsl4fn0G2n1wGU98vsV7XAkVf3/4grG4mlPCJj2cP3HOrqSQMJ7N/YHL - UYPPgX1stke5bQMe3OwO7CSl7PG2f3/CWEMwTrbuy+EbrjAO4yyafvnG5bIRO5uxENsveDJnays3 - c8tl8QG3HF7x+IiZpVycqQFNH3/dkVJDYTePzwfOzhiu2+4z7thYvAFKcLn/wl5AAOhy9xu3sWA4 - oJUHzJVvymz2xFdjiKbR0Vb6SJXzOZCDca1rxkoeVwfZYe8CMcLOk0H/uPjMzm3mAp0ebrkgOUYL - 6gE45U7mMyeZs0ke6399dV5xM0x11uOx83Gml69r7n9xYarYgK873CkpOpuwI9dXv64+47kMwidW - f12dMUQ7ccF/5d647IjNX7ePaIVt9rw4YMIJy4TOnz9tSHIRY68Y02+cVKwxxSgsVjwf+Ie0RxHN - zlPk5C9umQLec9pDxtx8XW3P6xvK3vXwsjySI5z2N6evW3ABKIJ649P91x/+fthvhn+EJNoB6TjI - 0gGZqvWZ6yGArD6UGZB1ctwgAWSsDiwvdkA67JDtaEzVcFMFjdhGk1xHoy8mBjejEfzV2A7JgpVR - SCZXq+uQxPYm7KvtkARdVW6qQNJGEx1fJZgMIVgfOiZjJEV3TNaaOyYT9tqR8wkkY81ErkAyWsOt - FUhGnwv3QiBJcvCeAxBI1hKAJk+aE0jituXMBZLRuuKL75AEkkqxCsliva8mhQ5JB1bjOh6tLzVX - 8qkOyDJF0pwAEmwwZG+j7YgE96wu5A5JMIHMLRFI4uW5Ji6PQDJW2+4RkhXSTCHpA4RbrB2S1mKQ - gF7HJBFlUsdkqCY7Lqpg0sVSSeaCyViTD6ljsmKXfcekQ7NYfcdkAaPkVjRMVhscp90wCc4i6yOY - 7FQjmCyJiCqF/F5gCUbhfQBZmo5Lh2cn0qzg0ucpKy5DAQF3XGIuhTxRcGlBsaV0YLop5JC8AtOa - mI2rMzJjcT4NZEonikzeglrwu2DopjmSXkjtjqplCFNKlRsnwFoGN9mayAwEWkvwXVBdyR1eS7Bh - MvGOL3kcAkgRxutsrFw/vuxekLasdcI2VAXbMqTJUk52vC0hol2pqeNtGfxkchAsEXO8jtjf3HHH - 7k0brQCP16XUqNjjtRPeIODj5CBjyFUFf8vkJxAVsSAgXEIYYvltx+GyZigahm8XJMrjtVoVkOwd - e861EUTKZKPn6wSUHK3HnuWOSmmfgsjG7bHdD+A2Csw2m0giF2jyPmjDuQ5OXtviKbsFnWyP3rha - glBeg9kQ9QJR7FUlbjpGudYe00kdo7KYVcWmDA5oLx2msnQCaIEp6aBiJ0JH6tLXKafIzgStMpds - CbynL32takhFASs7iZ0tHbN83rqYY0dtI6QwhCnvU+7Wjl3e93xhx68MHjpA7giW/ig+O4hlbbww - KIEx70OfsakD+YIwBcxCmPgndSy3vcQIO5T5fAIp1A7mNt9SQgd0W75scgf10gNHDQiC62WCVPYl - KLSXvnC8JMXf2vw95u85/obuZUT/PgSF9xJCodgSh/TVBh3iTcHvqIae7+zS4o/5xQaoiOCfnP6f - rzrM321w/kkPwgjYwNGUcOUXG6Ehf4xugqSSBmQN7/bw8LNXPP6sAbnJFZVa3F3a+osxH+UPBLaR - BmKpag8GDcJHUz+GOEGxlAaECHuo0kP8xSb2EMGQfPrzVedA741BWNKLBhnKOUQLkCHrIDzqvTEI - 03r3FeRi7zUQvvZug33fC8zRLV3+xdqPwX0MGfCSQQrn6z1gQ8MvJkKlh6ICvBdpcGrbbSMXyplX - Sy3M8b0xCLd8r4Gwz3cbnL9f6sRBRjDIIispDPa9HoTj9gYyCzRADxZC2ThpsPtJD8KT32sgTPrd - Bt9+Mk1h4+826EQ7oIeN8G0WRWYhnP69aQrrf49oRRq8NwYRD+9RtQiM914hEuS9V4hIebfBzxZK - hM57DUQKtQYmLG0gLkj2MOeTZwMRS+/1IHLqvWmK4HqvB5Fk7zY4PF9g0wnZB7SBVulkN08/oygR - fpfTNACO4zRtFXSLNHyvBxGPvQc6jn6x7qMRivJZxiDy8r0eRIC+RzAiUd8j2l9/hm6RuZeDNPlj - BDQg1K3spgjh7xtguw30Q2FiIpXHUndxUKGcT8bKGH57RQ8ZlgeWYgpd4ojc7u+IlElNomCUpq1U - k+TfjSL4j9StSmxE934fIuy3Q84naBleVXcLfUQ8cSLAs5vosBFZDVUJmtnwUsGIw7RVZcc2VDWK - rYN6n7t0LRaNQpekNkD/SV1qGqhK0LLFkBUpmaBcWbWL/UTzQGSfhfJO+6dZxSaLM0xkWoByNNGW - FgEGnXmitSjCCho2lHjXJVM1UJSCquRAZ66ZTq1mG0Op6uIF+lNVy9hSV+xCI6TINRH5kGBoFdNl - QcIKiYFMvu9rhT6nbqqUsCO0CoSjw9SsahBHI6sqfNrB5k2dJTsDUs1FvItiD1so7qVzWxia4pFp - tjC20qqSHaARZ9qxwjJhoqeJdr/wxwJ9L3ZWCJPQTFFNYRraEzXPZgrj3daqe8qZNIkTitSK8U1G - NeqAFeImCVdC51xvYUAxUbeOndv46oQeuilci2y7sJEIcct1bZZwlt6EO+REdtI5gcfCel877NsT - AnDoC5HE2gxgvLKqAWzFsSMQrdWoigwa9TDlDG0EAV/Ca8TyFKDVCPXZK6iwyZhRVgTJTZdKw8s7 - 9i8WDORWfSTBCYwc7FdL8DhOvGEJlgZWxckLGqIiLXsTudTN8xsKNzaV6DuuYKdF8ayJsfvYfsns - xpAgBWKAW4K9aRVkaAwSKMm5OqBmTWD7jrMMCoTNR5+DoC0mAsnk5m/aCq0kS1stOwUejLwM68R4 - NYud8Yled9/hlwgMmKrFqGcKjQGHILhr7qkSQQjBDL+xJQWlpLZxwq4DA058OQLIhBWhL8EEtY9h - CWdYOYUu3ua1Sg6cAwy4doAW7w34TI52OJOx/7QcM3mNQDVbrCjUHc8Zd7haEq2zJA6BLBbFY3/S - bCs7RyJ1tiS1lkGj0PVr8F7tZRuxuBgivT2CYpinYIKlzp5m0IAhd7LsRvCcYaVWdsylaQ4uzMnE - yi0UWLsIUpx8kACCQBtLkLHeNnEbBeApJxAwwzmKcvBrVybn+JDgPFsHVggbMakNbX10hTCsUc1o - kDN+AcWwZ4E9qIsEgudixz7IA/CvYKN2doZJ5MQH5QJkRZAmoK6objFgFwIZ2xmUH9iK/eaoS/ad - K8TkYNiWFkVonmuuThQeLOzB+ZDA7JPNpbMIBinoNSoldU4BgQqpBGOYFCrsIllPgJMyOtPgdpbY - fOBkHBFYijDYbeceEbLfJdlLYR6lekswlTgcaBGMOHGbugMNJrrxtMgbD+m3Owv53r6GNQQRToXq - O2tI7eu3G3T72vqlyZDyr03Xbl/DtjVladzrBt2+Zg8VbV43eLj/SYPHnzXY3V7qIaKpQB2KEDwl - X9rXb8/ihX3t7KsGal+/2YPa12836Pb1m0ut9vXbPXT7+s0e1L5+s4dhXw+FzVI9DmWYz92+xjpQ - A3+9DsO+Rv8Jyueb9vWbY1D7+s0Gal+/3aDb12+ug9rXb/ag9vXbPex+0oPa1282UPv67QbffoJN - ta/fbqBE66nku9e4UPv6TeCoff3mINW+frPBsK9Nd0wBdx5/wJ2KubSv35yF2tdvvkLt67cb/Gyh - 1L5+swe1r99soPb1m69Q+/rtHj7/ZJpqX7/5CrWv327w7SevUPu6N0ivGxzv32+g9vWbFKX29ZuD - VPv6zUGqff12g5+hW+1rWwQXr32Aal+zgVu61z0M+9pwmuByzlCgeFgO7oV9/bZAeW1fe9il0FWg - /9qX9rWh5LRY7PKRjTx972/Y1y/6+P0yj2U2EmBDwh6oyVfqEyLhM3RqqEclMV7qu1SH2gmT3FUY - jNSSRJBDY4RmGkUjEsGdHAxn2r9QnGjFtdA01HVYHgZaihrjGU/mgncEBhRboBqaFuwHJ6Z8C1aX - BPvN0GTwGrMueLsxGkODympzTrnFDpqJnj0fSNHQamsR7BIiVEeDtqHZEmKyJxMxw+xaVkmPZ1f8 - 6D1041A01SRAHYfmB3vfM4QiQhFGvaMWm53G1zzWGD+iMScgco+BXHTmhh0RaiqlGrRKGvSGyg37 - TN6rlkQK6Dv7jBXyakwwcAiLglEeMalEZMF6siFzqUGaWBS1/h1saIfmBq/TXBUYRLQJxHQfKSuY - GGw47DUzRNQlUDL0+2hyithsvqvZGLaiMZTfVNTIsFB0i821ZJKc7wImhYy2MNXLCJ9jc7jRJBPP - IFKLokcDyjOYVHYSWqfo8MbTl2OxrEZj6h4QSXgaij8H0EUE9regTQ7Wk/hEKsAawA8pVydxxRZp - h8UbSoXC7z19IM3LAFMOloKBFsN9VWdDBXnAXk8u8HFh8hH2Fy0iF0PwmhnjYKZlmAGpWXfCyxNG - 43MuJYZqNCaPrXIJtJetpssIvWbvQHnirREmjXZCA5gdTYlTy04ATeSKBYP5pDk0zmA2MYNgYUzV - zn9fQqn5LBypvzD9RsP3wBHGVwNj8NWP7BoAmjlWprrZPgmwWYp4NiQDCqDxDlScaG8Kr/QxeiaL - AH2MUbbYPpbEgmxrCQzVtxA/+sWuGw3xg8twg0CeiZkQPdIPRBMzlcQ1IoKYCxALu8fNcf8XDSUx - 50dpeZ/O2+3zzf1mez6t7yVpZ6WlRo3foRdCA5RG2Au/KwA2rCGM3EfuXuN3oBtsAKhcLPbG7xKT - 00pLqBF+B4shF5jklA7qdfTGwZKtvkpwX/gdLGg+GsAFvfpHsBZgu5WwFX4XmPyWPagycgmF3znJ - QzKaNof3hJABuJCZbiEMDxRfK6xtbJK6SYBBYAUDjxgsjcDmKmGOhS8YWS6D4WXwdIOZJ7BsZXjY - XYCwYJ/EjBaGh10DKJ2TxKTG8ILB3mYAg0smDM8bUD+9CJ3hZVoGlRlnfKoxvMrMP9CruNGE4RFc - zHswkBGaXgCA2ITlooVvkrpQwOqAJryUPq0gu9AYHmAasw0YZFRXSjIYMUjeY26cmTA8MDagng4D - iCnTGR7eXMFdM6BazPCGYgstNh8DI2duDC85g8UGdwIRO/WsZAAk2Rrc8I/ir9hJLD8Ww9iRNpQA - XgPxErMk5zSGB5lquXcgbq8MD1jzhmAJTIPqDA9clT1iPsZolp/lfmQDZAaj3pbANCowiAjZQNJq - DC9g7MyvwWZYccyQ4XlwvFyNycyc7QwPzZIHYw6RrLUzPE95XjF4W+kyEYYHIsWMKnbJj0QG5tIk - A06WJTmicbwE6UQWgv+QZzUXDBpCuOO1RWbTWJ7DXoFAwbgcR95YHvEKuqPqQfoWlvcSTS1hCVsN - XYViXllegVDkPhduTzbqkvERS4kJ1myU5THZIUoCVmN5GeQFNglWrR4ZDzRjeJ5ajFOWB0aKBSjA - MVdfWJ6nBlDcyGoCvSVKD7ySAraxPII6lEhxk/LIPgRgMSoIKTu8NJcNAXI/5yLut+fH2WUDbu+Z - KpRLGfESiDjHjLM0UnuxeSA3MPyosRNIf/CWosobOADYODNhSlDdLTZqFid2C6N4Oj9BtkSKMDIf - qTBRJxM2RumGbUzi7BYmhhX3RsMpIAPsRi3iERMGZumVBgstXhU2uvVACMUAfML7yL5KImGBACVj - UVy9FeQD5guZHTrrgsLiqOcVSh1hXCBuetaixlzQBffIZGVaEZLSjCRhQIpZRxDOmgmFsRTuQ07K - sCSxlazFOeVXgQmEoGj812nusIVObVJiFmmWxCnhVZAMEF4lWkpY4VRk6mDr1AgYdRBGRZ5ADSDh - Wc1fZBom1ONMeht6GTMuoZoko1oZlU6f8Vpsi+YzWkYCfCWfFg7lKIMl8w1sy3f+5LD+UKWh5I7c - xkjFGgxPOLzwJmbPkmOAMdLn2kI7jnnPlPVJ4zv01HKLRYNtTmD0DR4bKCo7U6IQx5xipFLTWRJ2 - F7wVvUdlSFhsbiH03MTVFn4UscmZuGPurnAjywxBPAymr2EgC21K4Gg1r4qhBcgakBRVmcaI0Ij6 - boOnsCFgumLKWNesehfMIGcYBQmkCmFBL2AgHAgXEoOrmjIJSAKW4OyQsCKFhf0kIyssvl4yn0w3 - NNmdsJ6aReMLUXUt5ugZaoLCish2sJf0loMtqp4VyXJSZzng/QXSqEQ361gNgND9JF+vsZtMSZIl - P7sxm8tGnp7hh83nhxsXHi7KBpxoNMJhApVyUkorG4CsUyUJA2DmigaPPJiy3GtlA4DrJCZeKxvI - ktwsZQPi0x5lA+Deyj8uygagj2l0qKd1t7IBKAZQ6zRHGfaVRB5b2QC0FEK3lw3QVz7KBgZXAOlm - O5cNFObVz3UDmUvd6wbkcWED2FuJZfW6ASb0Gk2HxCKWHkPtdQPgeknrBsAas6+jbiBVidz0uoEK - S8vNdQM5FIkmtroB0FHiovc05TwJG2l1A7CbwFqCBmZhgQ01A9gR06LVDWALmpnd6wZonGvdAK3M - UTdQoEYkrRsoYgSNuoEq5oZAFJYPNDAFJ8Fr3agbiJIO3eoGaLaMugHYnCNHOfL5kaMM/S6LeSOB - GJpproy6ASGYXjdQ/OQ09oIbYBw22VE34OJUNT7LYKSmM1IyJq0bALKzCnSqd3GuGyA/dBqeBf/n - 2EfdAMhgzk720V/UDfCWNSz82397iR/Y9NSVetkNtBBapA0/UFzrRdmNsLFedgOuQ5nS8dPqgBQ/ - WUzVhp/U8h4afCBi/Gv4ZFnXBh9su9oLnpqmGCINPiwTMAof8kar8AEVhYuqmzmEKkU+o+rGGymv - afCBrTjgkyVLtZfdUDEa8DGwxAUuAh/WhNSLshvQotd8BtpfibcafDyZbFT4RFaF1Bk+nk44lY2Z - bMrO8LGTGLUNPglzEzy3shuYKDTQG3xgsdS57CbStHIKH/Ahbl2DD31AAz6gcdo9DT6JCnAZ8MFs - 0yi7gW0dw4APGL4q2QyC2gEf6Cx+wIc7MeBj2ns7fAJMZTvKbqAv1FF20+ilwQcELYU1DT5kX2BD - QeEDYTYFRY+ZyIwbepLUEvWqmyhep4YeaKAX6DFGwNSqbgomMtCD7YkchRbdMBDfMxt4B2sD7EjB - muY2CIhavVn47tac9tBagdjpUnu7VeZkJ5Y9uLcb2cA0acsMhlrfeaU30o4x8UgT6q12Sdp5N4k1 - /M4UjBFnzUQnoX1nfFRd7FTw1vjCDXK5YIVmfKTD9EdNXi8czbnXC8+jYsZZL7MmAKlk1X0CIBUt - V4KGNRXVBJZmog4Mdk7fyigkhAUeBj9r/TRuphWF4h6ZIN5FQnSOVplkPjJH5kLCOKU4eJqb6A0U - ptY9cV0hqK2IrGsEJkr+UeNpicJBdYJlSwMAB4S8DqoeLJ2foPWmwIwrcYm3IgqmmjlwCjqlKIgb - w2MyhlOOx/QINzQGXyWDSVWGWNS1QX+aCerBBWrj5LR2wsPCMcruouTRN2aXwWPKYHUsOlBGV8UL - 3Sol3ATxCvUGjFGIqrE7X0XwNV3BecwvDWUBjIFr2tgdK3+yMrtCbUS1fChZctHSuMys2UfjL1gd - egtuqApCB53TYZIUIY3VFSZBDF7nsa2zrgC1ZyIZN27ncRXLYHdQduUFnd9B3kxB1XQlqZ6uIQlb - jd9VqtllKAtTHJlcrjtzOrvDsiq/g4IwyRIKw4Nei83UnAzQAviOhfGQW2lF0xsgnCb6b7vlb5ia - NMoeLLMy6CEumbTlht3P7KvvmeAl/H+MSkOu6zSIM1+dL+8JMFmJVL06Med7Dy9aPr64IiiZUTri - M/Otl5Acvwsm5yuCcr4iLOcrwnJcCSznK4GlYeJP0YpCXkJP1oQtw9yWqF7H8aQAcFwJAuer8+XY - BILz1fZy+QSC40pAOK4EhvPVt8s3CBDnK60AM57+HcHguCkgnK+eLx8UEM5X+8vnBIXjSmA4X714 - vUBxXAkUx5WAcb5aX75BwDiuBI3z1eFyKU4vJi9YnK+Ol/cEi/PV7vKeoPHi6nx59WKTBJCgRxrI - HZBQjKnHjhTLWEWj/O3F/HoFEulJUrAaFNER44aj/qjffgeDb4pGPOmGH84w4TGrlYx7UVQzlY6w - 9ksaKKRxqzGEocc0p9u4aqIR5iqV95ZYCeKXOr7vYMjy3mQHCplZbAcKIbSMWsvsIPoREQBHEitS - UMh7haadotBXKbtXFEJ5y4pClk8aMZWbJ40pHUb9/uwojWxJXonTrglCvpJ70dxmOtcOQ7qRVPWH - ktLCAc1JxpZUu5p7jH3mIQ61l+a5H1cdhhlSogwYYuGjVg6yaeIrmizUBzsM6RkeKc0wvueKe+pP - xisMZzW0wTBHx73oMIS6kId/S1s2mShZemo946p6rm9zaKFl5FUTihA3ySgMRy+nF5PvMIRarSgc - t5rPalztLu81mThfnS+vGgo5hThQ6NtudhRC/Nswi0WoW8OObvMbMKRSJtH8LhCh+DpBcINhv/0O - CvP9D0FIBV/itS28x7M2ygChlTpZFYWRp2oYdYHT1yIl4gLCwpLZ4fkeVkMXhdWb4fRmZY14hr4H - ISCSpBK+ubqxGl6KagWHlYBhlXNzcENZtgOG5ByiUTUcGmYkcyituJ41MpKfTBxC6Q3ibVel1EZr - 1fzGk5F+147DOhUjTgjBIRPgfRo+LLxEBtfyladK//DQSGHVh6GSQh1rDsgGRMMME6cZBJy0l3JV - gWKZYMwnVU2Z9ysV+gLFyELXokjk6kt+QUMi6CpkOX7lWR5MWWIjAkWqXjUpFCtV3FFpb8mIJOQo - WMQbobaqHwu7mKtTfzNNvDpnHWNaLiWN8+ONDJkqGC1WJ2bVUNHUlKRCEWNl4ZqmGFPLF94ncIQG - aX1SDbVODNVr9H4QVYtijatd2x2GVmYd1UeJEjZAguE0R9uvbbcKbEsNV7E+2fqRPoztKKSALhfp - y7IjQoXB1QuxaK3UkGthLk3u6i7kotx/TzcNP4Zks6bpZW+1+JYn69SgduOSmdVZQUkXrJWTRFol - PnfUOrqhWiU++yq5qHi8sNRbKpGfePiKSsgla2ZgnsRX8FxK2rSU6LcafCuCfwSillgeCM6sEOWL - ImNtWoPPzRzCElewLKuC1PE4AAmYtmIf6iNzjQGFeLaj/L6yWD+rtMQluKZRV5m8NkilTiu+r7DW - YlJvGW87cUK10nve9SPzh3OKSaLYrfKerAW0q3JT1qCIJdoq7y0N7WBUdnINIPPHaTVWctPjqLzn - 3ng3CoI4kyBe+lZ6z94wMxWhslUgwFF7LzUSXh1oNL9hbyp02bqWWZ/lNUsvVJSCahI9hVp4DwMv - llK07p7v8t5pjg46T8F7PTJjKRCSqFIru2chWgzihz70zQ4xcCFb2b1lIZREMlvZPTikLQPJF0TY - qu4vrnf9PqzOgeclub8bdQHs3RdnRtG91FKJ7tV8bSxdksKLnm8zURkYDjeeZ2W9mp3SWZbjbIag - tWEO/rgk9GUvBC1vvwNrb96CNZ1fAs2O60x54zXovGTZl5UTjBqyWd0VjR/IlnqSC2TzqANX80D2 - 8K21uj0saXJaU7R0jhqCe+0WWlpsjp+TZGRYPNNEge1YySdBiw5s0KEpWcWvvNcko04iPp+tRFRb - DRFICZAKGlSWg0Euz52yUhvYsM1no7g5G7gxNtiyeUa3CIg80M2iNy+H4XR4Qy4yH0fxjSVNSQDc - Ac77yQ18ky4d/a0d3xy6xGY7vnE/xBQHvitPt7CK7zzZKu7oDm8MjnFUhbfMPDo/8F0mJgzYgW9M - zkrApuEb7UOSU34awEEA4A+k445wamdhnIXD91WIJ81R4X0sRdEzqvg8+PM4WkPoRY50ahDH7cTk - koHxIhVNA+K4TFL61SGeybLDOFnDsi5Izh9rEOfbxJd+fEmMHeHz9e5eVzJV9Sotpd7N2jIgnjm3 - FAfEC6vKgh6WAyUSnFP1aLKHmseZGpAATBJSgNMlH+XYshngcmJIF9xygJErlwDH7XcAnt4CuHit - Jb2jAdxTnBAYDd+eypazatSSs0D7H5KbT5c40kmWdDR6SeNs+J594h3fLshZPw3fPnGB62vjVvoB - CxuH5/BIEkYAFd+eQVw58qThW95rx8FVvE9vblF8e5Zbu6BuYNwOtc4lgn6CIppGhJhOUOfU0pWH - s7DyBnC8DAZ1HADny4OeMNeG3o6sEirA0FMZijY7a4WiDdxs7SSPt6Gb72JWqaLbi0T049wcT/+7 - hMIbuj1jpJ74bMW8mDcj/Qpv3E6MmCm8PavnJD+iwZuP21o0GZfdMzdPcz94P2TxffejcwyVD6fZ - aGxP+GoYTPbbib3V4C37YoZ/eAmlyTMLWPEt9OGyOqZ4v5Ywan1lqY2bZTjnU2pWu5jP5xQZlz/p - 8jBnfchwcSwHr+bxBT02iF9c7/r7rItVo8wyPxuTOqt4P7dTmX69H+O3I3WWWm8UD6BgPINIJdOo - YdzRP1jGsTnYC0bb8oV23qLVHeM8IEQiJLPTCrff81mZN0BORlXlQMpeJkw3N/maYBw0wzMIS4d4 - gZnImI5mjRXWMsvpjw+9q2ziSBcbsax2RlaiaEwKcNY1Mi34td0Mth7F+mx2MwAHNdxrGTCUiGbC - NwdWoIdjnBMJLst8mBHfAYXQxa4+LChSzMarqpbz2KwQx7lYgLqkqnds82mxAVs0h1M34+RIvMlV - N87EQtsapbq/ObIilRUzLGhPJjFnfVHySHGp4BorUVpdgMDakW3mObgDEd5EfHNnYcmF97U4dmYU - ymgeiGNdvAuqj6NjjDDNwR2wB6mWbtGdzJVM6lm2PAghKZix77ZKGUUPaGvUoKVvsTJY0ipb9jzP - rHI0yXqxPvddAtmr9traNG+iGPTl20lmzbGVyKvH8VeWZpSohO38OiCaJrv6tpKcPTVS4sGPgmSp - NPfWILfm35ovxcHFsxP01CsWURcR/c2eJhZj0Rp+0f+s0/MlCcVIFaop30kOH9P0K4YP5TSsloCF - 8aboZ8Fsm5xuoBXL1c1iWW6+Z04//xiwDP4WOwKwQL4cutfwyopsa1QkR3pNm4otePU8HkUcxg/d - WVLqSFSfo8oNryXTXZE15sMzR7J9bUizl2BH0Ic7aiWhvOEVMqn42eFsoEIKz2145cluxasVTSTE - cOlzhkIX9XxXygcr+fENrgGTC6GqKObDsDb04AwW8lsh6IZXMH8rSkLDKw/JMDNeeSqaqPiCVzEI - iuZsidqZreZnYpNxOdJO5JhgMZl7LFZ02jjDlYm2YeSdgNnKiSWC10BybxJXvF4UiOJJ6qknAI4c - k9jq78kmvNHkEyrXsYysSxZ6iUBoeKVDUeyAhldPD/XwfDnWjUlOU3NDix90HFkntmo0GpxlRpKV - wwEbYElvSU59lRRvOY4gajaK5VkoQUzAU18NWB9xRGi96I9aVT8TXEPsfLlr/lNjRJtpmAWAi3g6 - Gmbx4toyIzvDxe76oU7TL+rUCbYMdIvIcb0tU5uKTlHQyokX7lKZtnbEaXn8nYk+XyrTuP37G5kX - PwSs1Cox3ztqAhgriGDBhyrGUHNNM/kF6rPwnX4kZWakuvD4iRh8TqpYJ6wozSzrjOaGQb2FGLQi - 2prD+iIBRNAcmEEUqoIZik9lvY4kNLRUMXHxd8+1T0weEndkKzTxnmeYCjQbrD2Zl2PqQ1ZDGpOh - wh7luJgGb3IC1hSJe68VmDDDXo7tSUMqY98sz3+Ausb8yKqmNTQoCzGKpaMVyxhSHNhnhVAN9LJh - 5aSoqZWdZJ72UCXzvR3XwVNYmKLuteQkJNY4GDEI+nEdpP4cIOvnchO6dGE9MmVdIii9us5hT2oT - fa3UJDK9BdfBaJpGTZ5+fkb24/CKG2ierOTzYoC2KhOmc+C1VTM8LZ6KAdLcSu1di1cFHszpCsjQ - Q+5L+WWrNCELyon2eRkWOtPMwF1YE6RMhGdFYjdLnQ+qjaCpKnVxo6ROKhxhArmhANCJQV+A1G22 - 6hLHJOGCFa7z6bWW5ZVBitq0ssSbyOKhMsJckIjJRgtNkQljrarEgn6y9cZovKuwFo3eQiozjdPw - KGRObySOMoUQ4iw2IdAYjpXyyNLO/2y1JNgkDBWKv7dDU5DzVqTqRJ3vFwBp/ncWRzlJ/e01JHw3 - z06h2BsVJCyYAemoXQ9igsKlsTGMq7AYqYwcU9AmaxScV/2BZ+BUiNWRwb1krjCPY0ksTmPFgfIl - +oF4AnAsc/Ypk2jAbiWxVk0BE6m42QTWi45rng+ynls780OW9Z8KaoPcqVH3oDZtBTuC2rakcYQu - Q6RV2JfoGnJ6zwhptwyzHtHuFy2gDZPQa6oXvbLl0qdnpNagB7Wtl1qKpmZQFRxlvtTNxTLsUW3b - jsjpUW0QXy4jqg2lwJeLqHYW8TWi2s0hNaLa4Ml+RLVZejD0C5556/yIatsoh0j3qDYwa/OIarf5 - NlNAbMahWmD2crRSD2rzdJo0gtroMg69onfSY9r9QkPagNg4sprr7kblGXavMY3ni+d6RLskPxJL - rBDPCGi7VlbQA9o9PbDFs0sL7bcYGixiP3zw2rCHs20rX+3hbGAwDiUCo5KTuR4unurB7H5xOeem - O0ys+h3Kfr/VQ9n9Yndxpwey9eJ8cdE3xckR2hrGDi7qobaMd6aR0Mr1zSOrSzrJF9pCC6/MQWw8 - mS60Bd4etVvH89PT9nku7aQO/bj69Ye/320Od2d+gmv3edzXEnjePz4BzfxOlKS1/u2qf+bh3yBd - K0+4yzyhOdBd6hm9FWPIkUaJKHJf2KSgE7AyZlzzp5wM7SDPFDSLOXpWn8H8p02fGJ0N1yyOowcb - IjMw3y3JYwyxQXlm3YZ0VOlpYqGLVHHiqWQSjH9y92jxV4c2PPSJXrzqyDT4spDTlALPEoPA5qCT - Z0wYKiDPB67SAmqdqAouMwscPN5ExnTp0rYAwbUPUBGpY1KkWymhZImakwwyyGQWvnAWQOCEFTAw - TGgV8JdMTzpljmNNBsbseeSc4YIHaB7yWMUQeR4AGXOIMoJEOwPWLix0T7sGM8MKsQQO76Dc4YKE - RN9PtZJsw5mAB/FYN0huR+2Ig8SaeRbdV2ajt02j1yAHsXlYRgOgeS6JnK8s6hlXIFbGaZnhCQUS - bSBZJuZ8OinDwsvYZuIR1lgowwO0oPtXHkPFMp4qmXXMZZGPiEh5ZKZu7LlIE9Q5PEJRykFiAyvT - ZwqVUewC34ZfWJnqpMqz8pcYmRoJUuXJWpwstN2JFMSCSFaNewbm6JnkmYcsaefKUpcD52cqKRki - zROYP4A8NobHPOApSMiJoW2SBhR/ls9ihQJPbKQ7GA8BmWGSEjWH2QGXoDzWHFl+VqFFlaGKeObX - ghOwcoXTSpgOXmV5gADPyOdjIMwpOtG0PbUxjJBjDqxohbbKDeIpAhOVYE8iYbAXjXgkIkmNiRZJ - BiCvK4HVfLggYcEuI6FnlumGxGGDYMVAI93ywH7P28xOYKE4EMBBUkewlO/ey1cHwGf4fi9aORNe - OGg0wfpVqJqMILNEjYwXeiWaBKKMeoL4wKg6Zh6wBsvWJ+49VpX2M96VnWunmmf6zcmpISQTj6DH - NFJmhTt/cqArsILKigyZfsIFrf3CE8jbPCAiWWiRWc5ZZfaQp0yfYTVnYvoHniqwViEGyRrwMnks - GgmgY+yG6QtSuA7Vg551HiYo5CBEHKUsiBVOLEQFA8OywlYJJKFqJNzNIBHWAJuY5TA/FvQRRFx6 - JoNhEUF6Aqg2VTlBE4QPoq0y08RTQqscf+KpVXqWyU1kxtwynijBt2WeR5rpJ+PXJq55vAToCiP3 - /GpE5uxzoUHpWAHLQJg0KuKo4BF+lcnxLH8hK8DKspwz8BeyuQLtF3YZD6WTRuAyPEQACmJiIiEa - wUyi5l9pKfHTBZ5RoomH4EFDL7RiWMdPNldY4Z5obnD76VLEbfBHT48fSY1JPYUEYFmXT4Ij/wao - LD9ugzYZ5IyOeHYJHkwiUiotaRowUpQouwZtilgj48DQhK0lugcDBZCpQn88i2WK5KdYHNgz/IWn - nlYwQJArT5UEZniyb/E8goSV3fyF7il+ZgDkxfAMlobfEQAFBVpEspTkwBP4Hz9Nw2r1aynAneQg - BaALcGcbAsvTcqIZygFhKyc0gcCzhI2wnpY4wfqjhgcIPJ4+CGHKwwsazWb6V8nP8X/CWHiaJq0s - MF+yU2E1EE+ZPiArZxDKuTqSc0Emx1JRCp7CXAaGKsAiSICxRFZW5SA7ITCKdIZ6iqsAMAmM0DWs - ycxaJoEDhjUVT/c4D7+p3H5bwdY80c/vmFgBH55icawFWghZRvR44L2R7y85yh0ggqkaTLHEhhYy - fvTk6eKGlohrWEHyPp5fSXvccnmlq0C7Bu+jJS2vA0XyaBzDqnzyeSw/2nDHCg+xlV8Mvw8R6B8x - vm1RYIEbfsNwoWpEoVFPdRxSAtK3MQ3Po3d5bAMG314m3immZkKE+0bHleceM3nTMBGKgCC0wcst - NSaZmWOeGPgMyD/JGgHolNaZn0FhFSwmVvmZBbyX2i95L737mEa1PFApM5WDAoe7L7kCmYFNMqTM - z4ywLLwGyjQeiTLxACb5vkqSRiUyLAF1jWqG8KhC9zulHcW+MCRII3DxGuhQ4Jhjls8swOiBaI3C - 1aEVYfLgAyx7E6CXyuOMC0uQWRgWOz/EErIi3JFy+VOmgscywNIpW/gorWxDxwfj8RxkYVoSoAWu - WR2foyJCYgskbSuNWMliaIyDkkKbCaQxXhew3nTsclBZvveQKQRJtgyFTCxmLTzySMiIzBZchaXs - LJbgfIPkYEYyHRK+/FSYpwqxLrvCcUN84SdxdUbZycxzf8EMwbIsDyiRPQmSxATE0n/GAUAvYtIu - 9hKyFLa3p5o68cNDTIViKICfsOInvSwPzKmN11F5YRw6UxGig8jTDJuoVCSeZNpkJvQvqGt8F1N0 - GnNnzkeWEwCcLjh4G89AoV4Z5XVFoAXSCI686q8sMV0dTzfnJx7geX9xeL43PKrRejqX8Z4/ty/o - 6afm9ONw4/uK280Xfp27fzGxf5Xx03673X9bS603DQRJkmxfSuyf3L152h9Px5tQHhjJlNy+7xrw - neudtrFYzknc4r3Z8XzLb4Hfykuw5lW+JaV93Mk3/443/Kbv13XrwsvHi1591JEfiLyR5m0Wv19+ - cm9Mlx9ZFjeplFSe2se2rATSXo6kypkkYq1tjsfzWk7UlvKx7f64vp9/lAr0J7zw5rD+D/yE0T6u - D5+5F9VLTsvFvRv5DOzm9nzai/+XRdf8vPeNfin9eHOPibW/hZtv63X7bOi4zagUbdDRSvymEvHl - Qm9ObQnmZ2VLhET6Tze9nSypfFxw3b/qbs11xr8V//prg3/9dbkO8l8n/3q5Z64t/nXXEf9lK0Mi - fPVFwpMYvhj5dv3rqh/NVOWDdLe0ZB9Xp7sHJbjfZStO52Mn42P7Svx/mrD/PwAAAP//AwB3yPJu - M38AAA== + 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 + headers: + Access-Control-Allow-Headers: + - Origin, X-Requested-With, Content-Type, Accept, Authorization + Access-Control-Allow-Methods: + - POST, PUT, DELETE, GET, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - link, per-page, total + Access-Control-Request-Method: + - '*' + Age: + - '4' + Alternate-Protocol: + - 443:npn-spdy/2 + CF-Cache-Status: + - HIT + CF-RAY: + - 6d64a4259f880fae-VIE + Cache-Control: + - max-age=30, public, must-revalidate, s-maxage=30 + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Mon, 31 Jan 2022 17:25:46 GMT + ETag: + - W/"00ff487071b503dd13645b04baa85d1c" + Expect-CT: + - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding, Origin + X-Request-Id: + - ea44d3d4-7055-445a-9066-bad807e7782a + X-Runtime: + - '0.075531' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.27.1 + method: GET + uri: https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?days=MOCK_DAYS&vs_currency=usd + response: + body: + string: !!binary | + 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 headers: Access-Control-Allow-Headers: - Origin, X-Requested-With, Content-Type, Accept, Authorization @@ -3103,7 +3434,7 @@ interactions: CF-Cache-Status: - EXPIRED CF-RAY: - - 6d5a477a4d0432aa-CDG + - 6d64a426599977f1-VIE Cache-Control: - max-age=30, public, must-revalidate, s-maxage=30 Connection: @@ -3113,9 +3444,9 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Sun, 30 Jan 2022 11:14:53 GMT + - Mon, 31 Jan 2022 17:25:46 GMT ETag: - - W/"a7c3c0d6b6790e6c8fa10a60e0d6039f" + - W/"e1be1fd017c5b486607fcdf5a0aa09b3" Expect-CT: - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" Server: @@ -3125,335 +3456,9 @@ interactions: Vary: - Accept-Encoding, Origin X-Request-Id: - - 46351f69-37b3-49f3-b7ee-7ec019a3ecec + - b32840c5-f5bd-4a96-94c6-c345003f93b7 X-Runtime: - - '0.090928' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.27.1 - method: GET - uri: https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=366 - response: - body: - string: !!binary | - H4sIAC1z9mEAA2yd244gO3Jd/0XPB0TyTvpXBEEQBD0YliBBlv0i+N+9F4sRjEbNDM7M6aroTCYv - cd07+N9/9x//+T//+V/+99/9j7//+zxy3qOtj//8VVvuX1p5zTHrLCX/w19IlK/rH5PYO/W8V/7q - qF+5ErnOcSXqN1qaa+gZnx43r0Qp7TOJ9vW091f7zK0Wk6j5a1eityWJ1Xetq7Rmb6l72Ehn23pL - nqO08bUyrkRb1UY6Vh6pf+tb5dMbTaKPbSPVs2bSXyhlf0vPvhKjDxvpLnOnlssaa8+1+pWYrdhI - 16o16fFltN57tZGusu5Im2Zppj71lKzv2faMnXsxCY0pda1C/fld/b58x9jaaiuNXVvb/Wt7m8R9 - vCTmypqrkafe32q+X1HzbM0kWm4pr1F61xfbI8r4fIi75VR2+VZfRZN/JWqbNsQ1mKrZupZxtfsN - tdU6fBR7pbbmV+aoNVcTuR+JyC51pVzH/sbUU+6y6wnjDrQXbYc0NNGtDW0xE9jlDrTnqdn+9KVV - u4dlvSJz7jtSrZ3eMsucfe2ylz1k2apKQuJp8HVzf9vHsW2of/U5tCBV+7OMnW3Cmh5sA20t65z0 - UXbrWqp7Thr7zyds57S21jTPTytx56OVbEep7dX0lrmmZklirZnItrOkhdkljdGbFk7zbpun2UjO - 5umZiW86b10LdiXatMPU9Pdr0qfUzfZbNtje7TBpb80v5VFb37vp6N891EarPliNM1U9ou+2h79m - FjtNOrG1pFIHO0HffPdyW9lOU/+6Jr7pKIyz+e0Z+7PTpM8oSDBF68vZPlfLaEPVimle9VhtVE3U - XTypGT9N+8ua1iHlocFoP18J/WMbQIdDu2iXoTHoY03CFo+NWMtKvfYtbVDLHUbXlvENML8v6S83 - VIRO2l273oodKm238rEwM2vSuw1UI7WdOrXRkzSLNGnZPdsjpCRsoLNq5RbTnDdH5krcdZME57wn - /XJLjQ403hXRH2you+lbtGR9aERzDnvP6n6s+pJC1iAKZ9SVKdrKT9Wq+l7NQNUHDCmBHxE90Y+V - 5r2lrT9rz/TPNNWw/c7n7FJS+7SFNPU7Z5PYfq6k7Kum9ZNqYvXuHhpl2bnSQZkjafCaElko0+o6 - 0tmnVdOmtUNlaoaHKW3pZztWUpPs9yo9os3as4v0ZsdKJ241TT3nQf90k5Ayd2WlIyWJ0XV4dArv - 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 - p8ozDGuTAAA= - headers: - Access-Control-Allow-Headers: - - Origin, X-Requested-With, Content-Type, Accept, Authorization - Access-Control-Allow-Methods: - - POST, PUT, DELETE, GET, OPTIONS - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - link, per-page, total - Access-Control-Request-Method: - - '*' - Alternate-Protocol: - - 443:npn-spdy/2 - CF-Cache-Status: - - MISS - CF-RAY: - - 6d5a477c09b6cd8f-CDG - Cache-Control: - - max-age=30, public, must-revalidate, s-maxage=30 - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Sun, 30 Jan 2022 11:14:53 GMT - ETag: - - W/"3f880eeba2b3a0229ee23c8f3ba84488" - Expect-CT: - - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" - Server: - - cloudflare - Transfer-Encoding: - - chunked - Vary: - - Accept-Encoding, Origin - X-Request-Id: - - cc748010-72f4-42c2-bb8f-eed13bb0f2f8 - X-Runtime: - - '0.039991' + - '0.016393' status: code: 200 message: OK diff --git a/tests/gamestonk_terminal/cryptocurrency/defi/test_coindix_model.py b/tests/gamestonk_terminal/cryptocurrency/defi/test_coindix_model.py index a1cafa14657..3e35e7a13dc 100644 --- a/tests/gamestonk_terminal/cryptocurrency/defi/test_coindix_model.py +++ b/tests/gamestonk_terminal/cryptocurrency/defi/test_coindix_model.py @@ -18,41 +18,6 @@ def test_get_defi_vaults(recorder): recorder.capture(df) -@pytest.mark.vcr(record_mode="none") -def test_get_defi_vaults_status_400(mocker): - # MOCK GET - attrs = { - "status_code": 400, - } - mock_response = mocker.Mock(**attrs) - mocker.patch(target="requests.get", new=mocker.Mock(return_value=mock_response)) - - with pytest.raises(Exception) as _: - coindix_model.get_defi_vaults( - chain=None, - protocol=None, - kind=None, - ) - - -@pytest.mark.vcr(record_mode="none") -def test_get_defi_vaults_value_error(mocker): - # MOCK GET - attrs = { - "status_code": 200, - "json.side_effect": UnicodeDecodeError, - } - mock_response = mocker.Mock(**attrs) - mocker.patch(target="requests.get", new=mocker.Mock(return_value=mock_response)) - - with pytest.raises(ValueError) as _: - coindix_model.get_defi_vaults( - chain=None, - protocol=None, - kind=None, - ) - - @pytest.mark.vcr(record_mode="none") def test_get_defi_vaults_no_data(mocker): # MOCK GET diff --git a/tests/gamestonk_terminal/cryptocurrency/defi/test_llama_model.py b/tests/gamestonk_terminal/cryptocurrency/defi/test_llama_model.py index 16d9e1498de..d79cb67da6a 100644 --- a/tests/gamestonk_terminal/cryptocurrency/defi/test_llama_model.py +++ b/tests/gamestonk_terminal/cryptocurrency/defi/test_llama_model.py @@ -91,45 +91,3 @@ def test_get_defi_protocols(): def test_get_defi_tvl(recorder): df = llama_model.get_defi_tvl() recorder.capture(df) - - -@pytest.mark.vcr(record_mode="none") -@pytest.mark.parametrize( - "func, kwargs", - [ - ("get_defi_protocols", dict()), - ("get_defi_protocol", dict(protocol="anchor")), - ("get_defi_tvl", dict()), - ], -) -def test_call_func_status_400(func, kwargs, mocker): - # MOCK GET - attrs = { - "status_code": 400, - } - mock_response = mocker.Mock(**attrs) - mocker.patch(target="requests.get", new=mocker.Mock(return_value=mock_response)) - - with pytest.raises(Exception) as _: - getattr(llama_model, func)(**kwargs) - - -@pytest.mark.vcr(record_mode="none") -@pytest.mark.parametrize( - "func, kwargs", - [ - ("get_defi_protocols", dict()), - ("get_defi_tvl", dict()), - ], -) -def test_call_func_value_error(func, kwargs, mocker): - # MOCK GET - attrs = { - "status_code": 200, - "json.side_effect": UnicodeDecodeError, - } - mock_response = mocker.Mock(**attrs) - mocker.patch(target="requests.get", new=mocker.Mock(return_value=mock_response)) - - with pytest.raises(ValueError) as _: - getattr(llama_model, func)(**kwargs) diff --git a/tests/gamestonk_terminal/cryptocurrency/defi/test_terraengineer_model.py b/tests/gamestonk_terminal/cryptocurrency/defi/test_terraengineer_model.py index bc2b5c1f555..f88bc22406f 100644 --- a/tests/gamestonk_terminal/cryptocurrency/defi/test_terraengineer_model.py +++ b/tests/gamestonk_terminal/cryptocurrency/defi/test_terraengineer_model.py @@ -18,36 +18,3 @@ def test_get_history_asset_from_terra_address(asset, address, recorder): address=address, ) recorder.capture(df) - - -@pytest.mark.vcr(record_mode="none") -def test_get_history_asset_from_terra_address_status_400(mocker): - # MOCK GET - attrs = { - "status_code": 400, - } - mock_response = mocker.Mock(**attrs) - mocker.patch(target="requests.get", new=mocker.Mock(return_value=mock_response)) - - with pytest.raises(Exception) as _: - terraengineer_model.get_history_asset_from_terra_address( - asset="ust", - address="terra1tmnqgvg567ypvsvk6rwsga3srp7e3lg6u0elp8", - ) - - -@pytest.mark.vcr(record_mode="none") -@pytest.mark.parametrize( - "asset, address", - [ - ("ust", "terra1tmnqgvg567ypvsvk6rwsga3srp7e3lg6u0elp8"), - ("WRONG_ASSET", "terra1tmnqgvg567ypvsvk6rwsga3srp7e3lg6u0elp8"), - ("ust", "WRONG_ADDRESS"), - ], -) -def test_get_history_asset_from_terra_address_wrong_param(asset, address): - with pytest.raises(Exception) as _: - terraengineer_model.get_history_asset_from_terra_address( - asset=asset, - address=address, - ) diff --git a/tests/gamestonk_terminal/cryptocurrency/discovery/test_dappradar_model.py b/tests/gamestonk_terminal/cryptocurrency/discovery/test_dappradar_model.py index 1fc3d5702fd..4f5820a77e7 100644 --- a/tests/gamestonk_terminal/cryptocurrency/discovery/test_dappradar_model.py +++ b/tests/gamestonk_terminal/cryptocurrency/discovery/test_dappradar_model.py @@ -30,30 +30,3 @@ def test_call_func(func, kwargs, recorder): result = getattr(dappradar_model, func)(**kwargs) recorder.capture(result) - - -@pytest.mark.vcr(record_mode="none") -def test__make_request_status_400(mocker): - # MOCK GET - attrs = { - "status_code": 400, - } - mock_response = mocker.Mock(**attrs) - mocker.patch(target="requests.get", new=mocker.Mock(return_value=mock_response)) - - with pytest.raises(Exception) as _: - dappradar_model._make_request(url="MOCK_URL") - - -@pytest.mark.vcr(record_mode="none") -def test__make_request_value_error(mocker): - # MOCK GET - attrs = { - "status_code": 200, - "json.side_effect": UnicodeDecodeError, - } - mock_response = mocker.Mock(**attrs) - mocker.patch(target="requests.get", new=mocker.Mock(return_value=mock_response)) - - with pytest.raises(ValueError) as _: - dappradar_model._make_request(url="MOCK_URL") diff --git a/tests/gamestonk_terminal/cryptocurrency/discovery/test_pycoingecko_model.py b/tests/gamestonk_terminal/cryptocurrency/discovery/test_pycoingecko_model.py index 4176fd42893..8f9596845b5 100644 --- a/tests/gamestonk_terminal/cryptocurrency/discovery/test_pycoingecko_model.py +++ b/tests/gamestonk_terminal/cryptocurrency/discovery/test_pycoingecko_model.py @@ -45,15 +45,3 @@ def test_call_func(func, kwargs, recorder): result = getattr(pycoingecko_model, func)(**kwargs) recorder.capture(result) - - -@pytest.mark.vcr(record_mode="none") -def test_get_gainers_or_losers_value_error(): - with pytest.raises(ValueError) as _: - pycoingecko_model.get_gainers_or_losers(period="WRONG_PERIOD") - - -@pytest.mark.vcr(record_mode="none") -def test_read_file_data_type_error(): - with pytest.raises(TypeError) as _: - pycoingecko_model.read_file_data(file_name="MOCK_WRONG_FILE_NAME.EXTENSION") diff --git a/tests/gamestonk_terminal/cryptocurrency/due_diligence/test_coinpaprika_model.py b/tests/gamestonk_terminal/cryptocurrency/due_diligence/test_coinpaprika_model.py index b18fcf8df95..9470ba9d4d1 100644 --- a/tests/gamestonk_terminal/cryptocurrency/due_diligence/test_coinpaprika_model.py +++ b/tests/gamestonk_terminal/cryptocurrency/due_diligence/test_coinpaprika_model.py @@ -7,6 +7,16 @@ import pytest from gamestonk_terminal.cryptocurrency.due_diligence import coinpaprika_model +@pytest.fixture(scope="module") +def vcr_config(): + return { + "filter_query_parameters": [ + ("start", "mock_start"), + ("end", "mock_end"), + ] + } + + @pytest.mark.vcr @pytest.mark.parametrize( "func, kwargs", diff --git a/tests/gamestonk_terminal/cryptocurrency/test_crypto_controller.py b/tests/gamestonk_terminal/cryptocurrency/test_crypto_controller.py index 90efb27344a..b65d8ad1a4e 100644 --- a/tests/gamestonk_terminal/cryptocurrency/test_crypto_controller.py +++ b/tests/gamestonk_terminal/cryptocurrency/test_crypto_controller.py @@ -48,6 +48,15 @@ COINBASE_SHOW_AVAILABLE_PAIRS_OF_GIVEN_SYMBOL = ( ) +@pytest.fixture(scope="module") +def vcr_config(): + return { + "filter_query_parameters": [ + ("days", "MOCK_DAYS"), + ] + } + + @pytest.mark.vcr(record_mode="none") @pytest.mark.parametrize( "queue, expected", @@ -350,5 +359,5 @@ def test_call_func_no_current_coin(tested_func): @pytest.mark.record_stdout def test_call_load(): controller = crypto_controller.CryptoController() - other_args = [SYMBOL] + other_args = [SYMBOL, "-s", "2021-01-29"] controller.call_load(other_args=other_args) diff --git a/tests/gamestonk_terminal/cryptocurrency/txt/test_crypto_controller/test_call_load.txt b/tests/gamestonk_terminal/cryptocurrency/txt/test_crypto_controller/test_call_load.txt index 77c483d0039..c9de8ceeaae 100644 --- a/tests/gamestonk_terminal/cryptocurrency/txt/test_crypto_controller/test_call_load.txt +++ b/tests/gamestonk_terminal/cryptocurrency/txt/test_crypto_controller/test_call_load.txt @@ -1,7 +1,7 @@ Loaded bitcoin against usd from CoinGecko source -Current Price: 38199.42 USD -Performance in interval (1day): [green]0.92%[/green] -Performance since 2021-01-29: [green]11.86%[/green] +Current Price: 38621.8 USD +Performance in interval (1day): [green]1.02%[/green] +Performance since 2021-01-29: [green]13.09%[/green] diff --git a/tests/gamestonk_terminal/economy/test_nasdaq_model.py b/tests/gamestonk_terminal/economy/test_nasdaq_model.py index 5e2dae41dfe..469d7bb9114 100644 --- a/tests/gamestonk_terminal/economy/test_nasdaq_model.py +++ b/tests/gamestonk_terminal/economy/test_nasdaq_model.py @@ -1,6 +1,3 @@ -# IMPORTATION STANDARD -from argparse import ArgumentTypeError - # IMPORTATION THIRDPARTY import pandas as pd import pytest @@ -24,15 +21,6 @@ def test_check_country_code_type(recorder): recorder.capture(result_list) -@pytest.mark.vcr(record_mode="none") -def test_check_country_code_type_error(recorder): - with pytest.raises(ArgumentTypeError) as e: - list_of_codes = "" - nasdaq_model.check_country_code_type(list_of_codes=list_of_codes) - - recorder.capture(str(e)) - - @pytest.mark.vcr def test_get_big_mac_index(recorder): result_df = nasdaq_model.get_big_mac_index(country_code="VNM") diff --git a/tests/gamestonk_terminal/stocks/due_diligence/test_ark_model.py b/tests/gamestonk_terminal/stocks/due_diligence/test_ark_model.py index 8299a590934..1a44affaece 100644 --- a/tests/gamestonk_terminal/stocks/due_diligence/test_ark_model.py +++ b/tests/gamestonk_terminal/stocks/due_diligence/test_ark_model.py @@ -4,7 +4,6 @@ import requests import pandas as pd import pytest -import vcr # IMPORTATION INTERNAL from gamestonk_terminal.stocks.due_diligence import ark_model @@ -29,13 +28,6 @@ def test_get_ark_trades_by_ticker(recorder): recorder.capture(result_df) -@pytest.mark.default_cassette("test_get_ark_trades_by_ticker_AAPL") -@pytest.mark.vcr(record_mode="none") -def test_get_ark_trades_by_ticker_not_recorded(): - with pytest.raises(vcr.errors.CannotOverwriteExistingCassetteException): - ark_model.get_ark_trades_by_ticker(ticker="AAPL") - - @pytest.mark.default_cassette("test_get_ark_trades_by_ticker_INVALID_TICKER") @pytest.mark.vcr def test_get_ark_trades_by_ticker_invalid_ticker(): diff --git a/tests/gamestonk_terminal/stocks/fundamental_analysis/test_market_watch_model.py b/tests/gamestonk_terminal/stocks/fundamental_analysis/test_market_watch_model.py index 5b13e3a9924..6e5e271426b 100644 --- a/tests/gamestonk_terminal/stocks/fundamental_analysis/test_market_watch_model.py +++ b/tests/gamestonk_terminal/stocks/fundamental_analysis/test_market_watch_model.py @@ -27,16 +27,6 @@ def test_prepare_df_financials(quarter, recorder): recorder.capture(result_df) -@pytest.mark.vcr(record_mode="none") -def test_prepare_df_financials_wrong_statement(): - with pytest.raises(ValueError): - market_watch_model.prepare_df_financials( - ticker="AAPL", - statement="INVALID_STATEMENT", - quarter=False, - ) - - @pytest.mark.vcr @pytest.mark.parametrize( "debug", diff --git a/tests/gamestonk_terminal/stocks/options/test_tradier_view.py b/tests/gamestonk_terminal/stocks/options/test_tradier_view.py index f9c9feafe90..94944ce6424 100644 --- a/tests/gamestonk_terminal/stocks/options/test_tradier_view.py +++ b/tests/gamestonk_terminal/stocks/options/test_tradier_view.py @@ -1,6 +1,3 @@ -# IMPORTATION STANDARD -import argparse - # IMPORTATION THIRDPARTY import pytest @@ -33,12 +30,6 @@ def test_check_valid_option_chains_headers(recorder): recorder.capture(result) -@pytest.mark.vcr(record_mode="none") -def test_check_valid_option_chains_headers_invalid(): - with pytest.raises(argparse.ArgumentTypeError): - tradier_view.check_valid_option_chains_headers(headers="MOCK TEXT") - - @pytest.mark.default_cassette("test_display_chains") @pytest.mark.vcr @pytest.mark.record_stdout