19
19
Callable ,
20
20
Dict ,
21
21
Float ,
22
+ HasTraits ,
22
23
Instance ,
23
24
Int ,
24
25
List ,
35
36
from .rawsocket import RawSocketHandler , SuperviseAndRawSocketHandler
36
37
37
38
38
- class LauncherEntry (Configurable ):
39
+ class LauncherEntry (HasTraits ):
39
40
enabled = Bool (
40
41
True ,
41
42
help = """
@@ -151,9 +152,9 @@ class ServerProcess(Configurable):
151
152
[Instance (LauncherEntry ), Dict ()],
152
153
allow_none = False ,
153
154
help = """
154
- A dictionary of various options for entries in classic notebook / jupyterlab launchers.
155
+ Specify various options for entries in classic notebook / jupyterlab launchers.
155
156
156
- Keys recognized are :
157
+ Must be an instance of ``LauncherEntry`` or a dictionary with the following keys :
157
158
158
159
``enabled``
159
160
Set to True (default) to make an entry in the launchers. Set to False to have no
@@ -178,9 +179,14 @@ class ServerProcess(Configurable):
178
179
179
180
@validate ("launcher_entry" )
180
181
def _validate_launcher_entry (self , proposal ):
181
- kwargs = {"title" : self .name , "path_info" : self .name + "/" }
182
- kwargs .update (proposal ["value" ])
183
- return LauncherEntry (** kwargs )
182
+ if isinstance (proposal ["value" ], LauncherEntry ):
183
+ proposal ["value" ].title = self .name
184
+ proposal ["value" ].path_info = self .name + "/"
185
+ return proposal ["value" ]
186
+ else :
187
+ kwargs = {"title" : self .name , "path_info" : self .name + "/" }
188
+ kwargs .update (proposal ["value" ])
189
+ return LauncherEntry (** kwargs )
184
190
185
191
@default ("launcher_entry" )
186
192
def _default_launcher_entry (self ):
@@ -341,17 +347,17 @@ def get_timeout(self):
341
347
return _Proxy , proxy_kwargs
342
348
343
349
344
- def get_entrypoint_server_processes (serverproxy_config ):
345
- sps = []
350
+ def get_entrypoint_server_processes ():
351
+ processes = []
346
352
for entry_point in entry_points (group = "jupyter_serverproxy_servers" ):
347
353
name = entry_point .name
348
354
try :
349
355
server_process_config = entry_point .load ()()
350
356
except Exception as e :
351
357
warn (f"entry_point { name } was unable to be loaded: { str (e )} " )
352
358
continue
353
- sps .append (make_server_process (name , server_process_config , serverproxy_config ))
354
- return sps
359
+ processes .append (ServerProcess (name = name , ** server_process_config ))
360
+ return processes
355
361
356
362
357
363
def make_handlers (base_url : str , server_processes : list [ServerProcess ]):
@@ -384,20 +390,36 @@ def _serverproxy_servers_help():
384
390
385
391
class ServerProxy (Configurable ):
386
392
servers = Dict (
387
- {},
393
+ key_trait = Unicode (),
394
+ value_trait = Union ([Dict (), Instance (ServerProcess )]),
388
395
help = """
389
396
Dictionary of processes to supervise & proxy.
390
397
391
398
Key should be the name of the process. This is also used by default as
392
399
the URL prefix, and all requests matching this prefix are routed to this process.
393
400
394
- Value should be a dictionary with the following keys:
401
+ Value should be an instance of ``ServerProcess`` or a dictionary with the following keys:
395
402
396
403
"""
397
404
+ indent (_serverproxy_servers_help (), " " ),
398
405
config = True ,
399
406
)
400
407
408
+ @validate ("servers" )
409
+ def _validate_servers (self , proposal ):
410
+ servers = {}
411
+
412
+ for name , server_process in proposal ["value" ].items ():
413
+ if isinstance (server_process , ServerProcess ):
414
+ server_process .name = server_process .name or name
415
+ servers [name ] = server_process
416
+ else :
417
+ kwargs = {"name" : name }
418
+ kwargs .update (** server_process )
419
+ servers [name ] = ServerProcess (** kwargs )
420
+
421
+ return servers
422
+
401
423
non_service_rewrite_response = Union (
402
424
default_value = tuple (),
403
425
trait_types = [List (), Tuple (), Callable ()],
0 commit comments