|
"""Fixtures for use with jupyter events.""" |
|
from __future__ import annotations |
|
|
|
import io |
|
import json |
|
import logging |
|
from typing import Any, Callable |
|
|
|
import pytest |
|
|
|
from jupyter_events import EventLogger |
|
|
|
|
|
@pytest.fixture |
|
def jp_event_sink() -> io.StringIO: |
|
"""A stream for capture events.""" |
|
return io.StringIO() |
|
|
|
|
|
@pytest.fixture |
|
def jp_event_handler(jp_event_sink: io.StringIO) -> logging.Handler: |
|
"""A logging handler that captures any events emitted by the event handler""" |
|
return logging.StreamHandler(jp_event_sink) |
|
|
|
|
|
@pytest.fixture |
|
def jp_read_emitted_events( |
|
jp_event_handler: logging.Handler, jp_event_sink: io.StringIO |
|
) -> Callable[..., list[str] | None]: |
|
"""Reads list of events since last time it was called.""" |
|
|
|
def _read() -> list[str] | None: |
|
jp_event_handler.flush() |
|
event_buf = jp_event_sink.getvalue().strip() |
|
output = [json.loads(item) for item in event_buf.split("\n")] if event_buf else None |
|
|
|
jp_event_sink.truncate(0) |
|
jp_event_sink.seek(0) |
|
return output |
|
|
|
return _read |
|
|
|
|
|
@pytest.fixture |
|
def jp_event_schemas() -> list[Any]: |
|
"""A list of schema references. |
|
|
|
Each item should be one of the following: |
|
- string of serialized JSON/YAML content representing a schema |
|
- a pathlib.Path object pointing to a schema file on disk |
|
- a dictionary with the schema data. |
|
""" |
|
return [] |
|
|
|
|
|
@pytest.fixture |
|
def jp_event_logger(jp_event_handler: logging.Handler, jp_event_schemas: list[Any]) -> EventLogger: |
|
"""A pre-configured event logger for tests.""" |
|
logger = EventLogger() |
|
for schema in jp_event_schemas: |
|
logger.register_event_schema(schema) |
|
logger.register_handler(handler=jp_event_handler) |
|
return logger |
|
|