exceptions and typing

This commit is contained in:
Diogo Sousa
2023-07-27 18:24:30 +01:00
parent 6e212d45f9
commit 7e09edac84
3 changed files with 38 additions and 12 deletions

View File

@@ -10,7 +10,7 @@ DataType = TypeVar("DataType", bound=Data)
ProviderQueryParamsType = TypeVar("ProviderQueryParamsType", bound=QueryParams)
ProviderDataType = TypeVar("ProviderDataType", bound=Data)
ReturnType = Union[List[ProviderDataType], ProviderDataType]
UDataType = Union[List[DataType], DataType]
GenericDataType = Union[DataType, List[DataType], Dict[str, DataType]]
class Fetcher(
@@ -36,7 +36,7 @@ class Fetcher(
raise NotImplementedError
@staticmethod
def transform_data(data: ReturnType) -> UDataType:
def transform_data(data: ReturnType) -> GenericDataType:
"""Transform the provider-specific data to the standard data."""
raise NotImplementedError
@@ -45,7 +45,7 @@ class Fetcher(
cls,
params: Dict[str, Any],
credentials: Optional[Dict[str, str]] = None,
) -> UDataType:
) -> GenericDataType:
"""Fetch data from a provider by using the OpenBB standard."""
provider_query = cls.transform_query(params=params)
provider_data = cls.extract_data(query=provider_query, credentials=credentials)

View File

@@ -1,4 +1,6 @@
from typing import Any, Dict, Optional
from openbb_provider.abstract.data import Data
from openbb_provider.abstract.fetcher import GenericDataType, UDataType
from openbb_provider.abstract.provider import Provider
from openbb_provider.registry import Registry, RegistryLoader
@@ -9,26 +11,34 @@ class ProviderError(Exception):
class QueryExecutor:
"""Class to execute queries from providers"""
"""Class to execute queries from providers."""
def __init__(self, registry: Optional[Registry] = None) -> None:
self.registry = registry or RegistryLoader.from_extensions()
def get_provider(self, provider_name: str):
"""Get a provider from the registry."""
# raise exception if provider not found
return self.registry.providers[provider_name.lower()]
name = provider_name.lower()
if name not in self.registry.providers:
raise ProviderError(
f"Provider '{name}' not found in the registry."
f"Available providers: {list(self.registry.providers.keys())}"
)
return self.registry.providers[name]
def get_fetcher(self, provider: Provider, model_name: str):
"""Get a fetcher from a provider"""
# raise exception if fetcher not found
"""Get a fetcher from a provider."""
fetcher_name = (provider.name + model_name + "fetcher").lower()
if fetcher_name not in provider.fetcher_dict:
raise ProviderError(
f"Fetcher not found for model '{model_name}' in provider '{provider.name}'."
)
return provider.fetcher_dict[fetcher_name]
def match_credentials(
self, provider: Provider, credentials: Optional[Dict[str, str]]
) -> Dict[str, str]:
"""Filter received credentials to match provider requirements"""
"""Filter received credentials to match provider requirements."""
if provider.required_credentials is None:
return {}
@@ -51,9 +61,25 @@ class QueryExecutor:
model_name: str,
params: Dict[str, Any],
credentials: Optional[Dict[str, str]] = None,
):
"""Execute query"""
) -> GenericDataType:
"""Execute query.
Parameters
----------
provider_name : str
Name of the provider.
model_name : str
Name of the model.
params : Dict[str, Any]
Query parameters.
credentials : Optional[Dict[str, str]], optional
Credentials for the provider, by default None
Returns
-------
GenericDataType
Query result.
"""
provider = self.get_provider(provider_name)
Fetcher_ = self.get_fetcher(provider, model_name)
matched_credentials = self.match_credentials(provider, credentials)

View File

@@ -5,7 +5,7 @@ from openbb_provider.registry import Registry, RegistryLoader
class RegistryMap:
"""Class to store information about providers in a register."""
"""Class to store information about providers in the registry."""
def __init__(self, registry: Optional[Registry] = None) -> None:
self._registry = registry or RegistryLoader.from_extensions()