Skip to content

Commit 3f09d3a

Browse files
committed
update to jupyter_events 0.2.0
1 parent 338730d commit 3f09d3a

File tree

7 files changed

+49
-78
lines changed

7 files changed

+49
-78
lines changed

jupyter_server/base/handlers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,8 @@ def config_manager(self):
335335
return self.settings["config_manager"]
336336

337337
@property
338-
def event_bus(self):
339-
return self.settings["event_bus"]
338+
def event_logger(self):
339+
return self.settings["event_logger"]
340340

341341
# ---------------------------------------------------------------
342342
# CORS

jupyter_server/serverapp.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
from jupyter_client.session import Session
6262
from jupyter_core.application import JupyterApp, base_aliases, base_flags
6363
from jupyter_core.paths import jupyter_runtime_dir
64+
from jupyter_events.logger import EventLogger
6465
from nbformat.sign import NotebookNotary
6566
from traitlets import (
6667
Any,
@@ -123,7 +124,6 @@
123124
AsyncContentsManager,
124125
ContentsManager,
125126
)
126-
from jupyter_server.services.events.bus import EventBus
127127
from jupyter_server.services.kernels.kernelmanager import (
128128
AsyncMappingKernelManager,
129129
MappingKernelManager,
@@ -212,7 +212,7 @@ def __init__(
212212
session_manager,
213213
kernel_spec_manager,
214214
config_manager,
215-
event_bus,
215+
event_logger,
216216
extra_services,
217217
log,
218218
base_url,
@@ -248,7 +248,7 @@ def __init__(
248248
session_manager,
249249
kernel_spec_manager,
250250
config_manager,
251-
event_bus,
251+
event_logger,
252252
extra_services,
253253
log,
254254
base_url,
@@ -270,7 +270,7 @@ def init_settings(
270270
session_manager,
271271
kernel_spec_manager,
272272
config_manager,
273-
event_bus,
273+
event_logger,
274274
extra_services,
275275
log,
276276
base_url,
@@ -359,7 +359,7 @@ def init_settings(
359359
config_manager=config_manager,
360360
authorizer=authorizer,
361361
identity_provider=identity_provider,
362-
event_bus=event_bus,
362+
event_logger=event_logger,
363363
# handlers
364364
extra_services=extra_services,
365365
# Jupyter stuff
@@ -770,7 +770,7 @@ class ServerApp(JupyterApp):
770770
GatewaySessionManager,
771771
GatewayClient,
772772
Authorizer,
773-
EventBus,
773+
EventLogger,
774774
]
775775

776776
subcommands = dict(
@@ -1552,10 +1552,10 @@ def _default_kernel_spec_manager_class(self):
15521552
),
15531553
)
15541554

1555-
event_bus = Instance(
1556-
EventBus,
1555+
event_logger = Instance(
1556+
EventLogger,
15571557
allow_none=True,
1558-
help="An EventBus for emitting structured event data from Jupyter Server and extensions.",
1558+
help="An EventLogger for emitting structured event data from Jupyter Server and extensions.",
15591559
)
15601560

15611561
info_file = Unicode()
@@ -1948,9 +1948,9 @@ def init_logging(self):
19481948
logger.parent = self.log
19491949
logger.setLevel(self.log.level)
19501950

1951-
def init_eventbus(self):
1951+
def init_event_logger(self):
19521952
"""Initialize the Event Bus."""
1953-
self.event_bus = EventBus.instance(parent=self)
1953+
self.event_logger = EventLogger(parent=self)
19541954

19551955
def init_webapp(self):
19561956
"""initialize tornado webapp"""
@@ -2012,7 +2012,7 @@ def init_webapp(self):
20122012
self.session_manager,
20132013
self.kernel_spec_manager,
20142014
self.config_manager,
2015-
self.event_bus,
2015+
self.event_logger,
20162016
self.extra_services,
20172017
self.log,
20182018
self.base_url,
@@ -2487,7 +2487,7 @@ def initialize(
24872487
if find_extensions:
24882488
self.find_server_extensions()
24892489
self.init_logging()
2490-
self.init_eventbus()
2490+
self.init_event_logger()
24912491
self.init_server_extensions()
24922492

24932493
# Special case the starter extension and load
@@ -2814,8 +2814,6 @@ async def _cleanup(self):
28142814
await self.cleanup_kernels()
28152815
if getattr(self, "session_manager", None):
28162816
self.session_manager.close()
2817-
if getattr(self, "event_bus", None):
2818-
self.event_bus.clear_instance()
28192817

28202818
def start_ioloop(self):
28212819
"""Start the IO Loop."""

jupyter_server/services/events/bus.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

jupyter_server/services/events/handlers.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from datetime import datetime
77
from typing import Any, Dict, Optional
88

9-
from jupyter_events.logger import _skip_message
109
from pythonjsonlogger import jsonlogger
1110
from tornado import web, websocket
1211

@@ -63,21 +62,16 @@ def open(self):
6362
EventBus to a WebSocket client in the browser.
6463
"""
6564
self.logging_handler = WebSocketLoggingHandler(self)
66-
# Add a JSON formatter to the handler.
67-
formatter = jsonlogger.JsonFormatter(json_serializer=_skip_message)
68-
self.logging_handler.setFormatter(formatter)
6965
# To do: add an eventlog.add_handler method to jupyter_events.
70-
self.event_bus.log.addHandler(self.logging_handler)
71-
self.event_bus.handlers.append(self.logging_handler)
66+
self.event_logger.register_handler(self.logging_handler)
7267

7368
def on_close(self):
74-
self.event_bus.log.removeHandler(self.logging_handler)
75-
self.event_bus.handlers.remove(self.logging_handler)
69+
self.event_logger.remove_handler(self.logging_handler)
7670

7771

7872
def validate_model(data: Dict[str, Any]) -> None:
7973
"""Validates for required fields in the JSON request body"""
80-
required_keys = {"schema_name", "version", "event"}
74+
required_keys = {"schema_id", "version", "event"}
8175
for key in required_keys:
8276
if key not in data:
8377
raise web.HTTPError(400, f"Missing `{key}` in the JSON request body.")
@@ -115,10 +109,10 @@ async def post(self):
115109

116110
try:
117111
validate_model(payload)
118-
self.event_bus.record_event(
119-
schema_name=payload.get("schema_name"),
112+
self.event_logger.emit(
113+
schema_id=payload.get("schema_id"),
120114
version=payload.get("version"),
121-
event=payload.get("event"),
115+
data=payload.get("event"),
122116
timestamp_override=get_timestamp(payload),
123117
)
124118
self.set_status(204)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ dependencies = [
4444
"tornado>=6.1.0",
4545
"traitlets>=5.1",
4646
"websocket-client",
47-
"jupyter_events>=0.1.0"
47+
"jupyter_events>=0.2.0"
4848
]
4949

5050
[project.urls]

tests/services/events/mockextension/mock_extension.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@
77
class MockEventHandler(JupyterHandler):
88
def get(self):
99
# Emit an event.
10-
self.event_bus.record_event(
11-
schema_name="event.mockextension.jupyter.org/message",
10+
self.event_logger.emit(
11+
schema_id="event.mockextension.jupyter.org/message",
1212
version=1,
13-
event={"event_message": "Hello world, from mock extension!"},
13+
data={"event_message": "Hello world, from mock extension!"},
1414
)
1515

1616

1717
def _load_jupyter_server_extension(serverapp):
1818
# Register a schema with the EventBus
1919
schema_file = pathlib.Path(__file__).parent / "mock_extension_event.yaml"
20-
serverapp.event_bus.register_schema_file(schema_file)
20+
serverapp.event_logger.register_event_schema(schema_file)
2121
serverapp.web_app.add_handlers(
2222
".*$", [(url_path_join(serverapp.base_url, "/mock/event"), MockEventHandler)]
2323
)

tests/services/events/test_api.py

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,36 @@
55

66
import pytest
77
import tornado
8-
from jupyter_events.logger import _skip_message
98
from pythonjsonlogger import jsonlogger
109

1110
from tests.utils import expected_http_error
1211

1312

1413
@pytest.fixture
15-
def eventbus_sink(jp_serverapp):
16-
event_bus = jp_serverapp.event_bus
14+
def event_logger_sink(jp_serverapp):
15+
event_logger = jp_serverapp.event_logger
1716
# Register the event schema defined in this directory.
1817
schema_file = pathlib.Path(__file__).parent / "mock_event.yaml"
19-
event_bus.register_schema_file(schema_file)
20-
event_bus.allowed_schemas = ["event.mock.jupyter.org/message"]
21-
event_bus.allowed_categories = ["category.jupyter.org/unrestricted"]
18+
event_logger.register_event_schema(schema_file)
2219
sink = io.StringIO()
23-
formatter = jsonlogger.JsonFormatter(json_serializer=_skip_message)
2420
handler = logging.StreamHandler(sink)
25-
handler.setFormatter(formatter)
26-
event_bus.handlers = [handler]
27-
event_bus.log.addHandler(handler)
28-
return event_bus, sink
21+
event_logger.register_handler(handler)
22+
return event_logger, sink
2923

3024

3125
@pytest.fixture
32-
def event_bus(eventbus_sink):
33-
event_bus, sink = eventbus_sink
34-
return event_bus
26+
def event_logger(event_logger_sink):
27+
event_logger, sink = event_logger_sink
28+
return event_logger
3529

3630

37-
async def test_subscribe_websocket(jp_ws_fetch, event_bus):
31+
async def test_subscribe_websocket(jp_ws_fetch, event_logger):
3832
ws = await jp_ws_fetch("/api/events/subscribe")
3933

40-
event_bus.record_event(
41-
schema_name="event.mock.jupyter.org/message",
34+
event_logger.emit(
35+
schema_id="event.mock.jupyter.org/message",
4236
version=1,
43-
event={"event_message": "Hello, world!"},
37+
data={"event_message": "Hello, world!"},
4438
)
4539
message = await ws.read_message()
4640
event_data = json.loads(message)
@@ -51,7 +45,7 @@ async def test_subscribe_websocket(jp_ws_fetch, event_bus):
5145

5246
payload_1 = """\
5347
{
54-
"schema_name": "event.mock.jupyter.org/message",
48+
"schema_id": "event.mock.jupyter.org/message",
5549
"version": 1,
5650
"event": {
5751
"event_message": "Hello, world!"
@@ -62,7 +56,7 @@ async def test_subscribe_websocket(jp_ws_fetch, event_bus):
6256

6357
payload_2 = """\
6458
{
65-
"schema_name": "event.mock.jupyter.org/message",
59+
"schema_id": "event.mock.jupyter.org/message",
6660
"version": 1,
6761
"event": {
6862
"event_message": "Hello, world!"
@@ -72,8 +66,8 @@ async def test_subscribe_websocket(jp_ws_fetch, event_bus):
7266

7367

7468
@pytest.mark.parametrize("payload", [payload_1, payload_2])
75-
async def test_post_event(jp_fetch, eventbus_sink, payload):
76-
event_bus, sink = eventbus_sink
69+
async def test_post_event(jp_fetch, event_logger_sink, payload):
70+
event_logger, sink = event_logger_sink
7771

7872
r = await jp_fetch("api", "events", method="POST", body=payload)
7973
assert r.code == 204
@@ -90,7 +84,7 @@ async def test_post_event(jp_fetch, eventbus_sink, payload):
9084

9185
payload_3 = """\
9286
{
93-
"schema_name": "event.mock.jupyter.org/message",
87+
"schema_id": "event.mock.jupyter.org/message",
9488
"event": {
9589
"event_message": "Hello, world!"
9690
}
@@ -108,14 +102,14 @@ async def test_post_event(jp_fetch, eventbus_sink, payload):
108102

109103
payload_5 = """\
110104
{
111-
"schema_name": "event.mock.jupyter.org/message",
105+
"schema_id": "event.mock.jupyter.org/message",
112106
"version": 1
113107
}
114108
"""
115109

116110
payload_6 = """\
117111
{
118-
"schema_name": "event.mock.jupyter.org/message",
112+
"schema_id": "event.mock.jupyter.org/message",
119113
"version": 1,
120114
"event": {
121115
"event_message": "Hello, world!"
@@ -126,7 +120,7 @@ async def test_post_event(jp_fetch, eventbus_sink, payload):
126120

127121

128122
@pytest.mark.parametrize("payload", [payload_3, payload_4, payload_5, payload_6])
129-
async def test_post_event_400(jp_fetch, event_bus, payload):
123+
async def test_post_event_400(jp_fetch, event_logger, payload):
130124
with pytest.raises(tornado.httpclient.HTTPClientError) as e:
131125
await jp_fetch("api", "events", method="POST", body=payload)
132126

@@ -135,7 +129,7 @@ async def test_post_event_400(jp_fetch, event_bus, payload):
135129

136130
payload_7 = """\
137131
{
138-
"schema_name": "event.mock.jupyter.org/message",
132+
"schema_id": "event.mock.jupyter.org/message",
139133
"version": 1,
140134
"event": {
141135
"message": "Hello, world!"
@@ -145,7 +139,7 @@ async def test_post_event_400(jp_fetch, event_bus, payload):
145139

146140
payload_8 = """\
147141
{
148-
"schema_name": "event.mock.jupyter.org/message",
142+
"schema_id": "event.mock.jupyter.org/message",
149143
"version": 2,
150144
"event": {
151145
"message": "Hello, world!"
@@ -155,7 +149,7 @@ async def test_post_event_400(jp_fetch, event_bus, payload):
155149

156150

157151
@pytest.mark.parametrize("payload", [payload_7, payload_8])
158-
async def test_post_event_500(jp_fetch, event_bus, payload):
152+
async def test_post_event_500(jp_fetch, event_logger, payload):
159153
with pytest.raises(tornado.httpclient.HTTPClientError) as e:
160154
await jp_fetch("api", "events", method="POST", body=payload)
161155

0 commit comments

Comments
 (0)