mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-04 16:32:10 +00:00
exceptions and typing
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user