Files
OpenBB/cli/openbb_cli/codegen/provider_gen.py
Danglewood 9a30186174 [V5] CLI 2.0 - Pluggable Backends, Non-TTY Default, HTTP Dispatcher, Spec Files + Codegen (#7433)
* 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>
2026-06-01 19:14:38 +03:00

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,
)