Refactor plugin registry into separate files per plugin

This commit is contained in:
pleb
2026-07-05 14:24:58 -07:00
parent 1b4087c5b5
commit 1858f76766
62 changed files with 730 additions and 1008 deletions
+25 -1
View File
@@ -65,6 +65,26 @@ def _asset_matches_patterns(name: str, patterns: tuple[str, ...]) -> bool:
return not patterns or any(fnmatch.fnmatch(name, pattern) for pattern in patterns)
def _expand_required_dependencies(selected_ids: set[str], registry: Registry, lockfile: Lockfile) -> set[str]:
locked_ids = {plugin.id for plugin in lockfile.plugins}
expanded = set(selected_ids)
pending = list(selected_ids)
while pending:
plugin_id = pending.pop()
registry_plugin = registry.get(plugin_id)
if not registry_plugin:
continue
for dependency in registry_plugin.dependencies:
if not dependency.required:
continue
if dependency.id not in locked_ids:
raise ValueError(f"{plugin_id}: required dependency is not locked for this instance: {dependency.id}")
if dependency.id not in expanded:
expanded.add(dependency.id)
pending.append(dependency.id)
return expanded
def create_plan(
*,
instance: str,
@@ -77,7 +97,11 @@ def create_plan(
selected: set[str] | None = None,
require_bootstrap: bool = True,
) -> tuple[dict[str, Any], Path]:
selected_ids = selected or {plugin.id for plugin in lockfile.plugins}
selected_ids = (
_expand_required_dependencies(selected, registry, lockfile)
if selected is not None
else {plugin.id for plugin in lockfile.plugins}
)
changes: list[dict[str, Any]] = []
warnings: list[str] = []