mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-10-27 12:40:35 +00:00
[[BugFix] Fix Depends Type Change in Lastest FastAPI Version (#7258)
* fix for Depends type change in lastest FastAPI version
* lint
* fix differences in docstrings between methods
* use {'arbitrary_types_allowed': True} instead of dict
* fix missing new line before examples section in model endpoints
This commit is contained in:
@@ -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": [],
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
"""Autogenerated OpenBB module."""
|
||||
|
||||
### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###
|
||||
|
||||
@@ -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
|
||||
|
||||
14
openbb_platform/core/poetry.lock
generated
vendored
14
openbb_platform/core/poetry.lock
generated
vendored
@@ -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"
|
||||
|
||||
4
openbb_platform/core/pyproject.toml
vendored
4
openbb_platform/core/pyproject.toml
vendored
@@ -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 <hello@openbb.co>"]
|
||||
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"
|
||||
|
||||
@@ -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
|
||||
|
||||
64
openbb_platform/poetry.lock
generated
vendored
64
openbb_platform/poetry.lock
generated
vendored
@@ -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"
|
||||
|
||||
2
openbb_platform/pyproject.toml
vendored
2
openbb_platform/pyproject.toml
vendored
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user