1- """
2- WIP.
3-
4- This file just contains interfaces to be filled out later.
5- """
6-
1+ from __future__ import annotations
72from .yroom import YRoom
3+ from typing import TYPE_CHECKING
4+
5+ if TYPE_CHECKING :
6+ import asyncio
7+ import logging
8+ from typing import Callable
9+ from jupyter_server_fileid .manager import BaseFileIdManager
10+ from jupyter_server .services .contents .manager import AsyncContentsManager , ContentsManager
811
912class YRoomManager :
1013 _rooms_by_id : dict [str , YRoom ]
1114
12- def __init__ (self ):
15+ def __init__ (
16+ self ,
17+ * ,
18+ get_fileid_manager : Callable [[], BaseFileIdManager ],
19+ contents_manager : AsyncContentsManager | ContentsManager ,
20+ loop : asyncio .AbstractEventLoop ,
21+ log : logging .Logger ,
22+ ):
23+ # Bind instance attributes
24+ self ._get_fileid_manager = get_fileid_manager
25+ self .contents_manager = contents_manager
26+ self .loop = loop
27+ self .log = log
28+
29+ # Initialize dictionary of YRooms, keyed by room ID
1330 self ._rooms_by_id = {}
1431
32+
33+ @property
34+ def fileid_manager (self ) -> BaseFileIdManager :
35+ return self ._get_fileid_manager ()
36+
37+
1538 def get_room (self , room_id : str ) -> YRoom | None :
16- # TODO
17- return None
39+ """
40+ Retrieves a YRoom given a room ID. If the YRoom does not exist, this
41+ method will initialize a new YRoom.
42+ """
43+
44+ # If room exists, then return it immediately
45+ if room_id in self ._rooms_by_id :
46+ return self ._rooms_by_id [room_id ]
47+
48+ # Otherwise, create a new room
49+ try :
50+ yroom = YRoom (
51+ room_id = room_id ,
52+ log = self .log ,
53+ loop = self .loop ,
54+ fileid_manager = self .fileid_manager ,
55+ contents_manager = self .contents_manager ,
56+ )
57+ self ._rooms_by_id [room_id ] = yroom
58+ return yroom
59+ except Exception as e :
60+ self .log .error (
61+ f"Unable to initialize YRoom '{ room_id } '." ,
62+ exc_info = True
63+ )
64+ return None
65+
66+
67+ def delete_room (self , room_id : str ) -> None :
68+ """
69+ Deletes a YRoom given a room ID.
70+
71+ TODO: finish implementing YRoom.stop(), and delete empty rooms w/ no
72+ live kernels automatically in a background task.
73+ """
74+ yroom = self ._rooms_by_id .get (room_id , None )
75+ if not yroom :
76+ return
1877
19- def delete_room (self , room : YRoom ) -> None :
20- # TODO
21- return
78+ yroom .stop ()
79+ del self ._rooms_by_id [room_id ]
0 commit comments