remove ProviderName

This commit is contained in:
Diogo Sousa
2023-07-24 15:55:06 +01:00
parent cd19c59ead
commit cc2e2c9cbc
6 changed files with 23 additions and 70 deletions

View File

@@ -5,7 +5,7 @@
# IMPORT THIRD-PARTY
# IMPORT INTERNAL
from openbb_provider.abstract.provider import Provider, ProviderNameType
from openbb_provider.abstract.provider import Provider
from openbb_benzinga.global_news import BenzingaGlobalNewsFetcher
from openbb_benzinga.stock_news import BenzingaStockNewsFetcher
@@ -14,7 +14,7 @@ from openbb_benzinga.stock_news import BenzingaStockNewsFetcher
benzinga_provider = Provider(
name=ProviderNameType("benzinga"),
name="benzinga",
description="Provider for Benzinga.",
required_credentials=["api_key"],
fetcher_list=[BenzingaGlobalNewsFetcher, BenzingaStockNewsFetcher],

View File

@@ -5,7 +5,7 @@
# IMPORT THIRD-PARTY
# IMPORT INTERNAL
from openbb_provider.abstract.provider import Provider, ProviderNameType
from openbb_provider.abstract.provider import Provider
from .analyst_estimates import FMPAnalystEstimatesFetcher
from .available_indices import FMPAvailableIndicesFetcher
@@ -55,7 +55,7 @@ from .treasury_rates import FMPTreasuryRatesFetcher
# mypy: disable-error-code="list-item"
fmp_provider = Provider(
name=ProviderNameType("fmp"),
name="fmp",
description="Provider for FMP.",
required_credentials=["api_key"],
fetcher_list=[

View File

@@ -3,14 +3,14 @@
# IMPORT STANDARD
# IMPORT THIRD-PARTY
# IMPORT INTERNAL
from openbb_provider.abstract.provider import Provider, ProviderNameType
from openbb_provider.abstract.provider import Provider
from openbb_fred.cpi import FREDCPIFetcher
# mypy: disable-error-code="list-item"
fred_provider = Provider(
name=ProviderNameType("fred"),
name="fred",
description="Provider for FRED.",
required_credentials=["api_key"],
fetcher_list=[FREDCPIFetcher],

View File

@@ -3,7 +3,7 @@
# IMPORT STANDARD
# IMPORT INTERNAL
from openbb_provider.abstract.provider import Provider, ProviderNameType
from openbb_provider.abstract.provider import Provider
from openbb_polygon.balance_sheet import PolygonBalanceSheetFetcher
from openbb_polygon.cash_flow import PolygonCashFlowStatementFetcher
@@ -22,7 +22,7 @@ from openbb_polygon.stock_price import PolygonStockPriceFetcher
# mypy: disable-error-code="list-item"
polygon_provider = Provider(
name=ProviderNameType("polygon"),
name="polygon",
description="Provider for Polygon.",
required_credentials=["api_key"],
fetcher_list=[

View File

@@ -1,56 +1,8 @@
"""Abstract class for providers."""
from typing import Any, Dict, List, Optional
from typing import Any, Dict, List, Literal, Optional
import pkg_resources
def build_provider_name():
"""Build the provider name Literal from the entry points."""
extension_names = []
for entry_point in pkg_resources.iter_entry_points("openbb_provider_extension"):
extension_names.append(entry_point.name)
literal_values = ()
for extension_name in extension_names:
literal_values += (extension_name,)
provider_name = Literal[literal_values] # type: ignore
return provider_name
ProviderName = build_provider_name()
class ProviderNameType(type):
"""Metaclass for ProviderName."""
__args__ = ProviderName.__args__
__str__ = ProviderName.__str__
def __new__(mcs, value):
"""Override __new__ to check if value is a valid provider name."""
return value
def __init__(cls, value):
if value not in ProviderName.__args__:
raise ValueError(f"{value} is not a valid provider name.")
cls.value = value
def __getstate__(cls):
"""Override __getstate__ to return the value of the provider name."""
return cls.value
def __setstate__(cls, state):
"""Override __setstate__ to set the value of the provider name."""
cls.value = state
def __repr__(cls):
"""Override __repr__ to return the value of the provider name."""
return f"ProviderName({cls.value})"
from openbb_provider.abstract.fetcher import Fetcher
class Provider:
@@ -60,20 +12,20 @@ class Provider:
def __init__(
self,
name: ProviderNameType,
name: str,
description: str,
fetcher_list: List[Any],
fetcher_list: List[Fetcher],
required_credentials: Optional[List[str]],
) -> None:
"""Initialize the provider.
Parameters
----------
name : ProviderNameType
The name of the provider that will define the typing and usage of the provider.
name : str
The name of the provider.
description : str
The description of the provider.
fetcher_list : List[Any]
fetcher_list : List[Fetcher]
The list of fetchers that the provider supports.
required_credentials : Optional[List[str]]
The list of required credentials for the provider.

View File

@@ -7,7 +7,7 @@ import pkg_resources
from openbb_provider.abstract.data import QueryParams
from openbb_provider.abstract.fetcher import Fetcher
from openbb_provider.abstract.provider import Provider, ProviderNameType
from openbb_provider.abstract.provider import Provider
class ProviderError(Exception):
@@ -18,10 +18,10 @@ class ProviderRegistry:
"""A Provider Registry is the central executor for dynamically retrieving data."""
def __init__(self) -> None:
self.providers: Dict[ProviderNameType, Provider] = {}
self.credentials: Dict[ProviderNameType, Dict[str, None]] = {}
self.providers: Dict[str, Provider] = {}
self.credentials: Dict[str, Dict[str, None]] = {}
def get_provider(self, provider_name: ProviderNameType) -> Provider:
def get_provider(self, provider_name: str) -> Provider:
"""Get a provider from the registry."""
if not self.providers:
raise ValueError("No providers found, please confirm they are loaded.")
@@ -38,7 +38,7 @@ class ProviderRegistry:
def filter_credentials(
self,
provider_name: ProviderNameType,
provider_name: str,
credentials: Optional[Dict[str, str]] = None,
) -> Dict[str, str]:
required_credentials = self.credentials.get(provider_name)
@@ -68,13 +68,13 @@ class ProviderRegistry:
if fetcher is None:
raise ProviderError(
f"This query is not supported by the '{provider.name}' provider. "
f"Please try another provider: '{ProviderNameType.__args__}'"
f"Please try another provider: '{list(self.providers.keys())}'"
)
return fetcher
def fetch(
self,
provider_name: ProviderNameType,
provider_name: str,
query_params: QueryParams,
extra_params: Optional[Dict] = None,
credentials: Optional[Dict[str, str]] = None,
@@ -94,6 +94,7 @@ def load_extensions(entry_point_group: str = "openbb_provider_extension") -> Any
"""Load extensions from entry points and their API keys from settings."""
# TODO: Figure actual type for dict values Union[Provider, Dict[str, Dict[str, None]]]
# Can we try to load the extensions directly into the ProviderRegistry? Let's try it.
extensions_dict: Dict[str, Dict[str, Any]] = {}
extensions_dict["providers"] = {}