summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrique Joaquim <henriquecjoaquim@gmail.com>2024-05-20 19:05:32 +0100
committerGitHub <noreply@github.com>2024-05-20 18:05:32 +0000
commite29223737497e8b9d48c1b71a2fe7998b12ef1c0 (patch)
treee4cd1f8d6598d3d0a9678f5275e7efde3c9fa4c3
parent6fd00e7876f913494876ae4f857725f89aacfc34 (diff)
[Feature] Deprecate `etf.holdings_performance` endpoint (#6441)
* ignore the env created on the dev container (which lives inside the project folder) * broken urls * remove endpoint * empty file * deprecate * ruff
-rw-r--r--.gitignore3
-rw-r--r--cli/README.md4
-rw-r--r--openbb_platform/core/openbb_core/provider/standard_models/etf_holdings_performance.py14
-rw-r--r--openbb_platform/core/tests/app/test_charting_manager.py1
-rw-r--r--openbb_platform/core/tests/app/test_deprecation.py4
-rw-r--r--openbb_platform/extensions/etf/integration/test_etf_api.py19
-rw-r--r--openbb_platform/extensions/etf/integration/test_etf_python.py18
-rw-r--r--openbb_platform/extensions/etf/openbb_etf/etf_router.py22
-rw-r--r--openbb_platform/providers/fmp/openbb_fmp/__init__.py2
-rw-r--r--openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings_performance.py77
-rw-r--r--openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_etf_holdings_performance_fetcher.yaml318
-rw-r--r--openbb_platform/providers/fmp/tests/test_fmp_fetchers.py11
12 files changed, 5 insertions, 488 deletions
diff --git a/.gitignore b/.gitignore
index a16c29ef0d3..d83e60b4d3f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,3 +52,6 @@ cli/openbb_cli/assets/styles/user/hub.richstyle.json
# Platform
openbb_platform/openbb/package/*
+
+# Dev Container env
+obb/*
diff --git a/cli/README.md b/cli/README.md
index 8a83b426807..150fad257df 100644
--- a/cli/README.md
+++ b/cli/README.md
@@ -14,7 +14,7 @@ The OpenBB Platform CLI is a command line interface that wraps [OpenBB Platform]
It offers a convenient way to interact with the OpenBB Platform and its extensions, as well as automate data collection via OpenBB Routine Scripts.
-Find the most complete documentation, examples, and usage guides for the OpenBB Platform CLI [here](https://my.openbb.co/app/cli).
+Find the most complete documentation, examples, and usage guides for the OpenBB Platform CLI [here](https://docs.openbb.co/cli).
## Installation
@@ -24,7 +24,7 @@ The command below provides access to the all the available OpenBB extensions beh
pip install openbb-cli
```
-> Note: Find the most complete installation hints and tips [here](https://my.openbb.co/app/cli/installation).
+> Note: Find the most complete installation hints and tips [here](https://docs.openbb.co/cli/installation).
After the installation is complete, you can deploy the OpenBB Platform CLI by running the following command:
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/etf_holdings_performance.py b/openbb_platform/core/openbb_core/provider/standard_models/etf_holdings_performance.py
deleted file mode 100644
index e081c89497b..00000000000
--- a/openbb_platform/core/openbb_core/provider/standard_models/etf_holdings_performance.py
+++ /dev/null
@@ -1,14 +0,0 @@
-"""ETF Holdings Performance Standard Model."""
-
-from .recent_performance import (
- RecentPerformanceData,
- RecentPerformanceQueryParams,
-)
-
-
-class ETFHoldingsPerformanceQueryParams(RecentPerformanceQueryParams):
- """ETF Holdings Performance Query."""
-
-
-class ETFHoldingsPerformanceData(RecentPerformanceData):
- """ETF Holdings Performance Data."""
diff --git a/openbb_platform/core/tests/app/test_charting_manager.py b/openbb_platform/core/tests/app/test_charting_manager.py
deleted file mode 100644
index 06b5fb09691..00000000000
--- a/openbb_platform/core/tests/app/test_charting_manager.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Test ChartingManager."""
diff --git a/openbb_platform/core/tests/app/test_deprecation.py b/openbb_platform/core/tests/app/test_deprecation.py
index 5bfebed99f8..bca6c5381ae 100644
--- a/openbb_platform/core/tests/app/test_deprecation.py
+++ b/openbb_platform/core/tests/app/test_deprecation.py
@@ -2,7 +2,6 @@
import unittest
-import pytest
from openbb_core.app.static.package_builder import PathHandler
from openbb_core.app.version import VERSION, get_major_minor
@@ -10,9 +9,6 @@ from openbb_core.app.version import VERSION, get_major_minor
class DeprecatedCommandsTest(unittest.TestCase):
"""Test deprecated commands."""
- @pytest.mark.skip(
- "We forgot to deprecate /etf/holdings_performance. Check this endpoint next release."
- )
def test_deprecated_commands(self):
"""Test deprecated commands."""
current_major_minor = get_major_minor(VERSION)
diff --git a/openbb_platform/extensions/etf/integration/test_etf_api.py b/openbb_platform/extensions/etf/integration/test_etf_api.py
index 04029f6d6d9..89254a95d58 100644
--- a/openbb_platform/extensions/etf/integration/test_etf_api.py
+++ b/openbb_platform/extensions/etf/integration/test_etf_api.py
@@ -466,25 +466,6 @@ def test_etf_discovery_active(params, headers):
@parametrize(
"params",
[
- ({"symbol": "SPY", "provider": "fmp"}),
- ({"symbol": "QQQ", "provider": "fmp"}),
- ],
-)
-@pytest.mark.integration
-def test_etf_holdings_performance(params, headers):
- """Test the ETF holdings performance endpoint."""
- params = {p: v for p, v in params.items() if v}
-
- query_str = get_querystring(params, [])
- url = f"http://0.0.0.0:8000/api/v1/etf/holdings_performance?{query_str}"
- result = requests.get(url, headers=headers, timeout=10)
- assert isinstance(result, requests.Response)
- assert result.status_code == 200
-
-
-@parametrize(
- "params",
- [
({"symbol": "SPY,VOO,QQQ,IWM,IWN", "provider": "fmp"}),
],
)
diff --git a/openbb_platform/extensions/etf/integration/test_etf_python.py b/openbb_platform/extensions/etf/integration/test_etf_python.py
index ed8ba2f99ce..40185e7631e 100644
--- a/openbb_platform/extensions/etf/integration/test_etf_python.py
+++ b/openbb_platform/extensions/etf/integration/test_etf_python.py
@@ -449,24 +449,6 @@ def test_etf_discovery_active(params, obb):
@parametrize(
"params",
[
- ({"symbol": "SPY", "provider": "fmp"}),
- ({"symbol": "QQQ", "provider": "fmp"}),
- ],
-)
-@pytest.mark.integration
-def test_etf_holdings_performance(params, obb):
- """Test the ETF holdings performance endpoint."""
- params = {p: v for p, v in params.items() if v}
-
- result = obb.etf.holdings_performance(**params)
- assert result
- assert isinstance(result, OBBject)
- assert len(result.results) > 0
-
-
-@parametrize(
- "params",
- [
({"symbol": "SPY,VOO,QQQ,IWM,IWN", "provider": "fmp"}),
],
)
diff --git a/openbb_platform/extensions/etf/openbb_etf/etf_router.py b/openbb_platform/extensions/etf/openbb_etf/etf_router.py
index 52c367864fe..b74645dedac 100644
--- a/openbb_platform/extensions/etf/openbb_etf/etf_router.py
+++ b/openbb_platform/extensions/etf/openbb_etf/etf_router.py
@@ -1,6 +1,5 @@
"""ETF Router."""
-from openbb_core.app.deprecation import OpenBBDeprecationWarning
from openbb_core.app.model.command_context import CommandContext
from openbb_core.app.model.example import APIEx
from openbb_core.app.model.obbject import OBBject
@@ -172,27 +171,6 @@ async def holdings_date(
@router.command(
- model="EtfHoldingsPerformance",
- deprecated=True,
- deprecation=OpenBBDeprecationWarning(
- message="This endpoint is deprecated; pass a list of holdings symbols directly to"
- + " `/equity/price/performance` instead.",
- since=(4, 1),
- expected_removal=(4, 2),
- ),
- examples=[APIEx(parameters={"symbol": "XLK", "provider": "fmp"})],
-)
-async def holdings_performance(
- cc: CommandContext,
- provider_choices: ProviderChoices,
- standard_params: StandardParams,
- extra_params: ExtraParams,
-) -> OBBject:
- """Get the recent price performance of each ticker held in the ETF."""
- return await OBBject.from_query(Query(**locals()))
-
-
-@router.command(
model="EtfEquityExposure",
examples=[
APIEx(parameters={"symbol": "MSFT", "provider": "fmp"}),
diff --git a/openbb_platform/providers/fmp/openbb_fmp/__init__.py b/openbb_platform/providers/fmp/openbb_fmp/__init__.py
index 01f9a5019e5..cb98280528a 100644
--- a/openbb_platform/providers/fmp/openbb_fmp/__init__.py
+++ b/openbb_platform/providers/fmp/openbb_fmp/__init__.py
@@ -34,7 +34,6 @@ from openbb_fmp.models.etf_countries import FMPEtfCountriesFetcher
from openbb_fmp.models.etf_equity_exposure import FMPEtfEquityExposureFetcher
from openbb_fmp.models.etf_holdings import FMPEtfHoldingsFetcher
from openbb_fmp.models.etf_holdings_date import FMPEtfHoldingsDateFetcher
-from openbb_fmp.models.etf_holdings_performance import FMPEtfHoldingsPerformanceFetcher
from openbb_fmp.models.etf_info import FMPEtfInfoFetcher
from openbb_fmp.models.etf_search import FMPEtfSearchFetcher
from openbb_fmp.models.etf_sectors import FMPEtfSectorsFetcher
@@ -102,7 +101,6 @@ stock market information (news, currencies, and stock prices).""",
"EtfEquityExposure": FMPEtfEquityExposureFetcher,
"EtfHoldings": FMPEtfHoldingsFetcher,
"EtfHoldingsDate": FMPEtfHoldingsDateFetcher,
- "EtfHoldingsPerformance": FMPEtfHoldingsPerformanceFetcher,
"EtfInfo": FMPEtfInfoFetcher,
"EtfPricePerformance": FMPPricePerformanceFetcher,
"EtfSearch": FMPEtfSearchFetcher,
diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings_performance.py b/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings_performance.py
deleted file mode 100644
index 0a6f18b8339..00000000000
--- a/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings_performance.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""FMP ETF Holdings Performance Model."""
-
-# pylint: disable=unused-argument
-
-from typing import Any, Dict, List, Optional
-
-from openbb_core.provider.abstract.fetcher import Fetcher
-from openbb_fmp.models.etf_holdings import FMPEtfHoldingsFetcher
-from openbb_fmp.models.price_performance import (
- FMPPricePerformanceData,
- FMPPricePerformanceFetcher,
- FMPPricePerformanceQueryParams,
-)
-from pandas import DataFrame
-
-
-class FMPEtfHoldingsPerformanceQueryParams(FMPPricePerformanceQueryParams):
- """FMP ETF Holdings Performance Query."""
-
-
-class FMPEtfHoldingsPerformanceData(FMPPricePerformanceData):
- """FMP ETF Holdings Performance Data."""
-
-
-class FMPEtfHoldingsPerformanceFetcher(
- Fetcher[
- FMPEtfHoldingsPerformanceQueryParams,
- List[FMPEtfHoldingsPerformanceData],
- ]
-):
- """Transform the query, extract and transform the data from the FMP endpoints."""
-
- @staticmethod
- def transform_query(params: Dict[str, Any]) -> FMPEtfHoldingsPerformanceQueryParams:
- """Transform the query."""
- return FMPEtfHoldingsPerformanceQueryParams(**params)
-
- @staticmethod
- async def aextract_data(
- query: FMPEtfHoldingsPerformanceQueryParams,
- credentials: Optional[Dict[str, str]],
- **kwargs: Any,
- ) -> List[Dict]:
- """Return the raw data from the FMP endpoint."""
- # Get the holdings data
- holdings = await FMPEtfHoldingsFetcher().aextract_data(
- FMPEtfHoldingsFetcher.transform_query({"symbol": query.symbol}),
- credentials,
- **kwargs,
- )
- if holdings is None:
- raise RuntimeError(f"No holdings data found for {query.symbol}.")
- holdings_list = DataFrame(holdings).asset.unique().tolist()
- # Split into chunks of 500
- chunks = [holdings_list[i : i + 500] for i in range(0, len(holdings_list), 500)]
- # Get price performance for the holdings
- holdings_performance: List[Dict] = []
- for holding_chunk in chunks:
- holdings_str = (
- ",".join(holding_chunk) if len(holding_chunk) > 1 else holding_chunk[0]
- )
- _performance = await FMPPricePerformanceFetcher().aextract_data(
- FMPPricePerformanceFetcher.transform_query({"symbol": holdings_str}),
- credentials,
- **kwargs,
- )
- holdings_performance.extend(_performance)
- return holdings_performance
-
- @staticmethod
- def transform_data(
- query: FMPEtfHoldingsPerformanceQueryParams,
- data: List[Dict],
- **kwargs: Any,
- ) -> List[FMPEtfHoldingsPerformanceData]:
- """Return the transformed data."""
- return [FMPEtfHoldingsPerformanceData.model_validate(d) for d in data]
diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_etf_holdings_performance_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_etf_holdings_performance_fetcher.yaml
deleted file mode 100644
index 5f2bdcb6659..00000000000
--- a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_etf_holdings_performance_fetcher.yaml
+++ /dev/null
@@ -1,318 +0,0 @@
-interactions:
-- request:
- body: null
- headers:
- Accept:
- - application/json
- Accept-Encoding:
- - gzip, deflate
- Connection:
- - keep-alive
- method: GET
- uri: https://financialmodelingprep.com/api/v3/etf-holder/QQQ?apikey=MOCK_API_KEY
- response:
- body:
- string: !!binary |
- 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
- headers:
- Access-Control-Allow-Credentials:
- - 'true'
- Access-Control-Allow-Headers:
- - X-Requested-With, content-type, auth-token, Authorization, stripe-signature,
- APPS, publicauthkey, privateauthkey
- Access-Control-Allow-Methods:
- - GET, POST, OPTIONS
- Access-Control-Allow-Origin:
- - '*'
- Access-Control-Max-Age:
- - '3600'
- Connection:
- - keep-alive
- Content-Encoding:
- - gzip
- Content-Type:
- - application/json; charset=utf-8
- Date:
- - Wed, 17 Apr 2024 16:43:17 GMT
- Etag:
- - W/"5e32-2V5eXB4F7xydvsbJCpdYbUQZt7g"
- Server:
- - nginx/1.18.0 (Ubuntu)
- Transfer-Encoding:
- - chunked
- Vary:
- - Accept-Encoding
- X-Frame-Options:
- - SAMEORIGIN
- X-Powered-By:
- - Express
- status:
- code: 200
- message: OK
-- request:
- body: null
- headers:
- Accept:
- - application/json
- Accept-Encoding:
- - gzip, deflate
- Connection:
- - keep-alive
- method: GET
- uri: https://financialmodelingprep.com/api/v3/stock-price-change/MSFT,AAPL,NVDA,AMZN,META,AVGO,GOOGL,GOOG,COST,TSLA,NFLX,AMD,PEP,LIN,ADBE,CSCO,TMUS,QCOM,INTU,AMAT,CMCSA,INTC,TXN,AMGN,MU,ISRG,HON,LRCX,BKNG,VRTX,ADP,REGN,SBUX,ADI,KLAC,MDLZ,PANW,GILD,SNPS,ASML,CDNS,PDD,MAR,MELI,CSX,ABNB,CRWD,PYPL,CTAS,ORLY,PCAR,NXPI,CEG,MRVL,ROP,MNST,WDAY,CPRT,DXCM,DASH,FTNT,ADSK,ODFL,MCHP,ROST,PAYX,KHC,AEP,KDP,IDXX,LULU,AZN,FAST,MRNA,GEHC,DDOG,CHTR,FANG,EXC,TTD,CSGP,CTSH,EA,BKR,CDW,VRSK,CCEP,TEAM,XEL,ANSS,BIIB,ON,DLTR,GFS,ZS,MDB,TTWO,WBD,ILMN,WBA,SIRI?apikey=MOCK_API_KEY
- response:
- body:
- string: !!binary |
- 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