From 41be83ff7665a70dd2eda813bd915e098fa56bc5 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Tue, 10 Oct 2023 15:50:54 -0400 Subject: [PATCH] Add OECD Provider for economy extension (#5534) --- openbb_platform/CONTRIBUTING.md | 3 +- .../economy/integration/test_economy_api.py | 48 + .../integration/test_economy_python.py | 54 + .../economy/openbb_economy/economy_router.py | 33 + .../openbb/package/__extensions__.py | 40 +- openbb_platform/openbb/package/crypto.py | 46 +- .../openbb/package/econometrics.py | 514 ++++++ openbb_platform/openbb/package/economy.py | 1071 +++++++++++- .../openbb/package/extension_map.json | 14 +- openbb_platform/openbb/package/fixedincome.py | 170 +- openbb_platform/openbb/package/forex.py | 98 +- openbb_platform/openbb/package/futures.py | 188 ++ .../openbb/package/module_map.json | 70 +- openbb_platform/openbb/package/news.py | 66 +- openbb_platform/openbb/package/qa.py | 375 ++++ openbb_platform/openbb/package/stocks.py | 622 +++++-- openbb_platform/openbb/package/stocks_ca.py | 14 +- openbb_platform/openbb/package/stocks_fa.py | 4 +- .../openbb/package/stocks_options.py | 82 +- openbb_platform/openbb/package/ta.py | 1485 ++++++++++++++++ .../standard_models/gdpforecast.py | 39 + .../openbb_provider/standard_models/gdpnom.py | 35 + .../standard_models/gdpreal.py | 35 + .../platform/provider/pyproject.toml | 2 +- openbb_platform/providers/oecd/README.md | 0 openbb_platform/providers/oecd/__init__.py | 0 .../providers/oecd/openbb_oecd/__init__.py | 16 + .../oecd/openbb_oecd/models/gdpforecast.py | 94 + .../oecd/openbb_oecd/models/gdpnom.py | 74 + .../oecd/openbb_oecd/models/gdpreal.py | 83 + .../oecd/openbb_oecd/utils/constants.py | 456 +++++ .../oecd/openbb_oecd/utils/helpers.py | 66 + openbb_platform/providers/oecd/poetry.lock | 1529 +++++++++++++++++ openbb_platform/providers/oecd/pyproject.toml | 19 + .../test_oecdgdp_forecast_fetcher.yaml | 99 ++ .../test_oecdgdp_nom_fetcher.yaml | 91 + .../test_oecdgdp_real_fetcher.yaml | 224 +++ .../oecd/tests/test_oecd_fetchers.py | 53 + openbb_terminal/economy/oecd_model.py | 5 + 39 files changed, 7415 insertions(+), 502 deletions(-) create mode 100644 openbb_platform/openbb/package/econometrics.py create mode 100644 openbb_platform/openbb/package/futures.py create mode 100644 openbb_platform/openbb/package/qa.py create mode 100644 openbb_platform/openbb/package/ta.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/gdpforecast.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/gdpnom.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/gdpreal.py create mode 100644 openbb_platform/providers/oecd/README.md create mode 100644 openbb_platform/providers/oecd/__init__.py create mode 100644 openbb_platform/providers/oecd/openbb_oecd/__init__.py create mode 100644 openbb_platform/providers/oecd/openbb_oecd/models/gdpforecast.py create mode 100644 openbb_platform/providers/oecd/openbb_oecd/models/gdpnom.py create mode 100644 openbb_platform/providers/oecd/openbb_oecd/models/gdpreal.py create mode 100644 openbb_platform/providers/oecd/openbb_oecd/utils/constants.py create mode 100644 openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py create mode 100644 openbb_platform/providers/oecd/poetry.lock create mode 100644 openbb_platform/providers/oecd/pyproject.toml create mode 100644 openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_forecast_fetcher.yaml create mode 100644 openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_nom_fetcher.yaml create mode 100644 openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_real_fetcher.yaml create mode 100644 openbb_platform/providers/oecd/tests/test_oecd_fetchers.py diff --git a/openbb_platform/CONTRIBUTING.md b/openbb_platform/CONTRIBUTING.md index d85331323ab..94cc12b1b0f 100644 --- a/openbb_platform/CONTRIBUTING.md +++ b/openbb_platform/CONTRIBUTING.md @@ -254,10 +254,11 @@ Each `Fetcher` comes equipped with a `test` method that will ensure that it is i To create unit tests for your Fetchers, you can run the following command: ```bash -python openbb_platform/providers/tests/utils/unit_test_generator.py +python openbb_platform/providers/tests/utils/unit_tests_generator.py ``` > Note that you should be running this file from the root of the repository. +> Note that the `tests` folder must exist in order to generate the tests. The automatic unit test generation will add unit tests for all the fetchers available in a given provider. diff --git a/openbb_platform/extensions/economy/integration/test_economy_api.py b/openbb_platform/extensions/economy/integration/test_economy_api.py index 2b0c38fecb0..f7218bb5f9e 100644 --- a/openbb_platform/extensions/economy/integration/test_economy_api.py +++ b/openbb_platform/extensions/economy/integration/test_economy_api.py @@ -378,3 +378,51 @@ def test_economy_fred_index(params, headers): result = requests.get(url, headers=headers, timeout=10) assert isinstance(result, requests.Response) assert result.status_code == 200 + +@pytest.mark.parametrize( + "params", + [({'units': 'usd', 'start_date': '2023-01-01', 'end_date': '2023-06-06'}), +({'country': 'united_states', 'provider': 'oecd', 'units': 'usd', 'start_date': '2023-01-01', 'end_date': '2023-06-06'})], +) +@pytest.mark.integration +def test_economy_gdpnom(params, headers): + params = {p: v for p, v in params.items() if v} + + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/economy/gdpnom?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + +@pytest.mark.parametrize( + "params", + [({'units': 'yoy', 'start_date': '2023-01-01', 'end_date': '2023-06-06'}), +({'country': 'united_states', 'provider': 'oecd', 'units': 'yoy', 'start_date': '2023-01-01', 'end_date': '2023-06-06'})], +) +@pytest.mark.integration +def test_economy_gdpreal(params, headers): + params = {p: v for p, v in params.items() if v} + + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/economy/gdpreal?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + +@pytest.mark.parametrize( + "params", + [({'period': 'annual', 'start_date': '2023-01-01', 'end_date': '2023-06-06', 'type': 'real'}), +({'country': 'united_states', 'provider': 'oecd', 'period': 'annual', 'start_date': '2023-01-01', 'end_date': '2023-06-06', 'type': 'real'})], +) +@pytest.mark.integration +def test_economy_gdpforecast(params, headers): + params = {p: v for p, v in params.items() if v} + + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/economy/gdpforecast?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 diff --git a/openbb_platform/extensions/economy/integration/test_economy_python.py b/openbb_platform/extensions/economy/integration/test_economy_python.py index a5d8ab147fb..4c117bb5617 100644 --- a/openbb_platform/extensions/economy/integration/test_economy_python.py +++ b/openbb_platform/extensions/economy/integration/test_economy_python.py @@ -361,3 +361,57 @@ def test_economy_fred_index(params): assert result assert isinstance(result, OBBject) assert len(result.results) > 0 + + +@pytest.mark.parametrize( + "params", + [ + ({'units': 'usd', 'start_date': '2023-01-01', 'end_date': '2023-06-06'}), +({'country': 'united_states', 'provider': 'oecd', 'units': 'usd', 'start_date': '2023-01-01', 'end_date': '2023-06-06'}), + + ], +) +@pytest.mark.integration +def test_economy_gdpnom(params, obb): + params = {p: v for p, v in params.items() if v} + + result = obb.economy.gdpnom(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + + +@pytest.mark.parametrize( + "params", + [ + ({'units': 'yoy', 'start_date': '2023-01-01', 'end_date': '2023-06-06'}), +({'country': 'united_states', 'provider': 'oecd', 'units': 'yoy', 'start_date': '2023-01-01', 'end_date': '2023-06-06'}), + + ], +) +@pytest.mark.integration +def test_economy_gdpreal(params, obb): + params = {p: v for p, v in params.items() if v} + + result = obb.economy.gdpreal(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + + +@pytest.mark.parametrize( + "params", + [ + ({'period': 'annual', 'start_date': '2023-01-01', 'end_date': '2023-06-06', 'type': 'real'}), +({'country': 'united_states', 'provider': 'oecd', 'period': 'annual', 'start_date': '2023-01-01', 'end_date': '2023-06-06', 'type': 'real'}), + + ], +) +@pytest.mark.integration +def test_economy_gdpforecast(params, obb): + params = {p: v for p, v in params.items() if v} + + result = obb.economy.gdpforecast(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 diff --git a/openbb_platform/extensions/economy/openbb_economy/economy_router.py b/openbb_platform/extensions/economy/openbb_economy/economy_router.py index 37a27816068..444eeac20d8 100644 --- a/openbb_platform/extensions/economy/openbb_economy/economy_router.py +++ b/openbb_platform/extensions/economy/openbb_economy/economy_router.py @@ -159,3 +159,36 @@ def fred_index( ) -> OBBject[BaseModel]: """Fred Historical.""" return OBBject(results=Query(**locals()).execute()) + + +@router.command(model="GDPNom") +def gdpnom( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject[BaseModel]: + """GDP Data.""" + return OBBject(results=Query(**locals()).execute()) + + +@router.command(model="GDPReal") +def gdpreal( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject[BaseModel]: + """GDP Data.""" + return OBBject(results=Query(**locals()).execute()) + + +@router.command(model="GDPForecast") +def gdpforecast( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject[BaseModel]: + """GDP Data.""" + return OBBject(results=Query(**locals()).execute()) diff --git a/openbb_platform/openbb/package/__extensions__.py b/openbb_platform/openbb/package/__extensions__.py index f55f965b650..5d2ebc153d5 100644 --- a/openbb_platform/openbb/package/__extensions__.py +++ b/openbb_platform/openbb/package/__extensions__.py @@ -9,25 +9,39 @@ class Extensions(Container): """ Routers: /crypto + /econometrics /economy /fixedincome /forex + /futures /news + /qa /stocks + /ta Extensions: - crypto@0.1.0a2 + - econometrics@0.1.0a2 - economy@0.1.0a2 - fixedincome@0.1.0a2 - forex@0.1.0a2 + - futures@0.1.0a2 - news@0.1.0a2 + - openbb_charting@0.1.0a2 + - qa@0.1.0a2 - stocks@0.1.0a2 + - ta@0.1.0a2 + - alpha_vantage@0.1.0a2 - benzinga@0.1.0a2 + - cboe@0.1.0a2 - fmp@0.1.0a2 - fred@0.1.0a2 - intrinio@0.1.0a2 - - polygon@0.1.0a2 """ + - oecd@0.1.0a2 + - polygon@0.1.0a2 + - quandl@0.1.0a2 + - yfinance@0.1.0a2 """ # fmt: on def __repr__(self) -> str: return self.__doc__ or "" @@ -38,6 +52,12 @@ Extensions: return crypto.ROUTER_crypto(command_runner=self._command_runner) + @property + def econometrics(self): # route = "/econometrics" + from . import econometrics + + return econometrics.ROUTER_econometrics(command_runner=self._command_runner) + @property def economy(self): # route = "/economy" from . import economy @@ -56,14 +76,32 @@ Extensions: return forex.ROUTER_forex(command_runner=self._command_runner) + @property + def futures(self): # route = "/futures" + from . import futures + + return futures.ROUTER_futures(command_runner=self._command_runner) + @property def news(self): # route = "/news" from . import news return news.ROUTER_news(command_runner=self._command_runner) + @property + def qa(self): # route = "/qa" + from . import qa + + return qa.ROUTER_qa(command_runner=self._command_runner) + @property def stocks(self): # route = "/stocks" from . import stocks return stocks.ROUTER_stocks(command_runner=self._command_runner) + + @property + def ta(self): # route = "/ta" + from . import ta + + return ta.ROUTER_ta(command_runner=self._command_runner) diff --git a/openbb_platform/openbb/package/crypto.py b/openbb_platform/openbb/package/crypto.py index 7fa9d737829..8a6b161841f 100644 --- a/openbb_platform/openbb/package/crypto.py +++ b/openbb_platform/openbb/package/crypto.py @@ -1,15 +1,15 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### import datetime -from typing import List, Literal, Union +from typing import List, Literal, Optional, Union -import typing_extensions from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_inputs from openbb_provider.abstract.data import Data from pydantic import validate_call +from typing_extensions import Annotated class ROUTER_crypto(Container): @@ -23,23 +23,23 @@ class ROUTER_crypto(Container): @validate_call def load( self, - symbol: typing_extensions.Annotated[ + symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter(description="Symbol to get data for."), ], - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fmp", "polygon"], None] = None, + provider: Optional[Literal["fmp", "polygon", "yfinance"]] = None, **kwargs ) -> OBBject[List[Data]]: """Crypto Historical Price. @@ -48,18 +48,18 @@ class ROUTER_crypto(Container): ---------- symbol : str Symbol to get data for. - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fmp', 'polygon'], None] + provider : Optional[Literal['fmp', 'polygon', 'yfinance']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. - timeseries : Optional[Union[typing_extensions.Annotated[int, Ge(ge=0)]]] + timeseries : Optional[Annotated[int, Ge(ge=0)]] Number of days to look back. (provider: fmp) - interval : Literal['1min', '5min', '15min', '30min', '1hour', '4hour', '1day'] - Data granularity. (provider: fmp) + interval : Optional[Union[Literal['1min', '5min', '15min', '30min', '1hour', '4hour', '1day'], Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']]] + Data granularity. (provider: fmp, yfinance) multiplier : int Multiplier of the timespan. (provider: polygon) timespan : Literal['minute', 'hour', 'day', 'week', 'month', 'quarter', 'year'] @@ -70,13 +70,15 @@ class ROUTER_crypto(Container): The number of data entries to return. (provider: polygon) adjusted : bool Whether the data is adjusted. (provider: polygon) + period : Optional[Literal['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']] + Period of the data to return. (provider: yfinance) Returns ------- OBBject - results : Union[List[CryptoHistorical]] + results : List[CryptoHistorical] Serializable results. - provider : Union[Literal['fmp', 'polygon'], None] + provider : Optional[Literal['fmp', 'polygon', 'yfinance']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -99,21 +101,21 @@ class ROUTER_crypto(Container): The close price of the symbol. volume : float The volume of the symbol. - vwap : Optional[Union[typing_extensions.Annotated[float, Gt(gt=0)]]] + vwap : Optional[Annotated[float, Gt(gt=0)]] Volume Weighted Average Price of the symbol. - adj_close : Optional[Union[float]] + adj_close : Optional[float] Adjusted Close Price of the symbol. (provider: fmp) - unadjusted_volume : Optional[Union[float]] + unadjusted_volume : Optional[float] Unadjusted volume of the symbol. (provider: fmp) - change : Optional[Union[float]] + change : Optional[float] Change in the price of the symbol from the previous day. (provider: fmp) - change_percent : Optional[Union[float]] + change_percent : Optional[float] Change % in the price of the symbol. (provider: fmp) - label : Optional[Union[str]] + label : Optional[str] Human readable format of the date. (provider: fmp) - change_over_time : Optional[Union[float]] + change_over_time : Optional[float] Change % in the price of the symbol over a period of time. (provider: fmp) - transactions : Optional[Union[typing_extensions.Annotated[int, Gt(gt=0)]]] + transactions : Optional[Annotated[int, Gt(gt=0)]] Number of transactions for the symbol in the time period. (provider: polygon) """ # noqa: E501 diff --git a/openbb_platform/openbb/package/econometrics.py b/openbb_platform/openbb/package/econometrics.py new file mode 100644 index 00000000000..ea0c1f3846c --- /dev/null +++ b/openbb_platform/openbb/package/econometrics.py @@ -0,0 +1,514 @@ +### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### + +from typing import Dict, List, Literal, Union + +import pandas +from annotated_types import Gt +from openbb_core.app.model.obbject import OBBject +from openbb_core.app.static.container import Container +from openbb_core.app.static.filters import filter_inputs +from openbb_provider.abstract.data import Data +from pydantic import validate_call +from typing_extensions import Annotated + + +class ROUTER_econometrics(Container): + """/econometrics + bgot + coint + corr + dwat + granger + ols + ols_summary + panelbols + panelfd + panelfmac + panelols + panelpols + panelre + unitroot + """ + + def __repr__(self) -> str: + return self.__doc__ or "" + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def bgot( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + lags: Annotated[int, Gt(gt=0)] = 1, + ) -> OBBject[Data]: + """Perform Breusch-Godfrey Lagrange Multiplier tests for residual autocorrelation. + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + lags: PositiveInt + Number of lags to use in the test. + Returns + ------- + OBBject[Data] + OBBject with the results being the score from the test. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + lags=lags, + ) + + return self._run( + "/econometrics/bgot", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def coint( + self, data: Union[List[Data], pandas.DataFrame], columns: List[str] + ) -> OBBject[Data]: + """Show co-integration between two timeseries using the two step Engle-Granger test. + + Parameters + ---------- + data: List[Data] + Input dataset. + columns: List[str] + Data columns to check cointegration + maxlag: PositiveInt + Number of lags to use in the test. + Returns + ------- + OBBject[Data] + OBBject with the results being the score from the test. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + columns=columns, + ) + + return self._run( + "/econometrics/coint", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def corr(self, data: Union[List[Data], pandas.DataFrame]) -> OBBject[List[Data]]: + """Get the corrlelation matrix of an input dataset. + + Parameters + ---------- + data : List[Data] + Input dataset. + + Returns + ------- + OBBject[List[Data]] + Correlation matrix. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + ) + + return self._run( + "/econometrics/corr", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def dwat( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Dict]: + """Perform Durbin-Watson test for autocorrelation + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Data] + OBBject with the results being the score from the test. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/dwat", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def granger( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_column: str, + lag: Annotated[int, Gt(gt=0)] = 3, + ) -> OBBject[Data]: + """Perform Granger causality test to determine if X "causes" y. + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_column: str + Columns to use as exogenous variables. + lag: PositiveInt + Number of lags to use in the test. + Returns + ------- + OBBject[Data] + OBBject with the results being the score from the test. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_column=x_column, + lag=lag, + ) + + return self._run( + "/econometrics/granger", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def ols( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Dict]: + """Perform OLS regression. This returns the model and results objects from statsmodels. + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Dict] + OBBject with the results being model and results objects. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/ols", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def ols_summary( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Data]: + """Perform OLS regression. This returns the summary object from statsmodels. + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Dict] + OBBject with the results being summary object. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/ols_summary", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def panelbols( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Dict]: + """Perform a Between estimator regression on panel data + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Dict] + OBBject with the fit model returned + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/panelbols", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def panelfd( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Dict]: + """Perform a first-difference estimate for panel data + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Dict] + OBBject with the fit model returned + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/panelfd", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def panelfmac( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Dict]: + """Fama-MacBeth estimator for panel data + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Dict] + OBBject with the fit model returned + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/panelfmac", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def panelols( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Dict]: + """One- and two-way fixed effects estimator for panel data + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Dict] + OBBject with the fit model returned + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/panelols", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def panelpols( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Dict]: + """Perform a Pooled coefficvient estimator regression on panel data + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Dict] + OBBject with the fit model returned + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/panelpols", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def panelre( + self, + data: Union[List[Data], pandas.DataFrame], + y_column: str, + x_columns: List[str], + ) -> OBBject[Dict]: + """Perform One-way Random Effects model for panel data + + Parameters + ---------- + data: List[Data] + Input dataset. + y_column: str + Target column. + x_columns: str + List of columns to use as exogenous variables. + + Returns + ------- + OBBject[Dict] + OBBject with the fit model returned + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + y_column=y_column, + x_columns=x_columns, + ) + + return self._run( + "/econometrics/panelre", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def unitroot( + self, + data: Union[List[Data], pandas.DataFrame], + column: str, + regression: Literal["c", "ct", "ctt"] = "c", + ) -> OBBject[Data]: + """Perform Augmented Dickey-Fuller unit root test. + + Parameters + ---------- + data: List[Data] + Input dataset. + column: str + Data columns to check unit root + regression: str + Regression type to use in the test. Either "c" for constant only, "ct" for constant and trend, or "ctt" for + constant, trend, and trend-squared. + Returns + ------- + OBBject[Data] + OBBject with the results being the score from the test. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + column=column, + regression=regression, + ) + + return self._run( + "/econometrics/unitroot", + **inputs, + ) diff --git a/openbb_platform/openbb/package/economy.py b/openbb_platform/openbb/package/economy.py index 204db554411..84a1da9669d 100644 --- a/openbb_platform/openbb/package/economy.py +++ b/openbb_platform/openbb/package/economy.py @@ -1,25 +1,35 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### import datetime -from typing import List, Literal, Union +from typing import List, Literal, Optional, Union -import typing_extensions from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_inputs from openbb_provider.abstract.data import Data from pydantic import validate_call +from typing_extensions import Annotated class ROUTER_economy(Container): """/economy available_indices const + cot + cot_search cpi + european_index + european_index_constituents fred_index + gdpforecast + gdpnom + gdpreal index + index_search + index_snapshots risk + sp500_multiples """ def __repr__(self) -> str: @@ -27,23 +37,25 @@ class ROUTER_economy(Container): @validate_call def available_indices( - self, provider: Union[Literal["fmp"], None] = None, **kwargs + self, provider: Optional[Literal["cboe", "fmp", "yfinance"]] = None, **kwargs ) -> OBBject[List[Data]]: """Lists of available indices from a provider. Parameters ---------- - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['cboe', 'fmp', 'yfinance']] The provider to use for the query, by default None. - If None, the provider specified in defaults is selected or 'fmp' if there is + If None, the provider specified in defaults is selected or 'cboe' if there is no default. + europe : bool + Filter for European indices. False for US indices. (provider: cboe) Returns ------- OBBject - results : Union[List[AvailableIndices]] + results : List[AvailableIndices] Serializable results. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['cboe', 'fmp', 'yfinance']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -54,15 +66,38 @@ class ROUTER_economy(Container): AvailableIndices ---------------- - name : Optional[Union[str]] + name : Optional[str] Name of the index. - currency : Optional[Union[str]] + currency : Optional[str] Currency the index is traded in. - stock_exchange : Optional[Union[str]] + isin : Optional[str] + ISIN code for the index. Valid only for European indices. (provider: cboe) + region : Optional[str] + Region for the index. Valid only for European indices (provider: cboe) + symbol : Optional[str] + Symbol for the index. (provider: cboe, yfinance) + description : Optional[str] + Description for the index. Valid only for US indices. (provider: cboe) + data_delay : Optional[int] + Data delay for the index. Valid only for US indices. (provider: cboe) + open_time : Optional[datetime.time] + Opening time for the index. Valid only for US indices. (provider: cboe) + close_time : Optional[datetime.time] + Closing time for the index. Valid only for US indices. (provider: cboe) + time_zone : Optional[str] + Time zone for the index. Valid only for US indices. (provider: cboe) + tick_days : Optional[str] + The trading days for the index. Valid only for US indices. (provider: cboe) + tick_frequency : Optional[str] + The frequency of the index ticks. Valid only for US indices. (provider: cboe) + tick_period : Optional[str] + The period of the index ticks. Valid only for US indices. (provider: cboe) + stock_exchange : Optional[str] Stock exchange where the index is listed. (provider: fmp) - exchange_short_name : Optional[Union[str]] + exchange_short_name : Optional[str] Short name of the stock exchange where the index is listed. (provider: fmp) - """ # noqa: E501 + code : Optional[str] + ID code for keying the index in the OpenBB Terminal. (provider: yfinance)""" # noqa: E501 inputs = filter_inputs( provider_choices={ @@ -80,13 +115,13 @@ class ROUTER_economy(Container): @validate_call def const( self, - index: typing_extensions.Annotated[ + index: Annotated[ Literal["nasdaq", "sp500", "dowjones"], OpenBBCustomParameter( description="Index for which we want to fetch the constituents." ), ] = "dowjones", - provider: Union[Literal["fmp"], None] = None, + provider: Optional[Literal["fmp"]] = None, **kwargs ) -> OBBject[List[Data]]: """Get the constituents of an index. @@ -95,7 +130,7 @@ class ROUTER_economy(Container): ---------- index : Literal['nasdaq', 'sp500', 'dowjones'] Index for which we want to fetch the constituents. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. @@ -103,9 +138,9 @@ class ROUTER_economy(Container): Returns ------- OBBject - results : Union[List[MajorIndicesConstituents]] + results : List[MajorIndicesConstituents] Serializable results. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -122,9 +157,9 @@ class ROUTER_economy(Container): Name of the constituent company in the index. sector : str Sector the constituent company in the index belongs to. - sub_sector : Optional[Union[str]] + sub_sector : Optional[str] Sub-sector the constituent company in the index belongs to. - headquarter : Optional[Union[str]] + headquarter : Optional[str] Location of the headquarter of the constituent company in the index. date_first_added : Optional[Union[date, str]] Date the constituent company was added to the index. @@ -148,10 +183,164 @@ class ROUTER_economy(Container): **inputs, ) + @validate_call + def cot( + self, provider: Optional[Literal["quandl"]] = None, **kwargs + ) -> OBBject[List[Data]]: + """Lookup Commitment of Traders Reports by series ID. + + Parameters + ---------- + provider : Optional[Literal['quandl']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'quandl' if there is + no default. + code : str + + CFTC series code. Use search_cot() to find the code. + Codes not listed in the curated list, but are published by on the Nasdaq Data Link website, are valid. + Certain symbols, such as "ES=F", or exact names are also valid. + Default report is: S&P 500 Consolidated (CME)) + (provider: quandl) + data_type : Optional[Literal['F', 'FO', 'CITS']] + + The type of data to reuturn. Default is "FO". + + F = Futures only + + FO = Futures and Options + + CITS = Commodity Index Trader Supplemental. Only valid for commodities. + (provider: quandl) + legacy_format : Optional[bool] + Returns the legacy format of report. Default is False. (provider: quandl) + report_type : Optional[Literal['ALL', 'CHG', 'OLD', 'OTR']] + + The type of report to return. Default is "ALL". + + ALL = All + + CHG = Change in Positions + + OLD = Old Crop Years + + OTR = Other Crop Years + (provider: quandl) + measure : Optional[Literal['CR', 'NT', 'OI', 'CHG']] + + The measure to return. Default is None. + + CR = Concentration Ratios + + NT = Number of Traders + + OI = Percent of Open Interest + + CHG = Change in Positions. Only valid when data_type is "CITS". + (provider: quandl) + start_date : Optional[datetime.date] + The start date of the time series. Defaults to all. (provider: quandl) + end_date : Optional[datetime.date] + The end date of the time series. Defaults to the most recent data. (provider: quandl) + transform : Optional[Literal['diff', 'rdiff', 'cumul', 'normalize']] + Transform the data as w/w difference, percent change, cumulative, or normalize. (provider: quandl) + + Returns + ------- + OBBject + results : List[COT] + Serializable results. + provider : Optional[Literal['quandl']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + COT + ---""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={}, + extra_params=kwargs, + ) + + return self._run( + "/economy/cot", + **inputs, + ) + + @validate_call + def cot_search( + self, + query: Annotated[str, OpenBBCustomParameter(description="Search query.")] = "", + provider: Optional[Literal["quandl"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Fuzzy search and list of curated Commitment of Traders Reports series information. + + Parameters + ---------- + query : str + Search query. + provider : Optional[Literal['quandl']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'quandl' if there is + no default. + + Returns + ------- + OBBject + results : List[COTSearch] + Serializable results. + provider : Optional[Literal['quandl']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + COTSearch + --------- + code : str + CFTC Code of the report. + name : str + Name of the underlying asset. + category : Optional[str] + Category of the underlying asset. + subcategory : Optional[str] + Subcategory of the underlying asset. + units : Optional[str] + The units for one contract. + symbol : Optional[str] + Trading symbol representing the underlying asset.""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "query": query, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/cot_search", + **inputs, + ) + @validate_call def cpi( self, - countries: typing_extensions.Annotated[ + countries: Annotated[ List[ Literal[ "australia", @@ -207,33 +396,33 @@ class ROUTER_economy(Container): ], OpenBBCustomParameter(description="The country or countries to get data."), ], - units: typing_extensions.Annotated[ + units: Annotated[ Literal["growth_previous", "growth_same", "index_2015"], OpenBBCustomParameter(description="The data units."), ] = "growth_same", - frequency: typing_extensions.Annotated[ + frequency: Annotated[ Literal["monthly", "quarter", "annual"], OpenBBCustomParameter(description="The data time frequency."), ] = "monthly", - harmonized: typing_extensions.Annotated[ + harmonized: Annotated[ bool, OpenBBCustomParameter( description="Whether you wish to obtain harmonized data." ), ] = False, - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fred"], None] = None, + provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """CPI. @@ -248,11 +437,11 @@ class ROUTER_economy(Container): The data time frequency. harmonized : bool Whether you wish to obtain harmonized data. - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -260,9 +449,9 @@ class ROUTER_economy(Container): Returns ------- OBBject - results : Union[List[CPI]] + results : List[CPI] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -273,9 +462,9 @@ class ROUTER_economy(Container): CPI --- - date : Optional[Union[date]] + date : Optional[date] The date of the data. - value : Optional[Union[float]] + value : Optional[float] CPI value on the date.""" # noqa: E501 inputs = filter_inputs( @@ -299,29 +488,197 @@ class ROUTER_economy(Container): ) @validate_call - def fred_index( + def european_index( self, - symbol: typing_extensions.Annotated[ + symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter(description="Symbol to get data for."), ], - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - limit: typing_extensions.Annotated[ - Union[int, None], + provider: Optional[Literal["cboe"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Get historical close values for select European indices. + + Parameters + ---------- + symbol : str + Symbol to get data for. + start_date : Optional[datetime.date] + Start date of the data, in YYYY-MM-DD format. + end_date : Optional[datetime.date] + End date of the data, in YYYY-MM-DD format. + provider : Optional[Literal['cboe']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'cboe' if there is + no default. + interval : Optional[Literal['1d', '1m']] + Data granularity. (provider: cboe) + + Returns + ------- + OBBject + results : List[EuropeanIndexHistorical] + Serializable results. + provider : Optional[Literal['cboe']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + EuropeanIndexHistorical + ----------------------- + date : datetime + The date of the data. + close : float + The close price of the symbol. + open : Optional[float] + Opening price for the interval. Only valid when interval is 1m. (provider: cboe) + high : Optional[float] + High price for the interval. Only valid when interval is 1m. (provider: cboe) + low : Optional[float] + Low price for the interval. Only valid when interval is 1m. (provider: cboe) + utc_datetime : Optional[datetime] + UTC datetime. Only valid when interval is 1m. (provider: cboe)""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "symbol": ",".join(symbol) if isinstance(symbol, list) else symbol, + "start_date": start_date, + "end_date": end_date, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/european_index", + **inputs, + ) + + @validate_call + def european_index_constituents( + self, + symbol: Annotated[ + Union[str, List[str]], + OpenBBCustomParameter(description="Symbol to get data for."), + ], + provider: Optional[Literal["cboe"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Get current levels for constituents of select European indices. + + Parameters + ---------- + symbol : str + Symbol to get data for. + provider : Optional[Literal['cboe']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'cboe' if there is + no default. + + Returns + ------- + OBBject + results : List[EuropeanIndexConstituents] + Serializable results. + provider : Optional[Literal['cboe']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + EuropeanIndexConstituents + ------------------------- + symbol : str + Symbol of the constituent company in the index. + price : float + Current price of the constituent company in the index. + open : float + The open price of the symbol. + high : float + The high price of the symbol. + low : float + The low price of the symbol. + close : float + The close price of the symbol. + volume : float + The volume of the symbol. + prev_close : Optional[float] + Previous closing price. (provider: cboe) + change : Optional[float] + Change in price. (provider: cboe) + change_percent : Optional[float] + Change in price as a percentage. (provider: cboe) + tick : Optional[str] + Whether the last sale was an up or down tick. (provider: cboe) + last_trade_timestamp : Optional[datetime] + Last trade timestamp for the symbol. (provider: cboe) + exchange_id : Optional[int] + The Exchange ID number. (provider: cboe) + seqno : Optional[int] + Sequence number of the last trade on the tape. (provider: cboe) + asset_type : Optional[str] + Type of asset. (provider: cboe)""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "symbol": ",".join(symbol) if isinstance(symbol, list) else symbol, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/european_index_constituents", + **inputs, + ) + + @validate_call + def fred_index( + self, + symbol: Annotated[ + Union[str, List[str]], + OpenBBCustomParameter(description="Symbol to get data for."), + ], + start_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="Start date of the data, in YYYY-MM-DD format." + ), + ] = None, + end_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="End date of the data, in YYYY-MM-DD format." + ), + ] = None, + limit: Annotated[ + Optional[int], OpenBBCustomParameter(description="The number of data entries to return."), ] = 100, - provider: Union[Literal["intrinio"], None] = None, + provider: Optional[Literal["intrinio"]] = None, **kwargs ) -> OBBject[List[Data]]: """Fred Historical. @@ -330,27 +687,27 @@ class ROUTER_economy(Container): ---------- symbol : str Symbol to get data for. - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - limit : Union[int, None] + limit : Optional[int] The number of data entries to return. - provider : Union[Literal['intrinio'], None] + provider : Optional[Literal['intrinio']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default. - next_page : Optional[Union[str]] + next_page : Optional[str] Token to get the next page of data from a previous API call. (provider: intrinio) - all_pages : Optional[Union[bool]] + all_pages : Optional[bool] Returns all pages of data from the API call at once. (provider: intrinio) Returns ------- OBBject - results : Union[List[FredHistorical]] + results : List[FredHistorical] Serializable results. - provider : Union[Literal['intrinio'], None] + provider : Optional[Literal['intrinio']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -363,7 +720,7 @@ class ROUTER_economy(Container): -------------- date : date The date of the data. - value : Optional[Union[typing_extensions.Annotated[float, Gt(gt=0)]]] + value : Optional[Annotated[float, Gt(gt=0)]] Value of the index.""" # noqa: E501 inputs = filter_inputs( @@ -385,25 +742,271 @@ class ROUTER_economy(Container): ) @validate_call - def index( + def gdpforecast( self, - symbol: typing_extensions.Annotated[ - Union[str, List[str]], - OpenBBCustomParameter(description="Symbol to get data for."), - ], - start_date: typing_extensions.Annotated[ + period: Annotated[ + Literal["quarter", "annual"], + OpenBBCustomParameter( + description="Units for nominal GDP period. Either quarter or annual." + ), + ] = "annual", + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fmp", "polygon"], None] = None, + type: Annotated[ + Literal["nominal", "real"], + OpenBBCustomParameter( + description="Type of GDP to get forecast of. Either nominal or real." + ), + ] = "real", + provider: Optional[Literal["oecd"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """GDP Data. + + Parameters + ---------- + period : Literal['quarter', 'annual'] + Units for nominal GDP period. Either quarter or annual. + start_date : Optional[datetime.date] + Start date of the data, in YYYY-MM-DD format. + end_date : Optional[datetime.date] + End date of the data, in YYYY-MM-DD format. + type : Literal['nominal', 'real'] + Type of GDP to get forecast of. Either nominal or real. + provider : Optional[Literal['oecd']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'oecd' if there is + no default. + country : Literal['argentina', 'asia', 'australia', 'austria', 'belgium', 'brazil', 'bulgaria', 'canada', 'chile', 'china', 'colombia', 'costa_rica', 'croatia', 'czech_republic', 'denmark', 'estonia', 'euro_area_17', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'india', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'non-oecd', 'norway', 'oecd_total', 'peru', 'poland', 'portugal', 'romania', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'world'] + Country to get GDP for. (provider: oecd) + + Returns + ------- + OBBject + results : List[GDPForecast] + Serializable results. + provider : Optional[Literal['oecd']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + GDPForecast + ----------- + date : Optional[date] + The date of the data. + value : Optional[float] + Nominal GDP value on the date.""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "period": period, + "start_date": start_date, + "end_date": end_date, + "type": type, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/gdpforecast", + **inputs, + ) + + @validate_call + def gdpnom( + self, + units: Annotated[ + Literal["usd", "usd_cap"], + OpenBBCustomParameter( + description="Units to get nominal GDP in. Either usd or usd_cap indicating per capita." + ), + ] = "usd", + start_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="Start date of the data, in YYYY-MM-DD format." + ), + ] = None, + end_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="End date of the data, in YYYY-MM-DD format." + ), + ] = None, + provider: Optional[Literal["oecd"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """GDP Data. + + Parameters + ---------- + units : Literal['usd', 'usd_cap'] + Units to get nominal GDP in. Either usd or usd_cap indicating per capita. + start_date : Optional[datetime.date] + Start date of the data, in YYYY-MM-DD format. + end_date : Optional[datetime.date] + End date of the data, in YYYY-MM-DD format. + provider : Optional[Literal['oecd']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'oecd' if there is + no default. + country : Literal['australia', 'austria', 'belgium', 'brazil', 'canada', 'chile', 'colombia', 'costa_rica', 'czech_republic', 'denmark', 'estonia', 'euro_area', 'european_union', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'poland', 'portugal', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states'] + Country to get GDP for. (provider: oecd) + + Returns + ------- + OBBject + results : List[GDPNom] + Serializable results. + provider : Optional[Literal['oecd']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + GDPNom + ------ + date : Optional[date] + The date of the data. + value : Optional[float] + Nominal GDP value on the date.""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "units": units, + "start_date": start_date, + "end_date": end_date, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/gdpnom", + **inputs, + ) + + @validate_call + def gdpreal( + self, + units: Annotated[ + Literal["idx", "qoq", "yoy"], + OpenBBCustomParameter( + description="Units to get real GDP in. Either idx (indicating 2015=100), qoq (previous period) or yoy (same period, previous year).)" + ), + ] = "yoy", + start_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="Start date of the data, in YYYY-MM-DD format." + ), + ] = None, + end_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="End date of the data, in YYYY-MM-DD format." + ), + ] = None, + provider: Optional[Literal["oecd"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """GDP Data. + + Parameters + ---------- + units : Literal['idx', 'qoq', 'yoy'] + Units to get real GDP in. Either idx (indicating 2015=100), qoq (previous period) or yoy (same period, previous year).) + start_date : Optional[datetime.date] + Start date of the data, in YYYY-MM-DD format. + end_date : Optional[datetime.date] + End date of the data, in YYYY-MM-DD format. + provider : Optional[Literal['oecd']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'oecd' if there is + no default. + country : Literal['G20', 'G7', 'argentina', 'australia', 'austria', 'belgium', 'brazil', 'bulgaria', 'canada', 'chile', 'china', 'colombia', 'costa_rica', 'croatia', 'czech_republic', 'denmark', 'estonia', 'euro_area_19', 'europe', 'european_union_27', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'india', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'oecd_total', 'poland', 'portugal', 'romania', 'russia', 'saudi_arabia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states'] + Country to get GDP for. (provider: oecd) + + Returns + ------- + OBBject + results : List[GDPReal] + Serializable results. + provider : Optional[Literal['oecd']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + GDPReal + ------- + date : Optional[date] + The date of the data. + value : Optional[float] + Nominal GDP value on the date.""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "units": units, + "start_date": start_date, + "end_date": end_date, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/gdpreal", + **inputs, + ) + + @validate_call + def index( + self, + symbol: Annotated[ + Union[str, List[str]], + OpenBBCustomParameter(description="Symbol to get data for."), + ], + start_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="Start date of the data, in YYYY-MM-DD format." + ), + ] = None, + end_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="End date of the data, in YYYY-MM-DD format." + ), + ] = None, + provider: Optional[Literal["cboe", "fmp", "polygon", "yfinance"]] = None, **kwargs ) -> OBBject[List[Data]]: """Get historical levels for an index. @@ -412,18 +1015,18 @@ class ROUTER_economy(Container): ---------- symbol : str Symbol to get data for. - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fmp', 'polygon'], None] + provider : Optional[Literal['cboe', 'fmp', 'polygon', 'yfinance']] The provider to use for the query, by default None. - If None, the provider specified in defaults is selected or 'fmp' if there is + If None, the provider specified in defaults is selected or 'cboe' if there is no default. - timeseries : Optional[Union[typing_extensions.Annotated[int, Ge(ge=0)]]] + interval : Optional[Union[Literal['1d', '1m'], Literal['1min', '5min', '15min', '30min', '1hour', '4hour', '1day'], Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']]] + Use interval, 1m, for intraday prices during the most recent trading period. (provider: cboe); Data granularity. (provider: fmp); Data granularity. (provider: yfinance) + timeseries : Optional[Annotated[int, Ge(ge=0)]] Number of days to look back. (provider: fmp) - interval : Literal['1min', '5min', '15min', '30min', '1hour', '4hour', '1day'] - Data granularity. (provider: fmp) timespan : Literal['minute', 'hour', 'day', 'week', 'month', 'quarter', 'year'] Timespan of the data. (provider: polygon) sort : Literal['asc', 'desc'] @@ -434,13 +1037,19 @@ class ROUTER_economy(Container): Whether the data is adjusted. (provider: polygon) multiplier : int Multiplier of the timespan. (provider: polygon) + period : Optional[Literal['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']] + Period of the data to return. (provider: yfinance) + prepost : bool + Include Pre and Post market data. (provider: yfinance) + rounding : bool + Round prices to two decimals? (provider: yfinance) Returns ------- OBBject - results : Union[List[MajorIndicesHistorical]] + results : List[MajorIndicesHistorical] Serializable results. - provider : Union[Literal['fmp', 'polygon'], None] + provider : Optional[Literal['cboe', 'fmp', 'polygon', 'yfinance']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -463,19 +1072,25 @@ class ROUTER_economy(Container): The close price of the symbol. volume : Optional[int] The volume of the symbol. - adj_close : Optional[Union[float]] + calls_volume : Optional[float] + Number of calls traded during the most recent trading period. Only valid if interval is 1m. (provider: cboe) + puts_volume : Optional[float] + Number of puts traded during the most recent trading period. Only valid if interval is 1m. (provider: cboe) + total_options_volume : Optional[float] + Total number of options traded during the most recent trading period. Only valid if interval is 1m. (provider: cboe) + adj_close : Optional[float] Adjusted Close Price of the symbol. (provider: fmp) - unadjusted_volume : Optional[Union[float]] + unadjusted_volume : Optional[float] Unadjusted volume of the symbol. (provider: fmp) - change : Optional[Union[float]] + change : Optional[float] Change in the price of the symbol from the previous day. (provider: fmp) - change_percent : Optional[Union[float]] + change_percent : Optional[float] Change % in the price of the symbol. (provider: fmp) - label : Optional[Union[str]] + label : Optional[str] Human readable format of the date. (provider: fmp) - change_over_time : Optional[Union[float]] + change_over_time : Optional[float] Change % in the price of the symbol over a period of time. (provider: fmp) - transactions : Optional[Union[typing_extensions.Annotated[int, Gt(gt=0)]]] + transactions : Optional[Annotated[int, Gt(gt=0)]] Number of transactions for the symbol in the time period. (provider: polygon) """ # noqa: E501 @@ -496,15 +1111,181 @@ class ROUTER_economy(Container): **inputs, ) + @validate_call + def index_search( + self, + query: Annotated[str, OpenBBCustomParameter(description="Search query.")] = "", + symbol: Annotated[ + Union[bool, List[str]], + OpenBBCustomParameter(description="Whether to search by ticker symbol."), + ] = False, + provider: Optional[Literal["cboe"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Search for indices. + + Parameters + ---------- + query : str + Search query. + symbol : bool + Whether to search by ticker symbol. + provider : Optional[Literal['cboe']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'cboe' if there is + no default. + europe : bool + Filter for European indices. False for US indices. (provider: cboe) + + Returns + ------- + OBBject + results : List[IndexSearch] + Serializable results. + provider : Optional[Literal['cboe']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + IndexSearch + ----------- + symbol : str + Symbol of the index. + name : str + Name of the index. + isin : Optional[str] + ISIN code for the index. Valid only for European indices. (provider: cboe) + region : Optional[str] + Region for the index. Valid only for European indices (provider: cboe) + description : Optional[str] + Description for the index. (provider: cboe) + data_delay : Optional[int] + Data delay for the index. Valid only for US indices. (provider: cboe) + currency : Optional[str] + Currency for the index. (provider: cboe) + time_zone : Optional[str] + Time zone for the index. Valid only for US indices. (provider: cboe) + open_time : Optional[datetime.time] + Opening time for the index. Valid only for US indices. (provider: cboe) + close_time : Optional[datetime.time] + Closing time for the index. Valid only for US indices. (provider: cboe) + tick_days : Optional[str] + The trading days for the index. Valid only for US indices. (provider: cboe) + tick_frequency : Optional[str] + Tick frequency for the index. Valid only for US indices. (provider: cboe) + tick_period : Optional[str] + Tick period for the index. Valid only for US indices. (provider: cboe)""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "query": query, + "symbol": ",".join(symbol) if isinstance(symbol, list) else symbol, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/index_search", + **inputs, + ) + + @validate_call + def index_snapshots( + self, + region: Annotated[ + Optional[Literal["US", "EU"]], + OpenBBCustomParameter( + description="The region to return. Currently supports US and EU." + ), + ] = "US", + provider: Optional[Literal["cboe"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Get current levels for all indices from a provider. + + Parameters + ---------- + region : Optional[Literal['US', 'EU']] + The region to return. Currently supports US and EU. + provider : Optional[Literal['cboe']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'cboe' if there is + no default. + + Returns + ------- + OBBject + results : List[IndexSnapshots] + Serializable results. + provider : Optional[Literal['cboe']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + IndexSnapshots + -------------- + symbol : str + Symbol of the index. + name : Optional[str] + Name of the index. + currency : Optional[str] + Currency of the index. + price : Optional[float] + Current price of the index. + open : Optional[float] + Opening price of the index. + high : Optional[float] + Highest price of the index. + low : Optional[float] + Lowest price of the index. + close : Optional[float] + Closing price of the index. + prev_close : Optional[float] + Previous closing price of the index. + change : Optional[float] + Change of the index. + change_percent : Optional[float] + Change percent of the index. + isin : Optional[str] + ISIN code for the index. Valid only for European indices. (provider: cboe) + last_trade_timestamp : Optional[datetime] + Last trade timestamp for the index. (provider: cboe)""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "region": region, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/index_snapshots", + **inputs, + ) + @validate_call def risk( - self, provider: Union[Literal["fmp"], None] = None, **kwargs + self, provider: Optional[Literal["fmp"]] = None, **kwargs ) -> OBBject[List[Data]]: """Market Risk Premium. Parameters ---------- - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. @@ -512,9 +1293,9 @@ class ROUTER_economy(Container): Returns ------- OBBject - results : Union[List[RiskPremium]] + results : List[RiskPremium] Serializable results. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -527,11 +1308,11 @@ class ROUTER_economy(Container): ----------- country : str Market country. - continent : Optional[Union[str]] + continent : Optional[str] Continent of the country. - total_equity_risk_premium : Optional[Union[typing_extensions.Annotated[float, Gt(gt=0)]]] + total_equity_risk_premium : Optional[Annotated[float, Gt(gt=0)]] Total equity risk premium for the country. - country_risk_premium : Optional[Union[typing_extensions.Annotated[float, Ge(ge=0)]]] + country_risk_premium : Optional[Annotated[float, Ge(ge=0)]] Country-specific risk premium.""" # noqa: E501 inputs = filter_inputs( @@ -546,3 +1327,133 @@ class ROUTER_economy(Container): "/economy/risk", **inputs, ) + + @validate_call + def sp500_multiples( + self, + series_name: Annotated[ + Literal[ + "Shiller PE Ratio by Month", + "Shiller PE Ratio by Year", + "PE Ratio by Year", + "PE Ratio by Month", + "Dividend by Year", + "Dividend by Month", + "Dividend Growth by Quarter", + "Dividend Growth by Year", + "Dividend Yield by Year", + "Dividend Yield by Month", + "Earnings by Year", + "Earnings by Month", + "Earnings Growth by Year", + "Earnings Growth by Quarter", + "Real Earnings Growth by Year", + "Real Earnings Growth by Quarter", + "Earnings Yield by Year", + "Earnings Yield by Month", + "Real Price by Year", + "Real Price by Month", + "Inflation Adjusted Price by Year", + "Inflation Adjusted Price by Month", + "Sales by Year", + "Sales by Quarter", + "Sales Growth by Year", + "Sales Growth by Quarter", + "Real Sales by Year", + "Real Sales by Quarter", + "Real Sales Growth by Year", + "Real Sales Growth by Quarter", + "Price to Sales Ratio by Year", + "Price to Sales Ratio by Quarter", + "Price to Book Value Ratio by Year", + "Price to Book Value Ratio by Quarter", + "Book Value per Share by Year", + "Book Value per Share by Quarter", + ], + OpenBBCustomParameter( + description="The name of the series. Defaults to 'PE Ratio by Month'." + ), + ] = "PE Ratio by Month", + start_date: Annotated[ + Optional[str], + OpenBBCustomParameter( + description="The start date of the time series. Format: YYYY-MM-DD" + ), + ] = "", + end_date: Annotated[ + Optional[str], + OpenBBCustomParameter( + description="The end date of the time series. Format: YYYY-MM-DD" + ), + ] = "", + collapse: Annotated[ + Optional[Literal["daily", "weekly", "monthly", "quarterly", "annual"]], + OpenBBCustomParameter( + description="Collapse the frequency of the time series." + ), + ] = "monthly", + transform: Annotated[ + Optional[Literal["diff", "rdiff", "cumul", "normalize"]], + OpenBBCustomParameter(description="The transformation of the time series."), + ] = None, + provider: Optional[Literal["quandl"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Historical S&P 500 multiples and Shiller PE ratios. + + Parameters + ---------- + series_name : Literal['Shiller PE Ratio by Month', 'Shiller PE Ratio by Year', 'PE Rat... + The name of the series. Defaults to 'PE Ratio by Month'. + start_date : Optional[str] + The start date of the time series. Format: YYYY-MM-DD + end_date : Optional[str] + The end date of the time series. Format: YYYY-MM-DD + collapse : Optional[Literal['daily', 'weekly', 'monthly', 'quarterly', 'annu... + Collapse the frequency of the time series. + transform : Optional[Literal['diff', 'rdiff', 'cumul', 'normalize']] + The transformation of the time series. + provider : Optional[Literal['quandl']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'quandl' if there is + no default. + + Returns + ------- + OBBject + results : List[SP500Multiples] + Serializable results. + provider : Optional[Literal['quandl']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + SP500Multiples + -------------- + date : str + The date data for the time series. + value : float + The data value for the time series.""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "series_name": series_name, + "start_date": start_date, + "end_date": end_date, + "collapse": collapse, + "transform": transform, + }, + extra_params=kwargs, + ) + + return self._run( + "/economy/sp500_multiples", + **inputs, + ) diff --git a/openbb_platform/openbb/package/extension_map.json b/openbb_platform/openbb/package/extension_map.json index bd468205a5d..23a5db8b678 100644 --- a/openbb_platform/openbb/package/extension_map.json +++ b/openbb_platform/openbb/package/extension_map.json @@ -1,17 +1,27 @@ { "openbb_core_extension": [ "crypto@0.1.0a2", + "econometrics@0.1.0a2", "economy@0.1.0a2", "fixedincome@0.1.0a2", "forex@0.1.0a2", + "futures@0.1.0a2", "news@0.1.0a2", - "stocks@0.1.0a2" + "openbb_charting@0.1.0a2", + "qa@0.1.0a2", + "stocks@0.1.0a2", + "ta@0.1.0a2" ], "openbb_provider_extension": [ + "alpha_vantage@0.1.0a2", "benzinga@0.1.0a2", + "cboe@0.1.0a2", "fmp@0.1.0a2", "fred@0.1.0a2", "intrinio@0.1.0a2", - "polygon@0.1.0a2" + "oecd@0.1.0a2", + "polygon@0.1.0a2", + "quandl@0.1.0a2", + "yfinance@0.1.0a2" ] } \ No newline at end of file diff --git a/openbb_platform/openbb/package/fixedincome.py b/openbb_platform/openbb/package/fixedincome.py index 863a3b30f36..04a6dc1405e 100644 --- a/openbb_platform/openbb/package/fixedincome.py +++ b/openbb_platform/openbb/package/fixedincome.py @@ -1,15 +1,15 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### import datetime -from typing import List, Literal, Union +from typing import List, Literal, Optional, Union -import typing_extensions from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_inputs from openbb_provider.abstract.data import Data from pydantic import validate_call +from typing_extensions import Annotated class ROUTER_fixedincome(Container): @@ -31,19 +31,19 @@ class ROUTER_fixedincome(Container): @validate_call def ameribor( self, - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fred"], None] = None, + provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """ @@ -53,11 +53,11 @@ class ROUTER_fixedincome(Container): Parameters ---------- - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -67,9 +67,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[AMERIBOR]] + results : List[AMERIBOR] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -82,7 +82,7 @@ class ROUTER_fixedincome(Container): -------- date : date The date of the data. - rate : Union[float] + rate : Optional[float] AMERIBOR rate.""" # noqa: E501 inputs = filter_inputs( @@ -104,19 +104,19 @@ class ROUTER_fixedincome(Container): @validate_call def estr( self, - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fred"], None] = None, + provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """ @@ -127,11 +127,11 @@ class ROUTER_fixedincome(Container): Parameters ---------- - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -141,9 +141,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[ESTR]] + results : List[ESTR] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -156,7 +156,7 @@ class ROUTER_fixedincome(Container): ---- date : date The date of the data. - rate : Union[float] + rate : Optional[float] ESTR rate.""" # noqa: E501 inputs = filter_inputs( @@ -178,19 +178,19 @@ class ROUTER_fixedincome(Container): @validate_call def fed( self, - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fred"], None] = None, + provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """ @@ -201,11 +201,11 @@ class ROUTER_fixedincome(Container): Parameters ---------- - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -215,9 +215,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[FEDFUNDS]] + results : List[FEDFUNDS] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -230,7 +230,7 @@ class ROUTER_fixedincome(Container): -------- date : date The date of the data. - rate : Union[float] + rate : Optional[float] FED rate.""" # noqa: E501 inputs = filter_inputs( @@ -252,19 +252,19 @@ class ROUTER_fixedincome(Container): @validate_call def iorb( self, - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fred"], None] = None, + provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """ @@ -275,11 +275,11 @@ class ROUTER_fixedincome(Container): Parameters ---------- - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -287,9 +287,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[IORB]] + results : List[IORB] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -302,7 +302,7 @@ class ROUTER_fixedincome(Container): ---- date : date The date of the data. - rate : Union[float] + rate : Optional[float] IORB rate.""" # noqa: E501 inputs = filter_inputs( @@ -323,7 +323,7 @@ class ROUTER_fixedincome(Container): @validate_call def projections( - self, provider: Union[Literal["fred"], None] = None, **kwargs + self, provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """ Get Effective Federal Funds Rate data. A bank rate is the interest rate a nation's central bank charges to its @@ -333,7 +333,7 @@ class ROUTER_fixedincome(Container): Parameters ---------- - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -343,9 +343,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[PROJECTIONS]] + results : List[PROJECTIONS] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -358,19 +358,19 @@ class ROUTER_fixedincome(Container): ----------- date : date The date of the data. - range_high : Union[float] + range_high : Optional[float] High projection of rates. - central_tendency_high : Union[float] + central_tendency_high : Optional[float] Central tendency of high projection of rates. - median : Union[float] + median : Optional[float] Median projection of rates. - range_midpoint : Union[float] + range_midpoint : Optional[float] Midpoint projection of rates. - central_tendency_midpoint : Union[float] + central_tendency_midpoint : Optional[float] Central tendency of midpoint projection of rates. - range_low : Union[float] + range_low : Optional[float] Low projection of rates. - central_tendency_low : Union[float] + central_tendency_low : Optional[float] Central tendency of low projection of rates.""" # noqa: E501 inputs = filter_inputs( @@ -389,30 +389,30 @@ class ROUTER_fixedincome(Container): @validate_call def sofr( self, - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fred"], None] = None, + provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """Get United States yield curve. Parameters ---------- - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -422,9 +422,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[SOFR]] + results : List[SOFR] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -437,7 +437,7 @@ class ROUTER_fixedincome(Container): ---- date : date The date of the data. - rate : Union[float] + rate : Optional[float] SOFR rate.""" # noqa: E501 inputs = filter_inputs( @@ -459,19 +459,19 @@ class ROUTER_fixedincome(Container): @validate_call def sonia( self, - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fred"], None] = None, + provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """ @@ -481,11 +481,11 @@ class ROUTER_fixedincome(Container): Parameters ---------- - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -495,9 +495,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[SONIA]] + results : List[SONIA] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -510,7 +510,7 @@ class ROUTER_fixedincome(Container): ----- date : date The date of the data. - rate : Union[float] + rate : Optional[float] SONIA rate.""" # noqa: E501 inputs = filter_inputs( @@ -532,30 +532,30 @@ class ROUTER_fixedincome(Container): @validate_call def treasury( self, - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fmp"], None] = None, + provider: Optional[Literal["fmp"]] = None, **kwargs ) -> OBBject[List[Data]]: """Get treasury rates. Parameters ---------- - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. @@ -563,9 +563,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[TreasuryRates]] + results : List[TreasuryRates] Serializable results. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -622,28 +622,28 @@ class ROUTER_fixedincome(Container): @validate_call def ycrv( self, - date: typing_extensions.Annotated[ - Union[datetime.date, None], + date: Annotated[ + Optional[datetime.date], OpenBBCustomParameter( description="Date to get Yield Curve data. Defaults to the most recent FRED entry." ), ] = None, - inflation_adjusted: typing_extensions.Annotated[ - Union[bool, None], + inflation_adjusted: Annotated[ + Optional[bool], OpenBBCustomParameter(description="Get inflation adjusted rates."), ] = False, - provider: Union[Literal["fred"], None] = None, + provider: Optional[Literal["fred"]] = None, **kwargs ) -> OBBject[List[Data]]: """Get United States yield curve. Parameters ---------- - date : Union[datetime.date, None] + date : Optional[datetime.date] Date to get Yield Curve data. Defaults to the most recent FRED entry. - inflation_adjusted : Union[bool, None] + inflation_adjusted : Optional[bool] Get inflation adjusted rates. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default. @@ -651,9 +651,9 @@ class ROUTER_fixedincome(Container): Returns ------- OBBject - results : Union[List[USYieldCurve]] + results : List[USYieldCurve] Serializable results. - provider : Union[Literal['fred'], None] + provider : Optional[Literal['fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. diff --git a/openbb_platform/openbb/package/forex.py b/openbb_platform/openbb/package/forex.py index 4dacfd8e951..a012c098c96 100644 --- a/openbb_platform/openbb/package/forex.py +++ b/openbb_platform/openbb/package/forex.py @@ -1,15 +1,15 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### import datetime -from typing import List, Literal, Union +from typing import List, Literal, Optional, Union -import typing_extensions from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_inputs from openbb_provider.abstract.data import Data from pydantic import validate_call +from typing_extensions import Annotated class ROUTER_forex(Container): @@ -24,23 +24,23 @@ class ROUTER_forex(Container): @validate_call def load( self, - symbol: typing_extensions.Annotated[ + symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter(description="Symbol to get data for."), ], - start_date: typing_extensions.Annotated[ + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fmp", "polygon"], None] = None, + provider: Optional[Literal["fmp", "polygon", "yfinance"]] = None, **kwargs ) -> OBBject[List[Data]]: """Forex Intraday Price. @@ -49,16 +49,16 @@ class ROUTER_forex(Container): ---------- symbol : str Symbol to get data for. - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fmp', 'polygon'], None] + provider : Optional[Literal['fmp', 'polygon', 'yfinance']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. - interval : Literal['1min', '5min', '15min', '30min', '1hour', '4hour', '1day'] - Data granularity. (provider: fmp) + interval : Optional[Union[Literal['1min', '5min', '15min', '30min', '1hour', '4hour', '1day'], Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']]] + Data granularity. (provider: fmp, yfinance) multiplier : int Multiplier of the timespan. (provider: polygon) timespan : Literal['minute', 'hour', 'day', 'week', 'month', 'quarter', 'year'] @@ -69,13 +69,15 @@ class ROUTER_forex(Container): The number of data entries to return. (provider: polygon) adjusted : bool Whether the data is adjusted. (provider: polygon) + period : Optional[Literal['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']] + Period of the data to return. (provider: yfinance) Returns ------- OBBject - results : Union[List[ForexHistorical]] + results : List[ForexHistorical] Serializable results. - provider : Union[Literal['fmp', 'polygon'], None] + provider : Optional[Literal['fmp', 'polygon', 'yfinance']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -98,21 +100,21 @@ class ROUTER_forex(Container): The close price of the symbol. volume : float The volume of the symbol. - vwap : Optional[Union[typing_extensions.Annotated[float, Gt(gt=0)]]] + vwap : Optional[Annotated[float, Gt(gt=0)]] Volume Weighted Average Price of the symbol. - adj_close : Optional[Union[float]] + adj_close : Optional[float] Adjusted Close Price of the symbol. (provider: fmp) - unadjusted_volume : Optional[Union[float]] + unadjusted_volume : Optional[float] Unadjusted volume of the symbol. (provider: fmp) - change : Optional[Union[float]] + change : Optional[float] Change in the price of the symbol from the previous day. (provider: fmp) - change_percent : Optional[Union[float]] + change_percent : Optional[float] Change % in the price of the symbol. (provider: fmp) - label : Optional[Union[str]] + label : Optional[str] Human readable format of the date. (provider: fmp) - change_over_time : Optional[Union[float]] + change_over_time : Optional[float] Change % in the price of the symbol over a period of time. (provider: fmp) - transactions : Optional[Union[typing_extensions.Annotated[int, Gt(gt=0)]]] + transactions : Optional[Annotated[int, Gt(gt=0)]] Number of transactions for the symbol in the time period. (provider: polygon) """ # noqa: E501 @@ -135,39 +137,37 @@ class ROUTER_forex(Container): @validate_call def pairs( - self, - provider: Union[Literal["fmp", "intrinio", "polygon"], None] = None, - **kwargs + self, provider: Optional[Literal["fmp", "intrinio", "polygon"]] = None, **kwargs ) -> OBBject[List[Data]]: """Forex Available Pairs. Parameters ---------- - provider : Union[Literal['fmp', 'intrinio', 'polygon'], None] + provider : Optional[Literal['fmp', 'intrinio', 'polygon']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. - symbol : Optional[Union[str]] + symbol : Optional[str] Symbol of the pair to search. (provider: polygon) - date : Optional[Union[datetime.date]] + date : Optional[datetime.date] A specific date to get data for. (provider: polygon) - search : Optional[Union[str]] + search : Optional[str] Search for terms within the ticker and/or company name. (provider: polygon) - active : Optional[Union[bool]] + active : Optional[bool] Specify if the tickers returned should be actively traded on the queried date. (provider: polygon) - order : Optional[Union[Literal['asc', 'desc']]] + order : Optional[Literal['asc', 'desc']] Order data by ascending or descending. (provider: polygon) - sort : Optional[Union[Literal['ticker', 'name', 'market', 'locale', 'currency_symbol', 'currency_name', 'base_currency_symbol', 'base_currency_name', 'last_updated_utc', 'delisted_utc']]] + sort : Optional[Literal['ticker', 'name', 'market', 'locale', 'currency_symbol', 'currency_name', 'base_currency_symbol', 'base_currency_name', 'last_updated_utc', 'delisted_utc']] Sort field used for ordering. (provider: polygon) - limit : Optional[Union[typing_extensions.Annotated[int, Gt(gt=0)]]] + limit : Optional[Annotated[int, Gt(gt=0)]] The number of data entries to return. (provider: polygon) Returns ------- OBBject - results : Union[List[ForexPairs]] + results : List[ForexPairs] Serializable results. - provider : Union[Literal['fmp', 'intrinio', 'polygon'], None] + provider : Optional[Literal['fmp', 'intrinio', 'polygon']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -180,35 +180,35 @@ class ROUTER_forex(Container): ---------- name : str Name of the currency pair. - symbol : Optional[Union[str]] + symbol : Optional[str] Symbol of the currency pair. (provider: fmp) - currency : Optional[Union[str]] + currency : Optional[str] Base currency of the currency pair. (provider: fmp) - stock_exchange : Optional[Union[str]] + stock_exchange : Optional[str] Stock exchange of the currency pair. (provider: fmp) - exchange_short_name : Optional[Union[str]] + exchange_short_name : Optional[str] Short name of the stock exchange of the currency pair. (provider: fmp) - code : Optional[Union[str]] + code : Optional[str] Code of the currency pair. (provider: intrinio) - base_currency : Optional[Union[str]] + base_currency : Optional[str] ISO 4217 currency code of the base currency. (provider: intrinio) - quote_currency : Optional[Union[str]] + quote_currency : Optional[str] ISO 4217 currency code of the quote currency. (provider: intrinio) - market : Optional[Union[str]] + market : Optional[str] Name of the trading market. Always 'fx'. (provider: polygon) - locale : Optional[Union[str]] + locale : Optional[str] Locale of the currency pair. (provider: polygon) - currency_symbol : Optional[Union[str]] + currency_symbol : Optional[str] The symbol of the quote currency. (provider: polygon) - currency_name : Optional[Union[str]] + currency_name : Optional[str] Name of the quote currency. (provider: polygon) - base_currency_symbol : Optional[Union[str]] + base_currency_symbol : Optional[str] The symbol of the base currency. (provider: polygon) - base_currency_name : Optional[Union[str]] + base_currency_name : Optional[str] Name of the base currency. (provider: polygon) - last_updated_utc : Optional[Union[datetime]] + last_updated_utc : Optional[datetime] The last updated timestamp in UTC. (provider: polygon) - delisted_utc : Optional[Union[datetime]] + delisted_utc : Optional[datetime] The delisted timestamp in UTC. (provider: polygon)""" # noqa: E501 inputs = filter_inputs( diff --git a/openbb_platform/openbb/package/futures.py b/openbb_platform/openbb/package/futures.py new file mode 100644 index 00000000000..c78d355cce4 --- /dev/null +++ b/openbb_platform/openbb/package/futures.py @@ -0,0 +1,188 @@ +### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### + +import datetime +from typing import List, Literal, Optional, Union + +from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import OBBject +from openbb_core.app.static.container import Container +from openbb_core.app.static.filters import filter_inputs +from openbb_provider.abstract.data import Data +from pydantic import validate_call +from typing_extensions import Annotated + + +class ROUTER_futures(Container): + """/futures + curve + load + """ + + def __repr__(self) -> str: + return self.__doc__ or "" + + @validate_call + def curve( + self, + symbol: Annotated[ + Union[str, List[str]], + OpenBBCustomParameter(description="Symbol to get data for."), + ], + date: Annotated[ + Optional[datetime.date], + OpenBBCustomParameter(description="Historical date to search curve for."), + ] = None, + provider: Optional[Literal["cboe", "yfinance"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Futures Historical Price. + + Parameters + ---------- + symbol : str + Symbol to get data for. + date : Optional[datetime.date] + Historical date to search curve for. + provider : Optional[Literal['cboe', 'yfinance']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'cboe' if there is + no default. + + Returns + ------- + OBBject + results : List[FuturesCurve] + Serializable results. + provider : Optional[Literal['cboe', 'yfinance']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + FuturesCurve + ------------ + expiration : str + Futures expiration month. + price : Optional[float] + The close price of the symbol. + symbol : Optional[str] + The trading symbol for the tenor of future. (provider: cboe)""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "symbol": ",".join(symbol) if isinstance(symbol, list) else symbol, + "date": date, + }, + extra_params=kwargs, + ) + + return self._run( + "/futures/curve", + **inputs, + ) + + @validate_call + def load( + self, + symbol: Annotated[ + Union[str, List[str]], + OpenBBCustomParameter(description="Symbol to get data for."), + ], + start_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="Start date of the data, in YYYY-MM-DD format." + ), + ] = None, + end_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="End date of the data, in YYYY-MM-DD format." + ), + ] = None, + expiration: Annotated[ + Optional[str], + OpenBBCustomParameter(description="Future expiry date with format YYYY-MM"), + ] = None, + provider: Optional[Literal["yfinance"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Futures Historical Price. + + Parameters + ---------- + symbol : str + Symbol to get data for. + start_date : Optional[datetime.date] + Start date of the data, in YYYY-MM-DD format. + end_date : Optional[datetime.date] + End date of the data, in YYYY-MM-DD format. + expiration : Optional[str] + Future expiry date with format YYYY-MM + provider : Optional[Literal['yfinance']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'yfinance' if there is + no default. + interval : Optional[Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']] + Data granularity. (provider: yfinance) + period : Optional[Literal['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']] + Period of the data to return. (provider: yfinance) + prepost : bool + Include Pre and Post market data. (provider: yfinance) + adjust : bool + Adjust all the data automatically. (provider: yfinance) + back_adjust : bool + Back-adjusted data to mimic true historical prices. (provider: yfinance) + + Returns + ------- + OBBject + results : List[FuturesHistorical] + Serializable results. + provider : Optional[Literal['yfinance']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + FuturesHistorical + ----------------- + date : datetime + The date of the data. + open : float + The open price of the symbol. + high : float + The high price of the symbol. + low : float + The low price of the symbol. + close : float + The close price of the symbol. + volume : float + The volume of the symbol.""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "symbol": ",".join(symbol) if isinstance(symbol, list) else symbol, + "start_date": start_date, + "end_date": end_date, + "expiration": expiration, + }, + extra_params=kwargs, + ) + + return self._run( + "/futures/load", + **inputs, + ) diff --git a/openbb_platform/openbb/package/module_map.json b/openbb_platform/openbb/package/module_map.json index 75ffa6356ba..e9fe2e1a4aa 100644 --- a/openbb_platform/openbb/package/module_map.json +++ b/openbb_platform/openbb/package/module_map.json @@ -2,13 +2,38 @@ "__extensions__": "", "crypto": "/crypto", "crypto_load": "/crypto/load", + "econometrics": "/econometrics", + "econometrics_bgot": "/econometrics/bgot", + "econometrics_coint": "/econometrics/coint", + "econometrics_corr": "/econometrics/corr", + "econometrics_dwat": "/econometrics/dwat", + "econometrics_granger": "/econometrics/granger", + "econometrics_ols": "/econometrics/ols", + "econometrics_ols_summary": "/econometrics/ols_summary", + "econometrics_panelbols": "/econometrics/panelbols", + "econometrics_panelfd": "/econometrics/panelfd", + "econometrics_panelfmac": "/econometrics/panelfmac", + "econometrics_panelols": "/econometrics/panelols", + "econometrics_panelpols": "/econometrics/panelpols", + "econometrics_panelre": "/econometrics/panelre", + "econometrics_unitroot": "/econometrics/unitroot", "economy": "/economy", "economy_available_indices": "/economy/available_indices", "economy_const": "/economy/const", + "economy_cot": "/economy/cot", + "economy_cot_search": "/economy/cot_search", "economy_cpi": "/economy/cpi", + "economy_european_index": "/economy/european_index", + "economy_european_index_constituents": "/economy/european_index_constituents", "economy_fred_index": "/economy/fred_index", + "economy_gdpforecast": "/economy/gdpforecast", + "economy_gdpnom": "/economy/gdpnom", + "economy_gdpreal": "/economy/gdpreal", "economy_index": "/economy/index", + "economy_index_search": "/economy/index_search", + "economy_index_snapshots": "/economy/index_snapshots", "economy_risk": "/economy/risk", + "economy_sp500_multiples": "/economy/sp500_multiples", "fixedincome": "/fixedincome", "fixedincome_ameribor": "/fixedincome/ameribor", "fixedincome_estr": "/fixedincome/estr", @@ -22,8 +47,22 @@ "forex": "/forex", "forex_load": "/forex/load", "forex_pairs": "/forex/pairs", + "futures": "/futures", + "futures_curve": "/futures/curve", + "futures_load": "/futures/load", "news": "/news", "news_globalnews": "/news/globalnews", + "qa": "/qa", + "qa_capm": "/qa/capm", + "qa_kurtosis": "/qa/kurtosis", + "qa_normality": "/qa/normality", + "qa_om": "/qa/om", + "qa_quantile": "/qa/quantile", + "qa_sh": "/qa/sh", + "qa_skew": "/qa/skew", + "qa_so": "/qa/so", + "qa_summary": "/qa/summary", + "qa_unitroot": "/qa/unitroot", "stocks": "/stocks", "stocks_ca": "/stocks/ca", "stocks_ca_peers": "/stocks/ca/peers", @@ -56,10 +95,39 @@ "stocks_fa_shrs": "/stocks/fa/shrs", "stocks_fa_split": "/stocks/fa/split", "stocks_fa_transcript": "/stocks/fa/transcript", + "stocks_info": "/stocks/info", "stocks_load": "/stocks/load", "stocks_multiples": "/stocks/multiples", "stocks_news": "/stocks/news", "stocks_options": "/stocks/options", "stocks_options_chains": "/stocks/options/chains", - "stocks_quote": "/stocks/quote" + "stocks_quote": "/stocks/quote", + "stocks_search": "/stocks/search", + "ta": "/ta", + "ta_ad": "/ta/ad", + "ta_adosc": "/ta/adosc", + "ta_adx": "/ta/adx", + "ta_aroon": "/ta/aroon", + "ta_atr": "/ta/atr", + "ta_bbands": "/ta/bbands", + "ta_cci": "/ta/cci", + "ta_cg": "/ta/cg", + "ta_clenow": "/ta/clenow", + "ta_cones": "/ta/cones", + "ta_demark": "/ta/demark", + "ta_donchian": "/ta/donchian", + "ta_ema": "/ta/ema", + "ta_fib": "/ta/fib", + "ta_fisher": "/ta/fisher", + "ta_hma": "/ta/hma", + "ta_ichimoku": "/ta/ichimoku", + "ta_kc": "/ta/kc", + "ta_macd": "/ta/macd", + "ta_obv": "/ta/obv", + "ta_rsi": "/ta/rsi", + "ta_sma": "/ta/sma", + "ta_stoch": "/ta/stoch", + "ta_vwap": "/ta/vwap", + "ta_wma": "/ta/wma", + "ta_zlma": "/ta/zlma" } \ No newline at end of file diff --git a/openbb_platform/openbb/package/news.py b/openbb_platform/openbb/package/news.py index 1a884d4591b..265acfa3178 100644 --- a/openbb_platform/openbb/package/news.py +++ b/openbb_platform/openbb/package/news.py @@ -1,14 +1,14 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### -from typing import List, Literal, Union +from typing import List, Literal, Optional -import typing_extensions from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_inputs from openbb_provider.abstract.data import Data from pydantic import validate_call +from typing_extensions import Annotated class ROUTER_news(Container): @@ -22,10 +22,10 @@ class ROUTER_news(Container): @validate_call def globalnews( self, - limit: typing_extensions.Annotated[ + limit: Annotated[ int, OpenBBCustomParameter(description="Number of articles to return.") ] = 20, - provider: Union[Literal["benzinga", "fmp", "intrinio"], None] = None, + provider: Optional[Literal["benzinga", "fmp", "intrinio"]] = None, **kwargs ) -> OBBject[List[Data]]: """Global News. @@ -34,45 +34,45 @@ class ROUTER_news(Container): ---------- limit : int Number of articles to return. - provider : Union[Literal['benzinga', 'fmp', 'intrinio'], None] + provider : Optional[Literal['benzinga', 'fmp', 'intrinio']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default. display : Literal['headline', 'abstract', 'full'] Specify headline only (headline), headline + teaser (abstract), or headline + full body (full). (provider: benzinga) - date : Optional[Union[str]] + date : Optional[str] Date of the news to retrieve. (provider: benzinga) - start_date : Optional[Union[str]] + start_date : Optional[str] Start date of the news to retrieve. (provider: benzinga) - end_date : Optional[Union[str]] + end_date : Optional[str] End date of the news to retrieve. (provider: benzinga) - updated_since : Optional[Union[int]] + updated_since : Optional[int] Number of seconds since the news was updated. (provider: benzinga) - published_since : Optional[Union[int]] + published_since : Optional[int] Number of seconds since the news was published. (provider: benzinga) - sort : Optional[Union[Literal['id', 'created', 'updated']]] + sort : Optional[Literal['id', 'created', 'updated']] Key to sort the news by. (provider: benzinga) - order : Optional[Union[Literal['asc', 'desc']]] + order : Optional[Literal['asc', 'desc']] Order to sort the news by. (provider: benzinga) - isin : Optional[Union[str]] + isin : Optional[str] The ISIN of the news to retrieve. (provider: benzinga) - cusip : Optional[Union[str]] + cusip : Optional[str] The CUSIP of the news to retrieve. (provider: benzinga) - channels : Optional[Union[str]] + channels : Optional[str] Channels of the news to retrieve. (provider: benzinga) - topics : Optional[Union[str]] + topics : Optional[str] Topics of the news to retrieve. (provider: benzinga) - authors : Optional[Union[str]] + authors : Optional[str] Authors of the news to retrieve. (provider: benzinga) - content_types : Optional[Union[str]] + content_types : Optional[str] Content types of the news to retrieve. (provider: benzinga) Returns ------- OBBject - results : Union[List[GlobalNews]] + results : List[GlobalNews] Serializable results. - provider : Union[Literal['benzinga', 'fmp', 'intrinio'], None] + provider : Optional[Literal['benzinga', 'fmp', 'intrinio']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -87,31 +87,31 @@ class ROUTER_news(Container): Published date of the news. title : str Title of the news. - image : Optional[Union[str]] + image : Optional[str] Image URL of the news. - text : Optional[Union[str]] + text : Optional[str] Text/body of the news. - url : Optional[Union[str]] + url : Optional[str] URL of the news. - id : Optional[Union[str]] + id : Optional[str] ID of the news. (provider: benzinga); Article ID. (provider: intrinio) - author : Optional[Union[str]] + author : Optional[str] Author of the news. (provider: benzinga) - teaser : Optional[Union[str]] + teaser : Optional[str] Teaser of the news. (provider: benzinga) - images : Optional[Union[List[Dict[str, str]]]] + images : Optional[List[Dict[str, str]]] Images associated with the news. (provider: benzinga) - channels : Optional[Union[str]] + channels : Optional[str] Channels associated with the news. (provider: benzinga) - stocks : Optional[Union[str]] + stocks : Optional[str] Stocks associated with the news. (provider: benzinga) - tags : Optional[Union[str]] + tags : Optional[str] Tags associated with the news. (provider: benzinga) - updated : Optional[Union[datetime]] + updated : Optional[datetime] None - site : Optional[Union[str]] + site : Optional[str] Site of the news. (provider: fmp) - company : Optional[Union[Dict[str, Any]]] + company : Optional[Dict[str, Any]] Company details related to the news article. (provider: intrinio)""" # noqa: E501 inputs = filter_inputs( diff --git a/openbb_platform/openbb/package/qa.py b/openbb_platform/openbb/package/qa.py new file mode 100644 index 00000000000..d582ebd779b --- /dev/null +++ b/openbb_platform/openbb/package/qa.py @@ -0,0 +1,375 @@ +### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### + +from typing import List, Literal, Union + +import pandas +from annotated_types import Ge, Gt +from openbb_core.app.model.obbject import OBBject +from openbb_core.app.static.container import Container +from openbb_core.app.static.filters import filter_inputs +from openbb_provider.abstract.data import Data +from openbb_qa.qa_models import ( + CAPMModel, + NormalityModel, + OmegaModel, + SummaryModel, + UnitRootModel, +) +from pydantic import validate_call +from typing_extensions import Annotated + + +class ROUTER_qa(Container): + """/qa + capm + kurtosis + normality + om + quantile + sh + skew + so + summary + unitroot + """ + + def __repr__(self) -> str: + return self.__doc__ or "" + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def capm( + self, data: Union[List[Data], pandas.DataFrame], target: str + ) -> OBBject[CAPMModel]: + """Capital Asset Pricing Model.""" # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + ) + + return self._run( + "/qa/capm", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def kurtosis( + self, + data: Union[List[Data], pandas.DataFrame], + target: str, + window: Annotated[int, Gt(gt=0)], + ) -> OBBject[List[Data]]: + """Kurtosis. + + Parameters + ---------- + data : List[Data] + Time series data. + target : str + Target column name. + window : PositiveInt + Window size. + + Returns + ------- + OBBject[List[Data]] + Kurtosis. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + window=window, + ) + + return self._run( + "/qa/kurtosis", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def normality( + self, data: Union[List[Data], pandas.DataFrame], target: str + ) -> OBBject[NormalityModel]: + """ + Normality Statistics. + + - **Kurtosis**: whether the kurtosis of a sample differs from the normal distribution. + - **Skewness**: whether the skewness of a sample differs from the normal distribution. + - **Jarque-Bera**: whether the sample data has the skewness and kurtosis matching a normal distribution. + - **Shapiro-Wilk**: whether a random sample comes from a normal distribution. + - **Kolmogorov-Smirnov**: whether two underlying one-dimensional probability distributions differ. + + Parameters + ---------- + data : List[Data] + Time series data. + target : str + Target column name. + + Returns + ------- + OBBject[NormalityModel] + Normality tests summary. See qa_models.NormalityModel for details. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + ) + + return self._run( + "/qa/normality", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def om( + self, + data: Union[List[Data], pandas.DataFrame], + target: str, + threshold_start: float = 0.0, + threshold_end: float = 1.5, + ) -> OBBject[List[OmegaModel]]: + """Omega Ratio. + + Parameters + ---------- + data : List[Data] + Time series data. + target : str + Target column name. + threshold_start : float, optional + Start threshold, by default 0.0 + threshold_end : float, optional + End threshold, by default 1.5 + + Returns + ------- + OBBject[List[OmegaModel]] + Omega ratios. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + threshold_start=threshold_start, + threshold_end=threshold_end, + ) + + return self._run( + "/qa/om", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def quantile( + self, + data: Union[List[Data], pandas.DataFrame], + target: str, + window: Annotated[int, Gt(gt=0)], + quantile_pct: Annotated[float, Ge(ge=0)] = 0.5, + ) -> OBBject[List[Data]]: + """Quantile.""" # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + window=window, + quantile_pct=quantile_pct, + ) + + return self._run( + "/qa/quantile", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def sh( + self, + data: Union[List[Data], pandas.DataFrame], + target: str, + rfr: float = 0.0, + window: Annotated[int, Gt(gt=0)] = 252, + ) -> OBBject[List[Data]]: + """Sharpe Ratio. + + Parameters + ---------- + data : List[Data] + Time series data. + target : str + Target column name. + rfr : float, optional + Risk-free rate, by default 0.0 + window : PositiveInt, optional + Window size, by default 252 + + Returns + ------- + OBBject[List[Data]] + Sharpe ratio. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + rfr=rfr, + window=window, + ) + + return self._run( + "/qa/sh", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def skew( + self, + data: Union[List[Data], pandas.DataFrame], + target: str, + window: Annotated[int, Gt(gt=0)], + ) -> OBBject[List[Data]]: + """Skewness. + + Parameters + ---------- + data : List[Data] + Time series data. + target : str + Target column name. + window : PositiveInt + Window size. + + Returns + ------- + OBBject[List[Data]] + Skewness. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + window=window, + ) + + return self._run( + "/qa/skew", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def so( + self, + data: Union[List[Data], pandas.DataFrame], + target: str, + target_return: float = 0.0, + window: Annotated[int, Gt(gt=0)] = 252, + adjusted: bool = False, + ) -> OBBject[List[Data]]: + """Sortino Ratio. + + For method & terminology see: http://www.redrockcapital.com/Sortino__A__Sharper__Ratio_Red_Rock_Capital.pdf + + Parameters + ---------- + data : List[Data] + Time series data. + target : str + Target column name. + target_return : float, optional + Target return, by default 0.0 + window : PositiveInt, optional + Window size, by default 252 + adjusted : bool, optional + Adjust sortino ratio to compare it to sharpe ratio, by default False + + Returns + ------- + OBBject[List[Data]] + Sortino ratio. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + target_return=target_return, + window=window, + adjusted=adjusted, + ) + + return self._run( + "/qa/so", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def summary( + self, data: Union[List[Data], pandas.DataFrame], target: str + ) -> OBBject[SummaryModel]: + """Summary. + + Parameters + ---------- + data : List[Data] + Time series data. + target : str + Target column name. + + Returns + ------- + OBBject[SummaryModel] + Summary table. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + ) + + return self._run( + "/qa/summary", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def unitroot( + self, + data: Union[List[Data], pandas.DataFrame], + target: str, + fuller_reg: Literal["c", "ct", "ctt", "nc"] = "c", + kpss_reg: Literal["c", "ct"] = "c", + ) -> OBBject[UnitRootModel]: + """Unit Root Test. + + Augmented Dickey-Fuller test for unit root. + Kwiatkowski-Phillips-Schmidt-Shin test for unit root. + + Parameters + ---------- + data : List[Data] + Time series data. + target : str + Target column name. + fuller_reg : Literal["c", "ct", "ctt", "nc", "c"] + Regression type for ADF test. + kpss_reg : Literal["c", "ct"] + Regression type for KPSS test. + + Returns + ------- + OBBject[UnitRootModel] + Unit root tests summary. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + fuller_reg=fuller_reg, + kpss_reg=kpss_reg, + ) + + return self._run( + "/qa/unitroot", + **inputs, + ) diff --git a/openbb_platform/openbb/package/stocks.py b/openbb_platform/openbb/package/stocks.py index ad7a76dcc30..a8414cfadac 100644 --- a/openbb_platform/openbb/package/stocks.py +++ b/openbb_platform/openbb/package/stocks.py @@ -1,9 +1,8 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### import datetime -from typing import List, Literal, Union +from typing import List, Literal, Optional, Union -import typing_extensions from annotated_types import Ge from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject @@ -11,17 +10,20 @@ from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_inputs from openbb_provider.abstract.data import Data from pydantic import validate_call +from typing_extensions import Annotated class ROUTER_stocks(Container): """/stocks /ca /fa + info load multiples news /options quote + search """ def __repr__(self) -> str: @@ -40,25 +42,143 @@ class ROUTER_stocks(Container): return stocks_fa.ROUTER_stocks_fa(command_runner=self._command_runner) @validate_call - def load( + def info( self, - symbol: typing_extensions.Annotated[ + symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter(description="Symbol to get data for."), ], - start_date: typing_extensions.Annotated[ + provider: Optional[Literal["cboe"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Get general price and performance metrics of a stock. + + Parameters + ---------- + symbol : str + Symbol to get data for. + provider : Optional[Literal['cboe']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'cboe' if there is + no default. + + Returns + ------- + OBBject + results : List[StockInfo] + Serializable results. + provider : Optional[Literal['cboe']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + StockInfo + --------- + symbol : str + Symbol to get data for. + name : str + Name associated with the ticker symbol. + price : Optional[float] + Last transaction price. + open : Optional[float] + Opening price of the stock. + high : Optional[float] + High price of the current trading day. + low : Optional[float] + Low price of the current trading day. + close : Optional[float] + Closing price of the most recent trading day. + change : Optional[float] + Change in price over the current trading period. + change_percent : Optional[float] + Percent change in price over the current trading period. + prev_close : Optional[float] + Previous closing price. + type : Optional[str] + Type of asset. (provider: cboe) + exchange_id : Optional[int] + The Exchange ID number. (provider: cboe) + tick : Optional[str] + Whether the last sale was an up or down tick. (provider: cboe) + bid : Optional[float] + Current bid price. (provider: cboe) + bid_size : Optional[float] + Bid lot size. (provider: cboe) + ask : Optional[float] + Current ask price. (provider: cboe) + ask_size : Optional[float] + Ask lot size. (provider: cboe) + volume : Optional[float] + Stock volume for the current trading day. (provider: cboe) + iv30 : Optional[float] + The 30-day implied volatility of the stock. (provider: cboe) + iv30_change : Optional[float] + Change in 30-day implied volatility of the stock. (provider: cboe) + last_trade_timestamp : Optional[datetime] + Last trade timestamp for the stock. (provider: cboe) + iv30_annual_high : Optional[float] + The 1-year high of implied volatility. (provider: cboe) + hv30_annual_high : Optional[float] + The 1-year high of realized volatility. (provider: cboe) + iv30_annual_low : Optional[float] + The 1-year low of implied volatility. (provider: cboe) + hv30_annual_low : Optional[float] + The 1-year low of realized volatility. (provider: cboe) + iv60_annual_high : Optional[float] + The 60-day high of implied volatility. (provider: cboe) + hv60_annual_high : Optional[float] + The 60-day high of realized volatility. (provider: cboe) + iv60_annual_low : Optional[float] + The 60-day low of implied volatility. (provider: cboe) + hv60_annual_low : Optional[float] + The 60-day low of realized volatility. (provider: cboe) + iv90_annual_high : Optional[float] + The 90-day high of implied volatility. (provider: cboe) + hv90_annual_high : Optional[float] + The 90-day high of realized volatility. (provider: cboe)""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "symbol": ",".join(symbol) if isinstance(symbol, list) else symbol, + }, + extra_params=kwargs, + ) + + return self._run( + "/stocks/info", + **inputs, + ) + + @validate_call + def load( + self, + symbol: Annotated[ + Union[str, List[str]], + OpenBBCustomParameter(description="Symbol to get data for."), + ], + start_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="Start date of the data, in YYYY-MM-DD format." ), ] = None, - end_date: typing_extensions.Annotated[ + end_date: Annotated[ Union[datetime.date, None, str], OpenBBCustomParameter( description="End date of the data, in YYYY-MM-DD format." ), ] = None, - provider: Union[Literal["fmp", "intrinio", "polygon"], None] = None, + chart: bool = False, + provider: Optional[ + Literal["alpha_vantage", "cboe", "fmp", "intrinio", "polygon", "yfinance"] + ] = None, **kwargs ) -> OBBject[List[Data]]: """Load stock data for a specific ticker. @@ -67,27 +187,41 @@ class ROUTER_stocks(Container): ---------- symbol : str Symbol to get data for. - start_date : Union[datetime.date, None] + start_date : Optional[datetime.date] Start date of the data, in YYYY-MM-DD format. - end_date : Union[datetime.date, None] + end_date : Optional[datetime.date] End date of the data, in YYYY-MM-DD format. - provider : Union[Literal['fmp', 'intrinio', 'polygon'], None] + chart : bool + Whether to create a chart or not, by default False. + provider : Optional[Literal['alpha_vantage', 'cboe', 'fmp', 'intrinio', 'pol... The provider to use for the query, by default None. - If None, the provider specified in defaults is selected or 'fmp' if there is + If None, the provider specified in defaults is selected or 'alpha_vantage' if there is no default. - timeseries : Optional[Union[typing_extensions.Annotated[int, Ge(ge=0)]]] + function_ : Literal['TIME_SERIES_INTRADAY', 'TIME_SERIES_DAILY', 'TIME_SERIES_WEEKLY', 'TIME_SERIES_MONTHLY', 'TIME_SERIES_DAILY_ADJUSTED', 'TIME_SERIES_WEEKLY_ADJUSTED', 'TIME_SERIES_MONTHLY_ADJUSTED'] + The time series of your choice. (provider: alpha_vantage) + period : Optional[Union[Literal['intraday', 'daily', 'weekly', 'monthly'], Literal['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']]] + Period of the data to return. (provider: alpha_vantage, yfinance) + interval : Optional[Union[Literal['1min', '5min', '15min', '30min', '60min'], Literal['1d', '1m'], Literal['1min', '5min', '15min', '30min', '1hour', '4hour', '1day'], Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']]] + Data granularity. (provider: alpha_vantage, cboe, fmp, yfinance) + adjusted : Optional[bool] + Output time series is adjusted by historical split and dividend events. (provider: alpha_vantage, polygon) + extended_hours : Optional[bool] + Extended trading hours during pre-market and after-hours. (provider: alpha_vantage) + month : Optional[str] + Query a specific month in history (in YYYY-MM format). (provider: alpha_vantage) + outputsize : Optional[Literal['compact', 'full']] + Compact returns only the latest 100 data points in the intraday time series; full returns trailing 30 days of the most recent intraday data if the month parameter (see above) is not specified, or the full intraday data for a specific month in history if the month parameter is specified. (provider: alpha_vantage) + timeseries : Optional[Annotated[int, Ge(ge=0)]] Number of days to look back. (provider: fmp) - interval : Literal['1min', '5min', '15min', '30min', '1hour', '4hour', '1day'] - Data granularity. (provider: fmp) - timezone : Optional[Union[Literal['Africa/Algiers', 'Africa/Cairo', 'Africa/Casablanca', 'Africa/Harare', 'Africa/Johannesburg', 'Africa/Monrovia', 'Africa/Nairobi', 'America/Argentina/Buenos_Aires', 'America/Bogota', 'America/Caracas', 'America/Chicago', 'America/Chihuahua', 'America/Denver', 'America/Godthab', 'America/Guatemala', 'America/Guyana', 'America/Halifax', 'America/Indiana/Indianapolis', 'America/Juneau', 'America/La_Paz', 'America/Lima', 'America/Lima', 'America/Los_Angeles', 'America/Mazatlan', 'America/Mexico_City', 'America/Mexico_City', 'America/Monterrey', 'America/Montevideo', 'America/New_York', 'America/Phoenix', 'America/Regina', 'America/Santiago', 'America/Sao_Paulo', 'America/St_Johns', 'America/Tijuana', 'Asia/Almaty', 'Asia/Baghdad', 'Asia/Baku', 'Asia/Bangkok', 'Asia/Bangkok', 'Asia/Chongqing', 'Asia/Colombo', 'Asia/Dhaka', 'Asia/Dhaka', 'Asia/Hong_Kong', 'Asia/Irkutsk', 'Asia/Jakarta', 'Asia/Jerusalem', 'Asia/Kabul', 'Asia/Kamchatka', 'Asia/Karachi', 'Asia/Karachi', 'Asia/Kathmandu', 'Asia/Kolkata', 'Asia/Kolkata', 'Asia/Kolkata', 'Asia/Kolkata', 'Asia/Krasnoyarsk', 'Asia/Kuala_Lumpur', 'Asia/Kuwait', 'Asia/Magadan', 'Asia/Muscat', 'Asia/Muscat', 'Asia/Novosibirsk', 'Asia/Rangoon', 'Asia/Riyadh', 'Asia/Seoul', 'Asia/Shanghai', 'Asia/Singapore', 'Asia/Srednekolymsk', 'Asia/Taipei', 'Asia/Tashkent', 'Asia/Tbilisi', 'Asia/Tehran', 'Asia/Tokyo', 'Asia/Tokyo', 'Asia/Tokyo', 'Asia/Ulaanbaatar', 'Asia/Urumqi', 'Asia/Vladivostok', 'Asia/Yakutsk', 'Asia/Yekaterinburg', 'Asia/Yerevan', 'Atlantic/Azores', 'Atlantic/Cape_Verde', 'Atlantic/South_Georgia', 'Australia/Adelaide', 'Australia/Brisbane', 'Australia/Darwin', 'Australia/Hobart', 'Australia/Melbourne', 'Australia/Melbourne', 'Australia/Perth', 'Australia/Sydney', 'Etc/UTC', 'UTC', 'Europe/Amsterdam', 'Europe/Athens', 'Europe/Belgrade', 'Europe/Berlin', 'Europe/Berlin', 'Europe/Bratislava', 'Europe/Brussels', 'Europe/Bucharest', 'Europe/Budapest', 'Europe/Copenhagen', 'Europe/Dublin', 'Europe/Helsinki', 'Europe/Istanbul', 'Europe/Kaliningrad', 'Europe/Kiev', 'Europe/Lisbon', 'Europe/Ljubljana', 'Europe/London', 'Europe/London', 'Europe/Madrid', 'Europe/Minsk', 'Europe/Moscow', 'Europe/Moscow', 'Europe/Paris', 'Europe/Prague', 'Europe/Riga', 'Europe/Rome', 'Europe/Samara', 'Europe/Sarajevo', 'Europe/Skopje', 'Europe/Sofia', 'Europe/Stockholm', 'Europe/Tallinn', 'Europe/Vienna', 'Europe/Vilnius', 'Europe/Volgograd', 'Europe/Warsaw', 'Europe/Zagreb', 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Auckland', 'Pacific/Chatham', 'Pacific/Fakaofo', 'Pacific/Fiji', 'Pacific/Guadalcanal', 'Pacific/Guam', 'Pacific/Honolulu', 'Pacific/Majuro', 'Pacific/Midway', 'Pacific/Midway', 'Pacific/Noumea', 'Pacific/Pago_Pago', 'Pacific/Port_Moresby', 'Pacific/Tongatapu']]] + timezone : Optional[Literal['Africa/Algiers', 'Africa/Cairo', 'Africa/Casablanca', 'Africa/Harare', 'Africa/Johannesburg', 'Africa/Monrovia', 'Africa/Nairobi', 'America/Argentina/Buenos_Aires', 'America/Bogota', 'America/Caracas', 'America/Chicago', 'America/Chihuahua', 'America/Denver', 'America/Godthab', 'America/Guatemala', 'America/Guyana', 'America/Halifax', 'America/Indiana/Indianapolis', 'America/Juneau', 'America/La_Paz', 'America/Lima', 'America/Los_Angeles', 'America/Mazatlan', 'America/Mexico_City', 'America/Monterrey', 'America/Montevideo', 'America/New_York', 'America/Phoenix', 'America/Regina', 'America/Santiago', 'America/Sao_Paulo', 'America/St_Johns', 'America/Tijuana', 'Asia/Almaty', 'Asia/Baghdad', 'Asia/Baku', 'Asia/Bangkok', 'Asia/Chongqing', 'Asia/Colombo', 'Asia/Dhaka', 'Asia/Hong_Kong', 'Asia/Irkutsk', 'Asia/Jakarta', 'Asia/Jerusalem', 'Asia/Kabul', 'Asia/Kamchatka', 'Asia/Karachi', 'Asia/Kathmandu', 'Asia/Kolkata', 'Asia/Krasnoyarsk', 'Asia/Kuala_Lumpur', 'Asia/Kuwait', 'Asia/Magadan', 'Asia/Muscat', 'Asia/Novosibirsk', 'Asia/Rangoon', 'Asia/Riyadh', 'Asia/Seoul', 'Asia/Shanghai', 'Asia/Singapore', 'Asia/Srednekolymsk', 'Asia/Taipei', 'Asia/Tashkent', 'Asia/Tbilisi', 'Asia/Tehran', 'Asia/Tokyo', 'Asia/Ulaanbaatar', 'Asia/Urumqi', 'Asia/Vladivostok', 'Asia/Yakutsk', 'Asia/Yekaterinburg', 'Asia/Yerevan', 'Atlantic/Azores', 'Atlantic/Cape_Verde', 'Atlantic/South_Georgia', 'Australia/Adelaide', 'Australia/Brisbane', 'Australia/Darwin', 'Australia/Hobart', 'Australia/Melbourne', 'Australia/Perth', 'Australia/Sydney', 'Etc/UTC', 'UTC', 'Europe/Amsterdam', 'Europe/Athens', 'Europe/Belgrade', 'Europe/Berlin', 'Europe/Bratislava', 'Europe/Brussels', 'Europe/Bucharest', 'Europe/Budapest', 'Europe/Copenhagen', 'Europe/Dublin', 'Europe/Helsinki', 'Europe/Istanbul', 'Europe/Kaliningrad', 'Europe/Kiev', 'Europe/Lisbon', 'Europe/Ljubljana', 'Europe/London', 'Europe/Madrid', 'Europe/Minsk', 'Europe/Moscow', 'Europe/Paris', 'Europe/Prague', 'Europe/Riga', 'Europe/Rome', 'Europe/Samara', 'Europe/Sarajevo', 'Europe/Skopje', 'Europe/Sofia', 'Europe/Stockholm', 'Europe/Tallinn', 'Europe/Vienna', 'Europe/Vilnius', 'Europe/Volgograd', 'Europe/Warsaw', 'Europe/Zagreb', 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Chatham', 'Pacific/Fakaofo', 'Pacific/Fiji', 'Pacific/Guadalcanal', 'Pacific/Guam', 'Pacific/Honolulu', 'Pacific/Majuro', 'Pacific/Midway', 'Pacific/Noumea', 'Pacific/Pago_Pago', 'Pacific/Port_Moresby', 'Pacific/Tongatapu']] Returns trading times in this timezone. (provider: intrinio) - source : Optional[Union[Literal['realtime', 'delayed', 'nasdaq_basic']]] + source : Optional[Literal['realtime', 'delayed', 'nasdaq_basic']] The source of the data. (provider: intrinio) - start_time : Optional[Union[datetime.time]] + start_time : Optional[datetime.time] Return intervals starting at the specified time on the `start_date` formatted as 'hh:mm:ss'. (provider: intrinio) - end_time : Optional[Union[datetime.time]] + end_time : Optional[datetime.time] Return intervals stopping at the specified time on the `end_date` formatted as 'hh:mm:ss'. (provider: intrinio) - interval_size : Optional[Union[Literal['1m', '5m', '10m', '15m', '30m', '60m', '1h']]] + interval_size : Optional[Literal['1m', '5m', '10m', '15m', '30m', '60m', '1h']] The data time frequency. (provider: intrinio) multiplier : int Multiplier of the timespan. (provider: polygon) @@ -97,15 +231,33 @@ class ROUTER_stocks(Container): Sort order of the data. (provider: polygon) limit : int The number of data entries to return. (provider: polygon) - adjusted : bool - Output time series is adjusted by historical split and dividend events. (provider: polygon) + prepost : bool + Include Pre and Post market data. (provider: yfinance) + actions : bool + Include actions. (provider: yfinance) + auto_adjust : bool + Adjust all OHLC data automatically. (provider: yfinance) + back_adjust : bool + Attempt to adjust all the data automatically. (provider: yfinance) + progress : bool + Show progress bar. (provider: yfinance) + ignore_tz : bool + When combining from different timezones, ignore that part of datetime. (provider: yfinance) + rounding : bool + Round to two decimal places? (provider: yfinance) + repair : bool + Detect currency unit 100x mixups and attempt repair. (provider: yfinance) + keepna : bool + Keep NaN rows returned by Yahoo? (provider: yfinance) + group_by : Literal['ticker', 'column'] + Group by ticker or column. (provider: yfinance) Returns ------- OBBject - results : Union[List[StockHistorical]] + results : List[StockHistorical] Serializable results. - provider : Union[Literal['fmp', 'intrinio', 'polygon'], None] + provider : Optional[Literal['alpha_vantage', 'cboe', 'fmp', 'intrinio', 'polygon', 'yfinance']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -128,27 +280,37 @@ class ROUTER_stocks(Container): The close price of the symbol. volume : Union[float, int] The volume of the symbol. - vwap : Optional[Union[typing_extensions.Annotated[float, Gt(gt=0)]]] + vwap : Optional[Annotated[float, Gt(gt=0)]] Volume Weighted Average Price of the symbol. - adj_close : Optional[Union[float]] - Adjusted Close Price of the symbol. (provider: fmp) - unadjusted_volume : Optional[Union[float]] + adj_close : Optional[Union[Annotated[float, Gt(gt=0)], float]] + The adjusted close price of the symbol. (provider: alpha_vantage, fmp) + dividend_amount : Optional[Annotated[float, Ge(ge=0)]] + Dividend amount paid for the corresponding date. (provider: alpha_vantage) + split_coefficient : Optional[Annotated[float, Ge(ge=0)]] + Split coefficient for the corresponding date. (provider: alpha_vantage) + calls_volume : Optional[float] + Number of calls traded during the most recent trading period. Only valid if interval is 1m. (provider: cboe) + puts_volume : Optional[float] + Number of puts traded during the most recent trading period. Only valid if interval is 1m. (provider: cboe) + total_options_volume : Optional[float] + Total number of options traded during the most recent trading period. Only valid if interval is 1m. (provider: cboe) + unadjusted_volume : Optional[float] Unadjusted volume of the symbol. (provider: fmp) - change : Optional[Union[float]] + change : Optional[float] Change in the price of the symbol from the previous day. (provider: fmp, intrinio) - change_percent : Optional[Union[float]] + change_percent : Optional[float] Change % in the price of the symbol. (provider: fmp) - label : Optional[Union[str]] + label : Optional[str] Human readable format of the date. (provider: fmp) - change_over_time : Optional[Union[float]] + change_over_time : Optional[float] Change % in the price of the symbol over a period of time. (provider: fmp) - close_time : Optional[Union[datetime]] + close_time : Optional[datetime] The timestamp that represents the end of the interval span. (provider: intrinio) - interval : Optional[Union[str]] + interval : Optional[str] The data time frequency. (provider: intrinio) - average : Optional[Union[float]] + average : Optional[float] Average trade price of an individual stock during the interval. (provider: intrinio) - transactions : Optional[Union[typing_extensions.Annotated[int, Gt(gt=0)]]] + transactions : Optional[Annotated[int, Gt(gt=0)]] Number of transactions for the symbol in the time period. (provider: polygon) """ # noqa: E501 @@ -162,6 +324,7 @@ class ROUTER_stocks(Container): "end_date": end_date, }, extra_params=kwargs, + chart=chart, ) return self._run( @@ -172,15 +335,16 @@ class ROUTER_stocks(Container): @validate_call def multiples( self, - symbol: typing_extensions.Annotated[ + symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter(description="Symbol to get data for."), ], - limit: typing_extensions.Annotated[ - Union[int, None], + limit: Annotated[ + Optional[int], OpenBBCustomParameter(description="The number of data entries to return."), ] = 100, - provider: Union[Literal["fmp"], None] = None, + chart: bool = False, + provider: Optional[Literal["fmp"]] = None, **kwargs ) -> OBBject[List[Data]]: """Get valuation multiples for a stock ticker. @@ -189,9 +353,11 @@ class ROUTER_stocks(Container): ---------- symbol : str Symbol to get data for. - limit : Union[int, None] + limit : Optional[int] The number of data entries to return. - provider : Union[Literal['fmp'], None] + chart : bool + Whether to create a chart or not, by default False. + provider : Optional[Literal['fmp']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. @@ -199,9 +365,9 @@ class ROUTER_stocks(Container): Returns ------- OBBject - results : Union[List[StockMultiples]] + results : List[StockMultiples] Serializable results. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -212,125 +378,125 @@ class ROUTER_stocks(Container): StockMultiples -------------- - revenue_per_share_ttm : Optional[Union[float]] + revenue_per_share_ttm : Optional[float] Revenue per share calculated as trailing twelve months. - net_income_per_share_ttm : Optional[Union[float]] + net_income_per_share_ttm : Optional[float] Net income per share calculated as trailing twelve months. - operating_cash_flow_per_share_ttm : Optional[Union[float]] + operating_cash_flow_per_share_ttm : Optional[float] Operating cash flow per share calculated as trailing twelve months. - free_cash_flow_per_share_ttm : Optional[Union[float]] + free_cash_flow_per_share_ttm : Optional[float] Free cash flow per share calculated as trailing twelve months. - cash_per_share_ttm : Optional[Union[float]] + cash_per_share_ttm : Optional[float] Cash per share calculated as trailing twelve months. - book_value_per_share_ttm : Optional[Union[float]] + book_value_per_share_ttm : Optional[float] Book value per share calculated as trailing twelve months. - tangible_book_value_per_share_ttm : Optional[Union[float]] + tangible_book_value_per_share_ttm : Optional[float] Tangible book value per share calculated as trailing twelve months. - shareholders_equity_per_share_ttm : Optional[Union[float]] + shareholders_equity_per_share_ttm : Optional[float] Shareholders equity per share calculated as trailing twelve months. - interest_debt_per_share_ttm : Optional[Union[float]] + interest_debt_per_share_ttm : Optional[float] Interest debt per share calculated as trailing twelve months. - market_cap_ttm : Optional[Union[float]] + market_cap_ttm : Optional[float] Market capitalization calculated as trailing twelve months. - enterprise_value_ttm : Optional[Union[float]] + enterprise_value_ttm : Optional[float] Enterprise value calculated as trailing twelve months. - pe_ratio_ttm : Optional[Union[float]] + pe_ratio_ttm : Optional[float] Price-to-earnings ratio (P/E ratio) calculated as trailing twelve months. - price_to_sales_ratio_ttm : Optional[Union[float]] + price_to_sales_ratio_ttm : Optional[float] Price-to-sales ratio calculated as trailing twelve months. - pocf_ratio_ttm : Optional[Union[float]] + pocf_ratio_ttm : Optional[float] Price-to-operating cash flow ratio calculated as trailing twelve months. - pfcf_ratio_ttm : Optional[Union[float]] + pfcf_ratio_ttm : Optional[float] Price-to-free cash flow ratio calculated as trailing twelve months. - pb_ratio_ttm : Optional[Union[float]] + pb_ratio_ttm : Optional[float] Price-to-book ratio calculated as trailing twelve months. - ptb_ratio_ttm : Optional[Union[float]] + ptb_ratio_ttm : Optional[float] Price-to-tangible book ratio calculated as trailing twelve months. - ev_to_sales_ttm : Optional[Union[float]] + ev_to_sales_ttm : Optional[float] Enterprise value-to-sales ratio calculated as trailing twelve months. - enterprise_value_over_ebitda_ttm : Optional[Union[float]] + enterprise_value_over_ebitda_ttm : Optional[float] Enterprise value-to-EBITDA ratio calculated as trailing twelve months. - ev_to_operating_cash_flow_ttm : Optional[Union[float]] + ev_to_operating_cash_flow_ttm : Optional[float] Enterprise value-to-operating cash flow ratio calculated as trailing twelve months. - ev_to_free_cash_flow_ttm : Optional[Union[float]] + ev_to_free_cash_flow_ttm : Optional[float] Enterprise value-to-free cash flow ratio calculated as trailing twelve months. - earnings_yield_ttm : Optional[Union[float]] + earnings_yield_ttm : Optional[float] Earnings yield calculated as trailing twelve months. - free_cash_flow_yield_ttm : Optional[Union[float]] + free_cash_flow_yield_ttm : Optional[float] Free cash flow yield calculated as trailing twelve months. - debt_to_equity_ttm : Optional[Union[float]] + debt_to_equity_ttm : Optional[float] Debt-to-equity ratio calculated as trailing twelve months. - debt_to_assets_ttm : Optional[Union[float]] + debt_to_assets_ttm : Optional[float] Debt-to-assets ratio calculated as trailing twelve months. - net_debt_to_ebitda_ttm : Optional[Union[float]] + net_debt_to_ebitda_ttm : Optional[float] Net debt-to-EBITDA ratio calculated as trailing twelve months. - current_ratio_ttm : Optional[Union[float]] + current_ratio_ttm : Optional[float] Current ratio calculated as trailing twelve months. - interest_coverage_ttm : Optional[Union[float]] + interest_coverage_ttm : Optional[float] Interest coverage calculated as trailing twelve months. - income_quality_ttm : Optional[Union[float]] + income_quality_ttm : Optional[float] Income quality calculated as trailing twelve months. - dividend_yield_ttm : Optional[Union[float]] + dividend_yield_ttm : Optional[float] Dividend yield calculated as trailing twelve months. - dividend_yield_percentage_ttm : Optional[Union[float]] + dividend_yield_percentage_ttm : Optional[float] Dividend yield percentage calculated as trailing twelve months. - dividend_to_market_cap_ttm : Optional[Union[float]] + dividend_to_market_cap_ttm : Optional[float] Dividend to market capitalization ratio calculated as trailing twelve months. - dividend_per_share_ttm : Optional[Union[float]] + dividend_per_share_ttm : Optional[float] Dividend per share calculated as trailing twelve months. - payout_ratio_ttm : Optional[Union[float]] + payout_ratio_ttm : Optional[float] Payout ratio calculated as trailing twelve months. - sales_general_and_administrative_to_revenue_ttm : Optional[Union[float]] + sales_general_and_administrative_to_revenue_ttm : Optional[float] Sales general and administrative expenses-to-revenue ratio calculated as trailing twelve months. - research_and_development_to_revenue_ttm : Optional[Union[float]] + research_and_development_to_revenue_ttm : Optional[float] Research and development expenses-to-revenue ratio calculated as trailing twelve months. - intangibles_to_total_assets_ttm : Optional[Union[float]] + intangibles_to_total_assets_ttm : Optional[float] Intangibles-to-total assets ratio calculated as trailing twelve months. - capex_to_operating_cash_flow_ttm : Optional[Union[float]] + capex_to_operating_cash_flow_ttm : Optional[float] Capital expenditures-to-operating cash flow ratio calculated as trailing twelve months. - capex_to_revenue_ttm : Optional[Union[float]] + capex_to_revenue_ttm : Optional[float] Capital expenditures-to-revenue ratio calculated as trailing twelve months. - capex_to_depreciation_ttm : Optional[Union[float]] + capex_to_depreciation_ttm : Optional[float] Capital expenditures-to-depreciation ratio calculated as trailing twelve months. - stock_based_compensation_to_revenue_ttm : Optional[Union[float]] + stock_based_compensation_to_revenue_ttm : Optional[float] Stock-based compensation-to-revenue ratio calculated as trailing twelve months. - graham_number_ttm : Optional[Union[float]] + graham_number_ttm : Optional[float] Graham number calculated as trailing twelve months. - roic_ttm : Optional[Union[float]] + roic_ttm : Optional[float] Return on invested capital calculated as trailing twelve months. - return_on_tangible_assets_ttm : Optional[Union[float]] + return_on_tangible_assets_ttm : Optional[float] Return on tangible assets calculated as trailing twelve months. - graham_net_net_ttm : Optional[Union[float]] + graham_net_net_ttm : Optional[float] Graham net-net working capital calculated as trailing twelve months. - working_capital_ttm : Optional[Union[float]] + working_capital_ttm : Optional[float] Working capital calculated as trailing twelve months. - tangible_asset_value_ttm : Optional[Union[float]] + tangible_asset_value_ttm : Optional[float] Tangible asset value calculated as trailing twelve months. - net_current_asset_value_ttm : Optional[Union[float]] + net_current_asset_value_ttm : Optional[float] Net current asset value calculated as trailing twelve months. - invested_capital_ttm : Optional[Union[float]] + invested_capital_ttm : Optional[float] Invested capital calculated as trailing twelve months. - average_receivables_ttm : Optional[Union[float]] + average_receivables_ttm : Optional[float] Average receivables calculated as trailing twelve months. - average_payables_ttm : Optional[Union[float]] + average_payables_ttm : Optional[float] Average payables calculated as trailing twelve months. - average_inventory_ttm : Optional[Union[float]] + average_inventory_ttm : Optional[float] Average inventory calculated as trailing twelve months. - days_sales_outstanding_ttm : Optional[Union[float]] + days_sales_outstanding_ttm : Optional[float] Days sales outstanding calculated as trailing twelve months. - days_payables_outstanding_ttm : Optional[Union[float]] + days_payables_outstanding_ttm : Optional[float] Days payables outstanding calculated as trailing twelve months. - days_of_inventory_on_hand_ttm : Optional[Union[float]] + days_of_inventory_on_hand_ttm : Optional[float] Days of inventory on hand calculated as trailing twelve months. - receivables_turnover_ttm : Optional[Union[float]] + receivables_turnover_ttm : Optional[float] Receivables turnover calculated as trailing twelve months. - payables_turnover_ttm : Optional[Union[float]] + payables_turnover_ttm : Optional[float] Payables turnover calculated as trailing twelve months. - inventory_turnover_ttm : Optional[Union[float]] + inventory_turnover_ttm : Optional[float] Inventory turnover calculated as trailing twelve months. - roe_ttm : Optional[Union[float]] + roe_ttm : Optional[float] Return on equity calculated as trailing twelve months. - capex_per_share_ttm : Optional[Union[float]] + capex_per_share_ttm : Optional[float] Capital expenditures per share calculated as trailing twelve months.""" # noqa: E501 inputs = filter_inputs( @@ -342,6 +508,7 @@ class ROUTER_stocks(Container): "limit": limit, }, extra_params=kwargs, + chart=chart, ) return self._run( @@ -352,14 +519,17 @@ class ROUTER_stocks(Container): @validate_call def news( self, - symbols: typing_extensions.Annotated[ + symbols: Annotated[ str, OpenBBCustomParameter(description="Comma separated list of symbols.") ], - limit: typing_extensions.Annotated[ - Union[typing_extensions.Annotated[int, Ge(ge=0)], None], + limit: Annotated[ + Optional[Annotated[int, Ge(ge=0)]], OpenBBCustomParameter(description="Number of results to return per page."), ] = 20, - provider: Union[Literal["benzinga", "fmp", "intrinio", "polygon"], None] = None, + chart: bool = False, + provider: Optional[ + Literal["benzinga", "fmp", "intrinio", "polygon", "yfinance"] + ] = None, **kwargs ) -> OBBject[List[Data]]: """Get news for one or more stock tickers. @@ -368,49 +538,51 @@ class ROUTER_stocks(Container): ---------- symbols : str Comma separated list of symbols. - limit : Union[typing_extensions.Annotated[int, Ge(ge=0)], None] + limit : Optional[Annotated[int, Ge(ge=0)]] Number of results to return per page. - provider : Union[Literal['benzinga', 'fmp', 'intrinio', 'polygon'], None] + chart : bool + Whether to create a chart or not, by default False. + provider : Optional[Literal['benzinga', 'fmp', 'intrinio', 'polygon', 'yfina... The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default. display : Literal['headline', 'abstract', 'full'] Specify headline only (headline), headline + teaser (abstract), or headline + full body (full). (provider: benzinga) - date : Optional[Union[str]] + date : Optional[str] Date of the news to retrieve. (provider: benzinga) - start_date : Optional[Union[str]] + start_date : Optional[str] Start date of the news to retrieve. (provider: benzinga) - end_date : Optional[Union[str]] + end_date : Optional[str] End date of the news to retrieve. (provider: benzinga) - updated_since : Optional[Union[int]] + updated_since : Optional[int] Number of seconds since the news was updated. (provider: benzinga) - published_since : Optional[Union[int]] + published_since : Optional[int] Number of seconds since the news was published. (provider: benzinga) - sort : Optional[Union[Literal['id', 'created', 'updated']]] + sort : Optional[Literal['id', 'created', 'updated']] Key to sort the news by. (provider: benzinga) - order : Optional[Union[Literal['asc', 'desc']]] + order : Optional[Literal['asc', 'desc']] Order to sort the news by. (provider: benzinga); Sort order of the articles. (provider: polygon) - isin : Optional[Union[str]] + isin : Optional[str] The ISIN of the news to retrieve. (provider: benzinga) - cusip : Optional[Union[str]] + cusip : Optional[str] The CUSIP of the news to retrieve. (provider: benzinga) - channels : Optional[Union[str]] + channels : Optional[str] Channels of the news to retrieve. (provider: benzinga) - topics : Optional[Union[str]] + topics : Optional[str] Topics of the news to retrieve. (provider: benzinga) - authors : Optional[Union[str]] + authors : Optional[str] Authors of the news to retrieve. (provider: benzinga) - content_types : Optional[Union[str]] + content_types : Optional[str] Content types of the news to retrieve. (provider: benzinga) - published_utc : Optional[Union[str]] + published_utc : Optional[str] Date query to fetch articles. Supports operators <, <=, >, >= (provider: polygon) Returns ------- OBBject - results : Union[List[StockNews]] + results : List[StockNews] Serializable results. - provider : Union[Literal['benzinga', 'fmp', 'intrinio', 'polygon'], None] + provider : Optional[Literal['benzinga', 'fmp', 'intrinio', 'polygon', 'yfinance']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -425,42 +597,50 @@ class ROUTER_stocks(Container): Published date of the news. title : str Title of the news. - image : Optional[Union[str]] + image : Optional[str] Image URL of the news. - text : Optional[Union[str]] + text : Optional[str] Text/body of the news. url : str URL of the news. - id : Optional[Union[str]] + id : Optional[str] ID of the news. (provider: benzinga); Intrinio ID for the article. (provider: intrinio); Article ID. (provider: polygon) - author : Optional[Union[str]] + author : Optional[str] Author of the news. (provider: benzinga); Author of the article. (provider: polygon) - teaser : Optional[Union[str]] + teaser : Optional[str] Teaser of the news. (provider: benzinga) - images : Optional[Union[List[Dict[str, str]]]] + images : Optional[List[Dict[str, str]]] Images associated with the news. (provider: benzinga) - channels : Optional[Union[str]] + channels : Optional[str] Channels associated with the news. (provider: benzinga) - stocks : Optional[Union[str]] + stocks : Optional[str] Stocks associated with the news. (provider: benzinga) - tags : Optional[Union[str]] + tags : Optional[str] Tags associated with the news. (provider: benzinga) - updated : Optional[Union[datetime]] + updated : Optional[datetime] None - symbol : Optional[Union[str]] + symbol : Optional[str] Ticker of the fetched news. (provider: fmp) - site : Optional[Union[str]] + site : Optional[str] Name of the news source. (provider: fmp) - amp_url : Optional[Union[str]] + amp_url : Optional[str] AMP URL. (provider: polygon) - image_url : Optional[Union[str]] + image_url : Optional[str] Image URL. (provider: polygon) - keywords : Optional[Union[List[str]]] + keywords : Optional[List[str]] Keywords in the article (provider: polygon) - publisher : Optional[Union[openbb_polygon.models.stock_news.PolygonPublisher]] - Publisher of the article. (provider: polygon) - tickers : Optional[Union[List[str]]] - Tickers covered in the article. (provider: polygon)""" # noqa: E501 + publisher : Optional[Union[openbb_polygon.models.stock_news.PolygonPublisher, str]] + Publisher of the article. (provider: polygon, yfinance) + tickers : Optional[List[str]] + Tickers covered in the article. (provider: polygon) + uuid : Optional[str] + Unique identifier for the news article (provider: yfinance) + type : Optional[str] + Type of the news article (provider: yfinance) + thumbnail : Optional[List] + Thumbnail related data to the ticker news article. (provider: yfinance) + related_tickers : Optional[str] + Tickers related to the news article. (provider: yfinance)""" # noqa: E501 inputs = filter_inputs( provider_choices={ @@ -471,6 +651,7 @@ class ROUTER_stocks(Container): "limit": limit, }, extra_params=kwargs, + chart=chart, ) return self._run( @@ -487,11 +668,11 @@ class ROUTER_stocks(Container): @validate_call def quote( self, - symbol: typing_extensions.Annotated[ + symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter(description="Comma separated list of symbols."), ] = None, - provider: Union[Literal["fmp", "intrinio"], None] = None, + provider: Optional[Literal["fmp", "intrinio"]] = None, **kwargs ) -> OBBject[Union[List[Data], Data]]: """Load stock data for a specific ticker. @@ -500,7 +681,7 @@ class ROUTER_stocks(Container): ---------- symbol : str Comma separated list of symbols. - provider : Union[Literal['fmp', 'intrinio'], None] + provider : Optional[Literal['fmp', 'intrinio']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. @@ -512,7 +693,7 @@ class ROUTER_stocks(Container): OBBject results : Union[List[StockQuote], StockQuote] Serializable results. - provider : Union[Literal['fmp', 'intrinio'], None] + provider : Optional[Literal['fmp', 'intrinio']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -523,29 +704,29 @@ class ROUTER_stocks(Container): StockQuote ---------- - day_low : Optional[Union[float]] + day_low : Optional[float] Lowest price of the stock in the current trading day. - day_high : Optional[Union[float]] + day_high : Optional[float] Highest price of the stock in the current trading day. - date : Optional[Union[datetime]] + date : Optional[datetime] Timestamp of the stock quote. - symbol : Optional[Union[str]] + symbol : Optional[str] Symbol of the company. (provider: fmp) - name : Optional[Union[str]] + name : Optional[str] Name of the company. (provider: fmp) - price : Optional[Union[float]] + price : Optional[float] Current trading price of the stock. (provider: fmp) - changes_percentage : Optional[Union[float]] + changes_percentage : Optional[float] Change percentage of the stock price. (provider: fmp) - change : Optional[Union[float]] + change : Optional[float] Change in the stock price. (provider: fmp) - year_high : Optional[Union[float]] + year_high : Optional[float] Highest price of the stock in the last 52 weeks. (provider: fmp) - year_low : Optional[Union[float]] + year_low : Optional[float] Lowest price of the stock in the last 52 weeks. (provider: fmp) - market_cap : Optional[Union[float]] + market_cap : Optional[float] Market cap of the company. (provider: fmp) - price_avg50 : Optional[Union[float]] + price_avg50 : Optional[float] 50 days average price of the stock. (provider: fmp) price_avg200 : Optional[int] 200 days average price of the stock. (provider: fmp) @@ -553,63 +734,63 @@ class ROUTER_stocks(Container): Volume of the stock in the current trading day. (provider: fmp) avg_volume : Optional[int] Average volume of the stock in the last 10 trading days. (provider: fmp) - exchange : Optional[Union[str]] + exchange : Optional[str] Exchange the stock is traded on. (provider: fmp) - open : Optional[Union[float]] + open : Optional[float] Opening price of the stock in the current trading day. (provider: fmp) - previous_close : Optional[Union[float]] + previous_close : Optional[float] Previous closing price of the stock. (provider: fmp) - eps : Optional[Union[float]] + eps : Optional[float] Earnings per share of the stock. (provider: fmp) - pe : Optional[Union[float]] + pe : Optional[float] Price earnings ratio of the stock. (provider: fmp) - earnings_announcement : Optional[Union[str]] + earnings_announcement : Optional[str] Earnings announcement date of the stock. (provider: fmp) shares_outstanding : Optional[int] Number of shares outstanding of the stock. (provider: fmp) - last_price : Optional[Union[float]] + last_price : Optional[float] Price of the last trade. (provider: intrinio) - last_time : Optional[Union[datetime]] + last_time : Optional[datetime] Date and Time when the last trade occurred. (provider: intrinio) - last_size : Optional[Union[int]] + last_size : Optional[int] Size of the last trade. (provider: intrinio) - bid_price : Optional[Union[float]] + bid_price : Optional[float] Price of the top bid order. (provider: intrinio) - bid_size : Optional[Union[int]] + bid_size : Optional[int] Size of the top bid order. (provider: intrinio) - ask_price : Optional[Union[float]] + ask_price : Optional[float] Price of the top ask order. (provider: intrinio) - ask_size : Optional[Union[int]] + ask_size : Optional[int] Size of the top ask order. (provider: intrinio) - open_price : Optional[Union[float]] + open_price : Optional[float] Open price for the trading day. (provider: intrinio) - close_price : Optional[Union[float]] + close_price : Optional[float] Closing price for the trading day (IEX source only). (provider: intrinio) - high_price : Optional[Union[float]] + high_price : Optional[float] High Price for the trading day. (provider: intrinio) - low_price : Optional[Union[float]] + low_price : Optional[float] Low Price for the trading day. (provider: intrinio) - exchange_volume : Optional[Union[int]] + exchange_volume : Optional[int] Number of shares exchanged during the trading day on the exchange. (provider: intrinio) - market_volume : Optional[Union[int]] + market_volume : Optional[int] Number of shares exchanged during the trading day for the whole market. (provider: intrinio) - updated_on : Optional[Union[datetime]] + updated_on : Optional[datetime] Date and Time when the data was last updated. (provider: intrinio) - source : Optional[Union[str]] + source : Optional[str] Source of the data. (provider: intrinio) - listing_venue : Optional[Union[str]] + listing_venue : Optional[str] Listing venue where the trade took place (SIP source only). (provider: intrinio) - sales_conditions : Optional[Union[str]] + sales_conditions : Optional[str] Indicates any sales condition modifiers associated with the trade. (provider: intrinio) - quote_conditions : Optional[Union[str]] + quote_conditions : Optional[str] Indicates any quote condition modifiers associated with the trade. (provider: intrinio) - market_center_code : Optional[Union[str]] + market_center_code : Optional[str] Market center character code. (provider: intrinio) - is_darkpool : Optional[Union[bool]] + is_darkpool : Optional[bool] Whether or not the current trade is from a darkpool. (provider: intrinio) - messages : Optional[Union[List[str]]] + messages : Optional[List[str]] Messages associated with the endpoint. (provider: intrinio) - security : Optional[Union[Dict[str, Any]]] + security : Optional[Dict[str, Any]] Security details related to the quote. (provider: intrinio)""" # noqa: E501 inputs = filter_inputs( @@ -626,3 +807,68 @@ class ROUTER_stocks(Container): "/stocks/quote", **inputs, ) + + @validate_call + def search( + self, + query: Annotated[str, OpenBBCustomParameter(description="Search query.")] = "", + ticker: Annotated[ + bool, + OpenBBCustomParameter(description="Whether to search by ticker symbol."), + ] = False, + provider: Optional[Literal["cboe"]] = None, + **kwargs + ) -> OBBject[List[Data]]: + """Search for a company or stock ticker. + + Parameters + ---------- + query : str + Search query. + ticker : bool + Whether to search by ticker symbol. + provider : Optional[Literal['cboe']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'cboe' if there is + no default. + + Returns + ------- + OBBject + results : List[StockSearch] + Serializable results. + provider : Optional[Literal['cboe']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + StockSearch + ----------- + symbol : str + Symbol to get data for. + name : str + Name of the company. + dpm_name : Optional[str] + Name of the primary market maker. (provider: cboe) + post_station : Optional[str] + Post and station location on the CBOE trading floor. (provider: cboe)""" # noqa: E501 + + inputs = filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "query": query, + "ticker": ticker, + }, + extra_params=kwargs, + ) + + return self._run( + "/stocks/search", + **inputs, + ) diff --git a/openbb_platform/openbb/package/stocks_ca.py b/openbb_platform/openbb/package/stocks_ca.py index 55704812bc1..e6f675dbf22 100644 --- a/openbb_platform/openbb/package/stocks_ca.py +++ b/openbb_platform/openbb/package/stocks_ca.py @@ -1,14 +1,14 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### -from typing import List, Literal, Union +from typing import List, Literal, Optional, Union -import typing_extensions from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_inputs from openbb_provider.abstract.data import Data from pydantic import validate_call +from typing_extensions import Annotated class ROUTER_stocks_ca(Container): @@ -22,11 +22,11 @@ class ROUTER_stocks_ca(Container): @validate_call def peers( self, - symbol: typing_extensions.Annotated[ + symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter(description="Symbol to get data for."), ], - provider: Union[Literal["fmp"], None] = None, + provider: Optional[Literal["fmp"]] = None, **kwargs ) -> OBBject[Data]: """Company peers. @@ -35,7 +35,7 @@ class ROUTER_stocks_ca(Container): ---------- symbol : str Symbol to get data for. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. @@ -43,9 +43,9 @@ class ROUTER_stocks_ca(Container): Returns ------- OBBject - results : Union[StockPeers] + results : StockPeers Serializable results. - provider : Union[Literal['fmp'], None] + provider : Optional[Literal['fmp']] Provider name. warnings : Optional[List[Warning_]] List of warnings. diff --git a/openbb_platform/openbb/package/stocks_fa.py b/openbb_platform/openbb/package/stocks_fa.py index 62e86f641b1..ff4fa6456e7 100644 --- a/openbb_platform/openbb/package/stocks_fa.py +++ b/openbb_platform/openbb/package/stocks_fa.py @@ -1350,10 +1350,10 @@ class ROUTER_stocks_fa(Container): URL to the document. symbol : Optional[str] The ticker symbol of the company. (provider: fmp) - accepted_date : Optional[date] - Accepted date of the SEC filing. (provider: fmp) cik : Optional[str] CIK of the SEC filing. (provider: fmp) + accepted_date : Optional[datetime] + Accepted date of the SEC filing. (provider: fmp) final_link : Optional[str] Final link of the SEC filing. (provider: fmp)""" # noqa: E501 diff --git a/openbb_platform/openbb/package/stocks_options.py b/openbb_platform/openbb/package/stocks_options.py index 888b0019d9c..3c8ed4edafd 100644 --- a/openbb_platform/openbb/package/stocks_options.py +++ b/openbb_platform/openbb/package/stocks_options.py @@ -1,14 +1,14 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### -from typing import List, Literal, Union +from typing import List, Literal, Optional, Union -import typing_extensions from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_inputs from openbb_provider.abstract.data import Data from pydantic import validate_call +from typing_extensions import Annotated class ROUTER_stocks_options(Container): @@ -22,11 +22,11 @@ class ROUTER_stocks_options(Container): @validate_call def chains( self, - symbol: typing_extensions.Annotated[ + symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter(description="Symbol to get data for."), ], - provider: Union[Literal["intrinio"], None] = None, + provider: Optional[Literal["cboe", "intrinio"]] = None, **kwargs ) -> OBBject[List[Data]]: """Get the complete options chain for a ticker. @@ -35,19 +35,19 @@ class ROUTER_stocks_options(Container): ---------- symbol : str Symbol to get data for. - provider : Union[Literal['intrinio'], None] + provider : Optional[Literal['cboe', 'intrinio']] The provider to use for the query, by default None. - If None, the provider specified in defaults is selected or 'intrinio' if there is + If None, the provider specified in defaults is selected or 'cboe' if there is no default. - date : Optional[Union[str]] + date : Optional[str] Date for which the options chains are returned. (provider: intrinio) Returns ------- OBBject - results : Union[List[OptionsChains]] + results : List[OptionsChains] Serializable results. - provider : Union[Literal['intrinio'], None] + provider : Optional[Literal['cboe', 'intrinio']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -70,46 +70,68 @@ class ROUTER_stocks_options(Container): Call or Put. date : date Date for which the options chains are returned. - close : Optional[Union[float]] + close : Optional[float] Close price for the option that day. - close_bid : Optional[Union[float]] + close_bid : Optional[float] The closing bid price for the option that day. - close_ask : Optional[Union[float]] + close_ask : Optional[float] The closing ask price for the option that day. - volume : Optional[Union[float]] + volume : Optional[float] Current trading volume on the contract. - open : Optional[Union[float]] + open : Optional[float] Opening price of the option. - open_bid : Optional[Union[float]] + open_bid : Optional[float] The opening bid price for the option that day. - open_ask : Optional[Union[float]] + open_ask : Optional[float] The opening ask price for the option that day. - open_interest : Optional[Union[float]] + open_interest : Optional[float] Open interest on the contract. - high : Optional[Union[float]] + high : Optional[float] High price of the option. - low : Optional[Union[float]] + low : Optional[float] Low price of the option. - mark : Optional[Union[float]] + mark : Optional[float] The mid-price between the latest bid-ask spread. - ask_high : Optional[Union[float]] + ask_high : Optional[float] The highest ask price for the option that day. - ask_low : Optional[Union[float]] + ask_low : Optional[float] The lowest ask price for the option that day. - bid_high : Optional[Union[float]] + bid_high : Optional[float] The highest bid price for the option that day. - bid_low : Optional[Union[float]] + bid_low : Optional[float] The lowest bid price for the option that day. - implied_volatility : Optional[Union[float]] + implied_volatility : Optional[float] Implied volatility of the option. - delta : Optional[Union[float]] + delta : Optional[float] Delta of the option. - gamma : Optional[Union[float]] + gamma : Optional[float] Gamma of the option. - theta : Optional[Union[float]] + theta : Optional[float] Theta of the option. - vega : Optional[Union[float]] - Vega of the option.""" # noqa: E501 + vega : Optional[float] + Vega of the option. + bid_size : Optional[int] + Bid size for the option. (provider: cboe) + ask_size : Optional[int] + Ask size for the option. (provider: cboe) + theoretical : Optional[float] + Theoretical value of the option. (provider: cboe) + last_trade_price : Optional[float] + Last trade price of the option. (provider: cboe) + tick : Optional[str] + Whether the last tick was up or down in price. (provider: cboe) + prev_close : Optional[float] + Previous closing price of the option. (provider: cboe) + change : Optional[float] + Change in price of the option. (provider: cboe) + change_percent : Optional[float] + Change, in percent, of the option. (provider: cboe) + rho : Optional[float] + Rho of the option. (provider: cboe) + last_trade_timestamp : Optional[datetime] + Last trade timestamp of the option. (provider: cboe) + dte : Optional[int] + Days to expiration for the option. (provider: cboe)""" # noqa: E501 inputs = filter_inputs( provider_choices={ diff --git a/openbb_platform/openbb/package/ta.py b/openbb_platform/openbb/package/ta.py new file mode 100644 index 00000000000..152284e210f --- /dev/null +++ b/openbb_platform/openbb/package/ta.py @@ -0,0 +1,1485 @@ +### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### + +from typing import List, Literal, Optional, Union + +import pandas +from annotated_types import Ge, Gt +from openbb_core.app.model.obbject import OBBject +from openbb_core.app.static.container import Container +from openbb_core.app.static.filters import filter_inputs +from openbb_provider.abstract.data import Data +from pydantic import validate_call +from typing_extensions import Annotated + + +class ROUTER_ta(Container): + """/ta + ad + adosc + adx + aroon + atr + bbands + cci + cg + clenow + cones + demark + donchian + ema + fib + fisher + hma + ichimoku + kc + macd + obv + rsi + sma + stoch + vwap + wma + zlma + """ + + def __repr__(self) -> str: + return self.__doc__ or "" + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def ad( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + offset: int = 0, + ) -> OBBject[List[Data]]: + """ + The Accumulation/Distribution Line is similar to the On Balance + Volume (OBV), which sums the volume times +1/-1 based on whether the close is + higher than the previous close. The Accumulation/Distribution indicator, however + multiplies the volume by the close location value (CLV). The CLV is based on the + movement of the issue within a single bar and can be +1, -1 or zero. + + + The Accumulation/Distribution Line is interpreted by looking for a divergence in + the direction of the indicator relative to price. If the Accumulation/Distribution + Line is trending upward it indicates that the price may follow. Also, if the + Accumulation/Distribution Line becomes flat while the price is still rising (or falling) + then it signals an impending flattening of the price. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + index : str, optional + Index column name to use with `data`, by default "date". + offset : int, optional + Offset of the AD, by default 0. + + Returns + ------- + OBBject[List[Data]] + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> ad_data = obb.ta.ad(data=stock_data.results,offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + offset=offset, + ) + + return self._run( + "/ta/ad", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def adosc( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + fast: Annotated[int, Gt(gt=0)] = 3, + slow: Annotated[int, Gt(gt=0)] = 10, + offset: int = 0, + ) -> OBBject[List[Data]]: + """ + Accumulation/Distribution Oscillator, also known as the Chaikin Oscillator + is essentially a momentum indicator, but of the Accumulation-Distribution line + rather than merely price. It looks at both the strength of price moves and the + underlying buying and selling pressure during a given time period. The oscillator + reading above zero indicates net buying pressure, while one below zero registers + net selling pressure. Divergence between the indicator and pure price moves are + the most common signals from the indicator, and often flag market turning points. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + fast : PositiveInt, optional + Number of periods to be used for the fast calculation, by default 3. + slow : PositiveInt, optional + Number of periods to be used for the slow calculation, by default 10. + offset : int, optional + Offset to be used for the calculation, by default 0. + + Returns + ------- + OBBject[List[Data]] + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> adosc_data = obb.ta.adosc(data=stock_data.results, fast=3, slow=10, offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + fast=fast, + slow=slow, + offset=offset, + ) + + return self._run( + "/ta/adosc", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def adx( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + length: int = 50, + scalar: float = 100.0, + drift: int = 1, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + The ADX is a Welles Wilder style moving average of the Directional Movement Index (DX). + The values range from 0 to 100, but rarely get above 60. To interpret the ADX, consider + a high number to be a strong trend, and a low number, a weak trend. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + index : str, optional + Index column name to use with `data`, by default "date". + length : int, optional + Number of periods for the ADX, by default 50. + scalar : float, optional + Scalar value for the ADX, by default 100.0. + drift : int, optional + Drift value for the ADX, by default 1. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> adx_data = obb.ta.adx(data=stock_data.results,length=50,scalar=100.0,drift=1) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + length=length, + scalar=scalar, + drift=drift, + chart=chart, + ) + + return self._run( + "/ta/adx", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def aroon( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + length: int = 25, + scalar: int = 100, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + The word aroon is Sanskrit for "dawn's early light." The Aroon + indicator attempts to show when a new trend is dawning. The indicator consists + of two lines (Up and Down) that measure how long it has been since the highest + high/lowest low has occurred within an n period range. + + When the Aroon Up is staying between 70 and 100 then it indicates an upward trend. + When the Aroon Down is staying between 70 and 100 then it indicates an downward trend. + A strong upward trend is indicated when the Aroon Up is above 70 while the Aroon Down is below 30. + Likewise, a strong downward trend is indicated when the Aroon Down is above 70 while + the Aroon Up is below 30. Also look for crossovers. When the Aroon Down crosses above + the Aroon Up, it indicates a weakening of the upward trend (and vice versa). + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + index: str, optional + Index column name to use with `data`, by default "date". + length : int, optional + Number of periods to be used for the calculation, by default 25. + scalar : int, optional + Scalar to be used for the calculation, by default 100. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> aroon_data = obb.ta.aroon(data=stock_data.results, length=25, scalar=100) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + length=length, + scalar=scalar, + chart=chart, + ) + + return self._run( + "/ta/aroon", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def atr( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + length: Annotated[int, Gt(gt=0)] = 14, + mamode: Literal["rma", "ema", "sma", "wma"] = "rma", + drift: Annotated[int, Ge(ge=0)] = 1, + offset: int = 0, + ) -> OBBject[List[Data]]: + """ + Average True Range is used to measure volatility, especially volatility caused by + gaps or limit moves. + + Parameters + ---------- + data : List[Data] + List of data to apply the indicator to. + index : str, optional + Index column name, by default "date" + length : PositiveInt, optional + It's period, by default 14 + mamode : Literal["rma", "ema", "sma", "wma"], optional + Moving average mode, by default "rma" + drift : NonNegativeInt, optional + The difference period, by default 1 + offset : int, optional + How many periods to offset the result, by default 0 + + Returns + ------- + OBBject[List[Data]] + List of data with the indicator applied. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> atr_data = obb.ta.atr(data=stock_data.results) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + length=length, + mamode=mamode, + drift=drift, + offset=offset, + ) + + return self._run( + "/ta/atr", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def bbands( + self, + data: Union[List[Data], pandas.DataFrame], + target: str = "close", + index: str = "date", + length: int = 50, + std: Annotated[float, Ge(ge=0)] = 2, + mamode: Literal["sma", "ema", "wma", "rma"] = "sma", + offset: int = 0, + ) -> OBBject[List[Data]]: + """ + Bollinger Bands consist of three lines. The middle band is a simple + moving average (generally 20 periods) of the typical price (TP). The upper and lower + bands are F standard deviations (generally 2) above and below the middle band. + The bands widen and narrow when the volatility of the price is higher or lower, + respectively. + + Bollinger Bands do not, in themselves, generate buy or sell signals; + they are an indicator of overbought or oversold conditions. When the price is near the + upper or lower band it indicates that a reversal may be imminent. The middle band + becomes a support or resistance level. The upper and lower bands can also be + interpreted as price targets. When the price bounces off of the lower band and crosses + the middle band, then the upper band becomes the price target. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + target : str + Target column name. + index : str, optional + Index column name to use with `data`, by default "date". + length : int, optional + Number of periods to be used for the calculation, by default 50. + std : NonNegativeFloat, optional + Standard deviation to be used for the calculation, by default 2. + mamode : Literal["sma", "ema", "wma", "rma"], optional + Moving average mode to be used for the calculation, by default "sma". + offset : int, optional + Offset to be used for the calculation, by default 0. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> bbands = obb.ta.bbands( + >>> data=stock_data.results, target="close", length=50, std=2, mamode="sma", offset=0 + >>> ) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + index=index, + length=length, + std=std, + mamode=mamode, + offset=offset, + ) + + return self._run( + "/ta/bbands", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def cci( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + length: Annotated[int, Gt(gt=0)] = 14, + scalar: Annotated[float, Gt(gt=0)] = 0.015, + ) -> OBBject[List[Data]]: + """ + The CCI is designed to detect beginning and ending market trends. + The range of 100 to -100 is the normal trading range. CCI values outside of this + range indicate overbought or oversold conditions. You can also look for price + divergence in the CCI. If the price is making new highs, and the CCI is not, + then a price correction is likely. + + Parameters + ---------- + data : List[Data] + The data to use for the CCI calculation. + index : str, optional + Index column name to use with `data`, by default "date". + length : PositiveInt, optional + The length of the CCI, by default 14. + scalar : PositiveFloat, optional + The scalar of the CCI, by default 0.015. + + Returns + ------- + OBBject[List[Data]] + The CCI data. + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + length=length, + scalar=scalar, + ) + + return self._run( + "/ta/cci", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def cg( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + length: Annotated[int, Gt(gt=0)] = 14, + ) -> OBBject[List[Data]]: + """ + The Center of Gravity indicator, in short, is used to anticipate future price movements + and to trade on price reversals as soon as they happen. However, just like other oscillators, + the COG indicator returns the best results in range-bound markets and should be avoided when + the price is trending. Traders who use it will be able to closely speculate the upcoming + price change of the asset. + + Parameters + ---------- + data : List[Data] + The data to use for the COG calculation. + index : str, optional + Index column name to use with `data`, by default "date" + length : PositiveInt, optional + The length of the COG, by default 14 + + Returns + ------- + OBBject[List[Data]] + The COG data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> cg_data = obb.ta.cg(data=stock_data.results, length=14) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + length=length, + ) + + return self._run( + "/ta/cg", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def clenow( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + target: str = "adj_close", + period: Annotated[int, Gt(gt=0)] = 90, + ) -> OBBject[List[Data]]: + """ + Clenow Volatility Adjusted Momentum. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + index : str, optional + Index column name to use with `data`, by default "date". + target : str, optional + Target column name, by default "adj_close". + period : PositiveInt, optional + Number of periods for the momentum, by default 90. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> clenow_data = obb.ta.clenow(data=stock_data.results,period=90) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + target=target, + period=period, + ) + + return self._run( + "/ta/clenow", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def cones( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + lower_q: float = 0.25, + upper_q: float = 0.75, + model: Literal[ + "STD", + "Parkinson", + "Garman-Klass", + "Hodges-Tompkins", + "Rogers-Satchell", + "Yang-Zhang", + ] = "STD", + is_crypto: bool = False, + ) -> OBBject[List[Data]]: + """Calculate the realized volatility quantiles over rolling windows of time. + + The model for calculating volatility is selectable. + + Parameters + ---------- + data : List[Data] + The data to use for the calculation. + index : str, optional + Index column name to use with `data`, by default "date" + lower_q : float, optional + The lower quantile value for calculations + upper_q : float, optional + The upper quantile value for calculations + model : Literal["STD", "Parkinson", "Garman-Klass", "Hodges-Tompkins", "Rogers-Satchell", "Yang-Zhang"], optional + The model used to calculate realized volatility + + Standard deviation measures how widely returns are dispersed from the average return. + It is the most common (and biased) estimator of volatility. + + Parkinson volatility uses the high and low price of the day rather than just close to close prices. + It is useful for capturing large price movements during the day. + + Garman-Klass volatility extends Parkinson volatility by taking into account the opening and closing price. + As markets are most active during the opening and closing of a trading session; + it makes volatility estimation more accurate. + + Hodges-Tompkins volatility is a bias correction for estimation using an overlapping data sample. + It produces unbiased estimates and a substantial gain in efficiency. + + Rogers-Satchell is an estimator for measuring the volatility with an average return not equal to zero. + Unlike Parkinson and Garman-Klass estimators, Rogers-Satchell incorporates a drift term, + mean return not equal to zero. + + Yang-Zhang volatility is the combination of the overnight (close-to-open volatility). + It is a weighted average of the Rogers-Satchell volatility and the open-to-close volatility. + is_crypto : bool, optional + Whether the data is crypto or not. If True, volatility is calculated for 365 days instead of 252 + + Returns + ------- + OBBject[List[Data]] + The cones data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> cones_data = obb.ta.cones(data=stock_data.results, lower_q=0.25, upper_q=0.75, model="STD") + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + lower_q=lower_q, + upper_q=upper_q, + model=model, + is_crypto=is_crypto, + ) + + return self._run( + "/ta/cones", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def demark( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + target: str = "close", + show_all: bool = False, + asint: bool = False, + offset: int = 0, + ) -> OBBject[List[Data]]: + """ + Demark sequential indicator + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + index : str, optional + Index column name to use with `data`, by default "date". + target : str, optional + Target column name, by default "close". + show_all : bool, optional + Show 1 - 13. If set to False, show 6 - 9 + asint : bool, optional + If True, fill NAs with 0 and change type to int, by default False + offset : int, optional + How many periods to offset the result + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> demark_data = obb.ta.demark(data=stock_data.results,offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + target=target, + show_all=show_all, + asint=asint, + offset=offset, + ) + + return self._run( + "/ta/demark", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def donchian( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + lower_length: Annotated[int, Gt(gt=0)] = 20, + upper_length: Annotated[int, Gt(gt=0)] = 20, + offset: int = 0, + ) -> OBBject[List[Data]]: + """ + Donchian Channels are three lines generated by moving average + calculations that comprise an indicator formed by upper and lower + bands around a midrange or median band. The upper band marks the + highest price of a security over N periods while the lower band + marks the lowest price of a security over N periods. The area + between the upper and lower bands represents the Donchian Channel. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + index : str, optional + Index column name to use with `data`, by default "date". + lower_length : PositiveInt, optional + Number of periods for the lower band, by default 20. + upper_length : PositiveInt, optional + Number of periods for the upper band, by default 20. + offset : int, optional + Offset of the Donchian Channel, by default 0. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> donchian_data = obb.ta.donchian(data=stock_data.results,lower_length=20,upper_length=20,offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + lower_length=lower_length, + upper_length=upper_length, + offset=offset, + ) + + return self._run( + "/ta/donchian", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def ema( + self, + data: Union[List[Data], pandas.DataFrame], + target: str = "close", + index: str = "date", + length: int = 50, + offset: int = 0, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + The Exponential Moving Average is a staple of technical + analysis and is used in countless technical indicators. In a Simple Moving + Average, each value in the time period carries equal weight, and values outside + of the time period are not included in the average. However, the Exponential + Moving Average is a cumulative calculation, including all data. Past values have + a diminishing contribution to the average, while more recent values have a greater + contribution. This method allows the moving average to be more responsive to changes + in the data. + + Parameters + ---------- + data : List[Data] + The data to use for the calculation. + target : str + Target column name. + index : str, optional + Index column name to use with `data`, by default "date" + length : int, optional + The length of the calculation, by default 50. + offset : int, optional + The offset of the calculation, by default 0. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> ema_data = obb.ta.ema(data=stock_data.results,target="close",length=50,offset=0) + + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + index=index, + length=length, + offset=offset, + chart=chart, + ) + + return self._run( + "/ta/ema", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def fib( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + close_column: Literal["close", "adj_close"] = "close", + period: Annotated[int, Gt(gt=0)] = 120, + start_date: Optional[str] = None, + end_date: Optional[str] = None, + ) -> OBBject[List[Data]]: + """Create Fibonacci Retracement Levels. + + Parameters + ---------- + data : List[Data] + List of data to apply the indicator to. + index : str, optional + Index column name, by default "date" + period : PositiveInt, optional + Period to calculate the indicator, by default 120 + + Returns + ------- + OBBject[List[Data]] + List of data with the indicator applied. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> fib_data = obb.ta.fib(data=stock_data.results, period=120) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + close_column=close_column, + period=period, + start_date=start_date, + end_date=end_date, + ) + + return self._run( + "/ta/fib", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def fisher( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + length: Annotated[int, Gt(gt=0)] = 14, + signal: Annotated[int, Gt(gt=0)] = 1, + ) -> OBBject[List[Data]]: + """ + The Fisher Transform is a technical indicator created by John F. Ehlers + that converts prices into a Gaussian normal distribution.1 The indicator + highlights when prices have moved to an extreme, based on recent prices. + This may help in spotting turning points in the price of an asset. It also + helps show the trend and isolate the price waves within a trend. + + Parameters + ---------- + data : List[Data] + List of data to apply the indicator to. + index : str, optional + Index column name, by default "date" + length : PositiveInt, optional + Fisher period, by default 14 + signal : PositiveInt, optional + Fisher Signal period, by default 1 + + Returns + ------- + OBBject[List[Data]] + List of data with the indicator applied. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> fisher_data = obb.ta.fisher(data=stock_data.results, length=14, signal=1) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + length=length, + signal=signal, + ) + + return self._run( + "/ta/fisher", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def hma( + self, + data: Union[List[Data], pandas.DataFrame], + target: str = "close", + index: str = "date", + length: int = 50, + offset: int = 0, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + The Hull Moving Average solves the age old dilemma of making a moving average + more responsive to current price activity whilst maintaining curve smoothness. + In fact the HMA almost eliminates lag altogether and manages to improve smoothing + at the same time. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + target : str + Target column name. + index : str, optional + Index column name to use with `data`, by default "date". + length : int, optional + Number of periods for the HMA, by default 50. + offset : int, optional + Offset of the HMA, by default 0. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> hma_data = obb.ta.hma(data=stock_data.results,target="close",length=50,offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + index=index, + length=length, + offset=offset, + chart=chart, + ) + + return self._run( + "/ta/hma", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def ichimoku( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + conversion: Annotated[int, Gt(gt=0)] = 9, + base: Annotated[int, Gt(gt=0)] = 26, + lagging: Annotated[int, Gt(gt=0)] = 52, + offset: Annotated[int, Gt(gt=0)] = 26, + lookahead: bool = False, + ) -> OBBject[List[Data]]: + """ + The Ichimoku Cloud, also known as Ichimoku Kinko Hyo, is a versatile indicator that + defines support and resistance, identifies trend direction, gauges momentum and provides + trading signals. Ichimoku Kinko Hyo translates into "one look equilibrium chart". With + one look, chartists can identify the trend and look for potential signals within that trend. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + index : str, optional + Index column name to use with `data`, by default "date". + conversion : PositiveInt, optional + Number of periods for the conversion line, by default 9. + base : PositiveInt, optional + Number of periods for the base line, by default 26. + lagging : PositiveInt, optional + Number of periods for the lagging span, by default 52. + offset : PositiveInt, optional + Number of periods for the offset, by default 26. + lookahead : bool, optional + drops the Chikou Span Column to prevent potential data leak + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + conversion=conversion, + base=base, + lagging=lagging, + offset=offset, + lookahead=lookahead, + ) + + return self._run( + "/ta/ichimoku", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def kc( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + length: Annotated[int, Gt(gt=0)] = 20, + scalar: Annotated[float, Gt(gt=0)] = 20, + mamode: Literal["ema", "sma", "wma", "hma", "zlma"] = "ema", + offset: Annotated[int, Ge(ge=0)] = 0, + ) -> OBBject[List[Data]]: + """ + Keltner Channels are volatility-based bands that are placed + on either side of an asset's price and can aid in determining + the direction of a trend.The Keltner channel uses the average + true range (ATR) or volatility, with breaks above or below the top + and bottom barriers signaling a continuation. + + Parameters + ---------- + data : List[Data] + The data to use for the Keltner Channels calculation. + index : str, optional + Index column name to use with `data`, by default "date" + length : PositiveInt, optional + The length of the Keltner Channels, by default 20 + scalar : PositiveFloat, optional + The scalar to use for the Keltner Channels, by default 20 + mamode : Literal["ema", "sma", "wma", "hma", "zlma"], optional + The moving average mode to use for the Keltner Channels, by default "ema" + offset : NonNegativeInt, optional + The offset to use for the Keltner Channels, by default 0 + + Returns + ------- + OBBject[List[Data]] + The Keltner Channels data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> kc_data = obb.ta.kc(data=stock_data.results, length=20, scalar=20, ma_mode="ema", offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + length=length, + scalar=scalar, + mamode=mamode, + offset=offset, + ) + + return self._run( + "/ta/kc", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def macd( + self, + data: Union[List[Data], pandas.DataFrame], + target: str = "close", + index: str = "date", + fast: int = 12, + slow: int = 26, + signal: int = 9, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + The Moving Average Convergence Divergence (MACD) is the difference + between two Exponential Moving Averages. The Signal line is an Exponential Moving + Average of the MACD. + + The MACD signals trend changes and indicates the start of new trend direction. + High values indicate overbought conditions, low values indicate oversold conditions. + Divergence with the price indicates an end to the current trend, especially if the + MACD is at extreme high or low values. When the MACD line crosses above the + signal line a buy signal is generated. When the MACD crosses below the signal line a + sell signal is generated. To confirm the signal, the MACD should be above zero for a buy, + and below zero for a sell. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + target : str + Target column name. + fast : int, optional + Number of periods for the fast EMA, by default 12. + slow : int, optional + Number of periods for the slow EMA, by default 26. + signal : int, optional + Number of periods for the signal EMA, by default 9. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> macd_data = obb.ta.macd(data=stock_data.results,target="close",fast=12,slow=26,signal=9) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + index=index, + fast=fast, + slow=slow, + signal=signal, + chart=chart, + ) + + return self._run( + "/ta/macd", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def obv( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + offset: int = 0, + ) -> OBBject[List[Data]]: + """ + The On Balance Volume (OBV) is a cumulative total of the up and + down volume. When the close is higher than the previous close, the volume is added + to the running total, and when the close is lower than the previous close, the volume + is subtracted from the running total. + + To interpret the OBV, look for the OBV to move with the price or precede price moves. + If the price moves before the OBV, then it is a non-confirmed move. A series of rising peaks, + or falling troughs, in the OBV indicates a strong trend. If the OBV is flat, then the market + is not trending. + + Parameters + ---------- + data : List[Data] + List of data to apply the indicator to. + index : str, optional + Index column name, by default "date" + offset : int, optional + How many periods to offset the result, by default 0. + + Returns + ------- + OBBject[List[Data]] + List of data with the indicator applied. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> obv_data = obb.ta.obv(data=stock_data.results, offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + offset=offset, + ) + + return self._run( + "/ta/obv", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def rsi( + self, + data: Union[List[Data], pandas.DataFrame], + target: str = "close", + index: str = "date", + length: int = 14, + scalar: float = 100.0, + drift: int = 1, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + The Relative Strength Index (RSI) calculates a ratio of the + recent upward price movements to the absolute price movement. The RSI ranges + from 0 to 100. The RSI is interpreted as an overbought/oversold indicator when + the value is over 70/below 30. You can also look for divergence with price. If + the price is making new highs/lows, and the RSI is not, it indicates a reversal. + + Parameters + ---------- + data : List[Data] + The data to use for the RSI calculation. + target : str + Target column name. + index : str, optional + Index column name to use with `data`, by default "date" + length : int, optional + The length of the RSI, by default 14 + scalar : float, optional + The scalar to use for the RSI, by default 100.0 + drift : int, optional + The drift to use for the RSI, by default 1 + + Returns + ------- + OBBject[List[Data]] + The RSI data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> rsi_data = obb.ta.rsi(data=stock_data.results, target="close", length=14, scalar=100.0, drift=1) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + index=index, + length=length, + scalar=scalar, + drift=drift, + chart=chart, + ) + + return self._run( + "/ta/rsi", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def sma( + self, + data: Union[List[Data], pandas.DataFrame], + target: str = "close", + index: str = "date", + length: int = 50, + offset: int = 0, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + Moving Averages are used to smooth the data in an array to + help eliminate noise and identify trends. The Simple Moving Average is literally + the simplest form of a moving average. Each output value is the average of the + previous n values. In a Simple Moving Average, each value in the time period carries + equal weight, and values outside of the time period are not included in the average. + This makes it less responsive to recent changes in the data, which can be useful for + filtering out those changes. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + target : str + Target column name. + index : str, optional + Index column name to use with `data`, by default "date". + length : int, optional + Number of periods to be used for the calculation, by default 50. + offset : int, optional + Offset from the current period, by default 0. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> sma_data = obb.ta.sma(data=stock_data.results,target="close",length=50,offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + index=index, + length=length, + offset=offset, + chart=chart, + ) + + return self._run( + "/ta/sma", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def stoch( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + fast_k_period: Annotated[int, Ge(ge=0)] = 14, + slow_d_period: Annotated[int, Ge(ge=0)] = 3, + slow_k_period: Annotated[int, Ge(ge=0)] = 3, + ) -> OBBject[List[Data]]: + """ + The Stochastic Oscillator measures where the close is in relation + to the recent trading range. The values range from zero to 100. %D values over 75 + indicate an overbought condition; values under 25 indicate an oversold condition. + When the Fast %D crosses above the Slow %D, it is a buy signal; when it crosses + below, it is a sell signal. The Raw %K is generally considered too erratic to use + for crossover signals. + + Parameters + ---------- + data : List[Data] + The data to use for the Stochastic Oscillator calculation. + index : str, optional + Index column name to use with `data`, by default "date". + fast_k_period : NonNegativeInt, optional + The fast %K period, by default 14. + slow_d_period : NonNegativeInt, optional + The slow %D period, by default 3. + slow_k_period : NonNegativeInt, optional + The slow %K period, by default 3. + + Returns + ------- + OBBject[List[Data]] + The Stochastic Oscillator data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> stoch_data = obb.ta.stoch(data=stock_data.results, fast_k_period=14, slow_d_period=3, slow_k_period=3) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + fast_k_period=fast_k_period, + slow_d_period=slow_d_period, + slow_k_period=slow_k_period, + ) + + return self._run( + "/ta/stoch", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def vwap( + self, + data: Union[List[Data], pandas.DataFrame], + index: str = "date", + anchor: str = "D", + offset: int = 0, + ) -> OBBject[List[Data]]: + """ + The Volume Weighted Average Price that measures the average typical price + by volume. It is typically used with intraday charts to identify general direction. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + index : str, optional + Index column name to use with `data`, by default "date". + anchor : str, optional + Anchor period to use for the calculation, by default "D". + See Timeseries Offset Aliases below for additional options: + https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases + offset : int, optional + Offset from the current period, by default 0. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> vwap_data = obb.ta.vwap(data=stock_data.results,anchor="D",offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + index=index, + anchor=anchor, + offset=offset, + ) + + return self._run( + "/ta/vwap", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def wma( + self, + data: Union[List[Data], pandas.DataFrame], + target: str = "close", + index: str = "date", + length: int = 50, + offset: int = 0, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + A Weighted Moving Average puts more weight on recent data and less on past data. + This is done by multiplying each bar's price by a weighting factor. Because of its + unique calculation, WMA will follow prices more closely than a corresponding Simple + Moving Average. + + Parameters + ---------- + data : List[Data] + The data to use for the calculation. + target : str + Target column name. + index : str, optional + Index column name to use with `data`, by default "date". + length : int, optional + The length of the WMA, by default 50. + offset : int, optional + The offset of the WMA, by default 0. + + Returns + ------- + OBBject[List[Data]] + The WMA data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> wma_data = obb.ta.wma(data=stock_data.results, target="close", length=50, offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + index=index, + length=length, + offset=offset, + chart=chart, + ) + + return self._run( + "/ta/wma", + **inputs, + ) + + @validate_call(config=dict(arbitrary_types_allowed=True)) + def zlma( + self, + data: Union[List[Data], pandas.DataFrame], + target: str = "close", + index: str = "date", + length: int = 50, + offset: int = 0, + chart: bool = False, + ) -> OBBject[List[Data]]: + """ + The zero lag exponential moving average (ZLEMA) indicator + was created by John Ehlers and Ric Way. The idea is do a + regular exponential moving average (EMA) calculation but + on a de-lagged data instead of doing it on the regular data. + Data is de-lagged by removing the data from "lag" days ago + thus removing (or attempting to) the cumulative effect of + the moving average. + + Parameters + ---------- + data : List[Data] + List of data to be used for the calculation. + target : str + Target column name. + index : str, optional + Index column name to use with `data`, by default "date". + length : int, optional + Number of periods to be used for the calculation, by default 50. + offset : int, optional + Offset to be used for the calculation, by default 0. + + Returns + ------- + OBBject[List[Data]] + The calculated data. + + Examples + -------- + >>> from openbb import obb + >>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp") + >>> zlma_data = obb.ta.zlma(data=stock_data.results, target="close", length=50, offset=0) + """ # noqa: E501 + + inputs = filter_inputs( + data=data, + target=target, + index=index, + length=length, + offset=offset, + chart=chart, + ) + + return self._run( + "/ta/zlma", + **inputs, + ) diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/gdpforecast.py b/openbb_platform/platform/provider/openbb_provider/standard_models/gdpforecast.py new file mode 100644 index 00000000000..2fc26aedecb --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/gdpforecast.py @@ -0,0 +1,39 @@ +"""GDP data and query params.""" +from datetime import date as dateType +from typing import Literal, Optional + +from pydantic import Field + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams +from openbb_provider.utils.descriptions import DATA_DESCRIPTIONS, QUERY_DESCRIPTIONS + + +class GDPForecastQueryParams(QueryParams): + """GDP Forecast query.""" + + period: Literal["quarter", "annual"] = Field( + default="annual", + description="Units for nominal GDP period. Either quarter or annual.", + ) + start_date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("start_date") + ) + end_date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("end_date") + ) + type: Literal["nominal", "real"] = Field( + default="real", + description="Type of GDP to get forecast of. Either nominal or real.", + ) + + +class GDPForecastData(Data): + """Nominal GDP data.""" + + date: Optional[dateType] = Field( + default=None, description=DATA_DESCRIPTIONS.get("date") + ) + value: Optional[float] = Field( + default=None, description="Nominal GDP value on the date." + ) diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/gdpnom.py b/openbb_platform/platform/provider/openbb_provider/standard_models/gdpnom.py new file mode 100644 index 00000000000..64d2a9ea2b1 --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/gdpnom.py @@ -0,0 +1,35 @@ +"""GDP data and query params.""" +from datetime import date as dateType +from typing import Literal, Optional + +from pydantic import Field + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams +from openbb_provider.utils.descriptions import DATA_DESCRIPTIONS, QUERY_DESCRIPTIONS + + +class GDPNomQueryParams(QueryParams): + """Nominal GDP query.""" + + units: Literal["usd", "usd_cap"] = Field( + default="usd", + description="Units to get nominal GDP in. Either usd or usd_cap indicating per capita.", + ) + start_date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("start_date") + ) + end_date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("end_date") + ) + + +class GDPNomData(Data): + """Nominal GDP data.""" + + date: Optional[dateType] = Field( + default=None, description=DATA_DESCRIPTIONS.get("date") + ) + value: Optional[float] = Field( + default=None, description="Nominal GDP value on the date." + ) diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/gdpreal.py b/openbb_platform/platform/provider/openbb_provider/standard_models/gdpreal.py new file mode 100644 index 00000000000..6bfdbb37798 --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/gdpreal.py @@ -0,0 +1,35 @@ +"""GDP data and query params.""" +from datetime import date as dateType +from typing import Literal, Optional + +from pydantic import Field + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams +from openbb_provider.utils.descriptions import DATA_DESCRIPTIONS, QUERY_DESCRIPTIONS + + +class GDPRealQueryParams(QueryParams): + """Real GDP query.""" + + units: Literal["idx", "qoq", "yoy"] = Field( + default="yoy", + description="Units to get real GDP in. Either idx (indicating 2015=100), qoq (previous period) or yoy (same period, previous year).)", + ) + start_date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("start_date") + ) + end_date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("end_date") + ) + + +class GDPRealData(Data): + """Real GDP data.""" + + date: Optional[dateType] = Field( + default=None, description=DATA_DESCRIPTIONS.get("date") + ) + value: Optional[float] = Field( + default=None, description="Nominal GDP value on the date." + ) diff --git a/openbb_platform/platform/provider/pyproject.toml b/openbb_platform/platform/provider/pyproject.toml index 17807add7ca..710b8e50fd4 100644 --- a/openbb_platform/platform/provider/pyproject.toml +++ b/openbb_platform/platform/provider/pyproject.toml @@ -11,7 +11,7 @@ python = "^3.8" importlib_metadata = "^6.8.0" pydantic = "^2.4.2" requests = "^2.31.0" -urllib3 = "<2.0.0" +urllib3 = ">2.0.0" importlib-metadata = "^6.8.0" python-dotenv = "^1.0.0" pytest-recorder = "^0.2.3" diff --git a/openbb_platform/providers/oecd/README.md b/openbb_platform/providers/oecd/README.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_platform/providers/oecd/__init__.py b/openbb_platform/providers/oecd/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_platform/providers/oecd/openbb_oecd/__init__.py b/openbb_platform/providers/oecd/openbb_oecd/__init__.py new file mode 100644 index 00000000000..d7f64d64572 --- /dev/null +++ b/openbb_platform/providers/oecd/openbb_oecd/__init__.py @@ -0,0 +1,16 @@ +"""FRED provider module.""" +from openbb_oecd.models.gdpforecast import OECDGDPForecastFetcher +from openbb_oecd.models.gdpnom import OECDGDPNomFetcher +from openbb_oecd.models.gdpreal import OECDGDPRealFetcher +from openbb_provider.abstract.provider import Provider + +oecd_provider = Provider( + name="oecd", + website="https://stats.oecd.org/", + description="""OECD""", + fetcher_dict={ + "GDPNom": OECDGDPNomFetcher, + "GDPReal": OECDGDPRealFetcher, + "GDPForecast": OECDGDPForecastFetcher, + }, +) diff --git a/openbb_platform/providers/oecd/openbb_oecd/models/gdpforecast.py b/openbb_platform/providers/oecd/openbb_oecd/models/gdpforecast.py new file mode 100644 index 00000000000..4224f36f6a4 --- /dev/null +++ b/openbb_platform/providers/oecd/openbb_oecd/models/gdpforecast.py @@ -0,0 +1,94 @@ +import re +from datetime import date +from typing import Any, Dict, List, Literal, Optional, Union + +from openbb_oecd.utils import constants, helpers +from openbb_provider.abstract.fetcher import Fetcher +from openbb_provider.standard_models.gdpforecast import ( + GDPForecastData, + GDPForecastQueryParams, +) +from pydantic import Field, field_validator + +gdp_countries = tuple(constants.COUNTRY_TO_CODE_GDP_FORECAST.keys()) + + +class OECDGDPForecastQueryParams(GDPForecastQueryParams): + """GDP Forecast query.""" + + country: Literal[*gdp_countries] = Field( + description="Country to get GDP for.", default="united_states" + ) + + +class OECDGDPForecastData(GDPForecastData): + """GDP Forecast data from OECD.""" + + @field_validator("date", mode="before") + @classmethod + def date_validate( + cls, in_date: Union[date, Union[str, int]] + ): # pylint: disable=E0213 + """Validate value.""" + # OECD Returns dates like 2022-Q2, so we map that to the end of the quarter. + if isinstance(in_date, str): + if re.match(r"\d{4}-Q[1-4]$", in_date): + year, quarter = in_date.split("-") + quarter = int(quarter[1]) + month = quarter * 3 + return date(int(year), month, 1) + else: + raise ValueError("Date string does not match the format YYYY-QN") + if isinstance(in_date, int): + return date(in_date, 12, 31) + return date + + +class OECDGDPForecastFetcher( + Fetcher[OECDGDPForecastQueryParams, List[OECDGDPForecastData]] +): + """OECD GDP Forecast Fetcher.""" + + @staticmethod + def transform_query(params: Dict[str, Any]) -> OECDGDPForecastQueryParams: + transformed_params = params.copy() + if transformed_params["start_date"] is None: + transformed_params["start_date"] = date(1990, 1, 1) + if transformed_params["end_date"] is None: + transformed_params["end_date"] = date(date.today().year + 10, 12, 31) + + return OECDGDPForecastQueryParams(**transformed_params) + + @staticmethod + def extract_data( + query: OECDGDPForecastQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> dict: + units = query.period[0].upper() + if query.type == "real": + url = f"https://stats.oecd.org/sdmx-json/data/DP_LIVE/.REALGDPFORECAST.TOT.AGRWTH.{units}/OECD?contentType=csv&detail=code&separator=comma&csv-lang=en&startPeriod={query.start_date}&endPeriod={query.end_date}" + elif query.type == "nominal": + url = f"https://stats.oecd.org/sdmx-json/data/DP_LIVE/.NOMGDPFORECAST.TOT.AGRWTH.{units}/OECD?contentType=csv&detail=code&separator=comma&csv-lang=en&startPeriod={query.start_date}&endPeriod={query.end_date}" + + data_df = helpers.fetch_data(url, csv_kwargs={"encoding": "utf-8"}, **kwargs) + # Sometimes there is weird unicode characters in the column names, so we need to rename them. + # Even changing the encoding on the fetch doesn't seem to help. + data_df = data_df.rename( + columns={ + '"LOCATION"': "country", + "TIME": "date", + "Value": "value", + "Location": "country", + } + ) + data_df["country"] = data_df["country"].map( + constants.CODE_TO_COUNTRY_GDP_FORECAST + ) + data_df = data_df[data_df["country"] == query.country] + data_df = data_df[["country", "date", "value"]] + return data_df.to_dict(orient="records") + + @staticmethod + def transform_data(data: dict) -> List[OECDGDPForecastData]: + return [OECDGDPForecastData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/oecd/openbb_oecd/models/gdpnom.py b/openbb_platform/providers/oecd/openbb_oecd/models/gdpnom.py new file mode 100644 index 00000000000..bbe5e2ce26c --- /dev/null +++ b/openbb_platform/providers/oecd/openbb_oecd/models/gdpnom.py @@ -0,0 +1,74 @@ +"""OECD GDP Fetcher.""" + + +from datetime import date +from typing import Any, Dict, List, Literal, Optional, Union + +from openbb_oecd.utils import constants, helpers +from openbb_provider.abstract.fetcher import Fetcher +from openbb_provider.standard_models.gdpnom import GDPNomData, GDPNomQueryParams +from pydantic import Field, field_validator + +gdp_countries = tuple(constants.COUNTRY_TO_CODE_GDP.keys()) + + +class OECDGDPNomQueryParams(GDPNomQueryParams): + """GDP query.""" + + country: Literal[*gdp_countries] = Field( + description="Country to get GDP for.", default="united_states" + ) + + +class OECDGDPNomData(GDPNomData): + """Nominal GDP data from OECD.""" + + @field_validator("date", mode="before") + @classmethod + def date_validate(cls, in_date: Union[date, int]): # pylint: disable=E0213 + """Validate value.""" + if isinstance(in_date, int): + return date(in_date, 12, 31) + return date + + +class OECDGDPNomFetcher(Fetcher[OECDGDPNomQueryParams, List[OECDGDPNomData]]): + """OECD Nominal GDP Fetcher.""" + + @staticmethod + def transform_query(params: Dict[str, Any]) -> OECDGDPNomQueryParams: + transformed_params = params.copy() + if transformed_params["start_date"] is None: + transformed_params["start_date"] = date(1950, 1, 1) + if transformed_params["end_date"] is None: + transformed_params["end_date"] = date(date.today().year, 12, 31) + + return OECDGDPNomQueryParams(**transformed_params) + + @staticmethod + def extract_data( + query: OECDGDPNomQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> dict: + unit = "MLN_USD" if query.units == "usd" else "USD_CAP" + url = f"https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.{unit}.A/OECD?contentType=csv&detail=code&separator=comma&csv-lang=en&startPeriod={query.start_date}&endPeriod={query.end_date}" + data_df = helpers.fetch_data(url, csv_kwargs={"encoding": "utf-8"}, **kwargs) + # Sometimes there is weird unicode characters in the column names, so we need to rename them. + # Even changing the encoding on the fetch doesn't seem to help. + data_df = data_df.rename( + columns={ + '"LOCATION"': "country", + "TIME": "date", + "Value": "value", + "Location": "country", + } + ) + data_df["country"] = data_df["country"].map(constants.CODE_TO_COUNTRY_GDP) + data_df = data_df[data_df["country"] == query.country] + data_df = data_df[["country", "date", "value"]] + return data_df.to_dict(orient="records") + + @staticmethod + def transform_data(data: dict) -> List[OECDGDPNomData]: + return [OECDGDPNomData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/oecd/openbb_oecd/models/gdpreal.py b/openbb_platform/providers/oecd/openbb_oecd/models/gdpreal.py new file mode 100644 index 00000000000..26dc99596bd --- /dev/null +++ b/openbb_platform/providers/oecd/openbb_oecd/models/gdpreal.py @@ -0,0 +1,83 @@ +"""OECD GDP Fetcher.""" + + +from datetime import date +from typing import Any, Dict, List, Literal, Optional, Union + +from openbb_oecd.utils import constants, helpers +from openbb_provider.abstract.fetcher import Fetcher +from openbb_provider.standard_models.gdpreal import GDPRealData, GDPRealQueryParams +from pydantic import Field, field_validator + +rgdp_countries = tuple(constants.COUNTRY_TO_CODE_RGDP.keys()) + + +class OECDGDPRealQueryParams(GDPRealQueryParams): + """GDP query.""" + + country: Literal[*rgdp_countries] = Field( + description="Country to get GDP for.", default="united_states" + ) + + +class OECDGDPRealData(GDPRealData): + """Nominal GDP data from OECD.""" + + @field_validator("date", mode="before") + @classmethod + def date_validate(cls, in_date: Union[date, str]): # pylint: disable=E0213 + """Validate value.""" + if isinstance(in_date, str): + year, quarter = in_date.split("-") + year = int(year) + if quarter == "Q1": + return date(year, 3, 31) + elif quarter == "Q2": + return date(year, 6, 30) + elif quarter == "Q3": + return date(year, 9, 30) + elif quarter == "Q4": + return date(year, 12, 31) + return in_date + + +class OECDGDPRealFetcher(Fetcher[OECDGDPRealQueryParams, List[OECDGDPRealData]]): + """OECD Nominal GDP Fetcher.""" + + @staticmethod + def transform_query(params: Dict[str, Any]) -> OECDGDPRealQueryParams: + transformed_params = params.copy() + if transformed_params["start_date"] is None: + transformed_params["start_date"] = date(1950, 1, 1) + if transformed_params["end_date"] is None: + transformed_params["end_date"] = date(date.today().year, 12, 31) + + return OECDGDPRealQueryParams(**transformed_params) + + @staticmethod + def extract_data( + query: OECDGDPRealQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> dict: + units = {"qoq": "PC_CHGPP", "yoy": "PC_CHGPY", "idx": "IDX"}[query.units] + url = f"https://stats.oecd.org/sdmx-json/data/DP_LIVE/.QGDP.{'VOLIDX' if units == 'IDX' else 'TOT'}.{units}.Q/OECD?contentType=csv&detail=code&separator=comma&csv-lang=en&startPeriod={query.start_date}&endPeriod={query.end_date}" + data_df = helpers.fetch_data(url, csv_kwargs={"encoding": "utf-8"}, **kwargs) + # Sometimes there is weird unicode characters in the column names, so we need to rename them. + # Even changing the encoding on the fetch doesn't seem to help. + data_df = data_df.rename( + columns={ + '"LOCATION"': "country", + "TIME": "date", + "Value": "value", + "Location": "country", + } + ) + data_df["country"] = data_df["country"].map(constants.CODE_TO_COUNTRY_RGDP) + data_df = data_df[data_df["country"] == query.country] + data_df = data_df[["country", "date", "value"]] + return data_df.to_dict(orient="records") + + @staticmethod + def transform_data(data: dict) -> List[OECDGDPRealData]: + return [OECDGDPRealData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/oecd/openbb_oecd/utils/constants.py b/openbb_platform/providers/oecd/openbb_oecd/utils/constants.py new file mode 100644 index 00000000000..af189d8d857 --- /dev/null +++ b/openbb_platform/providers/oecd/openbb_oecd/utils/constants.py @@ -0,0 +1,456 @@ +COUNTRY_TO_CODE_GDP = { + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "canada": "CAN", + "chile": "CHL", + "colombia": "COL", + "costa_rica": "CRI", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "euro_area": "EA", + "european_union": "EU", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "indonesia": "IDN", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "norway": "NOR", + "poland": "POL", + "portugal": "PRT", + "russia": "RUS", + "slovak_republic": "SVK", + "slovenia": "SVN", + "south_africa": "ZAF", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", +} + +CODE_TO_COUNTRY_GDP = {v: k for k, v in COUNTRY_TO_CODE_GDP.items()} + +COUNTRY_TO_CODE_RGDP = { + "G20": "G-20", + "G7": "G-7", + "argentina": "ARG", + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "bulgaria": "BGR", + "canada": "CAN", + "chile": "CHL", + "china": "CHN", + "colombia": "COL", + "costa_rica": "CRI", + "croatia": "HRV", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "euro_area_19": "EA19", + "europe": "OECDE", + "european_union_27": "EU27_2020", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "india": "IND", + "indonesia": "IDN", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "norway": "NOR", + "oecd_total": "OECD", + "poland": "POL", + "portugal": "PRT", + "romania": "ROU", + "russia": "RUS", + "saudi_arabia": "SAU", + "slovak_republic": "SVK", + "slovenia": "SVN", + "south_africa": "ZAF", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", +} + +CODE_TO_COUNTRY_RGDP = {v: k for k, v in COUNTRY_TO_CODE_RGDP.items()} + +COUNTRY_TO_CODE_GDP_FORECAST = { + "argentina": "ARG", + "asia": "DAE", + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "bulgaria": "BGR", + "canada": "CAN", + "chile": "CHL", + "china": "CHN", + "colombia": "COL", + "costa_rica": "CRI", + "croatia": "HRV", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "euro_area_17": "EA17", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "india": "IND", + "indonesia": "IDN", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "non-oecd": "NMEC", + "norway": "NOR", + "oecd_total": "OECD", + "peru": "PER", + "poland": "POL", + "portugal": "PRT", + "romania": "ROU", + "russia": "RUS", + "slovak_republic": "SVK", + "slovenia": "SVN", + "south_africa": "ZAF", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", + "world": "WLD", +} + +CODE_TO_COUNTRY_GDP_FORECAST = {v: k for k, v in COUNTRY_TO_CODE_GDP_FORECAST.items()} + +COUNTRY_TO_CODE_CPI = { + "G20": "G-20", + "G7": "G-7", + "argentina": "ARG", + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "canada": "CAN", + "chile": "CHL", + "china": "CHN", + "colombia": "COL", + "costa_rica": "CRI", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "euro_area_19": "EA19", + "europe": "OECDE", + "european_union_27": "EU27_2020", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "india": "IND", + "indonesia": "IDN", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "norway": "NOR", + "oecd_total": "OECD", + "poland": "POL", + "portugal": "PRT", + "russia": "RUS", + "saudi_arabia": "SAU", + "slovak_republic": "SVK", + "slovenia": "SVN", + "south_africa": "ZAF", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", +} + +COUNTRY_TO_CODE_BALANCE = { + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "canada": "CAN", + "chile": "CHL", + "colombia": "COL", + "costa_rica": "CRI", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "euro_area": "EA", + "european_union": "EU", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "indonesia": "IDN", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "norway": "NOR", + "poland": "POL", + "portugal": "PRT", + "russia": "RUS", + "slovak_republic": "SVK", + "slovenia": "SVN", + "south_africa": "ZAF", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", +} + +COUNTRY_TO_CODE_REVENUE = { + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "canada": "CAN", + "chile": "CHL", + "colombia": "COL", + "costa_rica": "CRI", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "euro_area": "EA", + "european_union": "EU", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "indonesia": "IDN", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "norway": "NOR", + "oecd_average": "OAVG", + "oecd_europe": "OEU", + "oecd_total": "OECD", + "poland": "POL", + "portugal": "PRT", + "romania": "ROU", + "russia": "RUS", + "slovak_republic": "SVK", + "slovenia": "SVN", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", +} + +COUNTRY_TO_CODE_SPENDING = { + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "canada": "CAN", + "chile": "CHL", + "colombia": "COL", + "costa_rica": "CRI", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "indonesia": "IDN", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "norway": "NOR", + "oecd_average": "OAVG", + "oecd_europe": "OEU", + "oecd_total": "OECD", + "poland": "POL", + "portugal": "PRT", + "romania": "ROU", + "russia": "RUS", + "slovak_republic": "SVK", + "slovenia": "SVN", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", +} + +COUNTRY_TO_CODE_DEBT = { + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "canada": "CAN", + "chile": "CHL", + "colombia": "COL", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "norway": "NOR", + "oecd_average": "OAVG", + "oecd_total": "OECD", + "poland": "POL", + "portugal": "PRT", + "romania": "ROU", + "russia": "RUS", + "slovak_republic": "SVK", + "slovenia": "SVN", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", +} + +COUNTRY_TO_CODE_TRUST = { + "australia": "AUS", + "austria": "AUT", + "belgium": "BEL", + "brazil": "BRA", + "canada": "CAN", + "chile": "CHL", + "colombia": "COL", + "costa_rica": "CRI", + "czech_republic": "CZE", + "denmark": "DNK", + "estonia": "EST", + "finland": "FIN", + "france": "FRA", + "germany": "DEU", + "greece": "GRC", + "hungary": "HUN", + "iceland": "ISL", + "ireland": "IRL", + "israel": "ISR", + "italy": "ITA", + "japan": "JPN", + "korea": "KOR", + "latvia": "LVA", + "lithuania": "LTU", + "luxembourg": "LUX", + "mexico": "MEX", + "netherlands": "NLD", + "new_zealand": "NZL", + "norway": "NOR", + "poland": "POL", + "portugal": "PRT", + "russia": "RUS", + "slovak_republic": "SVK", + "slovenia": "SVN", + "south_africa": "ZAF", + "spain": "ESP", + "sweden": "SWE", + "switzerland": "CHE", + "turkey": "TUR", + "united_kingdom": "GBR", + "united_states": "USA", +} diff --git a/openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py b/openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py new file mode 100644 index 00000000000..5b2f285a43e --- /dev/null +++ b/openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py @@ -0,0 +1,66 @@ +import ssl +import sys +from io import StringIO +from typing import Any, Dict, Optional + +import requests +import urllib3 +from openbb_provider import helpers +from pandas import DataFrame, read_csv + +if sys.version_info >= (3, 10): + PATCH = True +else: + PATCH = False + + +# OECD does not play well with newer python. This code block from stackoverflow helps +# to create a custom session: + + +class CustomHttpAdapter(requests.adapters.HTTPAdapter): + # "Transport adapter" that allows us to use custom ssl_context. + + def __init__(self, ssl_context=None, **kwargs): + self.ssl_context = ssl_context + super().__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = urllib3.poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + ssl_context=self.ssl_context, + ) + + +def get_legacy_session(): + """Stackoverflow code to create a custom session.""" + ctx = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) + ctx.options |= 0x4 # OP_LEGACY_SERVER_CONNECT + session = requests.Session() + session.mount("https://", CustomHttpAdapter(ctx)) + return session + + +def create_session(): + """Create a session for making requests to the OECD API. + + This will create the patched session if the python version is >= 3.10. Otherwise, + it will just use regular requests. + """ + if PATCH: + return get_legacy_session() + return requests.Session() + + +def fetch_data(url: str, csv_kwargs: Optional[Dict] = None, **kwargs: Any) -> DataFrame: + """Create a session and fetch data from the OECD API.""" + session = create_session() + response = helpers.make_request(url, session=session, **kwargs) + if csv_kwargs is None: + csv_kwargs = {} + # Pass any additional arguments to read_csv. This will likely need to be skiplines + # or a delimiter. + data = read_csv(StringIO(response.text), **csv_kwargs) + return data diff --git a/openbb_platform/providers/oecd/poetry.lock b/openbb_platform/providers/oecd/poetry.lock new file mode 100644 index 00000000000..65b09855641 --- /dev/null +++ b/openbb_platform/providers/oecd/poetry.lock @@ -0,0 +1,1529 @@ +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.0.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, + {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.22)"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "bcrypt" +version = "4.0.1" +description = "Modern password hashing for your software and your servers" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + +[[package]] +name = "black" +version = "23.9.1" +description = "The uncompromising code formatter." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, + {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, + {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, + {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, + {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, + {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, + {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, + {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, + {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, + {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, + {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "ecdsa" +version = "0.18.0" +description = "ECDSA cryptographic signature library (pure python)" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, + {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastapi" +version = "0.100.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, + {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" +starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["chardet (>=2.2)", "genshi", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "monotonic" +version = "1.6" +description = "An implementation of time.monotonic() for Python 2 & < 3.3" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"}, + {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "numpy" +version = "1.24.4" +description = "Fundamental package for array computing in Python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, +] + +[[package]] +name = "numpy" +version = "1.25.2" +description = "Fundamental package for array computing in Python" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, + {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, + {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, + {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, + {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, + {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, + {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, + {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, + {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, + {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, + {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, + {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, +] + +[[package]] +name = "openbb-core" +version = "0.1.0a2" +description = "OpenBB package with core functionality" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "openbb_core-0.1.0a2-py3-none-any.whl", hash = "sha256:d811f57029f352593fe71fbf90757dad8bd73b325c817ca2588ab4e8d30bad06"}, + {file = "openbb_core-0.1.0a2.tar.gz", hash = "sha256:b98c37440ba29a82b9acb0cb5b8853e4f873291b3f2a1912a0a050ae542e1293"}, +] + +[package.dependencies] +bcrypt = ">=4.0.1,<5.0.0" +black = ">=23.7.0,<24.0.0" +fastapi = ">=0.100.1,<0.101.0" +html5lib = ">=1.1,<2.0" +openbb-provider = ">=0.1.0a2,<0.2.0" +pandas = ">=1.5.3" +passlib = ">=1.7.4,<2.0.0" +posthog = ">=3.0.1,<4.0.0" +python-jose = ">=3.3.0,<4.0.0" +python-multipart = ">=0.0.6,<0.0.7" +ruff = "0.0.256" +uuid7 = ">=0.1.0,<0.2.0" +uvicorn = ">=0.20.0,<0.21.0" +websockets = ">=10.4,<11.0" + +[[package]] +name = "openbb-provider" +version = "0.1.0a2" +description = "OpenBB package to execute queries to financial data providers" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "openbb_provider-0.1.0a2-py3-none-any.whl", hash = "sha256:4b21fa06f531ed6cf5497a163c849c2a973b150eb362d41feb510bbdfdf58c98"}, + {file = "openbb_provider-0.1.0a2.tar.gz", hash = "sha256:a1a76d4a18fc89d15beb5f30c74e9e7bbfc87f051be630bd58416543f722eac0"}, +] + +[package.dependencies] +importlib-metadata = ">=6.8.0,<7.0.0" +pydantic = {version = ">=1.10,<2.0", extras = ["dotenv"]} +pytest-recorder = ">=0.2.3,<0.3.0" +requests = ">=2.31.0,<3.0.0" +urllib3 = "<2.0.0" + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "2.0.3" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] + +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] +totp = ["cryptography"] + +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "platformdirs" +version = "3.11.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "posthog" +version = "3.0.2" +description = "Integrate PostHog into any python application." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "posthog-3.0.2-py2.py3-none-any.whl", hash = "sha256:a8c0af6f2401fbe50f90e68c4143d0824b54e872de036b1c2f23b5abb39d88ce"}, + {file = "posthog-3.0.2.tar.gz", hash = "sha256:701fba6e446a4de687c6e861b587e7b7741955ad624bf34fe013c06a0fec6fb3"}, +] + +[package.dependencies] +backoff = ">=1.10.0" +monotonic = ">=1.5" +python-dateutil = ">2.1" +requests = ">=2.7,<3.0" +six = ">=1.5" + +[package.extras] +dev = ["black", "flake8", "flake8-print", "isort", "pre-commit"] +sentry = ["django", "sentry-sdk"] +test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint", "pytest"] + +[[package]] +name = "pyasn1" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] + +[[package]] +name = "pydantic" +version = "1.10.13" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"}, + {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"}, + {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"}, + {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"}, + {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"}, + {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"}, + {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"}, + {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"}, + {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"}, + {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"}, + {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"}, + {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"}, + {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"}, + {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"}, + {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"}, + {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"}, + {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"}, + {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"}, + {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"}, + {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"}, + {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"}, + {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"}, + {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"}, + {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"}, + {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"}, + {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"}, + {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"}, + {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"}, + {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"}, + {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"}, + {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"}, + {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"}, + {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"}, + {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"}, + {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"}, + {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"}, +] + +[package.dependencies] +python-dotenv = {version = ">=0.10.4", optional = true, markers = "extra == \"dotenv\""} +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pytest-recorder" +version = "0.2.3" +description = "Pytest plugin, meant to facilitate unit tests writing for tools consumming Web APIs." +category = "main" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "pytest_recorder-0.2.3-py3-none-any.whl", hash = "sha256:a2aa1f58a72e78585151840503c88b2a4b7aa85651ce3a08232c86e2680d0c90"}, + {file = "pytest_recorder-0.2.3.tar.gz", hash = "sha256:ecba7069c87d6e30229db82a091c61e6abb18662c69eeb78a3866ea8b37f04b7"}, +] + +[package.dependencies] +time-machine = ">=2.9.0,<3.0.0" +vcrpy = ">=4.2.1,<5.0.0" + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-jose" +version = "3.3.0" +description = "JOSE implementation in Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, + {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, +] + +[package.dependencies] +ecdsa = "!=0.15" +pyasn1 = "*" +rsa = "*" + +[package.extras] +cryptography = ["cryptography (>=3.4.0)"] +pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"] +pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] + +[[package]] +name = "python-multipart" +version = "0.0.6" +description = "A streaming multipart parser for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, + {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, +] + +[package.extras] +dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] + +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +category = "main" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "ruff" +version = "0.0.256" +description = "An extremely fast Python linter, written in Rust." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.0.256-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:eb8e949f6e7fb16f9aa163fcc13318e2b7910577513468417e5b003b984410a1"}, + {file = "ruff-0.0.256-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:48a42f0ec4c5a3c3b062e947b2a5f8f7a4264761653fb0ee656a9b535ae6d8d7"}, + {file = "ruff-0.0.256-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ca633cfc335869643a13e2006f13a63bc4cb94073aa9508ceb08a1e3afe3af"}, + {file = "ruff-0.0.256-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:80fa5d3a40dd0b65c6d6adea4f825984d5d3a215a25d90cc6139978cb22ea1cd"}, + {file = "ruff-0.0.256-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0f88839b886db3577136375865bd080b9ed6f9b85bb990d897780e5a30ca3c2"}, + {file = "ruff-0.0.256-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:fe6d77a43b2d52f45ee42f6f682198ed1c34cd0165812e276648981dfd50ad36"}, + {file = "ruff-0.0.256-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3878593507b281b2615702ece06426e8b27076e8fedf658bf0c5e1e5e2ad1b40"}, + {file = "ruff-0.0.256-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e052ec4d5c92663caa662b68fe1902ec10eddac2783229b1c5f20f3df62a865"}, + {file = "ruff-0.0.256-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2116bd67e52ade9f90e5a3a3aa511a9b179c699690221bdd5bb267dbf7e94b22"}, + {file = "ruff-0.0.256-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3c6e93d7818a75669328e49a0f7070c40e18676ca8e56ca9c566633bef4d8d05"}, + {file = "ruff-0.0.256-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7ebb7de4e62d751b65bb15418a83ac5d555afb3eaa3ad549dea21744da34ae86"}, + {file = "ruff-0.0.256-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f310bfc76c0404a487759c8904f57bf51653c46e686c800efc1ff1d165a59a04"}, + {file = "ruff-0.0.256-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:93a0cfec812b2ba57bff22b176901e0ddf44e4d42a9bd7da7ffb5e53df13fd6e"}, + {file = "ruff-0.0.256-py3-none-win32.whl", hash = "sha256:d63e5320bc2d91e94925cd1863e381a48edf087041035967faf2614bb36a6a0d"}, + {file = "ruff-0.0.256-py3-none-win_amd64.whl", hash = "sha256:859c8ffb1801895fe043a2b85a45cd0ff35667ddea4b465ba2a29d275550814a"}, + {file = "ruff-0.0.256-py3-none-win_arm64.whl", hash = "sha256:64b276149e86c3d234608d3fe1da77535865e03debd3a1d5d04576f7f5031bbb"}, + {file = "ruff-0.0.256.tar.gz", hash = "sha256:f9a96b34a4870ee8cf2f3779cd7854620d1788a83b52374771266cf800541bb7"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "time-machine" +version = "2.13.0" +description = "Travel through time in your tests." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "time_machine-2.13.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:685d98593f13649ad5e7ce3e58efe689feca1badcf618ba397d3ab877ee59326"}, + {file = "time_machine-2.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ccbce292380ebf63fb9a52e6b03d91677f6a003e0c11f77473efe3913a75f289"}, + {file = "time_machine-2.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:679cbf9b15bfde1654cf48124128d3fbe52f821fa158a98fcee5fe7e05db1917"}, + {file = "time_machine-2.13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a26bdf3462d5f12a4c1009fdbe54366c6ef22c7b6f6808705b51dedaaeba8296"}, + {file = "time_machine-2.13.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dabb3b155819811b4602f7e9be936e2024e20dc99a90f103e36b45768badf9c3"}, + {file = "time_machine-2.13.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0db97f92be3efe0ac62fd3f933c91a78438cef13f283b6dfc2ee11123bfd7d8a"}, + {file = "time_machine-2.13.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:12eed2e9171c85b703d75c985dab2ecad4fe7025b7d2f842596fce1576238ece"}, + {file = "time_machine-2.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bdfe4a7f033e6783c3e9a7f8d8fc0b115367330762e00a03ff35fedf663994f3"}, + {file = "time_machine-2.13.0-cp310-cp310-win32.whl", hash = "sha256:3a7a0a49ce50d9c306c4343a7d6a3baa11092d4399a4af4355c615ccc321a9d3"}, + {file = "time_machine-2.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:1812e48c6c58707db9988445a219a908a710ea065b2cc808d9a50636291f27d4"}, + {file = "time_machine-2.13.0-cp310-cp310-win_arm64.whl", hash = "sha256:5aee23cd046abf9caeddc982113e81ba9097a01f3972e9560f5ed64e3495f66d"}, + {file = "time_machine-2.13.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e9a9d150e098be3daee5c9f10859ab1bd14a61abebaed86e6d71f7f18c05b9d7"}, + {file = "time_machine-2.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2bd4169b808745d219a69094b3cb86006938d45e7293249694e6b7366225a186"}, + {file = "time_machine-2.13.0-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:8d526cdcaca06a496877cfe61cc6608df2c3a6fce210e076761964ebac7f77cc"}, + {file = "time_machine-2.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfef4ebfb4f055ce3ebc7b6c1c4d0dbfcffdca0e783ad8c6986c992915a57ed3"}, + {file = "time_machine-2.13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f128db8997c3339f04f7f3946dd9bb2a83d15e0a40d35529774da1e9e501511"}, + {file = "time_machine-2.13.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21bef5854d49b62e2c33848b5c3e8acf22a3b46af803ef6ff19529949cb7cf9f"}, + {file = "time_machine-2.13.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:32b71e50b07f86916ac04bd1eefc2bd2c93706b81393748b08394509ee6585dc"}, + {file = "time_machine-2.13.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ac8ff145c63cd0dcfd9590fe694b5269aacbc130298dc7209b095d101f8cdde"}, + {file = "time_machine-2.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:19a3b10161c91ca8e0fd79348665cca711fd2eac6ce336ff9e6b447783817f93"}, + {file = "time_machine-2.13.0-cp311-cp311-win32.whl", hash = "sha256:5f87787d562e42bf1006a87eb689814105b98c4d5545874a281280d0f8b9a2d9"}, + {file = "time_machine-2.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:62fd14a80b8b71726e07018628daaee0a2e00937625083f96f69ed6b8e3304c0"}, + {file = "time_machine-2.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:e9935aff447f5400a2665ab10ed2da972591713080e1befe1bb8954e7c0c7806"}, + {file = "time_machine-2.13.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:34dcdbbd25c1e124e17fe58050452960fd16a11f9d3476aaa87260e28ecca0fd"}, + {file = "time_machine-2.13.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e58d82fe0e59d6e096ada3281d647a2e7420f7da5453b433b43880e1c2e8e0c5"}, + {file = "time_machine-2.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71acbc1febbe87532c7355eca3308c073d6e502ee4ce272b5028967847c8e063"}, + {file = "time_machine-2.13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dec0ec2135a4e2a59623e40c31d6e8a8ae73305ade2634380e4263d815855750"}, + {file = "time_machine-2.13.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e3a2611f8788608ebbcb060a5e36b45911bc3b8adc421b1dc29d2c81786ce4d"}, + {file = "time_machine-2.13.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:42ef5349135626ad6cd889a0a81400137e5c6928502b0817ea9e90bb10702000"}, + {file = "time_machine-2.13.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6c16d90a597a8c2d3ce22d6be2eb3e3f14786974c11b01886e51b3cf0d5edaf7"}, + {file = "time_machine-2.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f2ae8d0e359b216b695f1e7e7256f208c390db0480601a439c5dd1e1e4e16ce"}, + {file = "time_machine-2.13.0-cp312-cp312-win32.whl", hash = "sha256:f5fa9610f7e73fff42806a2ed8b06d862aa59ce4d178a52181771d6939c3e237"}, + {file = "time_machine-2.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:02b33a8c19768c94f7ffd6aa6f9f64818e88afce23250016b28583929d20fb12"}, + {file = "time_machine-2.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:0cc116056a8a2a917a4eec85661dfadd411e0d8faae604ef6a0e19fe5cd57ef1"}, + {file = "time_machine-2.13.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:de01f33aa53da37530ad97dcd17e9affa25a8df4ab822506bb08101bab0c2673"}, + {file = "time_machine-2.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:67fa45cd813821e4f5bec0ac0820869e8e37430b15509d3f5fad74ba34b53852"}, + {file = "time_machine-2.13.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a2d3db2c3b8e519d5ef436cd405abd33542a7b7761fb05ef5a5f782a8ce0b1"}, + {file = "time_machine-2.13.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7558622a62243be866a7e7c41da48eacd82c874b015ecf67d18ebf65ca3f7436"}, + {file = "time_machine-2.13.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab04cf4e56e1ee65bee2adaa26a04695e92eb1ed1ccc65fbdafd0d114399595a"}, + {file = "time_machine-2.13.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b0c8f24ae611a58782773af34dd356f1f26756272c04be2be7ea73b47e5da37d"}, + {file = "time_machine-2.13.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ca20f85a973a4ca8b00cf466cd72c27ccc72372549b138fd48d7e70e5a190ab"}, + {file = "time_machine-2.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9fad549521c4c13bdb1e889b2855a86ec835780d534ffd8f091c2647863243be"}, + {file = "time_machine-2.13.0-cp38-cp38-win32.whl", hash = "sha256:20205422fcf2caf9a7488394587df86e5b54fdb315c1152094fbb63eec4e9304"}, + {file = "time_machine-2.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:2dc76ee55a7d915a55960a726ceaca7b9097f67e4b4e681ef89871bcf98f00be"}, + {file = "time_machine-2.13.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7693704c0f2f6b9beed912ff609781edf5fcf5d63aff30c92be4093e09d94b8e"}, + {file = "time_machine-2.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:918f8389de29b4f41317d121f1150176fae2cdb5fa41f68b2aee0b9dc88df5c3"}, + {file = "time_machine-2.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fe3fda5fa73fec74278912e438fce1612a79c36fd0cc323ea3dc2d5ce629f31"}, + {file = "time_machine-2.13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c6245db573863b335d9ca64b3230f623caf0988594ae554c0c794e7f80e3e66"}, + {file = "time_machine-2.13.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e433827eccd6700a34a2ab28fd9361ff6e4d4923f718d2d1dac6d1dcd9d54da6"}, + {file = "time_machine-2.13.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:924377d398b1c48e519ad86a71903f9f36117f69e68242c99fb762a2465f5ad2"}, + {file = "time_machine-2.13.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66fb3877014dca0b9286b0f06fa74062357bd23f2d9d102d10e31e0f8fa9b324"}, + {file = "time_machine-2.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0c9829b2edfcf6b5d72a6ff330d4380f36a937088314c675531b43d3423dd8af"}, + {file = "time_machine-2.13.0-cp39-cp39-win32.whl", hash = "sha256:1a22be4df364f49a507af4ac9ea38108a0105f39da3f9c60dce62d6c6ea4ccdc"}, + {file = "time_machine-2.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:88601de1da06c7cab3d5ed3d5c3801ef683366e769e829e96383fdab6ae2fe42"}, + {file = "time_machine-2.13.0-cp39-cp39-win_arm64.whl", hash = "sha256:3c87856105dcb25b5bbff031d99f06ef4d1c8380d096222e1bc63b496b5258e6"}, + {file = "time_machine-2.13.0.tar.gz", hash = "sha256:c23b2408e3adcedec84ea1131e238f0124a5bc0e491f60d1137ad7239b37c01a"}, +] + +[package.dependencies] +python-dateutil = "*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +category = "main" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "urllib3" +version = "1.26.17" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.17-py2.py3-none-any.whl", hash = "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b"}, + {file = "urllib3-1.26.17.tar.gz", hash = "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21"}, +] + +[package.extras] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uuid7" +version = "0.1.0" +description = "UUID version 7, generating time-sorted UUIDs with 200ns time resolution and 48 bits of randomness" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uuid7-0.1.0-py2.py3-none-any.whl", hash = "sha256:5e259bb63c8cb4aded5927ff41b444a80d0c7124e8a0ced7cf44efa1f5cccf61"}, + {file = "uuid7-0.1.0.tar.gz", hash = "sha256:8c57aa32ee7456d3cc68c95c4530bc571646defac01895cfc73545449894a63c"}, +] + +[[package]] +name = "uvicorn" +version = "0.20.0" +description = "The lightning-fast ASGI server." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.20.0-py3-none-any.whl", hash = "sha256:c3ed1598a5668208723f2bb49336f4509424ad198d6ab2615b7783db58d919fd"}, + {file = "uvicorn-0.20.0.tar.gz", hash = "sha256:a4e12017b940247f836bc90b72e725d7dfd0c8ed1c51eb365f5ba30d9f5127d8"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "vcrpy" +version = "4.4.0" +description = "Automatically mock your HTTP interactions to simplify and speed up testing" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "vcrpy-4.4.0-py2.py3-none-any.whl", hash = "sha256:560c9d0d8436ced29223ceefb513c3ac3f2e2a60d51a9830f236a1e63167905a"}, + {file = "vcrpy-4.4.0.tar.gz", hash = "sha256:d1109ae93dbc2e7fcbc485849a7600d5dea510d3bef070eec4419c9a72ca2639"}, +] + +[package.dependencies] +PyYAML = "*" +six = ">=1.5" +urllib3 = {version = "<2", markers = "python_version < \"3.10\""} +wrapt = "*" +yarl = "*" + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websockets" +version = "10.4" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, + {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, + {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, + {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, + {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, + {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, + {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, + {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, + {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, + {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, + {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, + {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, + {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, + {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, + {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, + {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, + {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, + {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, + {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, + {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, + {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, + {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, + {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, + {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, +] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.8" +content-hash = "909c5f5467c9b897fca965329c29002113cd9a9ae9237bbb3acc849478e45998" diff --git a/openbb_platform/providers/oecd/pyproject.toml b/openbb_platform/providers/oecd/pyproject.toml new file mode 100644 index 00000000000..89a0de6b7e2 --- /dev/null +++ b/openbb_platform/providers/oecd/pyproject.toml @@ -0,0 +1,19 @@ +[tool.poetry] +name = "openbb-oecd" +version = "0.1.0a2" +description = "OECD extension for OpenBB" +authors = ["OpenBB Team "] +readme = "README.md" +packages = [{ include = "openbb_oecd" }] + +[tool.poetry.dependencies] +python = "^3.8" +openbb-core = "^0.1.0a2" +urllib3 = ">1.26.16" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.plugins."openbb_provider_extension"] +oecd = "openbb_oecd:oecd_provider" diff --git a/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_forecast_fetcher.yaml b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_forecast_fetcher.yaml new file mode 100644 index 00000000000..8e7079b0b8d --- /dev/null +++ b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_forecast_fetcher.yaml @@ -0,0 +1,99 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate, br + Connection: + - keep-alive + method: GET + uri: https://stats.oecd.org/sdmx-json/data/DP_LIVE/.REALGDPFORECAST.TOT.AGRWTH.A/OECD?contentType=csv&csv-lang=en&detail=code&endPeriod=2023-06-06&separator=comma&startPeriod=2020-01-01 + response: + body: + string: !!binary | + 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 + gNB4KB9Ia+P0Hy0YkmoY/cbJ/wPKKADtNCwAAA== + headers: + Access-Control-Allow-Headers: + - Content-Type + Access-Control-Allow-Methods: + - POST,GET,OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - private + Content-Disposition: + - attachment;filename=DP_LIVE_10102023171715433.csv + Content-Encoding: + - gzip + Content-Type: + - text/csv + Date: + - Tue, 10 Oct 2023 15:17:14 GMT + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_nom_fetcher.yaml b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_nom_fetcher.yaml new file mode 100644 index 00000000000..29de74b90b6 --- /dev/null +++ b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_nom_fetcher.yaml @@ -0,0 +1,91 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate, br + Connection: + - keep-alive + method: GET + uri: https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.MLN_USD.A/OECD?contentType=csv&csv-lang=en&detail=code&endPeriod=2023-06-06&separator=comma&startPeriod=2020-01-01 + response: + body: + string: !!binary | + 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 + /sGn5MKxV/D/AOJLgA6rJAAA + headers: + Access-Control-Allow-Headers: + - Content-Type + Access-Control-Allow-Methods: + - POST,GET,OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - private + Content-Disposition: + - attachment;filename=DP_LIVE_10102023171713886.csv + Content-Encoding: + - gzip + Content-Type: + - text/csv + Date: + - Tue, 10 Oct 2023 15:17:13 GMT + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_real_fetcher.yaml b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_real_fetcher.yaml new file mode 100644 index 00000000000..3dc7406db29 --- /dev/null +++ b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdgdp_real_fetcher.yaml @@ -0,0 +1,224 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate, br + Connection: + - keep-alive + method: GET + uri: https://stats.oecd.org/sdmx-json/data/DP_LIVE/.QGDP.TOT.PC_CHGPY.Q/OECD?contentType=csv&csv-lang=en&detail=code&endPeriod=2023-06-06&separator=comma&startPeriod=2020-01-01 + response: + body: + string: !!binary | + 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 + headers: + Access-Control-Allow-Headers: + - Content-Type + Access-Control-Allow-Methods: + - POST,GET,OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - private + Content-Disposition: + - attachment;filename=DP_LIVE_10102023171714667.csv + Content-Encoding: + - gzip + Content-Type: + - text/csv + Date: + - Tue, 10 Oct 2023 15:17:14 GMT + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py b/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py new file mode 100644 index 00000000000..b1bfed598d1 --- /dev/null +++ b/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py @@ -0,0 +1,53 @@ +import datetime +import pytest +from openbb_core.app.service.user_service import UserService +from openbb_oecd.models.gdpnom import OECDGDPNomFetcher +from openbb_oecd.models.gdpreal import OECDGDPRealFetcher +from openbb_oecd.models.gdpforecast import OECDGDPForecastFetcher + +test_credentials = UserService().default_user_settings.credentials.dict() + + +@pytest.fixture(scope="module") +def vcr_config(): + return { + "filter_headers": [("User-Agent", None)], + "filter_query_parameters": [ + ("token", "MOCK_TOKEN"), + ], + } + + +@pytest.mark.record_http +def test_oecdgdp_nom_fetcher(credentials=test_credentials): + params = { + "start_date": datetime.date(2020, 1, 1), + "end_date": datetime.date(2023, 6, 6), + } + + fetcher = OECDGDPNomFetcher() + result = fetcher.test(params, credentials) + assert result is None + + +@pytest.mark.record_http +def test_oecdgdp_real_fetcher(credentials=test_credentials): + params = { + "start_date": datetime.date(2020, 1, 1), + "end_date": datetime.date(2023, 6, 6), + } + fetcher = OECDGDPRealFetcher() + result = fetcher.test(params, credentials) + assert result is None + + +@pytest.mark.record_http +def test_oecdgdp_forecast_fetcher(credentials=test_credentials): + params = { + "start_date": datetime.date(2020, 1, 1), + "end_date": datetime.date(2023, 6, 6), + } + + fetcher = OECDGDPForecastFetcher() + result = fetcher.test(params, credentials) + assert result is None diff --git a/openbb_terminal/economy/oecd_model.py b/openbb_terminal/economy/oecd_model.py index bc8d7ad4739..f757ff6d880 100644 --- a/openbb_terminal/economy/oecd_model.py +++ b/openbb_terminal/economy/oecd_model.py @@ -540,6 +540,11 @@ def get_gdp( no_data_message(error=str(e)) return df + print( + f"https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.{units_dict[units]}.A/OECD?contentType=csv&detail=code" + f"&separator=comma&csv-lang=en&startPeriod={start_date}&endPeriod={end_date}" + ) + df = df.iloc[:, [0, 5]] result = pd.DataFrame()