Source code for arize.spaces.types
"""Public type re-exports and SDK-facing role types for the spaces subdomain."""
from typing import Annotated, Literal
from pydantic import BaseModel, Field, field_validator
from arize._generated.api_client.models.custom_role_assignment import (
CustomRoleAssignment,
)
from arize._generated.api_client.models.predefined_role_assignment import (
PredefinedRoleAssignment,
)
from arize._generated.api_client.models.space import Space
from arize._generated.api_client.models.space_list_response import (
SpaceListResponse,
)
from arize._generated.api_client.models.space_membership_input import (
SpaceMembershipInput,
)
from arize._generated.api_client.models.space_role_assignment import (
SpaceRoleAssignment,
)
from arize._generated.api_client.models.user_space_role import UserSpaceRole
[docs]
class PredefinedSpaceRole(PredefinedRoleAssignment):
"""A predefined space role assignment.
The ``type`` discriminator is set to ``"predefined"`` automatically.
Args:
name: The predefined role name (``"admin"``, ``"member"``,
``"read-only"``, or ``"annotator"``).
"""
type: Literal["predefined"] = "predefined" # type: ignore[assignment]
def __str__(self) -> str:
"""Return the role name as a string."""
return self.name.value
[docs]
class CustomSpaceRole(CustomRoleAssignment):
"""A custom RBAC role assignment for a space.
The ``type`` discriminator is set to ``"custom"`` automatically.
Args:
id: The unique identifier of the custom RBAC role.
name: Human-readable name of the custom role (returned in responses
only; ignored on input).
"""
type: Literal["custom"] = "custom" # type: ignore[assignment]
def __str__(self) -> str:
"""Return the role name if available, otherwise the role id."""
return self.name if self.name is not None else self.id
_SpaceRoleField = Annotated[
PredefinedSpaceRole | CustomSpaceRole,
Field(discriminator="type"),
]
[docs]
class SpaceMembership(BaseModel):
"""A space membership record with domain-typed role."""
id: str
user_id: str
space_id: str
role: _SpaceRoleField
@field_validator("role", mode="before")
@classmethod
def _coerce_role(cls, v: object) -> object:
if isinstance(v, SpaceRoleAssignment):
actual = v.actual_instance
if isinstance(actual, PredefinedRoleAssignment):
return PredefinedSpaceRole(name=actual.name)
if isinstance(actual, CustomRoleAssignment):
return CustomSpaceRole(id=actual.id, name=actual.name)
raise TypeError(f"Unknown space role type: {type(actual)!r}")
return v
__all__ = [
"CustomSpaceRole",
"PredefinedSpaceRole",
"Space",
"SpaceListResponse",
"SpaceMembership",
"SpaceMembershipInput",
"SpaceRoleAssignment",
"UserSpaceRole",
]