22# Copyright (c) Jupyter Development Team.
33# Distributed under the terms of the Modified BSD License.
44import os
5+ from typing import Any , Set , Tuple
56
67from overrides import overrides
7- from watchdog .events import FileMovedEvent , FileSystemEventHandler
8+ from watchdog .events import FileSystemEventHandler
89from watchdog .observers import Observer
910
1011from ..kernelspec_cache import KernelSpecCache , KernelSpecMonitorBase
1112
1213
13- class KernelSpecWatchdogMonitor (KernelSpecMonitorBase ):
14+ class KernelSpecWatchdogMonitor (KernelSpecMonitorBase ): # type:ignore[misc]
1415 """Watchdog handler that filters on specific files deemed representative of a kernel specification."""
1516
16- def __init__ (self , kernel_spec_cache : KernelSpecCache , ** kwargs ):
17+ def __init__ (self , kernel_spec_cache : KernelSpecCache , ** kwargs : Any ):
1718 """Initialize the handler."""
1819 super ().__init__ (** kwargs )
1920 self .kernel_spec_cache : KernelSpecCache = kernel_spec_cache
2021 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
2324
2425 @overrides
2526 def initialize (self ) -> None :
@@ -58,7 +59,7 @@ class WatchDogHandler(FileSystemEventHandler):
5859 # files in the future) should be added to this list - at which time it should become configurable.
5960 watched_files = ["kernel.json" ]
6061
61- def __init__ (self , monitor : "KernelSpecWatchdogMonitor" , ** kwargs ):
62+ def __init__ (self , monitor : "KernelSpecWatchdogMonitor" , ** kwargs : Any ):
6263 """Initialize the handler."""
6364 super ().__init__ (** kwargs )
6465 self .kernel_spec_cache = monitor .kernel_spec_cache
@@ -73,14 +74,6 @@ def dispatch(self, event):
7374 """
7475
7576 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-
8477 super ().dispatch (event )
8578
8679 def on_created (self , event ):
@@ -89,19 +82,18 @@ def on_created(self, event):
8982 This will trigger a call to the configured KernelSpecManager to fetch the instance
9083 associated with the created file, which is then added to the cache.
9184 """
92- kernel_name = event .src_kernel_name
85+ resource_dir , kernel_name = WatchDogHandler . _extract_info ( event .src_path )
9386 try :
9487 kernelspec = self .kernel_spec_cache .kernel_spec_manager .get_kernel_spec (kernel_name )
9588 self .kernel_spec_cache .put_item (kernel_name , kernelspec )
9689 except Exception as e :
9790 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 } )"
10092 )
10193
10294 def on_deleted (self , event ):
10395 """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 )
10597 self .kernel_spec_cache .remove_item (kernel_name )
10698
10799 def on_modified (self , event ):
@@ -110,14 +102,13 @@ def on_modified(self, event):
110102 This will trigger a call to the configured KernelSpecManager to fetch the instance
111103 associated with the modified file, which is then replaced in the cache.
112104 """
113- kernel_name = event .src_kernel_name
105+ resource_dir , kernel_name = WatchDogHandler . _extract_info ( event .src_path )
114106 try :
115107 kernelspec = self .kernel_spec_cache .kernel_spec_manager .get_kernel_spec (kernel_name )
116108 self .kernel_spec_cache .put_item (kernel_name , kernelspec )
117109 except Exception as e :
118110 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 } )"
121112 )
122113
123114 def on_moved (self , event ):
@@ -126,8 +117,15 @@ def on_moved(self, event):
126117 This will trigger the update of the existing cached item, replacing its resource_dir entry
127118 with that of the new destination.
128119 """
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 )
131122 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