From c587a14a953cb1c3d7046c03f43ab5ff75fcf079 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Mon, 22 Jul 2024 09:03:36 -0700 Subject: [PATCH] [Feature] Add TIPS Yields (to maturity) (#6597) * add tips yields * default start/end date * gonna need that one * grammar police * mypy * mypy * tests..? * mypy.. * trick pytest..? * try without CommandRunner * black * test cassettes --- .../core/openbb_core/app/command_runner.py | 2 +- .../provider/standard_models/tips_yields.py | 49 +++ .../integration/test_fixedincome_api.py | 28 ++ .../integration/test_fixedincome_python.py | 25 ++ .../government/government_router.py | 17 + openbb_platform/openbb/assets/reference.json | 176 +++++++++ .../openbb/package/fixedincome_government.py | 121 ++++++ .../providers/fred/openbb_fred/__init__.py | 2 + .../fred/openbb_fred/models/tips_yields.py | 244 ++++++++++++ ...t_fred_tips_yields_fetcher_urllib3_v1.yaml | 350 ++++++++++++++++++ ...t_fred_tips_yields_fetcher_urllib3_v2.yaml | 341 +++++++++++++++++ .../fred/tests/test_fred_fetchers.py | 15 + 12 files changed, 1369 insertions(+), 1 deletion(-) create mode 100644 openbb_platform/core/openbb_core/provider/standard_models/tips_yields.py create mode 100644 openbb_platform/providers/fred/openbb_fred/models/tips_yields.py create mode 100644 openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_tips_yields_fetcher_urllib3_v1.yaml create mode 100644 openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_tips_yields_fetcher_urllib3_v2.yaml diff --git a/openbb_platform/core/openbb_core/app/command_runner.py b/openbb_platform/core/openbb_core/app/command_runner.py index fe24524e857..d0438308938 100644 --- a/openbb_platform/core/openbb_core/app/command_runner.py +++ b/openbb_platform/core/openbb_core/app/command_runner.py @@ -148,7 +148,7 @@ class ParametersBuilder: try: if isinstance(obj, dict): return obj - return asdict(obj) if is_dataclass(obj) else dict(obj) + return asdict(obj) if is_dataclass(obj) else dict(obj) # type: ignore except Exception: return {} diff --git a/openbb_platform/core/openbb_core/provider/standard_models/tips_yields.py b/openbb_platform/core/openbb_core/provider/standard_models/tips_yields.py new file mode 100644 index 00000000000..e51ae0a85de --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/tips_yields.py @@ -0,0 +1,49 @@ +"""TIPS (Treasury Inflation-Protected Securities) Yields Standard Model.""" + +from datetime import date as dateType +from typing import Optional + +from pydantic import Field + +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 TipsYieldsQueryParams(QueryParams): + """TIPS Yields Query.""" + + start_date: Optional[dateType] = Field( + default=None, + description=QUERY_DESCRIPTIONS.get("start_date", ""), + ) + end_date: Optional[dateType] = Field( + default=None, + description=QUERY_DESCRIPTIONS.get("end_date", ""), + ) + + +class TipsYieldsData(Data): + """TIPS Yields Data.""" + + date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", "")) + symbol: Optional[str] = Field( + default=None, + description=DATA_DESCRIPTIONS.get("symbol", ""), + ) + due: Optional[dateType] = Field( + default=None, + description="The due date (maturation date) of the security.", + ) + name: Optional[str] = Field( + default=None, + description="The name of the security.", + ) + value: float = Field( + default=None, + description="The yield value.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) diff --git a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py index 4ef81ba7b33..d80237fbb4e 100644 --- a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py +++ b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py @@ -804,3 +804,31 @@ def test_fixedincome_rate_overnight_bank_funding(params, headers): result = requests.get(url, headers=headers, timeout=10) assert isinstance(result, requests.Response) assert result.status_code == 200 + + +@parametrize( + "params", + [ + ( + { + "maturity": None, + "start_date": None, + "end_date": None, + "transform": None, + "aggregation_method": None, + "frequency": None, + "provider": "fred", + } + ), + ], +) +@pytest.mark.integration +def test_fixedincome_government_tips_yields(params, headers): + """Test the TIPS Yields 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/fixedincome/government/tips_yields?{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/fixedincome/integration/test_fixedincome_python.py b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py index 9815727c320..85392babdd3 100644 --- a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py +++ b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py @@ -750,3 +750,28 @@ def test_fixedincome_rate_overnight_bank_funding(params, obb): assert result assert isinstance(result, OBBject) assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ( + { + "maturity": None, + "start_date": None, + "end_date": None, + "transform": None, + "aggregation_method": None, + "frequency": None, + "provider": "fred", + } + ), + ], +) +@pytest.mark.integration +def test_fixedincome_government_tips_yields(params, obb): + """Test the TIPS Yields endpoint.""" + result = obb.fixedincome.government.tips_yields(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 diff --git a/openbb_platform/extensions/fixedincome/openbb_fixedincome/government/government_router.py b/openbb_platform/extensions/fixedincome/openbb_fixedincome/government/government_router.py index 641afb26577..58f9f412917 100644 --- a/openbb_platform/extensions/fixedincome/openbb_fixedincome/government/government_router.py +++ b/openbb_platform/extensions/fixedincome/openbb_fixedincome/government/government_router.py @@ -167,3 +167,20 @@ async def treasury_prices( ) -> OBBject: """Government Treasury Prices by date.""" return await OBBject.from_query(Query(**locals())) + + +@router.command( + model="TipsYields", + examples=[ + APIEx(parameters={"provider": "fred"}), + APIEx(parameters={"maturity": 10, "provider": "fred"}), + ], +) +async def tips_yields( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject: + """Get current Treasury inflation-protected securities yields.""" + return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json index f400909e5ed..f24668263ee 100644 --- a/openbb_platform/openbb/assets/reference.json +++ b/openbb_platform/openbb/assets/reference.json @@ -33969,6 +33969,182 @@ }, "model": "TreasuryRates" }, + "/fixedincome/government/tips_yields": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get current Treasury inflation-protected securities yields.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.government.tips_yields(provider='fred')\nobb.fixedincome.government.tips_yields(maturity=10, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "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['fred']", + "description": "The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fred.", + "default": null, + "optional": true + } + ], + "fred": [ + { + "name": "maturity", + "type": "Literal[5, 10, 20, 30]", + "description": "The maturity of the security in years - 5, 10, 20, 30 - defaults to all. Note that the maturity is the tenor of the security, not the time to maturity.", + "default": null, + "optional": true, + "choices": [ + 5, + 10, + 20, + 30 + ] + }, + { + "name": "frequency", + "type": "Literal['a', 'q', 'm', 'w', 'd', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']", + "description": "Frequency aggregation to convert high frequency data to lower frequency. None = No change a = Annual q = Quarterly m = Monthly w = Weekly d = Daily wef = Weekly, Ending Friday weth = Weekly, Ending Thursday wew = Weekly, Ending Wednesday wetu = Weekly, Ending Tuesday wem = Weekly, Ending Monday wesu = Weekly, Ending Sunday wesa = Weekly, Ending Saturday bwew = Biweekly, Ending Wednesday bwem = Biweekly, Ending Monday", + "default": null, + "optional": true, + "choices": [ + "a", + "q", + "m", + "w", + "d", + "wef", + "weth", + "wew", + "wetu", + "wem", + "wesu", + "wesa", + "bwew", + "bwem" + ] + }, + { + "name": "aggregation_method", + "type": "Literal['avg', 'sum', 'eop']", + "description": "A key that indicates the aggregation method used for frequency aggregation. avg = Average sum = Sum eop = End of Period", + "default": null, + "optional": true, + "choices": [ + "avg", + "sum", + "eop" + ] + }, + { + "name": "transform", + "type": "Literal['chg', 'ch1', 'pch', 'pc1', 'pca', 'cch', 'cca']", + "description": "Transformation type None = No transformation chg = Change ch1 = Change from Year Ago pch = Percent Change pc1 = Percent Change from Year Ago pca = Compounded Annual Rate of Change cch = Continuously Compounded Rate of Change cca = Continuously Compounded Annual Rate of Change", + "default": null, + "optional": true, + "choices": [ + "chg", + "ch1", + "pch", + "pc1", + "pca", + "cch", + "cca" + ] + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[TipsYields]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "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": null, + "optional": true, + "choices": null + }, + { + "name": "due", + "type": "date", + "description": "The due date (maturation date) of the security.", + "default": null, + "optional": true, + "choices": null + }, + { + "name": "name", + "type": "str", + "description": "The name of the security.", + "default": null, + "optional": true, + "choices": null + }, + { + "name": "value", + "type": "float", + "description": "The yield value.", + "default": null, + "optional": true, + "choices": null + } + ], + "fred": [] + }, + "model": "TipsYields" + }, "/fixedincome/corporate/ice_bofa": { "deprecated": { "flag": true, diff --git a/openbb_platform/openbb/package/fixedincome_government.py b/openbb_platform/openbb/package/fixedincome_government.py index 06fac42ce16..544a554c7ed 100644 --- a/openbb_platform/openbb/package/fixedincome_government.py +++ b/openbb_platform/openbb/package/fixedincome_government.py @@ -15,6 +15,7 @@ from typing_extensions import Annotated, deprecated class ROUTER_fixedincome_government(Container): """/fixedincome/government + tips_yields treasury_rates us_yield_curve yield_curve @@ -23,6 +24,126 @@ class ROUTER_fixedincome_government(Container): def __repr__(self) -> str: return self.__doc__ or "" + @exception_handler + @validate + def tips_yields( + self, + 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["fred"]], + OpenBBField( + description="The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fred." + ), + ] = None, + **kwargs + ) -> OBBject: + """Get current Treasury inflation-protected securities yields. + + Parameters + ---------- + 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['fred']] + The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fred. + maturity : Optional[Literal[5, 10, 20, 30]] + The maturity of the security in years - 5, 10, 20, 30 - defaults to all. Note that the maturity is the tenor of the security, not the time to maturity. (provider: fred) + frequency : Optional[Literal['a', 'q', 'm', 'w', 'd', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']] + Frequency aggregation to convert high frequency data to lower frequency. + None = No change + a = Annual + q = Quarterly + m = Monthly + w = Weekly + d = Daily + wef = Weekly, Ending Friday + weth = Weekly, Ending Thursday + wew = Weekly, Ending Wednesday + wetu = Weekly, Ending Tuesday + wem = Weekly, Ending Monday + wesu = Weekly, Ending Sunday + wesa = Weekly, Ending Saturday + bwew = Biweekly, Ending Wednesday + bwem = Biweekly, Ending Monday + (provider: fred) + aggregation_method : Optional[Literal['avg', 'sum', 'eop']] + A key that indicates the aggregation method used for frequency aggregation. + avg = Average + sum = Sum + eop = End of Period + (provider: fred) + transform : Optional[Literal['chg', 'ch1', 'pch', 'pc1', 'pca', 'cch', 'cca']] + Transformation type + None = No transformation + chg = Change + ch1 = Change from Year Ago + pch = Percent Change + pc1 = Percent Change from Year Ago + pca = Compounded Annual Rate of Change + cch = Continuously Compounded Rate of Change + cca = Continuously Compounded Annual Rate of Change + (provider: fred) + + Returns + ------- + OBBject + results : List[TipsYields] + Serializable results. + provider : Optional[Literal['fred']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra : Dict[str, Any] + Extra info. + + TipsYields + ---------- + date : date + The date of the data. + symbol : Optional[str] + Symbol representing the entity requested in the data. + due : Optional[date] + The due date (maturation date) of the security. + name : Optional[str] + The name of the security. + value : Optional[float] + The yield value. + + Examples + -------- + >>> from openbb import obb + >>> obb.fixedincome.government.tips_yields(provider='fred') + >>> obb.fixedincome.government.tips_yields(maturity=10, provider='fred') + """ # noqa: E501 + + return self._run( + "/fixedincome/government/tips_yields", + **filter_inputs( + provider_choices={ + "provider": self._get_provider( + provider, + "fixedincome.government.tips_yields", + ("fred",), + ) + }, + standard_params={ + "start_date": start_date, + "end_date": end_date, + }, + extra_params=kwargs, + ) + ) + @exception_handler @validate def treasury_rates( diff --git a/openbb_platform/providers/fred/openbb_fred/__init__.py b/openbb_platform/providers/fred/openbb_fred/__init__.py index b22a245f86c..adebc67f738 100644 --- a/openbb_platform/providers/fred/openbb_fred/__init__.py +++ b/openbb_platform/providers/fred/openbb_fred/__init__.py @@ -48,6 +48,7 @@ from openbb_fred.models.survey_of_economic_conditions_chicago import ( FredSurveyOfEconomicConditionsChicagoFetcher, ) from openbb_fred.models.tbffr import FREDSelectedTreasuryBillFetcher +from openbb_fred.models.tips_yields import FredTipsYieldsFetcher from openbb_fred.models.tmc import FREDTreasuryConstantMaturityFetcher from openbb_fred.models.university_of_michigan import FredUofMichiganFetcher from openbb_fred.models.us_yield_curve import ( @@ -96,6 +97,7 @@ Research division of the Federal Reserve Bank of St. Louis that has more than "SelectedTreasuryConstantMaturity": FREDSelectedTreasuryConstantMaturityFetcher, "SelectedTreasuryBill": FREDSelectedTreasuryBillFetcher, "SurveyOfEconomicConditionsChicago": FredSurveyOfEconomicConditionsChicagoFetcher, + "TipsYields": FredTipsYieldsFetcher, "UniversityOfMichigan": FredUofMichiganFetcher, "YieldCurve": FREDYieldCurveFetcher, }, diff --git a/openbb_platform/providers/fred/openbb_fred/models/tips_yields.py b/openbb_platform/providers/fred/openbb_fred/models/tips_yields.py new file mode 100644 index 00000000000..4aaff45cd1a --- /dev/null +++ b/openbb_platform/providers/fred/openbb_fred/models/tips_yields.py @@ -0,0 +1,244 @@ +"""FRED TIPS Yields Model.""" + +# pylint: disable=unused-argument,too-many-locals + +from typing import Any, Dict, List, Literal, Optional + +from openbb_core.app.model.abstract.error import OpenBBError +from openbb_core.provider.abstract.annotated_result import AnnotatedResult +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.tips_yields import ( + TipsYieldsData, + TipsYieldsQueryParams, +) +from openbb_core.provider.utils.errors import EmptyDataError +from pydantic import Field + + +class FredTipsYieldsQueryParams(TipsYieldsQueryParams): + """FRED TIPS Yields Query.""" + + maturity: Optional[Literal[5, 10, 20, 30]] = Field( + default=None, + description="The maturity of the security in years - 5, 10, 20, 30 - defaults to all." + + " Note that the maturity is the tenor of the security, not the time to maturity.", + json_schema_extra={"choices": [5, 10, 20, 30]}, + ) + frequency: Optional[ + Literal[ + "a", + "q", + "m", + "w", + "d", + "wef", + "weth", + "wew", + "wetu", + "wem", + "wesu", + "wesa", + "bwew", + "bwem", + ] + ] = Field( + default=None, + description="""Frequency aggregation to convert high frequency data to lower frequency. + None = No change + a = Annual + q = Quarterly + m = Monthly + w = Weekly + d = Daily + wef = Weekly, Ending Friday + weth = Weekly, Ending Thursday + wew = Weekly, Ending Wednesday + wetu = Weekly, Ending Tuesday + wem = Weekly, Ending Monday + wesu = Weekly, Ending Sunday + wesa = Weekly, Ending Saturday + bwew = Biweekly, Ending Wednesday + bwem = Biweekly, Ending Monday + """, + json_schema_extra={ + "choices": [ + "a", + "q", + "m", + "w", + "d", + "wef", + "weth", + "wew", + "wetu", + "wem", + "wesu", + "wesa", + "bwew", + "bwem", + ] + }, + ) + aggregation_method: Optional[Literal["avg", "sum", "eop"]] = Field( + default=None, + description="""A key that indicates the aggregation method used for frequency aggregation. + avg = Average + sum = Sum + eop = End of Period + """, + json_schema_extra={"choices": ["avg", "sum", "eop"]}, + ) + transform: Optional[Literal["chg", "ch1", "pch", "pc1", "pca", "cch", "cca"]] = ( + Field( + default=None, + description="""Transformation type + None = No transformation + chg = Change + ch1 = Change from Year Ago + pch = Percent Change + pc1 = Percent Change from Year Ago + pca = Compounded Annual Rate of Change + cch = Continuously Compounded Rate of Change + cca = Continuously Compounded Annual Rate of Change + """, + json_schema_extra={ + "choices": ["chg", "ch1", "pch", "pc1", "pca", "cch", "cca"] + }, + ) + ) + + +class FredTipsYieldsData(TipsYieldsData): + """FRED TIPS Yields Data.""" + + +class FredTipsYieldsFetcher( + Fetcher[ + FredTipsYieldsQueryParams, + List[FredTipsYieldsData], + ] +): + """FRED TIPS Yields Fetcher.""" + + @staticmethod + def transform_query(params: Dict[str, Any]) -> FredTipsYieldsQueryParams: + """Transform the query.""" + return FredTipsYieldsQueryParams(**params) + + @staticmethod + async def aextract_data( + query: FredTipsYieldsQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> Dict: + """Extract the data.""" + # pylint: disable=import-outside-toplevel + from openbb_fred.models.search import FredSearchFetcher + from openbb_fred.models.series import FredSeriesFetcher + from pandas import DataFrame, to_datetime + + # We get the series IDs because they will change over time. + async def get_tips_series(): + """Get series IDs for the TIPS.""" + fetcher = FredSearchFetcher() + res = await fetcher.fetch_data( + params={"release_id": 72}, credentials=credentials + ) + df = DataFrame([d.model_dump() for d in res]) # type: ignore + df = df.query("not title.str.contains('DISCONTINUED')").set_index( + "series_id" + ) + df.loc[:, "due"] = df.title.apply( + lambda x: x.split("Due ")[-1].strip() + ).apply(to_datetime) + df = df[["due", "observation_start", "observation_end", "title"]] + return df.sort_values(by="due").reset_index() # type: ignore + + try: + ids_df = await get_tips_series() + ids = ids_df.series_id.to_list() + except Exception as e: + raise OpenBBError(e) from e + + # If we are looking for a specific tenor, the request will be smaller. + if query.maturity: + ids = [i for i in ids if str(i[3]) == (f"{str(query.maturity)[0]}")] + + # We split the due date from the title so that we can format it as a datetime.date object. + due_map = ids_df.set_index("series_id")["due"].dt.date.to_dict() + # We make a seriesID-title map for later. + title_map = ( + ids_df.set_index("series_id")["title"] + .str.replace("Treasury Inflation-Indexed", "TIPS") + .str.replace(" ", " ") + .str.strip() + .to_dict() + ) + + params = { + k: v + for k, v in { + "symbol": ",".join(ids), + "start_date": query.start_date, + "end_date": query.end_date, + "frequency": query.frequency, + "aggregation_method": query.aggregation_method, + "transform": query.transform, + }.items() + if v is not None + } + + try: + fetcher = FredSeriesFetcher() + res = await fetcher.fetch_data(params=params, credentials=credentials) + df = DataFrame([d.model_dump() for d in res.result]) # type: ignore + meta = res.metadata # type: ignore + except Exception as e: + raise OpenBBError(e) from e + + for k, v in title_map.items(): + if k in meta: + meta[k]["title"] = v # type: ignore + + # We flatten the data and format the output with the metadata. + df = ( + df.melt( + id_vars="date", + value_vars=[d for d in df.columns if d != "date"], + var_name="symbol", + ) + .dropna() + .sort_values(by="date") + ) + df = df.reset_index(drop=True) + df["due"] = df.symbol.map(due_map) + df["name"] = df.symbol.map(title_map) + df["value"] = df["value"] / 100 + df = df[["date", "due", "symbol", "name", "value"]] + df = df.sort_values(by=["date", "due"]) # type: ignore + records = df.to_dict(orient="records") + output = { + "records": records, + "meta": meta, + } + + return output + + @staticmethod + def transform_data( + query: FredTipsYieldsQueryParams, + data: Dict, + **kwargs: Any, + ) -> AnnotatedResult[List[FredTipsYieldsData]]: + """Transform the data.""" + results = data.get("records", []) + meta = data.get("meta", {}) + if not results: + raise EmptyDataError( + "There was an error with the request and was returned empty." + ) + + return AnnotatedResult( + result=[FredTipsYieldsData.model_validate(r) for r in results], + metadata=meta, + ) diff --git a/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_tips_yields_fetcher_urllib3_v1.yaml b/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_tips_yields_fetcher_urllib3_v1.yaml new file mode 100644 index 00000000000..d32ac0400ad --- /dev/null +++ b/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_tips_yields_fetcher_urllib3_v1.yaml @@ -0,0 +1,350 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.stlouisfed.org/fred/release/series?api_key=MOCK_API_KEY&file_type=json&offset=0&release_id=72 + response: + body: + string: !!binary | + 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 + ugZm6CfdYztEB+lGWsrGPAGLrQUA3O8b0uT/AAA= + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '4817' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:05:15 GMT + Expires: + - Sun, 21 Jul 2024 17:05:15 GMT + Last-Modified: + - Sun, 21 Jul 2024 17:05:15 GMT + Pragma: + - no-cache + Server: + - Apache + Set-Cookie: + - ak_bmsc=312FB752BA5A8C31E3F1375DB9646F7D~000000000000000000000000000000~YAAQZWIsF0oGLcyQAQAAUjJB1hjNFtIO37+/PP5iEFGZnNeJxomEV90QFJbH03fO8+fyN32yZb7tNTBVxEHDgaF6Ops2rj1yEmxNDsLoD5zoVEkzoNpxzpV6HWTQ67kBSp2UfBS29666EKCo1t+dNeQeBGcBSEv18W1tPDuYBWKj80lnlD0xoQ2EutY8GxEKJ9CbTp3iQ7+5ZKOdzXE6fSPiCto9b2UclrztaP+uMaLda/+BuC8FPj9SkAZrPWnmPxjl8SXno5XANZmYzM7o+e/ToYK8UDgjd1f2Nb+v6kcfeVx0AmRoF7hxAMZQWb7j6oO/5VHrRn1FMsz2KifZREokb/40iSW152U2zmPsAvJuZY+uQWcWePs5AOC3wB+D; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:05:15 GMT; Max-Age=7200 + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.stlouisfed.org/fred/series/observations?aggregation_method=eop&api_key=MOCK_API_KEY&file_type=json&limit=100000&observation_end=2024-07-17&observation_start=2024-07-17&series_id=DTP5C24 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy0TUw1zUyVNJByKbmpaDL5ScVpxaVJZZk + 5udhaDY0V9JRQlaAqh8sXZqXWVKsZKWUk5kHUlxaUlBaEl9SWZCqZGWoo5SWmZMK5SllFeeDlRSl + pBbFJ1UqWaEYnZJYkqqko1ScX1QSnw9SomSllFicrKSjlJxfmlcCNi0/La04tUTJykBHKSczNxMk + aAACKI4sVrKKpiRAwA5BBCDYk4CVJeaUpipZKZnomRpYKNXG1gIAoaXmmHIBAAA= + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '218' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:05:15 GMT + Expires: + - Sun, 21 Jul 2024 17:05:15 GMT + Last-Modified: + - Thu, 18 Jul 2024 11:03:05 GMT + Pragma: + - no-cache + Server: + - Apache + Set-Cookie: + - ak_bmsc=2FC66DC3E0F4AC1DAF922A59F6FAF4B5~000000000000000000000000000000~YAAQZWIsF1YGLcyQAQAASjNB1hiBl5ShZYFs7oArUcP7FhtQnUSwMXOckz0hxv4mS/jhokoTr/PCy2c+W7FibpQjRsJ6+IxrEqT4JjUZBs0M6jFLUBNjhK4XU7mBkA0tujNPy9Ea1uwD3VWFoI0+xGO8G/NUMRHWNfR+TDd0mR/ez1rOXq5RxhBavvSiL1SHNcluWA05cp234kRu/YuhaaB6G/HsSYcZHqywzgH3rUmC7MHVR9jWm2iIVBjjx96R4JcEBOtT6L8WVVFI3xospSNb0nfokm1tUAFCvYoWzK0yGbIfWS10pvMmZNUEDp5IdDXJRDKqrXRaElB0Lat1fnWKpzJGvsuu3h5kbWZ0vtZUyF9MSk55T+nUli4+our3; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:05:15 GMT; Max-Age=7200 + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.stlouisfed.org/fred/series/observations?aggregation_method=eop&api_key=MOCK_API_KEY&file_type=json&limit=100000&observation_end=2024-07-17&observation_start=2024-07-17&series_id=DTP5A25 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy0TUw1zUyVNJByKbmpaDL5ScVpxaVJZZk + 5udhaDY0V9JRQlaAqh8sXZqXWVKsZKWUk5kHUlxaUlBaEl9SWZCqZGWoo5SWmZMK5SllFeeDlRSl + pBbFJ1UqWaEYnZJYkqqko1ScX1QSnw9SomSllFicrKSjlJxfmlcCNi0/La04tUTJykBHKSczNxMk + aAACKI4sVrKKpiRAwA5BBCDYk4CVJeaUpipZKZnoGZibKdXG1gIA3wTraHIBAAA= + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '218' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:05:15 GMT + Expires: + - Sun, 21 Jul 2024 17:05:15 GMT + Last-Modified: + - Thu, 18 Jul 2024 11:03:05 GMT + Pragma: + - no-cache + Server: + - Apache + Set-Cookie: + - ak_bmsc=6A161008EA152C25E65CC17AF6AA7634~000000000000000000000000000000~YAAQZWIsF1wGLcyQAQAAwzNB1hiGAkjiDVbBzRO5Z1CouCcR37dwoQ4pJq72XWrXFGKEGl39Cx9rm/m84PN7BRxmPiNGJax+9Bc1Q2hGcR5A4az+ea6hFMg4ca/XTjTJh/OzNlckUjgjPnJe+rxrYmiAihJ0LFRrqmF8tVCe9cwAwZDeTGCm33w4LhGoF8cey1lSNijA0EjY4x1ogRXrcc7bkgoSc44KVywvtgkjFyNKGnd3IoRJU3UsnMC+mJKKyqJzPFaRmtACn3C2tg1yi5Y3vts2vuUXQBQvNbWSSlaDmz/T3NcXL1EOVpAUGGR1SB5AmFm78GYVSx5VphW/TR1Qna+JJnQjYYQGEJcuKcsUMLGOIKcXcgP73fDkjV70; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:05:15 GMT; Max-Age=7200 + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ak_bmsc=2FC66DC3E0F4AC1DAF922A59F6FAF4B5~000000000000000000000000000000~YAAQZWIsF1YGLcyQAQAASjNB1hiBl5ShZYFs7oArUcP7FhtQnUSwMXOckz0hxv4mS/jhokoTr/PCy2c+W7FibpQjRsJ6+IxrEqT4JjUZBs0M6jFLUBNjhK4XU7mBkA0tujNPy9Ea1uwD3VWFoI0+xGO8G/NUMRHWNfR+TDd0mR/ez1rOXq5RxhBavvSiL1SHNcluWA05cp234kRu/YuhaaB6G/HsSYcZHqywzgH3rUmC7MHVR9jWm2iIVBjjx96R4JcEBOtT6L8WVVFI3xospSNb0nfokm1tUAFCvYoWzK0yGbIfWS10pvMmZNUEDp5IdDXJRDKqrXRaElB0Lat1fnWKpzJGvsuu3h5kbWZ0vtZUyF9MSk55T+nUli4+our3 + method: GET + uri: https://api.stlouisfed.org/fred/series?api_key=MOCK_API_KEY&file_type=json&series_id=DTP5C24 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy0TUw1zUyUNJByKbmpaDLFacWZaYWFytZ + RVcrZYJkXUICTJ2NTJC1kWxoSWZJTqqSlZKpbmRqYpGCgZ6hkamqQkhRamJxaVGlgmdeWk5iSWZ+ + nq5nXkpqRWqKglN+XoqOgktpqoKhQYy+oWmMPsgDSjpK+UnFqUVlYMXIfjPQNTCC+A1ZAar3DM2V + dJTSilILS1PzkiuVrJRcEjNzKpHF4osz8sGh5aKko1Sal1lSrGSlFJBalJyaVwITgatRVdJRKk5N + LM7PS8yJT0zJKi0uyQWps1Lyyy9RCIbK5FQqOILlUlOwq4eb5xfsqKSjlJNYXBJfWpCSWJIKCnyQ + r0HRZmihYGBmZWBsZWCqa2CqpKNUkF9QmpNYlFlSqWRlaKCjlJdfkgpybWRmak6KQkm+Qm5iSSlI + WiE/TyExObmoNDVFoaAoMy85syAxRy+mKCYPS/AHFOWXpCaXpKYoBKcmg7RnphbrKOQXKYR4BgTr + KCQWpSoUwyUUyjPyi1MRhipkFiuUZKaCbS/JSFVwzs8rLs1NLVIIKMpMTlUAR62ChnOAp6aeQkgG + isa8ZFBSSC1WKM8syVDIhCUHhcS8FIWUVBTJlFRoWtFTCM9IzVMA2QR1UyXE0yAng0RD9YL1FOCe + LEisLAYrzi/KTM/MS8wBeQsSbcgho6NQnpGZnJFallqkkFmskF6UmliSWgQOL+f8gsqizPSMEh0F + IwNDMx0Fj0SQKse8xJzKkszkYj2FoFRQCIOCD+wPwApSi3Izi4sz8/P0lGpjawFhzJyalgMAAA== + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '625' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:05:15 GMT + Expires: + - Sun, 21 Jul 2024 17:05:15 GMT + Last-Modified: + - Thu, 18 Jul 2024 11:03:05 GMT + Pragma: + - no-cache + Server: + - Apache + Set-Cookie: + - ak_bmsc=2FC66DC3E0F4AC1DAF922A59F6FAF4B5~000000000000000000000000000000~YAAQZWIsF10GLcyQAQAA1TNB1hgfhK7htgZyBJAWUMQcrZgE8jQ33h9JfHoKSM2HsJ06ECFUSsdQWF9IZ7uIKap+0eTwEMiNbr6JRiVUOI7HCmYasjMAYhKaV+wbvs3QBJqOkEjjkYgvrpOVnj93Ci7RUQzeNt+n4Ak/Jrk9EFvvDdYW4Nbajtbt4njNNPMS5qMl9VjtPN3BiFWuFF3CRqh6yr+9FnFg4LMjOOYdTnN51wAaPiwZyCMeS2BGCZonho76Lw7Ith7dsUP24VQSjjsns/S/uljzAX3V1YYMsZ/+WFrgAviRYVTKjUgd7CYvyz9Pshe8no43Dese+iKmDIABVyzgK/oVCRyCG5kEGsFOotrYWN9qDMzb1ePh8EJFqpMyxC3srAMy0ped91gCNA==; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:05:15 GMT; Max-Age=7200 + - bm_sv=49DA7BF1634281D04D7E9BBFD5A113B0~YAAQZWIsF14GLcyQAQAA1TNB1hjRu5YoL9cjne3TRspIUHB5WiVF4n8xxF9k4N56bcZpSUxhAVXvRw3RATRRQb42kpCGEfZUOP6zHHA8YMg6uREfV/WUpnCM5E4jI86VaRkd/FBXfp5Zj6ohRI0ctDHfTZcrpJFEX/e4qu/PBakZAi1wrS7XLHloBn/j7X6/60VjO9E496YvLkpgmupkoubRdfQxPkE9fa6HnnO8pi7kvGTq4QNqYGjvB+Mo0j++mrsqxw==~1; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:05:15 GMT; Max-Age=7200; + Secure + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ak_bmsc=6A161008EA152C25E65CC17AF6AA7634~000000000000000000000000000000~YAAQZWIsF1wGLcyQAQAAwzNB1hiGAkjiDVbBzRO5Z1CouCcR37dwoQ4pJq72XWrXFGKEGl39Cx9rm/m84PN7BRxmPiNGJax+9Bc1Q2hGcR5A4az+ea6hFMg4ca/XTjTJh/OzNlckUjgjPnJe+rxrYmiAihJ0LFRrqmF8tVCe9cwAwZDeTGCm33w4LhGoF8cey1lSNijA0EjY4x1ogRXrcc7bkgoSc44KVywvtgkjFyNKGnd3IoRJU3UsnMC+mJKKyqJzPFaRmtACn3C2tg1yi5Y3vts2vuUXQBQvNbWSSlaDmz/T3NcXL1EOVpAUGGR1SB5AmFm78GYVSx5VphW/TR1Qna+JJnQjYYQGEJcuKcsUMLGOIKcXcgP73fDkjV70 + method: GET + uri: https://api.stlouisfed.org/fred/series?api_key=MOCK_API_KEY&file_type=json&series_id=DTP5A25 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy0TUw1zUyUNJByKbmpaDLFacWZaYWFytZ + RVcrZYJkXUICTB2NTJG1kWxoSWZJTqqSlZKpbmRqYpGCgZ6hkamqQkhRamJxaVGlgmdeWk5iSWZ+ + nq5nXkpqRWqKglN+XoqOgktpqoJJjL6haYy+kQHYCflJxalFZWC1yF4z0DUw0zUGeQ1ZAarvDM2V + dJTSilILS1PzkiuVrJRcEjNzKpHF4osz8sGB5aKko1Sal1lSrGSlFJBalJyaVwITgatRVdJRKk5N + LM7PS8yJT0zJKi0uyQWps1Lyyy9RCIbK5FQqOILlUlOwq4eb5xfsqKSjlJNYXBJfWpCSWJIKCntY + rBlaKBiYWRkYWxmY6hqAoqIgv6A0J7Eos6RSycrYUEcpL78kFeTayMzUnBSFknyF3MSSUpC0Qn6e + QmJyclFpaopCQVFmXnJmQWKOXkxRTB6W0A8oyi9JTS5JTVEITk0Gac9MLdZRyC9SCPEMCNZRSCxK + VSiGSyiUZ+QXpyIMVcgsVijJTAXbXpKRquCcn1dcmptapBBQlJmcqgCOWQUN5wBPTT2FkAwUjXnJ + oJSQWqxQnlmSoZAJSw0KiXkpCimpKJIpqdCkoqcQnpGapwCyCeqmSoinQU4GiYbqBespwD1ZkFhZ + DFacX5SZnpmXmAPyFiTakENGR6E8IzM5I7UstUghs1ghvSg1sSS1CBxezvkFlUWZ6RklOgpGBoZm + OgoeiSBVjnmJOZUlmcnFegpBqaAQBgUf2B+AFaQW5WYWF2fm5+kp1cbWAgCpEhgylQMAAA== + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '622' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:05:15 GMT + Expires: + - Sun, 21 Jul 2024 17:05:15 GMT + Last-Modified: + - Thu, 18 Jul 2024 11:03:05 GMT + Pragma: + - no-cache + Server: + - Apache + Set-Cookie: + - bm_sv=B6BC30C1D123EC270CB80E34BC8A6EAE~YAAQZWIsF2oGLcyQAQAAfDRB1hhYL9XCOgdzivQ6AJLUQt2hSdZltKVnvZreOdJpwJK/0F6d+Xr0mPYiHLE8V75pUMSae05Fur5CYqQ/5b0I/pSkon9kb0u+qO2l0uwCWy5CE7FJPJQ+qUqZbMUq7d1oyns9W3iiN3IMaHw4SdERBXISnuk7DqTirxxZ5y3Qpkyx2V8wJlnx0WNJG2fNBkoaAes7O85cZU/UvnWHz8V9mep6LXsq6tnLUc+j8FMDTrTtfQ==~1; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:05:15 GMT; Max-Age=7200; + Secure + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_tips_yields_fetcher_urllib3_v2.yaml b/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_tips_yields_fetcher_urllib3_v2.yaml new file mode 100644 index 00000000000..ba9488b7958 --- /dev/null +++ b/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_tips_yields_fetcher_urllib3_v2.yaml @@ -0,0 +1,341 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.stlouisfed.org/fred/release/series?api_key=MOCK_API_KEY&file_type=json&offset=0&release_id=72 + response: + body: + string: !!binary | + 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 + ugZm6CfdYztEB+lGWsrGPAGLrQUA3O8b0uT/AAA= + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '4817' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:04:37 GMT + Expires: + - Sun, 21 Jul 2024 17:04:37 GMT + Last-Modified: + - Sun, 21 Jul 2024 17:02:55 GMT + Pragma: + - no-cache + Server: + - Apache + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.stlouisfed.org/fred/series/observations?aggregation_method=eop&api_key=MOCK_API_KEY&file_type=json&limit=100000&observation_end=2024-07-17&observation_start=2024-07-17&series_id=DTP5C24 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy0TUw1zUyVNJByKbmpaDL5ScVpxaVJZZk + 5udhaDY0V9JRQlaAqh8sXZqXWVKsZKWUk5kHUlxaUlBaEl9SWZCqZGWoo5SWmZMK5SllFeeDlRSl + pBbFJ1UqWaEYnZJYkqqko1ScX1QSnw9SomSllFicrKSjlJxfmlcCNi0/La04tUTJykBHKSczNxMk + aAACKI4sVrKKpiRAwA5BBCDYk4CVJeaUpipZKZnomRpYKNXG1gIAoaXmmHIBAAA= + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '218' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:04:37 GMT + Expires: + - Sun, 21 Jul 2024 17:04:37 GMT + Last-Modified: + - Thu, 18 Jul 2024 11:03:05 GMT + Pragma: + - no-cache + Server: + - Apache + Set-Cookie: + - ak_bmsc=63739BEFDA7932BFAB14DAD81E5BDB17~000000000000000000000000000000~YAAQZWIsFx/8LMyQAQAAq51A1hi7OXLuhqzOrSl+e03UEFz0RM35E6A3pT5LpAcSgnifHTAU7GVnkchLXYtlpl5XBpS78n7nMdO8H88dmYhewu2BX/qYJwcXozQhRUnbfHwVmjThZzxdF7ZXuCXG3XdJlT1PhOzqNie2M33Vn00I3lrXW9Cz9fo01U0jeRRxas9fJoB5MbFRlXUKOJ8BkWlrjVK/r5RO7ILkjbysRxaPlCvTDKgn+VReklE0FNpO8rhpAwIWWoIT0v8AMil0jx7ZwS6/Y+drraLxRw4MC0vbfVThvp0DDAKrlUsBiiGPyuenx0JHYaX+8jQ024lQf6ynRCKGsjnSUo64o+WA2Hvux0KoVms7dZTbF5NUdv5O; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:04:37 GMT; Max-Age=7200 + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.stlouisfed.org/fred/series/observations?aggregation_method=eop&api_key=MOCK_API_KEY&file_type=json&limit=100000&observation_end=2024-07-17&observation_start=2024-07-17&series_id=DTP5A25 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy0TUw1zUyVNJByKbmpaDL5ScVpxaVJZZk + 5udhaDY0V9JRQlaAqh8sXZqXWVKsZKWUk5kHUlxaUlBaEl9SWZCqZGWoo5SWmZMK5SllFeeDlRSl + pBbFJ1UqWaEYnZJYkqqko1ScX1QSnw9SomSllFicrKSjlJxfmlcCNi0/La04tUTJykBHKSczNxMk + aAACKI4sVrKKpiRAwA5BBCDYk4CVJeaUpipZKZnoGZibKdXG1gIA3wTraHIBAAA= + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '218' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:04:37 GMT + Expires: + - Sun, 21 Jul 2024 17:04:37 GMT + Last-Modified: + - Thu, 18 Jul 2024 11:03:05 GMT + Pragma: + - no-cache + Server: + - Apache + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ak_bmsc=63739BEFDA7932BFAB14DAD81E5BDB17~000000000000000000000000000000~YAAQZWIsFx/8LMyQAQAAq51A1hi7OXLuhqzOrSl+e03UEFz0RM35E6A3pT5LpAcSgnifHTAU7GVnkchLXYtlpl5XBpS78n7nMdO8H88dmYhewu2BX/qYJwcXozQhRUnbfHwVmjThZzxdF7ZXuCXG3XdJlT1PhOzqNie2M33Vn00I3lrXW9Cz9fo01U0jeRRxas9fJoB5MbFRlXUKOJ8BkWlrjVK/r5RO7ILkjbysRxaPlCvTDKgn+VReklE0FNpO8rhpAwIWWoIT0v8AMil0jx7ZwS6/Y+drraLxRw4MC0vbfVThvp0DDAKrlUsBiiGPyuenx0JHYaX+8jQ024lQf6ynRCKGsjnSUo64o+WA2Hvux0KoVms7dZTbF5NUdv5O + method: GET + uri: https://api.stlouisfed.org/fred/series?api_key=MOCK_API_KEY&file_type=json&series_id=DTP5C24 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy0TUw1zUyUNJByKbmpaDLFacWZaYWFytZ + RVcrZYJkXUICTJ2NTJC1kWxoSWZJTqqSlZKpbmRqYpGCgZ6hkamqQkhRamJxaVGlgmdeWk5iSWZ+ + nq5nXkpqRWqKglN+XoqOgktpqoKhQYy+oWmMPsgDSjpK+UnFqUVlYMXIfjPQNTCC+A1ZAar3DM2V + dJTSilILS1PzkiuVrJRcEjNzKpHF4osz8sGh5aKko1Sal1lSrGSlFJBalJyaVwITgatRVdJRKk5N + LM7PS8yJT0zJKi0uyQWps1Lyyy9RCIbK5FQqOILlUlOwq4eb5xfsqKSjlJNYXBJfWpCSWJIKCnyQ + r0HRZmihYGBmZWBsZWCqa2CqpKNUkF9QmpNYlFlSqWRlaKCjlJdfkgpybWRmak6KQkm+Qm5iSSlI + WiE/TyExObmoNDVFoaAoMy85syAxRy+mKCYPS/AHFOWXpCaXpKYoBKcmg7RnphbrKOQXKYR4BgTr + KCQWpSoUwyUUyjPyi1MRhipkFiuUZKaCbS/JSFVwzs8rLs1NLVIIKMpMTlUAR62ChnOAp6aeQkgG + isa8ZFBSSC1WKM8syVDIhCUHhcS8FIWUVBTJlFRoWtFTCM9IzVMA2QR1UyXE0yAng0RD9YL1FOCe + LEisLAYrzi/KTM/MS8wBeQsSbcgho6NQnpGZnJFallqkkFmskF6UmliSWgQOL+f8gsqizPSMEh0F + IwNDMx0Fj0SQKse8xJzKkszkYj2FoFRQCIOCD+wPwApSi3Izi4sz8/P0lGpjawFhzJyalgMAAA== + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '625' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:04:37 GMT + Expires: + - Sun, 21 Jul 2024 17:04:37 GMT + Last-Modified: + - Thu, 18 Jul 2024 11:03:05 GMT + Pragma: + - no-cache + Server: + - Apache + Set-Cookie: + - bm_sv=F66A7B5EFE81C4DAF0BDC1938F7830AC~YAAQZWIsFyr8LMyQAQAAQp5A1hjGd+251KLs5UL8y171E0refkKN5HSNsZ4KfEEDPHboCm8dLZq0nyHktfIUbkY2//rGA59QtGAM4ox2wx754l7BIlcVAvTzUBGljqcJAQ7UF5fI+l4KaSp65uLOKAEk1N/CC57hX7XTq7HvIcv8++BR0DOzNk5KUZRYMx/n1E+jYw4WhkG5jPdexYLn8mEQm3blkZ+OdYFcuYWcRltKvffPEzJM6ZK8g+c90j2E7h+Uug==~1; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:04:37 GMT; Max-Age=7200; + Secure + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ak_bmsc=63739BEFDA7932BFAB14DAD81E5BDB17~000000000000000000000000000000~YAAQZWIsFx/8LMyQAQAAq51A1hi7OXLuhqzOrSl+e03UEFz0RM35E6A3pT5LpAcSgnifHTAU7GVnkchLXYtlpl5XBpS78n7nMdO8H88dmYhewu2BX/qYJwcXozQhRUnbfHwVmjThZzxdF7ZXuCXG3XdJlT1PhOzqNie2M33Vn00I3lrXW9Cz9fo01U0jeRRxas9fJoB5MbFRlXUKOJ8BkWlrjVK/r5RO7ILkjbysRxaPlCvTDKgn+VReklE0FNpO8rhpAwIWWoIT0v8AMil0jx7ZwS6/Y+drraLxRw4MC0vbfVThvp0DDAKrlUsBiiGPyuenx0JHYaX+8jQ024lQf6ynRCKGsjnSUo64o+WA2Hvux0KoVms7dZTbF5NUdv5O + method: GET + uri: https://api.stlouisfed.org/fred/series?api_key=MOCK_API_KEY&file_type=json&series_id=DTP5A25 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy0TUw1zUyUNJByKbmpaDLFacWZaYWFytZ + RVcrZYJkXUICTB2NTJG1kWxoSWZJTqqSlZKpbmRqYpGCgZ6hkamqQkhRamJxaVGlgmdeWk5iSWZ+ + nq5nXkpqRWqKglN+XoqOgktpqoJJjL6haYy+kQHYCflJxalFZWC1yF4z0DUw0zUGeQ1ZAarvDM2V + dJTSilILS1PzkiuVrJRcEjNzKpHF4osz8sGB5aKko1Sal1lSrGSlFJBalJyaVwITgatRVdJRKk5N + LM7PS8yJT0zJKi0uyQWps1Lyyy9RCIbK5FQqOILlUlOwq4eb5xfsqKSjlJNYXBJfWpCSWJIKCntY + rBlaKBiYWRkYWxmY6hqAoqIgv6A0J7Eos6RSycrYUEcpL78kFeTayMzUnBSFknyF3MSSUpC0Qn6e + QmJyclFpaopCQVFmXnJmQWKOXkxRTB6W0A8oyi9JTS5JTVEITk0Gac9MLdZRyC9SCPEMCNZRSCxK + VSiGSyiUZ+QXpyIMVcgsVijJTAXbXpKRquCcn1dcmptapBBQlJmcqgCOWQUN5wBPTT2FkAwUjXnJ + oJSQWqxQnlmSoZAJSw0KiXkpCimpKJIpqdCkoqcQnpGapwCyCeqmSoinQU4GiYbqBespwD1ZkFhZ + DFacX5SZnpmXmAPyFiTakENGR6E8IzM5I7UstUghs1ghvSg1sSS1CBxezvkFlUWZ6RklOgpGBoZm + OgoeiSBVjnmJOZUlmcnFegpBqaAQBgUf2B+AFaQW5WYWF2fm5+kp1cbWAgCpEhgylQMAAA== + headers: + Cache-Control: + - max-age=0, no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '622' + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 21 Jul 2024 17:04:37 GMT + Expires: + - Sun, 21 Jul 2024 17:04:37 GMT + Last-Modified: + - Thu, 18 Jul 2024 11:03:05 GMT + Pragma: + - no-cache + Server: + - Apache + Set-Cookie: + - ak_bmsc=63739BEFDA7932BFAB14DAD81E5BDB17~000000000000000000000000000000~YAAQZWIsFy/8LMyQAQAAgZ5A1hhDl0pMvWWW/9QOvwOTOp/3E0LbgXIoiikxviQwLEBRXytQZhweMcC884zoLGN8GRdyumJuKG3bVL91Ii5VXsdV1WVWSfZXP2ziYDrhxCl39O28NEfVys/BjtwvizNCOAEY9mGQ/yXNGOb512tSVzHD+RkYQyWIZazz75JuyEoLBUtKeexXv27AyYBzYwX6KN+6eNxnOzFhpd6YsdegH2wopcRUXAfb65CBY/wxhakEJI1OC/e47QXTXsl10OSqVGNp9M2DDXZcy+XU05MeGFqSKk0lcfAqs0hpHAka2hIl0TRbhsstf/s1poBUUJ12uxpVefkuFo8sbjfzSY0ngAWdge7BuUI2/s2q8tT2keqJqMgzNeHhWA==; + Domain=.stlouisfed.org; Path=/; Expires=Sun, 21 Jul 2024 19:04:37 GMT; Max-Age=7200 + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/fred/tests/test_fred_fetchers.py b/openbb_platform/providers/fred/tests/test_fred_fetchers.py index 24b78c343b0..3436b6840fe 100644 --- a/openbb_platform/providers/fred/tests/test_fred_fetchers.py +++ b/openbb_platform/providers/fred/tests/test_fred_fetchers.py @@ -51,6 +51,7 @@ from openbb_fred.models.survey_of_economic_conditions_chicago import ( FredSurveyOfEconomicConditionsChicagoFetcher, ) from openbb_fred.models.tbffr import FREDSelectedTreasuryBillFetcher +from openbb_fred.models.tips_yields import FredTipsYieldsFetcher from openbb_fred.models.tmc import FREDTreasuryConstantMaturityFetcher from openbb_fred.models.university_of_michigan import FredUofMichiganFetcher from openbb_fred.models.us_yield_curve import ( @@ -518,3 +519,17 @@ def test_fred_release_table_fetcher(credentials=test_credentials): fetcher = FredReleaseTableFetcher() result = fetcher.test(params, credentials) assert result is None + + +@pytest.mark.record_http +def test_fred_tips_yields_fetcher(credentials=test_credentials): + """Test FRED TIPS Yields.""" + params = { + "start_date": datetime.date(2024, 7, 17), + "end_date": datetime.date(2024, 7, 17), + "maturity": 5, + } + + fetcher = FredTipsYieldsFetcher() + result = fetcher.test(params, credentials) + assert result is None