File size: 2,302 Bytes
dd64d53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""Test the extension map."""

import json
from pathlib import Path
from typing import Dict

from poetry.core.constraints.version import Version, VersionConstraint, parse_constraint
from poetry.core.pyproject.toml import PyProjectTOML


def create_ext_map(extensions: dict) -> Dict[str, Version]:
    """Create the extension map from extension."""
    ext_map = {}
    for _, v in extensions.items():
        for value in v:
            name, version = value.split("@")
            ext_map[name] = Version.parse(version)
    return ext_map


def load_req_ext(file: Path) -> Dict[str, VersionConstraint]:
    """Load the required extensions from pyproject.toml."""
    pyproject = PyProjectTOML(file)
    deps = pyproject.data["tool"]["poetry"]["dependencies"]
    req_ext = {}
    for k, v in deps.items():
        if k.startswith("openbb-") and k not in ("openbb-core"):
            name = k[7:].replace("-", "_")
            if isinstance(v, str):
                req_ext[name] = parse_constraint(v)
            elif isinstance(v, dict) and not v.get("optional", False):
                req_ext[name] = parse_constraint(v["version"])
    return req_ext


def test_extension_map():
    """Ensure only required extensions are built and versions respect pyproject.toml"""
    this_dir = Path(__file__).parent
    with open(Path(this_dir, "..", "openbb", "assets", "reference.json")) as f:
        reference = json.load(f)
    ext_map = create_ext_map(reference.get("info", {}).get("extensions", {}))
    req_ext = load_req_ext(Path(this_dir, "..", "pyproject.toml"))

    for ext in req_ext:
        if ext != "platform_api":
            assert ext in ext_map, (
                f"Extension '{ext}' is required in pyproject.toml but is not built, install"
                " it and rebuild or remove it from mandatory requirements in pyproject.toml"
            )

    for name, version in ext_map.items():
        assert name in req_ext, (
            f"'{name}' is not a required extension in pyproject.toml, uninstall it and"
            " rebuild, or add it to pyproject.toml"
        )
        assert req_ext[name].allows(version), (
            f"Version '{version}' of extension '{name}' is not compatible with the"
            f" version '{req_ext[name]}' constraint in pyproject.toml"
        )