Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions assets/extensions/provider.json
Original file line number Diff line number Diff line change
Expand Up @@ -303,14 +303,6 @@
"website": "https://eia.gov/",
"instructions": "Credentials are required for functions calling the EIA's API.\n Register for a free key here: https://www.eia.gov/opendata/register.php"
},
{
"packageName": "openbb-wsj",
"optional": true,
"reprName": "Wall Street Journal (WSJ)",
"description": "WSJ (Wall Street Journal) is a business-focused, English-language\ninternational daily newspaper based in New York City. The Journal is published six\ndays a week by Dow Jones & Company, a division of News Corp, along with its Asian\nand European editions. The newspaper is published in the broadsheet format and\nonline. The Journal has been printed continuously since its inception on\nJuly 8, 1889, by Charles Dow, Edward Jones, and Charles Bergstresser.\nThe WSJ is the largest newspaper in the United States, by circulation.\n ",
"credentials": [],
"website": "https://www.wsj.com"
},
{
"packageName": "openbb-yfinance",
"optional": false,
Expand Down
1 change: 1 addition & 0 deletions openbb_platform/core/openbb/.build.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
16825
5 changes: 4 additions & 1 deletion openbb_platform/core/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ pandas = ["pandas>=1.5.3"]
openbb-build = "openbb_core.build:main"

[dependency-groups]
dev = ["openbb-devtools"]
dev = ["openbb-devtools>=2.0.0"]

[build-system]
requires = ["hatchling"]
Expand All @@ -38,6 +38,9 @@ build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["openbb_core", "openbb"]

[tool.uv.sources]
openbb-devtools = { path = "../extensions/devtools", editable = true }

[tool.hatch.build.targets.sdist]
include = [
"openbb_core",
Expand Down
705 changes: 47 additions & 658 deletions openbb_platform/core/uv.lock

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion openbb_platform/dev_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@
openbb-stockgrid = { path = "./providers/stockgrid" , optional = true, develop = true }
openbb_tmx = { path = "./providers/tmx", optional = true, develop = true }
openbb_tradier = { path = "./providers/tradier", optional = true, develop = true }
openbb-wsj = { path = "./providers/wsj", optional = true, develop = true }

openbb-charting = { path = "./obbject_extensions/charting", optional = true, develop = true }
openbb-econometrics = { path = "./extensions/econometrics", optional = true, develop = true }
Expand Down
51 changes: 0 additions & 51 deletions openbb_platform/extensions/etf/integration/test_etf_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ def headers():
return {"Authorization": f"Basic {base64_bytes.decode('ascii')}"}


# pylint: disable=redefined-outer-name


@pytest.mark.parametrize(
"params",
[
Expand Down Expand Up @@ -368,54 +365,6 @@ def test_etf_countries(params, headers):
assert result.status_code == 200


@pytest.mark.parametrize(
"params",
[{"sort": "desc", "limit": 10}],
)
@pytest.mark.integration
def test_etf_discovery_gainers(params, headers):
"""Test the ETF discovery gainers endpoint."""
params = {p: v for p, v in params.items() if v}

query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/etf/discovery/gainers?{query_str}"
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200


@pytest.mark.parametrize(
"params",
[{"sort": "desc", "limit": 10}],
)
@pytest.mark.integration
def test_etf_discovery_losers(params, headers):
"""Test the ETF discovery losers endpoint."""
params = {p: v for p, v in params.items() if v}

query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/etf/discovery/losers?{query_str}"
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200


@pytest.mark.parametrize(
"params",
[{"sort": "desc", "limit": 10}],
)
@pytest.mark.integration
def test_etf_discovery_active(params, headers):
"""Test the ETF discovery active endpoint."""
params = {p: v for p, v in params.items() if v}

query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/etf/discovery/active?{query_str}"
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200


@pytest.mark.parametrize(
"params",
[
Expand Down
52 changes: 3 additions & 49 deletions openbb_platform/extensions/etf/integration/test_etf_python.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@


@pytest.fixture(scope="session")
def obb(pytestconfig): # pylint: disable=inconsistent-return-statements
def obb(pytestconfig):
"""Fixture to setup obb."""

if pytestconfig.getoption("markexpr") != "not integration":
import openbb # pylint: disable=import-outside-toplevel
import openbb

return openbb.obb


# pylint: disable=redefined-outer-name
pytest.skip("Integration tests are not enabled.")


@pytest.mark.parametrize(
Expand Down Expand Up @@ -370,51 +369,6 @@ def test_etf_countries(params, obb):
assert len(result.results) > 0


@pytest.mark.parametrize(
"params",
[{"sort": "desc", "limit": 10}],
)
@pytest.mark.integration
def test_etf_discovery_gainers(params, obb):
"""Test the ETF discovery gainers endpoint."""
params = {p: v for p, v in params.items() if v}

result = obb.etf.discovery.gainers(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0


@pytest.mark.parametrize(
"params",
[{"sort": "desc", "limit": 10}],
)
@pytest.mark.integration
def test_etf_discovery_losers(params, obb):
"""Test the ETF discovery losers endpoint."""
params = {p: v for p, v in params.items() if v}

result = obb.etf.discovery.losers(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0


@pytest.mark.parametrize(
"params",
[{"sort": "desc", "limit": 10}],
)
@pytest.mark.integration
def test_etf_discovery_active(params, obb):
"""Test the ETF discovery active endpoint."""
params = {p: v for p, v in params.items() if v}

result = obb.etf.discovery.active(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0


@pytest.mark.parametrize(
"params",
[
Expand Down

This file was deleted.

This file was deleted.

5 changes: 0 additions & 5 deletions openbb_platform/extensions/etf/openbb_etf/etf_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,7 @@
from openbb_core.app.query import Query
from openbb_core.app.router import Router

from openbb_etf.discovery.discovery_router import router as discovery_router

router = Router(prefix="", description="Exchange Traded Funds market data.")
router.include_router(discovery_router)

# pylint: disable=unused-argument


@router.command(
Expand Down
56 changes: 25 additions & 31 deletions openbb_platform/extensions/etf/openbb_etf/etf_views.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
"""Views for the ETF Extension."""

# pylint: disable=unused-argument

from typing import TYPE_CHECKING, Any, Union

if TYPE_CHECKING:
from openbb_charting.core.openbb_figure import (
OpenBBFigure,
)
from plotly.graph_objs import Figure
from importlib import import_module
from typing import Any


class EtfViews:
Expand All @@ -17,53 +10,54 @@ class EtfViews:
@staticmethod
def etf_historical(
**kwargs,
) -> tuple["OpenBBFigure", dict[str, Any]]:
) -> tuple[Any, dict[str, Any]]:
"""Etf Price Historical Chart."""
# pylint: disable=import-outside-toplevel

from openbb_charting.charts.price_historical import price_historical
price_historical = import_module(
"openbb_charting.charts.price_historical"
).price_historical

return price_historical(**kwargs)

@staticmethod
def etf_price_performance(
**kwargs,
) -> tuple["OpenBBFigure", dict[str, Any]]:
) -> tuple[Any, dict[str, Any]]:
"""Etf Price Performance Chart."""
# pylint: disable=import-outside-toplevel
from openbb_charting.charts.price_performance import price_performance
price_performance = import_module(
"openbb_charting.charts.price_performance"
).price_performance

return price_performance(**kwargs) # type: ignore
return price_performance(**kwargs)

@staticmethod
def etf_holdings(
**kwargs,
) -> tuple[Union["OpenBBFigure", "Figure"], dict[str, Any]]:
) -> tuple[Any, dict[str, Any]]:
"""Equity Compare Groups Chart."""
# pylint: disable=import-outside-toplevel
from pandas import DataFrame # noqa
from openbb_core.app.utils import basemodel_to_df # noqa
from openbb_core.app.model.abstract.error import OpenBBError # noqa
from openbb_charting.charts.generic_charts import bar_chart # noqa
from openbb_core.app.model.abstract.error import OpenBBError
from openbb_core.app.utils import basemodel_to_df
from pandas import DataFrame

bar_chart = import_module("openbb_charting.charts.generic_charts").bar_chart

if "data" in kwargs and isinstance(kwargs["data"], DataFrame):
data = kwargs["data"]
elif "data" in kwargs and isinstance(kwargs["data"], list):
data = basemodel_to_df(kwargs["data"], index=None) # type: ignore
data = basemodel_to_df(kwargs["data"], index=None)
else:
data = basemodel_to_df(kwargs["obbject_item"], index=None) # type: ignore
data = basemodel_to_df(kwargs["obbject_item"], index=None)

if "weight" not in data.columns:
raise OpenBBError("No 'weight' column found in the data.")

orientation = kwargs.get("orientation", "h")
limit = kwargs.get("limit", 20)
symbol = kwargs["standard_params"].get("symbol") # type: ignore
symbol = kwargs["standard_params"].get("symbol")
title = kwargs.get("title", f"Top {limit} {symbol} Holdings")
layout_kwargs = kwargs.get("layout_kwargs", {})

data = data.sort_values("weight", ascending=False)
limit = min(limit, len(data)) # type: ignore
limit = min(limit, len(data))
target = data.head(limit)[["symbol", "weight"]].set_index("symbol")
target = target.multiply(100)
axis_title = "Weight (%)"
Expand All @@ -72,10 +66,10 @@ def etf_holdings(
target.reset_index(),
"symbol",
["weight"],
title=title, # type: ignore
title=title,
xtitle=axis_title if orientation == "h" else None,
ytitle=axis_title if orientation == "v" else None,
orientation=orientation, # type: ignore
orientation=orientation,
)

fig.update_layout(
Expand All @@ -92,8 +86,8 @@ def etf_holdings(
)

if layout_kwargs:
fig.update_layout(**layout_kwargs) # type: ignore
fig.update_layout(**layout_kwargs)

content = fig.show(external=True).to_plotly_json() # type: ignore
content = fig.show(external=True).to_plotly_json()

return fig, content
Loading
Loading