@@ -63,7 +63,7 @@ class LabHandler(ExtensionHandlerJinjaMixin, ExtensionHandlerMixin, JupyterHandl
63
63
def initialize (self , name , lab_config = {}):
64
64
super ().initialize (name )
65
65
self .lab_config = lab_config
66
-
66
+
67
67
@web .authenticated
68
68
@web .removeslash
69
69
def get (self , mode = None , workspace = None , tree = None ):
@@ -82,8 +82,12 @@ def get(self, mode = None, workspace = None, tree = None):
82
82
server_root = server_root .replace (os .sep , '/' )
83
83
base_url = self .settings .get ('base_url' )
84
84
85
+ # Remove the trailing slash for compatibiity with html-webpack-plugin.
86
+ full_static_url = self .static_url_prefix .rstrip ('/' )
87
+ page_config .setdefault ('fullStaticUrl' , full_static_url )
88
+
85
89
page_config .setdefault ('terminalsAvailable' , terminals )
86
- page_config .setdefault ('ignorePlugins' , [])
90
+ page_config .setdefault ('ignorePlugins' , [])
87
91
page_config .setdefault ('serverRoot' , server_root )
88
92
page_config ['store_id' ] = self .application .store_id
89
93
self .application .store_id += 1
@@ -97,13 +101,13 @@ def get(self, mode = None, workspace = None, tree = None):
97
101
page_config .setdefault ('fullMathjaxUrl' , mathjax_url )
98
102
99
103
# Add parameters parsed from the URL
100
- if mode == 'doc' :
104
+ if mode == 'doc' :
101
105
page_config ['mode' ] = 'single-document'
102
106
else :
103
107
page_config ['mode' ] = 'multiple-document'
104
108
page_config ['workspace' ] = workspace
105
109
page_config ['treePath' ] = tree_path
106
-
110
+
107
111
# Put all our config in page_config
108
112
for name in config .trait_names ():
109
113
page_config [_camelCase (name )] = getattr (app , name )
@@ -159,9 +163,6 @@ class LabConfig(HasTraits):
159
163
'If given, a static file handler will be '
160
164
'added.' ))
161
165
162
- static_url = Unicode (help = ('The url path for static application '
163
- 'assets. This can be a CDN if desired.' ))
164
-
165
166
166
167
labextensions_url = Unicode ('' , help = 'The url for dynamic JupyterLab extensions' )
167
168
@@ -193,7 +194,7 @@ class LabConfig(HasTraits):
193
194
'for themes.' ))
194
195
195
196
translations_api_url = Unicode (help = 'The url path of the translations handler.' )
196
-
197
+
197
198
tree_url = Unicode (help = 'The url path of the tree handler.' )
198
199
199
200
cache_files = Bool (True ,
@@ -204,10 +205,6 @@ class LabConfig(HasTraits):
204
205
def _default_template_dir (self ):
205
206
return DEFAULT_TEMPLATE_PATH
206
207
207
- @default ('static_url' )
208
- def _default_static_url (self ):
209
- return ujoin ('static/' , self .app_namespace )
210
-
211
208
@default ('labextensions_url' )
212
209
def _default_labextensions_url (self ):
213
210
return ujoin (self .app_url , "extensions/" )
@@ -239,7 +236,7 @@ def _default_themes_url(self):
239
236
@default ('tree_url' )
240
237
def _default_tree_url (self ):
241
238
return ujoin (self .app_url , 'tree/' )
242
-
239
+
243
240
@default ('translations_api_url' )
244
241
def _default_translations_api_url (self ):
245
242
return ujoin (self .app_url , 'api' , 'translations/' )
@@ -257,83 +254,82 @@ def render_template(self, name, **ns):
257
254
return super ().render_template (name , ** ns )
258
255
259
256
260
- def add_handlers (handlers , app ):
257
+ def add_handlers (handlers , extension_app ):
261
258
"""Add the appropriate handlers to the web app.
262
259
"""
263
260
# Normalize directories.
264
261
for name in LabConfig .class_trait_names ():
265
262
if not name .endswith ('_dir' ):
266
263
continue
267
- value = getattr (app , name )
268
- setattr (app , name , value .replace (os .sep , '/' ))
264
+ value = getattr (extension_app , name )
265
+ setattr (extension_app , name , value .replace (os .sep , '/' ))
269
266
270
267
# Normalize urls
271
268
# Local urls should have a leading slash but no trailing slash
272
269
for name in LabConfig .class_trait_names ():
273
270
if not name .endswith ('_url' ):
274
271
continue
275
- value = getattr (app , name )
272
+ value = getattr (extension_app , name )
276
273
if is_url (value ):
277
274
continue
278
275
if not value .startswith ('/' ):
279
276
value = '/' + value
280
277
if value .endswith ('/' ):
281
278
value = value [:- 1 ]
282
- setattr (app , name , value )
279
+ setattr (extension_app , name , value )
283
280
284
- url_pattern = MASTER_URL_PATTERN .format (app .app_url .replace ('/' , '' ))
285
- lab_path = ujoin (app .settings .get ('base_url' ), url_pattern )
286
- handlers .append ((lab_path , LabHandler , {'lab_config' : app }))
281
+ url_pattern = MASTER_URL_PATTERN .format (extension_app .app_url .replace ('/' , '' ))
282
+ handlers .append ((url_pattern , LabHandler , {'lab_config' : extension_app }))
287
283
288
284
# Cache all or none of the files depending on the `cache_files` setting.
289
- no_cache_paths = [] if app .cache_files else ['/' ]
285
+ no_cache_paths = [] if extension_app .cache_files else ['/' ]
290
286
291
287
# Handle dynamic lab extensions.
292
- labextensions_path = app .extra_labextensions_path + app .labextensions_path
293
- labextensions_url = ujoin (app .labextensions_url , "(.*)" )
288
+ labextensions_path = extension_app .extra_labextensions_path + extension_app .labextensions_path
289
+ labextensions_url = ujoin (extension_app .labextensions_url , "(.*)" )
294
290
handlers .append (
295
291
(labextensions_url , FileFindHandler , {
296
292
'path' : labextensions_path ,
297
293
'no_cache_paths' : ['/' ], # don't cache anything in labextensions
298
294
}))
299
295
300
296
# Handle local settings.
301
- if app .schemas_dir :
297
+ if extension_app .schemas_dir :
302
298
settings_config = {
303
- 'app_settings_dir' : app .app_settings_dir ,
304
- 'schemas_dir' : app .schemas_dir ,
305
- 'settings_dir' : app .user_settings_dir ,
299
+ 'app_settings_dir' : extension_app .app_settings_dir ,
300
+ 'schemas_dir' : extension_app .schemas_dir ,
301
+ 'settings_dir' : extension_app .user_settings_dir ,
306
302
'labextensions_path' : labextensions_path
307
303
}
308
304
309
305
# Handle requests for the list of settings. Make slash optional.
310
- settings_path = ujoin (app .settings_url , '?' )
306
+ settings_path = ujoin (extension_app .settings_url , '?' )
311
307
handlers .append ((settings_path , SettingsHandler , settings_config ))
312
308
313
309
# Handle requests for an individual set of settings.
314
- setting_path = ujoin (app .settings_url , '(?P<schema_name>.+)' )
310
+ setting_path = ujoin (extension_app .settings_url , '(?P<schema_name>.+)' )
315
311
handlers .append ((setting_path , SettingsHandler , settings_config ))
316
312
317
313
# Handle saved workspaces.
318
- if app .workspaces_dir :
314
+ if extension_app .workspaces_dir :
319
315
320
316
workspaces_config = {
321
- 'path' : app .workspaces_dir
317
+ 'path' : extension_app .workspaces_dir
322
318
}
323
319
324
320
# Handle requests for the list of workspaces. Make slash optional.
325
- workspaces_api_path = ujoin (app .workspaces_api_url , '?' )
321
+ workspaces_api_path = ujoin (extension_app .workspaces_api_url , '?' )
326
322
handlers .append ((
327
323
workspaces_api_path , WorkspacesHandler , workspaces_config ))
328
324
329
325
# Handle requests for an individually named workspace.
330
- workspace_api_path = ujoin (app .workspaces_api_url , '(?P<space_name>.+)' )
326
+ workspace_api_path = ujoin (extension_app .workspaces_api_url , '(?P<space_name>.+)' )
331
327
handlers .append ((
332
328
workspace_api_path , WorkspacesHandler , workspaces_config ))
333
329
334
330
# Handle local listings.
335
331
336
- settings_config = app .settings .get ('config' , {}).get ('LabServerApp' , {})
332
+ settings_config = extension_app .settings .get ('config' , {}).get ('LabServerApp' , {})
337
333
blocked_extensions_uris = settings_config .get ('blocked_extensions_uris' , '' )
338
334
allowed_extensions_uris = settings_config .get ('allowed_extensions_uris' , '' )
339
335
@@ -344,8 +340,7 @@ def add_handlers(handlers, app):
344
340
345
341
ListingsHandler .listings_refresh_seconds = settings_config .get ('listings_refresh_seconds' , 60 * 60 )
346
342
ListingsHandler .listings_request_opts = settings_config .get ('listings_request_options' , {})
347
- base_url = app .settings .get ('base_url' )
348
- listings_url = ujoin (base_url , app .listings_url )
343
+ listings_url = ujoin (extension_app .listings_url )
349
344
listings_path = ujoin (listings_url , '(.*)' )
350
345
351
346
if blocked_extensions_uris :
@@ -367,34 +362,34 @@ def add_handlers(handlers, app):
367
362
handlers .append ((listings_path , ListingsHandler , {}))
368
363
369
364
# Handle local themes.
370
- if app .themes_dir :
371
- themes_url = app .themes_url
365
+ if extension_app .themes_dir :
366
+ themes_url = extension_app .themes_url
372
367
themes_path = ujoin (themes_url , '(.*)' )
373
368
handlers .append ((
374
369
themes_path ,
375
370
ThemesHandler ,
376
371
{
377
372
'themes_url' : themes_url ,
378
- 'path' : app .themes_dir ,
373
+ 'path' : extension_app .themes_dir ,
379
374
'labextensions_path' : labextensions_path ,
380
375
'no_cache_paths' : no_cache_paths
381
376
}
382
377
))
383
378
384
379
# Handle translations.
385
- if app .translations_api_url :
380
+ if extension_app .translations_api_url :
386
381
# Handle requests for the list of language packs available.
387
382
# Make slash optional.
388
- translations_path = ujoin (base_url , app .translations_api_url , '?' )
389
- handlers .append ((translations_path , TranslationsHandler , {'lab_config' : app }))
383
+ translations_path = ujoin (extension_app .translations_api_url , '?' )
384
+ handlers .append ((translations_path , TranslationsHandler , {'lab_config' : extension_app }))
390
385
391
386
# Handle requests for an individual language pack.
392
387
translations_lang_path = ujoin (
393
- base_url , app .translations_api_url , '(?P<locale>.*)' )
394
- handlers .append ((translations_lang_path , TranslationsHandler , {'lab_config' : app }))
388
+ extension_app .translations_api_url , '(?P<locale>.*)' )
389
+ handlers .append ((translations_lang_path , TranslationsHandler , {'lab_config' : extension_app }))
395
390
396
391
# Let the lab handler act as the fallthrough option instead of a 404.
397
- fallthrough_url = ujoin (app .app_url , r'.*' )
392
+ fallthrough_url = ujoin (extension_app .app_url , r'.*' )
398
393
handlers .append ((fallthrough_url , NotFoundHandler ))
399
394
400
395
0 commit comments