|
1 | 1 | """ A configurable frontend for stdio-based Language Servers |
2 | 2 | """ |
3 | 3 | import os |
| 4 | +import sys |
4 | 5 | import traceback |
5 | 6 | from typing import Dict, Text, Tuple, cast |
6 | 7 |
|
7 | | -import entrypoints |
| 8 | +# See compatibility note on `group` keyword in |
| 9 | +# https://docs.python.org/3/library/importlib.metadata.html#entry-points |
| 10 | +if sys.version_info < (3, 10): # pragma: no cover |
| 11 | + from importlib_metadata import entry_points |
| 12 | +else: # pragma: no cover |
| 13 | + from importlib.metadata import entry_points |
| 14 | + |
8 | 15 | from jupyter_core.paths import jupyter_config_path |
9 | 16 | from jupyter_server.services.config import ConfigManager |
10 | 17 |
|
@@ -158,13 +165,11 @@ def init_listeners(self): |
158 | 165 | for scope, trt_ep in scopes.items(): |
159 | 166 | listeners, entry_point = trt_ep |
160 | 167 |
|
161 | | - for ep_name, ept in entrypoints.get_group_named( |
162 | | - entry_point |
163 | | - ).items(): # pragma: no cover |
| 168 | + for ept in entry_points(group=entry_point): # pragma: no cover |
164 | 169 | try: |
165 | 170 | listeners.append(ept.load()) |
166 | 171 | except Exception as err: |
167 | | - self.log.warning("Failed to load entry point %s: %s", ep_name, err) |
| 172 | + self.log.warning("Failed to load entry point %s: %s", ept.name, err) |
168 | 173 |
|
169 | 174 | for listener in listeners: |
170 | 175 | self.__class__.register_message_listener(scope=scope.value)(listener) |
@@ -226,22 +231,22 @@ def unsubscribe(self, handler): |
226 | 231 | session.handlers = [h for h in session.handlers if h != handler] |
227 | 232 |
|
228 | 233 | def _autodetect_language_servers(self, only_installed: bool): |
229 | | - entry_points = {} |
| 234 | + _entry_points = None |
230 | 235 |
|
231 | 236 | try: |
232 | | - entry_points = entrypoints.get_group_named(EP_SPEC_V1) |
| 237 | + _entry_points = entry_points(group=EP_SPEC_V1) |
233 | 238 | except Exception: # pragma: no cover |
234 | 239 | self.log.exception("Failed to load entry_points") |
235 | 240 |
|
236 | 241 | skipped_servers = [] |
237 | 242 |
|
238 | | - for ep_name, ep in entry_points.items(): |
| 243 | + for ep in _entry_points or []: |
239 | 244 | try: |
240 | 245 | spec_finder = ep.load() # type: SpecMaker |
241 | 246 | except Exception as err: # pragma: no cover |
242 | 247 | self.log.warning( |
243 | 248 | _("Failed to load language server spec finder `{}`: \n{}").format( |
244 | | - ep_name, err |
| 249 | + ep.name, err |
245 | 250 | ) |
246 | 251 | ) |
247 | 252 | continue |
|
0 commit comments