2
2
# Copyright (c) Jupyter Development Team.
3
3
# Distributed under the terms of the Modified BSD License.
4
4
import os
5
+ from typing import Any , Set , Tuple
5
6
6
7
from overrides import overrides
7
- from watchdog .events import FileMovedEvent , FileSystemEventHandler
8
+ from watchdog .events import FileSystemEventHandler
8
9
from watchdog .observers import Observer
9
10
10
11
from ..kernelspec_cache import KernelSpecCache , KernelSpecMonitorBase
11
12
12
13
13
- class KernelSpecWatchdogMonitor (KernelSpecMonitorBase ):
14
+ class KernelSpecWatchdogMonitor (KernelSpecMonitorBase ): # type:ignore[misc]
14
15
"""Watchdog handler that filters on specific files deemed representative of a kernel specification."""
15
16
16
- def __init__ (self , kernel_spec_cache : KernelSpecCache , ** kwargs ):
17
+ def __init__ (self , kernel_spec_cache : KernelSpecCache , ** kwargs : Any ):
17
18
"""Initialize the handler."""
18
19
super ().__init__ (** kwargs )
19
20
self .kernel_spec_cache : KernelSpecCache = kernel_spec_cache
20
21
self .kernel_spec_manager = self .kernel_spec_cache .kernel_spec_manager
21
- self .observed_dirs = set () # Tracks which directories are being watched
22
- self .observer = None
22
+ self .observed_dirs : Set [ str ] = set () # Tracks which directories are being watched
23
+ self .observer : Any = None
23
24
24
25
@overrides
25
26
def initialize (self ) -> None :
@@ -58,7 +59,7 @@ class WatchDogHandler(FileSystemEventHandler):
58
59
# files in the future) should be added to this list - at which time it should become configurable.
59
60
watched_files = ["kernel.json" ]
60
61
61
- def __init__ (self , monitor : "KernelSpecWatchdogMonitor" , ** kwargs ):
62
+ def __init__ (self , monitor : "KernelSpecWatchdogMonitor" , ** kwargs : Any ):
62
63
"""Initialize the handler."""
63
64
super ().__init__ (** kwargs )
64
65
self .kernel_spec_cache = monitor .kernel_spec_cache
@@ -73,14 +74,6 @@ def dispatch(self, event):
73
74
"""
74
75
75
76
if os .path .basename (event .src_path ) in self .watched_files :
76
- src_resource_dir = os .path .dirname (event .src_path )
77
- event .src_resource_dir = src_resource_dir
78
- event .src_kernel_name = os .path .basename (src_resource_dir )
79
- if type (event ) is FileMovedEvent :
80
- dest_resource_dir = os .path .dirname (event .dest_path )
81
- event .dest_resource_dir = dest_resource_dir
82
- event .dest_kernel_name = os .path .basename (dest_resource_dir )
83
-
84
77
super ().dispatch (event )
85
78
86
79
def on_created (self , event ):
@@ -89,19 +82,18 @@ def on_created(self, event):
89
82
This will trigger a call to the configured KernelSpecManager to fetch the instance
90
83
associated with the created file, which is then added to the cache.
91
84
"""
92
- kernel_name = event .src_kernel_name
85
+ resource_dir , kernel_name = WatchDogHandler . _extract_info ( event .src_path )
93
86
try :
94
87
kernelspec = self .kernel_spec_cache .kernel_spec_manager .get_kernel_spec (kernel_name )
95
88
self .kernel_spec_cache .put_item (kernel_name , kernelspec )
96
89
except Exception as e :
97
90
self .log .warning (
98
- "The following exception occurred creating cache entry for: {src_resource_dir} "
99
- "- continuing... ({e})" .format (src_resource_dir = event .src_resource_dir , e = e )
91
+ f"The following exception occurred creating cache entry for: { resource_dir } - continuing... ({ e } )"
100
92
)
101
93
102
94
def on_deleted (self , event ):
103
95
"""Fires when a watched file is deleted, triggering a removal of the corresponding item from the cache."""
104
- kernel_name = event .src_kernel_name
96
+ _ , kernel_name = WatchDogHandler . _extract_info ( event .src_path )
105
97
self .kernel_spec_cache .remove_item (kernel_name )
106
98
107
99
def on_modified (self , event ):
@@ -110,14 +102,13 @@ def on_modified(self, event):
110
102
This will trigger a call to the configured KernelSpecManager to fetch the instance
111
103
associated with the modified file, which is then replaced in the cache.
112
104
"""
113
- kernel_name = event .src_kernel_name
105
+ resource_dir , kernel_name = WatchDogHandler . _extract_info ( event .src_path )
114
106
try :
115
107
kernelspec = self .kernel_spec_cache .kernel_spec_manager .get_kernel_spec (kernel_name )
116
108
self .kernel_spec_cache .put_item (kernel_name , kernelspec )
117
109
except Exception as e :
118
110
self .log .warning (
119
- "The following exception occurred updating cache entry for: {src_resource_dir} "
120
- "- continuing... ({e})" .format (src_resource_dir = event .src_resource_dir , e = e )
111
+ f"The following exception occurred updating cache entry for: { resource_dir } - continuing... ({ e } )"
121
112
)
122
113
123
114
def on_moved (self , event ):
@@ -126,8 +117,15 @@ def on_moved(self, event):
126
117
This will trigger the update of the existing cached item, replacing its resource_dir entry
127
118
with that of the new destination.
128
119
"""
129
- src_kernel_name = event .src_kernel_name
130
- dest_kernel_name = event .dest_kernel_name
120
+ _ , src_kernel_name = WatchDogHandler . _extract_info ( event .src_path )
121
+ dest_resource_dir , dest_kernel_name = WatchDogHandler . _extract_info ( event .dest_path )
131
122
cache_item = self .kernel_spec_cache .remove_item (src_kernel_name )
132
- cache_item ["resource_dir" ] = event .dest_resource_dir
133
- self .kernel_spec_cache .put_item (dest_kernel_name , cache_item )
123
+ if cache_item is not None :
124
+ cache_item ["resource_dir" ] = dest_resource_dir
125
+ self .kernel_spec_cache .put_item (dest_kernel_name , cache_item )
126
+
127
+ @staticmethod
128
+ def _extract_info (dir_name : str ) -> Tuple [str , str ]:
129
+ """Extracts the resource directory and kernel_name from the given dir_name."""
130
+ resource_dir : str = os .path .dirname (dir_name ) # includes kernel_name
131
+ return resource_dir , os .path .basename (resource_dir )
0 commit comments