From 3d2e33e955f38043a4075fef5fb02a2e314baf92 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Wed, 5 Mar 2025 06:52:22 -0800 Subject: [PATCH] [BugFix] `openbb-platform-api` - Fix `$.` References Being Deleted Outside Of Loop (#7046) * fix $. references being deleted outside of loop * non-provider query params x-widget_config * don't send empty provider dict * lint * update readme --------- Co-authored-by: Theodore Aptekarev --- .../extensions/platform_api/README.md | 2 ++ .../openbb_platform_api/utils/api.py | 4 +++- .../openbb_platform_api/utils/openapi.py | 16 ++++++++++------ .../openbb_platform_api/utils/widgets.py | 9 +++++---- .../extensions/platform_api/pyproject.toml | 2 +- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/openbb_platform/extensions/platform_api/README.md b/openbb_platform/extensions/platform_api/README.md index 52da2347f1e..2a3f8f8a08d 100644 --- a/openbb_platform/extensions/platform_api/README.md +++ b/openbb_platform/extensions/platform_api/README.md @@ -167,6 +167,8 @@ async def hello_metric() -> MetricResponseModel: return MetricResponseModel(label="Good Vibes Score", value=100, delta="1%") ``` +This type of widget can be created as an array of MetricResponseModels. Adjust the response to be a `list[MetricRespnoseModel]` + ### Query Parameters Function arguments will populate as widget parameters. diff --git a/openbb_platform/extensions/platform_api/openbb_platform_api/utils/api.py b/openbb_platform/extensions/platform_api/openbb_platform_api/utils/api.py index 06b143e86b6..777d90c4cfc 100644 --- a/openbb_platform/extensions/platform_api/openbb_platform_api/utils/api.py +++ b/openbb_platform/extensions/platform_api/openbb_platform_api/utils/api.py @@ -291,12 +291,14 @@ def import_app(app_path: str, name: str = "app", factory: bool = False): if not Path(app_path).exists(): raise FileNotFoundError(f"Error: The app file '{app_path}' does not exist") - spec = util.spec_from_file_location("app", app_path) + spec_name = os.path.basename(app_path).split(".")[0] + spec = util.spec_from_file_location(spec_name, app_path) if spec is None: raise RuntimeError(f"Failed to load the file specs for '{app_path}'") module = util.module_from_spec(spec) # type: ignore + sys.modules[spec_name] = module # type: ignore spec.loader.exec_module(module) # type: ignore if not hasattr(module, name): diff --git a/openbb_platform/extensions/platform_api/openbb_platform_api/utils/openapi.py b/openbb_platform/extensions/platform_api/openbb_platform_api/utils/openapi.py index 2369e13af7f..81b7b571af2 100644 --- a/openbb_platform/extensions/platform_api/openbb_platform_api/utils/openapi.py +++ b/openbb_platform/extensions/platform_api/openbb_platform_api/utils/openapi.py @@ -159,7 +159,8 @@ def set_parameter_options(p: dict, p_schema: dict, providers: list[str]) -> dict available_providers.add(provider) if provider in p_schema: provider_choices = p_schema[provider].get("choices", []) - widget_configs[provider] = p_schema[provider].get("x-widget_config", {}) + if widget_def := p_schema[provider].get("x-widget_config"): + widget_configs[provider] = widget_def elif len(providers) == 1 and "enum" in p_schema: provider_choices = p_schema["enum"] p_schema.pop("enum") @@ -308,13 +309,14 @@ def process_parameter(param: dict, providers: list[str]) -> dict: .strip() ) + if widget_config := param["schema"].get("x-widget_config", {}): + p["x-widget_config"] = widget_config + return p p_schema = param.get("schema", {}) p["value"] = p_schema.get("default", None) - p = set_parameter_options(p, p_schema, providers) - p = set_parameter_type(p, p_schema) if title := p_schema.get("title", ""): @@ -356,7 +358,8 @@ def get_query_schema_for_widget( params = command.get("parameters", []) route_params: list[dict] = [] providers: list[str] = extract_providers(params) - + if not providers: + providers = ["custom"] for param in params: if param["name"] in ["sort", "order"]: continue @@ -365,7 +368,8 @@ def get_query_schema_for_widget( continue p = process_parameter(param, providers) - p["show"] = True + if "show" not in p: + p["show"] = True route_params.append(p) return route_params, has_chart @@ -511,7 +515,7 @@ def data_schema_to_columns_defs( # noqa: PLR0912 # pylint: disable=too-many-br prop = target_schema.get("properties", {}).get(key) # Handle prop types for both when there's a single prop type or multiple if "items" in prop: - items = prop.pop("items", {}) + items = prop.get("items", {}) items = items.get("anyOf", items) prop["anyOf"] = items if isinstance(items, list) else [items] types = [ diff --git a/openbb_platform/extensions/platform_api/openbb_platform_api/utils/widgets.py b/openbb_platform/extensions/platform_api/openbb_platform_api/utils/widgets.py index 8dfe508f2d4..9218900c7d1 100644 --- a/openbb_platform/extensions/platform_api/openbb_platform_api/utils/widgets.py +++ b/openbb_platform/extensions/platform_api/openbb_platform_api/utils/widgets.py @@ -159,9 +159,11 @@ def modify_query_schema(query_schema: list[dict], provider_value: str): if "x-widget_config" in _item: provider_value_widget_config = _item.pop("x-widget_config") + _item.update(provider_value_widget_config) - if provider_value in provider_value_widget_config and bool( - provider_value_widget_config[provider_value] + if ( + provider_value_widget_config + and provider_value in provider_value_widget_config ): if provider_value_widget_config[provider_value].get("exclude"): @@ -380,11 +382,10 @@ def build_json( # noqa: PLR0912 # pylint: disable=too-many-branches for key, value in data_config.copy().items(): if key.startswith("$."): var_key[key] = value - _ = data_config.pop(key) widget_config["data"] = deep_merge_configs( widget_config["data"], - data_config, + {k: v for k, v in data_config.items() if not k.startswith("$.")}, ) if var_key: diff --git a/openbb_platform/extensions/platform_api/pyproject.toml b/openbb_platform/extensions/platform_api/pyproject.toml index 5ad706d9177..137c21f0699 100644 --- a/openbb_platform/extensions/platform_api/pyproject.toml +++ b/openbb_platform/extensions/platform_api/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-platform-api" -version = "1.1.3" +version = "1.1.4" description = "OpenBB Platform API: Launch script and widgets builder for the OpenBB Platform API and Workspace Backend Connector." authors = ["OpenBB "] license = "AGPL-3.0-only"