Files
2026-05-12 19:40:31 +09:00

61 lines
1.8 KiB
Python

"""guardrails.hub - Dynamic import resolution from hub_registry.json.
Validators registered in .guardrails/hub_registry.json are resolved lazily
on first attribute access and cached for subsequent imports.
"""
import importlib
from guardrails.hub.registry import get_registry
_export_map_cache = None
def _build_export_map() -> dict:
"""Build mapping from export name to import path.
Returns a dict mapping export names (e.g. "DetectPII") to their
module import paths (e.g. "guardrails_grhub_detect_pii").
"""
registry = get_registry()
export_map = {}
for entry in registry.validators.values():
import_path = entry.import_path
for export_name in entry.exports:
export_map[export_name] = import_path
return export_map
def _get_export_map() -> dict:
"""Return cached export map, building it on first access."""
global _export_map_cache
if _export_map_cache is None:
_export_map_cache = _build_export_map()
return _export_map_cache
def __getattr__(name: str):
export_map = _get_export_map()
if name in export_map:
import_path = export_map[name]
try:
module = importlib.import_module(import_path)
attr = getattr(module, name)
globals()[name] = attr
return attr
except (ModuleNotFoundError, AttributeError) as e:
raise ImportError(
f"Cannot import '{name}' from hub registry. "
f"Module '{import_path}' not found. "
f"Try reinstalling: guardrails hub install "
f"hub://<org>/<validator>"
) from e
raise AttributeError(f"module 'guardrails.hub' has no attribute '{name}'")
def __dir__():
base = list(globals().keys())
base.extend(_get_export_map().keys())
return base