diff --git a/openbb_sdk/sdk/provider/openbb_provider/abstract/fetcher.py b/openbb_sdk/sdk/provider/openbb_provider/abstract/fetcher.py index 7081049c5e0..1ce2740d41e 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/abstract/fetcher.py +++ b/openbb_sdk/sdk/provider/openbb_provider/abstract/fetcher.py @@ -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) diff --git a/openbb_sdk/sdk/provider/openbb_provider/query_executor.py b/openbb_sdk/sdk/provider/openbb_provider/query_executor.py index d2739df0b11..77508669c79 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/query_executor.py +++ b/openbb_sdk/sdk/provider/openbb_provider/query_executor.py @@ -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) diff --git a/openbb_sdk/sdk/provider/openbb_provider/registry_map.py b/openbb_sdk/sdk/provider/openbb_provider/registry_map.py index d70f143cb78..61ad5e4fa83 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/registry_map.py +++ b/openbb_sdk/sdk/provider/openbb_provider/registry_map.py @@ -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()