diff options
6 files changed, 487 insertions, 95 deletions
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py b/openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py index 4c44a136b6d..90d44d971fe 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py @@ -1,18 +1,19 @@ """Revenue by Business Line Standard Model.""" - +import warnings from datetime import date as dateType -from typing import Dict, List, Literal, Set, Union +from typing import Dict, Literal, Optional from pydantic import Field, field_validator from openbb_core.provider.abstract.data import Data, ForceInt from openbb_core.provider.abstract.query_params import QueryParams from openbb_core.provider.utils.descriptions import ( - DATA_DESCRIPTIONS, QUERY_DESCRIPTIONS, ) +_warn = warnings.warn + class RevenueBusinessLineQueryParams(QueryParams): """Revenue by Business Line Query.""" @@ -26,17 +27,29 @@ class RevenueBusinessLineQueryParams(QueryParams): ) # should always be flat @field_validator("symbol", mode="before", check_fields=False) - def upper_symbol(cls, v: Union[str, List[str], Set[str]]): + @classmethod + def upper_symbol(cls, v: str): """Convert symbol to uppercase.""" - if isinstance(v, str): - return v.upper() - return ",".join([symbol.upper() for symbol in list(v)]) + if "," in v: + _warn( + f"{QUERY_DESCRIPTIONS.get('symbol_list_warning', '')} {v.split(',')[0].upper()}" + ) + return v.split(",")[0].upper() if "," in v else v.upper() class RevenueBusinessLineData(Data): """Revenue by Business Line Data.""" - date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", "")) + period_ending: dateType = Field(description="The end date of the reporting period.") + fiscal_period: Optional[str] = Field( + default=None, description="The fiscal period of the reporting period." + ) + fiscal_year: Optional[int] = Field( + default=None, description="The fiscal year of the reporting period." + ) + filing_date: Optional[dateType] = Field( + default=None, description="The filing date of the report." + ) business_line: Dict[str, ForceInt] = Field( - description="Day level data containing the revenue of the business line." + description="Dictionary containing the revenue of the business line." ) diff --git a/openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py b/openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py index bdd7fbfc695..adfb22cf066 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py @@ -1,18 +1,19 @@ """Revenue by Geographic Segments Standard Model.""" - +import warnings from datetime import date as dateType -from typing import Dict, List, Literal, Optional, Set, Union +from typing import Dict, Literal, Optional from pydantic import Field, field_validator from openbb_core.provider.abstract.data import Data, ForceInt from openbb_core.provider.abstract.query_params import QueryParams from openbb_core.provider.utils.descriptions import ( - DATA_DESCRIPTIONS, QUERY_DESCRIPTIONS, ) +_warn = warnings.warn + class RevenueGeographicQueryParams(QueryParams): """Revenue by Geographic Segments Query.""" @@ -27,32 +28,28 @@ class RevenueGeographicQueryParams(QueryParams): @field_validator("symbol", mode="before", check_fields=False) @classmethod - def upper_symbol(cls, v: Union[str, List[str], Set[str]]): + def upper_symbol(cls, v: str): """Convert symbol to uppercase.""" - if isinstance(v, str): - return v.upper() - return ",".join([symbol.upper() for symbol in list(v)]) + if "," in v: + _warn( + f"{QUERY_DESCRIPTIONS.get('symbol_list_warning', '')} {v.split(',')[0].upper()}" + ) + return v.split(",")[0].upper() if "," in v else v.upper() class RevenueGeographicData(Data): """Revenue by Geographic Segments Data.""" - date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", "")) - geographic_segment: Dict[str, ForceInt] = Field( - description="Day level data containing the revenue of the geographic segment." + period_ending: dateType = Field(description="The end date of the reporting period.") + fiscal_period: Optional[str] = Field( + default=None, description="The fiscal period of the reporting period." ) - americas: Optional[ForceInt] = Field( - default=None, description="Revenue from the the American segment." + fiscal_year: Optional[int] = Field( + default=None, description="The fiscal year of the reporting period." ) - europe: Optional[ForceInt] = Field( - default=None, description="Revenue from the the European segment." + filing_date: Optional[dateType] = Field( + default=None, description="The filing date of the report." ) - greater_china: Optional[ForceInt] = Field( - default=None, description="Revenue from the the Greater China segment." - ) - japan: Optional[ForceInt] = Field( - default=None, description="Revenue from the the Japan segment." - ) - rest_of_asia_pacific: Optional[ForceInt] = Field( - default=None, description="Revenue from the the Rest of Asia Pacific segment." + geographic_segment: Dict[str, ForceInt] = Field( + description="Dictionary of the revenue by geographic segment." ) diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py b/openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py index 981db010da0..adad792f284 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py @@ -1,5 +1,5 @@ """FMP Revenue by Business Line Model.""" - +# pylint: disable=unused-argument from datetime import datetime from typing import Any, Dict, List, Optional @@ -8,6 +8,7 @@ from openbb_core.provider.standard_models.revenue_business_line import ( RevenueBusinessLineData, RevenueBusinessLineQueryParams, ) +from openbb_fmp.models.cash_flow import FMPCashFlowStatementFetcher from openbb_fmp.utils.helpers import create_url, get_data_many from pydantic import field_validator @@ -22,11 +23,11 @@ class FMPRevenueBusinessLineQueryParams(RevenueBusinessLineQueryParams): class FMPRevenueBusinessLineData(RevenueBusinessLineData): """FMP Revenue by Business Line Data.""" - @field_validator("date", mode="before", check_fields=False) + @field_validator("period_ending", "filing_date", mode="before", check_fields=False) @classmethod def date_validate(cls, v): # pylint: disable=E0213 """Return the date as a datetime object.""" - return datetime.strptime(v, "%Y-%m-%d") + return datetime.strptime(v, "%Y-%m-%d") if v else None class FMPRevenueBusinessLineFetcher( @@ -53,15 +54,35 @@ class FMPRevenueBusinessLineFetcher( url = create_url(4, "revenue-product-segmentation", api_key, query) - return await get_data_many(url, **kwargs) + cf_fetcher = FMPCashFlowStatementFetcher() + cf_query = cf_fetcher.transform_query( + {"symbol": query.symbol, "period": query.period, "limit": 200} + ) + cf_data = await cf_fetcher.aextract_data(cf_query, {"fmp_api_key": api_key}) + filing_dates = sorted( + [ + { + "period_ending": d["date"], + "fiscal_year": d["calendarYear"], + "fiscal_period": d["period"], + "filing_date": d["fillingDate"], + } + for d in cf_data + ], + key=lambda d: d["period_ending"], + ) + rev_data = await get_data_many(url, **kwargs) + rev_data_dict = {list(d.keys())[0]: list(d.values())[0] for d in rev_data} + combined_data = [ + {**d, "business_line": rev_data_dict[d["period_ending"]]} + for d in filing_dates + if d["period_ending"] in rev_data_dict + ] + return combined_data @staticmethod def transform_data( query: FMPRevenueBusinessLineQueryParams, data: List[Dict], **kwargs: Any ) -> List[FMPRevenueBusinessLineData]: """Return the transformed data.""" - return [ - FMPRevenueBusinessLineData(date=key, business_line=value) - for d in data - for key, value in d.items() - ] + return [FMPRevenueBusinessLineData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py b/openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py index c1a63bc69af..f3e824135c8 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py @@ -1,5 +1,5 @@ """FMP Revenue Geographic Model.""" - +# pylint: disable=unused-argument from datetime import datetime from typing import Any, Dict, List, Optional @@ -8,6 +8,7 @@ from openbb_core.provider.standard_models.revenue_geographic import ( RevenueGeographicData, RevenueGeographicQueryParams, ) +from openbb_fmp.models.cash_flow import FMPCashFlowStatementFetcher from openbb_fmp.utils.helpers import create_url, get_data_many from pydantic import field_validator @@ -22,11 +23,11 @@ class FMPRevenueGeographicQueryParams(RevenueGeographicQueryParams): class FMPRevenueGeographicData(RevenueGeographicData): """FMP Revenue Geographic Data.""" - @field_validator("date", mode="before") + @field_validator("period_ending", "filing_date", mode="before", check_fields=False) @classmethod def date_validate(cls, v): # pylint: disable=E0213 - """Return date as a datetime object.""" - return datetime.strptime(v, "%Y-%m-%d") + """Return the date as a datetime object.""" + return datetime.strptime(v, "%Y-%m-%d") if v else None class FMPRevenueGeographicFetcher( @@ -53,28 +54,38 @@ class FMPRevenueGeographicFetcher( url = create_url(4, "revenue-geographic-segmentation", api_key, query) - return await get_data_many(url, **kwargs) + cf_fetcher = FMPCashFlowStatementFetcher() + cf_query = cf_fetcher.transform_query( + {"symbol": query.symbol, "period": query.period, "limit": 200} + ) + cf_data = await cf_fetcher.aextract_data(cf_query, {"fmp_api_key": api_key}) + filing_dates = sorted( + [ + { + "period_ending": d["date"], + "fiscal_year": d["calendarYear"], + "fiscal_period": d["period"], + "filing_date": d["fillingDate"], + } + for d in cf_data + ], + key=lambda d: d["period_ending"], + ) + + rev_data = await get_data_many(url, **kwargs) + rev_data_dict = {list(d.keys())[0]: list(d.values())[0] for d in rev_data} + + combined_data = [ + {**d, "geographic_segment": rev_data_dict[d["period_ending"]]} + for d in filing_dates + if d["period_ending"] in rev_data_dict + ] + + return combined_data @staticmethod def transform_data( query: FMPRevenueGeographicQueryParams, data: List[Dict], **kwargs: Any ) -> List[FMPRevenueGeographicData]: """Return the transformed data.""" - return [ - FMPRevenueGeographicData( - date=key, - geographic_segment=v, - americas=v.get("Americas Segment", v.get("North America", None)), - europe=v.get("Europe Segment", v.get("Europe", None)), - greater_china=v.get( - "Greater China Segment", v.get("Greater China", None) - ), - japan=v.get("Japan Segment", v.get("Japan", v.get("J P", None))), - rest_of_asia_pacific=v.get( - "Rest of Asia Pacific Segment", v.get("Asia-Pacific", None) - ), - ) - for d in data - for key, v in d.items() - if isinstance(v, Dict) - ] + return [FMPRevenueGeographicData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml index 020a5cef713..785e3edf1e9 100644 --- a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml +++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml @@ -3,9 +3,183 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - - gzip, deflate, br + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://financialmodelingprep.com/api/v3/cash-flow-statement/AAPL?apikey=MOCK_API_KEY&limit=200&period=annual + response: + body: + string: !!binary | + H4sIAAAAAAAAA82dW4/bRpbH3+dTGHlexnW/9JuTSQADs5NgZgeLwWIxULplR4it9nbLSTyL/e5b + RYlq1b9OXUhdMEECO1RJRRYPz6/Olf/1h1ev/jf89+rVVw+r3fqru1dfCSbkwPwg2Vf/tv/k+cvH + nx4/xM/evPnxT9PRp/Wnx6fd+uHbz09P6+39l/j53/76x+nj+80v8QgL/0jBuJfTB+82Hz5stu// + eDod5wM7Dljd368/hR/ORohX3N0xdyfscZLVh/X2YfX09/XqaRo6ffZp/bR5fIhHv//7dGy73r3d + 3j9+jL/rjfeajf8cPn1Yf3pa329Wu83j9s324c3HcH2bf47/G8ZzrrmH8e/W4dof9j/5H6vfw6gw + Jv3R593j/S/frJ7DQj1+/LTePh9/jzkpk6H3P6+279dvt//5+PRLWKFvV582u1Vc98Foa5OhYY0e + P293z39Z3683v65++rB+juO4cS4Zt9n+ut7uHp++7D/ljvyVH1dfXn7CufQqH3c/r5+yU8qucxz2 + 58ftt6vnn9/u1h/HH7NKiGRUuAFxwI9Pj79uHtYP33z5IdymsCLb92/ud5tfN7vNeBacM63SxYlX + 8rz7GK7m+e02fD98b/flxw+r7S7cqu/+5/PmU/xsvALmdXoJq/vw+fMmLvzzn9dx0PTJp89PYdWf + 188/vHv7MkH8FeE1T8/gOQjb87+vdp+fxtPEbyitucqXZD/o5QIPqyxlekMPC/O3ICffP9JfCt9A + ef1p95f1p9WX45VHGU2GBMH8+Lj9a5TBt8/Pn9fxeeDi8DPEoPBzhxV5GO+f1TD2YRNv3PYhyMxm + HMI1E4QkfL/Zrrb3eNmGcVIe4mW/yAR+d3NYM+YUiPf63bv1/e6Hd2HJ1r9/Oz4+zz+MInhyj+Mc + hyfr8Im2BlYgHH+z+2778MO7Hye1IZmFe7Qf9c36/Wa7DWd3MlYoDw/o4yTXccrvPzz+Rkv1/f6B + +u73oBkeNkG01rQEv3tar09+KWgul8paUKmjvv15t/v0fPf69W+//fb18/r+6/ePv75+E+7oJgjU + 6/XD+9XT66DoV6/3Ovl1/IX9X0U8Mc7MyaEhgmA8OGy2D+vfv/559/FFi29XH/50sUlXq08fhqi9 + mZdsnCdM839xrpxOItJJqFvRSYTbMQhXodN+hB3pxO/48cwIOoluOnnHUlFp0YkzBeNzOrleOHkm + 0yetyKbpgW6iyYlcoU9o4grEmSCTVyo9JRpMg/WMABiQKS7X6ZheLgmBGnYOlyxD/iKXwq7LJEPK + gLLGi1mAMlaa9As1QNnDqc4A1CCE1CiEgCifaUCCUG0wOa9YSpIcTEGm0ltVBpNkZRy3uRRurEpF + biGXRsWfXhZFppw2ZTJJ7QU8DhSZcrkukQllGMgUHiwFd/h8NMUlCfRP0CT2aHJXQ9M06YQmwbxQ + DTTxEU36VmjiI3h8BU37EW5Ek7p7oRiBJt6NJmVAN7TQJFwbTYOyNh1VhFPQ8KmSLBtOyoOiL9GJ + cdjFJpaTMEqQP3PCJy6kSE+rACilDg9vDVBBfZEaqUmosAsAdM8gVJD3dBUoQqVPdxlQUZnp9FQa + hAo7QeW6ESV10ZYoEoorrRpGlLNl8+jFhuJgi1VQpb1NZZBAlTJgPhRRFeRCpuc3h1VeSp0u8FJU + SddjQ2X0qZDKW/Q8UKTK5btAqkyW0YYKFv6lQRXvc5CMBFR8Dyp9NVBNk06gCs+d0A1QsRFU5lag + YhFDLw5FAlRsj7IRVObuBaEEqI4/0wKVtgq0fwtUTBsYT4AqbJWSQUVOGYfCX+KUNoeBdUwZz1M1 + kbr3BO0jPPXuKWZSpUkzSnhqGCLKLyKUYwZA3w+ooPpanr2Ba5H+fIVQYdOr5hFKsBmEsp60MquE + UgK0YO7li1o1GUIRysEereLkC1ZbuggEoJjrtaXCPkgWL7sJKBcemvTElwIqkEICoylCZdQpE0oH + IwA8vAShcvmmAZXJMvDJSmnS8z+fT+Ov+dTHx4b9wavxaZp04lP4H2HqfOJ+5NPRXLkyn8J0kU9H + Cyjn02EEi3zi4k4eyZnziR/tsSaftMh4U+WT0GAUkHySB+lr84kZ2EkV7SiJnncaUAI216kR5VB3 + E9En9GkVbKig5Al9hIAytIXQIpTxEhR3P6GC1gEfK4Eo002owGtQpg1AeWdRR1WcfMymd7UDUEo7 + j0KLFpQrG0dHPlkASplPxjjYaRB84hCbrQShgiZIL2AOnzzzNv32Qj4JJWFzSuEpR04ZT0J7iFhS + eMqFu+TpQ0EGPmmHgnA2n8Z7GO7kKZ8iCsaD1+LTcdJV0PC/xENeuPhHA1FuRNRR2V8bUW5MgTja + RQSiDiNesTEMpY5mEoGoI1ibiAo28iwTKuxpMGxFIUpM8c0mpDTirAgpqYyno0jg7NMSshJOMeVE + M0ciWGFExDs/nyBWBMwQUkqlJ90JKWuVTL84A1Jhh56eGQEpC4StRKLCeqYKumVFMcUsYWAWrCjY + VHRAioetTQNS0966CiljfGlMZkRZ2TKipOXERZOQCjJRvOgmo5x1l2GUxo0KhagcOxVEMdwEUojK + RbuAqEyMAVFGcRDi8xEVbzJXiYsvomA8eDVETZNOiHJe+PhHA1H2pnl8YbpGHt804oAoWcnj48fP + WohSTup5iOK6bUVpDwqkCKhj6kITUIPGbKoCoETMgjkdl9pRVqDyzhGFqX4lO4phFIUORhlyx9xi + lJHaL45FCds2pCQ4WCuuvnAmbpYlxYWRkjAqSOBMG4oZjBqUUaoBKdkDqaNU5WMAUsflqkBKWENc + NJ01EZbojLQJK8GbsZBSA6aikpTKyFOjFKYjkYZUJtwFSmWCjIYUw1Sv8yk1LqxlCaXssD94NUpN + k06UskGLxT8alDI3zecL08VI09GBR1DqMCLsIu+UuOM1X9/xsyaltHFInTqldJbtm1NKedh0lik1 + bYSalCql4qWMisH9ZNgpogSEqahsCYyNFAAlDOXYAT7NxZJ2YrnppBUaiBmWBPirKlhS0nHYaDSw + xMPS9Xv44K53cUljelnGJdHDJfQflbkU1gsscoJLU9S1zSURuE3a1F1cyiN8S7lkwM9IcwmftwqX + OIdtBsmlTLpL1hNKMnIpWPWXcvBxI6JjJYi6CKzzJ4eGqP/HgxfnEk66igo7sskLFf/a4JK+aY5E + mK6RZz6NiFyS/I4dXY8El45+whaXdPastHIkRIf1xKVLn+cil6R28JAUE825UTRWIEkC3Oqp7SRR + eWdkmjKYG2TSzhJa+DwwubChTldjBph4HqLL7SVIza2AyRjMsG6BSXAPGVcVMEGqZA+XtBEWRTXl + Uo1GlbxztJK0gMSwnEZcm958COHQQJtDI24t7A8W0siiMidplBGmTKPwjIPnmsyGyES6lK6H4ou+ + vLApSQecQaNorQjNtdTBiuMnh4agZPcHL08jmPQhbJKNeODslwaH1Mihoz/s2hxS+2qmCofUVO9k + 7zi/05VcvZdaqBaHpNewVa1zKOyB26l6Aj0MRQwJB6UxRQxZ1kWhQQlZDjIN8CxSGELTroAhBbbW + BTAUE5Zz/2MfhrxrR5akhcSmShUutxwCcg0MCeawuKuMIT6fQiLsf+oJejUKYe52mULqaGJVKMSp + igM6K886uqCgi0LS6gtVOClInqUolJOlQiEloFSWolAu0TSFMukFCCmPDtTzIaSkC9sym0BIDfuD + V4PQNOmDdZJ3UUjeNiNPtjLG9yOEDw/8nXTV0ibe3RNCWiwErFPI2B5jiEMdYplCuPEsUiiYQj35 + eFF/VijkLerqDEMC0y9oDFlBZUWfiSFpFltDnmWEzTCkIH2p5qVzCqIHTWNIKUWAueClM+ka93BI + SqyXm8Mh3c0hIbDQJ+cQ04awhWkOGc3PsIaMtBfhkMTmHiSHMrZUOMQsbEhJDmUiXeAQii9ySGH+ + 1PkckircG6kSDslhf/BqHJomfQjXE+5sB4fEbdPuRDMz/DAiWkMsGEQ1r1x394ewqYcyyzqHpMg8 + 9kSwCHOKihziFpR+OaVB+PQJKaXcaaJtwkvlEgb6MwzRBZLZ6Uw1L5ekEHOQpD+DQuhCo4whCGvU + Uhg42pQtCkXbqdslB9GAHggph5l/cyBkwAwsQqhIHoFOo1pZ0jnYgUj/Qup4yKUloZOBpAydYK7A + 3aWYkwlwgTkorMicWDudDDifOXGXxIxLmCOG/cGrMWea9EFxLrXuYA6/bYYCb2Yo8JcMBamr1bK8 + u61D2OtgELYeCXIc95+EB85BiVGZOby3GEmj0VXIUCAayB0TFGyTOAL3qTRxBAZbL4AcaTXktfUj + xyrdRI4A70qthYOQ4F9sNRnyThOWYMGXBtvrLuQwlbVh7EeOQw08Fzlt0BiwLGaAhmMtwELOjA0l + 0uskSJPRo2LdcIHxLoI0udwWKl9RRoE0Yf1gO3s+acJOSAR1n5CGD/uDVyPNNOmDiGWvvoM07KYN + hDhrxnrYFOsJpDF3L02CCNJ092UI3OBzrJughdrWDVdgsxRJ48CFUM44EBx1acHJpipONg1uJoI1 + RrIe62YQUhPjADbAo07mcKeJhL4+5gissqBKXiGaVWaOtg7iN63Gq8ZSye4F5FCLU28ZJF2jqV0N + OB5E6ArAkeX6qCZwMJlnIXC0z1KhCcsmg0gZOFpgq0KCN7nM0rzJ5BN71hllL23ZsJhppFJvGhv2 + B6/Gm2nSNmiYv2lyG/Mt0EwjImi4uxMVN9pL4lsLNEG45+S22Z7SVWwCXsTM1PSriRmpJW2NAGa8 + zI2CiTKgoaiKIKLMJ8/9loLQpAgYMmjeBAzjeqlRE57fVlIBFK1UOioYB56gBl4kM7YbL2h0dgEm + K3ecAxgFpuwVAMPByTYDMAbU+EK+DMYgRwnAZNCoGTQOa7gpwGQyWyrxqacNOExWOpsvzIdNZ8Df + KV+iQh8PXosvx0k7+OJumrTGmt0R2LE7QuBLMGSOv0Xwpbs7gnLZg1vji7IdfJG9DjMNyUtFvmS9 + UQp8sS43AE7eHdFMFUBDp4AYBd0wScSQ2/QWYjyewQzC8CyOlbvNIDW2krUW1ipdrlagxggAR40x + 6Wn0IMbxRlO5KmEgtaOcK8DB9pyPGnTtzkAN55dJlBZaUBRBWwb5UWaNz0qsCdRksltKkwY5RdJI + f2HPGXNCKK+TGE1QpvuDVyPNNGkHaexNEwLY2MKA10hzGDGWj/pqkwPW3eRAYrJSIx+Atx1mtpMz + ApxbZXeZFF12jKxxpp0YzRVV/ki0MCUMHnwLxCLMHJvwzceMd3h5SBkBeRK15qUW6gtbreFUf2c4 + wcilqWekCbUcMtjrsgyZemlOGzHSLkaMBQt8KWGmZ7lGmIwaZcAYibJOpQGg1JYyoBuJZxd77xBn + yqpgtofT8mEbfXJoiDp9PHh5vsCkK8EdD3u1f8ay0AZozE276YTpuKi+3GEaEU0apu90JQOadfcp + 4D7bKdZAI0Dlk610YCtczADoLcEJmw+MN9Cggc1katAwGlanpMFS0kJYhkt4tEjWpD/VyRqBRkc/ + a0yWJYGsgYBZpcHb5BXsJI2TVKMzmhq66FsqgQZv6yzMQKSoghko2lwAGkPe8h7QSCD1YtCwdsJZ + Ro8yaMIutJ0FkIksDRoUT4zJaNAGZ4AmKH2j4ztjnBLOnRwaok4fD14eNDDpKkwltNX+H6Jt0uib + 5puxMemOVXKc2ZgsIdkrwe+EuFM10nR3HuBSIjuqSQBZ1R1Bmt4E516TRpkuiwbjiwlooDSC4AwZ + dMnDRILQqQAZMp2qyRiMP/UzRsBGdsmLVjnHnWnLjiFfPVuwY4oquFzgqbOm7P186e4ysBwrC3CC + Z7UQJ1pQoEhpkiGiTJNgBrUrNzPhLIT4QRCBJgITPs+nSdA1QbPzhCZBb48Hr0aTadJVmErE90z8 + g7dpom6aUxamizSpdAE9jNi/zVvfqVqov7t/AHa3aMAEii7I1OV0SJElvS/xxteXFliS98s8kkTR + MDpNWgbvb8E1xgg/EJCE9JG0SOKXd6Rulmu2QSLFPI5w312hSRtv9ag+lqbkzT1Zerpk7AUyH/81 + eIJvmlrIkyG7OgIoGSUq5onECCQVaOlrLV2vv7RgtZ6Bk4NDSjGpvdWJFywo7vHg5XECk65EfKug + tD1eMHnbwL6MrOA1L9hhRKy/FIEmlVqYFyi1aGLw0a23ROsI62NKa9kJlkpnOTeZDpRknaRrZZe0 + F+2UJ1RUOjsXajuOHaQhptoJFOzZOwMomdk1HyjCzHs5nDRUGjftw5qdJobvpZhllXQaJdiV7SYw + uQxLOCdbxoBxgoCoGCeiI2ift5QmWQKiiJ4ucTHT5KDWJVNBjaiEJUFtjwevxpJp0sCSWJXrelgi + btpTJkzXYok4YQmrVruw7lp+cCG1WIJPeeUFb9OylVjShEhs/5/8VCnzuJx4jCdDhVEgYakQRXHE + KKAInVzbgshyhtgWQwZQXpW0Y9RPraKWadHaLBmK8eyKjytVbnNg0v3m65tSBM9qIUYwHEVaJLh6 + FYpIlH2CIn0QsVWIDO7SEAmXaI1NIRL09XjwahCZJl0J5o3yXWF5ftv8Lz4G3WvBksOIV4zdjf9W + INJdnD/MakvGGT7eZKJxMmY5RUTBjkghouD1B6cQAb8ywZDYlDUZQ0MEnl7SEqGb8bYgwomktT6K + YM+WnCLYYq1CEQHOkAZFNMPXbZUpUn4pZtEk8Shm/RTBCNy/BETgpBYyhGO+PQkRJEMZIuHn2lF3 + lM9CmARkESkCDtHlFGGx7lVbxrVSSpqTQ0PQj/uDF6cIThooYgy3fKSIYroBEnbb/C422hrHAAcB + ksOIHpB0195byO+rgwSS/ci6e8jTWM4RfC1byaVV62iZ1QnmwXaIohRcWu06+6AwF1XaO3Cy9JOE + M1ygjCSwNhWSKD+LJFJC55Ra0H2+QTK9724JSlDzlctTwLl6E6YMsG4LoRJf15JeJgGVjBQVqEhs + HU1ZJjCmYJqAWGKsBGh4PlQY09IImUAlKO/x4NWgMk0aoCKFcwfTZPf7rkQU7r2/YeR9nC4aHkfH + FBLlZUSTKHFoL1EMhBgaRGnnCw8g6cuJgqn+NFHwrSKnQAGDgqqr74mQYG/FaohkJk/s4ldsZi8y + mB8iUXJmiGQyddoYAb3ZRRGD+5UZFAFVV6QIZBLdBCL8QgzBN4VSDEEwVBiiXNswQfGkGaLqCIGi + qLMR4mNitNi3Z5kQErX1ePBaCKlO2iCJuy1J3MiJYg7Xy4geknSX00s2p/QE3/JBGifJiDNA4npA + UjFMJPSRIA2TZEQBJFQrkswwWRQmsaDY+jkCrjmiqDG9tFrhPBhwrRQufBV2GSeQPt6DE0ybLb4G + cxIfys/FS0Mu5ecqZhI0oXKZYkbQzSRTEBQVpuAuiGRKVntPMQXE8mpmySF44WPrLe/4acQk6u3x + 4MWZks3QAIi9Yb+vcbqY4luskn8Z0QOQ7ir5YIoqtC/Ojranmn85Q6YG9nWGKHDwp2GSZgJwZozT + GOl4WQv2aO2kCPaKmkERdN3lrfJdL0f8POeWx2aDZd8W1Bl0YSR7lQNghGNbRKpwUZWGXIojmBM/ + gyQA4YUkGbDCiUQJ8qGCEt2RwoXyWkBJeoGYwQUOi/NREp5h401SEx81+HjweiiZZmigxNwwA3ic + rpq19TKiByXddfADvpa9VVCCowmSKGgfsZwlwfTpaemliMK+CSYc05bJqDv1juPcKIEUNwonmpH7 + 7xZOsNtmP07MJZxbwP5GyhaE8SsUKb8QuFxP0uh6P2CJG0kRXxrSR5GBE/JA0sRAx8MZNMEk3YU4 + sWSuL9AEEVGmicUEFAImKK2Fyveqrwv3XcthctCs+2UQp4eGqMPHgxeHSTZDAyb6htlb43QtmOh+ + mHSXumPjpQZLOrrdQyfJ5SQZrEdFWeilwpJhSdTdFNxjp5UklMlBxEnahgk+P50kGQSo536UYBPY + JSzhBryDLc+W7o+3Y7pfD07wZU85TpKPz4mYFGFCZevRpokhNw89MMFeAQthMuDbPCmaICJqXi5I + vKdokklsIfwO0ok5XRJs4fOBMq4oN4m618P+4PWAMs3QAIq6YRbXOF3ERS1SchjRA5TuavegG/gY + CTg+vVWgGOt1Mpp4OSRzp0KyHChCWTu+BehlRciWKeFqx8SBw7BTniju9iXq8BOnNSVhJzvK4anu + IOpbwjoZD8OyuLvfEyVVLi2eWBnsdJ1eQDdO9AjM4+XNx0lssDXuAab71TBNrNTZctFgkFbabDHq + lokbWXIUrhkxd8HciQwsIIjRVsBlkQQZhJRG0BfWQsgQz5KfPD8LGaLD/PbkJtDuLSb3jQOSQWTX + R2sUPxEBMlACQlokSCKQQBAdXzR9ckrnA2TkGgBEXR0gqg8g8rYAgekIgBxG9ACku8Ddmf1W5fjQ + 1vlxcFAfRxOR9ku5tsJ9OmzwX1aEAAjFjcGLgycKvnoCjgYwpr63p6OwkaNMhnTiIr7BIiFsPy8E + l8nyL+EFV3KW+SGO9sfpShT0v6YWpIYM5UWyFrOYcfDF50Owlt3KRBhyeOjkGSjDQ3uWSOQMdsgp + nnf46kJ0cGuTn6HQEXig8zEUOdTU5He6csr4QHktFJSAbGZliVYlJ35gx/bzhw/TN060ezz8h6Ji + FrdVzKKpmEW/Yu6uFg/SrRKprbff5Vako8kcqOQWLFfNgi1UzJ4b6ov9atmml0CqZZVIf6dadk4m + 19SvlblPJXuJVhbHFwdN96bhFMI3yNQC1T6Row6tPPipqcxRmvrVMtepJFb0Ms6S6WWbM5jOfNLJ + HZihlgeb7jEWquXYRDq5FkovB23bqZcNUylzCb2MAlvY0YNwglo2ziW6/RytzG+rlXlTK/N+rdxd + fi2Zhw1LVSszBTo818qQNb9YJw9hpoVaeZDcCOqr/XrZpUqX0st2yW6ZC7dQLQvuEo26RC0bni5p + K3tIEatQiPuSq1FTyjq9nDkqWWibqopyYZxTyUjKz5JdIamS6XdD9qhkJZIpFmpkITyhbGGjzJTI + x5ANBW26LmQCEYhqaZ+c3sdsn+wTjpyjkG9ZxpxPRyhk1q+Qu8uYFdgVLYUsUvmmtsnSXWibHHai + oIJ6NfLx7V7wzW6FLHQCHkofi2SL0amPvZHJic3Qx1MLweMlzdfHXIkUqK1tcrCK0ue2rJG9pcyG + ej4nOhZm6GTO0u+WdbI2vrFNlsmWpJKKs3ybrOC9wgu18mBkc5uMurbivpCpLqW0MgpsQSuDcGKJ + gLyYVnb+ploZp8u18jSiQyu77lJgFJdWnouCTTWhlTkYyIu18tCXMkmp5YHL89Ty4HXuTMUwpE2f + 507NrJlNFmiGZpa4HvM1s4eNY0MxW2dzPpFKVpJO9kZGi4QoRb9axlTB8k5ZpNuOTCmzVDWVA5KW + UyDu0sqg/xYqZcAC6bqAmWo7ZZHeWUIno6gWdDKIJb7JwaSn1KeT//Df/w/0cKpZ6dwAAA== + headers: + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Headers: + - X-Requested-With, content-type, auth-token, Authorization, stripe-signature, + APPS + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Max-Age: + - '3600' + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 05 Jan 2024 21:23:47 GMT + Etag: + - W/"dce9-lmsObLv7FoJ8s1nEBTpjv9OWr+4" + Server: + - nginx/1.18.0 (Ubuntu) + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + X-Frame-Options: + - SAMEORIGIN + X-Powered-By: + - Express + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate Connection: - keep-alive method: GET @@ -13,20 +187,20 @@ interactions: response: body: string: !!binary | - H4sIAAAAAAAAA5WWPW/bMBCG9/wKIbMD8PjNbgY6JENaIwnQoejAygwi1LEESW6HIv+9JEXF8tGy - Ghs2YJM83vPe8aW+XxXFX/8pimtKKL0h5oby60/pP//vvS39T05AKRJfq3Hk0bW/q9L5UaWBGjT6 - zdnW/ty5blXc1q+usPttsS5L13V1W7kuxATKAa2qNnbrh6jx72zopd6H3SgRXKft4uCb/35bnYBA - BBE5CBOQlp4DkZpT8WEQppnE4iQQBlrOgoABo9hlEBJBZA5CfWAc+QgimJL64yBkTDavCFOUz4Iw - 5VvgIgiYCKLPgAjF8aZHEC6pwU2yDEI517nsAwhQnTOOIJyyJRAdQcw5EK6xRPd2f3i2ZX9o3bbY - tPX2UPar4mv/4tqwneIw0zigNcGdeExTSmkunwBQIU1GzqWpBRYgJjTmFwT0IkmGJqWiRH2NOSPi - kLihWV9O9AUGC4nL3IPWTbNzRUqfaoYbYhgfC+ybGLf+OOG9X8fzmmnQTDQAYDMnbOgxxvVlFJEf - 3hMUwdVlFEYp7g+MIgTJXDRHISRzqAkK+GZaqAqPKGoWhROFb4DTIymJwQ11wsqIL+wCq3eRzAyq - Tb0d2kLikafDPnjEY/3c/7GtK9beJ47OAprIy+YLLPesUyihCN51yPmuSfafn5NxQoIyQHPlpsoC - z3S5ayIz54DVuOsD8yyyJGLB3Wjubp9d96uvm6GImVUH0uLB7Wx/dLhuum+8WCjPbo9BgcWlmvDs - ySPxCwnYIofOvz90VbkcWTCc08a1VeMj2N0wewh3a9ttUDNUw190eE3d9vE2CgIr0Lgk77VIW08C - f3F98WiHpYwL3AZPdW93oQ265AULtYPcOae14wxvMGTxGtVqk1qja8RbtTuqJRlcUsueVYulzp1R - yxcAxxzVWo17x8h1jLz3cnVJLmoEXvou1+lEUNn5CZYT4y5BU8IErvdgR/+1nCsi8vs99q7iYsF8 - SP4I++B6W+2CaSiTXT1XP/4BWk+i1MwLAAA= + H4sIAAAAAAAAA5WWPW/bMBCG9/wKIbMD8PjNbgE6JENaIwnQoejAygwi1LEESW6HIv+9/JBs+WhZ + TYIYiCne3fPe8aW+XxXFX/9XFNeUUHZDzA0j15+G7/y3D7b0/1LDhCLxZzWuPLn2d1U6v6oFJQSt + fnO2tT+3rlsVd/WbK+xuU9yWpeu6uq1c53cxo7lAu6q13YR0mmUBq/VrvQvZfC4xrsfFd//5vjoB + oQGE8hyEE1DzIEoDNR8G4UA5zIAY/zsPIrg2l0EggogchAkwWKIjiNScYm2XQZhmEoszgDDQchYE + DBi10BESQeSZ0fKBceQjiGBK6o+DkLHYvCNMUT4LwpQfgYsgYCKIPgMiFMdJjyBcUoOHZBmEcq5z + 2RMIUJ0zjiCcsiUQHUHMORCusUQPdrd/sWW/b92mWLf1Zl/2q+Jr/+rakE5xmBkc0Jrkp3wsU0pp + Lp8AULOeJLTAAsSCxvqCgF4kydBDQ1OivsacETEVbmg2lxN9gcFC4TL3oNum2bpiKN+bHB6ItD42 + 2A8xHv3xgcO8juc106CZaADAZk5YmjHG9WUUkR/eExTB1WUURimeD4wiBMlcNEchJHOoCQr4YVro + Co8oahaFE4VvgNMjKYnBA3XCysjh9ppl9S6SmUG1rjdpLCReed7vgkc81S/9H9u64tb7xNFZQBN5 + 2XyB5Z51CuUvd5w11XzfDPafn5PxgQHKAM2VmyoLPNPlvonMnANW474PzLPIkogFd6O5u3123a++ + blITM6sOpMWj29r+6HDdNG+8WCjPbo+kwOJWTXj25jHwCwnYItPkP+y7qlyOLBiuae3aqvER7DY9 + ncLd2XYT1Azd8Bcd3lO3fbyNgsAKNG7JoRdD6kngL64vnmzayrjAY/Bc93YbxqAbvGChd5A757R3 + nOEEqYq3qFY7qDW6RrxVu6NaksEltexZtdj4PnpeLd8AHHNUazXmjpHrGHnn5eoGuagReOtBrtMH + QWXnJ1hOjLsETQkTuN/Jjv5rO1cke/0f/EpxsWA+JH+FfXS9rbbBNJTJrp6rH/8AMp/7vZUMAAA= headers: Access-Control-Allow-Credentials: - 'true' @@ -46,9 +220,9 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Mon, 16 Oct 2023 12:22:07 GMT - ETag: - - W/"bcc-RmRDrPPLIZSDozSR7yOvF32ihbo" + - Fri, 05 Jan 2024 21:23:48 GMT + Etag: + - W/"c95-f87WUVMmUm4/WysLRNFu8Xy3rmE" Server: - nginx/1.18.0 (Ubuntu) Transfer-Encoding: diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml index dd702ef4bd7..f86bca477eb 100644 --- a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml +++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml @@ -3,9 +3,183 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - - gzip, deflate, br + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://financialmodelingprep.com/api/v3/cash-flow-statement/AAPL?apikey=MOCK_API_KEY&limit=200&period=annual + response: + body: + string: !!binary | + H4sIAAAAAAAAA82dW4/bRpbH3+dTGHlexnW/9JuTSQADs5NgZgeLwWIxULplR4it9nbLSTyL/e5b + RYlq1b9OXUhdMEECO1RJRRYPz6/Olf/1h1ev/jf89+rVVw+r3fqru1dfCSbkwPwg2Vf/tv/k+cvH + nx4/xM/evPnxT9PRp/Wnx6fd+uHbz09P6+39l/j53/76x+nj+80v8QgL/0jBuJfTB+82Hz5stu// + eDod5wM7Dljd368/hR/ORohX3N0xdyfscZLVh/X2YfX09/XqaRo6ffZp/bR5fIhHv//7dGy73r3d + 3j9+jL/rjfeajf8cPn1Yf3pa329Wu83j9s324c3HcH2bf47/G8ZzrrmH8e/W4dof9j/5H6vfw6gw + Jv3R593j/S/frJ7DQj1+/LTePh9/jzkpk6H3P6+279dvt//5+PRLWKFvV582u1Vc98Foa5OhYY0e + P293z39Z3683v65++rB+juO4cS4Zt9n+ut7uHp++7D/ljvyVH1dfXn7CufQqH3c/r5+yU8qucxz2 + 58ftt6vnn9/u1h/HH7NKiGRUuAFxwI9Pj79uHtYP33z5IdymsCLb92/ud5tfN7vNeBacM63SxYlX + 8rz7GK7m+e02fD98b/flxw+r7S7cqu/+5/PmU/xsvALmdXoJq/vw+fMmLvzzn9dx0PTJp89PYdWf + 188/vHv7MkH8FeE1T8/gOQjb87+vdp+fxtPEbyitucqXZD/o5QIPqyxlekMPC/O3ICffP9JfCt9A + ef1p95f1p9WX45VHGU2GBMH8+Lj9a5TBt8/Pn9fxeeDi8DPEoPBzhxV5GO+f1TD2YRNv3PYhyMxm + HMI1E4QkfL/Zrrb3eNmGcVIe4mW/yAR+d3NYM+YUiPf63bv1/e6Hd2HJ1r9/Oz4+zz+MInhyj+Mc + hyfr8Im2BlYgHH+z+2778MO7Hye1IZmFe7Qf9c36/Wa7DWd3MlYoDw/o4yTXccrvPzz+Rkv1/f6B + +u73oBkeNkG01rQEv3tar09+KWgul8paUKmjvv15t/v0fPf69W+//fb18/r+6/ePv75+E+7oJgjU + 6/XD+9XT66DoV6/3Ovl1/IX9X0U8Mc7MyaEhgmA8OGy2D+vfv/559/FFi29XH/50sU |