From 195d92c444ffd0eb9b981a6c67f15d115576e508 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:20:30 -0700 Subject: [PATCH 1/6] nasdaq equity screener --- .../equity/integration/test_equity_api.py | 8 + .../equity/integration/test_equity_python.py | 8 + .../nasdaq/openbb_nasdaq/__init__.py | 2 + .../openbb_nasdaq/models/equity_screener.py | 490 ++++++++++++++++++ .../test_nasdaq_equity_screener_fetcher.yaml | 101 ++++ .../nasdaq/tests/test_nasdaq_fetchers.py | 11 + 6 files changed, 620 insertions(+) create mode 100644 openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py create mode 100644 openbb_platform/providers/nasdaq/tests/record/http/test_nasdaq_fetchers/test_nasdaq_equity_screener_fetcher.yaml diff --git a/openbb_platform/extensions/equity/integration/test_equity_api.py b/openbb_platform/extensions/equity/integration/test_equity_api.py index 544bb8052b19..5fe9c54c860b 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_api.py +++ b/openbb_platform/extensions/equity/integration/test_equity_api.py @@ -1462,6 +1462,14 @@ def test_equity_search(params, headers): "provider": "fmp", } ), + ( + { + "sector": "consumer_staples,consumer_discretionary", + "mktcap": "large", + "limit": None, + "provider": "nasdaq", + } + ), ], ) @pytest.mark.integration diff --git a/openbb_platform/extensions/equity/integration/test_equity_python.py b/openbb_platform/extensions/equity/integration/test_equity_python.py index cb836f59019b..0d3c919fe612 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_python.py +++ b/openbb_platform/extensions/equity/integration/test_equity_python.py @@ -1396,6 +1396,14 @@ def test_equity_search(params, obb): "provider": "fmp", } ), + ( + { + "sector": "consumer_staples,consumer_discretionary", + "mktcap": "large", + "limit": None, + "provider": "nasdaq", + } + ), ], ) @pytest.mark.integration diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/__init__.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/__init__.py index 190be5611810..12edf88ae7f6 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/__init__.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/__init__.py @@ -8,6 +8,7 @@ from openbb_nasdaq.models.cot_search import NasdaqCotSearchFetcher from openbb_nasdaq.models.economic_calendar import NasdaqEconomicCalendarFetcher from openbb_nasdaq.models.equity_search import NasdaqEquitySearchFetcher +from openbb_nasdaq.models.equity_screener import NasdaqEquityScreenerFetcher from openbb_nasdaq.models.historical_dividends import NasdaqHistoricalDividendsFetcher from openbb_nasdaq.models.lbma_fixing import NasdaqLbmaFixingFetcher from openbb_nasdaq.models.sp500_multiples import NasdaqSP500MultiplesFetcher @@ -28,6 +29,7 @@ "COTSearch": NasdaqCotSearchFetcher, "EconomicCalendar": NasdaqEconomicCalendarFetcher, "EquitySearch": NasdaqEquitySearchFetcher, + "EquityScreener": NasdaqEquityScreenerFetcher, "HistoricalDividends": NasdaqHistoricalDividendsFetcher, "LbmaFixing": NasdaqLbmaFixingFetcher, "SP500Multiples": NasdaqSP500MultiplesFetcher, diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py new file mode 100644 index 000000000000..724910c4e05d --- /dev/null +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py @@ -0,0 +1,490 @@ +"""Nasdaq Equity Screener Model.""" + +# pylint: disable=unused-argument + +from typing import Any, Dict, List, Literal, Optional, Union +from warnings import warn + +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.equity_screener import ( + EquityScreenerData, + EquityScreenerQueryParams, +) +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_core.provider.utils.helpers import get_querystring, make_request +from openbb_nasdaq.utils.helpers import HEADERS +from pydantic import Field, field_validator + +EXCHANGE_CHOICES = ["all", "nasdaq", "nyse", "amex"] +EXSUBCATEGORY_CHOICES = ["all", "ngs", "ngm", "ncm", "adr"] +MKT_CAP_CHOICES = ["all", "mega", "large", "mid", "small", "micro"] +RECOMMENDATION_CHOICES = ["all", "strong_buy", "buy", "hold", "sell", "strong_sell"] +SECTOR_CHOICES = [ + "all", + "energy", + "basic_materials", + "industrials", + "consumer_staples", + "consumer_discretionary", + "health_care", + "finance", + "technology", + "communication_services", + "utilities", + "real_estate", +] +REGION_CHOICES = [ + "all", + "africa", + "asia", + "australia_and_south_pacific", + "caribbean", + "europe", + "middle_east", + "north_america", + "south_america", +] +COUNTRY_CHOICES = [ + "all", + "argentina", + "armenia", + "australia", + "austria", + "belgium", + "bermuda", + "brazil", + "canada", + "cayman_islands", + "chile", + "colombia", + "costa_rica", + "curacao", + "cyprus", + "denmark", + "finland", + "france", + "germany", + "greece", + "guernsey", + "hong_kong", + "india", + "indonesia", + "ireland", + "isle_of_man", + "israel", + "italy", + "japan", + "jersey", + "luxembourg", + "macau", + "mexico", + "monaco", + "netherlands", + "norway", + "panama", + "peru", + "philippines", + "puerto_rico", + "russia", + "singapore", + "south_africa", + "south_korea", + "spain", + "sweden", + "switzerland", + "taiwan", + "turkey", + "united_kingdom", + "united_states", + "usa", +] + + +class NasdaqEquityScreenerQueryParams(EquityScreenerQueryParams): + """Nasdaq Equity Screener Query Params.""" + + __alias_dict__ = { + "mktcap": "marketcap", + } + __json_schema_extra__ = { + "exchange": {"multiple_items_allowed": True}, + "exsubcategory": {"multiple_items_allowed": True}, + "mktcap": {"multiple_items_allowed": True}, + "recommendation": {"multiple_items_allowed": True}, + "sector": {"multiple_items_allowed": True}, + "region": {"multiple_items_allowed": True}, + "country": {"multiple_items_allowed": True}, + } + + exchange: Union[Literal["all", "nasdaq", "nyse", "amex"], str] = Field( + default="all", + description="Filter by exchange.", + json_schema_extra={"choices": EXCHANGE_CHOICES}, + ) + exsubcategory: Union[Literal["all", "ngs", "ngm", "ncm", "adr"], str] = Field( + default="all", + description="Filter by exchange subcategory." + "\n NGS - Nasdaq Global Select Market" + "\n NGM - Nasdaq Global Market" + "\n NCM - Nasdaq Capital Market" + "\n ADR - American Depository Receipt\n", + json_schema_extra={"choices": EXSUBCATEGORY_CHOICES}, + ) + mktcap: Union[Literal["all", "mega", "large", "mid", "small", "micro"], str] = ( + Field( + default="all", + description="Filter by market cap." + "\n Mega - > 200B" + "\n Large - 10B - 200B" + "\n Mid - 2B - 10B" + "\n Small - 300M - 2B" + "\n Micro - 50M - 300M\n", + json_schema_extra={"choices": MKT_CAP_CHOICES}, + ) + ) + recommendation: Union[ + Literal["all", "strong_buy", "buy", "hold", "sell", "strong_sell"], str + ] = Field( + default="all", + description="Filter by consensus analyst action.", + json_schema_extra={"choices": RECOMMENDATION_CHOICES}, + ) + sector: Union[ + Literal[ + "all", + "energy", + "basic_materials", + "industrials", + "consumer_staples", + "consumer_discretionary", + "health_care", + "finance", + "technology", + "telecommunications", + "utilities", + "real_estate", + ], + str, + ] = Field( + default="all", + description="Filter by sector.", + json_schema_extra={"choices": SECTOR_CHOICES}, + ) + region: Union[ + Literal[ + "all", + "africa", + "asia", + "australia_and_south_pacific", + "caribbean", + "europe", + "middle_east", + "north_america", + "south_america", + ], + str, + ] = Field( + default="all", + description="Filter by region.", + json_schema_extra={"choices": REGION_CHOICES}, + ) + country: Union[ + Literal[ + "all", + "argentina", + "armenia", + "australia", + "austria", + "belgium", + "bermuda", + "brazil", + "canada", + "cayman_islands", + "chile", + "colombia", + "costa_rica", + "curacao", + "cyprus", + "denmark", + "finland", + "france", + "germany", + "greece", + "guernsey", + "hong_kong", + "india", + "indonesia", + "ireland", + "isle_of_man", + "israel", + "italy", + "japan", + "jersey", + "luxembourg", + "macau", + "mexico", + "monaco", + "netherlands", + "norway", + "panama", + "peru", + "philippines", + "puerto_rico", + "russia", + "singapore", + "south_africa", + "south_korea", + "spain", + "sweden", + "switzerland", + "taiwan", + "turkey", + "united_kingdom", + "united_states", + "usa", + ], + str, + ] = Field( + default="all", + description="Filter by country.", + json_schema_extra={"choices": COUNTRY_CHOICES}, + ) + limit: Optional[int] = Field( + default=None, + description="Limit the number of results to return.", + ) + + @field_validator("exchange", mode="before", check_fields=False) + @classmethod + def validate_exchange(cls, v): + """Validate exchange.""" + v = v.split(",") + new_items = [] + for item in v: + if item == "all": + continue + if item in EXCHANGE_CHOICES: + new_items.append(item) + else: + warn(f"Invalid exchange: {item}") + return ",".join(new_items) if new_items else "all" + + @field_validator("exsubcategory", mode="before", check_fields=False) + @classmethod + def validate_exsubcategory(cls, v): + """Validate exsubcategory.""" + v = v.split(",") + new_items = [] + for item in v: + if item == "all": + continue + if item in EXSUBCATEGORY_CHOICES: + new_items.append(item) + else: + warn(f"Invalid exsubcategory: {item}") + return ",".join(new_items) if new_items else "all" + + @field_validator("mktcap", mode="before", check_fields=False) + @classmethod + def validate_mktcap(cls, v): + """Validate market cap.""" + v = v.split(",") + new_items = [] + for item in v: + if item == "all": + continue + if item in MKT_CAP_CHOICES: + new_items.append(item) + else: + warn(f"Invalid market cap: {item}") + return ",".join(new_items) if new_items else "all" + + @field_validator("recommendation", mode="before", check_fields=False) + @classmethod + def validate_recommendation(cls, v): + """Validate recommendation.""" + v = v.split(",") + new_items = [] + for item in v: + if item == "all": + continue + if item in RECOMMENDATION_CHOICES: + new_items.append(item) + else: + warn(f"Invalid recommendation: {item}") + return ",".join(new_items) if new_items else "all" + + @field_validator("sector", mode="before", check_fields=False) + @classmethod + def validate_sector(cls, v): + """Validate sector.""" + v = v.split(",") + new_items = [] + for item in v: + if item == "all": + continue + if item in SECTOR_CHOICES: + new_items.append(item) + else: + warn(f"Invalid sector: {item}") + return ",".join(new_items) if new_items else "all" + + @field_validator("region", mode="before", check_fields=False) + @classmethod + def validate_region(cls, v): + """Validate region.""" + v = v.split(",") + new_items = [] + for item in v: + if item == "all": + continue + if item in REGION_CHOICES: + new_items.append(item) + else: + warn(f"Invalid region: {item}") + return ",".join(new_items) if new_items else "all" + + @field_validator("country", mode="before", check_fields=False) + @classmethod + def validate_country(cls, v): + """Validate country.""" + v = v.split(",") + new_items = [] + for item in v: + if item == "all": + continue + if item in COUNTRY_CHOICES: + new_items.append(item) + else: + warn(f"Invalid country: {item}") + return ",".join(new_items) if new_items else "all" + + +class NasdaqEquityScreenerData(EquityScreenerData): + """Nasdaq Equity Screener Data.""" + + __alias_dict__ = { + "last_price": "lastsale", + "change": "netchange", + "change_percent": "pctchange", + "market_cap": "marketCap", + } + + last_price: float = Field( + description="Last sale price.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + change: Optional[float] = Field( + default=None, + description="1-day change in price.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + change_percent: Optional[float] = Field( + default=None, + description="1-day percent change in price.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + market_cap: Optional[int] = Field( + default=None, + description="Market cap.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + + @field_validator( + "last_price", + "change", + "change_percent", + "market_cap", + mode="before", + check_fields=False, + ) + @classmethod + def validate_numbers(cls, v): + """Validate numbers.""" + if "%" in v: + v = v.replace("%", "") + return float(v) / 100 + v = ( + v.replace("$", "") + .replace(",", "") + .replace("UNCH", "") + .replace("--", "") + .replace("NA", "") + ) + return v if v else None + + +class NasdaqEquityScreenerFetcher( + Fetcher[ + NasdaqEquityScreenerQueryParams, + List[NasdaqEquityScreenerData], + ] +): + """Nasdaq Equity Screener Fetcher.""" + + require_credentials = False + + @staticmethod + def transform_query(params: Dict[str, Any]) -> NasdaqEquityScreenerQueryParams: + """Transform query.""" + return NasdaqEquityScreenerQueryParams(**params) + + @staticmethod + def extract_data( + query: NasdaqEquityScreenerQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> Dict: + """Extract data from the Nasdaq Equity Screener.""" + base_url = ( + "https://api.nasdaq.com/api/screener/stocks?tableonly=true&limit=10000" + ) + exchange = query.exchange.split(",") + exsubcategory = query.exsubcategory.split(",") + marketcap = query.mktcap.split(",") + recommendation = query.recommendation.split(",") + sector = query.sector.replace( + "communications_services", "telecommunications" + ).split(",") + region = query.region.split(",") + country = query.country.split(",") + params = dict( + exchange=None if "all" in exchange else "|".join(exchange).upper(), + exsubcategory=( + None if "all" in exsubcategory else "|".join(exsubcategory).upper() + ), + marketcap=None if "all" in marketcap else "|".join(marketcap), + recommendation=( + None if "all" in recommendation else "|".join(recommendation) + ), + sector=None if "all" in sector else "|".join(sector), + region=None if "all" in region else "|".join(region), + country=None if "all" in country else "|".join(country), + ) + querystring = get_querystring(params, []) + querystring = "&" + querystring if querystring else "" + url = f"{base_url}{querystring}" + try: + response = make_request(url, headers=HEADERS) + except response.status_code != 200: + raise response.raise_for_status() + return response.json() + + @staticmethod + def transform_data( + query: NasdaqEquityScreenerQueryParams, + data: Dict, + **kwargs: Any, + ) -> List[NasdaqEquityScreenerData]: + """Transform data.""" + if not data: + raise EmptyDataError("The request was returned empty.") + rows = data.get("data", {}).get("table", {}).get("rows") + if not rows: + raise EmptyDataError("No results were found.") + results: NasdaqEquityScreenerData = [] + for row in sorted(rows, key=lambda x: x["pctchange"], reverse=True): + row.pop("url", None) + results.append(NasdaqEquityScreenerData.model_validate(row)) + + return results diff --git a/openbb_platform/providers/nasdaq/tests/record/http/test_nasdaq_fetchers/test_nasdaq_equity_screener_fetcher.yaml b/openbb_platform/providers/nasdaq/tests/record/http/test_nasdaq_fetchers/test_nasdaq_equity_screener_fetcher.yaml new file mode 100644 index 000000000000..3f54e6a5ae3a --- /dev/null +++ b/openbb_platform/providers/nasdaq/tests/record/http/test_nasdaq_fetchers/test_nasdaq_equity_screener_fetcher.yaml @@ -0,0 +1,101 @@ +interactions: +- request: + body: null + headers: + Accept: + - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + Accept-Encoding: + - gzip + Accept-Language: + - en-CA,en-US;q=0.7,en;q=0.3 + Connection: + - keep-alive + Host: + - api.nasdaq.com + method: GET + uri: https://api.nasdaq.com/api/screener/stocks?limit=10000&marketcap=large§or=consumer_staples&tableonly=true + response: + body: + string: !!binary | + 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 + headers: + Cache-Control: + - max-age=0, no-cache, no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1969' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 19 Jun 2024 21:55:28 GMT + Expires: + - Wed, 19 Jun 2024 21:55:28 GMT + Pragma: + - no-cache + Server: + - Kestrel + Set-Cookie: + - akaalb_ALB_Default=~op=ao_api__east1:ao_api_east1|~rv=98~m=ao_api_east1:0|~os=ff51b6e767de05e2054c5c99e232919a~id=203108838c99ea4e479f8c21471f25fe; + path=/; HttpOnly; Secure; SameSite=None + - ak_bmsc=E6D38917F0ADD7E1FEC6DEB849E81462~000000000000000000000000000000~YAAQ2pUeuIHX0fGPAQAAWmZ/Mhgd4GwWL1iu1lcNC+ekK/2jK4SfejWlzn1pCiQrEx5PJBdlAGLH7NlNZy1GhbZeM8xXf2pzkRP0G8sxmeUHhvg8/38JieSuk/NMj4jUXV2LbthNx6fgo/vE4PLaqaZXDW+6kwELDdJSMfmx8A8njFSEJlNd+mtJEcmX+BmyA/RU+V4nfRXRRMUfGUOg2ydok/CurJkTqD7QejqHu5uCYmf+3Mho5oSoN9s4qsvQfCWx7lUhVw5Q+XwLBpm2m4HQvMzImK4ypPfA6rQnZWEUaqyQuxF4PMKk9rHxIthxOqbF2J3gofseH3amzYCYFQ8143QskbuHlbASaQ5shF6W372ZmUvVB9wrdsU2XxZf67bceEmboBGGV5L/h8UCQ5aiL5U4mYQ=; + Domain=.nasdaq.com; Path=/; Expires=Wed, 19 Jun 2024 23:55:28 GMT; Max-Age=7200; + HttpOnly + Strict-Transport-Security: + - max-age=86400 + Vary: + - Accept-Encoding + X-EdgeConnect-MidMile-RTT: + - '5' + - '56' + X-EdgeConnect-Origin-MEX-Latency: + - '50' + - '50' + gid: + - '203' + lang: + - en + rid: + - 8b115157-6b55-4aa1-b3da-3aaaecba8876 + srctype: + - default + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/nasdaq/tests/test_nasdaq_fetchers.py b/openbb_platform/providers/nasdaq/tests/test_nasdaq_fetchers.py index 9a3adc506b8c..102adb8d910a 100644 --- a/openbb_platform/providers/nasdaq/tests/test_nasdaq_fetchers.py +++ b/openbb_platform/providers/nasdaq/tests/test_nasdaq_fetchers.py @@ -10,6 +10,7 @@ from openbb_nasdaq.models.cot import NasdaqCotFetcher from openbb_nasdaq.models.cot_search import NasdaqCotSearchFetcher from openbb_nasdaq.models.economic_calendar import NasdaqEconomicCalendarFetcher +from openbb_nasdaq.models.equity_screener import NasdaqEquityScreenerFetcher from openbb_nasdaq.models.equity_search import NasdaqEquitySearchFetcher from openbb_nasdaq.models.historical_dividends import NasdaqHistoricalDividendsFetcher from openbb_nasdaq.models.lbma_fixing import NasdaqLbmaFixingFetcher @@ -157,3 +158,13 @@ def test_nasdaq_lbma_fixing_fetcher(credentials=test_credentials): fetcher = NasdaqLbmaFixingFetcher() result = fetcher.test(params, credentials) assert result is None + + +@pytest.mark.record_http +def test_nasdaq_equity_screener_fetcher(credentials=test_credentials): + """Test the Nasdaq Equity Screener fetcher.""" + params = {"mktcap": "large", "sector": "consumer_staples"} + + fetcher = NasdaqEquityScreenerFetcher() + result = fetcher.test(params, credentials) + assert result is None From 7b3002c653d87e4aea0c6b6165ef51fd83ac5ec8 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:31:21 -0700 Subject: [PATCH 2/6] commit the limit param --- .../providers/nasdaq/openbb_nasdaq/models/equity_screener.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py index 724910c4e05d..adf2b4db8fe8 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py @@ -436,9 +436,7 @@ def extract_data( **kwargs: Any, ) -> Dict: """Extract data from the Nasdaq Equity Screener.""" - base_url = ( - "https://api.nasdaq.com/api/screener/stocks?tableonly=true&limit=10000" - ) + base_url = f"https://api.nasdaq.com/api/screener/stocks?tableonly=true&limit={query.limit if query.limit else 10000}&" exchange = query.exchange.split(",") exsubcategory = query.exsubcategory.split(",") marketcap = query.mktcap.split(",") From 1f2dcb024508dd1847c5d536be2538f5ff944dd9 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:01:26 -0700 Subject: [PATCH 3/6] missing test params --- .../extensions/equity/integration/test_equity_api.py | 4 ++++ .../extensions/equity/integration/test_equity_python.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/openbb_platform/extensions/equity/integration/test_equity_api.py b/openbb_platform/extensions/equity/integration/test_equity_api.py index 5fe9c54c860b..c062c155f504 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_api.py +++ b/openbb_platform/extensions/equity/integration/test_equity_api.py @@ -1465,6 +1465,10 @@ def test_equity_search(params, headers): ( { "sector": "consumer_staples,consumer_discretionary", + "exchange": "all", + "exsubcategory": "all", + "region": "all", + "country": "all", "mktcap": "large", "limit": None, "provider": "nasdaq", diff --git a/openbb_platform/extensions/equity/integration/test_equity_python.py b/openbb_platform/extensions/equity/integration/test_equity_python.py index 0d3c919fe612..d1118f75bd8b 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_python.py +++ b/openbb_platform/extensions/equity/integration/test_equity_python.py @@ -1399,6 +1399,10 @@ def test_equity_search(params, obb): ( { "sector": "consumer_staples,consumer_discretionary", + "exchange": "all", + "exsubcategory": "all", + "region": "all", + "country": "all", "mktcap": "large", "limit": None, "provider": "nasdaq", From 2525902089f282fe77bd5b7f4e0af9c1b03764f2 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Wed, 19 Jun 2024 22:28:53 -0700 Subject: [PATCH 4/6] the other missing param --- .../equity/integration/test_equity_api.py | 1 + .../equity/integration/test_equity_python.py | 1 + .../news/integration/test_news_api.py | 6 +- .../news/integration/test_news_python.py | 6 +- .../biztoc/openbb_biztoc/models/world_news.py | 112 ++++++++------ .../biztoc/openbb_biztoc/utils/helpers.py | 144 ------------------ .../biztoc/tests/test_biztoc_fetchers.py | 2 +- 7 files changed, 76 insertions(+), 196 deletions(-) delete mode 100644 openbb_platform/providers/biztoc/openbb_biztoc/utils/helpers.py diff --git a/openbb_platform/extensions/equity/integration/test_equity_api.py b/openbb_platform/extensions/equity/integration/test_equity_api.py index c062c155f504..fc36d561d4f6 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_api.py +++ b/openbb_platform/extensions/equity/integration/test_equity_api.py @@ -1470,6 +1470,7 @@ def test_equity_search(params, headers): "region": "all", "country": "all", "mktcap": "large", + "recommendation": "all", "limit": None, "provider": "nasdaq", } diff --git a/openbb_platform/extensions/equity/integration/test_equity_python.py b/openbb_platform/extensions/equity/integration/test_equity_python.py index d1118f75bd8b..115d36317005 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_python.py +++ b/openbb_platform/extensions/equity/integration/test_equity_python.py @@ -1404,6 +1404,7 @@ def test_equity_search(params, obb): "region": "all", "country": "all", "mktcap": "large", + "recommendation": "all", "limit": None, "provider": "nasdaq", } diff --git a/openbb_platform/extensions/news/integration/test_news_api.py b/openbb_platform/extensions/news/integration/test_news_api.py index b54a1f383209..d0e1f5a2fa20 100644 --- a/openbb_platform/extensions/news/integration/test_news_api.py +++ b/openbb_platform/extensions/news/integration/test_news_api.py @@ -73,10 +73,8 @@ def headers(): ( { "provider": "biztoc", - "filter": "tag", - "tag": "federalreserve", - "source": "bloomberg", - "term": "MSFT", + "source": None, + "term": "microsoft", "start_date": None, "end_date": None, } diff --git a/openbb_platform/extensions/news/integration/test_news_python.py b/openbb_platform/extensions/news/integration/test_news_python.py index 2e9b49b1eeb7..f1492d024047 100644 --- a/openbb_platform/extensions/news/integration/test_news_python.py +++ b/openbb_platform/extensions/news/integration/test_news_python.py @@ -69,10 +69,8 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements ( { "provider": "biztoc", - "filter": "tag", - "tag": "federalreserve", - "source": "bloomberg", - "term": "MSFT", + "source": None, + "term": "microsoft", "start_date": None, "end_date": None, } diff --git a/openbb_platform/providers/biztoc/openbb_biztoc/models/world_news.py b/openbb_platform/providers/biztoc/openbb_biztoc/models/world_news.py index 8d6d3ae2ea93..d6ea8ea13525 100644 --- a/openbb_platform/providers/biztoc/openbb_biztoc/models/world_news.py +++ b/openbb_platform/providers/biztoc/openbb_biztoc/models/world_news.py @@ -1,59 +1,47 @@ """Biztoc World News Model.""" -import warnings -from datetime import datetime, timedelta -from typing import Any, Dict, List, Literal, Optional +# pylint: disable=unused-argument -from openbb_biztoc.utils.helpers import get_news +from typing import Any, Dict, List, 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.world_news import ( WorldNewsData, WorldNewsQueryParams, ) +from openbb_core.provider.utils.helpers import make_request from pandas import to_datetime from pydantic import Field, field_validator -_warn = warnings.warn - class BiztocWorldNewsQueryParams(WorldNewsQueryParams): """Biztoc World News Query.""" - filter: Literal["crypto", "hot", "latest", "main", "media", "source", "tag"] = ( - Field(default="latest", description="Filter by type of news.") - ) - source: str = Field( - description="Filter by a specific publisher. Only valid when filter is set to source.", - default="bloomberg", - ) - tag: Optional[str] = Field( - description="Tag, topic, to filter articles by. Only valid when filter is set to tag.", - default=None, - ) term: Optional[str] = Field( description="Search term to filter articles by. This overrides all other filters.", default=None, ) + source: Optional[str] = Field( + description="Filter by a specific publisher. Only valid when filter is set to source.", + default=None, + ) class BiztocWorldNewsData(WorldNewsData): """Biztoc World News Data.""" __alias_dict__ = { - "date": "created", + "date": "published", "text": "body", - "site": "domain", "images": "img", } images: Optional[Dict[str, str]] = Field( description="Images for the article.", alias="images", default=None ) - favicon: Optional[str] = Field( - description="Icon image for the source of the article.", default=None - ) tags: Optional[List[str]] = Field(description="Tags for the article.", default=None) - id: Optional[str] = Field(description="Unique Article ID.", default=None) score: Optional[float] = Field( description="Search relevance score for the article.", default=None ) @@ -64,6 +52,12 @@ def date_validate(cls, v): """Return formatted datetime.""" return to_datetime(v).strftime("%Y-%m-%d %H:%M:%S") + @field_validator("title") + @classmethod + def title_validate(cls, v): + """Strip empty title text.""" + return v.strip() if v else None + class BiztocWorldNewsFetcher( Fetcher[ @@ -77,7 +71,7 @@ class BiztocWorldNewsFetcher( def transform_query(params: Dict[str, Any]) -> BiztocWorldNewsQueryParams: """Transform the query.""" if params.get("start_date") or params.get("end_date"): - _warn("start_date and end_date are not supported for this endpoint.") + warn("start_date and end_date are not supported for this endpoint.") return BiztocWorldNewsQueryParams(**params) @staticmethod @@ -88,29 +82,61 @@ def extract_data( ) -> List[Dict]: """Extract the data from the Biztoc endpoint.""" api_key = credentials.get("biztoc_api_key") if credentials else "" - - data = get_news( - api_key=api_key, filter_=query.filter, source=query.source, tag=query.tag, term=query.term # type: ignore - ) - if query.filter == "hot": - data = [post for sublist in data for post in sublist["posts"]] - - times = {"2 Hours Ago": 2, "4 Hours Ago": 4} - # Drop 'body_preview' because it is always nan, empty string, or empty string with space. - for _, item in enumerate(data): - item.pop("body_preview", None) # Removes 'body_preview' if it exists - # Adjust 'created' time if necessary - if item.get("created") in times: - item["created"] = datetime.now() - timedelta( - hours=times[item["created"]] + headers = { + "X-RapidAPI-Key": f"{api_key}", + "X-RapidAPI-Host": "biztoc.p.rapidapi.com", + "Accept": "application/json", + "Accept-Encoding": "gzip", + } + base_url = "https://biztoc.p.rapidapi.com/" + url = "" + response: List = [] + if query.term: + query.term = query.term.replace(" ", "%20") + url = base_url + f"search?q={query.term}" + response = make_request(url, headers=headers).json() + elif query.source: + sources_response = make_request( + "https://biztoc.p.rapidapi.com/sources", + headers=headers, + ).json() + sources = [source["id"] for source in sources_response] + if query.source.lower() not in sources: + raise OpenBBError( + f"{query.source} not a valid source. Valid sources: {sources}" ) + url = base_url + f"news/source/{query.source.lower()}" + response = make_request(url, headers=headers).json() + else: + url1 = base_url + "news/latest" + url2 = base_url + "news/topics" + response = make_request(url1, headers=headers).json() + response2 = make_request(url2, headers=headers).json() + if response2: + for topic in response2: + stories = topic.get("stories", []) + if stories: + response.extend( + { + "text" if k == "body_preview" else k: v + for k, v in story.items() + } + for story in stories + ) + + return response - return sorted(data, key=lambda x: x["created"], reverse=True) - - # pylint: disable=unused-argument @staticmethod def transform_data( query: BiztocWorldNewsQueryParams, data: List[Dict], **kwargs: Any ) -> List[BiztocWorldNewsData]: """Transform the data to the standard format.""" - return [BiztocWorldNewsData.model_validate(d) for d in data[: query.limit]] + results: List[BiztocWorldNewsData] = [] + for item in data: + item.pop("id", None) + item.pop("uid", None) + item.pop("body_preview", None) + item.pop("site", None) + item.pop("domain", None) + results.append(BiztocWorldNewsData.model_validate(item)) + return results diff --git a/openbb_platform/providers/biztoc/openbb_biztoc/utils/helpers.py b/openbb_platform/providers/biztoc/openbb_biztoc/utils/helpers.py deleted file mode 100644 index bfef88972d4a..000000000000 --- a/openbb_platform/providers/biztoc/openbb_biztoc/utils/helpers.py +++ /dev/null @@ -1,144 +0,0 @@ -"""Biztoc Helpers.""" - -from datetime import timedelta -from typing import Dict, List, Literal - -import requests -import requests_cache -from openbb_core.app.model.abstract.error import OpenBBError -from openbb_core.app.utils import get_user_cache_directory - -# pylint: disable=C0325 - -cache_dir = get_user_cache_directory() - -biztoc_session_tags = requests_cache.CachedSession( - f"{cache_dir}/http/biztoc_tags", expire_after=timedelta(days=1) -) -biztoc_session_sources = requests_cache.CachedSession( - f"{cache_dir}/http/biztoc_sources", expire_after=timedelta(days=3) -) - - -def get_sources(api_key: str) -> List[Dict]: - """Get valid sources for Biztoc queries.""" - headers = { - "X-RapidAPI-Key": f"{api_key}", - "X-RapidAPI-Host": "biztoc.p.rapidapi.com", - "Accept": "application/json", - "Accept-Encoding": "gzip", - } - sources = biztoc_session_sources.get( - "https://biztoc.p.rapidapi.com/sources", headers=headers, timeout=10 - ) - - return sources.json() - - -def get_pages(api_key: str) -> List[str]: - """Get valid pages for Biztoc queries.""" - headers = { - "X-RapidAPI-Key": f"{api_key}", - "X-RapidAPI-Host": "biztoc.p.rapidapi.com", - "Accept": "application/json", - "Accept-Encoding": "gzip", - } - pages = biztoc_session_sources.get( - "https://biztoc.p.rapidapi.com/pages", headers=headers, timeout=10 - ) - if pages.status_code != 200: - msg = pages.json().get("message") or pages.text - raise OpenBBError(f"HTTP error - > {msg}") - - return pages.json() - - -def get_tags_by_page(page_id: str, api_key: str) -> List[str]: - """Get valid tags required for Biztoc queries.""" - headers = { - "X-RapidAPI-Key": f"{api_key}", - "X-RapidAPI-Host": "biztoc.p.rapidapi.com", - "Accept": "application/json", - "Accept-Encoding": "gzip", - } - tags = biztoc_session_tags.get( - f"https://biztoc.p.rapidapi.com/tags/{page_id}", headers=headers, timeout=10 - ) - if tags.status_code != 200: - msg = tags.json().get("message") or tags.text - raise OpenBBError(f"HTTP error - > {msg}") - - return tags.json() - - -def get_all_tags(api_key) -> Dict[str, List[str]]: - """Get all tags for all pages.""" - tags: Dict[str, List[str]] = {} - - pages = get_pages(api_key) - for page in pages: - page_tags = get_tags_by_page(page, api_key) - tags.update({page: [x["tag"] for x in page_tags]}) # type: ignore - - return tags - - -def get_news( - api_key: str, - filter_: Literal[ - "crypto", "hot", "latest", "main", "media", "source", "tag" - ] = "latest", - source: str = "bloomberg", - tag: str = "", - term: str = "", -) -> List[Dict]: - """Call the BizToc API and returns the data.""" - results = [] - term = term.replace(" ", "%20") if term else "" - _tags = get_all_tags(api_key) - pages = get_pages(api_key) - tags = [] - tag = tag.lower() if tag else "" - for page in pages: - tags.extend(_tags[page][:]) - - _sources = get_sources(api_key) - sources = sorted([i["id"] for i in _sources]) - - headers = { - "X-RapidAPI-Key": f"{api_key}", - "X-RapidAPI-Host": "biztoc.p.rapidapi.com", - "Accept": "application/json", - "Accept-Encoding": "gzip", - } - - filter_dict = { - "hot": "news/hot", - "latest": "news/latest", - "crypto": "news/latest/crypto", - "main": "news/latest/main", - "media": "news/latest/media", - "source": f"news/source/{source.lower()}", - "tag": f"tag/{tag}", - } - if filter_ == "source" and source.lower() not in sources: - raise OpenBBError(f"{source} not a valid source. Valid sources: {sources}") - - if filter_ == "tag" and tag.lower().replace(" ", "") not in tags: - raise OpenBBError(f"{tag} not a valid tag. Valid tags: {tags}") - - url = ( - f"https://biztoc.p.rapidapi.com/search?q={term}" - if term - else f"https://biztoc.p.rapidapi.com/{filter_dict[filter_]}" - ) - r = requests.get(url, headers=headers, timeout=5) - if r.status_code != 200: - raise OpenBBError(f"HTTP error - > {r.text}") - - try: - results = r.json() - except Exception as e: - raise (e) - - return results diff --git a/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py b/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py index e2a3c579573b..3499f7fb70c0 100644 --- a/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py +++ b/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py @@ -21,7 +21,7 @@ def vcr_config(): @pytest.mark.record_http def test_biztoc_world_news_fetcher(credentials=test_credentials): """Test the Biztoc World News fetcher.""" - params = {"term": "earnings"} + params = {"source": "bloomberg"} fetcher = BiztocWorldNewsFetcher() result = fetcher.test(params, credentials) From 010a783d5f5788e033c916f483e495ecaad32d83 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Wed, 19 Jun 2024 22:39:11 -0700 Subject: [PATCH 5/6] sector mapping --- .../nasdaq/openbb_nasdaq/models/equity_screener.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py index adf2b4db8fe8..e57cf89b0bc3 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/equity_screener.py @@ -27,7 +27,7 @@ "consumer_staples", "consumer_discretionary", "health_care", - "finance", + "financial_services", "technology", "communication_services", "utilities", @@ -158,9 +158,9 @@ class NasdaqEquityScreenerQueryParams(EquityScreenerQueryParams): "consumer_staples", "consumer_discretionary", "health_care", - "finance", + "financial_services", "technology", - "telecommunications", + "communication_services", "utilities", "real_estate", ], @@ -441,9 +441,11 @@ def extract_data( exsubcategory = query.exsubcategory.split(",") marketcap = query.mktcap.split(",") recommendation = query.recommendation.split(",") - sector = query.sector.replace( - "communications_services", "telecommunications" - ).split(",") + sector = ( + query.sector.replace("communications_services", "telecommunications") + .replace("financial_services", "finance") + .split(",") + ) region = query.region.split(",") country = query.country.split(",") params = dict( From 969eaea6ae59b4c07baf4452c91c5b8c4739ec48 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Wed, 19 Jun 2024 23:02:25 -0700 Subject: [PATCH 6/6] fix biztoc --- .../biztoc/openbb_biztoc/models/world_news.py | 2 +- openbb_platform/providers/biztoc/poetry.lock | 326 +++--- .../providers/biztoc/pyproject.toml | 1 - .../test_biztoc_world_news_fetcher.yaml | 993 ++++-------------- .../biztoc/tests/test_biztoc_fetchers.py | 6 +- 5 files changed, 308 insertions(+), 1020 deletions(-) diff --git a/openbb_platform/providers/biztoc/openbb_biztoc/models/world_news.py b/openbb_platform/providers/biztoc/openbb_biztoc/models/world_news.py index d6ea8ea13525..43267d779702 100644 --- a/openbb_platform/providers/biztoc/openbb_biztoc/models/world_news.py +++ b/openbb_platform/providers/biztoc/openbb_biztoc/models/world_news.py @@ -95,7 +95,7 @@ def extract_data( query.term = query.term.replace(" ", "%20") url = base_url + f"search?q={query.term}" response = make_request(url, headers=headers).json() - elif query.source: + if query.source is not None: sources_response = make_request( "https://biztoc.p.rapidapi.com/sources", headers=headers, diff --git a/openbb_platform/providers/biztoc/poetry.lock b/openbb_platform/providers/biztoc/poetry.lock index 0f2ad166822e..1f3f34b20baa 100644 --- a/openbb_platform/providers/biztoc/poetry.lock +++ b/openbb_platform/providers/biztoc/poetry.lock @@ -187,31 +187,6 @@ files = [ {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, ] -[[package]] -name = "cattrs" -version = "23.2.3" -description = "Composable complex class support for attrs and dataclasses." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cattrs-23.2.3-py3-none-any.whl", hash = "sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108"}, - {file = "cattrs-23.2.3.tar.gz", hash = "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f"}, -] - -[package.dependencies] -attrs = ">=23.1.0" -exceptiongroup = {version = ">=1.1.1", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_version < \"3.11\""} - -[package.extras] -bson = ["pymongo (>=4.4.0)"] -cbor2 = ["cbor2 (>=5.4.6)"] -msgpack = ["msgpack (>=1.0.5)"] -orjson = ["orjson (>=3.9.2)"] -pyyaml = ["pyyaml (>=6.0)"] -tomlkit = ["tomlkit (>=0.11.8)"] -ujson = ["ujson (>=5.7.0)"] - [[package]] name = "certifi" version = "2024.6.2" @@ -369,13 +344,13 @@ wmi = ["wmi (>=1.5.1)"] [[package]] name = "email-validator" -version = "2.1.1" +version = "2.1.2" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" files = [ - {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, - {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, + {file = "email_validator-2.1.2-py3-none-any.whl", hash = "sha256:d89f6324e13b1e39889eab7f9ca2f91dc9aebb6fa50a6d8bd4329ab50f251115"}, + {file = "email_validator-2.1.2.tar.gz", hash = "sha256:14c0f3d343c4beda37400421b39fa411bbe33a75df20825df73ad53e06a9f04c"}, ] [package.dependencies] @@ -951,47 +926,56 @@ files = [ [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.0" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514"}, + {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196"}, + {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1"}, + {file = "numpy-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc"}, + {file = "numpy-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787"}, + {file = "numpy-2.0.0-cp310-cp310-win32.whl", hash = "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98"}, + {file = "numpy-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871"}, + {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4"}, + {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581"}, + {file = "numpy-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995"}, + {file = "numpy-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f"}, + {file = "numpy-2.0.0-cp311-cp311-win32.whl", hash = "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f"}, + {file = "numpy-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e"}, + {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2"}, + {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a"}, + {file = "numpy-2.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95"}, + {file = "numpy-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9"}, + {file = "numpy-2.0.0-cp312-cp312-win32.whl", hash = "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54"}, + {file = "numpy-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86"}, + {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a"}, + {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d"}, + {file = "numpy-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4"}, + {file = "numpy-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44"}, + {file = "numpy-2.0.0-cp39-cp39-win32.whl", hash = "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275"}, + {file = "numpy-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9"}, + {file = "numpy-2.0.0.tar.gz", hash = "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864"}, ] [[package]] @@ -1024,57 +1008,57 @@ websockets = ">=12.0,<13.0" [[package]] name = "orjson" -version = "3.10.3" +version = "3.10.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, - {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, - {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, - {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, - {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, - {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, - {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, - {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, - {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, - {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, - {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, - {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, - {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, - {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, - {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, - {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, ] [[package]] @@ -1114,8 +1098,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -1144,22 +1128,6 @@ sql-other = ["SQLAlchemy (>=1.4.16)"] test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.6.3)"] -[[package]] -name = "platformdirs" -version = "4.2.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] - [[package]] name = "posthog" version = "3.5.0" @@ -1185,13 +1153,13 @@ test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint" [[package]] name = "pydantic" -version = "2.7.3" +version = "2.7.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.3-py3-none-any.whl", hash = "sha256:ea91b002777bf643bb20dd717c028ec43216b24a6001a280f83877fd2655d0b4"}, - {file = "pydantic-2.7.3.tar.gz", hash = "sha256:c46c76a40bb1296728d7a8b99aa73dd70a48c3510111ff290034f860c99c419e"}, + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, ] [package.dependencies] @@ -1458,36 +1426,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "requests-cache" -version = "1.2.0" -description = "A persistent cache for python requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests_cache-1.2.0-py3-none-any.whl", hash = "sha256:490324301bf0cb924ff4e6324bd2613453e7e1f847353928b08adb0fdfb7f722"}, - {file = "requests_cache-1.2.0.tar.gz", hash = "sha256:db1c709ca343cc1cd5b6c8b1a5387298eceed02306a6040760db538c885e3838"}, -] - -[package.dependencies] -attrs = ">=21.2" -cattrs = ">=22.2" -platformdirs = ">=2.5" -requests = ">=2.22" -url-normalize = ">=1.4" -urllib3 = ">=1.25.5" - -[package.extras] -all = ["boto3 (>=1.15)", "botocore (>=1.18)", "itsdangerous (>=2.0)", "pymongo (>=3)", "pyyaml (>=6.0.1)", "redis (>=3)", "ujson (>=5.4)"] -bson = ["bson (>=0.5)"] -docs = ["furo (>=2023.3,<2024.0)", "linkify-it-py (>=2.0,<3.0)", "myst-parser (>=1.0,<2.0)", "sphinx (>=5.0.2,<6.0.0)", "sphinx-autodoc-typehints (>=1.19)", "sphinx-automodapi (>=0.14)", "sphinx-copybutton (>=0.5)", "sphinx-design (>=0.2)", "sphinx-notfound-page (>=0.8)", "sphinxcontrib-apidoc (>=0.3)", "sphinxext-opengraph (>=0.9)"] -dynamodb = ["boto3 (>=1.15)", "botocore (>=1.18)"] -json = ["ujson (>=5.4)"] -mongodb = ["pymongo (>=3)"] -redis = ["redis (>=3)"] -security = ["itsdangerous (>=2.0)"] -yaml = ["pyyaml (>=6.0.1)"] - [[package]] name = "rich" version = "13.7.1" @@ -1509,28 +1447,28 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.4.7" +version = "0.4.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e089371c67892a73b6bb1525608e89a2aca1b77b5440acf7a71dda5dac958f9e"}, - {file = "ruff-0.4.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:10f973d521d910e5f9c72ab27e409e839089f955be8a4c8826601a6323a89753"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59c3d110970001dfa494bcd95478e62286c751126dfb15c3c46e7915fc49694f"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa9773c6c00f4958f73b317bc0fd125295110c3776089f6ef318f4b775f0abe4"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07fc80bbb61e42b3b23b10fda6a2a0f5a067f810180a3760c5ef1b456c21b9db"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:fa4dafe3fe66d90e2e2b63fa1591dd6e3f090ca2128daa0be33db894e6c18648"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7c0083febdec17571455903b184a10026603a1de078428ba155e7ce9358c5f6"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad1b20e66a44057c326168437d680a2166c177c939346b19c0d6b08a62a37589"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf5d818553add7511c38b05532d94a407f499d1a76ebb0cad0374e32bc67202"}, - {file = "ruff-0.4.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:50e9651578b629baec3d1513b2534de0ac7ed7753e1382272b8d609997e27e83"}, - {file = "ruff-0.4.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8874a9df7766cb956b218a0a239e0a5d23d9e843e4da1e113ae1d27ee420877a"}, - {file = "ruff-0.4.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b9de9a6e49f7d529decd09381c0860c3f82fa0b0ea00ea78409b785d2308a567"}, - {file = "ruff-0.4.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:13a1768b0691619822ae6d446132dbdfd568b700ecd3652b20d4e8bc1e498f78"}, - {file = "ruff-0.4.7-py3-none-win32.whl", hash = "sha256:769e5a51df61e07e887b81e6f039e7ed3573316ab7dd9f635c5afaa310e4030e"}, - {file = "ruff-0.4.7-py3-none-win_amd64.whl", hash = "sha256:9e3ab684ad403a9ed1226894c32c3ab9c2e0718440f6f50c7c5829932bc9e054"}, - {file = "ruff-0.4.7-py3-none-win_arm64.whl", hash = "sha256:10f2204b9a613988e3484194c2c9e96a22079206b22b787605c255f130db5ed7"}, - {file = "ruff-0.4.7.tar.gz", hash = "sha256:2331d2b051dc77a289a653fcc6a42cce357087c5975738157cd966590b18b5e1"}, + {file = "ruff-0.4.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991"}, + {file = "ruff-0.4.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db"}, + {file = "ruff-0.4.9-py3-none-win32.whl", hash = "sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521"}, + {file = "ruff-0.4.9-py3-none-win_amd64.whl", hash = "sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52"}, + {file = "ruff-0.4.9-py3-none-win_arm64.whl", hash = "sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198"}, + {file = "ruff-0.4.9.tar.gz", hash = "sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3"}, ] [[package]] @@ -1603,13 +1541,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "typing-extensions" -version = "4.12.1" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.1-py3-none-any.whl", hash = "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a"}, - {file = "typing_extensions-4.12.1.tar.gz", hash = "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -1710,29 +1648,15 @@ files = [ {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, ] -[[package]] -name = "url-normalize" -version = "1.4.3" -description = "URL normalization for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, - {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, -] - -[package.dependencies] -six = "*" - [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -2122,4 +2046,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "b43271976f223a951406fc8e66b4b8203bad9390dd44856a1c1009ad803958cc" +content-hash = "c60f83ca7ea8f013136da295af84119795cfabf177acaf348eec39cad38b35a2" diff --git a/openbb_platform/providers/biztoc/pyproject.toml b/openbb_platform/providers/biztoc/pyproject.toml index b684baa2d8e1..e55acb64ce46 100644 --- a/openbb_platform/providers/biztoc/pyproject.toml +++ b/openbb_platform/providers/biztoc/pyproject.toml @@ -10,7 +10,6 @@ packages = [{ include = "openbb_biztoc" }] [tool.poetry.dependencies] python = "^3.8" openbb-core = "^1.2.5" -requests-cache = "^1.1.0" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/biztoc/tests/record/http/test_biztoc_fetchers/test_biztoc_world_news_fetcher.yaml b/openbb_platform/providers/biztoc/tests/record/http/test_biztoc_fetchers/test_biztoc_world_news_fetcher.yaml index 7abcaca1a281..54aaf466504a 100644 --- a/openbb_platform/providers/biztoc/tests/record/http/test_biztoc_fetchers/test_biztoc_world_news_fetcher.yaml +++ b/openbb_platform/providers/biztoc/tests/record/http/test_biztoc_fetchers/test_biztoc_world_news_fetcher.yaml @@ -3,195 +3,59 @@ interactions: body: null headers: Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - X-RapidAPI-Host: - - biztoc.p.rapidapi.com - X-RapidAPI-Key: - - MOCK_API_KEY - method: GET - uri: https://biztoc.p.rapidapi.com/pages - response: - body: - string: '["main","crypto","media","hot","wire"] - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8151ab47abf72000-IAD - Cache-Control: - - no-store, no-cache, must-revalidate, max-age=0 - Connection: - - keep-alive - Content-Length: - - '39' - Content-Type: - application/json - Date: - - Thu, 12 Oct 2023 19:15:00 GMT - NEL: - - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' - Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CymLWZlhMr3p%2BEqjjWMz%2FcFjna2HYGBes5m%2FqRlrmkE5sYNMUi2dGWuvbeBL1RpvrBWji7qN3HHlQX4KVDJslXWoayHutaobXmPX2Q4C5MPPg3FdQGhzdOG1yfcdDQev"}],"group":"cf-nel","max_age":604800}' - Server: - - RapidAPI-1.2.8 - X-RapidAPI-Region: - - AWS - us-east-1 - X-RapidAPI-Version: - - 1.2.8 - X-RateLimit-Requests-Limit: - - '2000' - X-RateLimit-Requests-Remaining: - - '1876' - X-RateLimit-Requests-Reset: - - '2089589' - alt-svc: - - h3=":443"; ma=86400 - permissions-policy: - - browsing-topics=() - referrer-policy: - - strict-origin-when-cross-origin - strict-transport-security: - - max-age=31556926; includeSubDomains - vary: - - Accept-Encoding, Cookie - x-content-type-options: - - nosniff - x-midashi-app: - - '1' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - X-RapidAPI-Host: - - biztoc.p.rapidapi.com - X-RapidAPI-Key: - - MOCK_API_KEY - method: GET - uri: https://biztoc.p.rapidapi.com/tags/main - response: - body: - string: !!binary | - H4sIALVFKGUA/3VWwZLsNgi85zP2nFtu+ZVUDlhibMYS+CHJHm8q/x68eVsFM/OOw0iIhu7Gf/3z - 0WH++PODmgKWj39//w4sUKG53/8fIBeZ4RPczxtmVCiKDXVH98dYFYh9pFLOBRFad8GuFhh6utAG - BVsnJmAXzcJQctdRN3/9oN5RQ8J4QnEbU6EE7HHpaC3mJw0/rQ+fEt7HKkmh+yyzyFw8xFsRpRz6 - I5qfute6kq9wMHXMMLocoitqe9+LN2PxoQn5DpWYsQOfsAz/Ahy+Q7R2WV3gjge1xQUajEygMJGH - gkW4juZvVuAFeo+d27YSx86d8ahUCtkMyaji+9Mf7teK3Edaz9D3rkKeMpbstEYl6v6cLCT+VWtD - QFQn4NXqvSmhn0iTRFAapqExIc7n5p9NoFKM0Wg4WqDGjHxpoEqXMLwVd+Ka7GJffOaOrfjioEDF - wJpf1HpxNLJ2wc9JSoEwvY47tgRWJr6+cikVNC2hngI77YFMdCeeXaSg1RRQ36nejdyhHHvaiuEe - mImPhxFHJvJGM0vJhrBBWvzZtsDBNzMOF9sLZKqk2+ghvhjw8xDJkRt3UxBGBpXAhUppoTm2EXSH - INRvuXvAWxWN90xnIjdi4ITPLxrTL7q8U7M/O5FpnluX5IVlttEHY5LqwflqqrQkR4Deb4Uer0nC - pJdoc0nMsSB75Yz2xpPNIgIQUzJG210IVc9JsT9pw3oWbORpugUmYxFuJpKKAeG3GZijp3W7aOUN - XDhje6aa+drpsbSxKVZr41B/ucigtpshYaATz6sE0l8ylJvJRm1/PDPaz5saB8qBkm0Pf0U2NO/z - R9gaddpmYsPpO/2sKbvI7Sz7JX3fxslnq/ig5JHzTjmcv+z8l3s7zHagmpHFdFRvL+sn482Ii8ay - FBIYJKMVs3nKDJbJz+PUUNQX+hz4gJvPxdAy/DAZbNJsS4aez9Qv49ad7H1IfsCNbOML72Aj9nO5 - tjE+NnuyU5jg6MFCV2NNCWURWzvDRA9oi3mkTTEnHzaFX7wJ4kG/73+aja393awqLp0EG3Upr5HF - 2BrWZoptzHDCtWmI/dh2MvFF3hy2qECjk6ikSB7cIeyjPsykfJ0/v1mMU2jODD0QAKov7tr7LEGm - todMUOrH+bVt425jI0/4dNqvr5ujBU88JgiFHy9K6KAzerw/wEK+3MvxbFtClOHCK+nkQbduQN9a - 1dd3V5OwZmxu/tE/wmeTrp9maqgTqhnO37/9Bz30pJSSCwAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8151ab4cdbfb7f82-IAD - Cache-Control: - - no-store, no-cache, must-revalidate, max-age=0 - Connection: - - keep-alive - Content-Encoding: - gzip - Content-Length: - - '948' - Content-Type: - - application/json - Date: - - Thu, 12 Oct 2023 19:15:01 GMT - NEL: - - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' - Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=rnRmkXgNSUm1NZyMHIrWeuHzWUvDiQ%2B3LPMtOwgEUhRwpIruIbFmFOn%2FCYuHYuZsrBPSPcPBEHrS0dP6gidW3K1qtLAH3kj02LzAgVhYQ0gishf6fiowg8Ntd2HPweAE"}],"group":"cf-nel","max_age":604800}' - Server: - - RapidAPI-1.2.8 - X-RapidAPI-Region: - - AWS - us-east-1 - X-RapidAPI-Version: - - 1.2.8 - X-RateLimit-Requests-Limit: - - '2000' - X-RateLimit-Requests-Remaining: - - '1875' - X-RateLimit-Requests-Reset: - - '2089588' - alt-svc: - - h3=":443"; ma=86400 - permissions-policy: - - browsing-topics=() - referrer-policy: - - strict-origin-when-cross-origin - strict-transport-security: - - max-age=31556926; includeSubDomains - vary: - - Accept-Encoding, Cookie - x-content-type-options: - - nosniff - x-midashi-app: - - '1' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate Connection: - keep-alive + User-Agent: + - Mozilla/5.0 (Windows NT 10.0; WOW64; rv:86.0) Gecko/20100101 Firefox/86.0 X-RapidAPI-Host: - biztoc.p.rapidapi.com X-RapidAPI-Key: - MOCK_API_KEY method: GET - uri: https://biztoc.p.rapidapi.com/tags/crypto + uri: https://biztoc.p.rapidapi.com/sources response: body: string: !!binary | - H4sIALZFKGUA/3VWzW70Ngy89zFy7uELeijQV2l7oCTa5loWBYr2xlv03UtvWoDcpJcsREf8GQ2H - /P2vN4X57be3RJqZ2tvfP/9nmfTDnVAXFNw3ZxqwJWjrBm0SwuK+QIUNCwgOBMnL1y/OkkG4UkOs - lQa3GNKd9E6qKM7SJnWn/0nlQ7pPOU3+ClLLcnZln8/T0Fkhmg2cBAP9dWrQsrcUnMinLAhjl9OZ - 9lE0HrNPb6H0JZVRQX0QGgJYnaFzPeeA3OUHqO3ONDPP1buZuFa+7+NLPKuSfFKpQl6F8+oL5dn7 - Euo9OL++v9BpBjnv0GaPzwIerpwCGBMWFKgXieQIuKv/N8WKs4An5gIb+Lpk+DAzNhzkv5eQhp3q - uXDxECd49ZkXq6Vjmx8LeJ5sVEpFe3eNRHiwp+6FjSG0+psV7zRW6BU8bBCaZVLvdqKCldTzK08B - HFTP98H71cWt0FCh7F1RayjZfHXD29cJslI7MJZzeGyeZBN6kYa9eEyN5758tOgJal72FkBdBVZs - X4AbMOEv3kqrsqfjZllmXvC7HvD+b31jmQO+/+oetPKNwn2GXxH7hgo1RBwmRqZdXmtStS652wUf - c9DcwtXJhISrvzcUrEbBBi8UKTh8mS9SGaKw0cZfv6Somth6mxplKYVG3QNdoBgDwF4Tyh1uvoP2 - MegVt8NDxaufFpkkhzhqLo3yB+H9e2tm7+3gE+Yg9gUOKqGakVn1xksbcWyYPBjdPKvOIGfNS+wF - ZdegdyYm58gQ0r8e4yIZagY/TzrsVffCcmMTlfDqbYbO4p3coKGeFjHwFCu3bQ/vPC5tidp4qq8o - 5wLqsYBKlp4aNx6epGyqZePWBtWAusFLZz1nU8FuFzdsvsGXnZOPLliMGWF4iDYKYwnCtDYyJ6ES - poR1TLcexUUqhaWgQO9Bc7oPngQe5BvIJHE7sVAhD8HnWKSALD0gWVvfQSRgPiNPkylNMR0KDcbW - YDUAK2Hs7SlOrOfAfA6M8M6G18hXWPXPIQZqqy+SdEBLu2VnvKIoMbZeWX+kPWcOWDXCekeZwg6w - cJtXDtO12+5VQ1qbSTue02R5BSnTP/Yf7+/pdv38ivb3B777stOZwuvDYWtcy4t/3M/94uu+J3ZV - gqiSBCLOFcZoXOJm9RRlj1ODw580cA1q7HjbDPPVmKH92Ka15edDzzkGtQEcun6hvtFH0CHlk6/W - +/OnfwBvy8x+OwsAAA== + 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 headers: CF-Cache-Status: - DYNAMIC CF-RAY: - - 8151ab51fa4f3aea-IAD + - 896986ba3d815ae1-IAD Cache-Control: - no-store, no-cache, must-revalidate, max-age=0 Connection: @@ -199,102 +63,21 @@ interactions: Content-Encoding: - gzip Content-Length: - - '925' + - '1800' Content-Type: - application/json Date: - - Thu, 12 Oct 2023 19:15:02 GMT + - Thu, 20 Jun 2024 05:58:18 GMT NEL: - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=e3Dqaqp5r5QSLtOc3u6JU%2Flojktm9Cxs2q7OG2iQ7mUYcmcV1fLQREmRo1mHgULiYZT8k3YJImEts0LQADOtvl9kq1d4d3EkfmPCAly4%2BdQ%2FeBOYF4XMeTNOVjHr5T6%2B"}],"group":"cf-nel","max_age":604800}' + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=iVv4rDNEo12PiUTQrieDXV8t%2BJi3D6%2FXsxsgn4K7nOB3UuSGB%2BqMcpNXnIRn%2BT45tbMpThg0rFaIo6JRD9SMKV1om2lBW%2BtU0lQh0qw0Mo8%2FUNjXTcDQIJQmalU%3D"}],"group":"cf-nel","max_age":604800}' Server: - RapidAPI-1.2.8 - X-RapidAPI-Region: - - AWS - us-east-1 - X-RapidAPI-Version: - - 1.2.8 - X-RateLimit-Requests-Limit: - - '2000' - X-RateLimit-Requests-Remaining: - - '1874' - X-RateLimit-Requests-Reset: - - '2089587' - alt-svc: - - h3=":443"; ma=86400 - permissions-policy: - - browsing-topics=() - referrer-policy: - - strict-origin-when-cross-origin - strict-transport-security: + Strict-Transport-Security: - max-age=31556926; includeSubDomains - vary: + Vary: - Accept-Encoding, Cookie - x-content-type-options: - - nosniff - x-midashi-app: - - '1' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - X-RapidAPI-Host: - - biztoc.p.rapidapi.com - X-RapidAPI-Key: - - MOCK_API_KEY - method: GET - uri: https://biztoc.p.rapidapi.com/tags/media - response: - body: - string: !!binary | - H4sIALdFKGUA/21WS7LcNgzc5xhvnYUr5Y19FScLkIREjEhCBZIja1K5u6EX2wXMm6UgEr/uBvjt - 37cB69vXN+oCWN7++/OXIUOFbr4rJgIaaI9wKefBnIztfz9kLA3HUui7sYyMh8BuLCs8wB6gbfBm - DDsIVJ5tfIxkcxxwFpZ+0GIPaiEPbs5bwT6oEVjrAdJQgnBP1CPfUU7z94YH9ey8RhtZZrUFdVhh - GWKLQoE+eIotW6uqNkriBiU9O3Nla3IN7Z1x0Bho3R6rjdtCnI20nA4WXyzc6uzbKzwFdxbv8w5C - OM7XXbQYzE2AmqVJwHaDSk2JAO2EPG0X973gSxBsyXCn9IBe4G7xFwffyrw6V1D3YbsYqJTAIJat - lVIqiAqMh9oTf9h2am9mKBR91U37pYpBuX68ZuQL/AOrxR3H1JXqLbn6F3VBySaRQe6+kobHybJF - chgV4tZXeFYtR5iu5PcECW3QS5J9CNkWQoLaNbviqPGLCL75UVUOQ5zPjI+gHAOrowJ61UtANQBN - wbSVdF6oD0g0q4UK4hbnqKxxIg9bUqOolSppzpbyFI8w1RtLckgFPLnFv+enT/jFFhKszGNG1ZEj - kDLbfG9YOp7vunY9qgqYG6+XnCq06Yy3WUgHxyWBZ3Dsd+ZjULXtXkXn1YvxY1OV8JqX9oxiq/Vt - SMNCFMFyD/767CgcaHXprsiykr1BA4qftX3nQcvpGnenVmME1ZG1H0qtAG1zVGj2xAKl8JJ5duRl - 9ux791FNeZbpWnfNYCc3Lps2x/ZzZEKRMwh6vfaBd2Weltft8UU7rxeixvao1EOwxfxUnwqoBgRn - L6g0sHdVTMPNt0p7ZCuGIPAgS6ePKsK+O61hZU3SbVWrd10RayHPrLmjVAemvhM2nVvUPA/aYnMJ - KMXpvOJ3ivwBCNANkNw+cdNXI2dthIv/s9sOLrcOWUpSt2SFesPedSGuE0nYlXx3rpZgb1F37w2Z - vXtix6Db2a0PxSj6/ZKDDXib1+xUPV8dgs3zZUydUmejNY8nHESnHbbBFQYrhexiXBR31X9zp924 - UMUM5gNLcWSAVPwU//3sWgsH93qIgrhbZikGWXfUKEBuzqAubbLZaXubRVRDKnscNeii7dO7MmbR - 9xeIOADercNDsIvORn0wIDveqPB0TfjrGlvbC9fUoWaP6xJvbnMFCvTy/RJBRWQb8c7rK6F//vgB - Wc8DbF0LAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8151ab57dc8c5908-IAD - Cache-Control: - - no-store, no-cache, must-revalidate, max-age=0 - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Length: - - '920' - Content-Type: - - application/json - Date: - - Thu, 12 Oct 2023 19:15:03 GMT - NEL: - - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' - Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=FR2vOJsQLajCOGMFOiCtwx6NNHE9OKdBibXL4FX0revGUqc8ptf5%2F%2Fvl%2FmYenY9DXz8efXibdJYNSeUAJ6p06UeTPMrrVtZ4wJuxXtYmoP%2FxrZzZiX7keYq6Pg6pzBDb"}],"group":"cf-nel","max_age":604800}' - Server: - - RapidAPI-1.2.8 X-RapidAPI-Region: - AWS - us-east-1 X-RapidAPI-Version: @@ -302,23 +85,27 @@ interactions: X-RateLimit-Requests-Limit: - '2000' X-RateLimit-Requests-Remaining: - - '1873' + - '1951' X-RateLimit-Requests-Reset: - - '2089586' + - '1359791' + X-RateLimit-rapid-free-plans-hard-limit-Limit: + - '500000' + X-RateLimit-rapid-free-plans-hard-limit-Remaining: + - '499968' + X-RateLimit-rapid-free-plans-hard-limit-Reset: + - '1359791' alt-svc: - h3=":443"; ma=86400 permissions-policy: - browsing-topics=() referrer-policy: - strict-origin-when-cross-origin - strict-transport-security: - - max-age=31556926; includeSubDomains - vary: - - Accept-Encoding, Cookie + rndr-id: + - dc777f30-cbc5-4e9a x-content-type-options: - nosniff - x-midashi-app: - - '1' + x-render-origin-server: + - gunicorn status: code: 200 message: OK @@ -326,209 +113,130 @@ interactions: body: null headers: Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - X-RapidAPI-Host: - - biztoc.p.rapidapi.com - X-RapidAPI-Key: - - MOCK_API_KEY - method: GET - uri: https://biztoc.p.rapidapi.com/tags/hot - response: - body: - string: '[] - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8151ab5d8aae5a76-IAD - Cache-Control: - - no-store, no-cache, must-revalidate, max-age=0 - Connection: - - keep-alive - Content-Length: - - '3' - Content-Type: - - application/json - Date: - - Thu, 12 Oct 2023 19:15:04 GMT - NEL: - - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' - Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=bQ6cqc0YVqRnkRMSrTTMzk%2FNIz1%2BFAGxwpZERmYvJUPlKiU2RJqleXwo2w31kZrjrWz0o1OSk5meieC2k7BTcWtautNimewP9oTNnK7bz32eeAqzdoJOcpMFx8RiIi7y"}],"group":"cf-nel","max_age":604800}' - Server: - - RapidAPI-1.2.8 - X-RapidAPI-Region: - - AWS - us-east-1 - X-RapidAPI-Version: - - 1.2.8 - X-RateLimit-Requests-Limit: - - '2000' - X-RateLimit-Requests-Remaining: - - '1872' - X-RateLimit-Requests-Reset: - - '2089585' - alt-svc: - - h3=":443"; ma=86400 - permissions-policy: - - browsing-topics=() - referrer-policy: - - strict-origin-when-cross-origin - strict-transport-security: - - max-age=31556926; includeSubDomains - vary: - - Accept-Encoding, Cookie - x-content-type-options: - - nosniff - x-midashi-app: - - '1' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - X-RapidAPI-Host: - - biztoc.p.rapidapi.com - X-RapidAPI-Key: - - MOCK_API_KEY - method: GET - uri: https://biztoc.p.rapidapi.com/tags/wire - response: - body: - string: '[] - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8151ab62fa2f20b1-IAD - Cache-Control: - - no-store, no-cache, must-revalidate, max-age=0 - Connection: - - keep-alive - Content-Length: - - '3' - Content-Type: - application/json - Date: - - Thu, 12 Oct 2023 19:15:04 GMT - NEL: - - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' - Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=vCyGCo%2BtVBvQbSrnvFBwspJ0rD%2B5pMwtvo%2FXxDBem172KaO0SPsM5hvOLvUoCE55stmHF56KA4oJETMe2DsSo1Eojg2J0kcKQ4gdgm9EOUcf6oRKS%2BKG4O2wWB7uBiCl"}],"group":"cf-nel","max_age":604800}' - Server: - - RapidAPI-1.2.8 - X-RapidAPI-Region: - - AWS - us-east-1 - X-RapidAPI-Version: - - 1.2.8 - X-RateLimit-Requests-Limit: - - '2000' - X-RateLimit-Requests-Remaining: - - '1871' - X-RateLimit-Requests-Reset: - - '2089585' - alt-svc: - - h3=":443"; ma=86400 - permissions-policy: - - browsing-topics=() - referrer-policy: - - strict-origin-when-cross-origin - strict-transport-security: - - max-age=31556926; includeSubDomains - vary: - - Accept-Encoding, Cookie - x-content-type-options: - - nosniff - x-midashi-app: - - '1' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' Accept-Encoding: - - gzip, deflate + - gzip Connection: - keep-alive + User-Agent: + - Mozilla/5.0 (Windows NT 10.0; WOW64; rv:86.0) Gecko/20100101 Firefox/86.0 X-RapidAPI-Host: - biztoc.p.rapidapi.com X-RapidAPI-Key: - MOCK_API_KEY method: GET - uri: https://biztoc.p.rapidapi.com/sources + uri: https://biztoc.p.rapidapi.com/news/source/bloomberg response: body: string: !!binary | - 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 - A9T++af/ANZGFa71KwAA + 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 headers: CF-Cache-Status: - DYNAMIC CF-RAY: - - 8151ab68b8ea56c8-IAD + - 896986bcdf8b6906-IAD Cache-Control: - no-store, no-cache, must-revalidate, max-age=0 Connection: @@ -536,370 +244,21 @@ interactions: Content-Encoding: - gzip Content-Length: - - '2694' + - '5849' Content-Type: - application/json Date: - - Thu, 12 Oct 2023 19:15:05 GMT + - Thu, 20 Jun 2024 05:58:18 GMT NEL: - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=350bGZmVsCpjN90SzQ6k1Xiv03365SzQGR435xb7EWrCnAuFUlh4Cbi8YKb3EB1YPKsqfdPPygSPmv1GpSTiv3zJnDJ6yXTz0zZU9MdqB7AJ1QOzrmC%2FZMTiqpqY6MjI"}],"group":"cf-nel","max_age":604800}' + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=ZN%2F8ck6b7cPIzG4vSrvPgk03UDsoYqPE7VkaOrFAXeY3E%2FPosvcEg%2BT1yhqVqQhuy2ZW4e0BdubeOhgZoi2UjQW9XBsCEosZBGhTQoKR9PggsAqpB5w8FUfOtdI%3D"}],"group":"cf-nel","max_age":604800}' Server: - RapidAPI-1.2.8 - X-RapidAPI-Region: - - AWS - us-east-1 - X-RapidAPI-Version: - - 1.2.8 - X-RateLimit-Requests-Limit: - - '2000' - X-RateLimit-Requests-Remaining: - - '1870' - X-RateLimit-Requests-Reset: - - '2089584' - alt-svc: - - h3=":443"; ma=86400 - permissions-policy: - - browsing-topics=() - referrer-policy: - - strict-origin-when-cross-origin - strict-transport-security: + Strict-Transport-Security: - max-age=31556926; includeSubDomains - vary: + Vary: - Accept-Encoding, Cookie - x-content-type-options: - - nosniff - x-midashi-app: - - '1' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - X-RapidAPI-Host: - - biztoc.p.rapidapi.com - X-RapidAPI-Key: - - MOCK_API_KEY - method: GET - uri: https://biztoc.p.rapidapi.com/search?q=earnings - response: - body: - string: !!binary | - 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 - 60D0DevINeucetb/7X/9H3LN8tMBuwAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8151ab6dbf203b95-IAD - Cache-Control: - - no-store, no-cache, must-revalidate, max-age=0 - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Length: - - '16212' - Content-Type: - - application/json - Date: - - Thu, 12 Oct 2023 19:15:06 GMT - NEL: - - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' - Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=1YVn%2F0KK4QH5kYoRJvlrbCjxWiwQU%2BOSS4oCrB4AecLfZrIkX4ar53CFbJfcA1UPJZwPdW8GmQ32WKMnAbv3XEhF06Suc54w7woZhRMCyDQTbKRlXRJJJhkZdnqK19JK"}],"group":"cf-nel","max_age":604800}' - Server: - - RapidAPI-1.2.8 X-RapidAPI-Region: - AWS - us-east-1 X-RapidAPI-Version: @@ -907,23 +266,27 @@ interactions: X-RateLimit-Requests-Limit: - '2000' X-RateLimit-Requests-Remaining: - - '1869' + - '1950' X-RateLimit-Requests-Reset: - - '2089583' + - '1359791' + X-RateLimit-rapid-free-plans-hard-limit-Limit: + - '500000' + X-RateLimit-rapid-free-plans-hard-limit-Remaining: + - '499967' + X-RateLimit-rapid-free-plans-hard-limit-Reset: + - '1359791' alt-svc: - h3=":443"; ma=86400 permissions-policy: - browsing-topics=() referrer-policy: - strict-origin-when-cross-origin - strict-transport-security: - - max-age=31556926; includeSubDomains - vary: - - Accept-Encoding, Cookie + rndr-id: + - 443f378b-b32f-486d x-content-type-options: - nosniff - x-midashi-app: - - '1' + x-render-origin-server: + - gunicorn status: code: 200 message: OK diff --git a/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py b/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py index 3499f7fb70c0..7dded3831447 100644 --- a/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py +++ b/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py @@ -4,14 +4,16 @@ from openbb_biztoc.models.world_news import BiztocWorldNewsFetcher from openbb_core.app.service.user_service import UserService -test_credentials = UserService().default_user_settings.credentials.dict() +test_credentials = UserService().default_user_settings.credentials.model_dump( + mode="json" +) @pytest.fixture(scope="module") def vcr_config(): """VCR configuration.""" return { - "filter_headers": [("User-Agent", None), ("X-RapidAPI-Key", "MOCK_API_KEY")], + "filter_headers": [("X-RapidAPI-Key", "MOCK_API_KEY")], "filter_query_parameters": [ ("apikey", "MOCK_API_KEY"), ],