summaryrefslogtreecommitdiffstats
path: root/openbb_platform/core/openbb_core/provider/utils/helpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'openbb_platform/core/openbb_core/provider/utils/helpers.py')
-rw-r--r--openbb_platform/core/openbb_core/provider/utils/helpers.py56
1 files changed, 40 insertions, 16 deletions
diff --git a/openbb_platform/core/openbb_core/provider/utils/helpers.py b/openbb_platform/core/openbb_core/provider/utils/helpers.py
index 99064cd8396..36c5907ae7e 100644
--- a/openbb_platform/core/openbb_core/provider/utils/helpers.py
+++ b/openbb_platform/core/openbb_core/provider/utils/helpers.py
@@ -1,12 +1,22 @@
"""Provider helpers."""
import asyncio
+import os
import re
-from datetime import datetime
+from datetime import date, datetime, timedelta, timezone
from difflib import SequenceMatcher
from functools import partial
from inspect import iscoroutinefunction
-from typing import Awaitable, Callable, List, Literal, Optional, TypeVar, Union, cast
+from typing import (
+ Awaitable,
+ Callable,
+ List,
+ Literal,
+ Optional,
+ TypeVar,
+ Union,
+ cast,
+)
import requests
from anyio import start_blocking_portal
@@ -21,6 +31,7 @@ from openbb_core.provider.utils.client import (
T = TypeVar("T")
P = ParamSpec("P")
+D = TypeVar("D", bound="Data")
def check_item(item: str, allowed: List[str], threshold: float = 0.75) -> None:
@@ -177,13 +188,13 @@ async def amake_requests(
is_exception = isinstance(result, Exception)
if is_exception and kwargs.get("raise_for_status", False):
- raise result
+ raise result # type: ignore[misc]
if is_exception or not result:
continue
- results.extend( # type: ignore
- result if isinstance(result, list) else [result]
+ results.extend(
+ result if isinstance(result, list) else [result] # type: ignore[list-item]
)
return results
@@ -283,17 +294,30 @@ def run_async(
def filter_by_dates(
- data: List[Data],
- start_date: datetime,
- end_date: datetime,
-) -> List[Data]:
+ data: List[D], start_date: Optional[date] = None, end_date: Optional[date] = None
+) -> List[D]:
"""Filter data by dates."""
- if not any([start_date, end_date]):
+ if start_date is None and end_date is None:
return data
- return list(
- filter(
- lambda d: start_date <= d.date.date() <= end_date,
- data,
- )
- )
+ def _filter(d: Data) -> bool:
+ _date = getattr(d, "date", None)
+ dt = _date.date() if _date and isinstance(_date, datetime) else _date
+ if dt:
+ if start_date and end_date:
+ return start_date <= dt <= end_date
+ if start_date:
+ return dt >= start_date
+ if end_date:
+ return dt <= end_date
+ return True
+ return False
+
+ return list(filter(_filter, data))
+
+
+def safe_fromtimestamp(timestamp: float, tz: Optional[timezone] = None) -> datetime:
+ """datetime.fromtimestamp alternative which supports negative timestamps on Windows platform."""
+ if os.name == "nt" and timestamp < 0:
+ return datetime(1970, 1, 1, tzinfo=tz) + timedelta(seconds=timestamp)
+ return datetime.fromtimestamp(timestamp, tz)