Source code for openlifu.cloud.filesystem_observer
from __future__ import annotations
from pathlib import Path
from typing import Callable
from watchdog.events import (
DirCreatedEvent,
DirDeletedEvent,
DirModifiedEvent,
DirMovedEvent,
FileCreatedEvent,
FileDeletedEvent,
FileModifiedEvent,
FileMovedEvent,
FileSystemEventHandler,
)
from watchdog.observers import Observer
from openlifu.cloud.utils import logger_cloud
[docs]
class FilesystemObserver(FileSystemEventHandler):
def __init__(self, changed_path_callback: Callable[[Path], None]):
self._observer: Observer | None = None
self._changed_path_callback = changed_path_callback
self._running = False
def start(self, db_path: Path):
if self._running:
return
self._running = True
self._observer = Observer()
self._observer.daemon = False
self._observer.schedule(self, db_path, recursive=True)
self._observer.start()
def stop(self):
if self._running:
self._running = False
self._observer.stop()
self._observer.unschedule_all()
self._observer = None
[docs]
def on_moved(self, event: DirMovedEvent | FileMovedEvent) -> None:
"""Called when a file or a directory is moved or renamed.
:param event:
Event representing file/directory movement.
:type event:
:class:`DirMovedEvent` or :class:`FileMovedEvent`
"""
if event.dest_path not in ('', event.src_path):
logger_cloud.debug(f"FS_DEBUG: on_moved: {event.dest_path}\n")
self._changed_path_callback(Path(event.dest_path))
logger_cloud.debug(f"FS_DEBUG: on_moved: {event.src_path}\n")
self._changed_path_callback(Path(event.src_path))
[docs]
def on_created(self, event: DirCreatedEvent | FileCreatedEvent) -> None:
"""Called when a file or directory is created.
:param event:
Event representing file/directory creation.
:type event:
:class:`DirCreatedEvent` or :class:`FileCreatedEvent`
"""
logger_cloud.debug(f"FS_DEBUG: on_created: {event.src_path}\n")
self._changed_path_callback(Path(event.src_path))
[docs]
def on_deleted(self, event: DirDeletedEvent | FileDeletedEvent) -> None:
"""Called when a file or directory is deleted.
:param event:
Event representing file/directory deletion.
:type event:
:class:`DirDeletedEvent` or :class:`FileDeletedEvent`
"""
logger_cloud.debug(f"FS_DEBUG: on_deleted: {event.src_path}\n")
self._changed_path_callback(Path(event.src_path))
[docs]
def on_modified(self, event: DirModifiedEvent | FileModifiedEvent) -> None:
"""Called when a file or directory is modified.
:param event:
Event representing file/directory modification.
:type event:
:class:`DirModifiedEvent` or :class:`FileModifiedEvent`
"""
logger_cloud.debug(f"FS_DEBUG: on_modified: {event.src_path}\n")
self._changed_path_callback(Path(event.src_path))