mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-05-06 22:12:12 +08:00
* remove static assets for distribution * don't need that conftest file * comment cleanup * fix yaml
78 lines
3.0 KiB
Python
78 lines
3.0 KiB
Python
"""Test the pyproject.toml file for consistency and its dependencies."""
|
|
|
|
from pathlib import Path
|
|
|
|
from tomlkit import load
|
|
|
|
ROOT_DIR = Path(__file__).parent.parent
|
|
|
|
|
|
def test_optional_packages():
|
|
"""Ensure only required extensions are built and versions respect pyproject.toml"""
|
|
with open(ROOT_DIR / "pyproject.toml") as f:
|
|
data = load(f)
|
|
dependencies = data["tool"]["poetry"]["dependencies"] # type: ignore
|
|
extras = data["tool"]["poetry"]["extras"] # type: ignore
|
|
all_packages = extras["all"] # type: ignore
|
|
|
|
default_packages = []
|
|
optional_packages = []
|
|
|
|
for package, details in dependencies.items(): # type: ignore
|
|
if isinstance(details, dict) and details.get("optional") is True:
|
|
optional_packages.append(package)
|
|
else:
|
|
default_packages.append(package)
|
|
|
|
# check that optional packages have the same content as all_packages and extras
|
|
assert sorted(optional_packages) == sorted(all_packages) # type: ignore
|
|
assert sorted(optional_packages) == sorted(extras["all"]) # type: ignore
|
|
|
|
# assert that there is no overlap between default and optional packages
|
|
assert set(default_packages).isdisjoint(set(optional_packages))
|
|
|
|
|
|
def test_extension_versions_match_main_pyproject():
|
|
"""Ensure every openbb- extension version in the main pyproject.toml matches its own pyproject.toml."""
|
|
|
|
main_pyproject = ROOT_DIR / "pyproject.toml"
|
|
with open(main_pyproject, encoding="utf-8") as f:
|
|
main_data = load(f)
|
|
main_deps = main_data["tool"]["poetry"]["dependencies"] # type: ignore
|
|
|
|
# Find all pyproject.toml files and build a map of package name -> file path
|
|
pyproject_files = list(ROOT_DIR.rglob("pyproject.toml"))
|
|
package_map = {}
|
|
|
|
for file_path in pyproject_files:
|
|
with open(file_path, encoding="utf-8") as f:
|
|
data = load(f)
|
|
pkg_name = data.get("tool", {}).get("poetry", {}).get("name", "")
|
|
if pkg_name:
|
|
package_map[pkg_name] = str(file_path)
|
|
|
|
# Now check each openbb- dependency in main pyproject.toml
|
|
for pkg, main_version in main_deps.items(): # type: ignore
|
|
if pkg.startswith("openbb-"):
|
|
assert (
|
|
pkg in package_map
|
|
), f"{pkg} listed in main pyproject.toml but no pyproject.toml found with that name"
|
|
|
|
# Load the extension's pyproject.toml
|
|
with open(package_map[pkg], encoding="utf-8") as f:
|
|
ext_data = load(f)
|
|
ext_version = ext_data["tool"]["poetry"]["version"] # type: ignore
|
|
|
|
# Normalize main_version if it's a dict
|
|
m_version = (
|
|
main_version.get("version", "")
|
|
if isinstance(main_version, dict)
|
|
else main_version
|
|
)
|
|
m_version = str(m_version).lstrip("^")
|
|
|
|
assert ext_version == m_version, (
|
|
f"Version mismatch for {pkg}: main pyproject.toml has"
|
|
f"{m_version}, extension pyproject.toml has {ext_version}"
|
|
)
|