"""Generate the ``providers//__init__.py`` registration module.""" from __future__ import annotations from dataclasses import dataclass from typing import TYPE_CHECKING if TYPE_CHECKING: from openbb_cli.codegen.fetcher_gen import GeneratedFetcher @dataclass class GeneratedProvider: """Output of ``generate_provider_module``. Parameters ---------- package_name : str Snake-case package name. provider_name : str Snake-case provider identifier. source : str Full source for ``providers//__init__.py``. credential_keys : list of str Canonical credential names declared on the provider. """ package_name: str provider_name: str source: str credential_keys: list[str] def generate_provider_module( package_name: str, provider_name: str, description: str, website: str, fetchers: list[GeneratedFetcher], ) -> GeneratedProvider: """Render the provider's ``__init__.py``. Parameters ---------- package_name : str Snake-case top-level package name. provider_name : str Snake-case provider identifier. description : str Provider description shown in OpenBB introspection. website : str Provider home page URL. fetchers : list of GeneratedFetcher Per-command fetchers. Returns ------- GeneratedProvider Module source plus the credential-key list. """ cred_set: set[str] = set() for f in fetchers: cred_set.update(f.credentials_used) credential_keys = sorted(cred_set) parts: list[str] = [] parts.append( f'"""Provider registration for {provider_name} — generated from spec."""' ) parts.append("") parts.append("from openbb_core.provider.abstract.provider import Provider") parts.append("") for f in fetchers: parts.append( f"from {package_name}.providers.{provider_name}.models." f"{f.module_name} import {f.fetcher_class}" ) parts.append("") parts.append("") fetcher_dict_lines = [f' "{f.model_name}": {f.fetcher_class},' for f in fetchers] if credential_keys: cred_repr = ( "[\n " + ",\n ".join(repr(k) for k in credential_keys) + ",\n ]" ) cred_block = f" credentials={cred_repr},\n" else: cred_block = "" parts.append( f"{provider_name}_provider = Provider(\n" f' name="{provider_name}",\n' f" description={description!r},\n" f"{cred_block}" f' website="{website}",\n' " fetcher_dict={\n" + "\n".join(fetcher_dict_lines) + "\n },\n)\n" ) return GeneratedProvider( package_name=package_name, provider_name=provider_name, source="\n".join(parts), credential_keys=credential_keys, )