You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.7 KiB
Python
84 lines
2.7 KiB
Python
""""An event schema registry."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from .schema import EventSchema
|
|
|
|
|
|
class SchemaRegistryException(Exception):
|
|
"""Exception class for Jupyter Events Schema Registry Errors."""
|
|
|
|
|
|
class SchemaRegistry:
|
|
"""A convenient API for storing and searching a group of schemas."""
|
|
|
|
def __init__(self, schemas: dict[str, EventSchema] | None = None):
|
|
"""Initialize the registry."""
|
|
self._schemas: dict[str, EventSchema] = schemas or {}
|
|
|
|
def __contains__(self, key: str) -> bool:
|
|
"""Syntax sugar to check if a schema is found in the registry"""
|
|
return key in self._schemas
|
|
|
|
def __repr__(self) -> str:
|
|
"""The str repr of the registry."""
|
|
return ",\n".join([str(s) for s in self._schemas.values()])
|
|
|
|
def _add(self, schema_obj: EventSchema) -> None:
|
|
if schema_obj.id in self._schemas:
|
|
msg = (
|
|
f"The schema, {schema_obj.id}, is already "
|
|
"registered. Try removing it and registering it again."
|
|
)
|
|
raise SchemaRegistryException(msg)
|
|
self._schemas[schema_obj.id] = schema_obj
|
|
|
|
@property
|
|
def schema_ids(self) -> list[str]:
|
|
return list(self._schemas.keys())
|
|
|
|
def register(self, schema: dict[str, Any] | (str | EventSchema)) -> EventSchema:
|
|
"""Add a valid schema to the registry.
|
|
|
|
All schemas are validated against the Jupyter Events meta-schema
|
|
found here:
|
|
"""
|
|
if not isinstance(schema, EventSchema):
|
|
schema = EventSchema(schema)
|
|
self._add(schema)
|
|
return schema
|
|
|
|
def get(self, id_: str) -> EventSchema:
|
|
"""Fetch a given schema. If the schema is not found,
|
|
this will raise a KeyError.
|
|
"""
|
|
try:
|
|
return self._schemas[id_]
|
|
except KeyError:
|
|
msg = (
|
|
f"The requested schema, {id_}, was not found in the "
|
|
"schema registry. Are you sure it was previously registered?"
|
|
)
|
|
raise KeyError(msg) from None
|
|
|
|
def remove(self, id_: str) -> None:
|
|
"""Remove a given schema. If the schema is not found,
|
|
this will raise a KeyError.
|
|
"""
|
|
try:
|
|
del self._schemas[id_]
|
|
except KeyError:
|
|
msg = (
|
|
f"The requested schema, {id_}, was not found in the "
|
|
"schema registry. Are you sure it was previously registered?"
|
|
)
|
|
raise KeyError(msg) from None
|
|
|
|
def validate_event(self, id_: str, data: dict[str, Any]) -> None:
|
|
"""Validate an event against a schema within this
|
|
registry.
|
|
"""
|
|
schema = self.get(id_)
|
|
schema.validate(data)
|