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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
"""Generate assets from modules."""
from importlib import import_module
from json import dump
from pathlib import Path
from typing import Any, Dict, List
from poetry.core.pyproject.toml import PyProjectTOML
THIS_DIR = Path(__file__).parent
OPENBB_PLATFORM_PATH = Path(THIS_DIR, "..", "..", "openbb_platform")
PROVIDERS_PATH = OPENBB_PLATFORM_PATH / "providers"
EXTENSIONS_PATH = OPENBB_PLATFORM_PATH / "extensions"
OBBJECT_EXTENSIONS_PATH = OPENBB_PLATFORM_PATH / "obbject_extensions"
OPENBB_PLATFORM_TOML = PyProjectTOML(OPENBB_PLATFORM_PATH / "pyproject.toml")
def to_title(string: str) -> str:
"""Format string to title."""
return " ".join(string.split("_")).title()
def get_packages(path: Path, plugin_key: str) -> Dict[str, Any]:
"""Get packages."""
SKIP = ["tests", "__pycache__"]
folders = [f for f in path.glob("*") if f.is_dir() and f.stem not in SKIP]
packages: Dict[str, Any] = {}
for f in folders:
pyproject = PyProjectTOML(Path(f, "pyproject.toml"))
if not pyproject.data:
continue
poetry = pyproject.data["tool"]["poetry"]
name = poetry["name"]
plugin = poetry.get("plugins", {}).get(plugin_key)
packages[name] = {"plugin": list(plugin.values())[0] if plugin else ""}
return packages
def write(filename: str, data: Any):
"""Write to json."""
with open(Path(THIS_DIR, "..", "extensions", f"{filename}.json"), "w") as json_file:
dump(data, json_file, indent=4)
def to_camel(string: str):
"""Convert string to camel case."""
components = string.split("_")
return components[0] + "".join(x.title() for x in components[1:])
def create_item(package_name: str, obj: object, obj_attrs: List[str]) -> Dict[str, Any]:
"""Create dictionary item from object attributes."""
pkg_spec = OPENBB_PLATFORM_TOML.data["tool"]["poetry"]["dependencies"].get(
package_name
)
optional = pkg_spec.get("optional", False) if isinstance(pkg_spec, dict) else False
item = {"packageName": package_name, "optional": optional}
item.update(
{to_camel(a): getattr(obj, a) for a in obj_attrs if getattr(obj, a) is not None}
)
return item
def generate_provider_extensions() -> None:
"""Generate providers_extensions.json."""
packages = get_packages(PROVIDERS_PATH, "openbb_provider_extension")
data: List[Dict[str, Any]] = []
obj_attrs = [
"repr_name",
"description",
"credentials",
"deprecated_credentials",
"website",
"instructions",
]
for pkg_name, details in sorted(packages.items()):
plugin = details.get("plugin", "")
file_obj = plugin.split(":")
if len(file_obj) == 2:
file, obj = file_obj[0], file_obj[1]
module = import_module(file)
provider_obj = getattr(module, obj)
data.append(create_item(pkg_name, provider_obj, obj_attrs))
write("provider", data)
def generate_router_extensions() -> None:
"""Generate router_extensions.json."""
packages = get_packages(EXTENSIONS_PATH, "openbb_core_extension")
data: List[Dict[str, Any]] = []
obj_attrs = ["description"]
for pkg_name, details in sorted(packages.items()):
plugin = details.get("plugin", "")
file_obj = plugin.split(":")
if len(file_obj) == 2:
file, obj = file_obj[0], file_obj[1]
module = import_module(file)
router_obj = getattr(module, obj)
data.append(create_item(pkg_name, router_obj, obj_attrs))
write("router", data)
def generate_obbject_extensions() -> None:
"""Generate obbject_extensions.json."""
packages = get_packages(OBBJECT_EXTENSIONS_PATH, "openbb_obbject_extension")
data: List[Dict[str, Any]] = []
obj_attrs = ["description"]
for pkg_name, details in sorted(packages.items()):
plugin = details.get("plugin", "")
file_obj = plugin.split(":")
if len(file_obj) == 2:
file, obj = file_obj[0], file_obj[1]
module = import_module(file)
ext_obj = getattr(module, obj)
data.append(create_item(pkg_name, ext_obj, obj_attrs))
write("obbject", data)
if __name__ == "__main__":
generate_provider_extensions()
generate_router_extensions()
generate_obbject_extensions()
|