From f8c26ff1c6b950271f92efe600e4ca83e8f516e2 Mon Sep 17 00:00:00 2001 From: montezdesousa Date: Sun, 13 Aug 2023 15:23:47 +0100 Subject: [PATCH 1/2] rename type var --- .../openbb_core/app/provider_interface.py | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py b/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py index 0a00c566373..c7211369450 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py +++ b/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, make_dataclass -from typing import Any, Dict, List, Literal, Optional, Tuple, Type, Union +from typing import Any, Dict, List, Literal, Optional, Tuple, Type, TypeVar, Union from fastapi import Query from openbb_provider.query_executor import QueryExecutor @@ -7,13 +7,15 @@ from openbb_provider.registry_map import MapType, RegistryMap from pydantic import BaseConfig, BaseModel, Extra, Field, create_model from pydantic.fields import ModelField +TupleFieldType = TypeVar("TupleFieldType", bound=Tuple[str, type, Any]) + @dataclass class DataclassField: """Dataclass field.""" name: str - type_: Any + type_: type default: Any @@ -164,7 +166,7 @@ class ProviderInterface: return DataclassField( name=current_name, - type_=merged_type, + type_=merged_type, # type: ignore default=merged_default, ) @@ -208,10 +210,10 @@ class ProviderInterface: def _extract_params( cls, providers: Any, - ) -> Tuple[Dict[str, Tuple[str, type, Any]], Dict[str, Tuple[str, type, Any]]]: + ) -> Tuple[Dict[str, TupleFieldType], Dict[str, TupleFieldType]]: """Extract parameters from map.""" - standard: Dict[str, Tuple[str, Any, Any]] = {} - extra: Dict[str, Tuple[str, Any, Any]] = {} + standard: Dict[str, TupleFieldType] = {} + extra: Dict[str, TupleFieldType] = {} for provider_name, model_details in providers.items(): if provider_name == "openbb": @@ -255,9 +257,9 @@ class ProviderInterface: def _extract_data( cls, providers: Any, - ) -> Tuple[Dict[str, Tuple[str, type, Any]], Dict[str, Tuple[str, type, Any]]]: - standard: Dict[str, Tuple[str, Any, Any]] = {} - extra: Dict[str, Tuple[str, Any, Any]] = {} + ) -> Tuple[Dict[str, TupleFieldType], Dict[str, TupleFieldType]]: + standard: Dict[str, TupleFieldType] = {} + extra: Dict[str, TupleFieldType] = {} for provider_name, model_details in providers.items(): if provider_name == "openbb": @@ -314,8 +316,9 @@ class ProviderInterface: """ result: Dict = {} - # TODO: Consider multiprocessing this loop to speed startup for model_name, providers in map_.items(): + standard: dict + extra: dict standard, extra = self._extract_params(providers) result[model_name] = { @@ -380,6 +383,8 @@ class ProviderInterface: result: Dict = {} for model_name, providers in map_.items(): + standard: dict + extra: dict standard, extra = self._extract_data(providers) result[model_name] = { "standard": make_dataclass( # type: ignore From 0a9aa8ceb4db1238a7660bbebc99e5095f100934 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Sun, 13 Aug 2023 22:55:43 +0200 Subject: [PATCH 2/2] Add DocstringGenerator unit tests --- .../core/openbb_core/app/command_runner.py | 2 +- .../openbb_core/app/static/package/crypto.py | 2 +- .../openbb_core/app/static/package/economy.py | 2 +- .../app/static/package/fixedincome.py | 2 +- .../openbb_core/app/static/package/forex.py | 2 +- .../openbb_core/app/static/package/news.py | 2 +- .../openbb_core/app/static/package/stocks.py | 2 +- .../app/static/package/stocks_ca.py | 2 +- .../app/static/package/stocks_dd.py | 2 +- .../app/static/package/stocks_fa.py | 2 +- .../openbb_core/app/static/package_builder.py | 4 +- .../tests/app/static/test_package_builder.py | 84 ++++++++++++++++++- 12 files changed, 95 insertions(+), 13 deletions(-) diff --git a/openbb_sdk/sdk/core/openbb_core/app/command_runner.py b/openbb_sdk/sdk/core/openbb_core/app/command_runner.py index 06adbc73cd0..8f9ae9b595f 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/command_runner.py +++ b/openbb_sdk/sdk/core/openbb_core/app/command_runner.py @@ -15,10 +15,10 @@ from openbb_core.app.logs.logging_manager import LoggingManager from openbb_core.app.model.abstract.warning import cast_warning from openbb_core.app.model.charts.chart import Chart from openbb_core.app.model.command_context import CommandContext -from openbb_core.app.model.obbject import Obbject, Error from openbb_core.app.model.journal import Journal from openbb_core.app.model.journal_entry import JournalEntry from openbb_core.app.model.journal_query import JournalQuery +from openbb_core.app.model.obbject import Error, Obbject from openbb_core.app.model.system_settings import SystemSettings from openbb_core.app.model.user_settings import UserSettings from openbb_core.app.router import CommandMap diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/crypto.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/crypto.py index 0d8054bbb89..3ca625a6272 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/crypto.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/crypto.py @@ -6,8 +6,8 @@ from typing import Annotated, Literal, Optional, Union from pydantic import validate_arguments -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py index 101376987ff..2bdb9b0678a 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py @@ -8,8 +8,8 @@ from pydantic import validate_arguments import openbb_core.app.model.command_context import openbb_core.app.model.results.empty -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py index d92b3902284..be4e1656a0a 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py @@ -8,8 +8,8 @@ from pydantic import validate_arguments import openbb_core.app.model.command_context import openbb_core.app.model.results.empty -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/forex.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/forex.py index c72985fde9c..2aaf8e6f81b 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/forex.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/forex.py @@ -6,8 +6,8 @@ from typing import Annotated, Literal, Optional, Union from pydantic import validate_arguments -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/news.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/news.py index e2b47d10cd9..2e01558c016 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/news.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/news.py @@ -8,8 +8,8 @@ from pydantic import validate_arguments import openbb_core.app.model.command_context import openbb_core.app.model.results.empty -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks.py index fc93db5e5a3..89727ced9a5 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks.py @@ -9,8 +9,8 @@ from pydantic import validate_arguments import openbb_core.app.model.command_context import openbb_core.app.model.results.empty -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_ca.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_ca.py index 76dd20d17f1..1477bf63a92 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_ca.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_ca.py @@ -7,8 +7,8 @@ from pydantic import validate_arguments import openbb_core.app.model.command_context import openbb_core.app.model.results.empty -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_dd.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_dd.py index 391cb0a347e..c06f397b0bc 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_dd.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_dd.py @@ -5,8 +5,8 @@ from typing import Annotated, Literal, Optional from pydantic import validate_arguments -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py index 6bb66b79b82..a4edbd658fd 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py @@ -9,8 +9,8 @@ from pydantic import validate_arguments import openbb_core.app.model.command_context import openbb_core.app.model.results.empty -from openbb_core.app.model.obbject import Obbject from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.obbject import Obbject from openbb_core.app.static.container import Container from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py index d4baa02c884..053fcbb8d6a 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py @@ -242,7 +242,7 @@ class DocstringGenerator: """Dynamically generate docstrings for the commands.""" @staticmethod - def get_obbject_description() -> str: + def get_object_description() -> str: """Get the command output description.""" obbject_description = ( "\nReturns\n" @@ -326,7 +326,7 @@ class DocstringGenerator: section_docstring += f"{padding}{field_description}\n" if provider == "openbb" and section_name == "QueryParams": - section_docstring += cls.get_obbject_description() + section_docstring += cls.get_object_description() return section_docstring diff --git a/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py b/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py index 659061194a2..823e8225b98 100644 --- a/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py @@ -5,8 +5,10 @@ from dataclasses import dataclass from inspect import _empty import pytest +from openbb_core.app.provider_interface import get_provider_interface from openbb_core.app.static.package_builder import ( ClassDefinition, + DocstringGenerator, ImportDefinition, Linters, MethodDefinition, @@ -446,4 +448,84 @@ def test_mypy(linters): linters.mypy() -# TODO: Implement unit test for the DocstringGenerator class once refactored. +@pytest.fixture(scope="module") +def docstring_generator(): + """Return package builder.""" + return DocstringGenerator() + + +def test_docstring_generator_init(docstring_generator): + """Test docstring generator init.""" + assert docstring_generator + + +def test_get_object_description(docstring_generator): + """Test build docstring.""" + docstring = docstring_generator.get_object_description() + assert docstring + + +def test_get_available_providers(docstring_generator): + """Test get available providers.""" + provider_assert = ["fmp", "polygon"] + some_mapping = {"fmp": 1, "openbb": 2, "polygon": 3} + providers = docstring_generator.get_available_providers(query_mapping=some_mapping) + assert providers + for provider in provider_assert: + assert provider in providers + + +def test_reorder_dictionary(docstring_generator): + """Test reorder dictionary.""" + some_mapping = {"fmp": 1, "openbb": 2, "polygon": 3} + reordered = docstring_generator.reorder_dictionary( + dictionary=some_mapping, key_to_move_first="openbb" + ) + assert reordered + assert list(reordered.keys())[0] == "openbb" + + +def test_extract_field_details(docstring_generator): + """Test extract field details.""" + mapping = get_provider_interface().map + section_docstring = docstring_generator.extract_field_details( + model_name="GlobalNews", + provider="openbb", + section_name="QueryParams", + section_docstring="some_param: str\n Some param description\n", + mapping=mapping, + ) + assert section_docstring + assert "some_param" in section_docstring + + +def test_generate_provider_docstrings(docstring_generator): + """Test generate provider docstrings.""" + docstring = "" + model_name = "GlobalNews" + provider_interface_mapping = get_provider_interface().map + query_mapping = provider_interface_mapping.get(model_name, None) + docstring = docstring_generator.generate_provider_docstrings( + docstring=docstring, + query_mapping=query_mapping, + model_name=model_name, + provider_interface_mapping=provider_interface_mapping, + ) + + assert docstring + assert "openbb" in docstring + assert "GlobalNews" in docstring + + +def test_generate_command_docstring(docstring_generator): + """Test generate command docstring.""" + + def some_func(): + """Some func docstring.""" + pass + + docstring = docstring_generator.generate_command_docstring( + func=some_func, model_name="GlobalNews" + ) + assert docstring + assert "openbb" in docstring.__doc__