Decouple scopes from tenancy schema
This commit is contained in:
@@ -5,7 +5,7 @@ from contextlib import asynccontextmanager
|
||||
from fastapi import Depends, FastAPI
|
||||
from sqlalchemy.engine import make_url
|
||||
|
||||
from govoplan_access.auth import ApiPrincipal, require_scope
|
||||
from govoplan_core.auth import ApiPrincipal, require_scope
|
||||
from govoplan_core.core.registry import PlatformRegistry
|
||||
from govoplan_core.db.bootstrap import bootstrap_dev_data, create_all_tables
|
||||
from govoplan_core.db.session import get_database
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Callable, Iterable, Sequence
|
||||
import importlib
|
||||
|
||||
from govoplan_access.backend.manifest import get_manifest as get_access_manifest
|
||||
from govoplan_core.core.discovery import discover_module_manifests
|
||||
from govoplan_core.core.modules import ModuleManifest
|
||||
from govoplan_core.core.registry import PlatformRegistry, RegistryError
|
||||
from govoplan_tenancy.backend.manifest import get_manifest as get_tenancy_manifest
|
||||
|
||||
ManifestFactory = Callable[[], ModuleManifest]
|
||||
|
||||
_BUILTIN_MANIFESTS = {
|
||||
"access": "govoplan_access.backend.manifest:get_manifest",
|
||||
"tenancy": "govoplan_tenancy.backend.manifest:get_manifest",
|
||||
}
|
||||
|
||||
|
||||
def parse_enabled_modules(value: str | Iterable[str]) -> list[str]:
|
||||
if isinstance(value, str):
|
||||
@@ -32,8 +36,20 @@ def available_module_manifests(
|
||||
ignore_load_errors=ignore_load_errors,
|
||||
)
|
||||
}
|
||||
manifests.setdefault("tenancy", get_tenancy_manifest())
|
||||
manifests.setdefault("access", get_access_manifest())
|
||||
loading_all = enabled_modules is None
|
||||
builtin_ids = set(_BUILTIN_MANIFESTS) if loading_all else set(parse_enabled_modules(enabled_modules))
|
||||
for module_id in sorted(builtin_ids & set(_BUILTIN_MANIFESTS)):
|
||||
if module_id in manifests:
|
||||
continue
|
||||
try:
|
||||
manifests[module_id] = _load_builtin_manifest(module_id)
|
||||
except ModuleNotFoundError as exc:
|
||||
module_root = _BUILTIN_MANIFESTS[module_id].split(":", 1)[0].split(".", 1)[0]
|
||||
if exc.name != module_root or (not ignore_load_errors and not loading_all):
|
||||
raise
|
||||
except Exception:
|
||||
if not ignore_load_errors:
|
||||
raise
|
||||
for factory in manifest_factories:
|
||||
manifest = factory()
|
||||
manifests[manifest.id] = manifest
|
||||
@@ -42,15 +58,8 @@ def available_module_manifests(
|
||||
|
||||
def build_platform_registry(enabled_modules: str | Iterable[str], *, manifest_factories: Sequence[ManifestFactory] = ()) -> PlatformRegistry:
|
||||
requested = parse_enabled_modules(enabled_modules)
|
||||
if "tenancy" not in requested:
|
||||
requested.insert(0, "tenancy")
|
||||
if "access" not in requested:
|
||||
tenancy_index = requested.index("tenancy")
|
||||
requested.insert(tenancy_index + 1, "access")
|
||||
elif requested.index("access") < requested.index("tenancy"):
|
||||
requested.remove("access")
|
||||
tenancy_index = requested.index("tenancy")
|
||||
requested.insert(tenancy_index + 1, "access")
|
||||
requested.insert(0, "access")
|
||||
|
||||
available = available_module_manifests(manifest_factories, enabled_modules=requested)
|
||||
registry = PlatformRegistry()
|
||||
@@ -61,3 +70,14 @@ def build_platform_registry(enabled_modules: str | Iterable[str], *, manifest_fa
|
||||
registry.register(manifest)
|
||||
registry.validate()
|
||||
return registry
|
||||
|
||||
|
||||
def _load_builtin_manifest(module_id: str) -> ModuleManifest:
|
||||
target = _BUILTIN_MANIFESTS[module_id]
|
||||
module_name, function_name = target.split(":", 1)
|
||||
module = importlib.import_module(module_name)
|
||||
factory = getattr(module, function_name)
|
||||
manifest = factory()
|
||||
if not isinstance(manifest, ModuleManifest):
|
||||
raise RegistryError(f"Built-in module manifest factory returned invalid value: {module_id}")
|
||||
return manifest
|
||||
|
||||
Reference in New Issue
Block a user