Skip to content

Commit 108c5f8

Browse files
datnguyeil-dat
andauthored
feat: support external adapter entry points (#141)
* feat: add support for external adapter entry points in _register_adapters * feat: add documentation for developing an external adapter * feat: enhance _register_adapters to handle entry point loading failures and add fallback for Python < 3.12 --------- Co-authored-by: Dat Nguyen <dat@infinitelambda.com>
1 parent 2ac17ba commit 108c5f8

6 files changed

Lines changed: 657 additions & 9 deletions

File tree

dbterd/core/executor.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"""
66

77
import importlib
8+
import importlib.metadata
89
import os
910
from pathlib import Path
1011
import pkgutil
@@ -27,12 +28,36 @@
2728

2829

2930
def _register_adapters() -> None:
30-
"""Import adapter modules to trigger plugin registration via decorators."""
31+
"""Import adapter modules to trigger plugin registration via decorators.
32+
33+
Discovers adapters from two sources:
34+
1. Built-in adapter modules under dbterd/adapters/algos/ and dbterd/adapters/targets/
35+
2. External packages that declare entry points in the "dbterd.adapters" group
36+
37+
External packages register by adding an entry point in their pyproject.toml::
38+
39+
[project.entry-points."dbterd.adapters"]
40+
my_algo = "my_package.module:MyAlgoClass"
41+
42+
The entry point module just needs to be imported — the @register_algo or
43+
@register_target decorator handles the actual registration.
44+
"""
3145
adapter_packages = [algos, targets]
3246
for package in adapter_packages:
3347
for _, module_name, _ in pkgutil.iter_modules(package.__path__):
3448
importlib.import_module(f"{package.__name__}.{module_name}")
3549

50+
try:
51+
adapter_eps = importlib.metadata.entry_points(group="dbterd.adapters")
52+
except TypeError:
53+
# Python < 3.12: entry_points() doesn't accept keyword arguments
54+
adapter_eps = importlib.metadata.entry_points().get("dbterd.adapters", [])
55+
for ep in adapter_eps:
56+
try:
57+
ep.load()
58+
except (ImportError, AttributeError):
59+
logger.warning("Failed to load external adapter entry point '%s'", ep.name)
60+
3661

3762
_register_adapters()
3863

0 commit comments

Comments
 (0)