fill return type in the provider lib for docstrings

This commit is contained in:
Diogo Sousa
2023-07-31 13:15:23 +01:00
parent 90a1527c1f
commit 9f54b8c7db
7 changed files with 47 additions and 34 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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_