44import json
55import logging
66import traceback
7- from typing import Optional
7+ from typing import Optional , Tuple , Union
88
9- from jupyter_server .base .handlers import APIHandler
9+ from jupyter_server .base .handlers import APIHandler , path_regex
1010from jupyter_server .utils import url_path_join
1111import tornado
1212import traitlets
@@ -42,27 +42,56 @@ def write_error(self, status_code, **kwargs):
4242 reply ["error" ] = "" .join (traceback .format_exception (* exc_info ))
4343 self .finish (json .dumps (reply ))
4444
45- class ListJupyterDrives (JupyterDrivesAPIHandler ):
45+ class ListJupyterDrivesHandler (JupyterDrivesAPIHandler ):
4646 """
47- Returns list of available drives.
47+ List available drives. Mounts drives.
4848 """
4949 def initialize (self , logger : logging .Logger , manager : JupyterDrivesManager ):
5050 return super ().initialize (logger , manager )
5151
5252 # Later on, filters can be added for the listing
5353 @tornado .web .authenticated
5454 async def get (self ):
55- drives , error = await self ._manager .list_drives ()
56- self .finish (json .dumps (drives ))
57- self ._jp_log .debug (error )
55+ result = await self ._manager .list_drives ()
56+ self .finish (json .dumps (result ))
57+
58+ @tornado .web .authenticated
59+ async def post (self ):
60+ body = self .get_json_body ()
61+ result = await self ._manager .mount_drive (** body )
62+ self .finish (json .dump (result .message ))
63+
64+ class ContentsJupyterDrivesHandler (JupyterDrivesAPIHandler ):
65+ """
66+ Deals with contents of a drive.
67+ """
68+ @tornado .web .authenticated
69+ async def get (self , path : str = "" , drive : str = "" ):
70+ result = await self ._manager .get_contents (drive , path )
71+ self .finish (json .dump (result ))
72+
73+ @tornado .web .authenticated
74+ async def post (self , path : str = "" , drive : str = "" ):
75+ result = await self ._manager .new_file (drive , path )
76+ self .finish (json .dump (result ))
77+
78+ @tornado .web .authenticated
79+ async def patch (self , path : str = "" , drive : str = "" ):
80+ body = self .get_json_body ()
81+ result = await self ._manager .rename_file (drive , path , ** body )
82+ self .finish (json .dump (result ))
83+
84+ handlers = [
85+ ("drives" , ListJupyterDrivesHandler )
86+ ]
5887
59- default_handlers = [
60- ("drives" , ListJupyterDrives )
88+ handlers_with_path = [
89+ ("drives" , ContentsJupyterDrivesHandler )
6190]
6291
6392def setup_handlers (web_app : tornado .web .Application , config : traitlets .config .Config , log : Optional [logging .Logger ] = None ):
6493 host_pattern = ".*$"
65- base_url = url_path_join ( web_app .settings ["base_url" ], NAMESPACE )
94+ base_url = web_app .settings ["base_url" ]
6695
6796 log = log or logging .getLogger (__name__ )
6897
@@ -80,15 +109,26 @@ def setup_handlers(web_app: tornado.web.Application, config: traitlets.config.Co
80109 logging .error ("JupyterDrives Manager Exception" , exc_info = 1 )
81110 raise err
82111
83- handlers = [
84- (
85- url_path_join (base_url , pattern ),
86- handler ,
87- {"logger" : log , "manager" : manager }
88- )
89- for pattern , handler in default_handlers
90- ]
112+ drives_handlers = (
113+ [
114+ (
115+ url_path_join (base_url , NAMESPACE , pattern ),
116+ handler ,
117+ {"logger" : log , "manager" : manager }
118+ )
119+ for pattern , handler in handlers
120+ ]
121+ + [
122+ (
123+ url_path_join (
124+ base_url , NAMESPACE , pattern , r"(?P<drive>\w+)" , path_regex
125+ ),
126+ handler ,
127+ )
128+ for pattern , handler in handlers_with_path
129+ ]
130+ )
91131
92- log .debug (f"Jupyter-Drives Handlers: { handlers } " )
132+ log .debug (f"Jupyter-Drives Handlers: { drives_handlers } " )
93133
94- web_app .add_handlers (host_pattern , handlers )
134+ web_app .add_handlers (host_pattern , drives_handlers )
0 commit comments