diff --git a/openbb_platform/core/openbb_core/provider/standard_models/historical_market_cap.py b/openbb_platform/core/openbb_core/provider/standard_models/historical_market_cap.py new file mode 100644 index 000000000000..ee722a0c8d72 --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/historical_market_cap.py @@ -0,0 +1,42 @@ +"""Historical Market Cap Model.""" + +from datetime import date as dateType +from typing import Optional, Union + +from pydantic import Field, field_validator + +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.query_params import QueryParams +from openbb_core.provider.utils.descriptions import ( + DATA_DESCRIPTIONS, + QUERY_DESCRIPTIONS, +) + + +class HistoricalMarketCapQueryParams(QueryParams): + """Historical Market Cap Query.""" + + symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", "")) + start_date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("start_date", "") + ) + end_date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("end_date", "") + ) + + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def to_upper(cls, v: str) -> str: + """Convert field to uppercase.""" + return v.upper() + + +class HistoricalMarketCapData(Data): + """Historical Market Cap Data.""" + + date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", "")) + symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", "")) + market_cap: Union[int, float] = Field( + description="Market capitalization of the security.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) diff --git a/openbb_platform/extensions/equity/integration/test_equity_api.py b/openbb_platform/extensions/equity/integration/test_equity_api.py index 176106f89b08..dbf243837eab 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_api.py +++ b/openbb_platform/extensions/equity/integration/test_equity_api.py @@ -2067,3 +2067,28 @@ def test_equity_compare_company_facts(params, headers): result = requests.get(url, headers=headers, timeout=10) assert isinstance(result, requests.Response) assert result.status_code == 200 + + +@parametrize( + "params", + [ + ( + { + "symbol": "AAPL,MSFT", + "start_date": None, + "end_date": None, + "provider": "fmp", + } + ) + ], +) +@pytest.mark.integration +def test_equity_historical_market_cap(params, headers): + """Test the equity historical market cap 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/equity/historical_market_cap?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 diff --git a/openbb_platform/extensions/equity/integration/test_equity_python.py b/openbb_platform/extensions/equity/integration/test_equity_python.py index 85405df2f2a4..e85540f3cab2 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_python.py +++ b/openbb_platform/extensions/equity/integration/test_equity_python.py @@ -1932,3 +1932,27 @@ def test_equity_compare_company_facts(params, obb): assert result assert isinstance(result, OBBject) assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ( + { + "symbol": "AAPL,MSFT", + "start_date": None, + "end_date": None, + "provider": "fmp", + } + ) + ], +) +@pytest.mark.integration +def test_equity_historical_market_cap(params, obb): + """Test the equity historical market cap endpoint.""" + params = {p: v for p, v in params.items() if v} + + result = obb.equity.historical_market_cap(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 diff --git a/openbb_platform/extensions/equity/openbb_equity/equity_router.py b/openbb_platform/extensions/equity/openbb_equity/equity_router.py index 1ba9b0215870..c34423cb2661 100644 --- a/openbb_platform/extensions/equity/openbb_equity/equity_router.py +++ b/openbb_platform/extensions/equity/openbb_equity/equity_router.py @@ -100,3 +100,17 @@ async def market_snapshots( ) -> OBBject: """Get an updated equity market snapshot. This includes price data for thousands of stocks.""" return await OBBject.from_query(Query(**locals())) + + +@router.command( + model="HistoricalMarketCap", + examples=[APIEx(parameters={"provider": "fmp", "symbol": "AAPL"})], +) +async def historical_market_cap( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject: + """Get the historical market cap of a ticker symbol.""" + return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/equity/openbb_equity/equity_views.py b/openbb_platform/extensions/equity/openbb_equity/equity_views.py index ab1b5247fb20..f52f11085749 100644 --- a/openbb_platform/extensions/equity/openbb_equity/equity_views.py +++ b/openbb_platform/extensions/equity/openbb_equity/equity_views.py @@ -30,3 +30,56 @@ def equity_price_performance( # noqa: PLR0912 from openbb_charting.charts.price_performance import price_performance return price_performance(**kwargs) + + @staticmethod + def equity_historical_market_cap( # noqa: PLR0912 + **kwargs, + ) -> Tuple["OpenBBFigure", Dict[str, Any]]: + """Equity Historical Market Cap Chart.""" + # pylint: disable=import-outside-toplevel + from openbb_charting.charts.generic_charts import line_chart + from openbb_core.app.utils import basemodel_to_df + from pandas import DataFrame + + title = kwargs.pop("title", "Historical Market Cap") + + data = DataFrame() + + if "data" in kwargs and isinstance(kwargs["data"], DataFrame): + data = kwargs["data"] + elif "data" in kwargs and isinstance(kwargs["data"], list): + data = basemodel_to_df(kwargs["data"], index=kwargs.get("index", "date")) # type: ignore + else: + data = basemodel_to_df( + kwargs["obbject_item"], + index=kwargs.get("index", "date"), # type: ignore + ) + + if "date" in data.columns: + data = data.set_index("date") + + if data.empty: + raise ValueError("Data is empty") + + df = data.pivot(columns="symbol", values="market_cap") + + scatter_kwargs = kwargs.pop("scatter_kwargs", {}) + + if "hovertemplate" not in scatter_kwargs: + scatter_kwargs["hovertemplate"] = "%{y}" + + ytital = kwargs.pop("ytitle", "Market Cap ($)") + y = kwargs.pop("y", df.columns.tolist()) + + fig = line_chart( + data=df, + title=title, + y=y, + ytitle=ytital, + same_axis=True, + scatter_kwargs=scatter_kwargs, + **kwargs, + ) + content = fig.show(external=True).to_plotly_json() + + return fig, content diff --git a/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py b/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py index bf94ec046214..1736d6d6dd39 100644 --- a/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py +++ b/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py @@ -600,9 +600,7 @@ def test_charting_technical_relative_rotation(params): ) data_query_str = get_querystring(data_params, []) data_url = f"http://0.0.0.0:8000/api/v1/equity/price/historical?{data_query_str}" - data_result = requests.get(data_url, headers=get_headers(), timeout=10).json()[ - "results" - ] + data_result = requests.get(data_url, headers=get_headers(), timeout=10).json()["results"] body = json.dumps({"data": data_result}) query_str = get_querystring(params, ["data"]) url = f"http://0.0.0.0:8000/api/v1/technical/relative_rotation?{query_str}" @@ -634,11 +632,7 @@ def test_charting_technical_relative_rotation(params): def test_charting_equity_price_performance(params, headers): """Test chart equity price performance.""" params = {p: v for p, v in params.items() if v} - body = ( - json.dumps( - {"extra_params": {"chart_params": {"limit": 4, "orientation": "h"}}} - ), - ) + body = (json.dumps({"extra_params": {"chart_params": {"limit": 4, "orientation": "h"}}}),) query_str = get_querystring(params, []) url = f"http://0.0.0.0:8000/api/v1/equity/price/performance?{query_str}" result = requests.get(url, headers=headers, timeout=10, json=body) @@ -702,11 +696,7 @@ def test_charting_etf_price_performance(params, headers): def test_charting_etf_holdings(params, headers): """Test chart etf holdings.""" params = {p: v for p, v in params.items() if v} - body = ( - json.dumps( - {"extra_params": {"chart_params": {"orientation": "v", "limit": 10}}} - ), - ) + body = (json.dumps({"extra_params": {"chart_params": {"orientation": "v", "limit": 10}}}),) query_str = get_querystring(params, []) url = f"http://0.0.0.0:8000/api/v1/etf/holdings?{query_str}" result = requests.get(url, headers=headers, timeout=10, json=body) @@ -831,3 +821,36 @@ def test_charting_derivatives_futures_curve(params, headers): assert chart assert not fig assert list(chart.keys()) == ["content", "format"] + + +@parametrize( + "params", + [ + ( + { + "provider": "fmp", + "symbol": "AAPL", + "start_date": "2024-01-01", + "end_date": "2024-06-30", + "chart": True, + } + ) + ], +) +@pytest.mark.integration +def test_charting_equity_historical_market_cap(params, headers): + """Test chart equity historical market cap.""" + params = {p: v for p, v in params.items() if v} + body = (json.dumps({"extra_params": {"chart_params": {"title": "test chart"}}}),) + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/equity/historical_market_cap?{query_str}" + result = requests.get(url, headers=headers, timeout=10, json=body) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] diff --git a/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py b/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py index 673f632be7e4..d37ae375d346 100644 --- a/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py +++ b/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py @@ -31,9 +31,7 @@ def get_equity_data(): symbol = "AAPL" provider = "fmp" - data["stocks_data"] = openbb.obb.equity.price.historical( - symbol=symbol, provider=provider - ).results + data["stocks_data"] = openbb.obb.equity.price.historical(symbol=symbol, provider=provider).results return data["stocks_data"] @@ -678,3 +676,28 @@ def test_charting_derivatives_futures_curve(params, obb): assert len(result.results) > 0 assert result.chart.content assert isinstance(result.chart.fig, OpenBBFigure) + + +@parametrize( + "params", + [ + ( + { + "provider": "fmp", + "symbol": "AAPL", + "start_date": "2024-01-01", + "end_date": "2024-06-30", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_equity_historical_market_cap(params, obb): + """Test chart equity historical market cap.""" + result = obb.equity.historical_market_cap(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + assert result.chart.content + assert isinstance(result.chart.fig, OpenBBFigure) diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json index 61dbb81be627..0e87d34433af 100644 --- a/openbb_platform/openbb/assets/reference.json +++ b/openbb_platform/openbb/assets/reference.json @@ -28001,6 +28001,109 @@ }, "model": "MarketSnapshots" }, + "/equity/historical_market_cap": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the historical market cap of a ticker symbol.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.historical_market_cap(provider='fmp', symbol='AAPL')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", + "default": "", + "optional": false, + "choices": null + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true, + "choices": null + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true, + "choices": null + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fmp.", + "default": null, + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[HistoricalMarketCap]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false, + "choices": null + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false, + "choices": null + }, + { + "name": "market_cap", + "type": "Union[int, float]", + "description": "Market capitalization of the security.", + "default": "", + "optional": false, + "choices": null + } + ], + "fmp": [] + }, + "model": "HistoricalMarketCap" + }, "/etf/search": { "deprecated": { "flag": null, diff --git a/openbb_platform/openbb/package/equity.py b/openbb_platform/openbb/package/equity.py index 9f137588060a..0f152422c7c1 100644 --- a/openbb_platform/openbb/package/equity.py +++ b/openbb_platform/openbb/package/equity.py @@ -1,5 +1,6 @@ ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### +import datetime from typing import List, Literal, Optional, Union from openbb_core.app.model.field import OpenBBField @@ -17,6 +18,7 @@ class ROUTER_equity(Container): /discovery /estimates /fundamental + historical_market_cap market_snapshots /ownership /price @@ -72,6 +74,94 @@ def fundamental(self): command_runner=self._command_runner ) + @exception_handler + @validate + def historical_market_cap( + self, + symbol: Annotated[ + Union[str, List[str]], + OpenBBField( + description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." + ), + ], + start_date: Annotated[ + Union[datetime.date, None, str], + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), + ] = None, + end_date: Annotated[ + Union[datetime.date, None, str], + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), + ] = None, + provider: Annotated[ + Optional[Literal["fmp"]], + OpenBBField( + description="The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fmp." + ), + ] = None, + **kwargs + ) -> OBBject: + """Get the historical market cap of a ticker symbol. + + Parameters + ---------- + symbol : Union[str, List[str]] + Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp. + start_date : Union[datetime.date, None, str] + Start date of the data, in YYYY-MM-DD format. + end_date : Union[datetime.date, None, str] + End date of the data, in YYYY-MM-DD format. + provider : Optional[Literal['fmp']] + The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fmp. + + Returns + ------- + OBBject + results : List[HistoricalMarketCap] + Serializable results. + provider : Optional[Literal['fmp']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra : Dict[str, Any] + Extra info. + + HistoricalMarketCap + ------------------- + date : date + The date of the data. + symbol : str + Symbol representing the entity requested in the data. + market_cap : Union[int, float] + Market capitalization of the security. + + Examples + -------- + >>> from openbb import obb + >>> obb.equity.historical_market_cap(provider='fmp', symbol='AAPL') + """ # noqa: E501 + + return self._run( + "/equity/historical_market_cap", + **filter_inputs( + provider_choices={ + "provider": self._get_provider( + provider, + "equity.historical_market_cap", + ("fmp",), + ) + }, + standard_params={ + "symbol": symbol, + "start_date": start_date, + "end_date": end_date, + }, + extra_params=kwargs, + info={"symbol": {"fmp": {"multiple_items_allowed": True}}}, + ) + ) + @exception_handler @validate def market_snapshots( diff --git a/openbb_platform/providers/fmp/openbb_fmp/__init__.py b/openbb_platform/providers/fmp/openbb_fmp/__init__.py index 7ae1d68fb91a..3d85d3ed4509 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/__init__.py +++ b/openbb_platform/providers/fmp/openbb_fmp/__init__.py @@ -44,6 +44,7 @@ from openbb_fmp.models.historical_dividends import FMPHistoricalDividendsFetcher from openbb_fmp.models.historical_employees import FMPHistoricalEmployeesFetcher from openbb_fmp.models.historical_eps import FMPHistoricalEpsFetcher +from openbb_fmp.models.historical_market_cap import FmpHistoricalMarketCapFetcher from openbb_fmp.models.historical_splits import FMPHistoricalSplitsFetcher from openbb_fmp.models.income_statement import FMPIncomeStatementFetcher from openbb_fmp.models.income_statement_growth import FMPIncomeStatementGrowthFetcher @@ -114,6 +115,7 @@ "HistoricalDividends": FMPHistoricalDividendsFetcher, "HistoricalEmployees": FMPHistoricalEmployeesFetcher, "HistoricalEps": FMPHistoricalEpsFetcher, + "HistoricalMarketCap": FmpHistoricalMarketCapFetcher, "HistoricalSplits": FMPHistoricalSplitsFetcher, "IncomeStatement": FMPIncomeStatementFetcher, "IncomeStatementGrowth": FMPIncomeStatementGrowthFetcher, diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/historical_market_cap.py b/openbb_platform/providers/fmp/openbb_fmp/models/historical_market_cap.py new file mode 100644 index 000000000000..9a5242f6f159 --- /dev/null +++ b/openbb_platform/providers/fmp/openbb_fmp/models/historical_market_cap.py @@ -0,0 +1,126 @@ +"""FMP Historical Market Cap Model.""" + +from datetime import datetime +from typing import Any, Dict, List, Optional +from warnings import warn + +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.historical_market_cap import ( + HistoricalMarketCapData, + HistoricalMarketCapQueryParams, +) +from openbb_core.provider.utils.errors import EmptyDataError + + +class FmpHistoricalMarketCapQueryParams(HistoricalMarketCapQueryParams): + """FMP Historical Market Cap Query. + + Source: https://site.financialmodelingprep.com/developer/docs#historical-market-cap-company-information + + """ + + __json_schema_extra__ = { + "symbol": {"multiple_items_allowed": True}, + } + + +class FmpHistoricalMarketCapData(HistoricalMarketCapData): + """FMP Historical Market Cap Data.""" + + __alias_dict__ = { + "market_cap": "marketCap", + } + + +class FmpHistoricalMarketCapFetcher( + Fetcher[ + FmpHistoricalMarketCapQueryParams, + List[FmpHistoricalMarketCapData], + ] +): + """FMP Historical Market Cap Fetcher.""" + + @staticmethod + def transform_query(params: Dict[str, Any]) -> FmpHistoricalMarketCapQueryParams: + """Transform the query params.""" + # pylint: disable=import-outside-toplevel + from dateutil.relativedelta import relativedelta + + transformed_params = params + now = datetime.now().date() + + if params.get("start_date") is None: + transformed_params["start_date"] = now - relativedelta(years=5) + + if params.get("end_date") is None: + transformed_params["end_date"] = now + + return FmpHistoricalMarketCapQueryParams(**transformed_params) + + @staticmethod + async def aextract_data( + query: FmpHistoricalMarketCapQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> List[Dict]: + """Return the raw data from the FMP endpoint.""" + # pylint: disable=import-outside-toplevel + from dateutil.relativedelta import relativedelta + from openbb_core.provider.utils.helpers import amake_requests + + symbols = query.symbol.split(",") + api_key = credentials.get("fmp_api_key") if credentials else "" + + urls: List = [] + results: List = [] + + def generate_urls(symbol, start_date, end_date): + """Generate URLs for each 5-year interval between start_date and end_date.""" + base_url = f"https://financialmodelingprep.com/api/v3/historical-market-capitalization/{symbol}?limit=5000" + base_url = base_url + "&from={}&to={}" + while start_date <= end_date: + next_date = start_date + relativedelta(months=60) + url = base_url.format( + start_date.strftime("%Y-%m-%d"), + min(next_date, end_date).strftime("%Y-%m-%d"), + ) + url = url + f"&apikey={api_key}" + urls.append(url) + start_date = next_date + + for symbol in symbols: + generate_urls(symbol, query.start_date, query.end_date) + + async def response_callback(response, _): + """Return the response data.""" + res = await response.json() + if res: + results.extend(res) + + await amake_requests(urls, response_callback, **kwargs) + + return results + + @staticmethod + def transform_data( + query: FmpHistoricalMarketCapQueryParams, + data: List[Dict], + **kwargs: Any, + ) -> List[FmpHistoricalMarketCapData]: + """Return the transformed data.""" + # pylint: disable=import-outside-toplevel + from pandas import DataFrame + + if not data: + raise EmptyDataError("The request was returned empty.") + + symbols = query.symbol.split(",") + df = DataFrame(data) + + for symbol in symbols: + if symbol not in df["symbol"].unique(): + warn(f"No data was found for: {symbol}") + + records = df.sort_values(by=["date", "marketCap"]).to_dict(orient="records") + + return [FmpHistoricalMarketCapData.model_validate(d) for d in records] diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_historical_market_cap_fetcher_urllib3_v1.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_historical_market_cap_fetcher_urllib3_v1.yaml new file mode 100644 index 000000000000..6178aef85035 --- /dev/null +++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_historical_market_cap_fetcher_urllib3_v1.yaml @@ -0,0 +1,57 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://financialmodelingprep.com/api/v3/historical-market-capitalization/AAPL?apikey=MOCK_API_KEY&from=2024-01-01&limit=5000&to=2024-01-31 + response: + body: + string: !!binary | + H4sIAAAAAAAAA52Vu0oEQRBF8/2KYeJdqPfDbDE1MBeDETfSRdFNRPx3e1CzmsAKOumCQ1F1+vbd + bpo+x5mm+f3j/PDyPF9N8/F4ezPvf24fl8tpvSMgOQAeGP8q5+Xt6XS5Xl5HmUIgOENMAEb5a/9v + LtTctERHI5Iel7LkprKbuENEk2s114RTAlGpydWam8iqoNnmygZ3NByZBM29EVdcBhh7k/ShRZNL + db/hICg4VOtxccsHRFF3ZWtyo+aCjVEYOjXngF6/CxQW9P58sfY3xotzZ+73W+8tTEjNxbv+4kbu + aK6zRYWuDxu5YyFovPbd40LtWeiaZOhtf6H2LDQcwTi7/kKdO55IPFICup5BnTsxyp5kkt1+y9yh + 4DHh8WlEN89gw1/NFEbw373t7r8BXevZVToHAAA= + 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: + - Thu, 01 Aug 2024 05:31:14 GMT + Etag: + - W/"73a-MDe9BxWD2CL5roRSOp6aLuALx48" + 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 +version: 1 diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_historical_market_cap_fetcher_urllib3_v2.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_historical_market_cap_fetcher_urllib3_v2.yaml new file mode 100644 index 000000000000..464e43825169 --- /dev/null +++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_historical_market_cap_fetcher_urllib3_v2.yaml @@ -0,0 +1,57 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://financialmodelingprep.com/api/v3/historical-market-capitalization/AAPL?apikey=MOCK_API_KEY&from=2024-01-01&limit=5000&to=2024-01-31 + response: + body: + string: !!binary | + H4sIAAAAAAAAA52Vu0oEQRBF8/2KYeJdqPfDbDE1MBeDETfSRdFNRPx3e1CzmsAKOumCQ1F1+vbd + bpo+x5mm+f3j/PDyPF9N8/F4ezPvf24fl8tpvSMgOQAeGP8q5+Xt6XS5Xl5HmUIgOENMAEb5a/9v + LtTctERHI5Iel7LkprKbuENEk2s114RTAlGpydWam8iqoNnmygZ3NByZBM29EVdcBhh7k/ShRZNL + db/hICg4VOtxccsHRFF3ZWtyo+aCjVEYOjXngF6/CxQW9P58sfY3xotzZ+73W+8tTEjNxbv+4kbu + aK6zRYWuDxu5YyFovPbd40LtWeiaZOhtf6H2LDQcwTi7/kKdO55IPFICup5BnTsxyp5kkt1+y9yh + 4DHh8WlEN89gw1/NFEbw373t7r8BXevZVToHAAA= + 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: + - Thu, 01 Aug 2024 05:28:08 GMT + Etag: + - W/"73a-MDe9BxWD2CL5roRSOp6aLuALx48" + 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 +version: 1 diff --git a/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py b/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py index 42bfe949ccc4..a51dd2e767c4 100644 --- a/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py +++ b/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py @@ -48,6 +48,7 @@ from openbb_fmp.models.historical_dividends import FMPHistoricalDividendsFetcher from openbb_fmp.models.historical_employees import FMPHistoricalEmployeesFetcher from openbb_fmp.models.historical_eps import FMPHistoricalEpsFetcher +from openbb_fmp.models.historical_market_cap import FmpHistoricalMarketCapFetcher from openbb_fmp.models.historical_splits import FMPHistoricalSplitsFetcher from openbb_fmp.models.income_statement import FMPIncomeStatementFetcher from openbb_fmp.models.income_statement_growth import FMPIncomeStatementGrowthFetcher @@ -762,3 +763,17 @@ def test_fmp_yield_curve_fetcher(credentials=test_credentials): fetcher = FMPYieldCurveFetcher() result = fetcher.test(params, credentials) assert result is None + + +@pytest.mark.record_http +def test_fmp_historical_market_cap_fetcher(credentials=test_credentials): + """Test FMP Historical Market Cap Fetcher.""" + params = { + "symbol": "AAPL", + "start_date": date(2024, 1, 1), + "end_date": date(2024, 1, 31), + } + + fetcher = FmpHistoricalMarketCapFetcher() + result = fetcher.test(params, credentials) + assert result is None