Source code for scim2_server.utils

import importlib.resources
import json
from typing import Any
from typing import TypeVar
from typing import cast

from scim2_models import Resource
from scim2_models import ResourceType
from scim2_models import Schema
from scim2_models import ScimProvider
from scim2_models import ServiceProviderConfig

GenericT = TypeVar("GenericT")
ResourceT = TypeVar("ResourceT", bound=Resource[Any])


def parametrize(generic: type[GenericT], parameter: Any) -> type[GenericT]:
    """Parametrize a generic class with a type only known at runtime."""
    return cast("type[GenericT]", cast(Any, generic)[parameter])


def load_json_resource(json_name: str) -> Any:
    """Load a JSON document from the scim2_server package resources."""
    fp = importlib.resources.files("scim2_server") / "resources" / json_name
    with fp.open() as f:
        return json.load(f)


def load_scim_resource(json_name: str, type_: type[ResourceT]) -> dict[str, ResourceT]:
    """Load and validates a JSON document from the scim2_server package resources."""
    ret = {}
    definitions = load_json_resource(json_name)
    for d in definitions:
        model = type_.model_validate(d)
        assert model.id is not None
        ret[model.id] = model
    return ret


[docs] def load_default_schemas() -> dict[str, Schema]: """Load the default schemas from :rfc:`RFC 7643 <7643>`.""" return load_scim_resource("default-schemas.json", Schema)
[docs] def load_default_resource_types() -> dict[str, ResourceType]: """Load the default resource types from :rfc:`RFC 7643 <7643>`.""" return load_scim_resource("default-resource-types.json", ResourceType)
[docs] def load_default_service_provider_config() -> ServiceProviderConfig: """Load the default service provider configuration.""" return ServiceProviderConfig.model_validate( load_json_resource("default-service-provider-config.json") )
[docs] def load_default_provider() -> ScimProvider: """Describe a service serving the default schemas, resource types and configuration.""" return ScimProvider.from_discovery( load_default_schemas().values(), load_default_resource_types().values(), config=load_default_service_provider_config(), )