mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-07-01 10:14:21 +08:00
* stash some changes * add more robust testing * mypy * point PR at V5 * introduce spec file * codespell * test fix * fix workflow environment setup * fix workflow environment setup * fix workflow environment setup * add pyyaml to dependencies * split lint jobs * fix workflow environment setup * fix workflow environment setup * workflow env setup * workflow env setup * clean up code comments * add auth hook entrypoints * codespell * add codegen feature * codespell * move _unpack into dispatchers for consistency with codegen packages * surface nested models in the response * fix missing coverage in CI * socrata updates * test fix * detect plotly output * add --include and --exclude flags from generate-extension command * cap test matrix at python 3.14 * no useless comments * platform controller command description split * merge URL overloads from path params * exclude none and unset from model dump --------- Co-authored-by: deeleeramone <> Co-authored-by: Copilot <copilot@github.com>
108 lines
2.9 KiB
Python
108 lines
2.9 KiB
Python
"""Generate the ``providers/<provider_name>/__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/<provider_name>/__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,
|
|
)
|