-
-
Notifications
You must be signed in to change notification settings - Fork 52
/
handlers.py
126 lines (110 loc) · 3.85 KB
/
handlers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import json
from jupyter_server.base.handlers import APIHandler
from jupyter_server.utils import url_path_join
import pkg_resources
from notebook.notebookapp import NotebookWebApplication
from .formatters import SERVER_FORMATTERS
def setup_handlers(web_app: NotebookWebApplication) -> None:
host_pattern = ".*$"
web_app.add_handlers(
host_pattern,
[
(
url_path_join(
web_app.settings["base_url"],
"/jupyterlab_code_formatter/formatters",
),
FormattersAPIHandler,
)
],
)
web_app.add_handlers(
host_pattern,
[
(
url_path_join(
web_app.settings["base_url"], "/jupyterlab_code_formatter/format"
),
FormatAPIHandler,
)
],
)
web_app.add_handlers(
host_pattern,
[
(
url_path_join(
web_app.settings["base_url"], "/jupyterlab_code_formatter/version"
),
VersionAPIHandler,
)
],
)
def check_plugin_version(handler: APIHandler):
server_extension_version = pkg_resources.get_distribution(
"jupyterlab_code_formatter"
).version
lab_extension_version = handler.request.headers.get("Plugin-Version")
version_matches = server_extension_version == lab_extension_version
if not version_matches:
handler.set_status(
422,
f"Mismatched versions of server extension ({server_extension_version}) "
f"and lab extension ({lab_extension_version}). "
f"Please ensure they are the same.",
)
handler.finish()
return version_matches
class FormattersAPIHandler(APIHandler):
def get(self) -> None:
"""Show what formatters are installed and avaliable."""
if check_plugin_version(self):
self.finish(
json.dumps(
{
"formatters": {
name: {
"enabled": formatter.importable,
"label": formatter.label,
}
for name, formatter in SERVER_FORMATTERS.items()
}
}
)
)
class FormatAPIHandler(APIHandler):
def post(self) -> None:
if check_plugin_version(self):
data = json.loads(self.request.body.decode("utf-8"))
formatter_instance = SERVER_FORMATTERS.get(data["formatter"])
if formatter_instance is None or not formatter_instance.importable:
self.set_status(404, f"Formatter {data['formatter']} not found!")
self.finish()
else:
notebook = data["notebook"]
options = data.get("options", {})
formatted_code = []
for code in data["code"]:
try:
formatted_code.append(
{
"code": formatter_instance.format_code(
code, notebook, **options
)
}
)
except Exception as e:
formatted_code.append({"error": str(e)})
self.finish(json.dumps({"code": formatted_code}))
class VersionAPIHandler(APIHandler):
def get(self) -> None:
"""Show what version is this server plguin on."""
self.finish(
json.dumps(
{
"version": pkg_resources.get_distribution(
"jupyterlab_code_formatter"
).version
}
)
)