| """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() | |