summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-05-17 05:49:32 -0700
committerGitHub <noreply@github.com>2024-05-17 12:49:32 +0000
commit3df4e058c5c9c27d5608d724203e68e38100504b (patch)
tree4b04dbfebdfc66b36a9a8308e89f042d1ce2ea6b
parente124457829876d2e0a4894c5f28bab2a4897529e (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>
-rw-r--r--openbb_platform/openbb/assets/reference.json8
-rw-r--r--openbb_platform/openbb/package/news.py8
-rw-r--r--openbb_platform/providers/intrinio/openbb_intrinio/models/company_news.py40
-rw-r--r--openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py35
-rw-r--r--openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_company_news_fetcher.yaml398
-rw-r--r--openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_world_news_fetcher.yaml554
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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
+ dVwFgh+qWOihlN9EGRZYJ3IcGT4Hj7U