diff --git a/openbb_platform/core/openbb/assets/reference.json b/openbb_platform/core/openbb/assets/reference.json index 8ddecc505d9..5e192f33812 100644 --- a/openbb_platform/core/openbb/assets/reference.json +++ b/openbb_platform/core/openbb/assets/reference.json @@ -1,9 +1,9 @@ { - "openbb": "1.5.3core", + "openbb": "1.5.5core", "info": { "title": "OpenBB Platform (Python)", "description": "Investment research for everyone, anywhere.", - "core": "1.5.3", + "core": "1.5.5", "extensions": { "openbb_core_extension": [], "openbb_provider_extension": [], diff --git a/openbb_platform/core/openbb/package/__init__.py b/openbb_platform/core/openbb/package/__init__.py index 3d627c7ba62..6eec957f14b 100644 --- a/openbb_platform/core/openbb/package/__init__.py +++ b/openbb_platform/core/openbb/package/__init__.py @@ -1 +1,3 @@ +"""Autogenerated OpenBB module.""" + ### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ### diff --git a/openbb_platform/core/openbb_core/app/static/package_builder.py b/openbb_platform/core/openbb_core/app/static/package_builder.py index e3ce281bb63..0054efacfe3 100644 --- a/openbb_platform/core/openbb_core/app/static/package_builder.py +++ b/openbb_platform/core/openbb_core/app/static/package_builder.py @@ -253,7 +253,8 @@ class PackageBuilder: def _save_package(self): """Save the package.""" self.console.log("\nWriting package __init__...") - code = "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###" + code = '""" Autogenerated OpenBB module."""\n' + code += "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###" self._write(code=code, name="__init__") def _save_reference_file(self, ext_map: dict[str, list[str]] | None = None): @@ -358,7 +359,8 @@ class ModuleBuilder: @staticmethod def build(path: str, ext_map: dict[str, list[str]] | None = None) -> str: """Build the module.""" - code = "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###\n\n# pylint: disable=R0917\n\n" + code = f'"""Autogenerated OpenBB {path} Module."""\n\n' + code += "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###\n\n# pylint: disable=R0917,C0103\n\n" code += ImportDefinition.build(path) code += ClassDefinition.build(path, ext_map) @@ -376,7 +378,37 @@ class ImportDefinition: for hint_type in hint_type_list: # Skip primitive types and empty types - if hint_type == _empty or hint_type in primitive_types: + # Check for _empty first (doesn't require hashing) + if hint_type == _empty: + continue + + # Skip Depends objects (they're not types we need to import) + if ( + hasattr(hint_type, "__class__") + and "Depends" in hint_type.__class__.__name__ + ): + continue + + # Skip Annotated types that contain Depends in their metadata + if isinstance(hint_type, _AnnotatedAlias): + has_depends = False + if hasattr(hint_type, "__metadata__"): + for meta in hint_type.__metadata__: + if ( + hasattr(meta, "__class__") + and "Depends" in meta.__class__.__name__ + ): + has_depends = True + break + if has_depends: + continue + + # Now safe to check against primitive_types set + try: + if hint_type in primitive_types: + continue + except TypeError: + # If somehow we still get an unhashable type, skip it continue # Only include types that have a module and are not builtins @@ -385,8 +417,25 @@ class ImportDefinition: ) or (isinstance(hint_type, str)): new_hint_type_list.append(hint_type) - new_hint_type_list = list(set(new_hint_type_list)) - return new_hint_type_list + # Deduplicate without using set() to handle unhashable types + deduplicated: list = [] + for hint_type in new_hint_type_list: + is_duplicate = False + for existing in deduplicated: + try: + if hint_type == existing: + is_duplicate = True + break + except TypeError: + # If comparison fails, compare by identity + if id(hint_type) == id(existing): + is_duplicate = True + break + + if not is_duplicate: + deduplicated.append(hint_type) + + return deduplicated @classmethod def get_function_hint_type_list(cls, route) -> list[type]: @@ -1155,8 +1204,8 @@ class MethodDefinition: parts = textwrap.wrap(desc, width=max_width) # For function signature context, don't add extra indentation # The parameter will be properly indented by the calling context - joined = "\n".join(f"{repr(p)}" for p in parts) - desc_repr = f"(\n{joined}\n)" + joined = "\n ".join(f"{repr(p)}" for p in parts) + desc_repr = f"(\n {joined}" + "\n )" default_part = "" if param.default is not Parameter.empty: @@ -1165,10 +1214,17 @@ class MethodDefinition: default_repr = "None" default_part = f" = {default_repr}" - return f"{param.name}: Annotated[{type_repr}, OpenBBField(description={desc_repr})]{default_part}" + final_param = f"""{param.name.strip()}: Annotated[ + {type_repr}, + OpenBBField( + description={desc_repr} + ) + ]{default_part}""" + + return final_param params_list = [stringify_param(p) for p in formatted_params.values()] - func_params = ",\n".join(params_list) + func_params = ",\n ".join(params_list) func_params = func_params.replace("NoneType", "None") func_params = func_params.replace( @@ -1216,7 +1272,7 @@ class MethodDefinition: func_returns = MethodDefinition.build_func_returns(return_type) args = ( - "(config=dict(arbitrary_types_allowed=True))" + '(config={"arbitrary_types_allowed": True})' if "DataFrame" in func_params or "Series" in func_params or "ndarray" in func_params @@ -1592,7 +1648,9 @@ class DocstringGenerator: _type = ( f"Optional[{_type}]" - if is_optional and "Optional" not in str(_type) + if is_optional + and "Optional" not in str(_type) + and " | " not in str(_type) else _type ) @@ -1620,11 +1678,11 @@ class DocstringGenerator: f"{create_indent(indent + 2)}Serializable results.\n" f"{create_indent(indent + 1)}provider : {available_providers}\n" f"{create_indent(indent + 2)}Provider name.\n" - f"{create_indent(indent + 1)}warnings : Optional[List[Warning_]]\n" + f"{create_indent(indent + 1)}warnings : Optional[list[Warning_]]\n" f"{create_indent(indent + 2)}List of warnings.\n" f"{create_indent(indent + 1)}chart : Optional[Chart]\n" f"{create_indent(indent + 2)}Chart object.\n" - f"{create_indent(indent + 1)}extra : Dict[str, Any]\n" + f"{create_indent(indent + 1)}extra : dict[str, Any]\n" f"{create_indent(indent + 2)}Extra info.\n" ) @@ -1648,7 +1706,7 @@ class DocstringGenerator: prompt = "\n```python\n" indent = create_indent(0) - doc = f"\n{indent}Examples\n" + doc = f"{indent}Examples\n" doc += f"{indent}--------\n" doc += f"{indent}{prompt}from openbb import obb\n" @@ -1714,10 +1772,11 @@ class DocstringGenerator: # Use the base types instead of the complex Union[Literal[...]] if base_types: - if len(base_types) == 1: - type_str = next(iter(base_types)) - else: - type_str = f"Union[{', '.join(sorted(base_types))}]" + type_str = ( + next(iter(base_types)) + if len(base_types) == 1 + else f"{' | '.join(sorted(base_types))}" + ) # Apply the standard formatting type_str = ( @@ -1728,6 +1787,7 @@ class DocstringGenerator: .replace("NoneType", "None") .replace("datetime.date", "date") .replace("datetime.datetime", "datetime") + .replace("Union[date, None, str]", "date | str | None") ) if char_limit: @@ -1879,7 +1939,7 @@ class DocstringGenerator: ) type_ = format_type(type_) if "NoneType" in str(type_): - type_ = f"Optional[{type_}]".replace(", NoneType", "") + type_ = type_.replace(", NoneType", "") default = getattr(param, "default", "") description = getattr(default, "description", "") @@ -1972,7 +2032,7 @@ class DocstringGenerator: # Format choices with word wrapping for readability formatted_choices = [] line_length = 0 - line_limit = 100 # Max line length + line_limit = 80 # Max line length for i, choice in enumerate(choices): choice_str = f"'{choice}'" @@ -2029,7 +2089,7 @@ class DocstringGenerator: return docstring @classmethod - def generate( # pylint: disable=too-many-positional-arguments + def generate( # pylint: disable=too-many-positional-arguments # noqa: PLR0912 cls, path: str, func: Callable, @@ -2081,6 +2141,7 @@ class DocstringGenerator: results_type=results_type, sections=sections, ) + doc += "\n" if "examples" in sections: doc += cls.build_examples( @@ -2088,6 +2149,7 @@ class DocstringGenerator: param_types, examples, ) + doc += "\n" else: doc_parts = [] if doc: @@ -2103,7 +2165,7 @@ class DocstringGenerator: summary = "" # Format the summary with proper indentation detection and replacement - def fix_indentation(text: str, target_indent: int = 2) -> str: + def fix_indentation(text: str) -> str: """Fix indentation in docstring text by detecting current level and standardizing.""" lines = text.split("\n") fixed_lines = [] @@ -2111,7 +2173,6 @@ class DocstringGenerator: for line in lines: stripped = line.lstrip() if not stripped: # Empty line - fixed_lines.append("") continue # Count current indentation (spaces or tabs) @@ -2133,17 +2194,13 @@ class DocstringGenerator: elif current_indent > 0: # Detect if it's using spaces or tabs if "\t" in line[:current_indent]: - fixed_lines.append( - f"{create_indent(target_indent)}{stripped}" - ) + fixed_lines.append(f"{stripped}") else: # Space-based indentation - normalize to target - fixed_lines.append( - f"{create_indent(target_indent)}{stripped}" - ) + fixed_lines.append(f"{stripped}") # No indentation - add target indentation for non-empty lines elif stripped: - fixed_lines.append(f"{create_indent(target_indent)}{stripped}") + fixed_lines.append(f"{stripped}") else: fixed_lines.append("") @@ -2162,9 +2219,7 @@ class DocstringGenerator: and "Parameters" not in doc and [p for p_name, p in formatted_params.items() if p_name != "kwargs"] ): - param_section = ( - f"\n\n{create_indent(2)}Parameters\n{create_indent(2)}----------\n" - ) + param_section = "\n\nParameters\n----------\n" # Process each parameter for param_name, param in formatted_params.items(): @@ -2190,17 +2245,16 @@ class DocstringGenerator: ) # Add parameter to docstring - param_section += f"{create_indent(2)}{param_name} : {type_str}\n" - param_section += f"{create_indent(3)}{description}\n" + param_section += f"{create_indent(0)}{param_name} : {type_str}\n" + if description.strip() and description.strip() != '""': + param_section += f"{create_indent(1)}{description}\n" - result_doc += param_section + result_doc += param_section + "\n" # Add returns section if needed and not already in docstring if "returns" in sections and "Returns" not in doc: # Returns - returns_section = ( - f"\n\n{create_indent(2)}Returns\n{create_indent(2)}-------\n" - ) + returns_section = "Returns\n-------\n" # Extract return annotation directly from function signature sig = inspect.signature(func) @@ -2227,7 +2281,7 @@ class DocstringGenerator: ) # Add return type to docstring - returns_section += f"{create_indent(2)}{type_name}\n" + returns_section += f"{type_name}\n" # Check if this is a custom class (not a primitive type) primitive_types = { @@ -2255,25 +2309,32 @@ class DocstringGenerator: field_type = cls.get_field_type( field.annotation, field.is_required ) - # Get field description description = ( getattr(field, "description", "") or "" ) # Add field to docstring with proper indentation - returns_section += f"{create_indent(3)}{field_name} : {field_type}\n" + if type_name.startswith("OBBject"): + if field_name != "id": + returns_section += "\n" + + returns_section += f"{create_indent(2)}{field_name.strip()} : {field_type}" + else: + returns_section += ( + f"{field_name} : {field_type}\n" + ) if description: returns_section += ( - f"{create_indent(4)}{description}\n" + f"\n{create_indent(3)}{description}" ) except (AttributeError, TypeError): pass else: # Default case when no return annotation is available - returns_section += f"{create_indent(2)}Any\n" + returns_section += "Any\n" - result_doc += returns_section + result_doc += returns_section + "\n" result_doc = result_doc.replace("\n ", f"\n{create_indent(2)}") doc = result_doc + "\n" @@ -2284,6 +2345,7 @@ class DocstringGenerator: param_types, examples, ) + doc += "\n" if ( # pylint: disable=chained-comparison max_length and len(doc) > max_length and max_length > 3 diff --git a/openbb_platform/core/poetry.lock b/openbb_platform/core/poetry.lock index a20f1a82aad..7bed5d9f99a 100644 --- a/openbb_platform/core/poetry.lock +++ b/openbb_platform/core/poetry.lock @@ -425,14 +425,14 @@ test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.120.2" +version = "0.120.4" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "fastapi-0.120.2-py3-none-any.whl", hash = "sha256:bedcf2c14240e43d56cb9a339b32bcf15104fe6b5897c0222603cb7ec416c8eb"}, - {file = "fastapi-0.120.2.tar.gz", hash = "sha256:4c5ab43e2a90335bbd8326d1b659eac0f3dbcc015e2af573c4f5de406232c4ac"}, + {file = "fastapi-0.120.4-py3-none-any.whl", hash = "sha256:9bdf192308676480d3593e10fd05094e56d6fdc7d9283db26053d8104d5f82a0"}, + {file = "fastapi-0.120.4.tar.gz", hash = "sha256:2d856bc847893ca4d77896d4504ffdec0fb04312b705065fca9104428eca3868"}, ] [package.dependencies] @@ -1502,14 +1502,14 @@ files = [ [[package]] name = "starlette" -version = "0.49.1" +version = "0.49.3" description = "The little ASGI library that shines." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "starlette-0.49.1-py3-none-any.whl", hash = "sha256:d92ce9f07e4a3caa3ac13a79523bd18e3bc0042bb8ff2d759a8e7dd0e1859875"}, - {file = "starlette-0.49.1.tar.gz", hash = "sha256:481a43b71e24ed8c43b11ea02f5353d77840e01480881b8cb5a26b8cae64a8cb"}, + {file = "starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"}, + {file = "starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284"}, ] [package.dependencies] @@ -1867,4 +1867,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.14" -content-hash = "ea739fddecd9f00a3c2c1ce44aa1d5e37bd864d4ffa7977529bf37b0d536c8a5" +content-hash = "bd53eb167e66f079a99820a036fac14be6293ac638dcf541331f01758c2bc1a6" diff --git a/openbb_platform/core/pyproject.toml b/openbb_platform/core/pyproject.toml index df026b00ec4..e3011838cd4 100644 --- a/openbb_platform/core/pyproject.toml +++ b/openbb_platform/core/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-core" -version = "1.5.3" +version = "1.5.5" description = "OpenBB package with core functionality." authors = ["OpenBB Team "] license = "AGPL-3.0-only" @@ -16,7 +16,7 @@ uvicorn = "^0.35.0" websockets = "^15.0" pandas = ">=1.5.3" html5lib = "^1.1" -fastapi = "^0.120.1" +fastapi = "^0.120.3" uuid7 = "^0.1.0" python-multipart = "^0.0.20" pydantic = "^2.12.3" diff --git a/openbb_platform/core/tests/app/static/test_package_builder.py b/openbb_platform/core/tests/app/static/test_package_builder.py index 9ae3ce39498..6007a57d6e5 100644 --- a/openbb_platform/core/tests/app/static/test_package_builder.py +++ b/openbb_platform/core/tests/app/static/test_package_builder.py @@ -279,9 +279,7 @@ def test_build_func_params(method_definition): ), } - expected_output = ( - "param1: None,\nparam2: int,\nparam3: dict[str, Any] | pandas.DataFrame" - ) + expected_output = "param1: None,\n param2: int,\n param3: dict[str, Any] | pandas.DataFrame" output = method_definition.build_func_params(param_map) assert output == expected_output diff --git a/openbb_platform/poetry.lock b/openbb_platform/poetry.lock index 3053fd8f793..b31d2c8665a 100644 --- a/openbb_platform/poetry.lock +++ b/openbb_platform/poetry.lock @@ -399,23 +399,23 @@ testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-ch [[package]] name = "beartype" -version = "0.22.4" +version = "0.22.5" description = "Unbearably fast near-real-time pure-Python runtime-static type-checker." optional = true python-versions = ">=3.10" groups = ["main"] markers = "extra == \"mcp-server\" or extra == \"all\"" files = [ - {file = "beartype-0.22.4-py3-none-any.whl", hash = "sha256:7967a1cee01fee42e47da69c58c92da10ba5bcfb8072686e48487be5201e3d10"}, - {file = "beartype-0.22.4.tar.gz", hash = "sha256:68284c7803efd190b1b4639a0ab1a17677af9571b8a2ef5a169d10cb8955b01f"}, + {file = "beartype-0.22.5-py3-none-any.whl", hash = "sha256:d9743dd7cd6d193696eaa1e025f8a70fb09761c154675679ff236e61952dfba0"}, + {file = "beartype-0.22.5.tar.gz", hash = "sha256:516a9096cc77103c96153474fa35c3ebcd9d36bd2ec8d0e3a43307ced0fa6341"}, ] [package.extras] -dev = ["autoapi (>=0.9.0)", "celery", "click", "coverage (>=5.5)", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pydata-sphinx-theme (<=0.7.2)", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "redis", "rich-click", "setuptools", "sphinx", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "tox (>=3.20.1)", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""] +dev = ["autoapi (>=0.9.0)", "celery", "click", "coverage (>=5.5)", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pydata-sphinx-theme (<=0.7.2)", "pygments", "pyright (>=1.1.370)", "pytest (>=6.2.0)", "redis", "rich-click", "setuptools", "sphinx", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "tox (>=3.20.1)", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""] doc-ghp = ["mkdocs-material[imaging] (>=9.6.0)", "mkdocstrings-python (>=1.16.0)", "mkdocstrings-python-xref (>=1.16.0)"] doc-rtd = ["autoapi (>=0.9.0)", "pydata-sphinx-theme (<=0.7.2)", "setuptools", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)"] -test = ["celery", "click", "coverage (>=5.5)", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "redis", "rich-click", "sphinx", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "tox (>=3.20.1)", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""] -test-tox = ["celery", "click", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "redis", "rich-click", "sphinx", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""] +test = ["celery", "click", "coverage (>=5.5)", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pygments", "pyright (>=1.1.370)", "pytest (>=6.2.0)", "redis", "rich-click", "sphinx", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "tox (>=3.20.1)", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""] +test-tox = ["celery", "click", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pygments", "pyright (>=1.1.370)", "pytest (>=6.2.0)", "redis", "rich-click", "sphinx", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""] test-tox-coverage = ["coverage (>=5.5)"] [[package]] @@ -1028,15 +1028,15 @@ test = ["charset_normalizer (>=3.3.2,<4.0)", "cryptography (>=42.0.5,<43.0)", "f [[package]] name = "cyclopts" -version = "4.1.0" +version = "4.2.1" description = "Intuitive, easy CLIs based on type hints." optional = true python-versions = ">=3.10" groups = ["main"] markers = "extra == \"mcp-server\" or extra == \"all\"" files = [ - {file = "cyclopts-4.1.0-py3-none-any.whl", hash = "sha256:6468e7e7467af4b6378bf17d0aaf204b713ddc5df383d9ffa7cae6e285da1329"}, - {file = "cyclopts-4.1.0.tar.gz", hash = "sha256:18d3e4647729c88fda3a3192d7fab905e6770769465476658f173f02c28ef1ec"}, + {file = "cyclopts-4.2.1-py3-none-any.whl", hash = "sha256:17a801faa814988b0307385ef8aaeb6b14b4d64473015a2d66bde9ea13f14d9c"}, + {file = "cyclopts-4.2.1.tar.gz", hash = "sha256:49bb4c35644e7a9658f706ade4cf1a9958834b2dca4425e2fafecf8a0537fac7"}, ] [package.dependencies] @@ -1334,14 +1334,14 @@ tzdata = ">=2025.2" [[package]] name = "fastapi" -version = "0.120.2" +version = "0.120.4" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "fastapi-0.120.2-py3-none-any.whl", hash = "sha256:bedcf2c14240e43d56cb9a339b32bcf15104fe6b5897c0222603cb7ec416c8eb"}, - {file = "fastapi-0.120.2.tar.gz", hash = "sha256:4c5ab43e2a90335bbd8326d1b659eac0f3dbcc015e2af573c4f5de406232c4ac"}, + {file = "fastapi-0.120.4-py3-none-any.whl", hash = "sha256:9bdf192308676480d3593e10fd05094e56d6fdc7d9283db26053d8104d5f82a0"}, + {file = "fastapi-0.120.4.tar.gz", hash = "sha256:2d856bc847893ca4d77896d4504ffdec0fb04312b705065fca9104428eca3868"}, ] [package.dependencies] @@ -2396,15 +2396,15 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"] [[package]] name = "mcp" -version = "1.19.0" +version = "1.20.0" description = "Model Context Protocol SDK" optional = true python-versions = ">=3.10" groups = ["main"] markers = "extra == \"mcp-server\" or extra == \"all\"" files = [ - {file = "mcp-1.19.0-py3-none-any.whl", hash = "sha256:f5907fe1c0167255f916718f376d05f09a830a215327a3ccdd5ec8a519f2e572"}, - {file = "mcp-1.19.0.tar.gz", hash = "sha256:213de0d3cd63f71bc08ffe9cc8d4409cc87acffd383f6195d2ce0457c021b5c1"}, + {file = "mcp-1.20.0-py3-none-any.whl", hash = "sha256:d0dc06f93653f7432ff89f694721c87f79876b6f93741bf628ad1e48f7ac5e5d"}, + {file = "mcp-1.20.0.tar.gz", hash = "sha256:9ccc09eaadbfbcbbdab1c9723cfe2e0d1d9e324d7d3ce7e332ef90b09ed35177"}, ] [package.dependencies] @@ -2414,6 +2414,7 @@ httpx-sse = ">=0.4" jsonschema = ">=4.20.0" pydantic = ">=2.11.0,<3.0.0" pydantic-settings = ">=2.5.2" +pyjwt = {version = ">=2.10.1", extras = ["crypto"]} python-multipart = ">=0.0.9" pywin32 = {version = ">=310", markers = "sys_platform == \"win32\""} sse-starlette = ">=1.6.1" @@ -2636,15 +2637,15 @@ files = [ [[package]] name = "narwhals" -version = "2.10.0" +version = "2.10.1" description = "Extremely lightweight compatibility layer between dataframe libraries" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"charting\" or extra == \"all\" or extra == \"econometrics\"" files = [ - {file = "narwhals-2.10.0-py3-none-any.whl", hash = "sha256:baed44e8fc38e800e3a585e3fa9843a7079a6fad5fbffbecee4348d6ac52298c"}, - {file = "narwhals-2.10.0.tar.gz", hash = "sha256:1c05bbef2048a4045263de7d98c3d06140583eb13d796dd733b2157f05d24485"}, + {file = "narwhals-2.10.1-py3-none-any.whl", hash = "sha256:eed3d9ec8f821963456fef306c1ad11017995982169fca1f38f71c97d6a97b9b"}, + {file = "narwhals-2.10.1.tar.gz", hash = "sha256:d6e3a9b1c0904a82984dec58a3d12b3bc08e9d61bbee639e7bb05349e663d036"}, ] [package.extras] @@ -3057,19 +3058,19 @@ openbb-core = ">=1.5.1,<2.0.0" [[package]] name = "openbb-core" -version = "1.5.3" +version = "1.5.5" description = "OpenBB package with core functionality." optional = false python-versions = "<3.14,>=3.10" groups = ["main"] files = [ - {file = "openbb_core-1.5.3-py3-none-any.whl", hash = "sha256:217ba30ac8015aae497812e317ad2865d1a727e65183282da6d81167cb432260"}, - {file = "openbb_core-1.5.3.tar.gz", hash = "sha256:4235baa3dd1f0769f0b0b7d90d72a152c90462c79a17d2d5816639d041c501ed"}, + {file = "openbb_core-1.5.5-py3-none-any.whl", hash = "sha256:f722b11bf3ec6873ac3254095b6cda09f4243957034b68ad115462dc7190b93d"}, + {file = "openbb_core-1.5.5.tar.gz", hash = "sha256:22448f322c543ec74d93c93e1fc066d31103eb35b2397dc528142b88008c282c"}, ] [package.dependencies] aiohttp = ">=3.13.2,<4.0.0" -fastapi = ">=0.120.1,<0.121.0" +fastapi = ">=0.120.3,<0.121.0" html5lib = ">=1.1,<2.0" importlib-metadata = ">=6.8.0" pandas = ">=1.5.3" @@ -4521,6 +4522,9 @@ files = [ {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + [package.extras] crypto = ["cryptography (>=3.4.0)"] dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] @@ -5407,15 +5411,15 @@ files = [ [[package]] name = "sse-starlette" -version = "3.0.2" +version = "3.0.3" description = "SSE plugin for Starlette" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"mcp-server\" or extra == \"all\"" files = [ - {file = "sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a"}, - {file = "sse_starlette-3.0.2.tar.gz", hash = "sha256:ccd60b5765ebb3584d0de2d7a6e4f745672581de4f5005ab31c3a25d10b52b3a"}, + {file = "sse_starlette-3.0.3-py3-none-any.whl", hash = "sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431"}, + {file = "sse_starlette-3.0.3.tar.gz", hash = "sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971"}, ] [package.dependencies] @@ -5423,20 +5427,20 @@ anyio = ">=4.7.0" [package.extras] daphne = ["daphne (>=4.2.0)"] -examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "starlette (>=0.41.3)", "uvicorn (>=0.34.0)"] +examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "starlette (>=0.49.1)", "uvicorn (>=0.34.0)"] granian = ["granian (>=2.3.1)"] uvicorn = ["uvicorn (>=0.34.0)"] [[package]] name = "starlette" -version = "0.49.1" +version = "0.49.3" description = "The little ASGI library that shines." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "starlette-0.49.1-py3-none-any.whl", hash = "sha256:d92ce9f07e4a3caa3ac13a79523bd18e3bc0042bb8ff2d759a8e7dd0e1859875"}, - {file = "starlette-0.49.1.tar.gz", hash = "sha256:481a43b71e24ed8c43b11ea02f5353d77840e01480881b8cb5a26b8cae64a8cb"}, + {file = "starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"}, + {file = "starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284"}, ] [package.dependencies] @@ -6215,4 +6219,4 @@ wsj = ["openbb-wsj"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.14" -content-hash = "f87bafc5ce723f3ed326bdacf1dea7471209dc421db0b8684ff27f80a3035e6b" +content-hash = "315e4926c0c713f38e9e3bc96a5a145765bb1ecf85bac950eae1df98c567943a" diff --git a/openbb_platform/pyproject.toml b/openbb_platform/pyproject.toml index be164f379da..db445e4e82a 100644 --- a/openbb_platform/pyproject.toml +++ b/openbb_platform/pyproject.toml @@ -10,7 +10,7 @@ packages = [{ include = "openbb", from = "core" }] [tool.poetry.dependencies] python = ">=3.10,<3.14" -openbb-core = "^1.5.3" +openbb-core = "^1.5.5" openbb-platform-api = "^1.2.1" openbb-benzinga = "^1.5.0"