expose available providers in provider interface

This commit is contained in:
Diogo Sousa
2023-08-24 17:07:34 +01:00
parent f73bcc8ac9
commit 0850423afb
4 changed files with 35 additions and 32 deletions

View File

@@ -18,6 +18,7 @@ from openbb_core.app.model.command_context import CommandContext
from openbb_core.app.model.obbject import OBBject
from openbb_core.app.model.system_settings import SystemSettings
from openbb_core.app.model.user_settings import UserSettings
from openbb_core.app.provider_interface import get_provider_interface
from openbb_core.app.router import CommandMap
from openbb_core.app.service.system_service import SystemService
from openbb_core.app.service.user_service import UserService
@@ -112,17 +113,24 @@ class ParametersBuilder:
provider_choices = kwargs.get("provider_choices", None)
if provider_choices and isinstance(provider_choices, dict):
provider = provider_choices.get("provider", None)
if provider is None and route in command_map.command_coverage:
route_defaults = user_settings.defaults.routes.get(route, None)
random_choice = command_map.command_coverage[route][0]
provider = (
random_choice
if route_defaults is None
or route_defaults.get("provider", None) is None
else route_defaults.get("provider", random_choice)
)
kwargs["provider_choices"] = {"provider": provider}
return kwargs
if provider is None:
if route in command_map.command_coverage:
route_defaults = user_settings.defaults.routes.get(route, None)
random_choice = command_map.command_coverage[route][0]
provider = (
random_choice
if route_defaults is None
or route_defaults.get("provider", None) is None
else route_defaults.get("provider", random_choice)
)
kwargs["provider_choices"] = {"provider": provider}
else:
available_providers = get_provider_interface().available_providers
kwargs["provider_choices"] = {
"provider": available_providers[0]
if available_providers
else None
}
return kwargs
@classmethod

View File

@@ -1,4 +1,4 @@
from typing import Dict, Generic, List, Optional, TypeVar, Union
from typing import Dict, Generic, List, Literal, Optional, TypeVar, Union
import pandas as pd
from pydantic import Field
@@ -14,7 +14,7 @@ from openbb_core.app.provider_interface import get_provider_interface
from openbb_core.app.utils import basemodel_to_df
T = TypeVar("T")
PROVIDERS = get_provider_interface().providers_literal
PROVIDERS = Literal[tuple(get_provider_interface().available_providers)] # type: ignore
class OBBject(GenericModel, Generic[T], Tagged):

View File

@@ -60,8 +60,8 @@ class ProviderInterface:
Dictionary of params by model.
return_schema : Dict[str, Type[BaseModel]]
Dictionary of return data schema by model.
providers_literal : type
Literal of provider names.
providers_literal : List[str]
List of available providers.
provider_choices : ProviderChoices
Dataclass with literal of provider names.
models : List[str]
@@ -89,10 +89,8 @@ class ProviderInterface:
self._data = self._generate_data_dc(self._map)
self._return_schema = self._generate_return_schema(self._data)
self._providers_literal = self._get_provider_literal(
self._registry_map.available_providers
)
self._provider_choices = self._get_provider_choices(self._providers_literal)
self._available_providers = self._registry_map.available_providers
self._provider_choices = self._get_provider_choices(self._available_providers)
@property
def map(self) -> MapType:
@@ -125,9 +123,9 @@ class ProviderInterface:
return self._return_schema
@property
def providers_literal(self) -> type:
"""Literal of provider names."""
return self._providers_literal
def available_providers(self) -> List[str]:
"""List of available providers."""
return self._available_providers
@property
def provider_choices(self) -> type:
@@ -455,13 +453,10 @@ class ProviderInterface:
return result
def _get_provider_literal(self, available_providers: List[str]) -> type:
return Literal[tuple(available_providers)] # type: ignore
def _get_provider_choices(self, providers_literal: type) -> type:
def _get_provider_choices(self, available_providers: List[str]) -> type:
return make_dataclass(
cls_name="ProviderChoices",
fields=[("provider", providers_literal)],
fields=[("provider", Literal[tuple(available_providers)])], # type: ignore
bases=(ProviderChoices,),
)

View File

@@ -63,12 +63,12 @@ def test_data(provider_interface):
assert "StockEOD" in data
def test_providers_literal(provider_interface):
def test_available_providers(provider_interface):
"""Test providers literal."""
providers_literal = provider_interface.providers_literal
assert isinstance(type(providers_literal), type)
assert len(providers_literal.__args__) > 0
assert "openbb" not in providers_literal.__args__
available_providers = provider_interface.available_providers
assert isinstance(available_providers, list)
assert len(available_providers) > 0
assert "openbb" not in available_providers
def test_provider_choices(provider_interface):