Skip to content

Commit 6ec4d7a

Browse files
committed
add server status API endpoint
1 parent b67617c commit 6ec4d7a

File tree

4 files changed

+44
-7
lines changed

4 files changed

+44
-7
lines changed

py_src/jupyter_lsp/handlers.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,20 @@ def on_close(self):
4141

4242

4343
class LanguageServersHandler(BaseHandler):
44+
""" Reports the status of all current servers
45+
46+
Response should conform to schema in schema/servers.schema.json
47+
"""
48+
4449
def get(self):
50+
""" finish with the JSON representations of the sessions
51+
"""
4552
self.finish(
4653
{
54+
"version": 0,
4755
"sessions": sorted(
4856
[session.to_json() for session in self.manager.sessions.values()],
4957
key=lambda session: session["languages"],
50-
)
58+
),
5159
}
5260
)

py_src/jupyter_lsp/schema/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
HERE = pathlib.Path(__file__).parent
77

88

9-
def servers_schema():
9+
def servers_schema() -> jsonschema.validators.Draft7Validator:
10+
""" return a JSON Schema Draft 7 validator for the server status API
11+
"""
1012
return jsonschema.validators.Draft7Validator(
1113
json.loads((HERE / "servers.schema.json").read_text())
1214
)

py_src/jupyter_lsp/schema/servers.schema.json

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,32 @@
11
{
22
"$schema": "http://json-schema.org/draft-07/schema#",
33
"$ref": "#/definitions/servers-response",
4+
"title": "jupyter_lsp server status response",
5+
"description": "describes the current state of (potentially) running language servers",
46
"definitions": {
57
"servers-response": {
68
"type": "object",
79
"properties": {
810
"sessions": {
911
"type": "array",
12+
"description": "a list of servers that are, could be, or were running",
1013
"items": { "$ref": "#/definitions/session" }
14+
},
15+
"version": {
16+
"type": "integer",
17+
"description": "the version of the schema",
18+
"enum": [0]
1119
}
1220
},
13-
"required": ["sessions"]
21+
"required": ["sessions", "version"]
1422
},
1523
"nullable-date-time": {
24+
"description": "a date/time that might not have been recorded",
1625
"oneOf": [{ "type": "string", "format": "date-time" }, { "type": "null" }]
1726
},
1827
"session": {
28+
"title": "Language Server Session",
29+
"description": "a language server session",
1930
"additionalProperties": false,
2031
"required": [
2132
"languages",
@@ -26,20 +37,29 @@
2637
],
2738
"properties": {
2839
"languages": {
40+
"description": "languages supported by this Language Server",
2941
"type": "array",
30-
"items": {"type": "string"},
42+
"items": { "type": "string" },
3143
"uniqueItems": true,
3244
"minItems": 1
3345
},
34-
"handler_count": { "type": "integer", "minValue": 0 },
46+
"handler_count": {
47+
"title": "handler count",
48+
"description": "the count of currently-connected WebSocket handlers",
49+
"type": "integer",
50+
"minValue": 0
51+
},
3552
"status": {
53+
"description": "a string describing the current state of the server",
3654
"type": "string",
3755
"enum": ["not_started", "starting", "started", "stopping", "stopped"]
3856
},
3957
"last_server_message_at": {
58+
"description": "date-time of last seen message from the language server",
4059
"$ref": "#/definitions/nullable-date-time"
4160
},
4261
"last_handler_message_at": {
62+
"description": "date-time of last seen message from a WebSocket handler",
4363
"$ref": "#/definitions/nullable-date-time"
4464
}
4565
}

py_src/jupyter_lsp/tests/test_session.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ def assert_status_set(handler, expected_statuses, language=None):
99
handler.get()
1010
payload = handler._payload
1111

12-
SERVERS_SCHEMA.validate(payload)
12+
errors = list(SERVERS_SCHEMA.iter_errors(payload))
13+
assert not errors
1314

1415
statuses = {
1516
s["status"]
@@ -60,11 +61,17 @@ async def test_start_unknown(known_unknown_language, handlers, jsonrpc_init_msg)
6061
handler, ws_handler = handlers
6162
manager = handler.manager
6263
manager.initialize()
64+
65+
assert_status_set(handler, {"not_started"})
66+
6367
ws_handler.open(known_unknown_language)
6468
assert not list(manager.sessions_for_handler(ws_handler))
6569

66-
ws_handler.on_message(jsonrpc_init_msg)
70+
assert_status_set(handler, {"not_started"})
6771

72+
ws_handler.on_message(jsonrpc_init_msg)
73+
assert_status_set(handler, {"not_started"})
6874
ws_handler.on_close()
6975

7076
assert not list(manager.sessions_for_handler(ws_handler))
77+
assert_status_set(handler, {"not_started"})

0 commit comments

Comments
 (0)