1919 Callable ,
2020 Dict ,
2121 Float ,
22+ HasTraits ,
2223 Instance ,
2324 Int ,
2425 List ,
3536from .rawsocket import RawSocketHandler , SuperviseAndRawSocketHandler
3637
3738
38- class LauncherEntry (Configurable ):
39+ class LauncherEntry (HasTraits ):
3940 enabled = Bool (
4041 True ,
4142 help = """
@@ -151,9 +152,9 @@ class ServerProcess(Configurable):
151152 [Instance (LauncherEntry ), Dict ()],
152153 allow_none = False ,
153154 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.
155156
156- Keys recognized are :
157+ Must be an instance of ``LauncherEntry`` or a dictionary with the following keys :
157158
158159 ``enabled``
159160 Set to True (default) to make an entry in the launchers. Set to False to have no
@@ -178,9 +179,14 @@ class ServerProcess(Configurable):
178179
179180 @validate ("launcher_entry" )
180181 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 )
184190
185191 @default ("launcher_entry" )
186192 def _default_launcher_entry (self ):
@@ -341,17 +347,17 @@ def get_timeout(self):
341347 return _Proxy , proxy_kwargs
342348
343349
344- def get_entrypoint_server_processes (serverproxy_config ):
345- sps = []
350+ def get_entrypoint_server_processes ():
351+ processes = []
346352 for entry_point in entry_points (group = "jupyter_serverproxy_servers" ):
347353 name = entry_point .name
348354 try :
349355 server_process_config = entry_point .load ()()
350356 except Exception as e :
351357 warn (f"entry_point { name } was unable to be loaded: { str (e )} " )
352358 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
355361
356362
357363def make_handlers (base_url : str , server_processes : list [ServerProcess ]):
@@ -384,20 +390,36 @@ def _serverproxy_servers_help():
384390
385391class ServerProxy (Configurable ):
386392 servers = Dict (
387- {},
393+ key_trait = Unicode (),
394+ value_trait = Union ([Dict (), Instance (ServerProcess )]),
388395 help = """
389396 Dictionary of processes to supervise & proxy.
390397
391398 Key should be the name of the process. This is also used by default as
392399 the URL prefix, and all requests matching this prefix are routed to this process.
393400
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:
395402
396403 """
397404 + indent (_serverproxy_servers_help (), " " ),
398405 config = True ,
399406 )
400407
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+
401423 non_service_rewrite_response = Union (
402424 default_value = tuple (),
403425 trait_types = [List (), Tuple (), Callable ()],
0 commit comments