From 8267f625c4d52303a0827fcfd71ccea0bed0e26e Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 24 Jul 2023 16:50:04 +0200 Subject: [PATCH 01/62] Setup unit tests folder structure --- openbb_sdk/extensions/charting/tests/.gitkeep | 0 openbb_sdk/extensions/crypto/tests/.gitkeep | 0 openbb_sdk/extensions/economy/tests/.gitkeep | 0 openbb_sdk/extensions/fixedincome/tests/.gitkeep | 0 openbb_sdk/extensions/forex/tests/.gitkeep | 0 openbb_sdk/extensions/news/tests/.gitkeep | 0 openbb_sdk/extensions/qa/tests/.gitkeep | 0 openbb_sdk/extensions/stocks/tests/.gitkeep | 0 openbb_sdk/extensions/ta/tests/.gitkeep | 0 openbb_sdk/providers/benzinga/tests/.gitkeep | 0 openbb_sdk/providers/fmp/tests/.gitkeep | 0 openbb_sdk/providers/fred/tests/.gitkeep | 0 openbb_sdk/providers/polygon/tests/.gitkeep | 0 openbb_sdk/sdk/core/tests/.gitkeep | 0 openbb_sdk/sdk/provider/tests/.gitkeep | 0 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 openbb_sdk/extensions/charting/tests/.gitkeep create mode 100644 openbb_sdk/extensions/crypto/tests/.gitkeep create mode 100644 openbb_sdk/extensions/economy/tests/.gitkeep create mode 100644 openbb_sdk/extensions/fixedincome/tests/.gitkeep create mode 100644 openbb_sdk/extensions/forex/tests/.gitkeep create mode 100644 openbb_sdk/extensions/news/tests/.gitkeep create mode 100644 openbb_sdk/extensions/qa/tests/.gitkeep create mode 100644 openbb_sdk/extensions/stocks/tests/.gitkeep create mode 100644 openbb_sdk/extensions/ta/tests/.gitkeep create mode 100644 openbb_sdk/providers/benzinga/tests/.gitkeep create mode 100644 openbb_sdk/providers/fmp/tests/.gitkeep create mode 100644 openbb_sdk/providers/fred/tests/.gitkeep create mode 100644 openbb_sdk/providers/polygon/tests/.gitkeep create mode 100644 openbb_sdk/sdk/core/tests/.gitkeep create mode 100644 openbb_sdk/sdk/provider/tests/.gitkeep diff --git a/openbb_sdk/extensions/charting/tests/.gitkeep b/openbb_sdk/extensions/charting/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/crypto/tests/.gitkeep b/openbb_sdk/extensions/crypto/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/economy/tests/.gitkeep b/openbb_sdk/extensions/economy/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/fixedincome/tests/.gitkeep b/openbb_sdk/extensions/fixedincome/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/forex/tests/.gitkeep b/openbb_sdk/extensions/forex/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/news/tests/.gitkeep b/openbb_sdk/extensions/news/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/qa/tests/.gitkeep b/openbb_sdk/extensions/qa/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/stocks/tests/.gitkeep b/openbb_sdk/extensions/stocks/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/ta/tests/.gitkeep b/openbb_sdk/extensions/ta/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/benzinga/tests/.gitkeep b/openbb_sdk/providers/benzinga/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/fmp/tests/.gitkeep b/openbb_sdk/providers/fmp/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/fred/tests/.gitkeep b/openbb_sdk/providers/fred/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/polygon/tests/.gitkeep b/openbb_sdk/providers/polygon/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/.gitkeep b/openbb_sdk/sdk/core/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/provider/tests/.gitkeep b/openbb_sdk/sdk/provider/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d From a0e9426b0098a5f4e3ae6e41a30b31cc02260e02 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 24 Jul 2023 16:55:53 +0200 Subject: [PATCH 02/62] Add confest --- openbb_sdk/tests/conftest.py | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 openbb_sdk/tests/conftest.py diff --git a/openbb_sdk/tests/conftest.py b/openbb_sdk/tests/conftest.py new file mode 100644 index 00000000000..9e6ec5e1b07 --- /dev/null +++ b/openbb_sdk/tests/conftest.py @@ -0,0 +1,2 @@ +# TODO: See if we can dynamically import the test modules under the openbb_sdk +# file structure. From fb9572c296c112ff0689922da3c35ab30fd3ce2d Mon Sep 17 00:00:00 2001 From: montezdesousa <79287829+montezdesousa@users.noreply.github.com> Date: Mon, 24 Jul 2023 17:04:53 +0100 Subject: [PATCH 03/62] Change providers folder structure (#5246) * refactored benzinga provider directory * refactored fmp provider directory * refactor fred provider directory * added polygon provider directory * replace fmp .helpers * fix bad replace * redirect imports * remove standard import comment * remove internal import comment * ruff * remove third-party import comment * fix fred bad import * ruff * codespell --------- Co-authored-by: Pratyush Shukla --- .../openbb_benzinga/models/__init__.py | 0 .../{ => models}/global_news.py | 7 +- .../{ => models}/stock_news.py | 7 +- .../benzinga/openbb_benzinga/provider.py | 8 +- .../openbb_benzinga/utils/__init__.py | 0 .../openbb_benzinga/{ => utils}/helpers.py | 5 +- .../fmp/openbb_fmp/models/__init__.py | 0 .../{ => models}/analyst_estimates.py | 7 +- .../{ => models}/available_indices.py | 5 +- .../openbb_fmp/{ => models}/balance_sheet.py | 7 +- .../fmp/openbb_fmp/{ => models}/cash_flow.py | 7 +- .../{ => models}/company_profile.py | 9 +- .../fmp/openbb_fmp/{ => models}/crypto_eod.py | 7 +- .../openbb_fmp/{ => models}/crypto_price.py | 7 +- .../{ => models}/dividend_calendar.py | 8 +- .../{ => models}/earnings_calendar.py | 7 +- .../{ => models}/earnings_call_transcript.py | 7 +- .../{ => models}/esg_risk_rating.py | 6 +- .../fmp/openbb_fmp/{ => models}/esg_score.py | 6 +- .../fmp/openbb_fmp/{ => models}/esg_sector.py | 6 +- .../{ => models}/executive_compensation.py | 8 +- .../fmp/openbb_fmp/{ => models}/executives.py | 6 +- .../fmp/openbb_fmp/{ => models}/forex_eod.py | 7 +- .../openbb_fmp/{ => models}/forex_pairs.py | 5 +- .../openbb_fmp/{ => models}/forex_price.py | 7 +- .../openbb_fmp/{ => models}/global_news.py | 7 +- .../{ => models}/historical_dividends.py | 8 +- .../{ => models}/historical_employees.py | 8 +- .../{ => models}/historical_stock_splits.py | 7 +- .../{ => models}/income_statement.py | 7 +- .../{ => models}/institutional_ownership.py | 7 +- .../openbb_fmp/{ => models}/key_metrics.py | 7 +- .../major_indices_constituents.py | 7 +- .../{ => models}/major_indices_eod.py | 7 +- .../{ => models}/major_indices_price.py | 7 +- .../openbb_fmp/{ => models}/price_target.py | 8 +- .../{ => models}/price_target_consensus.py | 7 +- .../{ => models}/revenue_business_line.py | 8 +- .../{ => models}/revenue_geographic.py | 8 +- .../openbb_fmp/{ => models}/risk_premium.py | 5 +- .../openbb_fmp/{ => models}/sec_filings.py | 6 +- .../{ => models}/share_statistics.py | 7 +- .../fmp/openbb_fmp/{ => models}/stock_eod.py | 7 +- .../{ => models}/stock_insider_trading.py | 7 +- .../{ => models}/stock_multiples.py | 7 +- .../fmp/openbb_fmp/{ => models}/stock_news.py | 7 +- .../{ => models}/stock_ownership.py | 7 +- .../openbb_fmp/{ => models}/stock_peers.py | 6 +- .../openbb_fmp/{ => models}/stock_price.py | 7 +- .../openbb_fmp/{ => models}/stock_splits.py | 7 +- .../openbb_fmp/{ => models}/treasury_rates.py | 7 +- .../providers/fmp/openbb_fmp/provider.py | 94 ++++--- .../fmp/openbb_fmp/utils/__init__.py | 0 .../fmp/openbb_fmp/{ => utils}/helpers.py | 11 +- .../fred/openbb_fred/{ => models}/cpi.py | 10 +- .../providers/fred/openbb_fred/provider.py | 6 +- .../providers/fred/openbb_fred/utils/cpi.csv | 256 ++++++++++++++++++ .../fred/openbb_fred/{ => utils}/fred_base.py | 4 - .../openbb_fred/{ => utils}/fred_helpers.py | 21 +- .../fred/openbb_fred/utils/harmonized_cpi.csv | 137 ++++++++++ .../polygon/openbb_polygon/models/__init__.py | 0 .../{ => models}/balance_sheet.py | 8 +- .../openbb_polygon/{ => models}/cash_flow.py | 8 +- .../openbb_polygon/{ => models}/crypto_eod.py | 10 +- .../{ => models}/crypto_price.py | 10 +- .../openbb_polygon/{ => models}/forex_eod.py | 9 +- .../{ => models}/forex_price.py | 10 +- .../{ => models}/income_statement.py | 8 +- .../{ => models}/major_indices_eod.py | 9 +- .../{ => models}/major_indices_price.py | 9 +- .../openbb_polygon/{ => models}/stock_eod.py | 10 +- .../openbb_polygon/{ => models}/stock_news.py | 7 +- .../{ => models}/stock_price.py | 10 +- .../polygon/openbb_polygon/provider.py | 28 +- .../polygon/openbb_polygon/utils/__init__.py | 0 .../openbb_polygon/{ => utils}/helpers.py | 5 - .../openbb_polygon/{ => utils}/types.py | 5 +- openbb_sdk/sdk/core/README.md | 2 +- .../provider/openbb_provider/models/cpi.py | 2 +- 79 files changed, 594 insertions(+), 427 deletions(-) create mode 100644 openbb_sdk/providers/benzinga/openbb_benzinga/models/__init__.py rename openbb_sdk/providers/benzinga/openbb_benzinga/{ => models}/global_news.py (96%) rename openbb_sdk/providers/benzinga/openbb_benzinga/{ => models}/stock_news.py (96%) create mode 100644 openbb_sdk/providers/benzinga/openbb_benzinga/utils/__init__.py rename openbb_sdk/providers/benzinga/openbb_benzinga/{ => utils}/helpers.py (94%) create mode 100644 openbb_sdk/providers/fmp/openbb_fmp/models/__init__.py rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/analyst_estimates.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/available_indices.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/balance_sheet.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/cash_flow.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/company_profile.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/crypto_eod.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/crypto_price.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/dividend_calendar.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/earnings_calendar.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/earnings_call_transcript.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/esg_risk_rating.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/esg_score.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/esg_sector.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/executive_compensation.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/executives.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/forex_eod.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/forex_pairs.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/forex_price.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/global_news.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/historical_dividends.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/historical_employees.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/historical_stock_splits.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/income_statement.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/institutional_ownership.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/key_metrics.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/major_indices_constituents.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/major_indices_eod.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/major_indices_price.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/price_target.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/price_target_consensus.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/revenue_business_line.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/revenue_geographic.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/risk_premium.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/sec_filings.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/share_statistics.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_eod.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_insider_trading.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_multiples.py (98%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_news.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_ownership.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_peers.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_price.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_splits.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/treasury_rates.py (96%) create mode 100644 openbb_sdk/providers/fmp/openbb_fmp/utils/__init__.py rename openbb_sdk/providers/fmp/openbb_fmp/{ => utils}/helpers.py (96%) rename openbb_sdk/providers/fred/openbb_fred/{ => models}/cpi.py (94%) create mode 100644 openbb_sdk/providers/fred/openbb_fred/utils/cpi.csv rename openbb_sdk/providers/fred/openbb_fred/{ => utils}/fred_base.py (97%) rename openbb_sdk/providers/fred/openbb_fred/{ => utils}/fred_helpers.py (77%) create mode 100644 openbb_sdk/providers/fred/openbb_fred/utils/harmonized_cpi.csv create mode 100644 openbb_sdk/providers/polygon/openbb_polygon/models/__init__.py rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/balance_sheet.py (95%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/cash_flow.py (96%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/crypto_eod.py (95%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/crypto_price.py (94%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/forex_eod.py (95%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/forex_price.py (94%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/income_statement.py (97%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/major_indices_eod.py (94%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/major_indices_price.py (95%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/stock_eod.py (94%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/stock_news.py (97%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/stock_price.py (94%) create mode 100644 openbb_sdk/providers/polygon/openbb_polygon/utils/__init__.py rename openbb_sdk/providers/polygon/openbb_polygon/{ => utils}/helpers.py (90%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => utils}/types.py (98%) diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/models/__init__.py b/openbb_sdk/providers/benzinga/openbb_benzinga/models/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/global_news.py b/openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py similarity index 96% rename from openbb_sdk/providers/benzinga/openbb_benzinga/global_news.py rename to openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py index 6989e0ab0ad..4be137d912a 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/global_news.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py @@ -1,19 +1,16 @@ """Benzinga Global News Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.global_news import GlobalNewsData, GlobalNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_benzinga.helpers import BenzingaBaseNewsData, get_data +from openbb_benzinga.utils.helpers import BenzingaBaseNewsData, get_data class BenzingaGlobalNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/stock_news.py b/openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py similarity index 96% rename from openbb_sdk/providers/benzinga/openbb_benzinga/stock_news.py rename to openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py index 67c550c7709..af6a81dfa75 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/stock_news.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py @@ -1,19 +1,16 @@ """Benzinga Stock News Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.stock_news import StockNewsData, StockNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_benzinga.helpers import BenzingaBaseNewsData, get_data +from openbb_benzinga.utils.helpers import BenzingaBaseNewsData, get_data class BenzingaStockNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/provider.py b/openbb_sdk/providers/benzinga/openbb_benzinga/provider.py index 2eea97cc4a2..3f5eebce09b 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/provider.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/provider.py @@ -1,14 +1,10 @@ """Benzinga provider module.""" -# IMPORT STANDARD -# IMPORT THIRD-PARTY - -# IMPORT INTERNAL from openbb_provider.abstract.provider import Provider -from openbb_benzinga.global_news import BenzingaGlobalNewsFetcher -from openbb_benzinga.stock_news import BenzingaStockNewsFetcher +from openbb_benzinga.models.global_news import BenzingaGlobalNewsFetcher +from openbb_benzinga.models.stock_news import BenzingaStockNewsFetcher # mypy: disable-error-code="list-item" diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/utils/__init__.py b/openbb_sdk/providers/benzinga/openbb_benzinga/utils/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/helpers.py b/openbb_sdk/providers/benzinga/openbb_benzinga/utils/helpers.py similarity index 94% rename from openbb_sdk/providers/benzinga/openbb_benzinga/helpers.py rename to openbb_sdk/providers/benzinga/openbb_benzinga/utils/helpers.py index a64543e2449..1a0ff5db7ef 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/helpers.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/utils/helpers.py @@ -1,13 +1,10 @@ """Benzinga Helpers.""" -# IMPORT STANDARD + from datetime import datetime from typing import List -# IMPORT THIRD-PARTY import requests - -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from pydantic import BaseModel, Field, validator diff --git a/openbb_sdk/providers/fmp/openbb_fmp/models/__init__.py b/openbb_sdk/providers/fmp/openbb_fmp/models/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/fmp/openbb_fmp/analyst_estimates.py b/openbb_sdk/providers/fmp/openbb_fmp/models/analyst_estimates.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/analyst_estimates.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/analyst_estimates.py index 0e8afa54123..5a4ba9523bc 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/analyst_estimates.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/analyst_estimates.py @@ -1,21 +1,18 @@ """FMP Analyst Estimates fetcher.""" -# IMPORT STANDARD + from datetime import date as dateType from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.analyst_estimates import ( AnalystEstimatesData, AnalystEstimatesQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPAnalystEstimatesQueryParams(AnalystEstimatesQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/available_indices.py b/openbb_sdk/providers/fmp/openbb_fmp/models/available_indices.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/available_indices.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/available_indices.py index 121826926a8..7f3c5101943 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/available_indices.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/available_indices.py @@ -1,9 +1,8 @@ """FMP Available Indices fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -13,7 +12,7 @@ from openbb_provider.models.available_indices import ( ) from pydantic import Field -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPAvailableIndicesQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/balance_sheet.py b/openbb_sdk/providers/fmp/openbb_fmp/models/balance_sheet.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/balance_sheet.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/balance_sheet.py index 011488d75a3..d54a7c9d217 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/balance_sheet.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/balance_sheet.py @@ -1,13 +1,12 @@ """FMP Balance Sheet Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -15,11 +14,9 @@ from openbb_provider.models.balance_sheet import ( BalanceSheetData, BalanceSheetQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, root_validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPBalanceSheetQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/cash_flow.py b/openbb_sdk/providers/fmp/openbb_fmp/models/cash_flow.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/cash_flow.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/cash_flow.py index 93491f9d42c..6e0dda9f7bb 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/cash_flow.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/cash_flow.py @@ -1,13 +1,12 @@ """FMP Cash Flow Statement Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -15,11 +14,9 @@ from openbb_provider.models.cash_flows import ( CashFlowStatementData, CashFlowStatementQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, root_validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPCashFlowStatementQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/company_profile.py b/openbb_sdk/providers/fmp/openbb_fmp/models/company_profile.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/company_profile.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/company_profile.py index f7073bbe6f4..c5f385dfcc1 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/company_profile.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/company_profile.py @@ -1,22 +1,17 @@ """FMP Company Overview Fetcher.""" -# IMPORT STANDARD + from typing import Dict, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.company_overview import ( CompanyOverviewData, CompanyOverviewQueryParams, ) -from .helpers import get_data - -# IMPORT THIRD-PARTY - +from openbb_fmp.utils.helpers import get_data # This part is only provided by FMP and not by the other providers for now. diff --git a/openbb_sdk/providers/fmp/openbb_fmp/crypto_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/crypto_eod.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py index 077cbab9ec8..e9d4d017efc 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/crypto_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py @@ -1,19 +1,16 @@ """FMP Cryptos end of day fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.crypto_eod import CryptoEODData, CryptoEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPCryptoEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/crypto_price.py b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_price.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/crypto_price.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/crypto_price.py index adc24a5a498..597de3a3567 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/crypto_price.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_price.py @@ -1,19 +1,16 @@ """FMP Crypto Price fetcher.""" -# IMPORT STANDARD + from enum import Enum from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.crypto_price import CryptoPriceData, CryptoPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import BaseStockPriceData, create_url, get_data_many +from openbb_fmp.utils.helpers import BaseStockPriceData, create_url, get_data_many class Interval(str, Enum): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/dividend_calendar.py b/openbb_sdk/providers/fmp/openbb_fmp/models/dividend_calendar.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/dividend_calendar.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/dividend_calendar.py index 943abbb35f6..878937f0f03 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/dividend_calendar.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/dividend_calendar.py @@ -1,21 +1,17 @@ """FMP Dividend Calendar fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.dividend_calendar import ( DividendCalendarData, DividendCalendarQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import get_data_many, get_querystring +from openbb_fmp.utils.helpers import get_data_many, get_querystring class FMPDividendCalendarQueryParams(DividendCalendarQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/earnings_calendar.py b/openbb_sdk/providers/fmp/openbb_fmp/models/earnings_calendar.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/earnings_calendar.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/earnings_calendar.py index 2d894313b08..5aaf0d5497e 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/earnings_calendar.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/earnings_calendar.py @@ -1,21 +1,18 @@ """FMP Earnings Calendar fetcher.""" -# IMPORT STANDARD + from datetime import date as dateType from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.earnings_calendar import ( EarningsCalendarData, EarningsCalendarQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPEarningsCalendarQueryParams(EarningsCalendarQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/earnings_call_transcript.py b/openbb_sdk/providers/fmp/openbb_fmp/models/earnings_call_transcript.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/earnings_call_transcript.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/earnings_call_transcript.py index 8580e1614d5..61f32eaa153 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/earnings_call_transcript.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/earnings_call_transcript.py @@ -1,21 +1,18 @@ """FMP Earnings Call Transcript fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.base import BaseSymbol - -# IMPORT INTERNAL from openbb_provider.models.earnings_call_transcript import ( EarningsCallTranscriptData, EarningsCallTranscriptQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPEarningsCallTranscriptQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/esg_risk_rating.py b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_risk_rating.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/esg_risk_rating.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/esg_risk_rating.py index 47bc957cf04..113565a0396 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/esg_risk_rating.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_risk_rating.py @@ -1,10 +1,9 @@ """FMP ESG Risk Rating fetcher.""" -# IMPORT STANDARD + from datetime import date from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -14,8 +13,7 @@ from openbb_provider.models.esg_risk_rating import ( ) from pydantic import Field -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many current_year = date.today().year ratings = Literal[ diff --git a/openbb_sdk/providers/fmp/openbb_fmp/esg_score.py b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_score.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/esg_score.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/esg_score.py index bed8b495f7d..a8d2fa2182b 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/esg_score.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_score.py @@ -1,18 +1,16 @@ """FMP ESG Score fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.esg_score import ESGScoreData, ESGScoreQueryParams from pydantic import Field -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPESGScoreQueryParams(ESGScoreQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/esg_sector.py b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_sector.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/esg_sector.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/esg_sector.py index 2290f9ce682..adcfd526182 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/esg_sector.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_sector.py @@ -1,18 +1,16 @@ """FMP ESG Sector fetcher.""" -# IMPORT STANDARD + from datetime import date from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.esg_sector import ESGSectorData, ESGSectorQueryParams from pydantic import Field -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many current_year = date.today().year diff --git a/openbb_sdk/providers/fmp/openbb_fmp/executive_compensation.py b/openbb_sdk/providers/fmp/openbb_fmp/models/executive_compensation.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/executive_compensation.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/executive_compensation.py index 9c2e7e7d3cc..ded45d9daa9 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/executive_compensation.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/executive_compensation.py @@ -1,6 +1,6 @@ """FMP Executive Compensation Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, @@ -10,17 +10,13 @@ from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.executive_compensation import ( ExecutiveCompensationData, ExecutiveCompensationQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many # This part is only provided by FMP and not by the other providers for now. diff --git a/openbb_sdk/providers/fmp/openbb_fmp/executives.py b/openbb_sdk/providers/fmp/openbb_fmp/models/executives.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/executives.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/executives.py index eb9a6f06d2b..e61e698ce1f 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/executives.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/executives.py @@ -1,10 +1,9 @@ """FMP Key Executives Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -14,8 +13,7 @@ from openbb_provider.models.key_executives import ( KeyExecutivesQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import get_data +from openbb_fmp.utils.helpers import get_data class FMPKeyExecutivesQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_eod.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/forex_eod.py index 229d09876e4..8e73efb66f0 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_eod.py @@ -1,19 +1,16 @@ """FMP Forex end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.forex_eod import ForexEODData, ForexEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPForexEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/forex_pairs.py b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_pairs.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/forex_pairs.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/forex_pairs.py index ea4022c44fe..a58519cfbdb 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/forex_pairs.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_pairs.py @@ -1,15 +1,14 @@ """FMP Forex available pairs fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.forex_pairs import ForexPairsData, ForexPairsQueryParams -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPForexPairsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/forex_price.py b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_price.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/forex_price.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/forex_price.py index 4d4b275716e..071df49b015 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/forex_price.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_price.py @@ -1,19 +1,16 @@ """FMP Forex Price fetcher.""" -# IMPORT STANDARD + from enum import Enum from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.forex_price import ForexPriceData, ForexPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import BaseStockPriceData, create_url, get_data_many +from openbb_fmp.utils.helpers import BaseStockPriceData, create_url, get_data_many class Interval(str, Enum): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/global_news.py b/openbb_sdk/providers/fmp/openbb_fmp/models/global_news.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/global_news.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/global_news.py index 4d4577bdc59..9f6125518e6 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/global_news.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/global_news.py @@ -1,19 +1,16 @@ """FMP Global News fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.global_news import GlobalNewsData, GlobalNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPGlobalNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/historical_dividends.py b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_dividends.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/historical_dividends.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/historical_dividends.py index b8d84bacc79..ae5bed51d20 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/historical_dividends.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_dividends.py @@ -1,5 +1,5 @@ """FMP Historical Dividends fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, @@ -9,17 +9,13 @@ from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.historical_dividends import ( HistoricalDividendsData, HistoricalDividendsQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPHistoricalDividendsQueryParams(HistoricalDividendsQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/historical_employees.py b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_employees.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/historical_employees.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/historical_employees.py index 4ca11964664..3c31ab47b4d 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/historical_employees.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_employees.py @@ -1,23 +1,19 @@ """FMP Historical Employees fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Optional from openbb_provider.abstract.data import Data - -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.historical_employees import ( HistoricalEmployeesData, HistoricalEmployeesQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPHistoricalEmployeesQueryParams(HistoricalEmployeesQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/historical_stock_splits.py b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_stock_splits.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/historical_stock_splits.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/historical_stock_splits.py index c9a6a315196..3dadfc6afb2 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/historical_stock_splits.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_stock_splits.py @@ -1,19 +1,16 @@ """FMP Historical Stock Splits fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.historical_stock_splits import ( HistoricalStockSplitsData, HistoricalStockSplitsQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPHistoricalStockSplitsQueryParams(HistoricalStockSplitsQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/income_statement.py b/openbb_sdk/providers/fmp/openbb_fmp/models/income_statement.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/income_statement.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/income_statement.py index 44c74d6674f..6ba49a8252f 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/income_statement.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/income_statement.py @@ -1,13 +1,12 @@ """FMP Income Statement Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -15,11 +14,9 @@ from openbb_provider.models.income_statement import ( IncomeStatementData, IncomeStatementQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, root_validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many PeriodType = Literal["annual", "quarter"] diff --git a/openbb_sdk/providers/fmp/openbb_fmp/institutional_ownership.py b/openbb_sdk/providers/fmp/openbb_fmp/models/institutional_ownership.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/institutional_ownership.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/institutional_ownership.py index 9c063051a71..d0ca366cbaf 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/institutional_ownership.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/institutional_ownership.py @@ -1,13 +1,12 @@ """FMP Institutional Ownership Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -16,11 +15,9 @@ from openbb_provider.models.institutional_ownership import ( InstitutionalOwnershipData, InstitutionalOwnershipQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPInstitutionalOwnershipQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/key_metrics.py b/openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/key_metrics.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py index 05dfd156caf..c22b98201dc 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/key_metrics.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py @@ -1,19 +1,16 @@ """Key Metrics fetcher.""" -# IMPORT STANDARD + from datetime import date as dateType from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.key_metrics import KeyMetricsData, KeyMetricsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPKeyMetricsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_constituents.py b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_constituents.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/major_indices_constituents.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_constituents.py index be2e8905f37..61ad3ee37ca 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_constituents.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_constituents.py @@ -1,21 +1,18 @@ """FMP Major Indices end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.major_indices_constituents import ( MajorIndicesConstituentsData, MajorIndicesConstituentsQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPMajorIndicesConstituentsQueryParams(MajorIndicesConstituentsQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_eod.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/major_indices_eod.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_eod.py index 0c3aa4a3604..7a9b1384ade 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_eod.py @@ -1,10 +1,9 @@ """FMP Major Indices end of day fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -12,11 +11,9 @@ from openbb_provider.models.major_indices_eod import ( MajorIndicesEODData, MajorIndicesEODQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPMajorIndicesEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_price.py b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_price.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/major_indices_price.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_price.py index 63efa0409db..ba77b099d45 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_price.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_price.py @@ -1,9 +1,8 @@ """FMP Major Indices Price fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -12,11 +11,9 @@ from openbb_provider.models.major_indices_price import ( MajorIndicesPriceData, MajorIndicesPriceQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import BaseStockPriceData, create_url, get_data_many +from openbb_fmp.utils.helpers import BaseStockPriceData, create_url, get_data_many class FMPMajorIndicesPriceQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/price_target.py b/openbb_sdk/providers/fmp/openbb_fmp/models/price_target.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/price_target.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/price_target.py index af8aa23e9b3..95b39a435ac 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/price_target.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/price_target.py @@ -1,20 +1,16 @@ """FMP Stock Ownership fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.price_target import PriceTargetData, PriceTargetQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPPriceTargetQueryParams(PriceTargetQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/price_target_consensus.py b/openbb_sdk/providers/fmp/openbb_fmp/models/price_target_consensus.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/price_target_consensus.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/price_target_consensus.py index 52f1a1da85f..486da7cf6f8 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/price_target_consensus.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/price_target_consensus.py @@ -1,21 +1,18 @@ """FMP Price Target Consensus fetcher.""" -# IMPORT STANDARD + from enum import Enum from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.price_target_consensus import ( PriceTargetConsensusData, PriceTargetConsensusQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class Interval(str, Enum): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/revenue_business_line.py b/openbb_sdk/providers/fmp/openbb_fmp/models/revenue_business_line.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/revenue_business_line.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/revenue_business_line.py index abdd032fc73..5552ef2204c 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/revenue_business_line.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/revenue_business_line.py @@ -1,22 +1,18 @@ """FMP Revenue Business Line Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.revenue_business_line import ( RevenueBusinessLineData, RevenueBusinessLineQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data +from openbb_fmp.utils.helpers import create_url, get_data # This part is only provided by FMP and not by the other providers for now. diff --git a/openbb_sdk/providers/fmp/openbb_fmp/revenue_geographic.py b/openbb_sdk/providers/fmp/openbb_fmp/models/revenue_geographic.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/revenue_geographic.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/revenue_geographic.py index 374ef94a792..60a09e59533 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/revenue_geographic.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/revenue_geographic.py @@ -1,22 +1,18 @@ """FMP Revenue Geographic Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.revenue_geographic import ( RevenueGeographicData, RevenueGeographicQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data +from openbb_fmp.utils.helpers import create_url, get_data # This part is only provided by FMP and not by the other providers for now. diff --git a/openbb_sdk/providers/fmp/openbb_fmp/risk_premium.py b/openbb_sdk/providers/fmp/openbb_fmp/models/risk_premium.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/risk_premium.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/risk_premium.py index 1195813f433..d8053471019 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/risk_premium.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/risk_premium.py @@ -1,14 +1,13 @@ """FMP Risk Premium fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.risk_premium import RiskPremiumData, RiskPremiumQueryParams -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPRiskPremiumQueryParams(RiskPremiumQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/sec_filings.py b/openbb_sdk/providers/fmp/openbb_fmp/models/sec_filings.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/sec_filings.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/sec_filings.py index 2b27f14893a..122dfa07fc9 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/sec_filings.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/sec_filings.py @@ -1,21 +1,19 @@ """SEC Filings fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.sec_filings import SECFilingsData, SECFilingsQueryParams from pydantic import validator -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPSECFilingsQueryParams(SECFilingsQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/share_statistics.py b/openbb_sdk/providers/fmp/openbb_fmp/models/share_statistics.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/share_statistics.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/share_statistics.py index 18ae5bb73c0..b12961215d4 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/share_statistics.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/share_statistics.py @@ -1,13 +1,12 @@ """FMP Share Statistics Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -16,11 +15,9 @@ from openbb_provider.models.share_statistics import ( ShareStatisticsData, ShareStatisticsQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPShareStatisticsQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_eod.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_eod.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_eod.py index d13e63acf96..f8e9806d4cc 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_eod.py @@ -1,19 +1,16 @@ """FMP Stocks end of day fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime, timedelta from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.stock_eod import StockEODData, StockEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPStockEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_insider_trading.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_insider_trading.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_insider_trading.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_insider_trading.py index e82ad847102..2411f29c6e2 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_insider_trading.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_insider_trading.py @@ -1,22 +1,19 @@ """FMP Stock Insider Trading fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_insider_trading import ( StockInsiderTradingData, StockInsiderTradingQueryParams, ) from pydantic import Field -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPStockInsiderTradingQueryParams(StockInsiderTradingQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_multiples.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_multiples.py similarity index 98% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_multiples.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_multiples.py index bdd1a7fdc79..a58a0cf0d26 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_multiples.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_multiples.py @@ -1,20 +1,17 @@ """FMP Stock Multiples Fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.stock_multiples import ( StockMultiplesData, StockMultiplesQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import create_url, get_data_one +from openbb_fmp.utils.helpers import create_url, get_data_one class FMPStockMultiplesQueryParams(StockMultiplesQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_news.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_news.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py index ca1b374bb2e..bc9a5b337d4 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_news.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py @@ -1,19 +1,16 @@ """FMP Stock News fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.stock_news import StockNewsData, StockNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPStockNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_ownership.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_ownership.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_ownership.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_ownership.py index 33e6851564f..995e046021e 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_ownership.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_ownership.py @@ -1,19 +1,16 @@ """FMP Stock Ownership fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_ownership import ( StockOwnershipData, StockOwnershipQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPStockOwnershipQueryParams(StockOwnershipQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_peers.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_peers.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_peers.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_peers.py index 8334c860794..4f0594da452 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_peers.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_peers.py @@ -1,15 +1,13 @@ """FMP Stock Peers fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_peers import StockPeersData, StockPeersQueryParams -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many # FMP SPECIFIC FUNCTIONALITY CURRENTLY diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_price.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_price.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_price.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_price.py index ef67ae201e0..e4905760a38 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_price.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_price.py @@ -1,19 +1,16 @@ """FMP Stock Price fetcher.""" -# IMPORT STANDARD + from enum import Enum from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.stock_price import StockPriceData, StockPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import BaseStockPriceData, create_url, get_data_many +from openbb_fmp.utils.helpers import BaseStockPriceData, create_url, get_data_many class Interval(str, Enum): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_splits.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_splits.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_splits.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_splits.py index 1d8fb0abf60..ec9083af433 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_splits.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_splits.py @@ -1,20 +1,17 @@ """FMP Stock Splits Calendar fetcher.""" -# IMPORT STANDARD + from datetime import date from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_splits import ( StockSplitCalendarData, StockSplitCalendarQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPStockSplitCalendarQueryParams(StockSplitCalendarQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/treasury_rates.py b/openbb_sdk/providers/fmp/openbb_fmp/models/treasury_rates.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/treasury_rates.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/treasury_rates.py index 5fc821573e4..a7523e92436 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/treasury_rates.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/treasury_rates.py @@ -1,10 +1,9 @@ """FMP Treasury Rates fetcher.""" -# IMPORT STANDARD + from datetime import date as dateType from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -12,11 +11,9 @@ from openbb_provider.models.treasury_rates import ( TreasuryRatesData, TreasuryRatesQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPTreasuryRatesQueryParams(TreasuryRatesQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/provider.py b/openbb_sdk/providers/fmp/openbb_fmp/provider.py index 135318f7c2c..156ceae8325 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/provider.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/provider.py @@ -1,56 +1,54 @@ """FMP Provider module.""" -# IMPORT STANDARD -# IMPORT THIRD-PARTY - -# IMPORT INTERNAL from openbb_provider.abstract.provider import Provider -from .analyst_estimates import FMPAnalystEstimatesFetcher -from .available_indices import FMPAvailableIndicesFetcher -from .balance_sheet import FMPBalanceSheetFetcher -from .cash_flow import FMPCashFlowStatementFetcher -from .company_profile import FMPCompanyProfileFetcher -from .crypto_eod import FMPCryptoEODFetcher -from .crypto_price import FMPCryptoPriceFetcher -from .dividend_calendar import FMPDividendCalendarFetcher -from .earnings_calendar import FMPEarningsCalendarFetcher -from .earnings_call_transcript import FMPEarningsCallTranscriptFetcher -from .esg_risk_rating import FMPESGRiskRatingFetcher -from .esg_score import FMPESGScoreFetcher -from .esg_sector import FMPESGSectorFetcher -from .executive_compensation import FMPExecutiveCompensationFetcher -from .executives import FMPKeyExecutivesFetcher -from .forex_eod import FMPForexEODFetcher -from .forex_pairs import FMPForexPairsFetcher -from .forex_price import FMPForexPriceFetcher -from .global_news import FMPGlobalNewsFetcher -from .historical_dividends import FMPHistoricalDividendsFetcher -from .historical_employees import FMPHistoricalEmployeesFetcher -from .historical_stock_splits import FMPHistoricalStockSplitsFetcher -from .income_statement import FMPIncomeStatementFetcher -from .institutional_ownership import FMPInstitutionalOwnershipFetcher -from .key_metrics import FMPKeyMetricsFetcher -from .major_indices_constituents import FMPMajorIndicesConstituentsFetcher -from .major_indices_eod import FMPMajorIndicesEODFetcher -from .major_indices_price import FMPMajorIndicesPriceFetcher -from .price_target import FMPPriceTargetFetcher -from .price_target_consensus import FMPPriceTargetConsensusFetcher -from .revenue_business_line import FMPRevenueBusinessLineFetcher -from .revenue_geographic import FMPRevenueGeographicFetcher -from .risk_premium import FMPRiskPremiumFetcher -from .sec_filings import FMPSECFilingsFetcher -from .share_statistics import FMPShareStatisticsFetcher -from .stock_eod import FMPStockEODFetcher -from .stock_insider_trading import FMPStockInsiderTradingFetcher -from .stock_multiples import FMPStockMultiplesFetcher -from .stock_news import FMPStockNewsFetcher -from .stock_ownership import FMPStockOwnershipFetcher -from .stock_peers import FMPStockPeersFetcher -from .stock_price import FMPStockPriceFetcher -from .stock_splits import FMPStockSplitCalendarFetcher -from .treasury_rates import FMPTreasuryRatesFetcher +from openbb_fmp.models.analyst_estimates import FMPAnalystEstimatesFetcher +from openbb_fmp.models.available_indices import FMPAvailableIndicesFetcher +from openbb_fmp.models.balance_sheet import FMPBalanceSheetFetcher +from openbb_fmp.models.cash_flow import FMPCashFlowStatementFetcher +from openbb_fmp.models.company_profile import FMPCompanyProfileFetcher +from openbb_fmp.models.crypto_eod import FMPCryptoEODFetcher +from openbb_fmp.models.crypto_price import FMPCryptoPriceFetcher +from openbb_fmp.models.dividend_calendar import FMPDividendCalendarFetcher +from openbb_fmp.models.earnings_calendar import FMPEarningsCalendarFetcher +from openbb_fmp.models.earnings_call_transcript import FMPEarningsCallTranscriptFetcher +from openbb_fmp.models.esg_risk_rating import FMPESGRiskRatingFetcher +from openbb_fmp.models.esg_score import FMPESGScoreFetcher +from openbb_fmp.models.esg_sector import FMPESGSectorFetcher +from openbb_fmp.models.executive_compensation import FMPExecutiveCompensationFetcher +from openbb_fmp.models.executives import FMPKeyExecutivesFetcher +from openbb_fmp.models.forex_eod import FMPForexEODFetcher +from openbb_fmp.models.forex_pairs import FMPForexPairsFetcher +from openbb_fmp.models.forex_price import FMPForexPriceFetcher +from openbb_fmp.models.global_news import FMPGlobalNewsFetcher +from openbb_fmp.models.historical_dividends import FMPHistoricalDividendsFetcher +from openbb_fmp.models.historical_employees import FMPHistoricalEmployeesFetcher +from openbb_fmp.models.historical_stock_splits import FMPHistoricalStockSplitsFetcher +from openbb_fmp.models.income_statement import FMPIncomeStatementFetcher +from openbb_fmp.models.institutional_ownership import FMPInstitutionalOwnershipFetcher +from openbb_fmp.models.key_metrics import FMPKeyMetricsFetcher +from openbb_fmp.models.major_indices_constituents import ( + FMPMajorIndicesConstituentsFetcher, +) +from openbb_fmp.models.major_indices_eod import FMPMajorIndicesEODFetcher +from openbb_fmp.models.major_indices_price import FMPMajorIndicesPriceFetcher +from openbb_fmp.models.price_target import FMPPriceTargetFetcher +from openbb_fmp.models.price_target_consensus import FMPPriceTargetConsensusFetcher +from openbb_fmp.models.revenue_business_line import FMPRevenueBusinessLineFetcher +from openbb_fmp.models.revenue_geographic import FMPRevenueGeographicFetcher +from openbb_fmp.models.risk_premium import FMPRiskPremiumFetcher +from openbb_fmp.models.sec_filings import FMPSECFilingsFetcher +from openbb_fmp.models.share_statistics import FMPShareStatisticsFetcher +from openbb_fmp.models.stock_eod import FMPStockEODFetcher +from openbb_fmp.models.stock_insider_trading import FMPStockInsiderTradingFetcher +from openbb_fmp.models.stock_multiples import FMPStockMultiplesFetcher +from openbb_fmp.models.stock_news import FMPStockNewsFetcher +from openbb_fmp.models.stock_ownership import FMPStockOwnershipFetcher +from openbb_fmp.models.stock_peers import FMPStockPeersFetcher +from openbb_fmp.models.stock_price import FMPStockPriceFetcher +from openbb_fmp.models.stock_splits import FMPStockSplitCalendarFetcher +from openbb_fmp.models.treasury_rates import FMPTreasuryRatesFetcher # mypy: disable-error-code="list-item" diff --git a/openbb_sdk/providers/fmp/openbb_fmp/utils/__init__.py b/openbb_sdk/providers/fmp/openbb_fmp/utils/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/fmp/openbb_fmp/helpers.py b/openbb_sdk/providers/fmp/openbb_fmp/utils/helpers.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/helpers.py rename to openbb_sdk/providers/fmp/openbb_fmp/utils/helpers.py index 34eed31c2c2..4de0aa4f73b 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/helpers.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/utils/helpers.py @@ -1,16 +1,17 @@ """FMP Helpers Module.""" -# IMPORT STANDARD + from datetime import datetime from typing import List, Optional, Type, TypeVar, Union -# IMPORT THIRD-PARTY import requests from openbb_provider.abstract.data import Data - -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import QueryParamsType -from openbb_provider.helpers import BasicResponse, get_querystring, request +from openbb_provider.helpers import ( + BasicResponse, + get_querystring, + request, +) from pydantic import BaseModel, NonNegativeInt, PositiveFloat, validator from requests.exceptions import SSLError diff --git a/openbb_sdk/providers/fred/openbb_fred/cpi.py b/openbb_sdk/providers/fred/openbb_fred/models/cpi.py similarity index 94% rename from openbb_sdk/providers/fred/openbb_fred/cpi.py rename to openbb_sdk/providers/fred/openbb_fred/models/cpi.py index a71ba9c3365..be16ff234e5 100644 --- a/openbb_sdk/providers/fred/openbb_fred/cpi.py +++ b/openbb_sdk/providers/fred/openbb_fred/models/cpi.py @@ -1,18 +1,14 @@ """FRED CPI Fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional +from openbb_fred.utils.fred_base import Fred +from openbb_fred.utils.fred_helpers import all_cpi_options from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT THIRD-PARTY -# IMPORT INTERNAL from openbb_provider.models.cpi import CPIData, CPIDataPoint, CPIQueryParams -from openbb_fred.fred_base import Fred -from openbb_fred.fred_helpers import all_cpi_options - class FREDCPIQueryParams(CPIQueryParams): """CPI query. diff --git a/openbb_sdk/providers/fred/openbb_fred/provider.py b/openbb_sdk/providers/fred/openbb_fred/provider.py index 2c8e60bb69a..9764a39eeef 100644 --- a/openbb_sdk/providers/fred/openbb_fred/provider.py +++ b/openbb_sdk/providers/fred/openbb_fred/provider.py @@ -1,11 +1,9 @@ """FRED provider module.""" -# IMPORT STANDARD -# IMPORT THIRD-PARTY -# IMPORT INTERNAL + from openbb_provider.abstract.provider import Provider -from openbb_fred.cpi import FREDCPIFetcher +from openbb_fred.models.cpi import FREDCPIFetcher # mypy: disable-error-code="list-item" diff --git a/openbb_sdk/providers/fred/openbb_fred/utils/cpi.csv b/openbb_sdk/providers/fred/openbb_fred/utils/cpi.csv new file mode 100644 index 00000000000..c7c7f3c7dc2 --- /dev/null +++ b/openbb_sdk/providers/fred/openbb_fred/utils/cpi.csv @@ -0,0 +1,256 @@ +title,country,frequency,units,series_id +Consumer Price Index for Australia,australia,annual,growth_previous,CPALTT01AUA657N +Consumer Price Index for Australia,australia,annual,growth_same,CPALTT01AUA659N +Consumer Price Index for Australia,australia,quarterly,growth_previous,CPALTT01AUQ657N +Consumer Price Index for Australia,australia,quarterly,growth_same,CPALTT01AUQ659N +Consumer Price Index for Austria,austria,annual,growth_previous,CPALTT01ATA657N +Consumer Price Index for Austria,austria,annual,growth_same,CPALTT01ATA659N +Consumer Price Index for Austria,austria,monthly,growth_previous,CPALTT01ATM657N +Consumer Price Index for Austria,austria,monthly,growth_same,CPALTT01ATM659N +Consumer Price Index for Austria,austria,quarterly,growth_previous,CPALTT01ATQ657N +Consumer Price Index for Austria,austria,quarterly,growth_same,CPALTT01ATQ659N +Consumer Price Index for Belgium,belgium,annual,growth_previous,CPALTT01BEA657N +Consumer Price Index for Belgium,belgium,annual,growth_same,CPALTT01BEA659N +Consumer Price Index for Belgium,belgium,monthly,growth_previous,CPALTT01BEM657N +Consumer Price Index for Belgium,belgium,monthly,growth_same,CPALTT01BEM659N +Consumer Price Index for Belgium,belgium,quarterly,growth_previous,CPALTT01BEQ657N +Consumer Price Index for Belgium,belgium,quarterly,growth_same,CPALTT01BEQ659N +Consumer Price Index for Brazil,brazil,annual,growth_previous,CPALTT01BRA657N +Consumer Price Index for Brazil,brazil,annual,growth_same,CPALTT01BRA659N +Consumer Price Index for Brazil,brazil,monthly,growth_previous,CPALTT01BRM657N +Consumer Price Index for Brazil,brazil,monthly,growth_same,CPALTT01BRM659N +Consumer Price Index for Brazil,brazil,quarterly,growth_previous,CPALTT01BRQ657N +Consumer Price Index for Brazil,brazil,quarterly,growth_same,CPALTT01BRQ659N +Consumer Price Index for Canada,canada,annual,index_2015,CPALCY01CAA661N +Consumer Price Index for Canada,canada,monthly,index_2015,CPALCY01CAM661N +Consumer Price Index for Canada,canada,quarterly,index_2015,CPALCY01CAQ661N +Consumer Price Index for Canada,canada,annual,growth_previous,CPALTT01CAA657N +Consumer Price Index for Canada,canada,annual,growth_same,CPALTT01CAA659N +Consumer Price Index for Canada,canada,monthly,growth_previous,CPALTT01CAM657N +Consumer Price Index for Canada,canada,monthly,growth_same,CPALTT01CAM659N +Consumer Price Index for Canada,canada,quarterly,growth_previous,CPALTT01CAQ657N +Consumer Price Index for Canada,canada,quarterly,growth_same,CPALTT01CAQ659N +Consumer Price Index for Chile,chile,annual,growth_previous,CPALTT01CLA657N +Consumer Price Index for Chile,chile,annual,growth_same,CPALTT01CLA659N +Consumer Price Index for Chile,chile,monthly,growth_previous,CPALTT01CLM657N +Consumer Price Index for Chile,chile,monthly,growth_same,CPALTT01CLM659N +Consumer Price Index for Chile,chile,quarterly,growth_previous,CPALTT01CLQ657N +Consumer Price Index for Chile,chile,quarterly,growth_same,CPALTT01CLQ659N +Consumer Price Index for China,china,annual,growth_previous,CPALTT01CNA657N +Consumer Price Index for China,china,monthly,growth_same,CPALTT01CNM657N +Consumer Price Index for China,china,monthly,growth_previous,CPALTT01CNM659N +Consumer Price Index for China,china,quarterly,growth_same,CPALTT01CNQ657N +Consumer Price Index for China,china,quarterly,growth_previous,CPALTT01CNQ659N +Consumer Price Index for Denmark,denmark,annual,growth_same,CPALTT01DKA657N +Consumer Price Index for Denmark,denmark,annual,growth_previous,CPALTT01DKA659N +Consumer Price Index for Denmark,denmark,monthly,growth_same,CPALTT01DKM657N +Consumer Price Index for Denmark,denmark,monthly,growth_previous,CPALTT01DKM659N +Consumer Price Index for Denmark,denmark,quarterly,growth_same,CPALTT01DKQ657N +Consumer Price Index for Denmark,denmark,quarterly,growth_previous,CPALTT01DKQ659N +Consumer Price Index for Estonia,estonia,annual,growth_same,CPALTT01EEA657N +Consumer Price Index for Estonia,estonia,annual,growth_previous,CPALTT01EEA659N +Consumer Price Index for Estonia,estonia,annual,index_2015,CPALTT01EEA661N +Consumer Price Index for Estonia,estonia,monthly,growth_previous,CPALTT01EEM657N +Consumer Price Index for Estonia,estonia,monthly,growth_same,CPALTT01EEM659N +Consumer Price Index for Estonia,estonia,monthly,index_2015,CPALTT01EEM661N +Consumer Price Index for Estonia,estonia,quarterly,growth_same,CPALTT01EEQ657N +Consumer Price Index for Estonia,estonia,quarterly,growth_previous,CPALTT01EEQ659N +Consumer Price Index for Estonia,estonia,quarterly,index_2015,CPALTT01EEQ661N +Consumer Price Index for Finland,finland,annual,growth_previous,CPALTT01FIA657N +Consumer Price Index for Finland,finland,annual,growth_same,CPALTT01FIA659N +Consumer Price Index for Finland,finland,monthly,growth_previous,CPALTT01FIM657N +Consumer Price Index for Finland,finland,monthly,growth_same,CPALTT01FIM659N +Consumer Price Index for Finland,finland,quarterly,growth_previous,CPALTT01FIQ657N +Consumer Price Index for Finland,finland,quarterly,growth_same,CPALTT01FIQ659N +Consumer Price Index for France,france,annual,growth_previous,CPALTT01FRA657N +Consumer Price Index for France,france,annual,growth_same,CPALTT01FRA659N +Consumer Price Index for France,france,monthly,growth_previous,CPALTT01FRM657N +Consumer Price Index for France,france,monthly,growth_same,CPALTT01FRM659N +Consumer Price Index for France,france,quarterly,growth_previous,CPALTT01FRQ657N +Consumer Price Index for France,france,quarterly,growth_same,CPALTT01FRQ659N +Consumer Price Index for Germany,germany,annual,growth_same,CPALTT01DEA657N +Consumer Price Index for Germany,germany,annual,growth_previous,CPALTT01DEA659N +Consumer Price Index for Germany,germany,monthly,growth_same,CPALTT01DEM657N +Consumer Price Index for Germany,germany,monthly,growth_previous,CPALTT01DEM659N +Consumer Price Index for Germany,germany,quarterly,growth_same,CPALTT01DEQ657N +Consumer Price Index for Germany,germany,quarterly,growth_previous,CPALTT01DEQ659N +Consumer Price Index for Greece,greece,annual,growth_previous,CPALTT01GRA657N +Consumer Price Index for Greece,greece,annual,growth_same,CPALTT01GRA659N +Consumer Price Index for Greece,greece,monthly,growth_previous,CPALTT01GRM657N +Consumer Price Index for Greece,greece,monthly,growth_same,CPALTT01GRM659N +Consumer Price Index for Greece,greece,quarterly,growth_previous,CPALTT01GRQ657N +Consumer Price Index for Greece,greece,quarterly,growth_same,CPALTT01GRQ659N +Consumer Price Index for Hungary,hungary,annual,growth_previous,CPALTT01HUA657N +Consumer Price Index for Hungary,hungary,annual,growth_same,CPALTT01HUA659N +Consumer Price Index for Hungary,hungary,monthly,growth_previous,CPALTT01HUM657N +Consumer Price Index for Hungary,hungary,monthly,growth_same,CPALTT01HUM659N +Consumer Price Index for Hungary,hungary,quarterly,growth_previous,CPALTT01HUQ657N +Consumer Price Index for Hungary,hungary,quarterly,growth_same,CPALTT01HUQ659N +Consumer Price Index for Iceland,iceland,annual,growth_previous,CPALTT01ISA657N +Consumer Price Index for Iceland,iceland,annual,growth_same,CPALTT01ISA659N +Consumer Price Index for Iceland,iceland,monthly,growth_previous,CPALTT01ISM657N +Consumer Price Index for Iceland,iceland,monthly,growth_same,CPALTT01ISM659N +Consumer Price Index for Iceland,iceland,quarterly,growth_previous,CPALTT01ISQ657N +Consumer Price Index for Iceland,iceland,quarterly,growth_same,CPALTT01ISQ659N +Consumer Price Index for India,india,annual,growth_previous,CPALTT01INA657N +Consumer Price Index for India,india,annual,growth_same,CPALTT01INA659N +Consumer Price Index for India,india,monthly,growth_previous,CPALTT01INM657N +Consumer Price Index for India,india,monthly,growth_same,CPALTT01INM659N +Consumer Price Index for India,india,quarterly,growth_previous,CPALTT01INQ657N +Consumer Price Index for India,india,quarterly,growth_same,CPALTT01INQ659N +Consumer Price Index for Indonesia,indonesia,annual,growth_previous,CPALTT01IDA657N +Consumer Price Index for Indonesia,indonesia,annual,growth_same,CPALTT01IDA659N +Consumer Price Index for Indonesia,indonesia,monthly,growth_previous,CPALTT01IDM657N +Consumer Price Index for Indonesia,indonesia,monthly,growth_same,CPALTT01IDM659N +Consumer Price Index for Indonesia,indonesia,quarterly,growth_previous,CPALTT01IDQ657N +Consumer Price Index for Indonesia,indonesia,quarterly,growth_same,CPALTT01IDQ659N +Consumer Price Index for Ireland,ireland,annual,growth_previous,CPALTT01IEA657N +Consumer Price Index for Ireland,ireland,annual,growth_same,CPALTT01IEA659N +Consumer Price Index for Ireland,ireland,monthly,growth_previous,CPALTT01IEM657N +Consumer Price Index for Ireland,ireland,monthly,growth_same,CPALTT01IEM659N +Consumer Price Index for Ireland,ireland,quarterly,growth_previous,CPALTT01IEQ657N +Consumer Price Index for Ireland,ireland,quarterly,growth_same,CPALTT01IEQ659N +Consumer Price Index for Israel,israel,annual,growth_previous,CPALTT01ILA657N +Consumer Price Index for Israel,israel,annual,growth_same,CPALTT01ILA659N +Consumer Price Index for Israel,israel,monthly,growth_previous,CPALTT01ILM657N +Consumer Price Index for Israel,israel,monthly,growth_same,CPALTT01ILM659N +Consumer Price Index for Israel,israel,quarterly,growth_previous,CPALTT01ILQ657N +Consumer Price Index for Israel,israel,quarterly,growth_same,CPALTT01ILQ659N +Consumer Price Index for Italy,italy,annual,growth_previous,CPALTT01ITA657N +Consumer Price Index for Italy,italy,annual,growth_same,CPALTT01ITA659N +Consumer Price Index for Italy,italy,monthly,growth_previous,CPALTT01ITM657N +Consumer Price Index for Italy,italy,monthly,growth_same,CPALTT01ITM659N +Consumer Price Index for Italy,italy,quarterly,growth_previous,CPALTT01ITQ657N +Consumer Price Index for Italy,italy,quarterly,growth_same,CPALTT01ITQ659N +Consumer Price Index for Japan,japan,monthly,index_2015,CPALCY01JPM661N +Consumer Price Index for Japan,japan,quarterly,index_2015,CPALCY01JPQ661N +Consumer Price Index for Japan,japan,monthly,growth_previous,CPALTT01JPM657N +Consumer Price Index for Japan,japan,monthly,growth_same,CPALTT01JPM659N +Consumer Price Index for Japan,japan,monthly,index_2015,CPALTT01JPM661S +Consumer Price Index for Japan,japan,quarterly,growth_same,CPALTT01JPQ657N +Consumer Price Index for Japan,japan,quarterly,growth_previous,CPALTT01JPQ659N +Consumer Price Index for Japan,japan,quarterly,index_2015,CPALTT01JPQ661S +Consumer Price Index for Luxembourg,luxembourg,annual,growth_previous,CPALTT01LUA657N +Consumer Price Index for Luxembourg,luxembourg,annual,growth_same,CPALTT01LUA659N +Consumer Price Index for Luxembourg,luxembourg,monthly,growth_previous,CPALTT01LUM657N +Consumer Price Index for Luxembourg,luxembourg,monthly,growth_same,CPALTT01LUM659N +Consumer Price Index for Luxembourg,luxembourg,quarterly,growth_previous,CPALTT01LUQ657N +Consumer Price Index for Luxembourg,luxembourg,quarterly,growth_same,CPALTT01LUQ659N +Consumer Price Index for Mexico,mexico,annual,index_2015,CPALCY01MXA661N +Consumer Price Index for Mexico,mexico,monthly,index_2015,CPALCY01MXM661N +Consumer Price Index for Mexico,mexico,quarterly,index_2015,CPALCY01MXQ661N +Consumer Price Index for Mexico,mexico,annual,growth_previous,CPALTT01MXA657N +Consumer Price Index for Mexico,mexico,annual,growth_same,CPALTT01MXA659N +Consumer Price Index for Mexico,mexico,monthly,growth_previous,CPALTT01MXM657N +Consumer Price Index for Mexico,mexico,monthly,growth_same,CPALTT01MXM659N +Consumer Price Index for Mexico,mexico,quarterly,growth_previous,CPALTT01MXQ657N +Consumer Price Index for Mexico,mexico,quarterly,growth_same,CPALTT01MXQ659N +Consumer Price Index for New Zealand,new_zealand,annual,index_2015,CPALCY01NZA661N +Consumer Price Index for New Zealand,new_zealand,quarterly,index_2015,CPALCY01NZQ661N +Consumer Price Index for New Zealand,new_zealand,annual,growth_previous,CPALTT01NZA657N +Consumer Price Index for New Zealand,new_zealand,annual,growth_same,CPALTT01NZA659N +Consumer Price Index for New Zealand,new_zealand,quarterly,growth_previous,CPALTT01NZQ657N +Consumer Price Index for New Zealand,new_zealand,quarterly,growth_same,CPALTT01NZQ659N +Consumer Price Index for Norway,norway,annual,growth_previous,CPALTT01NOA657N +Consumer Price Index for Norway,norway,annual,growth_same,CPALTT01NOA659N +Consumer Price Index for Norway,norway,monthly,growth_previous,CPALTT01NOM657N +Consumer Price Index for Norway,norway,monthly,growth_same,CPALTT01NOM659N +Consumer Price Index for Norway,norway,quarterly,growth_previous,CPALTT01NOQ657N +Consumer Price Index for Norway,norway,quarterly,growth_same,CPALTT01NOQ659N +Consumer Price Index for Poland,poland,annual,growth_previous,CPALTT01PLA657N +Consumer Price Index for Poland,poland,annual,growth_same,CPALTT01PLA659N +Consumer Price Index for Poland,poland,monthly,growth_previous,CPALTT01PLM657N +Consumer Price Index for Poland,poland,monthly,growth_same,CPALTT01PLM659N +Consumer Price Index for Poland,poland,quarterly,growth_previous,CPALTT01PLQ657N +Consumer Price Index for Poland,poland,quarterly,growth_same,CPALTT01PLQ659N +Consumer Price Index for Portugal,portugal,annual,growth_previous,CPALTT01PTA657N +Consumer Price Index for Portugal,portugal,annual,growth_same,CPALTT01PTA659N +Consumer Price Index for Portugal,portugal,monthly,growth_previous,CPALTT01PTM657N +Consumer Price Index for Portugal,portugal,monthly,growth_same,CPALTT01PTM659N +Consumer Price Index for Portugal,portugal,quarterly,growth_previous,CPALTT01PTQ657N +Consumer Price Index for Portugal,portugal,quarterly,growth_same,CPALTT01PTQ659N +Consumer Price Index for Slovenia,slovenia,annual,growth_previous,CPALTT01SIA657N +Consumer Price Index for Slovenia,slovenia,annual,growth_same,CPALTT01SIA659N +Consumer Price Index for Slovenia,slovenia,monthly,growth_previous,CPALTT01SIM657N +Consumer Price Index for Slovenia,slovenia,monthly,growth_same,CPALTT01SIM659N +Consumer Price Index for Slovenia,slovenia,quarterly,growth_previous,CPALTT01SIQ657N +Consumer Price Index for Slovenia,slovenia,quarterly,growth_same,CPALTT01SIQ659N +Consumer Price Index for South Africa,south_africa,annual,growth_previous,CPALTT01ZAA657N +Consumer Price Index for South Africa,south_africa,annual,growth_same,CPALTT01ZAA659N +Consumer Price Index for South Africa,south_africa,monthly,growth_previous,CPALTT01ZAM657N +Consumer Price Index for South Africa,south_africa,monthly,growth_same,CPALTT01ZAM659N +Consumer Price Index for South Africa,south_africa,quarterly,growth_previous,CPALTT01ZAQ657N +Consumer Price Index for South Africa,south_africa,quarterly,growth_same,CPALTT01ZAQ659N +Consumer Price Index for Spain,spain,annual,growth_previous,CPALTT01ESA657N +Consumer Price Index for Spain,spain,annual,growth_same,CPALTT01ESA659N +Consumer Price Index for Spain,spain,monthly,growth_previous,CPALTT01ESM657N +Consumer Price Index for Spain,spain,monthly,growth_same,CPALTT01ESM659N +Consumer Price Index for Spain,spain,quarterly,growth_previous,CPALTT01ESQ657N +Consumer Price Index for Spain,spain,quarterly,growth_same,CPALTT01ESQ659N +Consumer Price Index for Sweden,sweden,annual,growth_previous,CPALTT01SEA657N +Consumer Price Index for Sweden,sweden,annual,growth_same,CPALTT01SEA659N +Consumer Price Index for Sweden,sweden,monthly,growth_previous,CPALTT01SEM657N +Consumer Price Index for Sweden,sweden,monthly,growth_same,CPALTT01SEM659N +Consumer Price Index for Sweden,sweden,quarterly,growth_previous,CPALTT01SEQ657N +Consumer Price Index for Sweden,sweden,quarterly,growth_same,CPALTT01SEQ659N +Consumer Price Index for Switzerland,switzerland,annual,growth_previous,CPALTT01CHA657N +Consumer Price Index for Switzerland,switzerland,annual,growth_same,CPALTT01CHA659N +Consumer Price Index for Switzerland,switzerland,monthly,growth_previous,CPALTT01CHM657N +Consumer Price Index for Switzerland,switzerland,monthly,growth_same,CPALTT01CHM659N +Consumer Price Index for Switzerland,switzerland,quarterly,growth_previous,CPALTT01CHQ657N +Consumer Price Index for Switzerland,switzerland,quarterly,growth_same,CPALTT01CHQ659N +Consumer Price Index for the Czech Republic,czech_republic,annual,growth_same,CPALTT01CZA657N +Consumer Price Index for the Czech Republic,czech_republic,annual,growth_previous,CPALTT01CZA659N +Consumer Price Index for the Czech Republic,czech_republic,monthly,growth_same,CPALTT01CZM657N +Consumer Price Index for the Czech Republic,czech_republic,monthly,growth_previous,CPALTT01CZM659N +Consumer Price Index for the Czech Republic,czech_republic,quarterly,growth_same,CPALTT01CZQ657N +Consumer Price Index for the Czech Republic,czech_republic,quarterly,growth_previous,CPALTT01CZQ659N +Consumer Price Index for the Netherlands,netherlands,annual,growth_previous,CPALTT01NLA657N +Consumer Price Index for the Netherlands,netherlands,annual,growth_same,CPALTT01NLA659N +Consumer Price Index for the Netherlands,netherlands,monthly,growth_previous,CPALTT01NLM657N +Consumer Price Index for the Netherlands,netherlands,monthly,growth_same,CPALTT01NLM659N +Consumer Price Index for the Netherlands,netherlands,quarterly,growth_previous,CPALTT01NLQ657N +Consumer Price Index for the Netherlands,netherlands,quarterly,growth_same,CPALTT01NLQ659N +Consumer Price Index for the Republic of Korea,korea,annual,growth_previous,CPALTT01KRA657N +Consumer Price Index for the Republic of Korea,korea,annual,growth_same,CPALTT01KRA659N +Consumer Price Index for the Republic of Korea,korea,monthly,growth_previous,CPALTT01KRM657N +Consumer Price Index for the Republic of Korea,korea,monthly,growth_same,CPALTT01KRM659N +Consumer Price Index for the Republic of Korea,korea,quarterly,growth_previous,CPALTT01KRQ657N +Consumer Price Index for the Republic of Korea,korea,quarterly,growth_same,CPALTT01KRQ659N +Consumer Price Index for the Russian Federation,russian_federation,monthly,growth_previous,CPALTT01RUM657N +Consumer Price Index for the Russian Federation,russian_federation,monthly,growth_same,CPALTT01RUM659N +Consumer Price Index for the Russian Federation,russian_federation,quarterly,growth_previous,CPALTT01RUQ657N +Consumer Price Index for the Russian Federation,russian_federation,quarterly,growth_same,CPALTT01RUQ659N +Consumer Price Index for the Slovak Republic,slovak_republic,annual,growth_previous,CPALTT01SKA657N +Consumer Price Index for the Slovak Republic,slovak_republic,annual,growth_same,CPALTT01SKA659N +Consumer Price Index for the Slovak Republic,slovak_republic,monthly,growth_previous,CPALTT01SKM657N +Consumer Price Index for the Slovak Republic,slovak_republic,monthly,growth_same,CPALTT01SKM659N +Consumer Price Index for the Slovak Republic,slovak_republic,quarterly,growth_previous,CPALTT01SKQ657N +Consumer Price Index for the Slovak Republic,slovak_republic,quarterly,growth_same,CPALTT01SKQ659N +Consumer Price Index for the United Kingdom,the united kingdom,annual,growth_previous,CPALTT01GBA657N +Consumer Price Index for the United Kingdom,united_kingdom,annual,growth_same,CPALTT01GBA659N +Consumer Price Index for the United Kingdom,united_kingdom,monthly,growth_previous,CPALTT01GBM657N +Consumer Price Index for the United Kingdom,united_kingdom,monthly,growth_same,CPALTT01GBM659N +Consumer Price Index for the United Kingdom,united_kingdom,quarterly,growth_previous,CPALTT01GBQ657N +Consumer Price Index for the United Kingdom,united_kingdom,quarterly,growth_same,CPALTT01GBQ659N +Consumer Price Index for the United States,united_states,annual,index_2015,CPALCY01USA661N +Consumer Price Index for the United States,united_states,monthly,index_2015,CPALCY01USM661N +Consumer Price Index for the United States,united_states,quarterly,index_2015,CPALCY01USQ661N +Consumer Price Index for the United States,united_states,annual,growth_previous,CPALTT01USA657N +Consumer Price Index for the United States,united_states,annual,growth_same,CPALTT01USA659N +Consumer Price Index for the United States,united_states,annual,index_2015,CPALTT01USA661S +Consumer Price Index for the United States,united_states,monthly,growth_previous,CPALTT01USM657N +Consumer Price Index for the United States,united_states,monthly,growth_same,CPALTT01USM659N +Consumer Price Index for the United States,united_states,monthly,index_2015,CPALTT01USM661S +Consumer Price Index for the United States,united_states,quarterly,growth_previous,CPALTT01USQ657N +Consumer Price Index for the United States,united_states,quarterly,growth_same,CPALTT01USQ659N +Consumer Price Index for the United States,united_states,quarterly,index_2015,CPALTT01USQ661S +Consumer Price Index for Turkey,turkey,annual,index_2015,CPALCY01TRA661N +Consumer Price Index for Turkey,turkey,monthly,index_2015,CPALCY01TRM661N +Consumer Price Index for Turkey,turkey,quarterly,index_2015,CPALCY01TRQ661N +Consumer Price Index for Turkey,turkey,annual,growth_previous,CPALTT01TRA657N +Consumer Price Index for Turkey,turkey,annual,growth_same,CPALTT01TRA659N +Consumer Price Index for Turkey,turkey,monthly,growth_previous,CPALTT01TRM657N +Consumer Price Index for Turkey,turkey,monthly,growth_same,CPALTT01TRM659N +Consumer Price Index for Turkey,turkey,quarterly,growth_previous,CPALTT01TRQ657N +Consumer Price Index for Turkey,turkey,quarterly,growth_same,CPALTT01TRQ659N \ No newline at end of file diff --git a/openbb_sdk/providers/fred/openbb_fred/fred_base.py b/openbb_sdk/providers/fred/openbb_fred/utils/fred_base.py similarity index 97% rename from openbb_sdk/providers/fred/openbb_fred/fred_base.py rename to openbb_sdk/providers/fred/openbb_fred/utils/fred_base.py index 8374fa162e8..637aad8ac88 100644 --- a/openbb_sdk/providers/fred/openbb_fred/fred_base.py +++ b/openbb_sdk/providers/fred/openbb_fred/utils/fred_base.py @@ -1,13 +1,9 @@ -# IMPORT STANDARD from datetime import date from typing import Optional from urllib.parse import urlencode -# IMPORT THIRD-PARTY import requests -# IMPORT INTERNAL - root_url = "https://api.stlouisfed.org/fred" diff --git a/openbb_sdk/providers/fred/openbb_fred/fred_helpers.py b/openbb_sdk/providers/fred/openbb_fred/utils/fred_helpers.py similarity index 77% rename from openbb_sdk/providers/fred/openbb_fred/fred_helpers.py rename to openbb_sdk/providers/fred/openbb_fred/utils/fred_helpers.py index 3d9cf9f9709..aba13a2ff24 100644 --- a/openbb_sdk/providers/fred/openbb_fred/fred_helpers.py +++ b/openbb_sdk/providers/fred/openbb_fred/utils/fred_helpers.py @@ -1,23 +1,6 @@ -# IMPORT STANDARD import csv -import pathlib from typing import List, Literal -# IMPORT THIRD-PARTY -# IMPORT INTERNAL - - -BASE_DIR = ( - pathlib.Path(__file__).parent.parent.parent.parent.parent - / "openbb_terminal" - / "economy" - / "datasets" -) - -harmonized_cpi_path = BASE_DIR / "harmonized_cpi.csv" -cpi_path = BASE_DIR / "cpi.csv" - - CPI_COUNTRIES = Literal[ "australia", "austria", @@ -78,8 +61,8 @@ CPI_FREQUENCY = Literal["monthly", "quarterly", "annual"] def all_cpi_options(harmonized: bool = False) -> List[dict]: data = [] - the_path = harmonized_cpi_path if harmonized else cpi_path - with open(the_path, encoding="utf-8") as csv_file_handler: + file = "harmonized_cpi.csv" if harmonized else "cpi.csv" + with open(file, encoding="utf-8") as csv_file_handler: csv_reader = csv.DictReader(csv_file_handler) for rows in csv_reader: row = {key.lstrip("\ufeff"): value for key, value in rows.items()} diff --git a/openbb_sdk/providers/fred/openbb_fred/utils/harmonized_cpi.csv b/openbb_sdk/providers/fred/openbb_fred/utils/harmonized_cpi.csv new file mode 100644 index 00000000000..dfb7fabe769 --- /dev/null +++ b/openbb_sdk/providers/fred/openbb_fred/utils/harmonized_cpi.csv @@ -0,0 +1,137 @@ +title,country,frequency,units,series_id +Harmonised CPI for Austria,austria,annual,growth_previous,CPHPTT01ATA657N +Harmonised CPI for Austria,austria,annual,growth_same,CPHPTT01ATA659N +Harmonised CPI for Austria,austria,monthly,growth_previous,CPHPTT01ATM657N +Harmonised CPI for Austria,austria,monthly,growth_same,CPHPTT01ATM659N +Harmonised CPI for Austria,austria,monthly,index_2015,CP0000ATM086NEST +Harmonised CPI for Belgium,belgium,annual,growth_previous,CPHPTT01BEA657N +Harmonised CPI for Belgium,belgium,annual,growth_same,CPHPTT01BEA659N +Harmonised CPI for Belgium,belgium,monthly,growth_previous,CPHPTT01BEM657N +Harmonised CPI for Belgium,belgium,monthly,growth_same,CPHPTT01BEM659N +Harmonised CPI for Belgium,belgium,monthly,index_2015,CP0000BEM086NEST +Harmonised CPI for Bulgaria,bulgaria,monthly,index_2015,CP0000BGM086NEST +Harmonised CPI for Croatia,croatia,monthly,index_2015,CP0000HRM086NEST +Harmonised CPI for Cyprus,cyprus,monthly,index_2015,CP0000CYM086NEST +Harmonised CPI for the Czech Republic,czech_republic,annual,growth_previous,CPHPTT01CZA657N +Harmonised CPI for the Czech Republic,czech_republic,annual,growth_same,CPHPTT01CZA659N +Harmonised CPI for the Czech Republic,czech_republic,monthly,growth_previous,CPHPTT01CZM657N +Harmonised CPI for the Czech Republic,czech_republic,monthly,growth_same,CPHPTT01CZM659N +Harmonised CPI for Czech Republic,czech_republic,monthly,index_2015,CP0000CZM086NEST +Harmonised CPI for Denmark,denmark,annual,growth_previous,CPHPTT01DKA657N +Harmonised CPI for Denmark,denmark,annual,growth_same,CPHPTT01DKA659N +Harmonised CPI for Denmark,denmark,monthly,growth_previous,CPHPTT01DKM657N +Harmonised CPI for Denmark,denmark,monthly,growth_same,CPHPTT01DKM659N +Harmonised CPI for Denmark,denmark,monthly,index_2015,CP0000DKM086NEST +Harmonised CPI for Estonia,estonia,annual,growth_previous,CPHPTT01EEA657N +Harmonised CPI for Estonia,estonia,annual,growth_same,CPHPTT01EEA659N +Harmonised CPI for Estonia,estonia,annual,index_2015,CPHPTT01EEA661N +Harmonised CPI for Estonia,estonia,monthly,growth_previous,CPHPTT01EEM657N +Harmonised CPI for Estonia,estonia,monthly,growth_same,CPHPTT01EEM659N +Harmonised CPI for Estonia,estonia,monthly,index_2015,CPHPTT01EEM661N +Harmonised CPI for the Euro Area ,euro_area,annual,growth_previous,CPHPTT01EZA657N +Harmonised CPI for the Euro Area ,euro_area,annual,growth_same,CPHPTT01EZA659N +Harmonised CPI for the Euro Area ,euro_area,annual,index_2015,CPHPTT01EZA661N +Harmonised CPI for the Euro Area ,euro_area,monthly,growth_previous,CPHPTT01EZM657N +Harmonised CPI for the Euro Area ,euro_area,monthly,growth_same,CPHPTT01EZM659N +Harmonised CPI for the Euro Area ,euro_area,monthly,index_2015,CPHPTT01EZM661N +Harmonised CPI for Finland,finland,annual,growth_previous,CPHPTT01FIA657N +Harmonised CPI for Finland,finland,annual,growth_same,CPHPTT01FIA659N +Harmonised CPI for Finland,finland,monthly,growth_previous,CPHPTT01FIM657N +Harmonised CPI for Finland,finland,monthly,growth_same,CPHPTT01FIM659N +Harmonised CPI for Finland,finland,monthly,index_2015,CP0000FIM086NEST +Harmonised CPI for France,france,monthly,index_2015,CP0000FRM086NEST +Harmonised CPI for France,france,annual,growth_previous,CPHPTT01FRA657N +Harmonised CPI for France,france,annual,growth_same,CPHPTT01FRA659N +Harmonised CPI for France,france,monthly,growth_previous,CPHPTT01FRM657N +Harmonised CPI for France,france,monthly,growth_same,CPHPTT01FRM659N +Harmonised CPI for Germany,germany,annual,growth_previous,CPHPTT01DEA657N +Harmonised CPI for Germany,germany,annual,growth_same,CPHPTT01DEA659N +Harmonised CPI for Germany,germany,monthly,growth_previous,CPHPTT01DEM657N +Harmonised CPI for Germany,germany,monthly,growth_same,CPHPTT01DEM659N +Harmonised CPI for Germany,germany,monthly,index_2015,CP0000DEM086NEST +Harmonised CPI for Greece,greece,monthly,index_2015,CP0000GRM086NEST +Harmonised CPI for Greece,greece,annual,growth_previous,CPHPTT01GRA657N +Harmonised CPI for Greece,greece,annual,growth_same,CPHPTT01GRA659N +Harmonised CPI for Greece,greece,monthly,growth_previous,CPHPTT01GRM657N +Harmonised CPI for Greece,greece,monthly,growth_same,CPHPTT01GRM659N +Harmonised CPI for Hungary,hungary,monthly,index_2015,CP0000HUM086NEST +Harmonised CPI for Hungary,hungary,annual,growth_previous,CPHPTT01HUA657N +Harmonised CPI for Hungary,hungary,annual,growth_same,CPHPTT01HUA659N +Harmonised CPI for Hungary,hungary,monthly,growth_previous,CPHPTT01HUM657N +Harmonised CPI for Hungary,hungary,monthly,growth_same,CPHPTT01HUM659N +Harmonised CPI for Iceland,iceland,monthly,index_2015,CP0000ISM086NEST +Harmonised CPI for Iceland,iceland,annual,growth_previous,CPHPTT01ISA657N +Harmonised CPI for Iceland,iceland,annual,growth_same,CPHPTT01ISA659N +Harmonised CPI for Iceland,iceland,monthly,growth_previous,CPHPTT01ISM657N +Harmonised CPI for Iceland,iceland,monthly,growth_same,CPHPTT01ISM659N +Harmonised CPI for Italy,italy,monthly,index_2015,CP0000ITM086NEST +Harmonised CPI for Italy,italy,annual,growth_previous,CPHPTT01ITA657N +Harmonised CPI for Italy,italy,annual,growth_same,CPHPTT01ITA659N +Harmonised CPI for Italy,italy,monthly,growth_previous,CPHPTT01ITM657N +Harmonised CPI for Italy,italy,monthly,growth_same,CPHPTT01ITM659N +Harmonised CPI for Latvia,latvia,monthly,index_2015,CP0000LVM086NEST +Harmonised CPI for Lithuania,lithuania,monthly,index_2015,CP0000LTM086NEST +Harmonised CPI for Luxembourg,luxembourg,monthly,index_2015,CP0000LUM086NEST +Harmonised CPI for Luxembourg,luxembourg,annual,growth_previous,CPHPTT01LUA657N +Harmonised CPI for Luxembourg,luxembourg,annual,growth_same,CPHPTT01LUA659N +Harmonised CPI for Luxembourg,luxembourg,monthly,growth_previous,CPHPTT01LUM657N +Harmonised CPI for Luxembourg,luxembourg,monthly,growth_same,CPHPTT01LUM659N +Harmonised CPI for Malta,malta,monthly,index_2015,CP0000MTM086NEST +Harmonised CPI for Netherlands,netherlands,monthly,index_2015,CP0000NLM086NEST +Harmonised CPI for the Netherlands,netherlands,annual,growth_previous,CPHPTT01NLA657N +Harmonised CPI for the Netherlands,netherlands,annual,growth_same,CPHPTT01NLA659N +Harmonised CPI for the Netherlands,netherlands,monthly,growth_previous,CPHPTT01NLM657N +Harmonised CPI for the Netherlands,netherlands,monthly,growth_same,CPHPTT01NLM659N +Harmonised CPI for Norway,norway,monthly,index_2015,CP0000NOM086NEST +Harmonised CPI for Norway,norway,annual,growth_previous,CPHPTT01NOA657N +Harmonised CPI for Norway,norway,annual,growth_same,CPHPTT01NOA659N +Harmonised CPI for Norway,norway,monthly,growth_previous,CPHPTT01NOM657N +Harmonised CPI for Norway,norway,monthly,growth_same,CPHPTT01NOM659N +Harmonised CPI for Poland,poland,monthly,index_2015,CP0000PLM086NEST +Harmonised CPI for Poland,poland,annual,growth_previous,CPHPTT01PLA657N +Harmonised CPI for Poland,poland,annual,growth_same,CPHPTT01PLA659N +Harmonised CPI for Poland,poland,monthly,growth_previous,CPHPTT01PLM657N +Harmonised CPI for Poland,poland,monthly,growth_same,CPHPTT01PLM659N +Harmonised CPI for Portugal,portugal,monthly,index_2015,CP0000PTM086NEST +Harmonised CPI for Portugal,portugal,annual,growth_previous,CPHPTT01PTA657N +Harmonised CPI for Portugal,portugal,annual,growth_same,CPHPTT01PTA659N +Harmonised CPI for Portugal,portugal,monthly,growth_previous,CPHPTT01PTM657N +Harmonised CPI for Portugal,portugal,monthly,growth_same,CPHPTT01PTM659N +Harmonised CPI for Romania,romania,monthly,index_2015,CP0000ROM086NEST +Harmonised CPI for the Slovak Republic,slovak_republic,annual,growth_previous,CPHPTT01SKA657N +Harmonised CPI for the Slovak Republic,slovak_republic,annual,growth_same,CPHPTT01SKA659N +Harmonised CPI for the Slovak Republic,slovak_republic,monthly,growth_previous,CPHPTT01SKM657N +Harmonised CPI for the Slovak Republic,slovak_republic,monthly,growth_same,CPHPTT01SKM659N +Harmonised CPI for Slovakia,slovakia,monthly,index_2015,CP0000SKM086NEST +Harmonised CPI for Slovenia,slovenia,monthly,index_2015,CP0000SIM086NEST +Harmonised CPI for Slovenia,slovenia,annual,growth_previous,CPHPTT01SIA657N +Harmonised CPI for Slovenia,slovenia,annual,growth_same,CPHPTT01SIA659N +Harmonised CPI for Slovenia,slovenia,monthly,growth_previous,CPHPTT01SIM657N +Harmonised CPI for Slovenia,slovenia,monthly,growth_same,CPHPTT01SIM659N +Harmonised CPI for Spain,spain,annual,growth_previous,CPHPTT01ESA657N +Harmonised CPI for Spain,spain,annual,growth_same,CPHPTT01ESA659N +Harmonised CPI for Spain,spain,monthly,growth_previous,CPHPTT01ESM657N +Harmonised CPI for Spain,spain,monthly,growth_same,CPHPTT01ESM659N +Harmonised CPI for Spain,spain,monthly,index_2015,CP0000ESM086NEST +Harmonised CPI for Sweden,sweden,monthly,index_2015,CP0000SEM086NEST +Harmonised CPI for Sweden,sweden,annual,growth_previous,CPHPTT01SEA657N +Harmonised CPI for Sweden,sweden,annual,growth_same,CPHPTT01SEA659N +Harmonised CPI for Sweden,sweden,monthly,growth_previous,CPHPTT01SEM657N +Harmonised CPI for Sweden,sweden,monthly,growth_same,CPHPTT01SEM659N +Harmonised CPI for Switzerland,switzerland,annual,growth_previous,CPHPTT01CHA657N +Harmonised CPI for Switzerland,switzerland,annual,growth_same,CPHPTT01CHA659N +Harmonised CPI for Switzerland,switzerland,monthly,growth_previous,CPHPTT01CHM657N +Harmonised CPI for Switzerland,switzerland,monthly,growth_same,CPHPTT01CHM659N +Harmonised CPI for Switzerland,switzerland,monthly,index_2015,CP0000CHM086NEST +Harmonised CPI for Turkey,turkey,monthly,index_2015,CP0000TRM086NEST +Harmonised CPI for Turkey,turkey,annual,growth_previous,CPHPTT01TRA657N +Harmonised CPI for Turkey,turkey,annual,growth_same,CPHPTT01TRA659N +Harmonised CPI for Turkey,turkey,monthly,growth_previous,CPHPTT01TRM657N +Harmonised CPI for Turkey,turkey,monthly,growth_same,CPHPTT01TRM659N +Harmonised CPI for the United Kingdom,united_kingdom,annual,growth_same,CPHPTT01GBA659N +Harmonised CPI for the United Kingdom,united_kingdom,monthly,growth_same,CPHPTT01GBM659N +Harmonised CPI for United States,united_states,monthly,index_2015,CP0000USM086NEST +Harmonised CPI for the United States,united_states,annual,growth_previous,CPHPTT01USA657N +Harmonised CPI for the United States,united_states,annual,growth_same,CPHPTT01USA659N +Harmonised CPI for the United States,united_states,monthly,growth_previous,CPHPTT01USM657N +Harmonised CPI for the United States,united_states,monthly,growth_same,CPHPTT01USM659N \ No newline at end of file diff --git a/openbb_sdk/providers/polygon/openbb_polygon/models/__init__.py b/openbb_sdk/providers/polygon/openbb_polygon/models/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/polygon/openbb_polygon/balance_sheet.py b/openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py similarity index 95% rename from openbb_sdk/providers/polygon/openbb_polygon/balance_sheet.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py index 8bd1b22fba8..2835de250e8 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/balance_sheet.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py @@ -1,8 +1,6 @@ -# IMPORT STANDARD from datetime import date as dateType from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -10,12 +8,10 @@ from openbb_provider.models.balance_sheet import ( BalanceSheetData, BalanceSheetQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_polygon.helpers import get_data -from openbb_polygon.types import PolygonFundamentalQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import PolygonFundamentalQueryParams class PolygonBalanceSheetQueryParams(PolygonFundamentalQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/cash_flow.py b/openbb_sdk/providers/polygon/openbb_polygon/models/cash_flow.py similarity index 96% rename from openbb_sdk/providers/polygon/openbb_polygon/cash_flow.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/cash_flow.py index b1302f62b35..6c82e04d9fc 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/cash_flow.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/cash_flow.py @@ -1,11 +1,9 @@ -# IMPORT STANDARD from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -13,12 +11,10 @@ from openbb_provider.models.cash_flows import ( CashFlowStatementData, CashFlowStatementQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_polygon.helpers import get_data -from openbb_polygon.types import PolygonFundamentalQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import PolygonFundamentalQueryParams # noqa: E501 diff --git a/openbb_sdk/providers/polygon/openbb_polygon/crypto_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py similarity index 95% rename from openbb_sdk/providers/polygon/openbb_polygon/crypto_eod.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py index a2cc03948ae..b79c6a4c469 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/crypto_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py @@ -1,20 +1,16 @@ """Polygon crypto end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime, timedelta from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.crypto_eod import CryptoEODData, CryptoEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonCryptoEODQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/crypto_price.py b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_price.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/crypto_price.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/crypto_price.py index 3938e5f8f00..d02d9f9518e 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/crypto_price.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_price.py @@ -1,20 +1,16 @@ """Polygon Crypto Price fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.crypto_price import CryptoPriceData, CryptoPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonCryptoPriceQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/forex_eod.py similarity index 95% rename from openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/forex_eod.py index 93230d86447..7954927b500 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/forex_eod.py @@ -1,20 +1,17 @@ """Polygon forex end of day fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime, timedelta from typing import Dict, List, Literal, Optional, Union -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.forex_eod import ForexEODData, ForexEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, Timespan +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, Timespan class PolygonForexEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/forex_price.py b/openbb_sdk/providers/polygon/openbb_polygon/models/forex_price.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/forex_price.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/forex_price.py index 69459c637ea..fa69051cbaf 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/forex_price.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/forex_price.py @@ -1,20 +1,16 @@ """Polygon Forex Price fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.forex_price import ForexPriceData, ForexPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonForexPriceQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/income_statement.py b/openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py similarity index 97% rename from openbb_sdk/providers/polygon/openbb_polygon/income_statement.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py index 8f807a4888b..26850fdadbe 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/income_statement.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py @@ -1,11 +1,9 @@ -# IMPORT STANDARD from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -13,12 +11,10 @@ from openbb_provider.models.income_statement import ( IncomeStatementData, IncomeStatementQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_polygon.helpers import get_data -from openbb_polygon.types import PolygonFundamentalQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import PolygonFundamentalQueryParams class PolygonIncomeStatementQueryParams(PolygonFundamentalQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/major_indices_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_eod.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/major_indices_eod.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_eod.py index 179473e5e83..b5faf53da3e 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/major_indices_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_eod.py @@ -1,21 +1,18 @@ """Polygon major indices end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.major_indices_eod import ( MajorIndicesEODData, MajorIndicesEODQueryParams, ) -# IMPORT THIRD-PARTY -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonMajorIndicesEODQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/major_indices_price.py b/openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_price.py similarity index 95% rename from openbb_sdk/providers/polygon/openbb_polygon/major_indices_price.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_price.py index f4987eee1ac..9c0c5a8269c 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/major_indices_price.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_price.py @@ -1,20 +1,17 @@ """Polygon major indices price fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.major_indices_price import ( MajorIndicesPriceData, MajorIndicesPriceQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import get_data -from .types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonMajorIndicesPriceQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/stock_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_eod.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/stock_eod.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/stock_eod.py index 045260760f8..8981a248270 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/stock_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_eod.py @@ -1,20 +1,16 @@ """Polygon stocks end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime, timedelta from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_eod import StockEODData, StockEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonStockEODQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/stock_news.py b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py similarity index 97% rename from openbb_sdk/providers/polygon/openbb_polygon/stock_news.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py index 134d08a55c6..2d27afa2a57 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/stock_news.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py @@ -1,19 +1,16 @@ """Polygon Stock News Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.stock_news import StockNewsData, StockNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import BaseModel, Field -from openbb_polygon.helpers import get_data +from openbb_polygon.utils.helpers import get_data class PolygonStockNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/stock_price.py b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_price.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/stock_price.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/stock_price.py index a674ce259f6..083ab8338af 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/stock_price.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_price.py @@ -1,20 +1,16 @@ """Polygon stocks price fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_price import StockPriceData, StockPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonStockPriceQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/provider.py b/openbb_sdk/providers/polygon/openbb_polygon/provider.py index 32c29b8e9ea..dabee82dc54 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/provider.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/provider.py @@ -1,24 +1,20 @@ """Polygon provider module.""" -# IMPORT STANDARD -# IMPORT INTERNAL from openbb_provider.abstract.provider import Provider -from openbb_polygon.balance_sheet import PolygonBalanceSheetFetcher -from openbb_polygon.cash_flow import PolygonCashFlowStatementFetcher -from openbb_polygon.crypto_eod import PolygonCryptoEODFetcher -from openbb_polygon.crypto_price import PolygonCryptoPriceFetcher -from openbb_polygon.forex_eod import PolygonForexEODFetcher -from openbb_polygon.forex_price import PolygonForexPriceFetcher -from openbb_polygon.income_statement import PolygonIncomeStatementFetcher -from openbb_polygon.major_indices_eod import PolygonMajorIndicesEODFetcher -from openbb_polygon.major_indices_price import PolygonMajorIndicesPriceFetcher -from openbb_polygon.stock_eod import PolygonStockEODFetcher -from openbb_polygon.stock_news import PolygonStockNewsFetcher -from openbb_polygon.stock_price import PolygonStockPriceFetcher - -# IMPORT THIRD-PARTY +from openbb_polygon.models.balance_sheet import PolygonBalanceSheetFetcher +from openbb_polygon.models.cash_flow import PolygonCashFlowStatementFetcher +from openbb_polygon.models.crypto_eod import PolygonCryptoEODFetcher +from openbb_polygon.models.crypto_price import PolygonCryptoPriceFetcher +from openbb_polygon.models.forex_eod import PolygonForexEODFetcher +from openbb_polygon.models.forex_price import PolygonForexPriceFetcher +from openbb_polygon.models.income_statement import PolygonIncomeStatementFetcher +from openbb_polygon.models.major_indices_eod import PolygonMajorIndicesEODFetcher +from openbb_polygon.models.major_indices_price import PolygonMajorIndicesPriceFetcher +from openbb_polygon.models.stock_eod import PolygonStockEODFetcher +from openbb_polygon.models.stock_news import PolygonStockNewsFetcher +from openbb_polygon.models.stock_price import PolygonStockPriceFetcher # mypy: disable-error-code="list-item" polygon_provider = Provider( diff --git a/openbb_sdk/providers/polygon/openbb_polygon/utils/__init__.py b/openbb_sdk/providers/polygon/openbb_polygon/utils/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/polygon/openbb_polygon/helpers.py b/openbb_sdk/providers/polygon/openbb_polygon/utils/helpers.py similarity index 90% rename from openbb_sdk/providers/polygon/openbb_polygon/helpers.py rename to openbb_sdk/providers/polygon/openbb_polygon/utils/helpers.py index 941181df868..3dd68dad73e 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/helpers.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/utils/helpers.py @@ -1,11 +1,6 @@ -# IMPORT STANDARD - - # IMPORT THIRD PARTY import requests -# IMPORT INTERNAL - def get_data(url: str) -> dict: r = requests.get(url, timeout=10) diff --git a/openbb_sdk/providers/polygon/openbb_polygon/types.py b/openbb_sdk/providers/polygon/openbb_polygon/utils/types.py similarity index 98% rename from openbb_sdk/providers/polygon/openbb_polygon/types.py rename to openbb_sdk/providers/polygon/openbb_polygon/utils/types.py index a601504e443..fe123d35c25 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/types.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/utils/types.py @@ -1,14 +1,11 @@ """Polygon types helpers.""" -# IMPORT STANDARD + from datetime import date, datetime, timedelta from enum import Enum from typing import Literal, Optional, Union -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, PositiveFloat, PositiveInt, validator diff --git a/openbb_sdk/sdk/core/README.md b/openbb_sdk/sdk/core/README.md index a580e62fb8c..781854fc0fc 100644 --- a/openbb_sdk/sdk/core/README.md +++ b/openbb_sdk/sdk/core/README.md @@ -253,7 +253,7 @@ sdk.settings.defaults Check your system settings. Most of the properties are read-only during runtime, so any changes there will be void. -- `debug_mode`: here if you set `debug_mode = True` any exception that occurs during execution will be raised immediatly. +- `debug_mode`: here if you set `debug_mode = True` any exception that occurs during execution will be raised immediately. ```python from openbb import sdk diff --git a/openbb_sdk/sdk/provider/openbb_provider/models/cpi.py b/openbb_sdk/sdk/provider/openbb_provider/models/cpi.py index 0ee7803b458..a20ad37a2e9 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/models/cpi.py +++ b/openbb_sdk/sdk/provider/openbb_provider/models/cpi.py @@ -1,7 +1,7 @@ from datetime import date as dateType from typing import Dict, List, Optional -from openbb_fred.fred_helpers import CPI_COUNTRIES, CPI_FREQUENCY, CPI_UNITS +from openbb_fred.utils.fred_helpers import CPI_COUNTRIES, CPI_FREQUENCY, CPI_UNITS from pydantic import BaseModel, validator from openbb_provider.abstract.data import Data, QueryParams From 703efb954194350ab2114701604fa2ae20d4028f Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 13:03:56 +0200 Subject: [PATCH 04/62] Provider interface unit tests --- openbb_sdk/sdk/core/pyproject.toml | 1 + .../sdk/core/tests/test_provider_interface.py | 100 ++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_provider_interface.py diff --git a/openbb_sdk/sdk/core/pyproject.toml b/openbb_sdk/sdk/core/pyproject.toml index 99d6bdbf9ee..753b43804c4 100644 --- a/openbb_sdk/sdk/core/pyproject.toml +++ b/openbb_sdk/sdk/core/pyproject.toml @@ -26,6 +26,7 @@ openbb-provider = { path = "../provider" } [tool.poetry.group.dev.dependencies] openbb-provider = { path = "../provider" } +pytest = "^6.2.2" [build-system] requires = ["poetry-core"] diff --git a/openbb_sdk/sdk/core/tests/test_provider_interface.py b/openbb_sdk/sdk/core/tests/test_provider_interface.py new file mode 100644 index 00000000000..e61fdda19ca --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_provider_interface.py @@ -0,0 +1,100 @@ +"""Test provider interface.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.provider_interface import ( + ProviderChoices, + ProviderInterface, + ProviderRegistry, + get_provider_interface, +) + + +@pytest.fixture(scope="module") +def provider_interface(): + """Set up provider_interface.""" + return ProviderInterface() + + +def test_init(provider_interface): + """Test init.""" + assert provider_interface + + +def test_get_provider_interface(): + """Test get provider interface.""" + assert isinstance(get_provider_interface(), ProviderInterface) + + +def test_map(provider_interface): + """Test map.""" + provider_interface_map = provider_interface.map + assert isinstance(provider_interface_map, dict) + assert len(provider_interface_map) > 0 + assert "StockEOD" in provider_interface_map + + +def test_required_credentials(provider_interface): + """Test required credentials.""" + required_credentials = provider_interface.required_credentials + assert isinstance(required_credentials, dict) + assert len(required_credentials) > 0 + + +def test_model_providers(provider_interface): + """Test model providers.""" + model_providers = provider_interface.model_providers + assert isinstance(model_providers, dict) + assert len(model_providers) > 0 + + +def test_params(provider_interface): + """Test params.""" + params = provider_interface.params + assert isinstance(params, dict) + assert len(params) > 0 + assert "StockEOD" in params + + +def test_data(provider_interface): + """Test data.""" + data = provider_interface.data + assert isinstance(data, dict) + assert len(data) > 0 + assert "StockEOD" in data + + +def test_merged_data(provider_interface): + """Test merged data.""" + merged_data = provider_interface.merged_data + assert isinstance(merged_data, dict) + assert len(merged_data) > 0 + assert "StockEOD" in merged_data + + +def test_providers_literal(provider_interface): + """Test providers literal.""" + providers_literal = provider_interface.providers_literal + assert isinstance(type(providers_literal), type) + assert len(providers_literal.__args__) > 0 + assert "openbb" not in providers_literal.__args__ + + +def test_provider_choices(provider_interface): + """Test provider choices.""" + provider_choices = provider_interface.provider_choices + assert isinstance(provider_choices, type(ProviderChoices)) + + +def test_models(provider_interface): + """Test models.""" + models = provider_interface.models + assert isinstance(models, list) + assert len(models) > 0 + assert "StockEOD" in models + + +def test_build_registry(provider_interface): + """Test build registry.""" + build_registry = provider_interface.build_registry() + assert isinstance(build_registry, ProviderRegistry) From 4b6ce1c4d32caba88e682911791c93c992366545 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 13:43:46 +0200 Subject: [PATCH 05/62] Query unit tests --- openbb_sdk/sdk/core/tests/test_query.py | 79 +++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_query.py diff --git a/openbb_sdk/sdk/core/tests/test_query.py b/openbb_sdk/sdk/core/tests/test_query.py new file mode 100644 index 00000000000..abd5809a59e --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_query.py @@ -0,0 +1,79 @@ +"""Test the Query class.""" +# pylint: disable=redefined-outer-name + +from dataclasses import dataclass + +import pytest +from openbb_core.app.model.command_context import CommandContext +from openbb_core.app.provider_interface import ( + ExtraParams, + ProviderChoices, + StandardParams, +) +from openbb_core.app.query import Query + + +@pytest.fixture(scope="module") +def query(): + """Set up query.""" + return Query( + cc=CommandContext(), + provider_choices=ProviderChoices(provider="fmp"), + standard_params=StandardParams(), + extra_params=ExtraParams(), + ) + + +def test_init(query): + """Test init.""" + assert query + + +def test_to_query_params(query): + """Test to_query_params.""" + + class StockEOD: + """Mock StockEOD class.""" + + open: float = 0.0 + high: float = 0.0 + + standard_params = StockEOD() + assert query.to_query_params(standard_params) + + +def test_filter_extra_params(query): + """Test filter_extra_params.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + + extra_params = StockEOD() + extra_params = query.filter_extra_params(extra_params, "fmp") + print(extra_params) + assert isinstance(extra_params, dict) + assert len(extra_params) == 0 + + +def test_filter_extra_params_wrong_param(query): + """Test filter_extra_params.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + limit: int = 4 + + extra_params = StockEOD() + + assert not query.filter_extra_params(extra_params, "fmp") + + +@pytest.mark.skip(reason="TODO: see how to properly mock the execute method") +def test_execute(query): + """Test execute.""" + assert query.execute() From 713d1c0b9af3da8e84d5ba405dc35b16d35d9974 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 25 Jul 2023 13:05:36 +0100 Subject: [PATCH 06/62] adding tests for handler manager --- .../openbb_core/app/logs/handlers_manager.py | 2 - .../app/logs/models/logging_settings.py | 9 ++- .../tests/app/logs/test_handlers_manager.py | 74 +++++++++++++++++++ 3 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/logs/test_handlers_manager.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/handlers_manager.py b/openbb_sdk/sdk/core/openbb_core/app/logs/handlers_manager.py index 71c50776c6b..3f2229b13c0 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/handlers_manager.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/handlers_manager.py @@ -16,8 +16,6 @@ from openbb_core.app.logs.models.logging_settings import LoggingSettings class HandlersManager: def __init__(self, settings: LoggingSettings): - self.is_initialized = True - self._handlers = settings.handler_list self._settings = settings diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/models/logging_settings.py b/openbb_sdk/sdk/core/openbb_core/app/logs/models/logging_settings.py index e618167101b..13ef49ccbb3 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/models/logging_settings.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/models/logging_settings.py @@ -8,7 +8,14 @@ from openbb_core.app.model.user_settings import UserSettings # pylint: disable=too-many-instance-attributes class LoggingSettings: - def __init__(self, user_settings: UserSettings, system_settings: SystemSettings): + def __init__( + self, + user_settings: Optional[UserSettings] = None, + system_settings: Optional[SystemSettings] = None, + ): + user_settings = user_settings or UserSettings() + system_settings = system_settings or SystemSettings() + user_data_directory = ( str(Path.home() / "OpenBBUserData") if not user_settings.preferences diff --git a/openbb_sdk/sdk/core/tests/app/logs/test_handlers_manager.py b/openbb_sdk/sdk/core/tests/app/logs/test_handlers_manager.py new file mode 100644 index 00000000000..f6abf90be8c --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/test_handlers_manager.py @@ -0,0 +1,74 @@ +import logging +from unittest.mock import Mock, patch + +from openbb_core.app.logs.handlers_manager import HandlersManager + + +class MockPosthogHandler(logging.NullHandler): + def __init__(self, settings): + self.settings = settings + + +class MockPathTrackingFileHandler(logging.NullHandler): + def __init__(self, settings): + self.settings = settings + + +class MockFormatterWithExceptions(logging.Formatter): + def __init__(self, settings): + self.settings = settings + + +def test_handlers_added_correctly(): + with patch( + "openbb_core.app.logs.handlers_manager.PosthogHandler", + MockPosthogHandler, + ), patch( + "openbb_core.app.logs.handlers_manager.PathTrackingFileHandler", + MockPathTrackingFileHandler, + ), patch( + "openbb_core.app.logs.handlers_manager.FormatterWithExceptions", + MockFormatterWithExceptions, + ): + settings = Mock() + settings.handler_list = ["stdout", "stderr", "noop", "file", "posthog"] + _ = HandlersManager(settings=settings) + + handlers = logging.getLogger().handlers + + assert len(handlers) >= 5 + + for handler in handlers: + assert isinstance(handler, (logging.NullHandler, logging.StreamHandler)) + + for mock in [MockPosthogHandler, MockPathTrackingFileHandler]: + assert any(isinstance(handler, mock) for handler in handlers) + + +def test_update_handlers(): + with patch( + "openbb_core.app.logs.handlers_manager.PosthogHandler", + MockPosthogHandler, + ), patch( + "openbb_core.app.logs.handlers_manager.PathTrackingFileHandler", + MockPathTrackingFileHandler, + ), patch( + "openbb_core.app.logs.handlers_manager.FormatterWithExceptions", + MockFormatterWithExceptions, + ): + settings = Mock() + settings.handler_list = ["file", "posthog"] + settings.any_other_attr = "mock_settings" + handlers_manager = HandlersManager(settings=settings) + + changed_settings = Mock() + changed_settings.any_other_attr = "changed_settings" + + handlers_manager.update_handlers(settings=changed_settings) + + handlers = logging.getLogger().handlers + + for hdlr in handlers: + if isinstance(hdlr, (MockPosthogHandler, MockPathTrackingFileHandler)): + assert hdlr.settings == changed_settings + assert hdlr.formatter.settings == changed_settings From 7adc739b02056cb72f42cf6ecd988ca217d8452c Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 14:19:02 +0200 Subject: [PATCH 07/62] Router command_validator unit tests --- openbb_sdk/sdk/core/tests/.gitkeep | 0 openbb_sdk/sdk/core/tests/test_router.py | 156 +++++++++++++++++++++++ 2 files changed, 156 insertions(+) delete mode 100644 openbb_sdk/sdk/core/tests/.gitkeep create mode 100644 openbb_sdk/sdk/core/tests/test_router.py diff --git a/openbb_sdk/sdk/core/tests/.gitkeep b/openbb_sdk/sdk/core/tests/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_sdk/sdk/core/tests/test_router.py b/openbb_sdk/sdk/core/tests/test_router.py new file mode 100644 index 00000000000..993582a4783 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_router.py @@ -0,0 +1,156 @@ +"""Test router.py file.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.model.command_output import CommandOutput +from openbb_core.app.router import ( + CommandMap, + CommandValidator, + Router, + RouterLoader, + SignatureInspector, +) +from pydantic import BaseModel + + +@pytest.fixture(scope="module") +def command_validator(): + """Set up command_validator.""" + return CommandValidator() + + +def test_command_validator_init(command_validator): + """Test init.""" + assert command_validator + + +@pytest.mark.parametrize( + "type_, expected", + [ + (str, True), + (int, True), + (float, True), + (bool, True), + (list, True), + (BaseModel, False), + ], +) +def test_is_standard_pydantic_type(command_validator, type_, expected): + """Test is_standard_pydantic_type.""" + # assert command_validator.is_standard_pydantic_type(str) + assert command_validator.is_standard_pydantic_type(type_) == expected + + +def test_is_valid_pydantic_model_type(command_validator): + """Test is_valid_pydantic_model_type.""" + assert command_validator.is_valid_pydantic_model_type(BaseModel) + assert not command_validator.is_valid_pydantic_model_type(str) + + +@pytest.mark.parametrize( + "type_, expected", + [ + (str, True), + (int, True), + (float, True), + (bool, True), + (list, True), + (BaseModel, True), + ], +) +def test_is_serializable_value_type(command_validator, type_, expected): + """Test is_serializable_value_type.""" + assert command_validator.is_serializable_value_type(type_) == expected + + +def test_is_annotated_dc(command_validator): + """Test is_annotated_dc.""" + assert not command_validator.is_annotated_dc(str) + + +def test_check_reserved_param(command_validator): + """Test check_reserved_param.""" + assert command_validator.check_reserved_param("name", str, {}, str, str) is None + assert not command_validator.check_reserved_param("name", str, {}, str, int) + + +def test_check_parameters(command_validator): + """Test check_parameters.""" + + def func(): + pass + + assert command_validator.check_parameters(func) is None + assert not command_validator.check_parameters(BaseModel) + + +def test_check_return_error(command_validator): + """Test check_return fail.""" + with pytest.raises(TypeError): + + def func(): + pass + + command_validator.check_return(func) + + +def test_check_return(command_validator): + """Test check_return.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert command_validator.check_return(valid_function) is None + + +def test_check(command_validator): + """Test check.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert command_validator.check(valid_function) is None + + +@pytest.fixture(scope="module") +def router(): + """Set up router.""" + return Router() + + +def test_router_init(router): + """Test init.""" + assert router + + +@pytest.fixture(scope="module") +def router_loader(): + """Set up router_loader.""" + return RouterLoader() + + +def test_router_loader_init(router_loader): + """Test init.""" + assert router_loader + + +@pytest.fixture(scope="module") +def signature_inspector(): + """Set up signature_inspector.""" + return SignatureInspector() + + +def test_signature_inspector_init(signature_inspector): + """Test init.""" + assert signature_inspector + + +@pytest.fixture(scope="module") +def command_map(): + """Set up command_map.""" + return CommandMap() + + +def test_command_map_init(command_map): + """Test init.""" + assert command_map From bd9e0e81d2354c655d73cdd4beaf7082e387bd89 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 14:19:39 +0200 Subject: [PATCH 08/62] Change settings --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4a08b390c82..164bac106f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -183,7 +183,7 @@ select = ["E", "W", "F", "Q", "S", "UP", "I", "PLC", "PLE", "PLR", "PLW", "SIM"] ignore = ["S105", "S106", "S107", "S110", "PLR2004", "PLR0911", "PLR0913", "PLR0912", "PLR0915", "SIM114", "SIM105", "SIM117", "PLC1901", "PLR5501","PLW2901","PLW0603"] [tool.ruff.per-file-ignores] -"tests/*" = ["S101"] +"*tests/*" = ["S101"] [tool.ruff.flake8-import-conventions.aliases] "matplotlib.pyplot" = "plt" From d3973b556ebb15f90a52516d0b16acf0e2bb82a3 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 15:29:35 +0200 Subject: [PATCH 09/62] Router signature_inspector unit tests --- openbb_sdk/sdk/core/tests/test_router.py | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/test_router.py b/openbb_sdk/sdk/core/tests/test_router.py index 993582a4783..77130deb77e 100644 --- a/openbb_sdk/sdk/core/tests/test_router.py +++ b/openbb_sdk/sdk/core/tests/test_router.py @@ -1,8 +1,16 @@ """Test router.py file.""" # pylint: disable=redefined-outer-name +# pylint: disable=unused-argument + import pytest +from openbb_core.app.model.command_context import CommandContext from openbb_core.app.model.command_output import CommandOutput +from openbb_core.app.provider_interface import ( + ExtraParams, + ProviderChoices, + StandardParams, +) from openbb_core.app.router import ( CommandMap, CommandValidator, @@ -123,6 +131,22 @@ def test_router_init(router): assert router +def test_command(router): + """Test command.""" + + @router.command + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert valid_function + + +def test_include_router(router): + """Test include_router.""" + some_router = Router() + assert router.include_router(some_router) is None + + @pytest.fixture(scope="module") def router_loader(): """Set up router_loader.""" @@ -145,6 +169,88 @@ def test_signature_inspector_init(signature_inspector): assert signature_inspector +def test_complete_signature(signature_inspector): + """Test complete_signature.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + model = "StockEOD" + + assert signature_inspector.complete_signature(sample_function, model) + + +def test_complete_signature_error(signature_inspector): + """Test complete_signature.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + with pytest.raises(AttributeError): + signature_inspector.complete_signature(valid_function, "invalid_model") + + +def test_validate_signature(signature_inspector): + """Test validate_signature.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + expected_signature = { + "cc": CommandContext, + "provider_choices": ProviderChoices, + "standard_params": StandardParams, + "extra_params": ExtraParams, + } + + assert ( + signature_inspector.validate_signature(sample_function, expected_signature) + is None + ) + + +def test_inject_dependency(signature_inspector): + """Test inject_dependency.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + assert signature_inspector.inject_dependency(sample_function, "cc", CommandContext) + + +def test_get_description(signature_inspector): + """Test get_description.""" + + def some_function(): + """Some function.""" + + assert signature_inspector.get_description(some_function) == some_function.__doc__ + + +def test_get_description_no_doc(signature_inspector): + """Test get_description.""" + + def some_function(): + pass + + assert signature_inspector.get_description(some_function) == "" + + @pytest.fixture(scope="module") def command_map(): """Set up command_map.""" From 3eb48b3d75ae78039a74a1a4d6561cbe5c795977 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 15:43:56 +0200 Subject: [PATCH 10/62] Router command_map unit tests --- openbb_sdk/sdk/core/tests/test_router.py | 42 +++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/openbb_sdk/sdk/core/tests/test_router.py b/openbb_sdk/sdk/core/tests/test_router.py index 77130deb77e..dbad3e0cce3 100644 --- a/openbb_sdk/sdk/core/tests/test_router.py +++ b/openbb_sdk/sdk/core/tests/test_router.py @@ -237,7 +237,7 @@ def test_get_description(signature_inspector): """Test get_description.""" def some_function(): - """Some function.""" + """Mock function.""" assert signature_inspector.get_description(some_function) == some_function.__doc__ @@ -260,3 +260,43 @@ def command_map(): def test_command_map_init(command_map): """Test init.""" assert command_map + + +def test_map(command_map): + """Test map.""" + assert isinstance(command_map.map, dict) + + +def test_provider_coverage(command_map): + """Test provider_coverage.""" + assert isinstance(command_map.provider_coverage, dict) + + +def test_command_coverage(command_map): + """Test command_coverage.""" + assert isinstance(command_map.command_coverage, dict) + + +def test_get_command_map(command_map, router): + """Test get_command_map.""" + command_map = command_map.get_command_map(router) + assert isinstance(command_map, dict) + assert len(command_map) > 0 + + +def test_get_provider_coverage(command_map, router): + """Test get_provider_coverage.""" + provider_coverage = command_map.get_provider_coverage(router) + assert isinstance(provider_coverage, dict) + + +def test_get_command_coverage(command_map, router): + """Test get_command_coverage.""" + command_coverage = command_map.get_command_coverage(router) + assert isinstance(command_coverage, dict) + + +def test_get_command(command_map): + """Test get_command.""" + command = command_map.get_command("stocks/load") + assert command is None From c462b03ba0aefc7f0fd17687122c957ae985a740 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 15:47:30 +0200 Subject: [PATCH 11/62] Router router_loader unit tests --- openbb_sdk/sdk/core/tests/test_router.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/test_router.py b/openbb_sdk/sdk/core/tests/test_router.py index dbad3e0cce3..d09eac2a633 100644 --- a/openbb_sdk/sdk/core/tests/test_router.py +++ b/openbb_sdk/sdk/core/tests/test_router.py @@ -158,6 +158,11 @@ def test_router_loader_init(router_loader): assert router_loader +def test_from_extensions(router_loader): + """Test from_extensions.""" + assert router_loader.from_extensions() + + @pytest.fixture(scope="module") def signature_inspector(): """Set up signature_inspector.""" From 1837d3acd0ea86ac110bbef208adc1927de5253e Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 17:04:15 +0200 Subject: [PATCH 12/62] Query execute unit test --- openbb_sdk/sdk/core/tests/test_query.py | 68 +++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/test_query.py b/openbb_sdk/sdk/core/tests/test_query.py index abd5809a59e..c6f70663646 100644 --- a/openbb_sdk/sdk/core/tests/test_query.py +++ b/openbb_sdk/sdk/core/tests/test_query.py @@ -2,6 +2,7 @@ # pylint: disable=redefined-outer-name from dataclasses import dataclass +from unittest.mock import MagicMock, patch import pytest from openbb_core.app.model.command_context import CommandContext @@ -11,6 +12,7 @@ from openbb_core.app.provider_interface import ( StandardParams, ) from openbb_core.app.query import Query +from pydantic import BaseModel @pytest.fixture(scope="module") @@ -73,7 +75,65 @@ def test_filter_extra_params_wrong_param(query): assert not query.filter_extra_params(extra_params, "fmp") -@pytest.mark.skip(reason="TODO: see how to properly mock the execute method") -def test_execute(query): - """Test execute.""" - assert query.execute() +@pytest.fixture +def mock_registry(): + """Mock registry.""" + with patch( + "openbb_core.app.provider_interface.get_provider_interface" + ) as mock_get_provider_interface: + mock_registry = MagicMock() + mock_get_provider_interface.return_value.build_registry.return_value = ( + mock_registry + ) + yield mock_registry + + +def create_mock_query(): + """Mock query.""" + + class StockEOD: + """Mock StockEOD class.""" + + start_date = "2020-01-01" + end_date = "2020-01-05" + symbol = "AAPL" + + return StockEOD() + + +def create_mock_extra_params(): + """Mock ExtraParams dataclass.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + + return StockEOD() + + +@pytest.fixture +def query_instance(): + """Set up query.""" + standard_params = create_mock_query() + extra_params = create_mock_extra_params() + + cc = CommandContext() + setattr(cc.user_settings.credentials, "fmp_api_key", "1234") + + return Query( + cc=cc, + provider_choices=ProviderChoices(provider="fmp"), + standard_params=standard_params, + extra_params=extra_params, + ) + + +def test_execute_method_fake_credentials(query_instance, mock_registry): + """Test execute method without setting credentials.""" + mock_fetch_result = BaseModel() # Replace with an actual instance of BaseModel + mock_registry.fetch.return_value = mock_fetch_result + + with pytest.raises(Exception): + query_instance.execute() From 0622894c948740716fab726cf02ea1c675a6b5cf Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 11:31:54 +0200 Subject: [PATCH 13/62] Cleanup --- openbb_sdk/sdk/core/tests/test_query.py | 69 ++++++++++--------------- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/test_query.py b/openbb_sdk/sdk/core/tests/test_query.py index c6f70663646..f5856ff573c 100644 --- a/openbb_sdk/sdk/core/tests/test_query.py +++ b/openbb_sdk/sdk/core/tests/test_query.py @@ -15,6 +15,31 @@ from openbb_core.app.query import Query from pydantic import BaseModel +def create_mock_query(): + """Mock query.""" + + class StockEOD: + """Mock StockEOD class.""" + + start_date = "2020-01-01" + end_date = "2020-01-05" + symbol = "AAPL" + + return StockEOD() + + +def create_mock_extra_params(): + """Mock ExtraParams dataclass.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + + return StockEOD() + + @pytest.fixture(scope="module") def query(): """Set up query.""" @@ -33,29 +58,16 @@ def test_init(query): def test_to_query_params(query): """Test to_query_params.""" + standard_params = create_mock_query() - class StockEOD: - """Mock StockEOD class.""" - - open: float = 0.0 - high: float = 0.0 - - standard_params = StockEOD() assert query.to_query_params(standard_params) def test_filter_extra_params(query): """Test filter_extra_params.""" - - @dataclass - class StockEOD: - """Mock ExtraParams dataclass.""" - - sort: str = "desc" - - extra_params = StockEOD() + extra_params = create_mock_extra_params() extra_params = query.filter_extra_params(extra_params, "fmp") - print(extra_params) + assert isinstance(extra_params, dict) assert len(extra_params) == 0 @@ -88,31 +100,6 @@ def mock_registry(): yield mock_registry -def create_mock_query(): - """Mock query.""" - - class StockEOD: - """Mock StockEOD class.""" - - start_date = "2020-01-01" - end_date = "2020-01-05" - symbol = "AAPL" - - return StockEOD() - - -def create_mock_extra_params(): - """Mock ExtraParams dataclass.""" - - @dataclass - class StockEOD: - """Mock ExtraParams dataclass.""" - - sort: str = "desc" - - return StockEOD() - - @pytest.fixture def query_instance(): """Set up query.""" From aeed2e591d38e5e816b463356f6ee4633f54cd97 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 11:47:17 +0200 Subject: [PATCH 14/62] Test static filters --- .../core/openbb_core/app/static/filters.py | 10 +++-- .../sdk/core/tests/test_static_filters.py | 44 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/test_static_filters.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/filters.py b/openbb_sdk/sdk/core/openbb_core/app/static/filters.py index 8af1c1eb2bd..4be2b0f1df8 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/filters.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/filters.py @@ -1,3 +1,5 @@ +"""OpenBB filters.""" + import builtins from functools import wraps @@ -10,10 +12,12 @@ from openbb_core.app.utils import df_to_basemodel class OpenBBError(Exception): - pass + """A custom exception for OpenBB errors.""" def filter_call(func): + """Filter command call.""" + @wraps(wrapped=func) def inner(*args, **kwargs): self = args[0] @@ -36,7 +40,7 @@ def filter_call(func): def filter_inputs(**kwargs) -> dict: - """Filter command inputs""" + """Filter command inputs.""" for key, value in kwargs.items(): if isinstance(value, pd.DataFrame): kwargs[key] = df_to_basemodel(value, index=True) @@ -45,7 +49,7 @@ def filter_inputs(**kwargs) -> dict: def filter_output(command_output: CommandOutput) -> CommandOutput: - """Filter command output""" + """Filter command output.""" if command_output.warnings: for w in command_output.warnings: category = getattr(builtins, w.category, OpenBBWarning) diff --git a/openbb_sdk/sdk/core/tests/test_static_filters.py b/openbb_sdk/sdk/core/tests/test_static_filters.py new file mode 100644 index 00000000000..642244e8f08 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_filters.py @@ -0,0 +1,44 @@ +"""Test the app/static/filters.py file.""" + +import pytest +from openbb_core.app.model.command_output import CommandOutput +from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output +from pandas import DataFrame + + +def test_filter_call_error(): + """Test filter_call.""" + + class Test: + @filter_call + def test(self): + return 1 / 0 + + test = Test() + + with pytest.raises(Exception): + test.test() + + +def test_filter_inputs_not_df(): + """Test filter_inputs.""" + kwargs = {"num": 1} + kwargs = filter_inputs(**kwargs) + + assert kwargs["num"] == 1 + + +def test_filter_inputs_df(): + """Test filter_inputs.""" + df = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) + kwargs = {"df": df} + kwargs = filter_inputs(**kwargs) + + assert isinstance(kwargs["df"], list) + + +def test_filter_output(): + """Test filter_output.""" + command_output = filter_output(CommandOutput()) + + assert command_output is not None From 84e332222a1286e1134bb2073bb0daae36188d8a Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 11:50:44 +0200 Subject: [PATCH 15/62] Test static coverage --- .../core/openbb_core/app/static/coverage.py | 5 ++++ .../sdk/core/tests/test_static_coverage.py | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_static_coverage.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/coverage.py b/openbb_sdk/sdk/core/openbb_core/app/static/coverage.py index 3af92cd7e14..d15a480c047 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/coverage.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/coverage.py @@ -1,14 +1,19 @@ +"""Coverage module.""" from openbb_core.app.router import CommandMap class Coverage: + """Coverage class.""" + def __init__(self): self.__command_map = CommandMap() @property def providers(self): + """Return providers coverage.""" return self.__command_map.provider_coverage @property def commands(self): + """Return commands coverage.""" return self.__command_map.command_coverage diff --git a/openbb_sdk/sdk/core/tests/test_static_coverage.py b/openbb_sdk/sdk/core/tests/test_static_coverage.py new file mode 100644 index 00000000000..123751e31a9 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_coverage.py @@ -0,0 +1,30 @@ +"""Test the app/static/coverage.py file.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.static.coverage import Coverage + + +@pytest.fixture(scope="module") +def coverage(): + """Return coverage.""" + return Coverage() + + +def test_coverage_init(coverage): + """Test coverage init.""" + assert coverage + + +def test_coverage_providers(coverage): + """Test coverage providers.""" + provider_coverage = coverage.providers + assert provider_coverage + assert isinstance(provider_coverage, dict) + + +def test_coverage_commands(coverage): + """Test coverage commands.""" + command_coverage = coverage.commands + assert command_coverage + assert isinstance(command_coverage, dict) From ff4a46904711d6d8f1d7f15e15e960148385c93a Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 11:55:59 +0200 Subject: [PATCH 16/62] Test static container --- openbb_sdk/sdk/core/openbb_core/app/static/container.py | 3 +++ openbb_sdk/sdk/core/tests/test_static_container.py | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_static_container.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/container.py b/openbb_sdk/sdk/core/openbb_core/app/static/container.py index 75cd907ab74..43da30fb6ed 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/container.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/container.py @@ -1,6 +1,9 @@ +"""Container class.""" from openbb_core.app.command_runner import CommandRunnerSession class Container: + """Container class for the command runner session.""" + def __init__(self, command_runner_session: CommandRunnerSession) -> None: self._command_runner_session = command_runner_session diff --git a/openbb_sdk/sdk/core/tests/test_static_container.py b/openbb_sdk/sdk/core/tests/test_static_container.py new file mode 100644 index 00000000000..5329647c988 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_container.py @@ -0,0 +1,9 @@ +"""Test the app/static/container.py file.""" + +from openbb_core.app.static.container import Container + + +def test_container_init(): + """Test container init.""" + container = Container(None) + assert container From b7cf6b556e7e02fc796c40a18f6bd829d4d77b1f Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 12:05:01 +0200 Subject: [PATCH 17/62] Test static app factory --- .../openbb_core/app/static/app_factory.py | 2 + .../sdk/core/tests/test_static_app_factory.py | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_static_app_factory.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/app_factory.py b/openbb_sdk/sdk/core/openbb_core/app/static/app_factory.py index 41d3defbb3b..22e15454da1 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/app_factory.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/app_factory.py @@ -1,3 +1,4 @@ +"""App factory.""" # pylint: disable=W0231:super-init-not-called from openbb_core.app.command_runner import CommandRunnerSession @@ -8,6 +9,7 @@ from openbb_core.app.static.coverage import Coverage def create_app(): + """Create the app.""" try: # pylint: disable=import-outside-toplevel from openbb_core.app.static.package.__commands__ import Commands diff --git a/openbb_sdk/sdk/core/tests/test_static_app_factory.py b/openbb_sdk/sdk/core/tests/test_static_app_factory.py new file mode 100644 index 00000000000..863ca944117 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_app_factory.py @@ -0,0 +1,48 @@ +"""Test static app factory.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.model.system_settings import SystemSettings +from openbb_core.app.model.user_settings import UserSettings +from openbb_core.app.static.account import Account +from openbb_core.app.static.app_factory import create_app +from openbb_core.app.static.coverage import Coverage + + +@pytest.fixture(scope="module") +def app_factory(): + """Return app factory.""" + return create_app() + + +def test_app_factory_init(app_factory): + """Test app factory init.""" + assert app_factory + + +def test_app_system_settings(app_factory): + """Test app system settings.""" + system_settings = app_factory.system + assert system_settings + assert isinstance(system_settings, SystemSettings) + + +def test_app_user_settings(app_factory): + """Test app user settings.""" + user_settings = app_factory.settings + assert user_settings + assert isinstance(user_settings, UserSettings) + + +def test_app_account(app_factory): + """Test app account.""" + account = app_factory.account + assert account + assert isinstance(account, Account) + + +def test_app_coverage(app_factory): + """Test app coverage.""" + coverage = app_factory.coverage + assert coverage + assert isinstance(coverage, Coverage) From 5f905b21057312d979d040cf31ecad842ccf939e Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Wed, 26 Jul 2023 11:06:31 +0100 Subject: [PATCH 18/62] test logging_manager --- .../tests/app/logs/test_logging_manager.py | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/app/logs/test_logging_manager.py diff --git a/openbb_sdk/sdk/core/tests/app/logs/test_logging_manager.py b/openbb_sdk/sdk/core/tests/app/logs/test_logging_manager.py new file mode 100644 index 00000000000..b409b3489aa --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/test_logging_manager.py @@ -0,0 +1,188 @@ +import json +from typing import Optional +from unittest.mock import MagicMock, Mock, patch + +import pytest +from openbb_core.app.logs.logging_manager import LoggingManager +from pydantic import BaseModel + + +class MockLoggingSettings: + def __init__(self, system_settings, user_settings): + self.system_settings = system_settings + self.user_settings = user_settings + + +class MockCommandOutput(BaseModel): + output: Optional[str] + error: Optional[str] + + +@pytest.fixture(scope="function") +def logging_manager(): + mock_system_settings = Mock() + mock_system_settings = "mock_system_settings" + mock_user_settings = Mock() + mock_user_settings = "mock_user_settings" + mock_setup_handlers = Mock() + mock_log_startup = Mock() + + with patch( + "openbb_core.app.logs.logging_manager.LoggingSettings", + MockLoggingSettings, + ), patch( + "openbb_core.app.logs.logging_manager.LoggingManager._setup_handlers", + mock_setup_handlers, + ), patch( + "openbb_core.app.logs.logging_manager.LoggingManager._log_startup", + mock_log_startup, + ): + logging_manager = LoggingManager( + system_settings=mock_system_settings, + user_settings=mock_user_settings, + ) + + assert mock_setup_handlers.assert_called_once + assert mock_log_startup.assert_called_once + + return logging_manager + + +def test_correctly_initialized(logging_manager): + assert logging_manager + + +def test_logging_settings_property(logging_manager): + assert logging_manager.logging_settings.system_settings == "mock_system_settings" + assert logging_manager.logging_settings.user_settings == "mock_user_settings" + + +def test_logging_settings_setter(logging_manager): + custom_user_settings = "custom_user_settings" + custom_system_settings = "custom_system_settings" + + with patch( + "openbb_core.app.logs.logging_manager.LoggingSettings", + MockLoggingSettings, + ): + logging_manager.logging_settings = ( + custom_system_settings, + custom_user_settings, + ) + + assert logging_manager.logging_settings.system_settings == "custom_system_settings" + assert logging_manager.logging_settings.user_settings == "custom_user_settings" + + +def test_log_startup(logging_manager): + with patch("logging.getLogger") as mock_get_logger: + mock_info = mock_get_logger.return_value.info + + class MockCredentials(BaseModel): + username: str + password: str + + logging_manager._user_settings = MagicMock( + preferences="your_preferences", + credentials=MockCredentials(username="username", password="password"), + ) + logging_manager._system_settings = "your_system_settings" + + logging_manager._log_startup() + + expected_log_data = { + "PREFERENCES": "your_preferences", + "KEYS": {"username": "defined", "password": "defined"}, + "SYSTEM": "your_system_settings", + } + mock_info.assert_called_once_with( + "STARTUP: %s ", + json.dumps(expected_log_data), + ) + mock_get_logger.assert_called_once + + +@pytest.mark.parametrize( + "user_settings, system_settings, command_output, route, func, kwargs", + [ + ( + "mock_settings", + "mock_system", + MockCommandOutput(output="mock_output"), + "mock_route", + "mock_func", + {}, + ), + ( + "mock_settings", + "mock_system", + MockCommandOutput(error="mock_error"), + "mock_route", + "mock_func", + {}, + ), + ( + "mock_settings", + "mock_system", + MockCommandOutput(error="mock_error"), + "login", + "mock_func", + {}, + ), + ], +) +def test_log( + logging_manager, user_settings, system_settings, command_output, route, func, kwargs +): + with patch( + "openbb_core.app.logs.logging_manager.LoggingSettings", + MockLoggingSettings, + ), patch("logging.getLogger") as mock_get_logger: + if route == "login": + with patch( + "openbb_core.app.logs.logging_manager.LoggingManager._log_startup" + ) as mock_log_startup: + logging_manager.log( + user_settings=user_settings, + system_settings=system_settings, + command_output=command_output, + route=route, + func=func, + kwargs=kwargs, + ) + assert mock_log_startup.assert_called_once + + else: + mock_info = mock_get_logger.return_value.info + mock_error = mock_get_logger.return_value.error + + mock_callable = Mock() + mock_callable.__name__ = func + + logging_manager.log( + user_settings=user_settings, + system_settings=system_settings, + command_output=command_output, + route=route, + func=mock_callable, + kwargs=kwargs, + ) + + expected_log_data = { + "route": route, + "input": kwargs, + "error": command_output.error, + } + + if command_output.error: + mock_error.assert_called_once_with( + "ERROR: %s", + json.dumps(expected_log_data), + extra={"func_name_override": func}, + ) + else: + mock_info.assert_called_once_with( + "CMD: %s", + json.dumps(expected_log_data), + extra={"func_name_override": func}, + ) From 87e99b55056cd64e75d4760c0b0042fc7bff1f40 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Wed, 26 Jul 2023 13:05:53 +0100 Subject: [PATCH 19/62] tests for logs utils --- .../core/openbb_core/app/logs/utils/utils.py | 25 ++++- .../app/logs/utils/test_expired_files.py | 6 ++ .../tests/app/logs/utils/test_system_utils.py | 1 + .../core/tests/app/logs/utils/test_utils.py | 94 +++++++++++++++++++ 4 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py create mode 100644 openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py create mode 100644 openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/utils/utils.py b/openbb_sdk/sdk/core/openbb_core/app/logs/utils/utils.py index 97548fa5be4..a43ae854dbb 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/utils/utils.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/utils/utils.py @@ -24,8 +24,7 @@ def get_app_id(contextual_user_data_directory: str) -> str: print( "Note for macOS users: copy `OpenBB Terminal` folder outside the DMG." ) - else: - raise e + raise e except Exception as e: raise e @@ -35,19 +34,37 @@ def get_app_id(contextual_user_data_directory: str) -> str: def get_log_dir(contextual_user_data_directory: str) -> Path: """Retrieve application's log directory.""" - log_dir = Path(contextual_user_data_directory).joinpath("logs").absolute() + log_dir = create_log_dir_if_not_exists(contextual_user_data_directory) + logging_uuid = create_log_uuid_if_not_exists(log_dir) + uuid_log_dir = create_uuid_dir_if_not_exists(log_dir, logging_uuid) + return uuid_log_dir + + +def create_log_dir_if_not_exists(contextual_user_data_directory: str) -> None: + log_dir = Path(contextual_user_data_directory).joinpath("logs").absolute() if not log_dir.is_dir(): log_dir.mkdir(parents=True, exist_ok=True) - log_id = (log_dir / ".logid").absolute() + return log_dir + +def create_log_uuid_if_not_exists(log_dir: Path) -> str: + log_id = get_log_id(log_dir) if not log_id.is_file(): logging_id = f"{uuid.uuid4()}" log_id.write_text(logging_id, encoding="utf-8") else: logging_id = log_id.read_text(encoding="utf-8").rstrip() + return logging_id + + +def get_log_id(log_dir): + return (log_dir / ".logid").absolute() + + +def create_uuid_dir_if_not_exists(log_dir, logging_id) -> str: uuid_log_dir = (log_dir / logging_id).absolute() if not uuid_log_dir.is_dir(): diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py new file mode 100644 index 00000000000..6a57a55ee93 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py @@ -0,0 +1,6 @@ +from openbb_core.app.logs.utils.expired_files import get_timestamp_from_x_days + + +def test_get_timestamp_from_x_days(): + result = get_timestamp_from_x_days(0) + assert isinstance(result, float) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py new file mode 100644 index 00000000000..057442b87f5 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py @@ -0,0 +1 @@ +# TODO : add tests once the code is fixed diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py new file mode 100644 index 00000000000..cf563c48284 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py @@ -0,0 +1,94 @@ +import pytest +import uuid +from pathlib import Path + +from unittest.mock import patch + +from openbb_core.app.logs.utils.utils import get_session_id, get_app_id, get_log_dir + +## get_session_id + + +def test_get_session_id_return_type(): + # Test if the returned value is a string + session_id = get_session_id() + assert isinstance(session_id, str) + + +def test_get_session_id_format(): + # Test if the returned string has the format "UUID-current_time" + session_id = get_session_id() + + parts = session_id.split("-") + + assert len(parts) == 6 + + uuid_part = "-".join(parts[0:5]) + time_part = str(parts[5]) + + # Check if the first part (UUID) is a valid UUID + assert uuid.UUID(uuid_part) + + # Check if the second part (current_time) is numeric + assert int(time_part) + + +def test_get_session_id_uniqueness(): + # Test if subsequent calls return different session IDs + session_id1 = get_session_id() + session_id2 = get_session_id() + assert session_id1 != session_id2 + + +## get_app_id + + +def test_get_app_id_success(): + # Mock the return value of get_log_dir to simulate a successful scenario + with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: + mock_get_log_dir + mock_get_log_dir.return_value = Path( + "/path/to/contextual_user_data_directory/app_id.log" + ) + app_id = get_app_id("/path/to/contextual_user_data_directory") + assert app_id == "app_id" + + +def test_get_app_id_os_error(): + # Test handling of OSError with errno 30 (Read-only file system) + with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: + mock_get_log_dir.side_effect = OSError(30, "Read-only file system") + with pytest.raises(OSError): + get_app_id("/path/to/contextual_user_data_directory") + + +def test_get_app_id_other_exception(): + # Test handling of other exceptions + with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: + mock_get_log_dir.side_effect = Exception("Some other error") + with pytest.raises(Exception, match="Some other error"): + get_app_id("/path/to/contextual_user_data_directory") + + +## get_log_dir + + +def test_get_log_dir(): + with patch( + "openbb_core.app.logs.utils.utils.create_log_dir_if_not_exists", + return_value="/test_dir", + ) as mock_create_log_dir, patch( + "openbb_core.app.logs.utils.utils.create_log_uuid_if_not_exists", + return_value="12345", + ) as mock_create_log_uuid, patch( + "openbb_core.app.logs.utils.utils.create_uuid_dir_if_not_exists", + return_value="/test_dir/12345", + ) as mock_create_uuid_dir: + # Call the get_log_dir function + result = get_log_dir("contextual_user_data_directory") + + # Assertions + assert result == "/test_dir/12345" + mock_create_log_dir.assert_called_once_with("contextual_user_data_directory") + mock_create_log_uuid.assert_called_once_with("/test_dir") + mock_create_uuid_dir.assert_called_once_with("/test_dir", "12345") From 1457d1bd6cbcabf01e046e31355202b904f3eafd Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:26:56 +0200 Subject: [PATCH 20/62] Test static package_builder --- openbb_sdk/pyproject.toml | 4 + .../openbb_core/app/static/package_builder.py | 48 +- openbb_sdk/sdk/core/pyproject.toml | 1 - .../core/tests/test_static_package_builder.py | 437 ++++++++++++++++++ 4 files changed, 485 insertions(+), 5 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/test_static_package_builder.py diff --git a/openbb_sdk/pyproject.toml b/openbb_sdk/pyproject.toml index 13487a2e048..15f9bdd8616 100644 --- a/openbb_sdk/pyproject.toml +++ b/openbb_sdk/pyproject.toml @@ -22,6 +22,10 @@ openbb-fmp = { path = "./providers/fmp" } openbb-polygon = { path = "./providers/polygon" } openbb-fred = { path = "./providers/fred" } + +[tool.poetry.group.dev.dependencies] +pytest = "^6.2.2" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py index 5be1fb330fb..d39df854f3d 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py @@ -106,8 +106,11 @@ class PackageBuilder: class ModuleBuilder: + """Build the module for the SDK.""" + @staticmethod def build(path: str) -> str: + """Build the module.""" code = "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###\n" code += ImportDefinition.build(path=path) code += ClassDefinition.build(path=path) @@ -116,8 +119,11 @@ class ModuleBuilder: class ImportDefinition: + """Build the import definition for the SDK.""" + @staticmethod def filter_hint_type_list(hint_type_list: List[Type]) -> List[Type]: + """Filter the hint type list.""" new_hint_type_list = [] for hint_type in hint_type_list: if hint_type != _empty and hint_type.__module__ != "builtins": @@ -129,6 +135,7 @@ class ImportDefinition: @classmethod def get_function_hint_type_list(cls, func: Callable) -> List[Type]: + """Get the hint type list from the function.""" sig = signature(func) parameter_map = sig.parameters return_type = sig.return_annotation @@ -148,6 +155,7 @@ class ImportDefinition: @classmethod def get_path_hint_type_list(cls, path: str) -> List[Type]: + """Get the hint type list from the path.""" route_map = PathHandler.build_route_map() path_list = PathHandler.build_path_list(route_map=route_map) child_path_list = PathHandler.get_child_path_list( @@ -165,6 +173,7 @@ class ImportDefinition: @classmethod def build(cls, path: str) -> str: + """Build the import definition.""" hint_type_list = cls.get_path_hint_type_list(path=path) code = "\nfrom openbb_core.app.static.container import Container" code += "\nfrom openbb_core.app.model.command_output import CommandOutput" @@ -195,8 +204,11 @@ class ImportDefinition: class ClassDefinition: + """Build the class definition for the SDK.""" + @staticmethod def build(path: str) -> str: + """Build the class definition.""" class_name = PathHandler.build_module_class(path=path) code = f"\nclass {class_name}(Container):\n" route_map = PathHandler.build_route_map() @@ -343,8 +355,11 @@ class DocstringGenerator: class MethodDefinition: + """Build the method definition for the SDK.""" + @staticmethod def build_class_loader_method(path: str) -> str: + """Build the class loader method.""" module_name = PathHandler.build_module_name(path=path) class_name = PathHandler.build_module_class(path=path) function_name = path.rsplit("/", maxsplit=1)[-1].strip("/") @@ -358,6 +373,7 @@ class MethodDefinition: @staticmethod def get_type(field: Any) -> type: + """Get the type of the field.""" field_type = getattr(field, "type", Parameter.empty) if isclass(field_type): name = field_type.__name__ @@ -369,24 +385,26 @@ class MethodDefinition: @staticmethod def get_default(field: Any): + """Get the default value of the field.""" field_default = getattr(field, "default", None) if field_default is None or field_default is MISSING: return Parameter.empty - default_default = getattr(field_default, "default", None) - if default_default is MISSING or default_default is Ellipsis: - return Parameter.empty + if field_default is not Ellipsis: + return field_default - return default_default + return Parameter.empty @staticmethod def is_annotated_dc(annotation) -> bool: + """Check if the annotation is an annotated dataclass.""" return get_origin(annotation) == Annotated and hasattr( annotation.__args__[0], "__dataclass_fields__" ) @staticmethod def reorder_params(params: Dict[str, Parameter]) -> OrderedDict[str, Parameter]: + """Reorder the params.""" formatted_keys = list(params.keys()) for k in ["provider", "extra_params"]: if k in formatted_keys: @@ -403,6 +421,7 @@ class MethodDefinition: def format_params( parameter_map: Dict[str, Parameter] ) -> OrderedDict[str, Parameter]: + """Format the params.""" # These are types we want to expand. # For example, start_date is always a 'date', but we also accept 'str' as input. # Be careful, if the type is not coercible by pydantic to the original type, you @@ -466,6 +485,7 @@ class MethodDefinition: @staticmethod def build_func_params(parameter_map: Dict[str, Parameter]) -> str: + """Build the function parameters.""" od = MethodDefinition.format_params(parameter_map=parameter_map) func_params = ", ".join(str(param) for param in od.values()) func_params = func_params.replace("NoneType", "None") @@ -477,6 +497,7 @@ class MethodDefinition: @staticmethod def build_func_returns(return_type: type) -> str: + """Build the function returns.""" if return_type == _empty: func_returns = "None" elif return_type.__module__ == "builtins": @@ -501,6 +522,7 @@ class MethodDefinition: def build_command_method_signature( func_name: str, parameter_map: Dict[str, Parameter], return_type: type ) -> str: + """Build the command method signature.""" func_params = MethodDefinition.build_func_params(parameter_map) func_returns = MethodDefinition.build_func_returns(return_type) code = "\n @filter_call" @@ -517,12 +539,14 @@ class MethodDefinition: @staticmethod def build_command_method_doc(func: Callable): + """Build the command method docstring.""" code = f' """{func.__doc__}"""\n' if func.__doc__ else "" return code @staticmethod def build_command_method_implementation(path: str, func: Callable): + """Build the command method implementation.""" sig = signature(func) parameter_map = dict(sig.parameters) parameter_map.pop("cc", None) @@ -560,6 +584,7 @@ class MethodDefinition: def build_command_method( cls, path: str, func: Callable, model_name: Optional[str] ) -> str: + """Build the command method.""" func_name = func.__name__ sig = signature(func) @@ -582,8 +607,11 @@ class MethodDefinition: class PathHandler: + """Handle the paths for the SDK.""" + @staticmethod def build_route_map() -> Dict[str, BaseRoute]: + """Build the route map.""" router = RouterLoader.from_extensions() route_map = {route.path: route for route in router.api_router.routes} # type: ignore @@ -591,6 +619,7 @@ class PathHandler: @staticmethod def build_path_list(route_map: Dict[str, BaseRoute]) -> List[str]: + """Build the path list.""" path_list = [] for route_path in route_map: if route_path not in path_list: @@ -607,10 +636,12 @@ class PathHandler: @staticmethod def get_route(path: str, route_map: Dict[str, BaseRoute]): + """Get the route from the path.""" return route_map.get(path, None) @staticmethod def get_child_path_list(path: str, path_list: List[str]) -> List[str]: + """Get the child path list.""" direct_children = [] for p in path_list: if p.startswith(path): @@ -622,28 +653,34 @@ class PathHandler: @staticmethod def clean_path(path: str) -> str: + """Clean the path.""" if path.startswith("/"): path = path[1:] return path.replace("-", "_").replace("/", "_") @classmethod def build_module_name(cls, path: str) -> str: + """Build the module name.""" if path == "": return "__commands__" return cls.clean_path(path=path) @classmethod def build_module_class(cls, path: str) -> str: + """Build the module class.""" if path == "": return "Commands" return f"CLASS_{cls.clean_path(path=path)}" class Linters: + """Run the linters for the SDK.""" + current_folder = str(Path(Path(__file__).parent, "package").absolute()) @staticmethod def print_separator(symbol: str, length: int = 160): + """Print a separator.""" print(symbol * length) @staticmethod @@ -665,12 +702,15 @@ class Linters: @classmethod def black(cls): + """Run black.""" cls.run(linter="black") @classmethod def ruff(cls): + """Run ruff.""" cls.run(linter="ruff", flags=["--fix"]) @classmethod def mypy(cls): + """Run mypy.""" cls.run(linter="mypy", flags=["--ignore-missing-imports"]) diff --git a/openbb_sdk/sdk/core/pyproject.toml b/openbb_sdk/sdk/core/pyproject.toml index 753b43804c4..99d6bdbf9ee 100644 --- a/openbb_sdk/sdk/core/pyproject.toml +++ b/openbb_sdk/sdk/core/pyproject.toml @@ -26,7 +26,6 @@ openbb-provider = { path = "../provider" } [tool.poetry.group.dev.dependencies] openbb-provider = { path = "../provider" } -pytest = "^6.2.2" [build-system] requires = ["poetry-core"] diff --git a/openbb_sdk/sdk/core/tests/test_static_package_builder.py b/openbb_sdk/sdk/core/tests/test_static_package_builder.py new file mode 100644 index 00000000000..6cbb16f4a07 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_package_builder.py @@ -0,0 +1,437 @@ +"""Test the app/static/package_builder.py file.""" +# pylint: disable=redefined-outer-name + +from dataclasses import dataclass +from inspect import _empty +from typing import Annotated + +import pytest +from openbb_core.app.static.package_builder import ( + ClassDefinition, + ImportDefinition, + Linters, + MethodDefinition, + ModuleBuilder, + PackageBuilder, + Parameter, + PathHandler, +) + + +@pytest.fixture(scope="module") +def package_builder(): + """Return package builder.""" + return PackageBuilder() + + +def test_package_builder_init(package_builder): + """Test package builder init.""" + assert package_builder + + +@pytest.mark.skip("Rebuilds the packages which takes some time.") +def test_package_builder_build(package_builder): + """Test package builder build.""" + package_builder.build() + + +@pytest.mark.skip() +def test_save_module_map(package_builder): + """Test save module map.""" + package_builder.save_module_map() + + +@pytest.mark.skip() +def test_save_modules(package_builder): + """Test save module.""" + package_builder.save_modules() + + +@pytest.mark.skip() +def test_save_package(package_builder): + """Test save package.""" + package_builder.save_package() + + +def test_run_linters(package_builder): + """Test run linters.""" + package_builder.run_linters() + + +@pytest.mark.skip("We avoid writing to the package.") +def test_write_to_package(package_builder): + """Test save to package.""" + package_builder.write_to_package() + + +@pytest.fixture(scope="module") +def module_builder(): + """Return module builder.""" + return ModuleBuilder() + + +def test_module_builder_init(module_builder): + """Test module builder init.""" + assert module_builder + + +@pytest.fixture(scope="module") +def class_definition(): + """Return class definition.""" + return ClassDefinition() + + +def test_class_definition_init(class_definition): + """Test class definition init.""" + assert class_definition + + +def test_build(class_definition): + """Test build.""" + code = class_definition.build("openbb_core.app.static.container.Container") + assert code + + +@pytest.fixture(scope="module") +def method_definition(): + """Return method definition.""" + return MethodDefinition() + + +def test_method_definition_init(method_definition): + """Test method definition init.""" + assert method_definition + + +def test_build_class_loader_method(method_definition): + """Test build class loader method.""" + code = method_definition.build_class_loader_method( + "openbb_core.app.static.container.Container" + ) + assert code + + +def test_get_type(method_definition): + """Test get type.""" + type_ = method_definition.get_type(field=Parameter.empty) + assert type_ + assert isinstance(type_, type) + + +def test_get_type_hint(method_definition): + """Test get type hint.""" + + class TestField: + type = int + + field = TestField() + result = method_definition.get_type(field) + assert result == int + + +def test_field_with_type_attribute_missing_type(method_definition): + """Test field with type attribute missing type.""" + + class TestField: + type = Parameter.empty + + field = TestField() + result = method_definition.get_type(field) + assert result is Parameter.empty + + +def test_get_default(method_definition): + """Test get default.""" + + class TestField: + default = 42 + + field = TestField() + result = method_definition.get_default(field) + assert result == 42 + + +def test_get_default_default_value(method_definition): + """Test get default default value.""" + + class TestField: + default = type(Ellipsis)() + + field = TestField() + result = method_definition.get_default(field) + assert result == _empty + + +def test_get_default_no_default(method_definition): + """Test get default no default.""" + + class TestField: + pass + + field = TestField() + result = method_definition.get_default(field) + assert result == _empty + + +def test_is_annotated_dc(method_definition): + """Test is annotated dc.""" + result = method_definition.is_annotated_dc(annotation=Parameter.empty) + assert not result + + +def test_is_annotated_dc_annotated(method_definition): + """Test is annotated dc annotated.""" + + @dataclass + class TestAnnotatedDataClass: + """Test annotated data class.""" + + value: int + + annotated_dataclass = Annotated[TestAnnotatedDataClass, "test_annotation"] + result = method_definition.is_annotated_dc(annotation=annotated_dataclass) + assert result + + +def test_reorder_params(method_definition): + """Test reorder params.""" + params = { + "provider": Parameter.empty, + "extra_params": Parameter.empty, + "param1": Parameter.empty, + "param2": Parameter.empty, + } + result = method_definition.reorder_params(params=params) + assert result + assert list(result.keys()) == ["param1", "param2", "provider", "extra_params"] + + +def test_build_func_params(method_definition): + """Test build func params.""" + param_map = { + "param1": Parameter("NoneType", kind=Parameter.POSITIONAL_OR_KEYWORD), + "param2": Parameter("int", kind=Parameter.POSITIONAL_OR_KEYWORD), + } + + expected_output = "param1, param2, chart: bool = False" + output = method_definition.build_func_params(param_map) + + assert output == expected_output + + +@pytest.mark.parametrize( + "return_type, expected_output", + [ + (_empty, "None"), + (int, "int"), + ], +) +def test_build_func_returns(method_definition, return_type, expected_output): + """Test build func returns.""" + output = method_definition.build_func_returns(return_type=return_type) + assert output == expected_output + + +def test_build_command_method_signature(method_definition): + """Test build command method signature.""" + parameter_map = { + "param1": Parameter("NoneType", kind=Parameter.POSITIONAL_OR_KEYWORD), + "param2": Parameter("int", kind=Parameter.POSITIONAL_OR_KEYWORD), + } + return_type = int + output = method_definition.build_command_method_signature( + func_name="test_func", parameter_map=parameter_map, return_type=return_type + ) + assert output + + +def test_build_command_method_doc(method_definition): + """Test build command method doc.""" + + def some_func(): + """Do some func doc.""" + + output = method_definition.build_command_method_doc(func=some_func) + assert output + assert isinstance(output, str) + + +def test_build_command_method_implementation(method_definition): + """Test build command method implementation.""" + + def some_func(): + """Do some func doc.""" + return 42 + + output = method_definition.build_command_method_implementation( + path="openbb_core.app.static.container.Container", func=some_func + ) + + assert output + assert isinstance(output, str) + + +def test_build_command_method(method_definition): + """Test build command method.""" + + def some_func(): + """Do some func doc.""" + return 42 + + output = method_definition.build_command_method( + path="openbb_core.app.static.container.Container", + func=some_func, + model_name=None, + ) + + assert output + assert isinstance(output, str) + + +@pytest.fixture(scope="module") +def import_definition(): + """Return import definition.""" + return ImportDefinition() + + +def test_import_definition_init(import_definition): + """Test import definition init.""" + assert import_definition + + +def test_filter_hint_type_list(import_definition): + """Test filter type hint list.""" + output = import_definition.filter_hint_type_list( + hint_type_list=[int, str, float, bool, _empty, _empty, _empty, _empty] + ) + assert output == [] + + +def test_import_definition_get_path_hint_type_list(import_definition): + """Test import definition get path hint type list.""" + hint_type_list = import_definition.get_path_hint_type_list( + path="openbb_core.app.static.container.Container" + ) + assert hint_type_list == [] + + +def test_import_definition_build(import_definition): + """Test import definition build.""" + code = import_definition.build(path="openbb_core.app.static.container.Container") + assert code + + +@pytest.fixture(scope="module") +def path_handler(): + """Return path handler.""" + return PathHandler() + + +def test_path_handler_init(path_handler): + """Test path handler init.""" + assert path_handler + + +@pytest.fixture(scope="module") +def route_map(path_handler): + """Return route map.""" + return path_handler.build_route_map() + + +def test_build_route_map(route_map): + """Test build route map.""" + assert route_map + assert isinstance(route_map, dict) + + +@pytest.fixture(scope="module") +def path_list(path_handler, route_map): + """Return path list.""" + return path_handler.build_path_list(route_map=route_map) + + +def test_build_path_list(path_list): + """Test build path list.""" + assert path_list + assert isinstance(path_list, list) + + +def test_get_route(path_handler, route_map): + """Test get route.""" + route = path_handler.get_route(route_map=route_map, path="/stocks/load") + + assert route + + +def test_get_child_path_list(path_handler, path_list): + """Test get child path list.""" + child_path_list = path_handler.get_child_path_list( + path="/stocks", path_list=path_list + ) + + assert child_path_list + assert isinstance(child_path_list, list) + + +def test_clean_path(path_handler): + """Test clean path.""" + path = "/stocks/load" + result = path_handler.clean_path(path=path) + assert result == "stocks_load" + + +def test_build_module_name(path_handler): + """Test build module name.""" + module_name = path_handler.build_module_name(path="") + assert module_name == "__commands__" + + module_name = path_handler.build_module_name(path="/stocks/load") + assert module_name == "stocks_load" + + +def test_build_module_class(path_handler): + """Test build module class.""" + module_class = path_handler.build_module_class(path="") + assert module_class == "Commands" + + module_class = path_handler.build_module_class(path="/stocks/load") + assert module_class == "CLASS_stocks_load" + + +@pytest.fixture(scope="module") +def linters(): + """Return linters.""" + return Linters() + + +def test_linters_init(linters): + """Test linters init.""" + assert linters + + +def test_print_separator(linters): + """Test print separator.""" + linters.print_separator(symbol="AAPL") + + +def test_run(linters): + """Test run.""" + linters.run(linter="ruff") + + +def test_ruff(linters): + """Test ruff.""" + linters.ruff() + + +def test_black(linters): + """Test black.""" + linters.black() + + +def test_mypy(linters): + """Test mypy.""" + linters.mypy() + + +# TODO: Implement unit test for the DocstringGenerator class once refactored. From 45bdef10b8a3358e48920b04b8cd9b83c5c3efe1 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:43:34 +0200 Subject: [PATCH 21/62] Test static package_builder update --- .../openbb_core/app/static/package/economy.py | 58 +++++++++---------- .../app/static/package/fixedincome.py | 2 +- .../app/static/package/stocks_fa.py | 4 +- .../openbb_core/app/static/package_builder.py | 7 ++- .../core/tests/test_static_package_builder.py | 16 ++++- 5 files changed, 50 insertions(+), 37 deletions(-) diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py index ce7fd38bc5f..1f21772dec6 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py @@ -19,7 +19,7 @@ class CLASS_economy(Container): def corecpi( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """CORECPI.""" inputs = filter_inputs( @@ -248,7 +248,7 @@ class CLASS_economy(Container): def cpi_options( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """Get the options for v3 cpi(options=True)""" inputs = filter_inputs( @@ -448,7 +448,7 @@ class CLASS_economy(Container): def macro( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """Query EconDB for macro data.""" inputs = filter_inputs( @@ -470,7 +470,7 @@ class CLASS_economy(Container): def macro_countries( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """MACRO_COUNTRIES.""" inputs = filter_inputs( @@ -492,7 +492,7 @@ class CLASS_economy(Container): def macro_parameters( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """MACRO_PARAMETERS.""" inputs = filter_inputs( @@ -514,7 +514,7 @@ class CLASS_economy(Container): def balance( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """BALANCE.""" inputs = filter_inputs( @@ -536,7 +536,7 @@ class CLASS_economy(Container): def bigmac( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """BIGMAC.""" inputs = filter_inputs( @@ -558,7 +558,7 @@ class CLASS_economy(Container): def country_codes( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """COUNTRY_CODES.""" inputs = filter_inputs( @@ -580,7 +580,7 @@ class CLASS_economy(Container): def currencies( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """CURRENCIES.""" inputs = filter_inputs( @@ -602,7 +602,7 @@ class CLASS_economy(Container): def debt( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """DEBT.""" inputs = filter_inputs( @@ -624,7 +624,7 @@ class CLASS_economy(Container): def events( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """EVENTS.""" inputs = filter_inputs( @@ -646,7 +646,7 @@ class CLASS_economy(Container): def fgdp( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """FGDP.""" inputs = filter_inputs( @@ -668,7 +668,7 @@ class CLASS_economy(Container): def fred( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """FRED.""" inputs = filter_inputs( @@ -690,7 +690,7 @@ class CLASS_economy(Container): def fred_search( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """FRED Search (was fred_notes).""" inputs = filter_inputs( @@ -712,7 +712,7 @@ class CLASS_economy(Container): def futures( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """FUTURES. 2 sources""" inputs = filter_inputs( @@ -734,7 +734,7 @@ class CLASS_economy(Container): def gdp( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """GDP.""" inputs = filter_inputs( @@ -756,7 +756,7 @@ class CLASS_economy(Container): def glbonds( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """GLBONDS.""" inputs = filter_inputs( @@ -778,7 +778,7 @@ class CLASS_economy(Container): def indices( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """INDICES.""" inputs = filter_inputs( @@ -800,7 +800,7 @@ class CLASS_economy(Container): def overview( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """OVERVIEW.""" inputs = filter_inputs( @@ -822,7 +822,7 @@ class CLASS_economy(Container): def perfmap( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """PERFMAP.""" inputs = filter_inputs( @@ -844,7 +844,7 @@ class CLASS_economy(Container): def performance( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """PERFORMANCE.""" inputs = filter_inputs( @@ -866,7 +866,7 @@ class CLASS_economy(Container): def revenue( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """REVENUE.""" inputs = filter_inputs( @@ -888,7 +888,7 @@ class CLASS_economy(Container): def rgdp( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """RGDP.""" inputs = filter_inputs( @@ -910,7 +910,7 @@ class CLASS_economy(Container): def rtps( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """RTPS.""" inputs = filter_inputs( @@ -932,7 +932,7 @@ class CLASS_economy(Container): def search_index( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """SEARCH_INDEX.""" inputs = filter_inputs( @@ -954,7 +954,7 @@ class CLASS_economy(Container): def spending( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """SPENDING.""" inputs = filter_inputs( @@ -976,7 +976,7 @@ class CLASS_economy(Container): def trust( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """TRUST.""" inputs = filter_inputs( @@ -998,7 +998,7 @@ class CLASS_economy(Container): def usbonds( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """USBONDS.""" inputs = filter_inputs( @@ -1020,7 +1020,7 @@ class CLASS_economy(Container): def valuation( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """VALUATION.""" inputs = filter_inputs( diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py index a46f8309ceb..51d71a38625 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py @@ -18,7 +18,7 @@ class CLASS_fixedincome(Container): def treasury( self, start_date: Optional[str] = None, - end_date: Optional[str] = "2023-07-24", + end_date: Optional[str] = "2023-07-26", chart: bool = False, provider: Optional[Literal["fmp"]] = None, **kwargs diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py index f7fd3c64475..c854f49d230 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py @@ -206,8 +206,8 @@ class CLASS_stocks_fa(Container): @validate_arguments def cal( self, - start_date: Union[datetime.date, None, str] = datetime.date(2023, 6, 23), - end_date: Union[datetime.date, None, str] = datetime.date(2023, 7, 23), + start_date: Union[datetime.date, None, str] = datetime.date(2023, 6, 25), + end_date: Union[datetime.date, None, str] = datetime.date(2023, 7, 25), chart: bool = False, provider: Optional[Literal["fmp"]] = None, **kwargs diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py index d39df854f3d..4d1b6950b53 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py @@ -390,10 +390,11 @@ class MethodDefinition: if field_default is None or field_default is MISSING: return Parameter.empty - if field_default is not Ellipsis: - return field_default + default_default = getattr(field_default, "default", None) + if default_default is MISSING or default_default is Ellipsis: + return Parameter.empty - return Parameter.empty + return default_default @staticmethod def is_annotated_dc(annotation) -> bool: diff --git a/openbb_sdk/sdk/core/tests/test_static_package_builder.py b/openbb_sdk/sdk/core/tests/test_static_package_builder.py index 6cbb16f4a07..7e075d011e2 100644 --- a/openbb_sdk/sdk/core/tests/test_static_package_builder.py +++ b/openbb_sdk/sdk/core/tests/test_static_package_builder.py @@ -16,6 +16,7 @@ from openbb_core.app.static.package_builder import ( Parameter, PathHandler, ) +from pydantic import Field @pytest.fixture(scope="module") @@ -144,13 +145,24 @@ def test_get_default(method_definition): """Test get default.""" class TestField: - default = 42 + default = Field(default=42) field = TestField() result = method_definition.get_default(field) assert result == 42 +def test_get_default_none(method_definition): + """Test get default.""" + + class TestField: + default = 42 + + field = TestField() + result = method_definition.get_default(field) + assert result is None + + def test_get_default_default_value(method_definition): """Test get default default value.""" @@ -159,7 +171,7 @@ def test_get_default_default_value(method_definition): field = TestField() result = method_definition.get_default(field) - assert result == _empty + assert result is None def test_get_default_no_default(method_definition): From 84e18749ef2478eaba4df54e82df2fb4d44dd0dc Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Thu, 27 Jul 2023 08:24:33 +0100 Subject: [PATCH 22/62] boilerplate for tests --- .../app/logs/formatters/test_formatter_with_exceptions.py | 5 +++++ .../app/logs/handlers/test_path_tracking_file_handler.py | 0 .../sdk/core/tests/app/logs/handlers/test_posthog_handler.py | 0 3 files changed, 5 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py create mode 100644 openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py create mode 100644 openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py diff --git a/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py b/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py new file mode 100644 index 00000000000..f67e3151da9 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py @@ -0,0 +1,5 @@ +import pytest + +from openbb_core.app.logs.formatters.formatter_with_exceptions import ( + FormatterWithExceptions, +) diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py new file mode 100644 index 00000000000..e69de29bb2d From 7db92c292765a438c60b8b89c43c0c3f3d4165b9 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:45:18 +0200 Subject: [PATCH 23/62] Test user_service --- .../openbb_core/app/service/user_service.py | 15 +++ .../core/tests/test_service_user_service.py | 119 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_service_user_service.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/user_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/user_service.py index 963d9ca3fb8..e26d2d1ab25 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/user_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/user_service.py @@ -1,3 +1,4 @@ +"""User service.""" from functools import reduce from pathlib import Path from typing import Any, Dict, List, MutableMapping, Optional @@ -26,6 +27,8 @@ from pymongo.mongo_client import MongoClient class UserService: + """User service.""" + REPOSITORY_DIRECTORY = Path(__file__).parent.parent.parent.parent USER_SETTINGS_PATH = USER_SETTINGS_PATH USER_SETTINGS_ALLOWED_FIELD_SET = {"credentials", "preferences", "defaults"} @@ -36,6 +39,7 @@ class UserService: mongodb_client: Optional[MongoClient] = None, access_token_repository: Optional[AbstractAccessTokenRepository] = None, ) -> AbstractAccessTokenRepository: + """Build token repository.""" if access_token_repository: pass elif mongodb_client and valid_client: @@ -52,6 +56,7 @@ class UserService: mongodb_client: Optional[MongoClient] = None, user_settings_repository: Optional[AbstractUserSettingsRepository] = None, ) -> AbstractUserSettingsRepository: + """Build user settings repository.""" if user_settings_repository: pass elif mongodb_client and valid_client: @@ -64,6 +69,7 @@ class UserService: @staticmethod def valid_client(client: Optional[MongoClient] = None) -> bool: + """Check if the client is valid.""" if client is None: return False @@ -77,6 +83,7 @@ class UserService: @classmethod def read_default_user_settings(cls, path: Optional[Path] = None) -> UserSettings: + """Read default user settings.""" path = path or cls.USER_SETTINGS_PATH if path.exists(): @@ -95,6 +102,7 @@ class UserService: user_settings: UserSettings, path: Optional[Path] = None, ) -> None: + """Write default user settings.""" path = path or cls.USER_SETTINGS_PATH user_settings_json = user_settings.json( @@ -107,6 +115,7 @@ class UserService: @classmethod def update_default(cls, user_settings: UserSettings) -> UserSettings: + """Update default user settings.""" d1 = cls.read_default_user_settings().dict() d2 = user_settings.dict() if user_settings else {} updated = cls.merge_dicts([d1, d2]) @@ -158,25 +167,31 @@ class UserService: @property def mongodb_client(self) -> Optional[MongoClient]: + """Return MongoDB client.""" return self._mongodb_client @property def default_user_settings(self) -> UserSettings: + """Return default user settings.""" return self._default_user_settings @default_user_settings.setter def default_user_settings(self, default_user_settings: UserSettings) -> None: + """Set default user settings.""" self._default_user_settings = default_user_settings @property def access_token_repository(self) -> AbstractAccessTokenRepository: + """Access token repository.""" return self._token_repository @property def user_settings_repository(self) -> AbstractUserSettingsRepository: + """User settings repository.""" return self._user_settings_repository def refresh_default_default_user_settings(self) -> UserSettings: + """Refresh default default user settings.""" self._default_user_settings = self.read_default_user_settings() return self._default_user_settings diff --git a/openbb_sdk/sdk/core/tests/test_service_user_service.py b/openbb_sdk/sdk/core/tests/test_service_user_service.py new file mode 100644 index 00000000000..b8c2d0532d6 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_service_user_service.py @@ -0,0 +1,119 @@ +"""Test the ../app/service/user_service.py module.""" + +from pathlib import Path +from unittest.mock import MagicMock + +import pytest +from openbb_core.app.service.user_service import ( + AbstractAccessTokenRepository, + InMemoryAccessTokenRepository, + MongoClient, + MongoDBAccessTokenRepository, + UserService, + UserSettings, +) + + +def test_build_token_repository_with_given_repository(): + """Test build with repository.""" + mock_repository = MagicMock(spec=AbstractAccessTokenRepository) + result = UserService.build_token_repository( + valid_client=True, access_token_repository=mock_repository + ) + + assert result == mock_repository + + +def test_build_token_repository_with_mongodb_client(): + """Test build with mongodb client.""" + mock_client = MagicMock(spec=MongoClient) + result = UserService.build_token_repository( + valid_client=True, mongodb_client=mock_client + ) + + assert isinstance(result, MongoDBAccessTokenRepository) + + +def test_build_token_repository_memory(): + """Test build with in-memory access.""" + result = UserService.build_token_repository(valid_client=True) + + assert isinstance(result, InMemoryAccessTokenRepository) + + +def test_build_user_settings_repository_with_given_repository(): + """Test build with repository.""" + mock_repository = MagicMock(spec=AbstractAccessTokenRepository) + result = UserService.build_user_settings_repository( + valid_client=True, user_settings_repository=mock_repository + ) + + assert result == mock_repository + + +def test_build_user_settings_repository_with_mongodb_client(): + """Test build with mongodb client.""" + mock_client = MagicMock(spec=MongoClient) + result = UserService.build_user_settings_repository( + valid_client=True, mongodb_client=mock_client + ) + + assert result + assert isinstance(type(result), type(MongoDBAccessTokenRepository)) + + +def test_build_user_settings_repository_memory(): + """Test build with in-memory access.""" + result = UserService.build_user_settings_repository(valid_client=True) + + assert result + assert isinstance(type(result), type(InMemoryAccessTokenRepository)) + + +def test_valid_client_false(): + """Test valid client.""" + result = UserService.valid_client() + + assert result is False + + +def test_valid_client_true(): + """Test valid client.""" + mock_client = MagicMock(spec=MongoClient) + result = UserService.valid_client(client=mock_client) + + assert result is True + + +# @pytest.mark.skip(reason="TODO") +def test_read_default_user_settings_file_exists(): + """Test read default user settings.""" + result = UserService.read_default_user_settings(path=Path("some_path")) + + assert result + assert isinstance(result, UserSettings) + + +@pytest.mark.skip(reason="TODO") +def test_write_default_user_settings(): + """Test write default user settings.""" + + +@pytest.mark.skip(reason="TODO") +def test_update_default(): + """Test update default user settings.""" + + +def test_merge_dicts(): + """Test merge dicts.""" + result = UserService.merge_dicts( + list_of_dicts=[ + {"a": 1, "b": 2}, + {"a": 3, "b": 4}, + ] + ) + + assert result + assert isinstance(result, dict) + assert result["a"] == 3 + assert result["b"] == 4 From 2fcb23b36d36b1d510cdb6e89fb4f8a17e97af4d Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:55:21 +0200 Subject: [PATCH 24/62] Test system_settings --- .../openbb_core/app/service/system_service.py | 7 +++ .../core/tests/test_service_system_service.py | 54 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_service_system_service.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py index f9bc25cc7b9..d479b48fbae 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py @@ -6,6 +6,8 @@ from openbb_core.app.model.system_settings import SystemSettings class SystemService: + """System service.""" + SYSTEM_SETTINGS_PATH = SYSTEM_SETTINGS_PATH SYSTEM_SETTINGS_ALLOWED_FIELD_SET = {"run_in_isolation", "dbms_uri"} @@ -13,6 +15,7 @@ class SystemService: def read_default_system_settings( cls, path: Optional[Path] = None ) -> SystemSettings: + """Read default system settings.""" path = path or cls.SYSTEM_SETTINGS_PATH if path.exists(): @@ -31,6 +34,7 @@ class SystemService: system_settings: SystemSettings, path: Optional[Path] = None, ) -> None: + """Write default system settings.""" path = path or cls.SYSTEM_SETTINGS_PATH system_settings_json = system_settings.json( @@ -50,13 +54,16 @@ class SystemService: @property def system_settings(self) -> SystemSettings: + """Get system settings.""" return self._system_settings @system_settings.setter def system_settings(self, system_settings: SystemSettings) -> None: + """Set system settings.""" self._system_settings = system_settings def refresh_system_settings(self) -> SystemSettings: + """Refresh system settings.""" self._system_settings = self.read_default_system_settings() return self._system_settings diff --git a/openbb_sdk/sdk/core/tests/test_service_system_service.py b/openbb_sdk/sdk/core/tests/test_service_system_service.py new file mode 100644 index 00000000000..79e6c4a0ab2 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_service_system_service.py @@ -0,0 +1,54 @@ +"""Test the ../openbb_core/app/service/system_service.py module.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.service.system_service import SystemService + + +@pytest.fixture +def system_service(): + """Fixture for system service.""" + return SystemService() + + +def test_system_service_init(system_service): + """Test system service init.""" + assert system_service + + +def test_read_default_system_settings(system_service): + """Test read default system settings.""" + system_settings = system_service.read_default_system_settings() + + assert system_settings + + +def test_write_default_system_settings(system_service): + """Test write default system settings.""" + system_settings = system_service.read_default_system_settings() + system_service.write_default_system_settings(system_settings=system_settings) + + assert system_service + + +def test_system_settings(system_service): + """Test system settings.""" + system_settings = system_service.system_settings + + assert system_settings + + +def test_system_settings_setter(system_service): + """Test system settings setter.""" + system_settings = system_service.system_settings + + system_service.system_settings = system_settings + + assert system_service.system_settings == system_settings + + +def test_refresh_system_settings(system_service): + """Test refresh system settings.""" + system_settings = system_service.refresh_system_settings() + + assert system_settings From d0ec9d86500d065089ffcf3e906b5222719f1e55 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 14:05:19 +0200 Subject: [PATCH 25/62] Test journal_service --- .../app/service/journal_service.py | 5 + .../tests/test_service_journal_service.py | 103 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_service_journal_service.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py index ff348767de4..085f80bd533 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py @@ -22,8 +22,11 @@ from pymongo.mongo_client import MongoClient class JournalService: + """Journal service.""" + @staticmethod def valid_client(mongodb_client: Optional[MongoClient] = None) -> bool: + """Check if the client is valid.""" if mongodb_client is None: return False @@ -41,6 +44,7 @@ class JournalService: mongodb_client: Optional[MongoClient] = None, journal_entry_repository: Optional[AbstractJournalEntryRepository] = None, ) -> AbstractJournalEntryRepository: + """Build journal entry repository.""" if journal_entry_repository: pass elif mongodb_client and valid_client: @@ -57,6 +61,7 @@ class JournalService: mongodb_client: Optional[MongoClient] = None, journal_repository: Optional[AbstractJournalRepository] = None, ) -> AbstractJournalRepository: + """Build journal repository.""" if journal_repository: pass elif mongodb_client and valid_client: diff --git a/openbb_sdk/sdk/core/tests/test_service_journal_service.py b/openbb_sdk/sdk/core/tests/test_service_journal_service.py new file mode 100644 index 00000000000..b22edab68f6 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_service_journal_service.py @@ -0,0 +1,103 @@ +"""Test the ../openbb_core/app/service/journal_service.py module.""" +# pylint: disable=redefined-outer-name + +from unittest.mock import MagicMock + +import pytest +from openbb_core.app.service.journal_service import ( + AbstractJournalEntryRepository, + InMemoryJournalEntryRepository, + JournalService, + MongoClient, + MongoDBJournalEntryRepository, +) + + +@pytest.fixture +def journal_service(): + """Fixture for journal service.""" + return JournalService() + + +def test_journal_service_init(journal_service): + """Test journal service init.""" + assert journal_service + + +def test_invalid_client(journal_service): + """Test valid client.""" + assert not journal_service.valid_client() + + +def test_build_journal_entry_repository_with_given_repository(): + """Test build with repository.""" + mock_repository = MagicMock(spec=AbstractJournalEntryRepository) + result = JournalService.build_journal_entry_repository( + valid_client=True, journal_entry_repository=mock_repository + ) + + assert result == mock_repository + + +def test_build_journal_entry_repository_with_mongodb_client(): + """Test build with mongodb client.""" + mock_client = MagicMock(spec=MongoClient) + result = JournalService.build_journal_entry_repository( + valid_client=True, mongodb_client=mock_client + ) + + assert isinstance(result, MongoDBJournalEntryRepository) + + +def test_build_journal_entry_repository_memory(): + """Test build with in-memory access.""" + result = JournalService.build_journal_entry_repository(valid_client=True) + + assert isinstance(result, InMemoryJournalEntryRepository) + + +def test_build_journal_repository_with_given_repository(): + """Test build with repository.""" + mock_repository = MagicMock(spec=AbstractJournalEntryRepository) + result = JournalService.build_journal_entry_repository( + valid_client=True, journal_entry_repository=mock_repository + ) + + assert result == mock_repository + + +def test_build_journal_repository_with_mongodb_client(): + """Test build with mongodb client.""" + mock_client = MagicMock(spec=MongoClient) + result = JournalService.build_journal_entry_repository( + valid_client=True, mongodb_client=mock_client + ) + + assert isinstance(result, MongoDBJournalEntryRepository) + + +def test_build_journal_repository_memory(): + """Test build with in-memory access.""" + result = JournalService.build_journal_entry_repository(valid_client=True) + + assert isinstance(result, InMemoryJournalEntryRepository) + + +def test_journal_service_mongodb_client(journal_service): + """Test mongodb client.""" + assert journal_service.mongodb_client is None + + +def test_journal_service_journal_entry_repository(journal_service): + """Test journal entry repository.""" + assert isinstance( + journal_service.journal_entry_repository, InMemoryJournalEntryRepository + ) + + +def test_journal_service_journal_repository(journal_service): + """Test journal repository.""" + assert journal_service.journal_repository + assert isinstance( + type(journal_service.journal_repository), type(InMemoryJournalEntryRepository) + ) From d72adfd29c5b0fc8fd89aded432d2dae26b5ea52 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 14:57:26 +0200 Subject: [PATCH 26/62] Hub service tests and file restructure. --- .../openbb_core/app/service/hub_service.py | 5 +- .../app/service/journal_service.py | 4 + .../tests/app/service/test_hub_service.py | 164 ++++++++++++++++++ .../service/test_journal_service.py} | 2 +- .../service/test_system_service.py} | 2 +- .../service/test_user_service.py} | 2 +- .../static/test_app_factory.py} | 0 .../static/test_container.py} | 2 +- .../static/test_coverage.py} | 2 +- .../static/test_filters.py} | 2 +- .../static/test_package_builder.py} | 2 +- 11 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/service/test_hub_service.py rename openbb_sdk/sdk/core/tests/{test_service_journal_service.py => app/service/test_journal_service.py} (97%) rename openbb_sdk/sdk/core/tests/{test_service_system_service.py => app/service/test_system_service.py} (95%) rename openbb_sdk/sdk/core/tests/{test_service_user_service.py => app/service/test_user_service.py} (98%) rename openbb_sdk/sdk/core/tests/{test_static_app_factory.py => app/static/test_app_factory.py} (100%) rename openbb_sdk/sdk/core/tests/{test_static_container.py => app/static/test_container.py} (78%) rename openbb_sdk/sdk/core/tests/{test_static_coverage.py => app/static/test_coverage.py} (93%) rename openbb_sdk/sdk/core/tests/{test_static_filters.py => app/static/test_filters.py} (95%) rename openbb_sdk/sdk/core/tests/{test_static_package_builder.py => app/static/test_package_builder.py} (99%) diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/hub_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/hub_service.py index 9611f0f9220..ee5c4d37548 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/hub_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/hub_service.py @@ -1,3 +1,4 @@ +"""Hub manager class.""" from typing import Optional import requests @@ -11,11 +12,11 @@ from openbb_core.app.model.user_settings import UserSettings class OpenBBError(Exception): - pass + """OpenBB error.""" class HubService: - """Hub manager class""" + """Manage Hub service class.""" BASE_URL = "https://payments.openbb.dev" TIMEOUT = 10 diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py index 085f80bd533..b75bf03d1eb 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py @@ -1,3 +1,4 @@ +"""Journal service.""" from typing import Optional from openbb_core.app.repository.abstract.journal_entry_repository import ( @@ -92,12 +93,15 @@ class JournalService: @property def mongodb_client(self) -> Optional[MongoClient]: + """Return mongodb client.""" return self._mongodb_client @property def journal_entry_repository(self) -> AbstractJournalEntryRepository: + """Return journal entry repository.""" return self._journal_entry_repository @property def journal_repository(self) -> AbstractJournalRepository: + """Return journal repository.""" return self._journal_repository diff --git a/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py b/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py new file mode 100644 index 00000000000..a6bab27c696 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py @@ -0,0 +1,164 @@ +"""Test the hub_service.py module.""" + + +from unittest.mock import MagicMock, patch + +import pytest +from openbb_core.app.service.hub_service import ( + Credentials, + HubService, + HubSession, + HubUserSettings, + OpenBBError, +) + + +@pytest.fixture +def mocker(): + """Fixture for mocker.""" + with patch("openbb_core.app.service.hub_service.HubService") as mock: + yield mock + + +def test_connect_with_email_password(): + """Test connect with email and password.""" + mock_hub_session = MagicMock(spec=HubSession) + with patch( + "requests.post", return_value=MagicMock(status_code=200, json=lambda: {}) + ): + with patch.object( + HubService, "get_session_from_email_password", return_value=mock_hub_session + ): + hub_service = HubService() + result = hub_service.connect(email="test@example.com", password="password") + + assert result == mock_hub_session + assert hub_service.session == mock_hub_session + + +def test_connect_with_sdk_token(): + """Test connect with SDK personal access token.""" + mock_hub_session = MagicMock(spec=HubSession) + with patch( + "requests.post", return_value=MagicMock(status_code=200, json=lambda: {}) + ): + with patch.object( + HubService, "get_session_from_sdk_token", return_value=mock_hub_session + ): + hub_service = HubService() + result = hub_service.connect(sdk_token="sdk_token") + + assert result == mock_hub_session + assert hub_service.session == mock_hub_session + + +def test_connect_without_credentials(): + """Test connect without credentials.""" + hub_service = HubService() + with pytest.raises( + OpenBBError, match="Please provide 'email' and 'password' or 'sdk_token'" + ): + hub_service.connect() + + +@patch("requests.post") +def test_get_session_from_email_password(mock_post): + """Test get session from email and password.""" + mock_post.return_value = MagicMock( + status_code=200, + json=lambda: { + "access_token": "token", + "token_type": "Bearer", + "uuid": "uuid", + "email": "email", + "username": "username", + "primary_usage": "primary_usage", + }, + ) + result = HubService.get_session_from_email_password("email", "password") + assert isinstance(result, HubSession) + + +@patch("requests.post") +def test_get_session_from_sdk_token(mock_post): + """Test get session from SDK personal access token.""" + mock_post.return_value = MagicMock( + status_code=200, + json=lambda: { + "access_token": "token", + "token_type": "Bearer", + "uuid": "uuid", + "username": "username", + "email": "email", + "primary_usage": "primary_usage", + }, + ) + result = HubService.get_session_from_sdk_token("token") + assert isinstance(result, HubSession) + + +@patch("requests.get") +def test_disconnect(mock_get): + """Test disconnect.""" + mock_get.return_value = MagicMock(status_code=200, json=lambda: {"success": True}) + mock_hub_session = MagicMock( + spec=HubSession, access_token="token", token_type="Bearer" + ) + hub_service = HubService(session=mock_hub_session) + + assert hub_service.disconnect() is True + assert hub_service.session is None + + +@patch("requests.get") +def test_get_user_settings(mock_get): + """Test get user settings.""" + mock_get.return_value = MagicMock(status_code=200, json=lambda: {}) + mock_hub_session = MagicMock( + spec=HubSession, access_token="token", token_type="Bearer" + ) + + user_settings = HubService.get_user_settings(mock_hub_session) + assert isinstance(user_settings, HubUserSettings) + + +@patch("requests.put") +def test_put_user_settings(mock_put): + """Test put user settings.""" + mock_put.return_value = MagicMock(status_code=200) + mock_hub_session = MagicMock( + spec=HubSession, access_token="token", token_type="Bearer" + ) + mock_user_settings = MagicMock(spec=HubUserSettings) + + assert HubService.put_user_settings(mock_hub_session, mock_user_settings) is True + + +def test_hub2sdk(): + """Test hub2sdk.""" + mock_user_settings = MagicMock(spec=HubUserSettings) + mock_user_settings.features_keys = MagicMock( + API_KEY_FINANCIALMODELINGPREP="fmp", + API_POLYGON_KEY="polygon", + API_FRED_KEY="fred", + ) + + credentials = HubService.hub2sdk(mock_user_settings) + assert isinstance(credentials, Credentials) + assert credentials.fmp_api_key == "fmp" + assert credentials.polygon_api_key == "polygon" + assert credentials.fred_api_key == "fred" + + +def test_sdk2hub(): + """Test sdk2hub.""" + mock_credentials = MagicMock(spec=Credentials) + mock_credentials.fmp_api_key = "fmp" + mock_credentials.polygon_api_key = "polygon" + mock_credentials.fred_api_key = "fred" + + user_settings = HubService.sdk2hub(mock_credentials) + assert isinstance(user_settings, HubUserSettings) + assert user_settings.features_keys.API_KEY_FINANCIALMODELINGPREP == "fmp" + assert user_settings.features_keys.API_POLYGON_KEY == "polygon" + assert user_settings.features_keys.API_FRED_KEY == "fred" diff --git a/openbb_sdk/sdk/core/tests/test_service_journal_service.py b/openbb_sdk/sdk/core/tests/app/service/test_journal_service.py similarity index 97% rename from openbb_sdk/sdk/core/tests/test_service_journal_service.py rename to openbb_sdk/sdk/core/tests/app/service/test_journal_service.py index b22edab68f6..2e735c43d17 100644 --- a/openbb_sdk/sdk/core/tests/test_service_journal_service.py +++ b/openbb_sdk/sdk/core/tests/app/service/test_journal_service.py @@ -1,4 +1,4 @@ -"""Test the ../openbb_core/app/service/journal_service.py module.""" +"""Test the journal_service.py module.""" # pylint: disable=redefined-outer-name from unittest.mock import MagicMock diff --git a/openbb_sdk/sdk/core/tests/test_service_system_service.py b/openbb_sdk/sdk/core/tests/app/service/test_system_service.py similarity index 95% rename from openbb_sdk/sdk/core/tests/test_service_system_service.py rename to openbb_sdk/sdk/core/tests/app/service/test_system_service.py index 79e6c4a0ab2..6b42c18c581 100644 --- a/openbb_sdk/sdk/core/tests/test_service_system_service.py +++ b/openbb_sdk/sdk/core/tests/app/service/test_system_service.py @@ -1,4 +1,4 @@ -"""Test the ../openbb_core/app/service/system_service.py module.""" +"""Test the system_service.py module.""" # pylint: disable=redefined-outer-name import pytest diff --git a/openbb_sdk/sdk/core/tests/test_service_user_service.py b/openbb_sdk/sdk/core/tests/app/service/test_user_service.py similarity index 98% rename from openbb_sdk/sdk/core/tests/test_service_user_service.py rename to openbb_sdk/sdk/core/tests/app/service/test_user_service.py index b8c2d0532d6..11b3ee4ba7f 100644 --- a/openbb_sdk/sdk/core/tests/test_service_user_service.py +++ b/openbb_sdk/sdk/core/tests/app/service/test_user_service.py @@ -1,4 +1,4 @@ -"""Test the ../app/service/user_service.py module.""" +"""Test the user_service.py module.""" from pathlib import Path from unittest.mock import MagicMock diff --git a/openbb_sdk/sdk/core/tests/test_static_app_factory.py b/openbb_sdk/sdk/core/tests/app/static/test_app_factory.py similarity index 100% rename from openbb_sdk/sdk/core/tests/test_static_app_factory.py rename to openbb_sdk/sdk/core/tests/app/static/test_app_factory.py diff --git a/openbb_sdk/sdk/core/tests/test_static_container.py b/openbb_sdk/sdk/core/tests/app/static/test_container.py similarity index 78% rename from openbb_sdk/sdk/core/tests/test_static_container.py rename to openbb_sdk/sdk/core/tests/app/static/test_container.py index 5329647c988..dc1e01b2801 100644 --- a/openbb_sdk/sdk/core/tests/test_static_container.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_container.py @@ -1,4 +1,4 @@ -"""Test the app/static/container.py file.""" +"""Test the container.py file.""" from openbb_core.app.static.container import Container diff --git a/openbb_sdk/sdk/core/tests/test_static_coverage.py b/openbb_sdk/sdk/core/tests/app/static/test_coverage.py similarity index 93% rename from openbb_sdk/sdk/core/tests/test_static_coverage.py rename to openbb_sdk/sdk/core/tests/app/static/test_coverage.py index 123751e31a9..2131d24cefb 100644 --- a/openbb_sdk/sdk/core/tests/test_static_coverage.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_coverage.py @@ -1,4 +1,4 @@ -"""Test the app/static/coverage.py file.""" +"""Test the coverage.py file.""" # pylint: disable=redefined-outer-name import pytest diff --git a/openbb_sdk/sdk/core/tests/test_static_filters.py b/openbb_sdk/sdk/core/tests/app/static/test_filters.py similarity index 95% rename from openbb_sdk/sdk/core/tests/test_static_filters.py rename to openbb_sdk/sdk/core/tests/app/static/test_filters.py index 642244e8f08..5b014933991 100644 --- a/openbb_sdk/sdk/core/tests/test_static_filters.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_filters.py @@ -1,4 +1,4 @@ -"""Test the app/static/filters.py file.""" +"""Test the filters.py file.""" import pytest from openbb_core.app.model.command_output import CommandOutput diff --git a/openbb_sdk/sdk/core/tests/test_static_package_builder.py b/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py similarity index 99% rename from openbb_sdk/sdk/core/tests/test_static_package_builder.py rename to openbb_sdk/sdk/core/tests/app/static/test_package_builder.py index 7e075d011e2..e922fa1cf3a 100644 --- a/openbb_sdk/sdk/core/tests/test_static_package_builder.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py @@ -1,4 +1,4 @@ -"""Test the app/static/package_builder.py file.""" +"""Test the package_builder.py file.""" # pylint: disable=redefined-outer-name from dataclasses import dataclass From a3c6cf9807132e4491275594872c6d19221fd338 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 15:30:59 +0200 Subject: [PATCH 27/62] API dependency tests --- .../core/openbb_core/api/dependency/system.py | 3 + .../openbb_core/api/model/access_token.py | 5 +- .../openbb_core/api/model/token_response.py | 3 + .../core/tests/api/dependency/test_system.py | 34 ++++++++ .../core/tests/api/dependency/test_user.py | 80 +++++++++++++++++++ .../sdk/core/tests/api/router/test_system.py | 0 6 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 openbb_sdk/sdk/core/tests/api/dependency/test_system.py create mode 100644 openbb_sdk/sdk/core/tests/api/dependency/test_user.py create mode 100644 openbb_sdk/sdk/core/tests/api/router/test_system.py diff --git a/openbb_sdk/sdk/core/openbb_core/api/dependency/system.py b/openbb_sdk/sdk/core/openbb_core/api/dependency/system.py index b908e3ba490..4ccc1c5e0b4 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/dependency/system.py +++ b/openbb_sdk/sdk/core/openbb_core/api/dependency/system.py @@ -1,3 +1,4 @@ +"""System dependency.""" from copy import deepcopy from openbb_core.app.model.system_settings import SystemSettings @@ -7,10 +8,12 @@ __system_service = SystemService() async def get_system_settings() -> SystemSettings: + """Get system settings.""" global __system_service # noqa: PLW0602 # pylint: disable=global-variable-not-assigned return deepcopy(__system_service.system_settings) async def get_system_service() -> SystemService: + """Get system service.""" global __system_service # noqa: PLW0602 # pylint: disable=global-variable-not-assigned return __system_service diff --git a/openbb_sdk/sdk/core/openbb_core/api/model/access_token.py b/openbb_sdk/sdk/core/openbb_core/api/model/access_token.py index 3fe5988507d..c21d92b5951 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/model/access_token.py +++ b/openbb_sdk/sdk/core/openbb_core/api/model/access_token.py @@ -1,3 +1,4 @@ +"""Access Token Model.""" from datetime import datetime from openbb_core.app.model.abstract.tagged import Tagged @@ -5,10 +6,12 @@ from pydantic import Field class AccessToken(Tagged): - """This will be turn into a JWT Token""" + """Turn into a JWT Token.""" sub: str = Field(description="Subject of the token, here : `UserSettings.id`") exp: datetime = Field(description="Expiration datetime of the `access_token`.") class Config: + """Pydantic Config.""" + validate_assignment = True diff --git a/openbb_sdk/sdk/core/openbb_core/api/model/token_response.py b/openbb_sdk/sdk/core/openbb_core/api/model/token_response.py index a67d7fd087c..d3980f13d81 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/model/token_response.py +++ b/openbb_sdk/sdk/core/openbb_core/api/model/token_response.py @@ -1,6 +1,9 @@ +"""Token response model.""" from pydantic import BaseModel class TokenResponse(BaseModel): + """Token response model.""" + access_token: str token_type: str diff --git a/openbb_sdk/sdk/core/tests/api/dependency/test_system.py b/openbb_sdk/sdk/core/tests/api/dependency/test_system.py new file mode 100644 index 00000000000..11e08d06838 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/dependency/test_system.py @@ -0,0 +1,34 @@ +"""Test the system module.""" +import asyncio +from unittest.mock import MagicMock, patch + +from openbb_core.api.dependency.system import ( + SystemSettings, + get_system_service, + get_system_settings, +) + + +@patch("openbb_core.api.dependency.system.SystemService") +def test_get_system_settings(mock_system_service): + """Test get_system_settings.""" + mock_system_settings = MagicMock(spec=SystemSettings) + mock_system_service.system_settings = mock_system_settings + + with patch( + "openbb_core.api.dependency.system.__system_service", new=mock_system_service + ): + system_settings = asyncio.run(get_system_settings()) + + assert system_settings == mock_system_settings + + +@patch("openbb_core.api.dependency.system.SystemService") +def test_get_system_service(mock_system_service): + """Test get_system_service.""" + with patch( + "openbb_core.api.dependency.system.__system_service", new=mock_system_service + ): + system_service = asyncio.run(get_system_service()) + + assert system_service == mock_system_service diff --git a/openbb_sdk/sdk/core/tests/api/dependency/test_user.py b/openbb_sdk/sdk/core/tests/api/dependency/test_user.py new file mode 100644 index 00000000000..091e0d4f07d --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/dependency/test_user.py @@ -0,0 +1,80 @@ +"""Test the user module.""" +import asyncio +from unittest.mock import MagicMock, patch + +from openbb_core.api.dependency.user import ( + AccessToken, + SystemSettings, + UserSettings, + authenticate_user, + create_access_token, + create_jwt_token, + get_password_hash, + get_user, + get_user_service, + verify_password, +) + + +def test_password_functions(): + """Test password functions.""" + password = "my_password" + hashed_password = get_password_hash(password) + assert verify_password(password, hashed_password) + + +@patch("openbb_core.api.dependency.user.UserService") +def test_authenticate_user(mock_user_service): + """Test authenticate_user.""" + mock_user_settings = MagicMock( + spec=UserSettings, profile=MagicMock(password_hash="hashed_password") + ) + mock_user_service.user_settings_repository.read_by_profile.return_value = ( + mock_user_settings + ) + with patch("openbb_core.api.dependency.user.verify_password", return_value=True): + result = authenticate_user("password", "username", mock_user_service) + + assert result == mock_user_settings + + +def test_create_access_token(): + """Test create_access_token.""" + sub = "subject" + access_token = create_access_token(sub) + + assert isinstance(access_token, AccessToken) + assert access_token.sub == sub + + +def test_create_jwt_token(): + """Test create_jwt_token.""" + mock_access_token = MagicMock( + spec=AccessToken, dict=lambda: {"sub": "subject", "exp": 12345} + ) + jwt_token = create_jwt_token(mock_access_token) + + assert isinstance(jwt_token, str) + + +@patch("openbb_core.api.dependency.user.UserService") +def test_get_user_service(mock_user_service): + """Test get_user_service.""" + mock_system_settings = MagicMock(spec=SystemSettings, dbms_uri=None) + with patch("openbb_core.api.dependency.user.__user_service", new=None): + asyncio.run(get_user_service(mock_system_settings)) + + mock_user_service.assert_called_once_with() + + +@patch("openbb_core.api.dependency.user.jwt.decode") +@patch("openbb_core.api.dependency.user.UserService") +def test_get_user(mock_user_service, mock_decode): + """Test get_user.""" + mock_decode.return_value = {"sub": "user_id"} + mock_user_settings = MagicMock(spec=UserSettings, profile=MagicMock(active=True)) + mock_user_service.user_settings_repository.read.return_value = mock_user_settings + with patch("openbb_core.api.dependency.user.__user_service", new=mock_user_service): + result = asyncio.run(get_user("jwt_token", mock_user_service)) + + assert result == mock_user_settings diff --git a/openbb_sdk/sdk/core/tests/api/router/test_system.py b/openbb_sdk/sdk/core/tests/api/router/test_system.py new file mode 100644 index 00000000000..e69de29bb2d From 2db1ce548404c5e31455dca1f526415522f6c375 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 15:32:24 +0200 Subject: [PATCH 28/62] Docstring improve --- openbb_sdk/sdk/core/openbb_core/api/dependency/user.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openbb_sdk/sdk/core/openbb_core/api/dependency/user.py b/openbb_sdk/sdk/core/openbb_core/api/dependency/user.py index ffdd8c4337a..9e0eb932f76 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/dependency/user.py +++ b/openbb_sdk/sdk/core/openbb_core/api/dependency/user.py @@ -1,3 +1,4 @@ +"""User dependency.""" from datetime import datetime, timedelta from typing import Annotated, Optional @@ -22,10 +23,12 @@ pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") def verify_password(plain_password, hashed_password): + """Verify password.""" return pwd_context.verify(plain_password, hashed_password) def get_password_hash(password): + """Get password hash.""" return pwd_context.hash(password) @@ -34,6 +37,7 @@ def authenticate_user( username: str, user_service: UserService, ) -> Optional[UserSettings]: + """Authenticate user.""" user = user_service.user_settings_repository.read_by_profile( filter_list=[("username", username)], ) @@ -52,6 +56,7 @@ def create_access_token( sub: str, expiration_delta: Optional[timedelta] = None, ) -> AccessToken: + """Create access token.""" if expiration_delta is None: expiration_delta = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) @@ -67,6 +72,7 @@ def create_jwt_token( key=SECRET_KEY, algorithm=ALGORITHM, ) -> str: + """Create JWT token.""" claims = access_token.dict() encoded_jwt = jwt.encode(claims=claims, key=key, algorithm=algorithm) return encoded_jwt @@ -75,6 +81,7 @@ def create_jwt_token( async def get_user_service( system_settings: Annotated[SystemSettings, Depends(get_system_settings)] ) -> UserService: + """Get user service.""" global __user_service # pylint: disable=global-statement if __user_service is None: @@ -92,6 +99,7 @@ async def get_user( jwt_token: Annotated[str, Depends(oauth2_scheme)], user_service: Annotated[UserService, Depends(get_user_service)], ): + """Get user.""" credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", From 4f86b6c8f8a65ae47ddd5865c12b5f69cf494247 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 16:17:50 +0200 Subject: [PATCH 29/62] Edits --- openbb_sdk/sdk/core/openbb_core/api/router/system.py | 2 ++ openbb_sdk/sdk/core/tests/api/router/test_system.py | 0 2 files changed, 2 insertions(+) delete mode 100644 openbb_sdk/sdk/core/tests/api/router/test_system.py diff --git a/openbb_sdk/sdk/core/openbb_core/api/router/system.py b/openbb_sdk/sdk/core/openbb_core/api/router/system.py index 8a9c8e834e6..17e8f0a9d4a 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/router/system.py +++ b/openbb_sdk/sdk/core/openbb_core/api/router/system.py @@ -1,3 +1,4 @@ +"""System router.""" from typing import Annotated from fastapi import APIRouter, Depends @@ -11,4 +12,5 @@ router = APIRouter(prefix="/system", tags=["System"]) async def get_system_model( system_settings: Annotated[SystemSettings, Depends(get_system_settings)], ) -> SystemSettings: + """Get system model.""" return system_settings diff --git a/openbb_sdk/sdk/core/tests/api/router/test_system.py b/openbb_sdk/sdk/core/tests/api/router/test_system.py deleted file mode 100644 index e69de29bb2d..00000000000 From a7e1d2bc1fd56cbe9be08c1aedfb503ba9b27613 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Fri, 28 Jul 2023 12:02:15 +0200 Subject: [PATCH 30/62] Test router coverage, system, and settings. --- .../core/openbb_core/api/router/coverage.py | 2 ++ .../core/openbb_core/api/router/settings.py | 8 ++--- .../core/tests/api/router/test_coverage.py | 29 ++++++++++++++++ .../core/tests/api/router/test_settings.py | 33 +++++++++++++++++++ .../sdk/core/tests/api/router/test_system.py | 18 ++++++++++ 5 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/api/router/test_coverage.py create mode 100644 openbb_sdk/sdk/core/tests/api/router/test_settings.py create mode 100644 openbb_sdk/sdk/core/tests/api/router/test_system.py diff --git a/openbb_sdk/sdk/core/openbb_core/api/router/coverage.py b/openbb_sdk/sdk/core/openbb_core/api/router/coverage.py index 4b3af70b484..9075a370646 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/router/coverage.py +++ b/openbb_sdk/sdk/core/openbb_core/api/router/coverage.py @@ -8,9 +8,11 @@ router = APIRouter(prefix="/coverage", tags=["Coverage"]) @router.get("/providers") async def get_provider_coverage() -> Dict[str, List[str]]: + """Get provider coverage.""" return CommandMap().provider_coverage @router.get("/commands") async def get_command_coverage() -> Dict[str, List[str]]: + """Get command coverage.""" return CommandMap().command_coverage diff --git a/openbb_sdk/sdk/core/openbb_core/api/router/settings.py b/openbb_sdk/sdk/core/openbb_core/api/router/settings.py index c47f7436b20..c3afa864c5c 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/router/settings.py +++ b/openbb_sdk/sdk/core/openbb_core/api/router/settings.py @@ -1,11 +1,7 @@ from typing import Annotated from fastapi import APIRouter, Depends -from openbb_core.api.dependency.user import ( - UserService, - get_user, - get_user_service, -) +from openbb_core.api.dependency.user import UserService, get_user, get_user_service from openbb_core.app.model.credentials import Credentials from openbb_core.app.model.user_settings import UserSettings @@ -16,6 +12,7 @@ router = APIRouter(prefix="/settings", tags=["Settings"]) async def read_users_settings( user_settings: Annotated[UserSettings, Depends(get_user)], ) -> UserSettings: + """Read users settings.""" return user_settings @@ -25,6 +22,7 @@ async def patch_user_credentials( user_settings: Annotated[UserSettings, Depends(get_user)], user_service: Annotated[UserService, Depends(get_user_service)], ) -> UserSettings: + """Patch user credentials.""" current = user_settings.credentials.dict() incoming = credentials.dict(exclude_none=True) current.update(incoming) diff --git a/openbb_sdk/sdk/core/tests/api/router/test_coverage.py b/openbb_sdk/sdk/core/tests/api/router/test_coverage.py new file mode 100644 index 00000000000..38738080b20 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/router/test_coverage.py @@ -0,0 +1,29 @@ +"""Test coverage for the router module.""" + + +from unittest.mock import patch + +from openbb_core.api.router.coverage import get_command_coverage, get_provider_coverage + + +@patch("openbb_core.api.router.coverage.CommandMap") +def test_get_provider_coverage(mock_command_map): + """Test get provider coverage.""" + mock_command_map.return_value.provider_coverage = { + "provider1": ["coverage1", "coverage2"] + } + + response = get_provider_coverage() + + assert response + + +@patch("openbb_core.api.router.coverage.CommandMap") +def test_get_command_coverage(mock_command_map): + """Test get command coverage.""" + mock_command_map.return_value.command_coverage = { + "command1": ["coverage1", "coverage2"] + } + + response = get_command_coverage() + assert response diff --git a/openbb_sdk/sdk/core/tests/api/router/test_settings.py b/openbb_sdk/sdk/core/tests/api/router/test_settings.py new file mode 100644 index 00000000000..f7d48b8b21f --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/router/test_settings.py @@ -0,0 +1,33 @@ +"""Test the router settings.py module.""" +import asyncio +from unittest.mock import Mock + +from openbb_core.api.router.settings import patch_user_credentials, read_users_settings +from openbb_core.app.model.credentials import Credentials +from openbb_core.app.model.user_settings import UserSettings + + +def test_read_users_settings(): + """Test read users settings.""" + mock_user_settings = Mock() + + result = asyncio.run(read_users_settings(user_settings=mock_user_settings)) + + assert result == mock_user_settings + + +def test_patch_user_credentials(): + """Test patch user credentials.""" + credentials = Credentials(username="testuser", password="testpass") + user_settings = UserSettings(credentials=credentials) + + mock_user_service = Mock() + + result = asyncio.run( + patch_user_credentials(credentials, user_settings, mock_user_service) + ) + + assert result == user_settings + mock_user_service.user_settings_repository.update.assert_called_once_with( + user_settings + ) diff --git a/openbb_sdk/sdk/core/tests/api/router/test_system.py b/openbb_sdk/sdk/core/tests/api/router/test_system.py new file mode 100644 index 00000000000..1f916f70ab2 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/router/test_system.py @@ -0,0 +1,18 @@ +"""Test the router system module.""" + +import asyncio +from unittest.mock import Mock, patch + +from openbb_core.api.router.system import get_system_model +from openbb_core.app.model.system_settings import SystemSettings + + +@patch("openbb_core.api.router.system.get_system_settings") +def test_get_system_model(mock_get_system_settings): + """Test get system model.""" + mock_system_settings = Mock(spec=SystemSettings) + mock_get_system_settings.return_value = mock_system_settings + + response = asyncio.run(get_system_model(system_settings=mock_system_settings)) + + assert response == mock_system_settings From 12aee25d9a8bb88e2e7dd0612cc5b00d30cabed7 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 10:32:16 -0400 Subject: [PATCH 31/62] First action --- .github/workflows/sdkv4-core.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/sdkv4-core.yml diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml new file mode 100644 index 00000000000..1a30af2de5f --- /dev/null +++ b/.github/workflows/sdkv4-core.yml @@ -0,0 +1,25 @@ +name: My Workflow + +on: + pull_request: + branches: + - feature/openbb-sdk-v4 + + +jobs: + unit_tests: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.ref }} + - name: Install dependencies + run: | + python -m venv .venv + source .venv/bin/activate + pip install ./openbb_sdk + pip install pytest + - name: Run tests + run: | + pytest openbb_sdk/sdk/core/tests From 37aabe14a87f266177f5f84618134874e3edf0ca Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 10:42:46 -0400 Subject: [PATCH 32/62] Fix syntax --- .github/workflows/sdkv4-core.yml | 35 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 1a30af2de5f..1c18f5f89ca 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -1,25 +1,24 @@ -name: My Workflow +name: Test SDKV4 on: pull_request: branches: - feature/openbb-sdk-v4 - jobs: - unit_tests: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - ref: ${{ github.event.pull_request.head.ref }} - - name: Install dependencies - run: | - python -m venv .venv - source .venv/bin/activate - pip install ./openbb_sdk - pip install pytest - - name: Run tests - run: | - pytest openbb_sdk/sdk/core/tests + unit_tests: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.ref }} + - name: Install dependencies + run: | + python -m venv .venv + source .venv/bin/activate + pip install ./openbb_sdk + pip install pytest + - name: Run tests + run: | + pytest openbb_sdk/sdk/core/tests From b398959ea7cff3f72d511a7ec878d7c083779b2b Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 10:51:10 -0400 Subject: [PATCH 33/62] didnt activate venv --- .github/workflows/sdkv4-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 1c18f5f89ca..b66e2deee82 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -21,4 +21,5 @@ jobs: pip install pytest - name: Run tests run: | + source .venv/bin/activate pytest openbb_sdk/sdk/core/tests From 54e80b09427da56c40c3b5ac474ed5304ab63ac0 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:04:51 -0400 Subject: [PATCH 34/62] init file --- openbb_sdk/sdk/core/tests/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/__init__.py diff --git a/openbb_sdk/sdk/core/tests/__init__.py b/openbb_sdk/sdk/core/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d From 631308bc9bba5c81e39ea28a562ab02dcab0c09c Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Fri, 28 Jul 2023 17:15:21 +0200 Subject: [PATCH 35/62] Rename test files --- .../api/router/{test_coverage.py => test_router_coverage.py} | 0 .../tests/api/router/{test_system.py => test_router_system.py} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename openbb_sdk/sdk/core/tests/api/router/{test_coverage.py => test_router_coverage.py} (100%) rename openbb_sdk/sdk/core/tests/api/router/{test_system.py => test_router_system.py} (100%) diff --git a/openbb_sdk/sdk/core/tests/api/router/test_coverage.py b/openbb_sdk/sdk/core/tests/api/router/test_router_coverage.py similarity index 100% rename from openbb_sdk/sdk/core/tests/api/router/test_coverage.py rename to openbb_sdk/sdk/core/tests/api/router/test_router_coverage.py diff --git a/openbb_sdk/sdk/core/tests/api/router/test_system.py b/openbb_sdk/sdk/core/tests/api/router/test_router_system.py similarity index 100% rename from openbb_sdk/sdk/core/tests/api/router/test_system.py rename to openbb_sdk/sdk/core/tests/api/router/test_router_system.py From 74b1d0f038218fb950e960d7d5b867058eb5e4dc Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:30:44 -0400 Subject: [PATCH 36/62] Change how action runs tests --- .github/workflows/sdkv4-core.yml | 5 ++--- noxfile.py | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 noxfile.py diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index b66e2deee82..8e85ccea50a 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -17,9 +17,8 @@ jobs: run: | python -m venv .venv source .venv/bin/activate - pip install ./openbb_sdk - pip install pytest + pip install nox - name: Run tests run: | source .venv/bin/activate - pytest openbb_sdk/sdk/core/tests + nox -s tests diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 00000000000..9f92d0e0f6e --- /dev/null +++ b/noxfile.py @@ -0,0 +1,8 @@ +import nox + + +@nox.session(python=["3.8", "3.9", "3.10", "3.11"]) +def tests(session): + session.install("./openbb_sdk") + session.install("pytest") + session.run("pytest", "openbb_sdk/sdk/core/tests") From f76cb10c8b113d5b8953bcb0bc7ce3b01306f6f4 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:51:18 -0400 Subject: [PATCH 37/62] update --- .github/workflows/sdkv4-core.yml | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 8e85ccea50a..c4e1e44a632 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -5,20 +5,29 @@ on: branches: - feature/openbb-sdk-v4 +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + jobs: unit_tests: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python_version: + ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} - - name: Install dependencies - run: | - python -m venv .venv - source .venv/bin/activate - pip install nox + - name: Install Python ${{ matrix.python_version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + cache: "pip" + - name: Run tests run: | - source .venv/bin/activate - nox -s tests + nox -s tests --python ${{ matrix.python_version }} From ea19fb1408f96172ace806fcb9acba3017fb8759 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:53:07 -0400 Subject: [PATCH 38/62] missed import --- .github/workflows/sdkv4-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index c4e1e44a632..3742497149d 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -30,4 +30,5 @@ jobs: - name: Run tests run: | + pip install nox nox -s tests --python ${{ matrix.python_version }} From 399b342a8e294bc806e447b684377e526a43ce21 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:54:15 -0400 Subject: [PATCH 39/62] cache --- .github/workflows/sdkv4-core.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 3742497149d..93b969738bc 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -26,7 +26,6 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python_version }} - cache: "pip" - name: Run tests run: | From 60255c054a7106b6787b88924b14e0c847494140 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:01:11 -0400 Subject: [PATCH 40/62] fix 3.12 --- .github/workflows/sdkv4-core.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 93b969738bc..018d76f32ea 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -26,6 +26,8 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python_version }} + allow-pre-releases: true + cache: "pip" - name: Run tests run: | From cc19511eb1b574af803dafcfd5ff84d0c5fd6d2d Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:02:32 -0400 Subject: [PATCH 41/62] wrong ar --- .github/workflows/sdkv4-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 018d76f32ea..6fc3e603b16 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -26,7 +26,7 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python_version }} - allow-pre-releases: true + allow-prereleases: true cache: "pip" - name: Run tests From ecf9e58e083930dd0f85a3bd03aa194b293807fc Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:04:12 -0400 Subject: [PATCH 42/62] update version --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 9f92d0e0f6e..6f2fffcfc44 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,7 +1,7 @@ import nox -@nox.session(python=["3.8", "3.9", "3.10", "3.11"]) +@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"]) def tests(session): session.install("./openbb_sdk") session.install("pytest") From 2fe81e03d84274a9cc748030370c72b79c78993b Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:08:02 -0400 Subject: [PATCH 43/62] <= 3.12 --- openbb_sdk/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbb_sdk/pyproject.toml b/openbb_sdk/pyproject.toml index 15f9bdd8616..2eb2f4393ac 100644 --- a/openbb_sdk/pyproject.toml +++ b/openbb_sdk/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" packages = [{ include = "openbb" }] [tool.poetry.dependencies] -python = ">=3.8,<3.12" +python = ">=3.8,<=3.12" openbb-provider = { path = "./sdk/provider" } openbb-core = { path = "./sdk/core" } openbb-stocks = { path = "./extensions/stocks" } From 088c9a324c73a357a0339f3a6cbcac10b85cec35 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:34:39 -0400 Subject: [PATCH 44/62] Pandas doesnt work with 3.12 yet --- .github/workflows/sdkv4-core.yml | 2 +- noxfile.py | 2 +- openbb_sdk/pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 6fc3e603b16..31cfb32bde2 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -16,7 +16,7 @@ jobs: fail-fast: false matrix: python_version: - ["3.8", "3.9", "3.10", "3.11", "3.12"] + ["3.8", "3.9", "3.10", "3.11"] steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/noxfile.py b/noxfile.py index 6f2fffcfc44..9f92d0e0f6e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,7 +1,7 @@ import nox -@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"]) +@nox.session(python=["3.8", "3.9", "3.10", "3.11"]) def tests(session): session.install("./openbb_sdk") session.install("pytest") diff --git a/openbb_sdk/pyproject.toml b/openbb_sdk/pyproject.toml index 2eb2f4393ac..15f9bdd8616 100644 --- a/openbb_sdk/pyproject.toml +++ b/openbb_sdk/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" packages = [{ include = "openbb" }] [tool.poetry.dependencies] -python = ">=3.8,<=3.12" +python = ">=3.8,<3.12" openbb-provider = { path = "./sdk/provider" } openbb-core = { path = "./sdk/core" } openbb-stocks = { path = "./extensions/stocks" } From cfb3045fe9dc0f295d35f89c3165e64d079299c0 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:02:27 +0200 Subject: [PATCH 45/62] Add mock JWT token --- .../sdk/core/tests/app/service/test_hub_service.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py b/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py index a6bab27c696..ff3ff68ed1e 100644 --- a/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py +++ b/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py @@ -93,7 +93,17 @@ def test_get_session_from_sdk_token(mock_post): "primary_usage": "primary_usage", }, ) - result = HubService.get_session_from_sdk_token("token") + + mock_token = ( + "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6ImRiMjEyZDdhZj" + "c2MWI0ZTNlOGNjZGM3OWQ5Zjk4YWM5In0.eyJhY2Nlc3NfdG9rZW4iOiJ0" + "b2tlbiIsInRva2VuX3R5cGUiOiJCZWFyZXIiLCJ1dWlkIjoidXVpZCIsInV" + "zZXJuYW1lIjoidXNlcm5hbWUiLCJlbWFpbCI6ImVtYWlsIiwicHJpbWFyeV9" + "1c2FnZSI6InByaW1hcnlfdXNhZ2UifQ.FAtE8-a1a-313Zoa6dREIxGZOHaW9" + "-JLZnFzyJ6dlHBZnkjQT2tfaaefxnTdAlSmToQwxGykvuatmI7L0wztPQ" + ) + + result = HubService.get_session_from_sdk_token(mock_token) assert isinstance(result, HubSession) From 59b19b3c2326b169344921be7d4d13abb7cc52bb Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Mon, 31 Jul 2023 14:54:20 +0100 Subject: [PATCH 46/62] adding tests for logs --- .../formatters/formatter_with_exceptions.py | 4 +- .../app/logs/utils/expired_files.py | 4 +- .../test_formatter_with_exceptions.py | 305 +++++++++++++++++- .../test_path_tracking_file_handler.py | 64 ++++ .../app/logs/handlers/test_posthog_handler.py | 225 +++++++++++++ .../app/logs/utils/test_expired_files.py | 145 ++++++++- 6 files changed, 741 insertions(+), 6 deletions(-) diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py b/openbb_sdk/sdk/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py index 2cd52fd4125..c67bf2ae7e6 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py @@ -82,8 +82,8 @@ class FormatterWithExceptions(logging.Formatter): return text_mocked - @classmethod - def filter_special_tags(cls, text: str) -> str: + @staticmethod + def filter_special_tags(text: str) -> str: text_filtered = text.replace("\n", " MOCKING_BREAKLINE ") text_filtered = text_filtered.replace("'Traceback", "Traceback") diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/utils/expired_files.py b/openbb_sdk/sdk/core/openbb_core/app/logs/utils/expired_files.py index 0e4bcb0c523..4f101d23db8 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/utils/expired_files.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/utils/expired_files.py @@ -15,8 +15,8 @@ def get_timestamp_from_x_days(x: int) -> float: def get_expired_file_list(directory: Path, before_timestamp: float) -> List[Path]: - expired_files = list() - if directory.exists and directory.is_dir(): # type: ignore + expired_files = [] + if directory.is_dir(): # Check if the directory exists and is a directory for file in directory.iterdir(): if file.is_file() and file.lstat().st_mtime < before_timestamp: expired_files.append(file) diff --git a/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py b/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py index f67e3151da9..613d8e521aa 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py +++ b/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py @@ -1,5 +1,308 @@ -import pytest +import logging +import os +from unittest.mock import Mock +import pytest from openbb_core.app.logs.formatters.formatter_with_exceptions import ( FormatterWithExceptions, ) + +logging_settings = Mock() +logging_settings.app_name = "test_app_name" +logging_settings.app_id = "test_app_id" +logging_settings.session_id = "test_session_id" +logging_settings.commit_hash = "test_commit_hash" +logging_settings.user_id = "test_user_id" + + +@pytest.fixture +def formatter(): + return FormatterWithExceptions(logging_settings) + + +# Test when exc_text is not empty (should return "X") +def test_level_name_with_exc_text(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.exc_text = "Exception occurred!" + assert formatter.calculate_level_name(record) == "X" + + +# Test when levelname is not empty (should return the first character of levelname) +def test_level_name_with_levelname(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.WARNING, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.levelname = "WARNING" + assert formatter.calculate_level_name(record) == "W" + + +# Test when func_name_override and session_id are present in the record +def test_extract_log_extra_with_override_and_session_id(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.func_name_override = "custom_function" + record.session_id = "1234567890" + + log_extra = formatter.extract_log_extra(record) + + assert log_extra == { + "sessionId": "1234567890", + } + + +# Test when only func_name_override is present in the record +def test_extract_log_extra_with_override(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.func_name_override = "custom_function" + + log_extra = formatter.extract_log_extra(record) + + assert log_extra == {} + assert record.funcName == "custom_function" + assert record.lineno == 0 + + +# Test when only session_id is present in the record +def test_extract_log_extra_with_session_id(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.session_id = "1234567890" + + log_extra = formatter.extract_log_extra(record) + + assert log_extra == { + "sessionId": "1234567890", + } + + +# Test when neither func_name_override nor session_id are present in the record +def test_extract_log_extra_with_no_override_or_session_id(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + + log_extra = formatter.extract_log_extra(record) + + assert log_extra == {} + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ("Hello, this is 192.168.1.1", "Hello, this is FILTERED_IP "), + ("IP address: 10.0.0.1", "IP address: FILTERED_IP "), + ("No IPs here!", "No IPs here!"), + ("Another IP: 172.16.32.1", "Another IP: FILTERED_IP "), + ("1.2.3.4", " FILTERED_IP "), + ], +) +def test_mock_ipv4(input_text, expected_output, formatter): + assert formatter.mock_ipv4(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ("Send an email to john@example.com", "Send an email to FILTERED_EMAIL "), + ("No emails here!", "No emails here!"), + ("Another email: alice@example.co.uk", "Another email: FILTERED_EMAIL "), + ("Contact us: support@example.net", "Contact us: FILTERED_EMAIL "), + ("myemail@example.com 12345", " FILTERED_EMAIL 12345"), + ], +) +def test_mock_email(input_text, expected_output, formatter): + assert formatter.mock_email(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ('{"password": "secure_pass_123"}', '{"password": " FILTERED_PASSWORD "}'), + ('{"password": "p@$$w0rd!"}', '{"password": " FILTERED_PASSWORD "}'), + ('{"password": "12345"}', '{"password": " FILTERED_PASSWORD "}'), + ('{"password": "abc"}', '{"password": " FILTERED_PASSWORD "}'), + ( + '{"password": "my_password"} {"password": "test123"}', + '{"password": " FILTERED_PASSWORD "} {"password": " FILTERED_PASSWORD "}', + ), + ], +) +def test_mock_password(input_text, expected_output, formatter): + assert formatter.mock_password(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ('{"FLAIR": "[python]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[question]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[bug]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[feature]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[announcement]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[FILTERED_FLAIR]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ], +) +def test_mock_flair(input_text, expected_output, formatter): + assert formatter.mock_flair(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + "This is C:\\Users\\username\\file.txt", + "This is C:\\Users\\username\\file.txt", + ), + ("No home directory here!", "No home directory here!"), + ( + f"This is {os.path.expanduser('~')}\\file.txt", + "This is MOCKING_USER_PATH\\file.txt", + ), + ( + f"Some path: {os.path.expanduser('~/subfolder')}", + "Some path: MOCKING_USER_PATH/subfolder", + ), + ], +) +def test_mock_home_directory(input_text, expected_output, formatter): + assert formatter.mock_home_directory(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + "This is a string with a\nnewline", + "This is a string with a MOCKING_BREAKLINE newline", + ), + ("'Traceback occurred", "Traceback occurred"), + ("No newlines or 'Traceback'", "No newlines or Traceback'"), + ("'Traceback in the\nmiddle'", "Traceback in the MOCKING_BREAKLINE middle'"), + ( + "Multiple\n\nnewlines", + "Multiple MOCKING_BREAKLINE MOCKING_BREAKLINE newlines", + ), + ], +) +def test_filter_special_tags(input_text, expected_output, formatter): + assert formatter.filter_special_tags(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + f"This is {os.path.expanduser('~')}\\file.txt", + "This is MOCKING_USER_PATH\\file.txt", + ), + ('{"FLAIR": "[announcement]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ("Another email: alice@example.co.uk", "Another email: FILTERED_EMAIL "), + ("Another IP: 172.16.32.1", "Another IP: FILTERED_IP "), + ('{"password": "secure_pass_123"}', '{"password": " FILTERED_PASSWORD "}'), + ], +) +def test_filter_piis(input_text, expected_output, formatter): + assert formatter.filter_piis(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + f"This is {os.path.expanduser('~')}\\file.txt", + "This is MOCKING_USER_PATH\\file.txt", + ), + ('{"FLAIR": "[announcement]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ("Another email: alice@example.co.uk", "Another email: FILTERED_EMAIL "), + ("Another IP: 172.16.32.1", "Another IP: FILTERED_IP "), + ('{"password": "secure_pass_123"}', '{"password": " FILTERED_PASSWORD "}'), + ("'Traceback in the\nmiddle'", "Traceback in the MOCKING_BREAKLINE middle'"), + ], +) +def test_filter_log_line(input_text, expected_output, formatter): + assert formatter.filter_log_line(input_text) == expected_output + + +def test_formatException_invalid(): + with pytest.raises(Exception): + formatter.formatException(Exception("Big bad error")) + + +def test_format(formatter): + # Prepare the log record + log_record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="/path/to/module.py", + lineno=42, + msg="This is a test log message with | symbol", + args=(), + exc_info=None, + ) + + # Set up the mock objects + formatter.calculate_level_name = Mock(return_value="INFO") + formatter.filter_log_line = Mock(return_value="Filtered log message") + + # Call the format method + formatted_log = formatter.format(log_record) + + # Assertions + expected_log = "INFO|test_app_name|test_commit_hash|test_app_id|test_session_id|test_user_id|Filtered log message" + + print(expected_log) + print(formatted_log) + + assert formatted_log == expected_log + + # Check if the mock methods were called + formatter.calculate_level_name.assert_called_once() + formatter.filter_log_line.assert_called_once() diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py index e69de29bb2d..ea53d2e3dd5 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py +++ b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py @@ -0,0 +1,64 @@ +from pathlib import Path +from unittest.mock import MagicMock, patch + +import pytest +from openbb_core.app.logs.handlers.path_tracking_file_handler import ( + PathTrackingFileHandler, +) + + +class MockLoggingSettings: + def __init__(self, app_name, user_logs_directory, session_id, frequency): + self.app_name = app_name + self.user_logs_directory = Path(user_logs_directory) + self.session_id = session_id + self.frequency = frequency + + +logging_settings = MagicMock(spec=MockLoggingSettings) +logging_settings.app_name = "test_app_name_xpto" +logging_settings.user_logs_directory = MagicMock() +logging_settings.user_logs_directory.absolute.return_value = Path( + "/mocked/logs/directory" +) +logging_settings.session_id = "test_session_id" +logging_settings.frequency = "H" + + +@pytest.fixture +def handler(): + # patch `pathlib.Path.joinpath` to return a string containing the joined path + with patch.object(Path, "joinpath", return_value=Path("mocked_path")): + return PathTrackingFileHandler(logging_settings) + + +def test_build_log_file_path(handler): + # Define a sample LoggingSettings object with mock attributes + settings = MagicMock(spec=MockLoggingSettings) + settings.app_name = "my_app" + settings.user_logs_directory = MagicMock() + settings.user_logs_directory.absolute.return_value = Path("/mocked/logs/directory") + settings.session_id = "abc123" + + # patch `pathlib.Path.joinpath` to return a string containing the joined path + with patch.object( + Path, "joinpath", return_value=Path("mocked_path") + ) as mock_joinpath: + result_path = handler.build_log_file_path(settings) + + # Assert the result is correct + assert result_path == Path("mocked_path") + + mock_joinpath.assert_called_once_with("my_app_abc123") + + +def test_clean_expired_files(handler): + with patch( + "openbb_core.app.logs.handlers.path_tracking_file_handler.get_expired_file_list" + ) as mock_get_expired_file_list, patch( + "openbb_core.app.logs.handlers.path_tracking_file_handler.remove_file_list" + ) as mock_remove_file_list: + handler.clean_expired_files(123) + + assert mock_get_expired_file_list.call_count == 3 + assert mock_remove_file_list.call_count == 3 diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py index e69de29bb2d..3d29a26417a 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py +++ b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py @@ -0,0 +1,225 @@ +from pathlib import Path +from unittest.mock import MagicMock, patch + +import pytest +from openbb_core.app.logs.handlers.posthog_handler import ( + PosthogHandler, +) +import logging + + +class MockLoggingSettings: + def __init__( + self, + app_name, + user_logs_directory, + session_id, + frequency, + appid, + commit_hash, + platform, + python_version, + terminal_version, + branch, + userid, + ): + self.app_name = app_name + self.user_logs_directory = Path(user_logs_directory) + self.session_id = session_id + self.frequency = frequency + self.app_id = appid + self.commit_hash = commit_hash + self.platform = platform + self.python_version = python_version + self.terminal_version = terminal_version + self.branch = branch + self.user_id = userid + + +logging_settings = MagicMock(spec=MockLoggingSettings) +logging_settings.app_name = "TestApp" +logging_settings.user_logs_directory = MagicMock() +logging_settings.user_logs_directory.absolute.return_value = Path( + "/mocked/logs/directory" +) +logging_settings.session_id = "session123" +logging_settings.frequency = "H" +logging_settings.app_id = "test123" +logging_settings.commit_hash = "commit123" +logging_settings.platform = "Windows" +logging_settings.python_version = "3.9" +logging_settings.terminal_version = "1.2.3" +logging_settings.branch = "main" +logging_settings.user_id = "user123" + + +@pytest.fixture +def handler(): + return PosthogHandler(logging_settings) + + +def test_emit_calls_send(mocker, handler): + # Arrange + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="test.py", + lineno=42, + msg="Test message", + args=None, + exc_info=None, + ) + + # Mock the send method + handler.send = mocker.MagicMock() + + # Act + handler.emit(record) + + # Assert + handler.send.assert_called_once_with(record=record) + + +def test_emit_calls_handleError_when_send_raises_exception(mocker, handler): + # Arrange + record = logging.LogRecord( + name="test_logger", + level=logging.ERROR, + pathname="test.py", + lineno=42, + msg="Test error message", + args=None, + exc_info=None, + ) + + # Mock the send method to raise an exception + handler.send = mocker.MagicMock(side_effect=Exception) + + # Mock the handleError method + handler.handleError = mocker.MagicMock() + + # Act + handler.emit(record) + + # Assert + handler.send.assert_called_once_with(record=record) + handler.handleError.assert_called_once_with(record) + + +def test_emit_calls_handleError_when_send_raises_exception_of_specific_type( + mocker, handler +): + # Arrange + record = logging.LogRecord( + name="test_logger", + level=logging.ERROR, + pathname="test.py", + lineno=42, + msg="Test error message", + args=None, + exc_info=None, + ) + + # Mock the send method to raise an exception of a specific type + handler.send = mocker.MagicMock(side_effect=ValueError) + + # Mock the handleError method + handler.handleError = mocker.MagicMock() + + # Act + handler.emit(record) + + # Assert + handler.send.assert_called_once_with(record=record) + handler.handleError.assert_called_once_with(record) + + +def test_emit_calls_handleError_when_send_raises_exception_of_another_type( + mocker, handler +): + # Arrange + record = logging.LogRecord( + name="test_logger", + level=logging.ERROR, + pathname="test.py", + lineno=42, + msg="Test error message", + args=None, + exc_info=None, + ) + + # Mock the send method to raise an exception of another type + handler.send = mocker.MagicMock(side_effect=TypeError) + + # Mock the handleError method + handler.handleError = mocker.MagicMock() + + # Act + handler.emit(record) + + # Assert + handler.send.assert_called_once_with(record=record) + handler.handleError.assert_called_once_with(record) + + +@pytest.mark.parametrize( + "log_info, expected_dict", + [ + ( + 'STARTUP: {"status": "success"}', + {"STARTUP": {"status": "success"}}, + ), + ( + '{"INPUT": {"something_something":"something_something"}}', + { + "SDK": {"INPUT": {"something_something": "something_something"}}, + }, + ), + ( + 'CMD: {"path": "/stocks/", "known_cmd": "load", "other_args": "aapl", "input": "load aapl"}', + { + "CMD": { + "path": "/stocks/", + "known_cmd": "load", + "other_args": "aapl", + "input": "load aapl", + } + }, + ), + ], +) +def test_log_to_dict(handler, log_info, expected_dict): + # Act + result = handler.log_to_dict(log_info) + + # Assert + assert result == expected_dict + + +@pytest.mark.parametrize( + "record, expected_extra", + [ + ( + logging.LogRecord( + "name", logging.INFO, "pathname", 42, "message", (), None, None + ), + { + "appName": "TestApp", + "appId": "test123", + "sessionId": "session123", + "commitHash": "commit123", + "platform": "Windows", + "pythonVersion": "3.9", + "terminalVersion": "1.2.3", + "branch": "main", + "userId": "user123", + }, + ), + ], +) +def test_extract_log_extra(handler, record, expected_extra): + # Act + result = handler.extract_log_extra(record) + + # Assert + assert result == expected_extra diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py index 6a57a55ee93..77ba2742dbd 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py @@ -1,6 +1,149 @@ -from openbb_core.app.logs.utils.expired_files import get_timestamp_from_x_days +import os +import tempfile +from pathlib import Path +from time import time + +import pytest +from openbb_core.app.logs.utils.expired_files import ( + get_expired_file_list, + get_timestamp_from_x_days, + remove_file_list, +) + +from unittest.mock import MagicMock + + +@pytest.fixture +def temp_test_files(): + with tempfile.TemporaryDirectory() as temp_dir: + temp_files = [ + Path(temp_dir) / "file1.txt", + Path(temp_dir) / "file2.txt", + Path(temp_dir) / "file3.txt", + ] + + # Create some test files + for file_path in temp_files: + file_path.touch() + + yield temp_dir, temp_files def test_get_timestamp_from_x_days(): result = get_timestamp_from_x_days(0) assert isinstance(result, float) + + +# Test case when all files are expired +def test_all_files_expired(temp_test_files): + temp_dir, temp_files = temp_test_files + before_timestamp = time() + 3 * 86400 # timestmap 3 days from now + expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) + assert set(expired_files) == set(temp_files) + + +# Test case when no files are expired +def test_no_files_expired(temp_test_files): + temp_dir, _ = temp_test_files + before_timestamp = 0 + expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) + assert expired_files == [] + + +# Test case when some files are expired and some are not +def test_some_files_expired(temp_test_files): + temp_dir, _ = temp_test_files + + # add temp file to temp_dir with timestamp in the future + temp_file = Path(temp_dir) / "file4.txt" + temp_file.touch() + time_in_future = time() + 4 * 86400 # timestmap 4 days from now + os.utime(temp_file, times=(time_in_future, time_in_future)) + + before_timestamp = time() + 3 * 86400 # timestmap 3 days from now + expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) + assert len(expired_files) == 3 + + # assert number of files in temp_dir is 4 + assert len(list(Path(temp_dir).iterdir())) == 4 + + +# Test case when the directory does not exist +def test_directory_not_exists(): + directory = Path("/path/that/does/not/exist") + before_timestamp = time() + expired_files = get_expired_file_list(directory, before_timestamp) + assert expired_files == [] + + +# Test case when the directory is not a directory +def test_directory_not_dir(temp_test_files): + _, temp_files = temp_test_files + before_timestamp = time() + expired_files = get_expired_file_list(temp_files[0], before_timestamp) + assert expired_files == [] + + +@pytest.fixture +def mock_path(): + # Create a MagicMock for the Path class to represent a file path + return MagicMock() + + +def test_remove_file_list_no_files(mock_path, mocker): + # Arrange + # Let's assume the file list is empty, meaning there are no files to remove + file_list = [] + + # Act + remove_file_list(file_list) + + # Assert + # No interaction with the filesystem should occur + assert not mock_path.unlink.called + + +def test_remove_file_list_remove_files_successfully(mock_path, mocker): + # Arrange + # Let's assume we have three files in the file list + file_list = [mock_path, mock_path, mock_path] + + # Mock the unlink method to avoid actual filesystem interaction + mocker.patch.object(mock_path, "unlink") + + # Act + remove_file_list(file_list) + + # Assert + # unlink should have been called three times since there are three files in the list + assert mock_path.unlink.call_count == 3 + + +def test_remove_file_list_ignore_permission_error(mock_path, mocker): + # Arrange + # Let's assume we have three files in the file list + file_list = [mock_path, mock_path, mock_path] + + # Mock the unlink method to raise a PermissionError + mocker.patch.object(mock_path, "unlink", side_effect=PermissionError) + + # Act + remove_file_list(file_list) + + # Assert + # unlink should have been called three times since there are three files in the list + assert mock_path.unlink.call_count == 3 + + +def test_remove_file_list_other_exception(mock_path, mocker): + # Arrange + # Let's assume we have three files in the file list + file_list = [mock_path, mock_path, mock_path] + + # Mock the unlink method to raise an exception other than PermissionError + mocker.patch.object(mock_path, "unlink", side_effect=OSError) + + # Act & Assert + # The exception should be raised since it is not suppressed by the contextlib + with pytest.raises(OSError): + remove_file_list(file_list) From 89dba242bb1c30d99bd9c5c8e082cba66651516d Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Mon, 31 Jul 2023 14:57:42 +0100 Subject: [PATCH 47/62] typo --- .../sdk/core/tests/app/logs/utils/test_expired_files.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py index 77ba2742dbd..da4be842997 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py @@ -37,7 +37,7 @@ def test_get_timestamp_from_x_days(): # Test case when all files are expired def test_all_files_expired(temp_test_files): temp_dir, temp_files = temp_test_files - before_timestamp = time() + 3 * 86400 # timestmap 3 days from now + before_timestamp = time() + 3 * 86400 # timestamp 3 days from now expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) assert set(expired_files) == set(temp_files) @@ -57,10 +57,10 @@ def test_some_files_expired(temp_test_files): # add temp file to temp_dir with timestamp in the future temp_file = Path(temp_dir) / "file4.txt" temp_file.touch() - time_in_future = time() + 4 * 86400 # timestmap 4 days from now + time_in_future = time() + 4 * 86400 # timestamp 4 days from now os.utime(temp_file, times=(time_in_future, time_in_future)) - before_timestamp = time() + 3 * 86400 # timestmap 3 days from now + before_timestamp = time() + 3 * 86400 # timestamp 3 days from now expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) assert len(expired_files) == 3 From a2d7b9f33c7a34057e8a2a298cb40a7f8b24fdf1 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Mon, 31 Jul 2023 14:58:26 +0100 Subject: [PATCH 48/62] ruff --- .../sdk/core/tests/app/logs/handlers/test_posthog_handler.py | 4 ++-- .../sdk/core/tests/app/logs/utils/test_expired_files.py | 3 +-- openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py index 3d29a26417a..704c44b803d 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py +++ b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py @@ -1,11 +1,11 @@ +import logging from pathlib import Path -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock import pytest from openbb_core.app.logs.handlers.posthog_handler import ( PosthogHandler, ) -import logging class MockLoggingSettings: diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py index da4be842997..4be38a6892d 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py @@ -2,6 +2,7 @@ import os import tempfile from pathlib import Path from time import time +from unittest.mock import MagicMock import pytest from openbb_core.app.logs.utils.expired_files import ( @@ -10,8 +11,6 @@ from openbb_core.app.logs.utils.expired_files import ( remove_file_list, ) -from unittest.mock import MagicMock - @pytest.fixture def temp_test_files(): diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py index cf563c48284..f3715abc434 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py @@ -1,10 +1,9 @@ -import pytest import uuid from pathlib import Path - from unittest.mock import patch -from openbb_core.app.logs.utils.utils import get_session_id, get_app_id, get_log_dir +import pytest +from openbb_core.app.logs.utils.utils import get_app_id, get_log_dir, get_session_id ## get_session_id From e2956367d3cbfe15dff5e0b7a75240b21736b3d9 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 31 Jul 2023 18:14:55 +0200 Subject: [PATCH 49/62] Move --- .../core/tests/app/test_provider_interface.py | 100 ++++++ openbb_sdk/sdk/core/tests/app/test_query.py | 126 +++++++ openbb_sdk/sdk/core/tests/app/test_router.py | 307 ++++++++++++++++++ 3 files changed, 533 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/app/test_provider_interface.py create mode 100644 openbb_sdk/sdk/core/tests/app/test_query.py create mode 100644 openbb_sdk/sdk/core/tests/app/test_router.py diff --git a/openbb_sdk/sdk/core/tests/app/test_provider_interface.py b/openbb_sdk/sdk/core/tests/app/test_provider_interface.py new file mode 100644 index 00000000000..e61fdda19ca --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/test_provider_interface.py @@ -0,0 +1,100 @@ +"""Test provider interface.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.provider_interface import ( + ProviderChoices, + ProviderInterface, + ProviderRegistry, + get_provider_interface, +) + + +@pytest.fixture(scope="module") +def provider_interface(): + """Set up provider_interface.""" + return ProviderInterface() + + +def test_init(provider_interface): + """Test init.""" + assert provider_interface + + +def test_get_provider_interface(): + """Test get provider interface.""" + assert isinstance(get_provider_interface(), ProviderInterface) + + +def test_map(provider_interface): + """Test map.""" + provider_interface_map = provider_interface.map + assert isinstance(provider_interface_map, dict) + assert len(provider_interface_map) > 0 + assert "StockEOD" in provider_interface_map + + +def test_required_credentials(provider_interface): + """Test required credentials.""" + required_credentials = provider_interface.required_credentials + assert isinstance(required_credentials, dict) + assert len(required_credentials) > 0 + + +def test_model_providers(provider_interface): + """Test model providers.""" + model_providers = provider_interface.model_providers + assert isinstance(model_providers, dict) + assert len(model_providers) > 0 + + +def test_params(provider_interface): + """Test params.""" + params = provider_interface.params + assert isinstance(params, dict) + assert len(params) > 0 + assert "StockEOD" in params + + +def test_data(provider_interface): + """Test data.""" + data = provider_interface.data + assert isinstance(data, dict) + assert len(data) > 0 + assert "StockEOD" in data + + +def test_merged_data(provider_interface): + """Test merged data.""" + merged_data = provider_interface.merged_data + assert isinstance(merged_data, dict) + assert len(merged_data) > 0 + assert "StockEOD" in merged_data + + +def test_providers_literal(provider_interface): + """Test providers literal.""" + providers_literal = provider_interface.providers_literal + assert isinstance(type(providers_literal), type) + assert len(providers_literal.__args__) > 0 + assert "openbb" not in providers_literal.__args__ + + +def test_provider_choices(provider_interface): + """Test provider choices.""" + provider_choices = provider_interface.provider_choices + assert isinstance(provider_choices, type(ProviderChoices)) + + +def test_models(provider_interface): + """Test models.""" + models = provider_interface.models + assert isinstance(models, list) + assert len(models) > 0 + assert "StockEOD" in models + + +def test_build_registry(provider_interface): + """Test build registry.""" + build_registry = provider_interface.build_registry() + assert isinstance(build_registry, ProviderRegistry) diff --git a/openbb_sdk/sdk/core/tests/app/test_query.py b/openbb_sdk/sdk/core/tests/app/test_query.py new file mode 100644 index 00000000000..f5856ff573c --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/test_query.py @@ -0,0 +1,126 @@ +"""Test the Query class.""" +# pylint: disable=redefined-outer-name + +from dataclasses import dataclass +from unittest.mock import MagicMock, patch + +import pytest +from openbb_core.app.model.command_context import CommandContext +from openbb_core.app.provider_interface import ( + ExtraParams, + ProviderChoices, + StandardParams, +) +from openbb_core.app.query import Query +from pydantic import BaseModel + + +def create_mock_query(): + """Mock query.""" + + class StockEOD: + """Mock StockEOD class.""" + + start_date = "2020-01-01" + end_date = "2020-01-05" + symbol = "AAPL" + + return StockEOD() + + +def create_mock_extra_params(): + """Mock ExtraParams dataclass.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + + return StockEOD() + + +@pytest.fixture(scope="module") +def query(): + """Set up query.""" + return Query( + cc=CommandContext(), + provider_choices=ProviderChoices(provider="fmp"), + standard_params=StandardParams(), + extra_params=ExtraParams(), + ) + + +def test_init(query): + """Test init.""" + assert query + + +def test_to_query_params(query): + """Test to_query_params.""" + standard_params = create_mock_query() + + assert query.to_query_params(standard_params) + + +def test_filter_extra_params(query): + """Test filter_extra_params.""" + extra_params = create_mock_extra_params() + extra_params = query.filter_extra_params(extra_params, "fmp") + + assert isinstance(extra_params, dict) + assert len(extra_params) == 0 + + +def test_filter_extra_params_wrong_param(query): + """Test filter_extra_params.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + limit: int = 4 + + extra_params = StockEOD() + + assert not query.filter_extra_params(extra_params, "fmp") + + +@pytest.fixture +def mock_registry(): + """Mock registry.""" + with patch( + "openbb_core.app.provider_interface.get_provider_interface" + ) as mock_get_provider_interface: + mock_registry = MagicMock() + mock_get_provider_interface.return_value.build_registry.return_value = ( + mock_registry + ) + yield mock_registry + + +@pytest.fixture +def query_instance(): + """Set up query.""" + standard_params = create_mock_query() + extra_params = create_mock_extra_params() + + cc = CommandContext() + setattr(cc.user_settings.credentials, "fmp_api_key", "1234") + + return Query( + cc=cc, + provider_choices=ProviderChoices(provider="fmp"), + standard_params=standard_params, + extra_params=extra_params, + ) + + +def test_execute_method_fake_credentials(query_instance, mock_registry): + """Test execute method without setting credentials.""" + mock_fetch_result = BaseModel() # Replace with an actual instance of BaseModel + mock_registry.fetch.return_value = mock_fetch_result + + with pytest.raises(Exception): + query_instance.execute() diff --git a/openbb_sdk/sdk/core/tests/app/test_router.py b/openbb_sdk/sdk/core/tests/app/test_router.py new file mode 100644 index 00000000000..d09eac2a633 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/test_router.py @@ -0,0 +1,307 @@ +"""Test router.py file.""" +# pylint: disable=redefined-outer-name +# pylint: disable=unused-argument + + +import pytest +from openbb_core.app.model.command_context import CommandContext +from openbb_core.app.model.command_output import CommandOutput +from openbb_core.app.provider_interface import ( + ExtraParams, + ProviderChoices, + StandardParams, +) +from openbb_core.app.router import ( + CommandMap, + CommandValidator, + Router, + RouterLoader, + SignatureInspector, +) +from pydantic import BaseModel + + +@pytest.fixture(scope="module") +def command_validator(): + """Set up command_validator.""" + return CommandValidator() + + +def test_command_validator_init(command_validator): + """Test init.""" + assert command_validator + + +@pytest.mark.parametrize( + "type_, expected", + [ + (str, True), + (int, True), + (float, True), + (bool, True), + (list, True), + (BaseModel, False), + ], +) +def test_is_standard_pydantic_type(command_validator, type_, expected): + """Test is_standard_pydantic_type.""" + # assert command_validator.is_standard_pydantic_type(str) + assert command_validator.is_standard_pydantic_type(type_) == expected + + +def test_is_valid_pydantic_model_type(command_validator): + """Test is_valid_pydantic_model_type.""" + assert command_validator.is_valid_pydantic_model_type(BaseModel) + assert not command_validator.is_valid_pydantic_model_type(str) + + +@pytest.mark.parametrize( + "type_, expected", + [ + (str, True), + (int, True), + (float, True), + (bool, True), + (list, True), + (BaseModel, True), + ], +) +def test_is_serializable_value_type(command_validator, type_, expected): + """Test is_serializable_value_type.""" + assert command_validator.is_serializable_value_type(type_) == expected + + +def test_is_annotated_dc(command_validator): + """Test is_annotated_dc.""" + assert not command_validator.is_annotated_dc(str) + + +def test_check_reserved_param(command_validator): + """Test check_reserved_param.""" + assert command_validator.check_reserved_param("name", str, {}, str, str) is None + assert not command_validator.check_reserved_param("name", str, {}, str, int) + + +def test_check_parameters(command_validator): + """Test check_parameters.""" + + def func(): + pass + + assert command_validator.check_parameters(func) is None + assert not command_validator.check_parameters(BaseModel) + + +def test_check_return_error(command_validator): + """Test check_return fail.""" + with pytest.raises(TypeError): + + def func(): + pass + + command_validator.check_return(func) + + +def test_check_return(command_validator): + """Test check_return.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert command_validator.check_return(valid_function) is None + + +def test_check(command_validator): + """Test check.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert command_validator.check(valid_function) is None + + +@pytest.fixture(scope="module") +def router(): + """Set up router.""" + return Router() + + +def test_router_init(router): + """Test init.""" + assert router + + +def test_command(router): + """Test command.""" + + @router.command + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert valid_function + + +def test_include_router(router): + """Test include_router.""" + some_router = Router() + assert router.include_router(some_router) is None + + +@pytest.fixture(scope="module") +def router_loader(): + """Set up router_loader.""" + return RouterLoader() + + +def test_router_loader_init(router_loader): + """Test init.""" + assert router_loader + + +def test_from_extensions(router_loader): + """Test from_extensions.""" + assert router_loader.from_extensions() + + +@pytest.fixture(scope="module") +def signature_inspector(): + """Set up signature_inspector.""" + return SignatureInspector() + + +def test_signature_inspector_init(signature_inspector): + """Test init.""" + assert signature_inspector + + +def test_complete_signature(signature_inspector): + """Test complete_signature.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + model = "StockEOD" + + assert signature_inspector.complete_signature(sample_function, model) + + +def test_complete_signature_error(signature_inspector): + """Test complete_signature.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + with pytest.raises(AttributeError): + signature_inspector.complete_signature(valid_function, "invalid_model") + + +def test_validate_signature(signature_inspector): + """Test validate_signature.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + expected_signature = { + "cc": CommandContext, + "provider_choices": ProviderChoices, + "standard_params": StandardParams, + "extra_params": ExtraParams, + } + + assert ( + signature_inspector.validate_signature(sample_function, expected_signature) + is None + ) + + +def test_inject_dependency(signature_inspector): + """Test inject_dependency.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + assert signature_inspector.inject_dependency(sample_function, "cc", CommandContext) + + +def test_get_description(signature_inspector): + """Test get_description.""" + + def some_function(): + """Mock function.""" + + assert signature_inspector.get_description(some_function) == some_function.__doc__ + + +def test_get_description_no_doc(signature_inspector): + """Test get_description.""" + + def some_function(): + pass + + assert signature_inspector.get_description(some_function) == "" + + +@pytest.fixture(scope="module") +def command_map(): + """Set up command_map.""" + return CommandMap() + + +def test_command_map_init(command_map): + """Test init.""" + assert command_map + + +def test_map(command_map): + """Test map.""" + assert isinstance(command_map.map, dict) + + +def test_provider_coverage(command_map): + """Test provider_coverage.""" + assert isinstance(command_map.provider_coverage, dict) + + +def test_command_coverage(command_map): + """Test command_coverage.""" + assert isinstance(command_map.command_coverage, dict) + + +def test_get_command_map(command_map, router): + """Test get_command_map.""" + command_map = command_map.get_command_map(router) + assert isinstance(command_map, dict) + assert len(command_map) > 0 + + +def test_get_provider_coverage(command_map, router): + """Test get_provider_coverage.""" + provider_coverage = command_map.get_provider_coverage(router) + assert isinstance(provider_coverage, dict) + + +def test_get_command_coverage(command_map, router): + """Test get_command_coverage.""" + command_coverage = command_map.get_command_coverage(router) + assert isinstance(command_coverage, dict) + + +def test_get_command(command_map): + """Test get_command.""" + command = command_map.get_command("stocks/load") + assert command is None From 83ed6f167503ee9ac5450475b90a7b7b644b30e3 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 05:29:31 +0100 Subject: [PATCH 50/62] placeholders --- .../sdk/core/tests/app/logs/utils/test_system_utils.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py index 057442b87f5..f0c9b123da5 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py @@ -1 +1,11 @@ # TODO : add tests once the code is fixed + +from openbb_core.app.logs.utils.system_utils import get_commit_hash, get_branch + + +def test_get_commit_hash(): + pass + + +def test_get_branch(): + pass From d9b45e22ee6819b352a21d84c2c3fe593a5486a6 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 06:30:57 +0100 Subject: [PATCH 51/62] some more tests for models --- .../app/model/charts/charting_settings.py | 26 ++++++---- .../tests/app/models/abstract/test_error.py | 24 +++++++++ .../tests/app/models/abstract/test_results.py | 9 ++++ .../app/models/abstract/test_singleton.py | 32 ++++++++++++ .../tests/app/models/abstract/test_tagged.py | 14 +++++ .../tests/app/models/abstract/test_warning.py | 36 +++++++++++++ .../tests/app/models/charts/test_chart.py | 51 +++++++++++++++++++ .../app/models/charts/test_chart_settings.py | 49 ++++++++++++++++++ 8 files changed, 230 insertions(+), 11 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/model/charts/charting_settings.py b/openbb_sdk/sdk/core/openbb_core/app/model/charts/charting_settings.py index 843d91cff62..f0ab0d68466 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/model/charts/charting_settings.py +++ b/openbb_sdk/sdk/core/openbb_core/app/model/charts/charting_settings.py @@ -26,22 +26,26 @@ class ChartingSettings: # System self.log_collect: bool = system_settings.log_collect - self.version = system_settings.version - self.python_version = system_settings.python_version + self.version: str = system_settings.version + self.python_version: str = system_settings.python_version self.test_mode = system_settings.test_mode self.app_id: str = get_app_id(user_data_directory) self.debug_mode: bool = system_settings.debug_mode self.headless: bool = system_settings.headless # User - self.plot_enable_pywry = user_settings.preferences.plot_enable_pywry - self.plot_pywry_width = user_settings.preferences.plot_pywry_width - self.plot_pywry_height = user_settings.preferences.plot_pywry_height - self.plot_open_export = user_settings.preferences.plot_open_export - self.user_email = user_settings.profile.hub_session.email if has_hub else None - self.user_uuid = ( + self.plot_enable_pywry: bool = user_settings.preferences.plot_enable_pywry + self.plot_pywry_width: int = user_settings.preferences.plot_pywry_width + self.plot_pywry_height: int = user_settings.preferences.plot_pywry_height + self.plot_open_export: bool = user_settings.preferences.plot_open_export + self.user_email: Optional[str] = ( + user_settings.profile.hub_session.email if has_hub else None + ) + self.user_uuid: Optional[str] = ( user_settings.profile.hub_session.user_uuid if has_hub else None ) - self.user_exports_directory = user_settings.preferences.export_directory - self.user_styles_directory = user_settings.preferences.user_styles_directory + self.user_exports_directory: str = user_settings.preferences.export_directory + self.user_styles_directory: str = ( + user_settings.preferences.user_styles_directory + ) # Theme - self.chart_style = user_settings.preferences.chart_style + self.chart_style: str = user_settings.preferences.chart_style diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py new file mode 100644 index 00000000000..11b5c05bb0e --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py @@ -0,0 +1,24 @@ +from openbb_core.app.model.abstract.error import Error +import pytest + + +@pytest.mark.parametrize( + "error_kind, message", + [ + ("test", "test"), + ("test2", "test2"), + ], +) +def test_error_model(error_kind, message): + err = Error(error_kind=error_kind, message=message) + + assert err.error_kind == error_kind + assert err.message == message + + +def test_fields(): + fields = Error.__fields__ + fields_keys = fields.keys() + + assert "error_kind" in fields_keys + assert "message" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py new file mode 100644 index 00000000000..185f82c7925 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py @@ -0,0 +1,9 @@ +from openbb_core.app.model.abstract.results import Results + +from pydantic import BaseModel + + +def test_results_model(): + res = Results() + + assert isinstance(res, BaseModel) diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py new file mode 100644 index 00000000000..d87502e2f67 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py @@ -0,0 +1,32 @@ +from openbb_core.app.model.abstract.singleton import SingletonMeta + + +class MyClass(metaclass=SingletonMeta): + def __init__(self, value): + self.value = value + + +def test_singleton_instance_creation(): + # Arrange + instance1 = MyClass(42) + instance2 = MyClass(100) + + # Act & Assert + assert instance1 is instance2 + assert instance1.value == instance2.value + assert instance1.value == 42 + + +def test_singleton_multiple_classes(): + # Arrange + class AnotherClass(metaclass=SingletonMeta): + def __init__(self, data): + self.data = data + + instance1 = MyClass(42) + instance2 = AnotherClass("test") + + # Act & Assert + assert instance1 is not instance2 + assert instance1.value == 42 + assert instance2.data == "test" diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py new file mode 100644 index 00000000000..9a8ecd6c12e --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py @@ -0,0 +1,14 @@ +from openbb_core.app.model.abstract.tagged import Tagged + + +def test_tagged_model(): + tagged = Tagged() + + assert hasattr(tagged, "id") + + +def test_fields(): + fields = Tagged.__fields__ + fields_keys = fields.keys() + + assert "id" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py new file mode 100644 index 00000000000..fcf833e12a0 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py @@ -0,0 +1,36 @@ +from openbb_core.app.model.abstract.warning import Warning_, cast_warning + +import pytest +from unittest.mock import Mock + + +@pytest.mark.parametrize( + "category, message", + [ + ("test", "test"), + ("test2", "test2"), + ], +) +def test_warn_model(category, message): + war = Warning_(category=category, message=message) + + assert war.category == category + assert war.message == message + + +def test_fields(): + fields = Warning_.__fields__ + fields_keys = fields.keys() + + assert "category" in fields_keys + assert "message" in fields_keys + + +def test_cast_warning(): + mock_warning_message = Mock() + mock_warning_message.category.__name__ = "test" + mock_warning_message.message = "test" + warning = cast_warning(mock_warning_message) + + assert warning.category == "test" + assert warning.message == "test" diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py new file mode 100644 index 00000000000..fc1cff860e0 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py @@ -0,0 +1,51 @@ +from openbb_core.app.model.charts.chart import Chart, ChartFormat, Error + +import pytest + + +def test_chart_default_values(): + # Arrange & Act + chart = Chart() + + # Assert + assert chart.content is None + assert chart.format == ChartFormat.plotly + assert chart.error is None + + +def test_chart_custom_values(): + # Arrange + content = {"data": [1, 2, 3]} + chart_format = ChartFormat.plotly + error = Error(message="Test Error") + + # Act + chart = Chart(content=content, format=chart_format, error=error) + + # Assert + assert chart.content == content + assert chart.format == chart_format + assert chart.error == error + + +def test_chart_assignment_validation(): + # Arrange + chart = Chart() + + # Act & Assert + with pytest.raises(ValueError): + chart.invalid_field = "Invalid Value" + + +def test_chart_config_validation(): + # Arrange + content = {"data": [1, 2, 3]} + chart_format = ChartFormat.plotly + + chart = Chart(content=content, format=chart_format) + + with pytest.raises(ValueError): + chart.content = "Invalid Content" + + assert chart.content == content + assert chart.format == chart_format diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py new file mode 100644 index 00000000000..595310aecf2 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py @@ -0,0 +1,49 @@ +from openbb_core.app.model.charts.charting_settings import ChartingSettings + +from unittest.mock import MagicMock + +mock_user_settings = MagicMock() +mock_user_settings.preferences.data_directory = "mock_data_directory" +mock_user_settings.preferences.plot_enable_pywry = True +mock_user_settings.preferences.plot_pywry_width = 100 +mock_user_settings.preferences.plot_pywry_height = 100 +mock_user_settings.preferences.plot_open_export = True +mock_user_settings.profile.hub_session.email = "mock_email" +mock_user_settings.profile.hub_session.user_uuid = "mock_uuid" +mock_user_settings.preferences.export_directory = "mock_export_directory" +mock_user_settings.preferences.user_styles_directory = "mock_styles_directory" +mock_user_settings.preferences.chart_style = "mock_chart_style" + +mock_system_settings = MagicMock() +mock_system_settings.log_collect = True +mock_system_settings.version = "mock_version" +mock_system_settings.python_version = "mock_python_version" +mock_system_settings.test_mode = True +mock_system_settings.debug_mode = True +mock_system_settings.headless = True + + +def test_charting_settings(mocker): + mocker.patch( + target="openbb_core.app.model.charts.charting_settings.get_app_id", + new=mocker.Mock(return_value="mock_app_id"), + ) + charting_settings = ChartingSettings( + user_settings=mock_user_settings, system_settings=mock_system_settings + ) + assert charting_settings.log_collect is True + assert charting_settings.version == "mock_version" + assert charting_settings.python_version == "mock_python_version" + assert charting_settings.test_mode is True + assert charting_settings.app_id == "mock_app_id" + assert charting_settings.debug_mode is True + assert charting_settings.headless is True + assert charting_settings.plot_enable_pywry is True + assert charting_settings.plot_pywry_width == 100 + assert charting_settings.plot_pywry_height == 100 + assert charting_settings.plot_open_export is True + assert charting_settings.user_email == "mock_email" + assert charting_settings.user_uuid == "mock_uuid" + assert charting_settings.user_exports_directory == "mock_export_directory" + assert charting_settings.user_styles_directory == "mock_styles_directory" + assert charting_settings.chart_style == "mock_chart_style" From b3f7e7f0422ebc19ce16afd3725500d1b0b5efc1 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 06:48:08 +0100 Subject: [PATCH 52/62] more tests for models --- .../openbb_core/app/model/error/__init__.py | 0 .../tests/app/models/test_features_keys.py | 8 +++++ .../core/tests/app/models/test_hub_session.py | 30 +++++++++++++++++++ .../app/models/test_hub_user_settings.py | 7 +++++ .../sdk/core/tests/app/results/test_empty.py | 10 +++++++ 5 files changed, 55 insertions(+) delete mode 100644 openbb_sdk/sdk/core/openbb_core/app/model/error/__init__.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/test_features_keys.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/test_hub_session.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py create mode 100644 openbb_sdk/sdk/core/tests/app/results/test_empty.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/model/error/__init__.py b/openbb_sdk/sdk/core/openbb_core/app/model/error/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_sdk/sdk/core/tests/app/models/test_features_keys.py b/openbb_sdk/sdk/core/tests/app/models/test_features_keys.py new file mode 100644 index 00000000000..19eda989243 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/test_features_keys.py @@ -0,0 +1,8 @@ +from openbb_core.app.model.hub.features_keys import FeaturesKeys + + +def test_features_keys(): + fk = FeaturesKeys(API_BITQUERY_KEY="test", API_BIZTOC_TOKEN="test2") + + assert fk.API_BITQUERY_KEY == "test" + assert fk.API_BIZTOC_TOKEN == "test2" diff --git a/openbb_sdk/sdk/core/tests/app/models/test_hub_session.py b/openbb_sdk/sdk/core/tests/app/models/test_hub_session.py new file mode 100644 index 00000000000..1f55189599c --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/test_hub_session.py @@ -0,0 +1,30 @@ +from openbb_core.app.model.hub.hub_session import HubSession + + +def test_hub_session(): + session = HubSession( + access_token="mock_access_token", + token_type="mock_token_type", + email="mock_email", + user_uuid="mock_user_uuid", + username="mock_username", + primary_usage="mock_primary_usage", + ) + assert session.access_token == "mock_access_token" + assert session.token_type == "mock_token_type" + assert session.email == "mock_email" + assert session.user_uuid == "mock_user_uuid" + assert session.username == "mock_username" + assert session.primary_usage == "mock_primary_usage" + + +def test_fields(): + fields = HubSession.__fields__ + fields_keys = fields.keys() + + assert "access_token" in fields_keys + assert "token_type" in fields_keys + assert "email" in fields_keys + assert "user_uuid" in fields_keys + assert "username" in fields_keys + assert "primary_usage" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py b/openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py new file mode 100644 index 00000000000..ca2f78ff9a8 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py @@ -0,0 +1,7 @@ +from openbb_core.app.model.hub.hub_user_settings import HubUserSettings + + +def test_hub_user_settings(): + hub_settings = HubUserSettings() + + assert isinstance(hub_settings, HubUserSettings) diff --git a/openbb_sdk/sdk/core/tests/app/results/test_empty.py b/openbb_sdk/sdk/core/tests/app/results/test_empty.py new file mode 100644 index 00000000000..79d9796505a --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/results/test_empty.py @@ -0,0 +1,10 @@ +from openbb_core.app.model.results.empty import Empty + +from pydantic import BaseModel + + +def test_empty_model(): + empty = Empty() + + assert isinstance(empty, Empty) + assert isinstance(empty, BaseModel) From 2b899b83c2af71d0e9fe431ab97e4bf18a96c6ab Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 06:48:22 +0100 Subject: [PATCH 53/62] ruff --- openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py | 1 - openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py | 2 +- openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py | 1 - openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py | 4 ++-- openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py | 3 +-- .../sdk/core/tests/app/models/charts/test_chart_settings.py | 4 ++-- openbb_sdk/sdk/core/tests/app/results/test_empty.py | 1 - 7 files changed, 6 insertions(+), 10 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py index f0c9b123da5..45233ce1c59 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py @@ -1,6 +1,5 @@ # TODO : add tests once the code is fixed -from openbb_core.app.logs.utils.system_utils import get_commit_hash, get_branch def test_get_commit_hash(): diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py index 11b5c05bb0e..4e16d152580 100644 --- a/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py @@ -1,5 +1,5 @@ -from openbb_core.app.model.abstract.error import Error import pytest +from openbb_core.app.model.abstract.error import Error @pytest.mark.parametrize( diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py index 185f82c7925..da1fc0776b6 100644 --- a/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py @@ -1,5 +1,4 @@ from openbb_core.app.model.abstract.results import Results - from pydantic import BaseModel diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py index fcf833e12a0..5c466442f12 100644 --- a/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py @@ -1,7 +1,7 @@ -from openbb_core.app.model.abstract.warning import Warning_, cast_warning +from unittest.mock import Mock import pytest -from unittest.mock import Mock +from openbb_core.app.model.abstract.warning import Warning_, cast_warning @pytest.mark.parametrize( diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py index fc1cff860e0..4e7f930eaea 100644 --- a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py +++ b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py @@ -1,6 +1,5 @@ -from openbb_core.app.model.charts.chart import Chart, ChartFormat, Error - import pytest +from openbb_core.app.model.charts.chart import Chart, ChartFormat, Error def test_chart_default_values(): diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py index 595310aecf2..d1174804186 100644 --- a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py +++ b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py @@ -1,7 +1,7 @@ -from openbb_core.app.model.charts.charting_settings import ChartingSettings - from unittest.mock import MagicMock +from openbb_core.app.model.charts.charting_settings import ChartingSettings + mock_user_settings = MagicMock() mock_user_settings.preferences.data_directory = "mock_data_directory" mock_user_settings.preferences.plot_enable_pywry = True diff --git a/openbb_sdk/sdk/core/tests/app/results/test_empty.py b/openbb_sdk/sdk/core/tests/app/results/test_empty.py index 79d9796505a..23a73ff369e 100644 --- a/openbb_sdk/sdk/core/tests/app/results/test_empty.py +++ b/openbb_sdk/sdk/core/tests/app/results/test_empty.py @@ -1,5 +1,4 @@ from openbb_core.app.model.results.empty import Empty - from pydantic import BaseModel From 938e126df8c9030ecd44795265c2c08d482ee868 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 07:47:29 +0100 Subject: [PATCH 54/62] some more tests and moves --- .../{models => model}/abstract/test_error.py | 0 .../abstract/test_results.py | 0 .../abstract/test_singleton.py | 0 .../{models => model}/abstract/test_tagged.py | 0 .../abstract/test_warning.py | 0 .../{models => model}/charts/test_chart.py | 0 .../charts/test_chart_settings.py | 0 .../hub}/test_features_keys.py | 0 .../{models => model/hub}/test_hub_session.py | 0 .../hub}/test_hub_user_settings.py | 0 .../tests/app/model/test_command_context.py | 20 ++++++++++++ .../tests/app/model/test_command_output.py | 0 .../core/tests/app/model/test_credentials.py | 23 +++++++++++++ .../sdk/core/tests/app/model/test_defaults.py | 14 ++++++++ .../sdk/core/tests/app/model/test_journal.py | 19 +++++++++++ .../tests/app/model/test_journal_entry.py | 32 +++++++++++++++++++ .../tests/app/model/test_journal_query.py | 19 +++++++++++ .../core/tests/app/model/test_preferences.py | 6 ++++ .../sdk/core/tests/app/model/test_profile.py | 6 ++++ .../tests/app/model/test_system_settings.py | 0 .../tests/app/model/test_user_settings.py | 13 ++++++++ 21 files changed, 152 insertions(+) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_error.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_results.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_singleton.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_tagged.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_warning.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/charts/test_chart.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/charts/test_chart_settings.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model/hub}/test_features_keys.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model/hub}/test_hub_session.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model/hub}/test_hub_user_settings.py (100%) create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_command_context.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_command_output.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_credentials.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_defaults.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_journal.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_journal_query.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_preferences.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_profile.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_system_settings.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_user_settings.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_error.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_error.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_results.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_results.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_singleton.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_singleton.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_tagged.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_tagged.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_warning.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_warning.py diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py b/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py rename to openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py b/openbb_sdk/sdk/core/tests/app/model/charts/test_chart_settings.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py rename to openbb_sdk/sdk/core/tests/app/model/charts/test_chart_settings.py diff --git a/openbb_sdk/sdk/core/tests/app/models/test_features_keys.py b/openbb_sdk/sdk/core/tests/app/model/hub/test_features_keys.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/test_features_keys.py rename to openbb_sdk/sdk/core/tests/app/model/hub/test_features_keys.py diff --git a/openbb_sdk/sdk/core/tests/app/models/test_hub_session.py b/openbb_sdk/sdk/core/tests/app/model/hub/test_hub_session.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/test_hub_session.py rename to openbb_sdk/sdk/core/tests/app/model/hub/test_hub_session.py diff --git a/openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py b/openbb_sdk/sdk/core/tests/app/model/hub/test_hub_user_settings.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py rename to openbb_sdk/sdk/core/tests/app/model/hub/test_hub_user_settings.py diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_context.py b/openbb_sdk/sdk/core/tests/app/model/test_command_context.py new file mode 100644 index 00000000000..4d86b5bff78 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_command_context.py @@ -0,0 +1,20 @@ +from openbb_core.app.model.command_context import ( + CommandContext, + UserSettings, + SystemSettings, +) + + +def test_command_context(): + cc = CommandContext() + assert isinstance(cc, CommandContext) + assert isinstance(cc.user_settings, UserSettings) + assert isinstance(cc.system_settings, SystemSettings) + + +def test_fields(): + fields = CommandContext.__fields__ + fields_keys = fields.keys() + + assert "user_settings" in fields_keys + assert "system_settings" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/model/test_credentials.py b/openbb_sdk/sdk/core/tests/app/model/test_credentials.py new file mode 100644 index 00000000000..ba635a2174f --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_credentials.py @@ -0,0 +1,23 @@ +from unittest.mock import patch + +import typing + + +def test_credentials(): + with patch( + target="openbb_core.app.model.credentials.get_provider_interface" + ) as mock_provider_interface: + mock_provider_interface.required_credentials = { + "benzinga_api_key": (typing.Optional[str], None), + "polygon_api_key": (typing.Optional[str], None), + } + from openbb_core.app.model.credentials import Credentials + + creds = Credentials( + benzinga_api_key="mock_benzinga_api_key", + polygon_api_key="mock_polygon_api_key", + ) + + assert isinstance(creds, Credentials) + assert creds.benzinga_api_key == "mock_benzinga_api_key" + assert creds.polygon_api_key == "mock_polygon_api_key" diff --git a/openbb_sdk/sdk/core/tests/app/model/test_defaults.py b/openbb_sdk/sdk/core/tests/app/model/test_defaults.py new file mode 100644 index 00000000000..e134eb36214 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_defaults.py @@ -0,0 +1,14 @@ +from openbb_core.app.model.defaults import Defaults + + +def test_defaultst(): + cc = Defaults(routes={"test": {"test": "test"}}) + assert isinstance(cc, Defaults) + assert cc.routes == {"test": {"test": "test"}} + + +def test_fields(): + fields = Defaults.__fields__ + fields_keys = fields.keys() + + assert "routes" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_journal.py b/openbb_sdk/sdk/core/tests/app/model/test_journal.py new file mode 100644 index 00000000000..2a90a627616 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_journal.py @@ -0,0 +1,19 @@ +from openbb_core.app.model.journal import Journal + + +def test_journal_query(): + journal_query = Journal( + name="mock_name", + journal_entry_id_list=["id_1", "id_2"], + ) + assert isinstance(journal_query, Journal) + assert journal_query.name == "mock_name" + assert journal_query.journal_entry_id_list == ["id_1", "id_2"] + + +def test_fields(): + fields = Journal.__fields__ + fields_keys = fields.keys() + + assert "name" in fields_keys + assert "journal_entry_id_list" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py b/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py new file mode 100644 index 00000000000..b2a60221f25 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py @@ -0,0 +1,32 @@ +from openbb_core.app.model.journal_entry import JournalEntry + +from unittest.mock import Mock + +import datetime + + +def test_journal_entry(): + journal = JournalEntry( + journal_id="mock_journal_id", + arguments={"mock_key": "mock_value"}, + duration=19, + output={}, + route="mock_route", + timestamp=datetime.datetime(2021, 1, 1), + alias_list=["mock_alias"], + ) + assert isinstance(journal, JournalEntry) + + +def test_fields(): + fields = JournalEntry.__fields__ + fields_keys = fields.keys() + + assert "id" in fields_keys + assert "journal_id" in fields_keys + assert "arguments" in fields_keys + assert "duration" in fields_keys + assert "output" in fields_keys + assert "route" in fields_keys + assert "timestamp" in fields_keys + assert "alias_list" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_journal_query.py b/openbb_sdk/sdk/core/tests/app/model/test_journal_query.py new file mode 100644 index 00000000000..0db1432beb0 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_journal_query.py @@ -0,0 +1,19 @@ +from openbb_core.app.model.journal_query import JournalQuery + + +def test_journal_query(): + journal_query = JournalQuery( + journal_entry_id="mock_journal_entry_id", + ignore_error_output=True, + ) + assert isinstance(journal_query, JournalQuery) + assert journal_query.journal_entry_id == "mock_journal_entry_id" + assert journal_query.ignore_error_output is True + + +def test_fields(): + fields = JournalQuery.__fields__ + fields_keys = fields.keys() + + assert "journal_entry_id" in fields_keys + assert "ignore_error_output" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_preferences.py b/openbb_sdk/sdk/core/tests/app/model/test_preferences.py new file mode 100644 index 00000000000..ca3bae14af0 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_preferences.py @@ -0,0 +1,6 @@ +from openbb_core.app.model.preferences import Preferences + + +def test_preferences(): + preferences = Preferences() + assert isinstance(preferences, Preferences) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_profile.py b/openbb_sdk/sdk/core/tests/app/model/test_profile.py new file mode 100644 index 00000000000..5c22d7ee73d --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_profile.py @@ -0,0 +1,6 @@ +from openbb_core.app.model.profile import Profile + + +def test_preferences(): + preferences = Profile() + assert isinstance(preferences, Profile) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py new file mode 100644 index 00000000000..8651782d528 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py @@ -0,0 +1,13 @@ +from openbb_core.app.model.user_settings import UserSettings + +from unittest.mock import MagicMock + + +def test_user_settings(): + settings = UserSettings( + credentials=MagicMock(), + profile=MagicMock(), + preferences=MagicMock(), + defaults=MagicMock(), + ) + assert isinstance(settings, UserSettings) From b1ecbc75e63d438eeb29efef0173fd6fd64c3853 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 13:08:14 +0100 Subject: [PATCH 55/62] add tests for command_output --- .../core/tests/app/model/charts/test_chart.py | 5 + .../tests/app/model/test_command_output.py | 183 ++++++++++++++++++ 2 files changed, 188 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py b/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py index 4e7f930eaea..176f5815701 100644 --- a/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py +++ b/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py @@ -48,3 +48,8 @@ def test_chart_config_validation(): assert chart.content == content assert chart.format == chart_format + + +def test_show(): + # TODO : add test after the function is properly refactored + pass diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py index e69de29bb2d..4a2dd998f1a 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py @@ -0,0 +1,183 @@ +from openbb_core.app.model.command_output import CommandOutput, OpenBBError, Chart + +import pytest +import pandas as pd + +from unittest.mock import patch, MagicMock + + +def test_command_output(): + co = CommandOutput() + assert isinstance(co, CommandOutput) + + +def test_fields(): + fields = CommandOutput.__fields__.keys() + + assert "results" in fields + assert "provider" in fields + assert "warnings" in fields + assert "error" in fields + assert "chart" in fields + + +def test_to_dataframe_no_results(): + co = CommandOutput() + with pytest.raises(Exception): + co.to_dataframe() + + +@pytest.mark.parametrize( + "results, expected_df", + [ + # Test case 1: Normal results with "date" column + ( + [{"date": "2023-07-30", "value": 10}, {"date": "2023-07-31", "value": 20}], + pd.DataFrame( + {"value": [10, 20]}, + index=pd.to_datetime(["2023-07-30", "2023-07-31"]), + ), + ), + # Test case 2: Normal results without "date" column + ( + [{"value": 10}, {"value": 20}], + pd.DataFrame({"value": [10, 20]}, index=pd.RangeIndex(start=0, stop=2)), + ), + # Test case 3: Empty results + ([], pd.DataFrame()), + # Test case 4: Results as None, should raise OpenBBError + (None, OpenBBError("Results not found.")), + ], +) +def test_to_dataframe(results, expected_df): + # Arrange + co = CommandOutput(results=results) + + # Act and Assert + if isinstance(expected_df, pd.DataFrame): + result = co.to_dataframe() + assert result.equals(expected_df) + else: + with pytest.raises(expected_df.__class__) as exc_info: + co.to_dataframe() + + assert str(exc_info.value) == str(expected_df) + + +@pytest.mark.parametrize( + "results, expected", + [ + # Test case 1: Normal results with "date" column + ( + [{"date": "2023-07-30", "value": 10}, {"date": "2023-07-31", "value": 20}], + { + "date": [pd.to_datetime("2023-07-30"), pd.to_datetime("2023-07-31")], + "value": [10, 20], + }, + ), + # Test case 2: Normal results without "date" column + ( + [{"value": 10}, {"value": 20}], + { + "value": [10, 20], + }, + ), + # Test case 3: Empty results + ([], {}), + ], +) +def test_to_dict(results, expected): + # Arrange + co = CommandOutput(results=results) + + # Act + result = co.to_dict() + result.pop("index", None) + + # Assert + assert result == expected + + +@patch("openbb_core.app.model.command_output.ChartingManager") +@patch("openbb_core.app.model.command_output.Chart") +def test_to_plotly_json_with_existing_chart(mock_chart, mock_charting_manager): + # Arrange + mock_instance = CommandOutput() + mock_instance.chart = Chart(content={"existing_chart_data": "some_data"}) + + # Act + result = mock_instance.to_plotly_json() + + # Assert + assert result == {"existing_chart_data": "some_data"} + + # Ensure ChartingManager and Chart constructors were not called + mock_charting_manager.assert_not_called() + mock_chart.assert_not_called() + + +@patch("openbb_core.app.model.command_output.CommandOutput.to_dataframe") +@patch("openbb_core.app.model.command_output.ChartingManager") +@patch("openbb_core.app.model.command_output.Chart") +def test_to_plotly_json_with_new_chart( + mock_chart, + mock_charting_manager, + mock_to_dataframe, +): + def get_mock_dataframe(): + data = { + "col1": [1, 2, 3], + "col2": ["a", "b", "c"], + "col3": [True, False, True], + } + + return pd.DataFrame(data) + + # Arrange + mock_instance = CommandOutput() + mock_charting_manager_instance = mock_charting_manager.return_value + mock_charting_manager_instance.to_plotly_json.return_value = { + "new_chart_data": "some_data" + } + mock_to_dataframe.return_value = get_mock_dataframe() + + # Act + result = mock_instance.to_plotly_json( + create_chart=True, chart_option="option_value" + ) + + # Assert + assert result == {"new_chart_data": "some_data"} + + # Ensure self.to_dataframe() was called + mock_to_dataframe.assert_called_once() + + # Ensure ChartingManager was called with the correct parameters + mock_charting_manager_instance.to_plotly_json.assert_called_once() + + # Ensure Chart constructor was called with the correct parameters + mock_chart.assert_called_once_with( + content={"new_chart_data": "some_data"}, format="plotly" + ) + + +def test_show_chart_exists(): + mock_instance = CommandOutput() + # Arrange + mock_instance.chart = MagicMock(spec=Chart) + + # Act + mock_instance.show() + + # Assert + mock_instance.chart.show.assert_called_once() + + +def test_show_chart_not_found(): + mock_instance = CommandOutput() + # Arrange + mock_instance.chart = None + + # Act and Assert + with pytest.raises(OpenBBError, match="Chart not found."): + mock_instance.show() From a6b2c1fac710d514da8ebf62d11b34dc95287272 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 14:04:25 +0100 Subject: [PATCH 56/62] ruff --- .../sdk/core/tests/app/model/test_command_context.py | 2 +- openbb_sdk/sdk/core/tests/app/model/test_command_output.py | 7 +++---- openbb_sdk/sdk/core/tests/app/model/test_credentials.py | 3 +-- openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py | 6 ++---- openbb_sdk/sdk/core/tests/app/model/test_user_settings.py | 4 ++-- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_context.py b/openbb_sdk/sdk/core/tests/app/model/test_command_context.py index 4d86b5bff78..38a346b2387 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_command_context.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_command_context.py @@ -1,7 +1,7 @@ from openbb_core.app.model.command_context import ( CommandContext, - UserSettings, SystemSettings, + UserSettings, ) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py index 4a2dd998f1a..82a9ea57322 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py @@ -1,9 +1,8 @@ -from openbb_core.app.model.command_output import CommandOutput, OpenBBError, Chart +from unittest.mock import MagicMock, patch -import pytest import pandas as pd - -from unittest.mock import patch, MagicMock +import pytest +from openbb_core.app.model.command_output import Chart, CommandOutput, OpenBBError def test_command_output(): diff --git a/openbb_sdk/sdk/core/tests/app/model/test_credentials.py b/openbb_sdk/sdk/core/tests/app/model/test_credentials.py index ba635a2174f..099142989d7 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_credentials.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_credentials.py @@ -1,6 +1,5 @@ -from unittest.mock import patch - import typing +from unittest.mock import patch def test_credentials(): diff --git a/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py b/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py index b2a60221f25..b1fc6ecd234 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py @@ -1,9 +1,7 @@ -from openbb_core.app.model.journal_entry import JournalEntry - -from unittest.mock import Mock - import datetime +from openbb_core.app.model.journal_entry import JournalEntry + def test_journal_entry(): journal = JournalEntry( diff --git a/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py index 8651782d528..85fe58e1375 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py @@ -1,7 +1,7 @@ -from openbb_core.app.model.user_settings import UserSettings - from unittest.mock import MagicMock +from openbb_core.app.model.user_settings import UserSettings + def test_user_settings(): settings = UserSettings( From a618e325ecaf3b789e557fecec8cf524daaab7ff Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 14:52:32 +0100 Subject: [PATCH 57/62] tests for system settings --- .../tests/app/model/test_system_settings.py | 202 ++++++++++++++++++ 1 file changed, 202 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py index e69de29bb2d..1f4d33a862c 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py @@ -0,0 +1,202 @@ +from openbb_core.app.model.system_settings import SystemSettings +import os +import pytest +from unittest.mock import patch + + +def test_system_settings(): + sys = SystemSettings() + assert isinstance(sys, SystemSettings) + + +def test_create_openbb_directory_directory_and_files_not_exist(tmpdir): + # Arrange + values = { + "openbb_directory": str(tmpdir.join("openbb")), + "user_settings_path": str(tmpdir.join("user_settings.json")), + "system_settings_path": str(tmpdir.join("system_settings.json")), + } + + # Act + SystemSettings.create_openbb_directory(values) + + # Assert + assert os.path.exists(values["openbb_directory"]) + assert os.path.exists(values["user_settings_path"]) + assert os.path.exists(values["system_settings_path"]) + + +def test_create_openbb_directory_directory_exists_user_settings_missing(tmpdir): + # Arrange + values = { + "openbb_directory": str(tmpdir.join("openbb")), + "user_settings_path": str(tmpdir.join("user_settings.json")), + "system_settings_path": str(tmpdir.join("system_settings.json")), + } + + # Create the openbb directory + os.makedirs(values["openbb_directory"]) + + # Act + SystemSettings.create_openbb_directory(values) + + # Assert + assert os.path.exists(values["openbb_directory"]) + assert os.path.exists(values["user_settings_path"]) + assert os.path.exists(values["system_settings_path"]) + + +def test_create_openbb_directory_directory_exists_system_settings_missing(tmpdir): + # Arrange + values = { + "openbb_directory": str(tmpdir.join("openbb")), + "user_settings_path": str(tmpdir.join("user_settings.json")), + "system_settings_path": str(tmpdir.join("system_settings.json")), + } + + # Create the openbb directory + os.makedirs(values["openbb_directory"]) + + # Create the user_settings.json file + with open(values["user_settings_path"], "w") as f: + f.write("{}") + + # Act + SystemSettings.create_openbb_directory(values) + + # Assert + assert os.path.exists(values["openbb_directory"]) + assert os.path.exists(values["user_settings_path"]) + assert os.path.exists(values["system_settings_path"]) + + +@pytest.mark.parametrize( + "values, expected_handlers", + [ + # Test case: test_mode is True, logging_suppress is True + ( + { + "test_mode": True, + "logging_suppress": True, + "log_collect": True, + "logging_handlers": [], + }, + [], + ), + # Test case: test_mode is False, logging_suppress is True + ( + { + "test_mode": False, + "logging_suppress": True, + "log_collect": True, + "logging_handlers": [], + }, + [], + ), + # Test case: test_mode is False, logging_suppress is False, log_collect is True, + # and "posthog" handler is not present in logging_handlers + ( + { + "test_mode": False, + "logging_suppress": False, + "log_collect": True, + "logging_handlers": ["file", "console"], + }, + ["file", "console", "posthog"], + ), + # Test case: test_mode is False, logging_suppress is False, log_collect is True, + # and "posthog" handler is already present in logging_handlers + ( + { + "test_mode": False, + "logging_suppress": False, + "log_collect": True, + "logging_handlers": ["file", "console", "posthog"], + }, + ["file", "console", "posthog"], + ), + ], +) +def test_validate_posthog_handler(values, expected_handlers): + # Act + result = SystemSettings.validate_posthog_handler(values) + + # Assert + assert result["logging_handlers"] == expected_handlers + + +@pytest.mark.parametrize( + "handlers, valid", + [ + # Test case: Valid handlers + (["stdout", "file", "noop"], True), + # Test case: Invalid handler + (["stdout", "invalid_handler", "file"], False), + # Test case: Empty list of handlers + ([], True), + # Test case: Repeated valid handlers + (["stdout", "stderr", "stdout", "noop", "stderr"], True), + ], +) +def test_validate_logging_handlers(handlers, valid): + # Act and Assert + if valid: + assert SystemSettings.validate_logging_handlers(handlers) == handlers + else: + with pytest.raises(ValueError, match="Invalid logging handler"): + SystemSettings.validate_logging_handlers(handlers) + + +@pytest.mark.parametrize( + "commit_hash, expected_result", + [ + # Test case: Valid commit hash provided + ("1234567890", "1234567890"), + # Test case: Empty commit hash, mocked get_commit_hash returns "abcdef1234" + ("", "abcdef1234"), + ], +) +def test_validate_commit_hash(commit_hash, expected_result): + with patch( + "openbb_core.app.model.system_settings.get_commit_hash", + return_value="abcdef1234", + ): + # Act + result = SystemSettings.validate_commit_hash(commit_hash) + + # Assert + assert result == expected_result + + +@patch("openbb_core.app.model.system_settings.get_branch", return_value="main") +@pytest.mark.parametrize( + "branch, commit_hash, expected_branch", + [ + # Test case: Empty branch, non-empty commit hash + ("", "abcdef1234", "main"), + # Test case: Non-empty branch, non-empty commit hash + ("feature-branch", "abcdef1234", "feature-branch"), + # Test case: Empty branch, empty commit hash + ("", "", ""), + # Test case: Non-empty branch, empty commit hash + ("feature-branch", "", "feature-branch"), + ], +) +def test_validate_branch(mock_get_branch, branch, commit_hash, expected_branch): + # Arrange + values = { + "logging_branch": branch, + "logging_commit_hash": commit_hash, + } + + # Act + result = SystemSettings.validate_branch(values) + + # Assert + assert result["logging_branch"] == expected_branch + + # Ensure that get_branch was called with the correct commit_hash + if not branch and commit_hash: + mock_get_branch.assert_called_once_with(commit_hash) + else: + mock_get_branch.assert_not_called() From a7584c8a3d2398f662b01ad281deb07198bf5799 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 15:01:29 +0100 Subject: [PATCH 58/62] ruff --- openbb_sdk/sdk/core/tests/app/model/test_system_settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py index 1f4d33a862c..a34b124a24c 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py @@ -1,8 +1,9 @@ -from openbb_core.app.model.system_settings import SystemSettings import os -import pytest from unittest.mock import patch +import pytest +from openbb_core.app.model.system_settings import SystemSettings + def test_system_settings(): sys = SystemSettings() From 35dd4ec3f188ef82ef147420ad92b2f9fa8ca08a Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 15:44:12 +0100 Subject: [PATCH 59/62] black --- openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py index 45233ce1c59..1995a8adbe0 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py @@ -1,7 +1,6 @@ # TODO : add tests once the code is fixed - def test_get_commit_hash(): pass From faf4837457abd1384d54a50bbb4fbbb5f6cf9e65 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Wed, 2 Aug 2023 06:28:15 +0100 Subject: [PATCH 60/62] tests for repository/abstract --- .../abstract/test_access_token_repository.py | 56 +++++++++++++++++ .../abstract/test_journal_entry_repository.py | 56 +++++++++++++++++ .../abstract/test_journal_repository.py | 56 +++++++++++++++++ .../repository/abstract/test_repository.py | 56 +++++++++++++++++ .../abstract/test_user_settings_repository.py | 63 +++++++++++++++++++ .../mongodb/test_access_token_repository.py | 19 ++++++ 6 files changed, 306 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/app/repository/abstract/test_access_token_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/abstract/test_journal_entry_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/abstract/test_journal_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/abstract/test_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/abstract/test_user_settings_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/mongodb/test_access_token_repository.py diff --git a/openbb_sdk/sdk/core/tests/app/repository/abstract/test_access_token_repository.py b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_access_token_repository.py new file mode 100644 index 00000000000..626063a5224 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_access_token_repository.py @@ -0,0 +1,56 @@ +from typing import Any, List, Optional, Tuple, TypeVar + +from openbb_core.app.repository.abstract.access_token_repository import ( + AccessTokenRepository, +) +from pydantic import BaseModel + +T = TypeVar("T", bound=BaseModel) + + +def test_journal_entry_repository(): + class TestAccessTokenRepository(AccessTokenRepository): + def __init__(self, test_arg_1, test_arg_2): + self.test_arg_1 = test_arg_1 + self.test_arg_2 = test_arg_2 + super().__init__() + + @property + def collection_name(self): + return "test_collection" + + def create(self, model): + pass + + @property + def database_name(self): + return "test_database" + + def delete(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def delete_all(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def read( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def read_all( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def update(self, model: T): + pass + + def mock_method(self): + return self.test_arg_1, self.test_arg_2 + + jr = TestAccessTokenRepository("xpto_1", "xpto_2") + assert isinstance(jr, AccessTokenRepository) diff --git a/openbb_sdk/sdk/core/tests/app/repository/abstract/test_journal_entry_repository.py b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_journal_entry_repository.py new file mode 100644 index 00000000000..23c3d2240b3 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_journal_entry_repository.py @@ -0,0 +1,56 @@ +from typing import Any, List, Optional, Tuple, TypeVar + +from openbb_core.app.repository.abstract.journal_entry_repository import ( + JournalEntryRepository, +) +from pydantic import BaseModel + +T = TypeVar("T", bound=BaseModel) + + +def test_journal_entry_repository(): + class TestJournalEntryRepository(JournalEntryRepository): + def __init__(self, test_arg_1, test_arg_2): + self.test_arg_1 = test_arg_1 + self.test_arg_2 = test_arg_2 + super().__init__() + + @property + def collection_name(self): + return "test_collection" + + def create(self, model): + pass + + @property + def database_name(self): + return "test_database" + + def delete(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def delete_all(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def read( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def read_all( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def update(self, model: T): + pass + + def mock_method(self): + return self.test_arg_1, self.test_arg_2 + + jr = TestJournalEntryRepository("xpto_1", "xpto_2") + assert isinstance(jr, JournalEntryRepository) diff --git a/openbb_sdk/sdk/core/tests/app/repository/abstract/test_journal_repository.py b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_journal_repository.py new file mode 100644 index 00000000000..072abd9f57d --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_journal_repository.py @@ -0,0 +1,56 @@ +from typing import Any, List, Optional, Tuple, TypeVar + +from openbb_core.app.repository.abstract.journal_repository import ( + JournalRepository, +) +from pydantic import BaseModel + +T = TypeVar("T", bound=BaseModel) + + +def test_journal_repository(): + class TestJournalRepository(JournalRepository): + def __init__(self, test_arg_1, test_arg_2): + self.test_arg_1 = test_arg_1 + self.test_arg_2 = test_arg_2 + super().__init__() + + @property + def collection_name(self): + return "test_collection" + + def create(self, model): + pass + + @property + def database_name(self): + return "test_database" + + def delete(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def delete_all(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def read( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def read_all( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def update(self, model: T): + pass + + def mock_method(self): + return self.test_arg_1, self.test_arg_2 + + jr = TestJournalRepository("xpto_1", "xpto_2") + assert isinstance(jr, JournalRepository) diff --git a/openbb_sdk/sdk/core/tests/app/repository/abstract/test_repository.py b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_repository.py new file mode 100644 index 00000000000..3ebf1de7d6d --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_repository.py @@ -0,0 +1,56 @@ +from typing import Any, List, Optional, Tuple, TypeVar + +from openbb_core.app.repository.abstract.repository import ( + Repository, +) +from pydantic import BaseModel + +T = TypeVar("T", bound=BaseModel) + + +def test_repository(): + class TestRepository(Repository): + def __init__(self, test_arg_1, test_arg_2): + self.test_arg_1 = test_arg_1 + self.test_arg_2 = test_arg_2 + super().__init__() + + @property + def collection_name(self): + return "test_collection" + + def create(self, model): + pass + + @property + def database_name(self): + return "test_database" + + def delete(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def delete_all(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def read( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def read_all( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def update(self, model: T): + pass + + def mock_method(self): + return self.test_arg_1, self.test_arg_2 + + jr = TestRepository("xpto_1", "xpto_2") + assert isinstance(jr, Repository) diff --git a/openbb_sdk/sdk/core/tests/app/repository/abstract/test_user_settings_repository.py b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_user_settings_repository.py new file mode 100644 index 00000000000..e310a275b83 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/repository/abstract/test_user_settings_repository.py @@ -0,0 +1,63 @@ +from typing import Any, List, Optional, Tuple, TypeVar + +from openbb_core.app.repository.abstract.user_settings_repository import ( + UserSettingsRepository, +) +from pydantic import BaseModel + +T = TypeVar("T", bound=BaseModel) + + +def test_journal_entry_repository(): + class TestUserSettingsRepository(UserSettingsRepository): + def __init__(self, test_arg_1, test_arg_2): + self.test_arg_1 = test_arg_1 + self.test_arg_2 = test_arg_2 + super().__init__() + + @property + def collection_name(self): + return "test_collection" + + def create(self, model): + pass + + @property + def database_name(self): + return "test_database" + + def delete(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def delete_all(self, filter_list: Optional[List[Tuple[str, Any]]] = None): + pass + + def read( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def read_all( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + def update(self, model: T): + pass + + def mock_method(self): + return self.test_arg_1, self.test_arg_2 + + def read_by_profile( + self, + field_list: Optional[List[str]] = None, + filter_list: Optional[List[Tuple[str, Any]]] = None, + ): + pass + + jr = TestUserSettingsRepository("xpto_1", "xpto_2") + assert isinstance(jr, UserSettingsRepository) diff --git a/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_access_token_repository.py b/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_access_token_repository.py new file mode 100644 index 00000000000..2300f71b6f6 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_access_token_repository.py @@ -0,0 +1,19 @@ +from unittest.mock import patch + +from openbb_core.app.repository.mongodb.access_token_repository import ( + AccessTokenRepository, +) + + +@patch("openbb_core.app.repository.mongodb.access_token_repository.MongoClient") +def test_access_token_repository(mock_mongo_client): + atr = AccessTokenRepository( + client=mock_mongo_client, + collection_name="collection_name", + database_name="database_name", + ) + + assert isinstance(atr, AccessTokenRepository) + assert atr.client == mock_mongo_client + assert atr.collection_name == "collection_name" + assert atr.database_name == "database_name" From b7fecb80e833d8872287e870f2cde9a1c7a90cf6 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Wed, 2 Aug 2023 06:30:39 +0100 Subject: [PATCH 61/62] placeholders for other repository tests --- .../core/tests/app/repository/base/test_in_memory_repository.py | 0 .../sdk/core/tests/app/repository/base/test_mongodb_repository.py | 0 .../app/repository/in_memory/test_access_token_repository.py | 0 .../app/repository/in_memory/test_journal_entry_repository.py | 0 .../tests/app/repository/in_memory/test_journal_repository.py | 0 .../app/repository/in_memory/test_user_settings_repository.py | 0 .../tests/app/repository/mongodb/test_journal_entry_repository.py | 0 .../core/tests/app/repository/mongodb/test_journal_repository.py | 0 .../tests/app/repository/mongodb/test_user_settings_repository.py | 0 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/repository/base/test_in_memory_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/base/test_mongodb_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/in_memory/test_access_token_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/in_memory/test_journal_entry_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/in_memory/test_journal_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/in_memory/test_user_settings_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/mongodb/test_journal_entry_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/mongodb/test_journal_repository.py create mode 100644 openbb_sdk/sdk/core/tests/app/repository/mongodb/test_user_settings_repository.py diff --git a/openbb_sdk/sdk/core/tests/app/repository/base/test_in_memory_repository.py b/openbb_sdk/sdk/core/tests/app/repository/base/test_in_memory_repository.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/repository/base/test_mongodb_repository.py b/openbb_sdk/sdk/core/tests/app/repository/base/test_mongodb_repository.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/repository/in_memory/test_access_token_repository.py b/openbb_sdk/sdk/core/tests/app/repository/in_memory/test_access_token_repository.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/repository/in_memory/test_journal_entry_repository.py b/openbb_sdk/sdk/core/tests/app/repository/in_memory/test_journal_entry_repository.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/repository/in_memory/test_journal_repository.py b/openbb_sdk/sdk/core/tests/app/repository/in_memory/test_journal_repository.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/repository/in_memory/test_user_settings_repository.py b/openbb_sdk/sdk/core/tests/app/repository/in_memory/test_user_settings_repository.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_journal_entry_repository.py b/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_journal_entry_repository.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_journal_repository.py b/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_journal_repository.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_user_settings_repository.py b/openbb_sdk/sdk/core/tests/app/repository/mongodb/test_user_settings_repository.py new file mode 100644 index 00000000000..e69de29bb2d From 6c702a3ed0fef3a56a354ef59210e0b7e4e74da7 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 7 Aug 2023 21:56:27 +0200 Subject: [PATCH 62/62] Fix some failing tests --- .../tests/app/static/test_package_builder.py | 6 +- .../core/tests/app/test_provider_interface.py | 17 +-- .../sdk/core/tests/test_provider_interface.py | 100 ------------------ 3 files changed, 4 insertions(+), 119 deletions(-) delete mode 100644 openbb_sdk/sdk/core/tests/test_provider_interface.py diff --git a/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py b/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py index e922fa1cf3a..659061194a2 100644 --- a/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py @@ -3,7 +3,6 @@ from dataclasses import dataclass from inspect import _empty -from typing import Annotated import pytest from openbb_core.app.static.package_builder import ( @@ -17,6 +16,7 @@ from openbb_core.app.static.package_builder import ( PathHandler, ) from pydantic import Field +from typing_extensions import Annotated @pytest.fixture(scope="module") @@ -395,7 +395,7 @@ def test_clean_path(path_handler): def test_build_module_name(path_handler): """Test build module name.""" module_name = path_handler.build_module_name(path="") - assert module_name == "__commands__" + assert module_name == "__extensions__" module_name = path_handler.build_module_name(path="/stocks/load") assert module_name == "stocks_load" @@ -404,7 +404,7 @@ def test_build_module_name(path_handler): def test_build_module_class(path_handler): """Test build module class.""" module_class = path_handler.build_module_class(path="") - assert module_class == "Commands" + assert module_class == "Extensions" module_class = path_handler.build_module_class(path="/stocks/load") assert module_class == "CLASS_stocks_load" diff --git a/openbb_sdk/sdk/core/tests/app/test_provider_interface.py b/openbb_sdk/sdk/core/tests/app/test_provider_interface.py index e61fdda19ca..56483d23571 100644 --- a/openbb_sdk/sdk/core/tests/app/test_provider_interface.py +++ b/openbb_sdk/sdk/core/tests/app/test_provider_interface.py @@ -5,7 +5,6 @@ import pytest from openbb_core.app.provider_interface import ( ProviderChoices, ProviderInterface, - ProviderRegistry, get_provider_interface, ) @@ -37,7 +36,7 @@ def test_map(provider_interface): def test_required_credentials(provider_interface): """Test required credentials.""" required_credentials = provider_interface.required_credentials - assert isinstance(required_credentials, dict) + assert isinstance(required_credentials, list) assert len(required_credentials) > 0 @@ -64,14 +63,6 @@ def test_data(provider_interface): assert "StockEOD" in data -def test_merged_data(provider_interface): - """Test merged data.""" - merged_data = provider_interface.merged_data - assert isinstance(merged_data, dict) - assert len(merged_data) > 0 - assert "StockEOD" in merged_data - - def test_providers_literal(provider_interface): """Test providers literal.""" providers_literal = provider_interface.providers_literal @@ -92,9 +83,3 @@ def test_models(provider_interface): assert isinstance(models, list) assert len(models) > 0 assert "StockEOD" in models - - -def test_build_registry(provider_interface): - """Test build registry.""" - build_registry = provider_interface.build_registry() - assert isinstance(build_registry, ProviderRegistry) diff --git a/openbb_sdk/sdk/core/tests/test_provider_interface.py b/openbb_sdk/sdk/core/tests/test_provider_interface.py deleted file mode 100644 index e61fdda19ca..00000000000 --- a/openbb_sdk/sdk/core/tests/test_provider_interface.py +++ /dev/null @@ -1,100 +0,0 @@ -"""Test provider interface.""" -# pylint: disable=redefined-outer-name - -import pytest -from openbb_core.app.provider_interface import ( - ProviderChoices, - ProviderInterface, - ProviderRegistry, - get_provider_interface, -) - - -@pytest.fixture(scope="module") -def provider_interface(): - """Set up provider_interface.""" - return ProviderInterface() - - -def test_init(provider_interface): - """Test init.""" - assert provider_interface - - -def test_get_provider_interface(): - """Test get provider interface.""" - assert isinstance(get_provider_interface(), ProviderInterface) - - -def test_map(provider_interface): - """Test map.""" - provider_interface_map = provider_interface.map - assert isinstance(provider_interface_map, dict) - assert len(provider_interface_map) > 0 - assert "StockEOD" in provider_interface_map - - -def test_required_credentials(provider_interface): - """Test required credentials.""" - required_credentials = provider_interface.required_credentials - assert isinstance(required_credentials, dict) - assert len(required_credentials) > 0 - - -def test_model_providers(provider_interface): - """Test model providers.""" - model_providers = provider_interface.model_providers - assert isinstance(model_providers, dict) - assert len(model_providers) > 0 - - -def test_params(provider_interface): - """Test params.""" - params = provider_interface.params - assert isinstance(params, dict) - assert len(params) > 0 - assert "StockEOD" in params - - -def test_data(provider_interface): - """Test data.""" - data = provider_interface.data - assert isinstance(data, dict) - assert len(data) > 0 - assert "StockEOD" in data - - -def test_merged_data(provider_interface): - """Test merged data.""" - merged_data = provider_interface.merged_data - assert isinstance(merged_data, dict) - assert len(merged_data) > 0 - assert "StockEOD" in merged_data - - -def test_providers_literal(provider_interface): - """Test providers literal.""" - providers_literal = provider_interface.providers_literal - assert isinstance(type(providers_literal), type) - assert len(providers_literal.__args__) > 0 - assert "openbb" not in providers_literal.__args__ - - -def test_provider_choices(provider_interface): - """Test provider choices.""" - provider_choices = provider_interface.provider_choices - assert isinstance(provider_choices, type(ProviderChoices)) - - -def test_models(provider_interface): - """Test models.""" - models = provider_interface.models - assert isinstance(models, list) - assert len(models) > 0 - assert "StockEOD" in models - - -def test_build_registry(provider_interface): - """Test build registry.""" - build_registry = provider_interface.build_registry() - assert isinstance(build_registry, ProviderRegistry)