diff --git a/openbb_platform/core/openbb_core/provider/standard_models/gdp_nominal.py b/openbb_platform/core/openbb_core/provider/standard_models/gdp_nominal.py index 7660c84af2b..078f25159eb 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/gdp_nominal.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/gdp_nominal.py @@ -1,9 +1,9 @@ """Nominal GDP Standard Model.""" from datetime import date as dateType -from typing import Literal, Optional +from typing import Optional, Union -from pydantic import Field, field_validator +from pydantic import Field from openbb_core.provider.abstract.data import Data from openbb_core.provider.abstract.query_params import QueryParams @@ -16,11 +16,6 @@ from openbb_core.provider.utils.descriptions import ( class GdpNominalQueryParams(QueryParams): """Nominal GDP Query.""" - units: Literal["usd", "usd_cap"] = Field( - default="usd", - description=QUERY_DESCRIPTIONS.get("units", "") - + " Units to get nominal GDP in. Either usd or usd_cap indicating per capita.", - ) start_date: Optional[dateType] = Field( default=None, description=QUERY_DESCRIPTIONS.get("start_date") ) @@ -28,19 +23,14 @@ class GdpNominalQueryParams(QueryParams): default=None, description=QUERY_DESCRIPTIONS.get("end_date") ) - @field_validator("units", mode="before", check_fields=False) - @classmethod - def to_lower(cls, v: Optional[str]) -> Optional[str]: - """Convert field to lowercase.""" - return v.lower() if v else v - class GdpNominalData(Data): """Nominal GDP Data.""" - date: Optional[dateType] = Field( - default=None, description=DATA_DESCRIPTIONS.get("date") + date: dateType = Field(description=DATA_DESCRIPTIONS.get("date")) + country: str = Field( + default=None, description="The country represented by the GDP value." ) - value: Optional[float] = Field( - default=None, description="Nominal GDP value on the date." + value: Union[int, float] = Field( + description="GDP value for the country and date.", ) diff --git a/openbb_platform/extensions/economy/integration/test_economy_api.py b/openbb_platform/extensions/economy/integration/test_economy_api.py index 247fedab539..fb5efbabd6c 100644 --- a/openbb_platform/extensions/economy/integration/test_economy_api.py +++ b/openbb_platform/extensions/economy/integration/test_economy_api.py @@ -173,17 +173,20 @@ def test_economy_gdp_forecast(params, headers): [ ( { - "units": "usd", + "country": "united_states", "start_date": "2023-01-01", "end_date": "2023-06-06", - "provider": "oecd", + "provider": "econdb", + "use_cache": False, } ), ( { "country": "united_states", "provider": "oecd", - "units": "usd", + "units": "level", + "frequency": "quarter", + "price_base": "volume", "start_date": "2023-01-01", "end_date": "2023-06-06", } diff --git a/openbb_platform/extensions/economy/integration/test_economy_python.py b/openbb_platform/extensions/economy/integration/test_economy_python.py index b65a8b75a6a..24999aa0382 100644 --- a/openbb_platform/extensions/economy/integration/test_economy_python.py +++ b/openbb_platform/extensions/economy/integration/test_economy_python.py @@ -160,13 +160,23 @@ def test_economy_gdp_forecast(params, obb): @parametrize( "params", [ - ({"units": "usd", "start_date": "2021-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + "provider": "econdb", + "use_cache": False, + } + ), ( { "country": "united_states", "provider": "oecd", - "units": "usd", - "start_date": "2021-01-01", + "units": "level", + "price_base": "volume", + "frequency": "quarter", + "start_date": "2023-01-01", "end_date": "2023-06-06", } ), diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json index 8ac8be1e600..345a76ffd78 100644 --- a/openbb_platform/openbb/assets/reference.json +++ b/openbb_platform/openbb/assets/reference.json @@ -2637,17 +2637,9 @@ "message": null }, "description": "Get Nominal GDP Data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.gdp.nominal(provider='oecd')\nobb.economy.gdp.nominal(units='usd', provider='oecd')\n```\n\n", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.gdp.nominal(provider='oecd')\nobb.economy.gdp.nominal(units=usd, provider='oecd')\n```\n\n", "parameters": { "standard": [ - { - "name": "units", - "type": "Literal['usd', 'usd_cap']", - "description": "The unit of measurement for the data. Units to get nominal GDP in. Either usd or usd_cap indicating per capita.", - "default": "usd", - "optional": true, - "choices": null - }, { "name": "start_date", "type": "Union[date, str]", @@ -2666,20 +2658,190 @@ }, { "name": "provider", - "type": "Literal['oecd']", - "description": "The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: oecd.", + "type": "Literal['econdb', 'oecd']", + "description": "The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: econdb, oecd.", "default": null, "optional": true } ], + "econdb": [ + { + "name": "country", + "type": "Union[str, List[str]]", + "description": "The country to get data.Use 'all' to get data for all available countries. Multiple items allowed for provider(s): econdb, oecd.", + "default": "united_states", + "optional": true, + "choices": [ + "oecd", + "oecd_26", + "oecd_europe", + "g7", + "g20", + "euro_area", + "european_union_27", + "european_union_15", + "nafta", + "argentina", + "australia", + "austria", + "belgium", + "bulgaria", + "brazil", + "canada", + "chile", + "colombia", + "costa_rica", + "croatia", + "czech_republic", + "denmark", + "estonia", + "finland", + "france", + "germany", + "greece", + "hungary", + "iceland", + "india", + "indonesia", + "ireland", + "israel", + "italy", + "japan", + "korea", + "latvia", + "lithuania", + "luxembourg", + "mexico", + "netherlands", + "new_zealand", + "norway", + "poland", + "portugal", + "romania", + "russia", + "saudi_arabia", + "slovak_republic", + "slovenia", + "south_africa", + "spain", + "sweden", + "switzerland", + "turkey", + "united_kingdom", + "united_states", + "all" + ] + }, + { + "name": "use_cache", + "type": "bool", + "description": "If True, the request will be cached for one day. Using cache is recommended to avoid needlessly requesting the same data.", + "default": true, + "optional": true, + "choices": null + } + ], "oecd": [ { "name": "country", - "type": "Literal['australia', 'austria', 'belgium', 'brazil', 'canada', 'chile', 'colombia', 'costa_rica', 'czech_republic', 'denmark', 'estonia', 'euro_area', 'european_union', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'poland', 'portugal', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'all']", - "description": "Country to get GDP for.", + "type": "Union[str, List[str]]", + "description": "The country to get data. Use 'all' to get data for all available countries. Multiple items allowed for provider(s): oecd.", "default": "united_states", "optional": true, - "choices": null + "choices": [ + "oecd", + "oecd_26", + "oecd_europe", + "g7", + "g20", + "euro_area", + "european_union_27", + "european_union_15", + "nafta", + "argentina", + "australia", + "austria", + "belgium", + "bulgaria", + "brazil", + "canada", + "chile", + "colombia", + "costa_rica", + "croatia", + "czech_republic", + "denmark", + "estonia", + "finland", + "france", + "germany", + "greece", + "hungary", + "iceland", + "india", + "indonesia", + "ireland", + "israel", + "italy", + "japan", + "korea", + "latvia", + "lithuania", + "luxembourg", + "mexico", + "netherlands", + "new_zealand", + "norway", + "poland", + "portugal", + "romania", + "russia", + "saudi_arabia", + "slovak_republic", + "slovenia", + "south_africa", + "spain", + "sweden", + "switzerland", + "turkey", + "united_kingdom", + "united_states", + "all" + ] + }, + { + "name": "frequency", + "type": "Literal['quarter', 'annual']", + "description": "Frequency of the data.", + "default": "quarter", + "optional": true, + "choices": [ + "quarter", + "annual" + ] + }, + { + "name": "units", + "type": "Literal['level', 'index', 'capita']", + "description": "The unit of measurement for the data.Both 'level' and 'capita' (per) are measured in USD.", + "default": "level", + "optional": true, + "choices": [ + "level", + "index", + "capita" + ] + }, + { + "name": "price_base", + "type": "Literal['current_prices', 'volume']", + "description": "Price base for the data, volume is chain linked volume.", + "default": "current_prices", + "optional": true, + "choices": [ + "current_prices", + "volume" + ] } ] }, @@ -2692,7 +2854,7 @@ }, { "name": "provider", - "type": "Optional[Literal['oecd']]", + "type": "Optional[Literal['econdb', 'oecd']]", "description": "Provider name." }, { @@ -2718,16 +2880,50 @@ "name": "date", "type": "date", "description": "The date of the data.", + "default": "", + "optional": false, + "choices": null + }, + { + "name": "country", + "type": "str", + "description": "The country represented by the GDP value.", "default": null, "optional": true, "choices": null }, { "name": "value", + "type": "Union[int, float]", + "description": "GDP value for the country and date.", + "default": "", + "optional": false, + "choices": null + } + ], + "econdb": [ + { + "name": "value", + "type": "Union[int, float]", + "description": "GDP value for the country and date.", + "default": "", + "optional": false, + "choices": null + }, + { + "name": "real_growth_qoq", "type": "float", - "description": "Nominal GDP value on the date.", - "default": null, - "optional": true, + "description": "Real GDP growth rate quarter over quarter.", + "default": "", + "optional": false, + "choices": null + }, + { + "name": "real_growth_yoy", + "type": "float", + "description": "Real GDP growth rate year over year.", + "default": "", + "optional": false, "choices": null } ], diff --git a/openbb_platform/openbb/package/economy_gdp.py b/openbb_platform/openbb/package/economy_gdp.py index 1a08cca3b24..a30de7ae621 100644 --- a/openbb_platform/openbb/package/economy_gdp.py +++ b/openbb_platform/openbb/package/economy_gdp.py @@ -122,12 +122,6 @@ class ROUTER_economy_gdp(Container): @validate def nominal( self, - units: Annotated[ - Literal["usd", "usd_cap"], - OpenBBField( - description="The unit of measurement for the data. Units to get nominal GDP in. Either usd or usd_cap indicating per capita." - ), - ] = "usd", start_date: Annotated[ Union[datetime.date, None, str], OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), @@ -137,9 +131,9 @@ class ROUTER_economy_gdp(Container): OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ - Optional[Literal["oecd"]], + Optional[Literal["econdb", "oecd"]], OpenBBField( - description="The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: oecd." + description="The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: econdb, oecd." ), ] = None, **kwargs @@ -148,23 +142,29 @@ class ROUTER_economy_gdp(Container): Parameters ---------- - units : Literal['usd', 'usd_cap'] - The unit of measurement for the data. Units to get nominal GDP in. Either usd or usd_cap indicating per capita. 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['oecd']] - The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: oecd. - country : Literal['australia', 'austria', 'belgium', 'brazil', 'canada', 'chile', 'colombia', 'costa_rica', 'czech_republic', 'denmark', 'estonia', 'euro_area', 'european_union', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'poland', 'portugal', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'all'] - Country to get GDP for. (provider: oecd) + provider : Optional[Literal['econdb', 'oecd']] + The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: econdb, oecd. + country : str + The country to get data.Use 'all' to get data for all available countries. Multiple comma separated items allowed. (provider: econdb, oecd) + use_cache : bool + If True, the request will be cached for one day. Using cache is recommended to avoid needlessly requesting the same data. (provider: econdb) + frequency : Literal['quarter', 'annual'] + Frequency of the data. (provider: oecd) + units : Literal['level', 'index', 'capita'] + The unit of measurement for the data.Both 'level' and 'capita' (per) are measured in USD. (provider: oecd) + price_base : Literal['current_prices', 'volume'] + Price base for the data, volume is chain linked volume. (provider: oecd) Returns ------- OBBject results : List[GdpNominal] Serializable results. - provider : Optional[Literal['oecd']] + provider : Optional[Literal['econdb', 'oecd']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -175,10 +175,16 @@ class ROUTER_economy_gdp(Container): GdpNominal ---------- - date : Optional[date] + date : date The date of the data. - value : Optional[float] - Nominal GDP value on the date. + country : Optional[str] + The country represented by the GDP value. + value : Union[int, float] + GDP value for the country and date. + real_growth_qoq : Optional[float] + Real GDP growth rate quarter over quarter. (provider: econdb) + real_growth_yoy : Optional[float] + Real GDP growth rate year over year. (provider: econdb) Examples -------- @@ -194,15 +200,20 @@ class ROUTER_economy_gdp(Container): "provider": self._get_provider( provider, "economy.gdp.nominal", - ("oecd",), + ("econdb", "oecd"), ) }, standard_params={ - "units": units, "start_date": start_date, "end_date": end_date, }, extra_params=kwargs, + info={ + "country": { + "econdb": {"multiple_items_allowed": True}, + "oecd": ["multiple_items_allowed"], + } + }, ) ) diff --git a/openbb_platform/providers/econdb/openbb_econdb/__init__.py b/openbb_platform/providers/econdb/openbb_econdb/__init__.py index bfb25287d5c..fb895b00e62 100644 --- a/openbb_platform/providers/econdb/openbb_econdb/__init__.py +++ b/openbb_platform/providers/econdb/openbb_econdb/__init__.py @@ -4,6 +4,7 @@ from openbb_core.provider.abstract.provider import Provider from openbb_econdb.models.available_indicators import EconDbAvailableIndicatorsFetcher from openbb_econdb.models.country_profile import EconDbCountryProfileFetcher from openbb_econdb.models.economic_indicators import EconDbEconomicIndicatorsFetcher +from openbb_econdb.models.gdp_nominal import EconDbGdpNominalFetcher from openbb_econdb.models.yield_curve import EconDbYieldCurveFetcher econdb_provider = Provider( @@ -22,6 +23,7 @@ aggregate statistics.""", "AvailableIndicators": EconDbAvailableIndicatorsFetcher, "CountryProfile": EconDbCountryProfileFetcher, "EconomicIndicators": EconDbEconomicIndicatorsFetcher, + "GdpNominal": EconDbGdpNominalFetcher, "YieldCurve": EconDbYieldCurveFetcher, }, repr_name="EconDB", diff --git a/openbb_platform/providers/econdb/openbb_econdb/models/gdp_nominal.py b/openbb_platform/providers/econdb/openbb_econdb/models/gdp_nominal.py new file mode 100644 index 00000000000..cd7d07cf140 --- /dev/null +++ b/openbb_platform/providers/econdb/openbb_econdb/models/gdp_nominal.py @@ -0,0 +1,209 @@ +"""EconDB GDP Nominal Model.""" + +# pylint: disable=unused-argument + +from typing import Any, Dict, List, Optional, Union +from warnings import warn + +from openbb_core.app.model.abstract.error import OpenBBError +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.gdp_nominal import ( + GdpNominalData, + GdpNominalQueryParams, +) +from openbb_core.provider.utils.descriptions import ( + QUERY_DESCRIPTIONS, +) +from openbb_core.provider.utils.errors import EmptyDataError +from pydantic import Field, field_validator + + +class EconDbGdpNominalQueryParams(GdpNominalQueryParams): + """EconDB GDP Nominal Query.""" + + __json_schema_extra__ = { + "country": {"multiple_items_allowed": True}, + } + + country: str = Field( + description=QUERY_DESCRIPTIONS.get("country", "") + + "Use 'all' to get data for all available countries.", + default="united_states", + ) + use_cache: bool = Field( + default=True, + description="If True, the request will be cached for one day." + + " Using cache is recommended to avoid needlessly requesting the same data.", + ) + + @field_validator("country", mode="before", check_fields=False) + @classmethod + def validate_country(cls, v): + """Validate the country.""" + # pylint: disable=import-outside-toplevel + from openbb_econdb.utils.helpers import ( + COUNTRY_GROUPS, + COUNTRY_MAP, + INDICATOR_COUNTRIES, + THREE_LETTER_ISO_MAP, + ) + + country = v if isinstance(v, list) else v.split(",") + + if "all" in country: + return ",".join(INDICATOR_COUNTRIES.get("GDP")) + + for c in country.copy(): + if ( + len(c) == 2 + and c.upper() not in list(COUNTRY_MAP.values()) + and c.lower() != "g7" + ) or ( + len(c) > 3 and c.lower() not in list(COUNTRY_MAP) + list(COUNTRY_GROUPS) + ): + country.remove(c) + elif len(c) == 3 and c.lower() != "g20": + _c = THREE_LETTER_ISO_MAP.get(c.upper(), "") + if _c: # pylint: disable=R0801 + country[country.index(c)] = _c + else: + warn(f"Error: {c} is not a valid country code.") + country.remove(c) + elif len(c) > 3 and c.lower() in COUNTRY_MAP: + country[country.index(c)] = COUNTRY_MAP[c.lower()].upper() + elif len(c) > 2 and c.lower() in COUNTRY_GROUPS: + country[country.index(c)] = ",".join(COUNTRY_GROUPS[c.lower()]) + if len(country) == 0: + raise OpenBBError("No valid countries were supplied.") + return ",".join(country) + + +class EconDbGdpNominalData(GdpNominalData): + """EconDB GDP Nominal Data.""" + + real_growth_qoq: float = Field( + description="Real GDP growth rate quarter over quarter.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + real_growth_yoy: float = Field( + description="Real GDP growth rate year over year.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + value: Union[int, float] = Field( + description="GDP value for the country and date.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + + +class EconDbGdpNominalFetcher( + Fetcher[ + EconDbGdpNominalQueryParams, + List[EconDbGdpNominalData], + ] +): + """EconDB GDP Nominal Fetcher.""" + + require_credentials = False + + @staticmethod + def transform_query(params: Dict[str, Any]) -> EconDbGdpNominalQueryParams: + """Transform the query parameters.""" + return EconDbGdpNominalQueryParams(**params) + + @staticmethod + async def aextract_data( + query: EconDbGdpNominalQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs, + ) -> List[Dict]: + """Extract the data.""" + # pylint: disable=import-outside-toplevel + import asyncio # noqa + from pandas import DataFrame, concat + from openbb_econdb.utils.helpers import get_context, parse_context + + country = query.country.split(",") + results: List = [] + + async def get_one_country(_country): + """Get the GDP data for one country.""" + _country = _country.upper() + final_df = DataFrame() + gdp_response, gdp_qoq_response, gdp_yoy_response = await asyncio.gather( + get_context("GDP", _country, "TUSD", query.use_cache), + get_context("RGDP", _country, "TPOP", query.use_cache), + get_context("RGDP", _country, "TOYA", query.use_cache), + ) + gdp = parse_context(gdp_response, latest=False).rename(columns={"GDP": "value"}) # type: ignore + gdp_qoq = parse_context(gdp_qoq_response, latest=False).rename(columns={"RGDP": "real_growth_qoq"}) # type: ignore + gdp_yoy = parse_context(gdp_yoy_response, latest=False).rename(columns={"RGDP": "real_growth_yoy"}) # type: ignore + gdp = ( + gdp.set_index("Country", append=True) + if "Country" in gdp.columns + else gdp + ) + gdp_qoq = ( + gdp_qoq.set_index("Country", append=True) + if "Country" in gdp_qoq.columns + else gdp_qoq + ) + gdp_yoy = ( + gdp_yoy.set_index("Country", append=True) + if "Country" in gdp_yoy.columns + else gdp_yoy + ) + final_df = concat( + [gdp, gdp_qoq, gdp_yoy], + axis=1, + ) + if final_df.empty: + warn(f"Error: No data returned for {_country}.") + if not final_df.empty: + results.extend( + final_df.reset_index() + .rename(columns={"Country": "country"}) + .to_dict(orient="records") + ) + + chunks = [country[i : i + 5] for i in range(0, len(country), 5)] + for chunk in chunks: + await asyncio.gather(*[get_one_country(c) for c in chunk]) + + if not results: + raise EmptyDataError("The request returned empty.") + + return results + + @staticmethod + def transform_data( + query: EconDbGdpNominalQueryParams, + data: List[Dict], + **kwargs, + ) -> List[EconDbGdpNominalData]: + """Transform the data.""" + # pylint: disable=import-outside-toplevel + from pandas import DataFrame, to_datetime + + df = DataFrame(data) + + if query.start_date: + df = df[to_datetime(df["date"]) >= to_datetime(query.start_date)] + if query.end_date: + df = df[to_datetime(df["date"]) <= to_datetime(query.end_date)] + + if df.empty: # type: ignore + raise EmptyDataError( + "No data was found for the supplied date range and countries." + ) + + df = df.set_index(["date", "country"]) # type: ignore + df = df.dropna() + df["value"] = (df["value"] * 1_000_000_000).astype("int64") + df["real_growth_qoq"] = df["real_growth_qoq"] / 100 + df["real_growth_yoy"] = df["real_growth_yoy"] / 100 + df = df.reset_index() + df = df.sort_values(by=["date", "value"], ascending=[True, False]) + + return [ + EconDbGdpNominalData.model_validate(d) for d in df.to_dict(orient="records") + ] diff --git a/openbb_platform/providers/econdb/tests/record/http/test_econdb_fetchers/test_econdb_gdp_nominal_fetcher_urllib3_v1.yaml b/openbb_platform/providers/econdb/tests/record/http/test_econdb_fetchers/test_econdb_gdp_nominal_fetcher_urllib3_v1.yaml new file mode 100644 index 00000000000..262060b2686 --- /dev/null +++ b/openbb_platform/providers/econdb/tests/record/http/test_econdb_fetchers/test_econdb_gdp_nominal_fetcher_urllib3_v1.yaml @@ -0,0 +1,231 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.econdb.com/series/context/?tickers=%5BRGDPIN~TOYA%5D + response: + body: + string: !!binary | + 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 + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8a225a33fe3f842f-YVR + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Fri, 12 Jul 2024 16:18:59 GMT + NEL: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Referrer-Policy: + - same-origin + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=FgSHgHZwEWdso2Hd6X6mEB%2BPLPkFwMZ4yHBe6eYsoF91I%2FwbyyZ2CdLpTzRSEWXe%2F8R%2BRqtNKRl%2BVmp1Lcn7sOgoiKUDy%2FBOjapNhQ3GM6crx1vgvL3FjvH2RhcL4%2F2CZE0iN02atES88o%2Bp"}],"group":"cf-nel","max_age":604800}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + - Origin + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.econdb.com/series/context/?tickers=%5BRGDPIN~TPOP%5D + response: + body: + string: !!binary | + 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 + yYdDcX2+/Q8GHBSHsCAAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8a225a33fd612d7e-YVR + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Fri, 12 Jul 2024 16:18:59 GMT + NEL: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Referrer-Policy: + - same-origin + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=W9hythUsRfvZJiIQQYqKt%2FgwbrbjHGy%2B9064ijxKoBgIYSkXcL%2Bwwi0AZz7PF71byD7%2F6wxxtRJxqgi046EXORTYKfznTA7syZqqCN2iSQ%2Bb%2BIjSug5aMEtSclW9akNMBtxAzU2fSocVy8st"}],"group":"cf-nel","max_age":604800}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + - Origin + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.econdb.com/series/context/?tickers=%5BGDPIN~TUSD%5D + response: + body: + string: !!binary | + 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 + 0tAfAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8a225a340d6d840e-YVR + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Fri, 12 Jul 2024 16:18:59 GMT + NEL: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Referrer-Policy: + - same-origin + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=tBsVKCJZUiJS4RST46xBmYWRwJVwZ3BbTKG1aF8dpG4XO6RQeWQmmB%2F7WeJwOgfdAyzzqyFRuKMP45vAfr6kBW65i1bjUE1l0q3Wq9BLnvmyaOr3oM3GGtnYCaCftygqHUDCgawYAfOqwNrb"}],"group":"cf-nel","max_age":604800}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + - Origin + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/econdb/tests/record/http/test_econdb_fetchers/test_econdb_gdp_nominal_fetcher_urllib3_v2.yaml b/openbb_platform/providers/econdb/tests/record/http/test_econdb_fetchers/test_econdb_gdp_nominal_fetcher_urllib3_v2.yaml new file mode 100644 index 00000000000..3e131a9b931 --- /dev/null +++ b/openbb_platform/providers/econdb/tests/record/http/test_econdb_fetchers/test_econdb_gdp_nominal_fetcher_urllib3_v2.yaml @@ -0,0 +1,231 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.econdb.com/series/context/?tickers=%5BRGDPIN~TOYA%5D + response: + body: + string: !!binary | + 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 + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8a2256fb5ccb7102-YVR + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Fri, 12 Jul 2024 16:16:47 GMT + NEL: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Referrer-Policy: + - same-origin + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=7j4Cxvi9e74lBtVN4gim19N8VkGbGuVGr%2Bt8ZjYzjuuPbK4UytYg1k7pvPbTwPJdLlw3cMBpvViG%2FelgVEYiMPD6D5aU%2BL54oMirDSKBCViSy2l2WO5t1gO96mckFxX3Dr68O2LOQh20Ihfd"}],"group":"cf-nel","max_age":604800}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + - Origin + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.econdb.com/series/context/?tickers=%5BRGDPIN~TPOP%5D + response: + body: + string: !!binary | + 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 + yYdDcX2+/Q8GHBSHsCAAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8a2256fb5ea98429-YVR + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Fri, 12 Jul 2024 16:16:47 GMT + NEL: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Referrer-Policy: + - same-origin + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=3NWiaaXaDCjPrdGmvzB0pnYC5CZtjwbydIuNzkA9Ih6JpaYC0%2FAzd%2FLOgXw60bcYzCgb%2FtBx%2FcOA2RsUG1JAx72LWZtHpeec60bUZmDKd317qvCvpc3pyuCy%2B9aZhgQt5td1cZ2aO0fEXyuA"}],"group":"cf-nel","max_age":604800}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + - Origin + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.econdb.com/series/context/?tickers=%5BGDPIN~TUSD%5D + response: + body: + string: !!binary | + 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 + 0tAfAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8a2256fb59708441-YVR + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Fri, 12 Jul 2024 16:16:47 GMT + NEL: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Referrer-Policy: + - same-origin + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=qRKNCe0DFXM6O7cCwJnQDnszbLxt3e9bFkijhN27zQEpiKHkZbwlyTxWtiFgoJIYKxc7wNenDn9g9S9WnPeNp1S6TBpHnh7p6wSf5lzcQKqC79XZn0ZPD9ynBakyuot27Aq5BZqD2a833Mz6"}],"group":"cf-nel","max_age":604800}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + - Origin + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/econdb/tests/test_econdb_fetchers.py b/openbb_platform/providers/econdb/tests/test_econdb_fetchers.py index 11d2486f7ab..0c31fde5a71 100644 --- a/openbb_platform/providers/econdb/tests/test_econdb_fetchers.py +++ b/openbb_platform/providers/econdb/tests/test_econdb_fetchers.py @@ -7,6 +7,7 @@ from openbb_core.app.service.user_service import UserService from openbb_econdb.models.available_indicators import EconDbAvailableIndicatorsFetcher from openbb_econdb.models.country_profile import EconDbCountryProfileFetcher from openbb_econdb.models.economic_indicators import EconDbEconomicIndicatorsFetcher +from openbb_econdb.models.gdp_nominal import EconDbGdpNominalFetcher from openbb_econdb.models.yield_curve import EconDbYieldCurveFetcher test_credentials = UserService().default_user_settings.credentials.model_dump( @@ -91,3 +92,16 @@ def test_econdb_economic_indicators_main_fetcher(credentials=test_credentials): fetcher = EconDbEconomicIndicatorsFetcher() result = fetcher.test(params, credentials) assert result is None + + +@pytest.mark.record_http +def test_econdb_gdp_nominal_fetcher(credentials=test_credentials): + """Test EconDB GDP Nominal Fetcher.""" + params = { + "country": "IN", + "use_cache": False, + } + + fetcher = EconDbGdpNominalFetcher() + result = fetcher.test(params, credentials) + assert result is None diff --git a/openbb_platform/providers/oecd/openbb_oecd/models/gdp_nominal.py b/openbb_platform/providers/oecd/openbb_oecd/models/gdp_nominal.py index 47e3c787444..75b9a7f4f7e 100644 --- a/openbb_platform/providers/oecd/openbb_oecd/models/gdp_nominal.py +++ b/openbb_platform/providers/oecd/openbb_oecd/models/gdp_nominal.py @@ -1,101 +1,200 @@ """OECD Nominal GDP Model.""" -from datetime import date -from typing import Any, Dict, List, Literal, Optional, Union +# pylint: disable=unused-argument +from datetime import date +from typing import Any, Dict, List, Literal, Optional +from warnings import warn + +from openbb_core.app.model.abstract.error import OpenBBError from openbb_core.provider.abstract.fetcher import Fetcher from openbb_core.provider.standard_models.gdp_nominal import ( GdpNominalData, GdpNominalQueryParams, ) -from openbb_oecd.utils import constants +from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_oecd.utils.constants import CODE_TO_COUNTRY_GDP, COUNTRY_TO_CODE_GDP from pydantic import Field, field_validator -gdp_countries = tuple(constants.COUNTRY_TO_CODE_GDP.keys()) + ("all",) -GDPCountriesLiteral = Literal[gdp_countries] # type: ignore - -# pylint: disable=unused-argument +COUNTRIES = list(COUNTRY_TO_CODE_GDP) + ["all"] class OECDGdpNominalQueryParams(GdpNominalQueryParams): - """OECD Nominal GDP Query.""" + """OECD Nominal GDP Query. - country: GDPCountriesLiteral = Field( - description="Country to get GDP for.", default="united_states" + Source: https://www.oecd.org/en/data/datasets/gdp-and-non-financial-accounts.html + + This table presents Gross Domestic Product (GDP) and its main components according to the expenditure approach. + Data is presented in US dollars. In the expenditure approach, the components of GDP are: + final consumption expenditure of households and non-profit institutions serving households (NPISH) + plus final consumption expenditure of General Government plus gross fixed capital formation (or investment) + plus net trade (exports minus imports). + """ + + __json_schema_extra__ = {"country": ["multiple_items_allowed"]} + + country: str = Field( + description=QUERY_DESCRIPTIONS.get("country", "") + + " Use 'all' to get data for all available countries.", + default="united_states", + json_schema_extra={"choices": COUNTRIES}, # type: ignore ) + frequency: Literal["quarter", "annual"] = Field( + description="Frequency of the data.", + default="quarter", + json_schema_extra={"choices": ["quarter", "annual"]}, + ) + units: Literal["level", "index", "capita"] = Field( + default="level", + description=QUERY_DESCRIPTIONS.get("units", "") + + "Both 'level' and 'capita' (per) are measured in USD.", + json_schema_extra={"choices": ["level", "index", "capita"]}, + ) + price_base: Literal["current_prices", "volume"] = Field( + default="current_prices", + description="Price base for the data, volume is chain linked volume.", + json_schema_extra={"choices": ["current_prices", "volume"]}, + ) + + @field_validator("country", mode="before", check_fields=False) + @classmethod + def validate_country(cls, c): + """Validate country.""" + # pylint: disable=import-outside-toplevel + from openbb_core.provider.utils.helpers import check_item + + result: List = [] + values = c.replace(" ", "_").split(",") + for v in values: + if v.upper() in CODE_TO_COUNTRY_GDP: + result.append(CODE_TO_COUNTRY_GDP.get(v.upper())) + continue + try: + check_item(v.lower(), COUNTRIES) + except Exception as e: + if len(values) == 1: + raise e from e + warn(f"Invalid country: {v}. Skipping...") + continue + result.append(v.lower()) + if result: + return ",".join(result) + raise OpenBBError(f"No valid country found. -> {values}") class OECDGdpNominalData(GdpNominalData): """OECD Nominal GDP Data.""" - @field_validator("date", mode="before") - @classmethod - def date_validate(cls, in_date: Union[date, int]): # pylint: disable=E0213 - """Validate value.""" - if isinstance(in_date, int): - return date(in_date, 12, 31) - return date - class OECDGdpNominalFetcher( Fetcher[OECDGdpNominalQueryParams, List[OECDGdpNominalData]] ): - """Transform the query, extract and transform the data from the OECD endpoints.""" + """OECD GDP Nominal Fetcher.""" @staticmethod def transform_query(params: Dict[str, Any]) -> OECDGdpNominalQueryParams: """Transform the query.""" transformed_params = params.copy() - if transformed_params["start_date"] is None: - transformed_params["start_date"] = date(1950, 1, 1) - if transformed_params["end_date"] is None: + if transformed_params.get("start_date") is None: + transformed_params["start_date"] = ( + date(2020, 1, 1) + if transformed_params.get("country") == "all" + else date(1947, 1, 1) + ) + if transformed_params.get("end_date") is None: transformed_params["end_date"] = date(date.today().year, 12, 31) + if transformed_params.get("country") is None: + transformed_params["country"] = "united_states" return OECDGdpNominalQueryParams(**transformed_params) @staticmethod - def extract_data( + async def aextract_data( query: OECDGdpNominalQueryParams, credentials: Optional[Dict[str, str]], **kwargs: Any, ) -> List[Dict]: """Return the raw data from the OECD endpoint.""" # pylint: disable=import-outside-toplevel - from openbb_oecd.utils import helpers + from io import StringIO # noqa + from openbb_oecd.utils.helpers import oecd_date_to_python_date + from numpy import nan + from pandas import read_csv + from openbb_core.provider.utils.helpers import amake_request + + if query.units == "index": + unit = "INDICES" + elif query.units == "capita": + unit = "CAPITA" + else: + unit = "USD" + + frequency = "Q" if query.frequency == "quarter" else "A" + price_base = "V" if query.price_base == "current_prices" else "LR" + + if unit == "INDICES" and price_base == "V": + price_base = "DR" + + def country_string(input_str: str): + """Convert the list of countries to an abbreviated string.""" + if input_str == "all": + return "" + _countries = input_str.split(",") + + return "+".join([COUNTRY_TO_CODE_GDP[country] for country in _countries]) + + country = country_string(query.country) if query.country else "" - unit = "MLN_USD" if query.units == "usd" else "USD_CAP" url = ( - f"https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.{unit}.A/OECD" - "?contentType=csv&detail=code&separator=comma&csv-lang=en" - f"&startPeriod={query.start_date}&endPeriod={query.end_date}" + f"https://sdmx.oecd.org/public/rest/data/OECD.SDD.NAD,DSD_NAMAIN1@DF_QNA_EXPENDITURE_{unit},1.1" + + f"/{frequency}..{country}.S1..B1GQ.....{price_base}..?" + + f"&startPeriod={query.start_date}&endPeriod={query.end_date}" + + "&dimensionAtObservation=TIME_PERIOD&detail=dataonly&format=csvfile" ) - data_df = helpers.fetch_data(url, csv_kwargs={"encoding": "utf-8"}, **kwargs) - # Sometimes there is weird unicode characters in the column names, so we need to rename them. - # Even changing the encoding on the fetch doesn't seem to help. - data_df = data_df.rename( - columns={ - "LOCATION": "country", - "TIME_PERIOD": "date", - "OBS_VALUE": "value", - "Location": "country", - } + if query.units == "capita": + url = url.replace("B1GQ", "B1GQ_POP") + + async def response_callback(response, _): + """Response callback.""" + if response.status != 200: + raise OpenBBError(f"Error with the OECD request: {response.status}") + return await response.text() + + response = await amake_request( + url, timeout=30, response_callback=response_callback ) - data_df["country"] = data_df["country"].map(constants.CODE_TO_COUNTRY_GDP) - if query.country != "all": - data_df = data_df[data_df["country"] == query.country] - data_df = data_df[["country", "date", "value"]] - data_df["date"] = data_df["date"].apply(helpers.oecd_date_to_python_date) - data_df = data_df[ - (data_df["date"] <= query.end_date) & (data_df["date"] >= query.start_date) - ] - data_df["date"] = data_df["date"].apply( - lambda x: x.year - ) # Validator won't accept datetime.date? - return data_df.to_dict(orient="records") + + df = read_csv(StringIO(response)).get( # type: ignore + ["REF_AREA", "TIME_PERIOD", "OBS_VALUE"] + ) + if df.empty: # type: ignore + raise EmptyDataError() + df = df.rename( # type: ignore + columns={"REF_AREA": "country", "TIME_PERIOD": "date", "OBS_VALUE": "value"} + ) + + def apply_map(x): + """Apply the country map.""" + v = CODE_TO_COUNTRY_GDP.get(x, x) + v = v.replace("_", " ").title() + return v + + df["country"] = df["country"].apply(apply_map).str.replace("Oecd", "OECD") + df["date"] = df["date"].apply(oecd_date_to_python_date) + df = df[(df["date"] <= query.end_date) & (df["date"] >= query.start_date)] + if query.units == "level": + df["value"] = (df["value"].astype(float) * 1_000_000).astype("int64") + + df = df.sort_values(by=["date", "value"], ascending=False) + + return df.replace({nan: None}).to_dict(orient="records") @staticmethod def transform_data( - query: OECDGdpNominalQueryParams, data: List[Dict], **kwargs: Any + query: OECDGdpNominalQueryParams, + data: List[Dict], + **kwargs: Any, ) -> List[OECDGdpNominalData]: """Transform the data from the OECD endpoint.""" return [OECDGdpNominalData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/oecd/openbb_oecd/utils/constants.py b/openbb_platform/providers/oecd/openbb_oecd/utils/constants.py index 540c91727d4..35e8d3f8ce4 100644 --- a/openbb_platform/providers/oecd/openbb_oecd/utils/constants.py +++ b/openbb_platform/providers/oecd/openbb_oecd/utils/constants.py @@ -1,25 +1,36 @@ """Constants for the OECD provider.""" COUNTRY_TO_CODE_GDP = { + "oecd": "OECD", + "oecd_26": "OECD26", + "oecd_europe": "OECDE", + "g7": "G7", + "g20": "G20", + "euro_area": "EA20", + "european_union_27": "EU27_2020", + "european_union_15": "EU15", + "nafta": "USMCA", + "argentina": "ARG", "australia": "AUS", "austria": "AUT", "belgium": "BEL", + "bulgaria": "BGR", "brazil": "BRA", "canada": "CAN", "chile": "CHL", "colombia": "COL", "costa_rica": "CRI", + "croatia": "HRV", "czech_republic": "CZE", "denmark": "DNK", "estonia": "EST", - "euro_area": "EA", - "european_union": "EU", "finland": "FIN", "france": "FRA", "germany": "DEU", "greece": "GRC", "hungary": "HUN", "iceland": "ISL", + "india": "IND", "indonesia": "IDN", "ireland": "IRL", "israel": "ISR", @@ -35,7 +46,9 @@ COUNTRY_TO_CODE_GDP = { "norway": "NOR", "poland": "POL", "portugal": "PRT", + "romania": "ROU", "russia": "RUS", + "saudi_arabia": "SAU", "slovak_republic": "SVK", "slovenia": "SVN", "south_africa": "ZAF", diff --git a/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher_urllib3_v1.yaml b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher_urllib3_v1.yaml index 5c4c986affb..125fbeefec1 100644 --- a/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher_urllib3_v1.yaml +++ b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher_urllib3_v1.yaml @@ -3,89 +3,55 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: - keep-alive method: GET - uri: https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.MLN_USD.A/OECD?contentType=csv&csv-lang=en&detail=code&endPeriod=2023-06-06&separator=comma&startPeriod=2020-01-01 + uri: https://sdmx.oecd.org/public/rest/data/OECD.SDD.NAD,DSD_NAMAIN1@DF_QNA_EXPENDITURE_USD,1.1/Q..USA.S1..B1GQ.....V..?detail=dataonly&dimensionAtObservation=TIME_PERIOD&endPeriod=2023-06-06&format=csvfile&startPeriod=2020-01-01 response: body: string: !!binary | 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 - lBzB/wMA2DKSMiUAAA== + VmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ip4evzl+ + 9vzL746evTr9idHx0+989frNF6cv3oxenT77/Y9fnR6PXp+evPny1ejky69evDl99fL41ZvfXz96 + 8+r4xevjkzdnX74Ynb14/ebV73/8+vXpmxE++smzN7/P6PT3fnn64unZm69enY6+enH25vf/4vT4 + Nf54+ers5PT3f3L8+lSAPPvy1RfHDOfN8ZPnp7//2VNC4ezZ2Sl1cvbF6e//8vTV2ZdPR18+ef37 + /+Tx869OGbvf5/T41e/PkEaAhEaE5Ytnv//rN8dvvno9enp6cvbF8fPX/Jp+Jlh89fzN6OSrV69O + X5z8Pr9x8uXpydPx66dPxy+Onz56+vrp7//i+Ivjsxe7v+fTZ7//T7w4/v29Ufz+X71+urU73r0z + +onR7zP66jVRZxf/e7L7+U+Mfv+f0v9Ro9//5cuXo58cPT8evdnZ3dkb7e3s7W3/xP5o79P9nYP9 + nfsjeX5one9s/8S90d7up/sPCAHqGM8PrfPd7Z/YHe3tfbqzs3vwQx85dU4/7+093Lv36R51jOeH + 2TmR/d7B3sHDB/eoYzw/zM6J4fY/vb//6c5g5z9bnRO305zf39l7uLv7KY0azw9t5NQ5/bx/f39/ + 74dP9ns88k8Pdu99urNLHeP5oXVOIyeGu//w4f6n9x5Sx3h+aJ2TkqGR7z7Y+fT+7g+d7NT53mj3 + 4cPde7v7Pxedk6jRL/vE8dQxnt84+X8AYyF/4lwHAAA= headers: - Access-Control-Allow-Headers: - - Content-Type - Access-Control-Allow-Methods: - - POST,GET,OPTIONS - Access-Control-Allow-Origin: - - '*' + Accept-Ranges: + - values Cache-Control: - - private + - no-store,no-cache Content-Disposition: - - attachment;filename=DP_LIVE_01072024211330756.csv + - attachment; filename="OECD.SDD.NAD,DSD_NAMAIN1@DF_QNA_EXPENDITURE_USD,1.1+Q..USA.S1..B1GQ.....V...csv" Content-Encoding: - gzip + Content-Language: + - en,en-US Content-Type: - - text/csv + - application/vnd.sdmx.data+csv; charset=utf-8 Date: - - Mon, 01 Jul 2024 19:13:30 GMT + - Fri, 12 Jul 2024 19:06:48 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=2592000 Transfer-Encoding: - chunked Vary: - - Accept-Encoding + - Accept,Accept-Encoding,Accept-Encoding + X-Server-Node: + - Server 3 + api-supported-versions: + - '1' status: code: 200 message: OK diff --git a/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher_urllib3_v2.yaml b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher_urllib3_v2.yaml index d9f69d5f650..0e0f719d023 100644 --- a/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher_urllib3_v2.yaml +++ b/openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher_urllib3_v2.yaml @@ -3,38 +3,55 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: - keep-alive method: GET - uri: https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.MLN_USD.A/OECD?contentType=csv&csv-lang=en&detail=code&endPeriod=2023-06-06&separator=comma&startPeriod=2020-01-01 + uri: https://sdmx.oecd.org/public/rest/data/OECD.SDD.NAD,DSD_NAMAIN1@DF_QNA_EXPENDITURE_USD,1.1/Q..USA.S1..B1GQ.....V..?detail=dataonly&dimensionAtObservation=TIME_PERIOD&endPeriod=2023-06-06&format=csvfile&startPeriod=2020-01-01 response: body: - string: "\uFEFF\"LOCATION\",\"INDICATOR\",\"SUBJECT\",\"MEASURE\",\"FREQUENCY\",\"TIME\",\"Value\",\"Flag - Codes\"\r\n\"AUS\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1459486.518,\r\n\"AUS\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1649096.43,\r\n\"AUS\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",1868119.485,\r\n\"AUT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",522625.408,\r\n\"AUT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",567988.073,\r\n\"AUT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",641754.415,\r\n\"BEL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",643354.972,\r\n\"BEL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",719586.058,\r\n\"BEL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",797599.248,\"P\"\r\n\"CAN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1838806.492,\r\n\"CAN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2126695.672,\r\n\"CAN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",2389540.664,\r\n\"CZE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",469877.742,\r\n\"CZE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",508670.374,\r\n\"CZE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",551699.16,\r\n\"DNK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",364633.902,\r\n\"DNK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",409262.845,\r\n\"DNK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",460165.318,\r\n\"FIN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",296764.463,\r\n\"FIN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",320209.564,\r\n\"FIN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",348748.936,\r\n\"FRA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",3344390.833,\r\n\"FRA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",3648082.843,\"P\"\r\n\"FRA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",3914760.609,\"P\"\r\n\"DEU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",4815452.47,\"P\"\r\n\"DEU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",5153144.247,\"P\"\r\n\"DEU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",5582314.669,\"P\"\r\n\"GRC\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",311203.829,\r\n\"GRC\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",348976.941,\"P\"\r\n\"GRC\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",405843.52,\"P\"\r\n\"HUN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",341413.077,\r\n\"HUN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",375227.243,\r\n\"HUN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",421011.908,\"P\"\r\n\"ISL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",20386.798,\r\n\"ISL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",22903.075,\r\n\"ISL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",27443.255,\r\n\"IRL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",483915.064,\r\n\"IRL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",574387.948,\r\n\"IRL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",686134.933,\r\n\"ITA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",2627334.146,\r\n\"ITA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2951508.169,\r\n\"ITA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",3267793.896,\r\n\"JPN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",5351114.184,\r\n\"JPN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",5566714.339,\r\n\"JPN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",5862148.765,\"E\"\r\n\"KOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",2340031.574,\r\n\"KOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2514546.075,\r\n\"KOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",2667445.881,\"P\"\r\n\"LUX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",76983.168,\r\n\"LUX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",88295.231,\r\n\"LUX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",95651.858,\r\n\"MEX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",2454130.182,\r\n\"MEX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2677757.654,\"P\"\r\n\"MEX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",3041488.002,\"P\"\r\n\"NLD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1065126.172,\r\n\"NLD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1186871.833,\r\n\"NLD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",1319467.684,\"P\"\r\n\"NZL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",230180.985,\r\n\"NZL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",245931.419,\r\n\"NZL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",266808.617,\"E\"\r\n\"NOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",361020.392,\r\n\"NOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",469940.386,\r\n\"NOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",661729.786,\r\n\"POL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1376573.447,\r\n\"POL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1527352.009,\r\n\"POL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",1716254.587,\r\n\"PRT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",369406.329,\r\n\"PRT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",401863.609,\r\n\"PRT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",463070.295,\"P\"\r\n\"SVK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",191057.495,\r\n\"SVK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",205878.891,\r\n\"SVK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",222775.405,\r\n\"ESP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1845717.418,\r\n\"ESP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2068307.263,\"P\"\r\n\"ESP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",2326119.992,\"P\"\r\n\"SWE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",597294.367,\r\n\"SWE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",660103.423,\r\n\"SWE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",715622.275,\r\n\"CHE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",630568.326,\r\n\"CHE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",710319.644,\"P\"\r\n\"CHE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",796372.324,\"P\"\r\n\"TUR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",2391327.882,\r\n\"TUR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2659519.14,\r\n\"TUR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",3258301.253,\"P\"\r\n\"GBR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",3220300.957,\r\n\"GBR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",3542061.488,\r\n\"GBR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",3848221.195,\r\n\"USA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",21060474,\r\n\"USA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",23315081,\r\n\"USA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",25439700,\"E\"\r\n\"CHL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",491485.386,\r\n\"CHL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",568194.811,\r\n\"CHL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",616275.254,\r\n\"CHN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",24284244.896,\r\n\"CHN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",27519109.385,\r\n\"CHN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",30337136.137,\r\n\"COL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",785171.664,\"P\"\r\n\"COL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",905637.747,\"P\"\r\n\"COL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",1086103.923,\"E\"\r\n\"EST\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",53309.194,\r\n\"EST\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",59955.001,\r\n\"EST\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",64971.672,\r\n\"IND\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",9088001.93,\r\n\"IDN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",3305987.773,\r\n\"IDN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",3582441.683,\r\n\"IDN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",4038238.661,\r\n\"ISR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",378289.082,\r\n\"ISR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",433321.829,\r\n\"ISR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",498266.551,\r\n\"RUS\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",4367291.715,\r\n\"SVN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",88387.674,\r\n\"SVN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",98030.146,\r\n\"SVN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",108307.037,\r\n\"ZAF\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",796453.237,\r\n\"ZAF\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",870861.683,\r\n\"ZAF\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",949506.772,\r\n\"OECD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",63188022.029,\"P\"\r\n\"OECD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",69602850.433,\"P\"\r\n\"OECD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",76796228.437,\"E\"\r\n\"OECDE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",26687594.104,\"P\"\r\n\"OECDE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",29477740.319,\"P\"\r\n\"OECDE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",32924690.336,\"P\"\r\n\"LVA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",64108.072,\r\n\"LVA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",69307.642,\r\n\"LVA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",78228.963,\r\n\"BRA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",3176647.148,\r\n\"LTU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",115060.505,\r\n\"LTU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",129987.23,\r\n\"LTU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",144326.143,\r\n\"SAU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1630268.302,\r\n\"SAU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1769092.239,\r\n\"EA19\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",16561719.061,\r\n\"EA19\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",17754807.5,\r\n\"EA19\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",19595561.812,\r\n\"ARG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",943243.919,\r\n\"ARG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1090315.832,\r\n\"ARG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",1229806.339,\r\n\"CRI\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",111257.856,\r\n\"CRI\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",122133.139,\r\n\"CRI\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",135640.959,\"E\"\r\n\"BGR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",178455.505,\r\n\"BGR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",202250.908,\r\n\"BGR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",229317.044,\r\n\"HRV\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",123240.484,\r\n\"HRV\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",143346.26,\r\n\"HRV\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",162595.846,\"P\"\r\n\"CYP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",37844.839,\r\n\"CYP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",42048.854,\r\n\"CYP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",47738.078,\"P\"\r\n\"MLT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",23641.141,\r\n\"MLT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",27174.379,\r\n\"MLT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",30571.48,\r\n\"ROU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",660695.888,\r\n\"ROU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",726084.785,\r\n\"ROU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",823589.04,\"P\"\r\n\"MKD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",37052.566,\r\n\"MKD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",40592.305,\"P\"\r\n\"MKD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",43837.913,\"E\"\r\n\"ZMB\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",63634.57,\r\n\"HKG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",441535.806,\r\n\"HKG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",491461.87,\r\n\"MDG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",43279.039,\"E\"\r\n\"MAR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",296805.274,\r\n\"MAR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",337510.945,\r\n\"SGP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",569867.788,\r\n\"SGP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",648362.584,\r\n\"SGP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",719322.422,\r\n\"EU27_2020\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",21088520.692,\r\n\"EU27_2020\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",23215932.75,\r\n\"EU27_2020\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",25628806.871,\r\n\"ALB\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",40887.152,\"P\"\r\n\"SRB\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",138384.944,\r\n\"SRB\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",154207.267,\"P\"\r\n\"GEO\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",54904.969,\r\n\"GEO\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",63375.995,\r\n\"GEO\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2022\",74358.759,\r\n\"CMR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",102620.966,\r\n\"SEN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",58666.194,\r\n" + string: !!binary | + H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcpl + VmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ip4evzl+ + 9vzL746evTr9idHx0+989frNF6cv3oxenT77/Y9fnR6PXp+evPny1ejky69evDl99fL41ZvfXz96 + 8+r4xevjkzdnX74Ynb14/ebV73/8+vXpmxE++smzN7/P6PT3fnn64unZm69enY6+enH25vf/4vT4 + Nf54+ers5PT3f3L8+lSAPPvy1RfHDOfN8ZPnp7//2VNC4ezZ2Sl1cvbF6e//8vTV2ZdPR18+ef37 + /+Tx869OGbvf5/T41e/PkEaAhEaE5Ytnv//rN8dvvno9enp6cvbF8fPX/Jp+Jlh89fzN6OSrV69O + X5z8Pr9x8uXpydPx66dPxy+Onz56+vrp7//i+Ivjsxe7v+fTZ7//T7w4/v29Ufz+X71+urU73r0z + +onR7zP66jVRZxf/e7L7+U+Mfv+f0v9Ro9//5cuXo58cPT8evdnZ3dkb7e3s7W3/xP5o79P9nYP9 + nfsjeX5one9s/8S90d7up/sPCAHqGM8PrfPd7Z/YHe3tfbqzs3vwQx85dU4/7+093Lv36R51jOeH + 2TmR/d7B3sHDB/eoYzw/zM6J4fY/vb//6c5g5z9bnRO305zf39l7uLv7KY0azw9t5NQ5/bx/f39/ + 74dP9ns88k8Pdu99urNLHeP5oXVOIyeGu//w4f6n9x5Sx3h+aJ2TkqGR7z7Y+fT+7g+d7NT53mj3 + 4cPde7v7Pxedk6jRL/vE8dQxnt84+X8AYyF/4lwHAAA= headers: - Access-Control-Allow-Headers: - - Content-Type - Access-Control-Allow-Methods: - - POST,GET,OPTIONS - Access-Control-Allow-Origin: - - '*' + Accept-Ranges: + - values Cache-Control: - - private + - no-store,no-cache Content-Disposition: - - attachment;filename=DP_LIVE_27062024121420469.csv + - attachment; filename="OECD.SDD.NAD,DSD_NAMAIN1@DF_QNA_EXPENDITURE_USD,1.1+Q..USA.S1..B1GQ.....V...csv" Content-Encoding: - gzip + Content-Language: + - en,en-US Content-Type: - - text/csv + - application/vnd.sdmx.data+csv; charset=utf-8 Date: - - Thu, 27 Jun 2024 10:14:19 GMT + - Fri, 12 Jul 2024 19:23:22 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=2592000 Transfer-Encoding: - chunked Vary: - - Accept-Encoding + - Accept,Accept-Encoding,Accept-Encoding + X-Server-Node: + - Server 3 + api-supported-versions: + - '1' status: code: 200 message: OK diff --git a/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py b/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py index a6d778f72bb..358b17b43f4 100644 --- a/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py +++ b/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py @@ -45,11 +45,11 @@ def test_oecd_cpi_fetcher(credentials=test_credentials): assert result is None -@pytest.mark.skip(reason="Downloads a huge file, code needs to be fixed to use params.") @pytest.mark.record_http def test_oecd_nominal_gdp_fetcher(credentials=test_credentials): """Test the OECD Nominal GDP fetcher.""" params = { + "country": "united_states", "start_date": datetime.date(2020, 1, 1), "end_date": datetime.date(2023, 6, 6), }