diff options
author | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-05-17 05:49:32 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-17 12:49:32 +0000 |
commit | 3df4e058c5c9c27d5608d724203e68e38100504b (patch) | |
tree | 4b04dbfebdfc66b36a9a8308e89f042d1ce2ea6b | |
parent | e124457829876d2e0a4894c5f28bab2a4897529e (diff) |
[BugFix] Do Intrinio News TO-DOs -> Remove workaround because they fixed it. (#6427)
* TO-DOs done
* recapture test cassettes
---------
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
6 files changed, 521 insertions, 522 deletions
diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json index c4fd0fe8059..5449acc33c9 100644 --- a/openbb_platform/openbb/assets/reference.json +++ b/openbb_platform/openbb/assets/reference.json @@ -30534,7 +30534,7 @@ { "name": "business_relevance_greater_than", "type": "float", - "description": "News stories will have a business relevance score more than this value. Unsupported for yahoo source.", + "description": "News stories will have a business relevance score more than this value. Unsupported for yahoo source. Value is a decimal between 0 and 1.", "default": null, "optional": true, "choices": null @@ -30542,7 +30542,7 @@ { "name": "business_relevance_less_than", "type": "float", - "description": "News stories will have a business relevance score less than this value. Unsupported for yahoo source.", + "description": "News stories will have a business relevance score less than this value. Unsupported for yahoo source. Value is a decimal between 0 and 1.", "default": null, "optional": true, "choices": null @@ -31075,7 +31075,7 @@ { "name": "business_relevance_greater_than", "type": "float", - "description": "News stories will have a business relevance score more than this value. Unsupported for yahoo source.", + "description": "News stories will have a business relevance score more than this value. Unsupported for yahoo source. Value is a decimal between 0 and 1.", "default": null, "optional": true, "choices": null @@ -31083,7 +31083,7 @@ { "name": "business_relevance_less_than", "type": "float", - "description": "News stories will have a business relevance score less than this value. Unsupported for yahoo source.", + "description": "News stories will have a business relevance score less than this value. Unsupported for yahoo source. Value is a decimal between 0 and 1.", "default": null, "optional": true, "choices": null diff --git a/openbb_platform/openbb/package/news.py b/openbb_platform/openbb/package/news.py index b0e65cd2ab2..703eb34a046 100644 --- a/openbb_platform/openbb/package/news.py +++ b/openbb_platform/openbb/package/news.py @@ -112,9 +112,9 @@ class ROUTER_news(Container): is_spam : Optional[bool] Filter whether it is marked as spam or not. Unsupported for yahoo source. (provider: intrinio) business_relevance_greater_than : Optional[float] - News stories will have a business relevance score more than this value. Unsupported for yahoo source. (provider: intrinio) + News stories will have a business relevance score more than this value. Unsupported for yahoo source. Value is a decimal between 0 and 1. (provider: intrinio) business_relevance_less_than : Optional[float] - News stories will have a business relevance score less than this value. Unsupported for yahoo source. (provider: intrinio) + News stories will have a business relevance score less than this value. Unsupported for yahoo source. Value is a decimal between 0 and 1. (provider: intrinio) offset : Optional[int] Page offset, used in conjunction with limit. (provider: tiingo) @@ -327,9 +327,9 @@ class ROUTER_news(Container): is_spam : Optional[bool] Filter whether it is marked as spam or not. Unsupported for yahoo source. (provider: intrinio) business_relevance_greater_than : Optional[float] - News stories will have a business relevance score more than this value. Unsupported for yahoo source. (provider: intrinio) + News stories will have a business relevance score more than this value. Unsupported for yahoo source. Value is a decimal between 0 and 1. (provider: intrinio) business_relevance_less_than : Optional[float] - News stories will have a business relevance score less than this value. Unsupported for yahoo source. (provider: intrinio) + News stories will have a business relevance score less than this value. Unsupported for yahoo source. Value is a decimal between 0 and 1. (provider: intrinio) offset : Optional[int] Page offset, used in conjunction with limit. (provider: tiingo) diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/company_news.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/company_news.py index d70a7734f75..7577e4225e9 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/company_news.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/company_news.py @@ -1,8 +1,9 @@ """Intrinio Company News Model.""" import asyncio -from datetime import datetime +from datetime import datetime, timedelta 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.company_news import ( @@ -66,13 +67,17 @@ class IntrinioCompanyNewsQueryParams(CompanyNewsQueryParams): ) business_relevance_greater_than: Optional[float] = Field( default=None, + ge=0, + le=1, description="News stories will have a business relevance score more than this value." - + " Unsupported for yahoo source.", + + " Unsupported for yahoo source. Value is a decimal between 0 and 1.", ) business_relevance_less_than: Optional[float] = Field( default=None, + ge=0, + le=1, description="News stories will have a business relevance score less than this value." - + " Unsupported for yahoo source.", + + " Unsupported for yahoo source. Value is a decimal between 0 and 1.", ) @@ -164,7 +169,18 @@ class IntrinioCompanyNewsFetcher( @staticmethod def transform_query(params: Dict[str, Any]) -> IntrinioCompanyNewsQueryParams: """Transform the query params.""" - return IntrinioCompanyNewsQueryParams(**params) + transformed_params = params + if not transformed_params.get("start_date"): + transformed_params["start_date"] = ( + datetime.now() - timedelta(days=365) + ).date() + if not transformed_params.get("end_date"): + transformed_params["end_date"] = (datetime.now() + timedelta(days=1)).date() + if transformed_params["start_date"] == transformed_params["end_date"]: + transformed_params["end_date"] = ( + transformed_params["end_date"] + timedelta(days=1) + ).date() + return IntrinioCompanyNewsQueryParams(**transformed_params) @staticmethod async def aextract_data( @@ -199,23 +215,26 @@ class IntrinioCompanyNewsFetcher( # query.limit can be None... limit = query.limit or 2500 while next_page and limit > articles: - url = f"{base_url}/{symbol}/news?{query_str}&api_key={api_key}&next_page={next_page}" + url = ( + f"{base_url}/{symbol}/news?{query_str}" + + f"&page_size={query.limit}&api_key={api_key}&next_page={next_page}" + ) result = await get_data(url, session=session, **kwargs) _data = result.get("news", []) if _data: data.extend([{"symbol": symbol, **d} for d in _data]) articles = len(data) next_page = result.get("next_page") - # Remove duplicates based on URL return data seen = set() async def get_one(symbol): """Get the data for one symbol.""" - # TODO: Change page_size to a more appropriate value when Intrinio fixes the bug in this param. - url = f"{base_url}/{symbol}/news?{query_str}&page_size=99&api_key={api_key}" + url = f"{base_url}/{symbol}/news?{query_str}&page_size={query.limit}&api_key={api_key}" data = await amake_request(url, response_callback=callback, **kwargs) + if not data: + warn(f"No data found for: {symbol}") if data: data = [x for x in data if not (x["url"] in seen or seen.add(x["url"]))] # type: ignore news.extend( @@ -229,7 +248,10 @@ class IntrinioCompanyNewsFetcher( await asyncio.gather(*tasks) if not news: - raise EmptyDataError("Error: The request was returned as empty.") + raise EmptyDataError( + "Error: The request was returned as empty." + + " Try adjusting the requested date ranges, if applicable." + ) return news diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py index 69035f8d476..b625d91267c 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py @@ -1,6 +1,8 @@ """Intrinio World News Model.""" -from datetime import datetime +# pylint: disable=unused-argument + +from datetime import datetime, timedelta from typing import Any, Dict, List, Literal, Optional, Union from openbb_core.provider.abstract.fetcher import Fetcher @@ -60,13 +62,17 @@ class IntrinioWorldNewsQueryParams(WorldNewsQueryParams): ) business_relevance_greater_than: Optional[float] = Field( default=None, + ge=0, + le=1, description="News stories will have a business relevance score more than this value." - + " Unsupported for yahoo source.", + + " Unsupported for yahoo source. Value is a decimal between 0 and 1.", ) business_relevance_less_than: Optional[float] = Field( default=None, + ge=0, + le=1, description="News stories will have a business relevance score less than this value." - + " Unsupported for yahoo source.", + + " Unsupported for yahoo source. Value is a decimal between 0 and 1.", ) @@ -161,7 +167,16 @@ class IntrinioWorldNewsFetcher( @staticmethod def transform_query(params: Dict[str, Any]) -> IntrinioWorldNewsQueryParams: """Transform the query params.""" - return IntrinioWorldNewsQueryParams(**params) + transformed_params = params + if not transformed_params.get("start_date"): + transformed_params["start_date"] = datetime.now().date() + if not transformed_params.get("end_date"): + transformed_params["end_date"] = (datetime.now() + timedelta(days=1)).date() + if transformed_params["start_date"] == transformed_params["end_date"]: + transformed_params["end_date"] = ( + transformed_params["end_date"] + timedelta(days=1) + ).date() + return IntrinioWorldNewsQueryParams(**transformed_params) @staticmethod async def aextract_data( @@ -179,9 +194,7 @@ class IntrinioWorldNewsFetcher( else ["symbol", "page_size"] ) query_str = get_querystring(query.model_dump(by_alias=True), ignore) - # TODO: Change page_size to a more appropriate value when Intrinio fixes the bug in this param. - url = f"{base_url}/news?{query_str}&page_size=99&api_key={api_key}" - + url = f"{base_url}/news?{query_str}&page_size={query.limit}&api_key={api_key}" seen = set() async def callback(response, session): @@ -195,7 +208,7 @@ class IntrinioWorldNewsFetcher( articles = len(data) next_page = result.get("next_page") while next_page and articles < query.limit: - url = f"{base_url}/news?{query_str}&page_size=99&api_key={api_key}&next_page={next_page}" + url = f"{base_url}/news?{query_str}&page_size={query.limit}&api_key={api_key}&next_page={next_page}" result = await get_data(url, session=session, **kwargs) _data = result.get("news", []) if _data: @@ -215,14 +228,16 @@ class IntrinioWorldNewsFetcher( return await amake_request(url, response_callback=callback, **kwargs) # type: ignore - # pylint: disable=unused-argument @staticmethod def transform_data( query: IntrinioWorldNewsQueryParams, data: List[Dict], **kwargs: Any ) -> List[IntrinioWorldNewsData]: """Return the transformed data.""" if not data: - raise EmptyDataError("Error: The request was returned as empty.") + raise EmptyDataError( + "Error: The request was returned as empty." + + " Try adjusting the requested date ranges, if applicable." + ) results: List[IntrinioWorldNewsData] = [] for item in data: body = item.get("body", {}) diff --git a/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_company_news_fetcher.yaml b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_company_news_fetcher.yaml index b015caf0aa3..dc8d86e0dea 100644 --- a/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_company_news_fetcher.yaml +++ b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_company_news_fetcher.yaml @@ -9,95 +9,161 @@ interactions: Connection: - keep-alive method: GET - uri: https://api-v2.intrinio.com/companies/AAPL/news?api_key=MOCK_API_KEY&end_date=2024-01-03&page_size=99&specific_source=yahoo&start_date=2024-01-02 + uri: https://api-v2.intrinio.com/companies/AAPL/news?api_key=MOCK_API_KEY&end_date=2024-01-03&page_size=50&specific_source=yahoo&start_date=2024-01-02 response: body: string: !!binary | - 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 - 3satk/GXX+79+n8AAAD//wMAuLil3Ak9AAA= + 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 + TB1nMifcR+li00OsqsTqR+eNXXQ |