diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py b/openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py index 0dc684ea704..221b31d61b1 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py @@ -2,7 +2,7 @@ from datetime import datetime -from typing import Any, Dict, List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional, TypeVar from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import get_querystring @@ -104,6 +104,9 @@ class BenzingaGlobalNewsFetcher( BenzingaGlobalNewsData, ] ): + T = TypeVar("T") + generic_return_type = List[T] + @staticmethod def transform_query(params: Dict[str, Any]) -> BenzingaGlobalNewsQueryParams: return BenzingaGlobalNewsQueryParams(**params) diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py b/openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py index 459ca57c237..1e8b1bc95e9 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py @@ -2,7 +2,7 @@ from datetime import datetime -from typing import Any, Dict, List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional, TypeVar from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import get_querystring @@ -100,6 +100,9 @@ class BenzingaStockNewsFetcher( BenzingaStockNewsData, ] ): + T = TypeVar("T") + generic_return_type = List[T] + @staticmethod def transform_query(params: Dict[str, Any]) -> BenzingaStockNewsQueryParams: return BenzingaStockNewsQueryParams(**params) diff --git a/openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py index 56b762e6c79..7a8d14249d6 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py @@ -2,7 +2,7 @@ from datetime import datetime -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, TypeVar from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher @@ -40,6 +40,9 @@ class FMPStockNewsFetcher( FMPStockNewsData, ] ): + T = TypeVar("T") + generic_return_type = List[T] + @staticmethod def transform_query(params: Dict[str, Any]) -> FMPStockNewsQueryParams: return FMPStockNewsQueryParams(**params) diff --git a/openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py index 013d203ec0a..deecefdfe15 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py @@ -2,7 +2,7 @@ from datetime import datetime -from typing import Any, Dict, List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional, TypeVar from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher @@ -89,6 +89,9 @@ class PolygonStockNewsFetcher( PolygonStockNewsData, ] ): + T = TypeVar("T") + generic_return_type = Dict[str, List[T]] + @staticmethod def transform_query(params: Dict[str, Any]) -> PolygonStockNewsQueryParams: return PolygonStockNewsQueryParams(**params) diff --git a/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py b/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py index c0a0fee755a..5fd17ecba0f 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py +++ b/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py @@ -2,7 +2,6 @@ from dataclasses import dataclass, make_dataclass from typing import Any, Dict, List, Literal, Optional, Tuple, Type, Union from fastapi import Query -from openbb_provider.abstract.fetcher import GenericDataType from openbb_provider.query_executor import QueryExecutor from openbb_provider.registry_map import MapType, RegistryMap from pydantic import BaseConfig, BaseModel, Extra, Field, create_model @@ -85,10 +84,7 @@ class ProviderInterface: self._model_providers_map = self._generate_model_providers_dc(self._map) self._params = self._generate_params_dc(self._map) self._data = self._generate_data_dc(self._map) - self._merged_return_type = self._merge_return_type(self._map) - self._merged_return_model = self._merge_return_model( - self._merged_return_type, self._data - ) + self._merged_return_model = self._merge_return_model(self._map, self._data) self._providers_literal = self._get_provider_literal( self._registry_map.available_providers @@ -120,11 +116,6 @@ class ProviderInterface: """Dictionary of data by model.""" return self._data - @property - def merged_return_type(self) -> Dict[str, type]: - """Dictionary of data by model merged.""" - return self._merged_return_type - @property def merged_return_model(self) -> Dict[str, Type[BaseModel]]: """Dictionary of data by model merged.""" @@ -405,24 +396,9 @@ class ProviderInterface: return result - def _merge_return_type(self, map_: MapType) -> Dict[str, type]: - """Merge return generic types.""" - returns: Dict[str, Any] = {} - for model_name, providers in map_.items(): - types_list = [] - for info in providers.values(): - ret = info["ReturnType"] - if ret: - types_list.append(ret) - - if types_list: - returns[model_name] = Union[tuple(types_list)] # type: ignore - - return returns - def _merge_return_model( self, - merged_return_type: Dict[str, type], + map_: MapType, data: Dict[str, Dict[str, Union[StandardData, ExtraData]]], ) -> Dict[str, Type[BaseModel]]: """Merge standard data with extra data into a single BaseModel to be injected as FastAPI dependency.""" @@ -454,9 +430,12 @@ class ProviderInterface: **fields_dict, # type: ignore ) - ReturnType = merged_return_type.get(model_name, GenericDataType) + ReturnType = map_[model_name]["openbb"]["ReturnType"] n_params = len(getattr(ReturnType, "__parameters__", ())) - result[model_name] = ReturnType[tuple([ReturnModel] * n_params)] # type: ignore + if n_params: + result[model_name] = ReturnType[tuple([ReturnModel] * n_params)] # type: ignore + else: + result[model_name] = ReturnModel return result diff --git a/openbb_sdk/sdk/provider/openbb_provider/abstract/fetcher.py b/openbb_sdk/sdk/provider/openbb_provider/abstract/fetcher.py index 442c2860fda..7248cb65002 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/abstract/fetcher.py +++ b/openbb_sdk/sdk/provider/openbb_provider/abstract/fetcher.py @@ -1,7 +1,6 @@ """Abstract class for the fetcher.""" -from abc import abstractmethod from typing import Any, Dict, Generic, List, Optional, TypeVar, Union from openbb_provider.abstract.data import Data diff --git a/openbb_sdk/sdk/provider/openbb_provider/registry_map.py b/openbb_sdk/sdk/provider/openbb_provider/registry_map.py index b307d63290b..ec72307bee1 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/registry_map.py +++ b/openbb_sdk/sdk/provider/openbb_provider/registry_map.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional, TypeVar, Union from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.registry import Registry, RegistryLoader @@ -73,6 +73,8 @@ class RegistryMap: "ReturnType": return_type, } + map_ = self.fill_standard_return_type(map_) + return map_ def _get_models(self, map_: MapType) -> List[str]: @@ -103,3 +105,24 @@ class RegistryMap: def extract_return_type(fetcher: Fetcher): """Extract return info from fetcher.""" return getattr(fetcher, "generic_return_type", None) + + @staticmethod + def fill_standard_return_type(map_: MapType) -> MapType: + """Fill standard return type.""" + + T = TypeVar("T") + GenericDataType = Union[T, List[T], Dict[str, T]] + + for model_name, providers in map_.items(): + types_list = [] + for info in providers.values(): + ret = info["ReturnType"] + if ret: + types_list.append(ret) + + if types_list: + map_[model_name]["openbb"]["ReturnType"] = Union[tuple(types_list)] # type: ignore + else: + map_[model_name]["openbb"]["ReturnType"] = GenericDataType + + return map_