src/eric7/EricCore/EricFileSystemWatcher.py

Thu, 16 May 2024 15:09:59 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 16 May 2024 15:09:59 +0200
branch
eric7
changeset 10712
5b9dd8e4c43a
parent 10685
a9134b4e8ed0
child 10730
454f6ff4e1cd
permissions
-rw-r--r--

Fixed a macOS specific issue in the EricFileSystemWatcher caused by the default watchdog observer not firing. Switched to using the kqueue based observer.
(see issue 561)

10679
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de>
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a QFileSystemWatcher replacement based on the 'watchdog' package.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import os
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 from PyQt6.QtCore import QObject, pyqtSignal, pyqtSlot
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 from watchdog.events import EVENT_TYPE_CLOSED, EVENT_TYPE_OPENED, FileSystemEventHandler
10712
5b9dd8e4c43a Fixed a macOS specific issue in the EricFileSystemWatcher caused by the default watchdog observer not firing. Switched to using the kqueue based observer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10685
diff changeset
14
5b9dd8e4c43a Fixed a macOS specific issue in the EricFileSystemWatcher caused by the default watchdog observer not firing. Switched to using the kqueue based observer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10685
diff changeset
15 from eric7.SystemUtilities import OSUtilities
5b9dd8e4c43a Fixed a macOS specific issue in the EricFileSystemWatcher caused by the default watchdog observer not firing. Switched to using the kqueue based observer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10685
diff changeset
16 if OSUtilities.isMacPlatform():
5b9dd8e4c43a Fixed a macOS specific issue in the EricFileSystemWatcher caused by the default watchdog observer not firing. Switched to using the kqueue based observer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10685
diff changeset
17 from watchdog.observers.kqueue import KqueueObserver as Observer
5b9dd8e4c43a Fixed a macOS specific issue in the EricFileSystemWatcher caused by the default watchdog observer not firing. Switched to using the kqueue based observer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10685
diff changeset
18 else:
5b9dd8e4c43a Fixed a macOS specific issue in the EricFileSystemWatcher caused by the default watchdog observer not firing. Switched to using the kqueue based observer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10685
diff changeset
19 from watchdog.observers import Observer
10679
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 class _EricFileSystemEventHandler(QObject, FileSystemEventHandler):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 Class implementing a QObject based file system event handler for watchdog.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 @signal directoryChanged(path: str) emitted when the directory at a given path is
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 modified or removed from disk
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 @signal directoryCreated(path: str) emitted when a directory is created
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 @signal directoryDeleted(path: str) emitted when a directory is removed from disk
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 @signal directoryModified(path: str) emitted when a directory is modified
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 @signal directoryMoved(srcPath: str, dstPath: str) emitted when the directory at a
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 given source path is renamed or moved to destination path
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 @signal fileChanged(path: str) emitted when the file at a given path is modified
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 or removed from disk
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 @signal fileCreated(path: str) emitted when a file is created
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 @signal fileDeleted(path: str) emitted when a file is removed from disk
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @signal fileModified(path: str) emitted when a file is modified
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @signal fileMoved(srcPath: str, dstPath: str) emitted when the file at a
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 given source path is renamed or moved to destination path
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 directoryChanged = pyqtSignal(str) # compatibility with QFileSystemWatcher
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 directoryCreated = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 directoryDeleted = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 directoryModified = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 directoryMoved = pyqtSignal(str, str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 fileChanged = pyqtSignal(str) # compatibility with QFileSystemWatcher
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 fileCreated = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 fileDeleted = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 fileModified = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 fileMoved = pyqtSignal(str, str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 def __init__(self, parent=None):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 Constructor
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 @param parent reference to the parent object (defaults to None)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 @type QObject (optional)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 super().__init__(parent=parent)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 def on_any_event(self, event):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 Private method handling any file system event.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 @param event event to be handled
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 @type watchdog.events.FileSystemEvent
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 super().on_any_event(event)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 if event.event_type not in (EVENT_TYPE_CLOSED, EVENT_TYPE_OPENED):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 if event.is_directory:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 self.directoryChanged.emit(event.src_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 else:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 self.fileChanged.emit(event.src_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 def on_created(self, event):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 Private method to handle a creation event.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 @param event event to be handled
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 @type watchdog.events.FileCreatedEvent or watchdog.event.DirCreatedEvent
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 super().on_created(event)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 if event.is_directory:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 self.directoryCreated.emit(event.src_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 else:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 self.fileCreated.emit(event.src_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 def on_deleted(self, event):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 Private method to handle a deletion event.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 @param event event to be handled
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @type watchdog.events.FileDeletedEvent or watchdog.event.DirDeletedEvent
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 super().on_deleted(event)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 if event.is_directory:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 self.directoryDeleted.emit(event.src_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 else:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 self.fileDeleted.emit(event.src_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 def on_modified(self, event):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 Private method to handle a modification event.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 @param event event to be handled
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 @type watchdog.events.FileModifiedEvent or watchdog.event.DirModifiedEvent
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 super().on_modified(event)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 if event.is_directory:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 self.directoryModified.emit(event.src_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 else:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 self.fileModified.emit(event.src_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 def on_moved(self, event):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 Private method to handle a move or rename event.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 @param event event to be handled
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 @type watchdog.events.FileMovedEvent or watchdog.event.DirMovedEvent
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 super().on_moved(event)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 if event.is_directory:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 self.directoryMoved.emit(event.src_path, event.dest_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 else:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 self.fileMoved.emit(event.src_path, event.dest_path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 class EricFileSystemWatcher(QObject):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 Class implementing a file system monitor based on the 'watchdog' package as a
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 replacement for 'QFileSystemWatcher'.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 This class has more fine grained signaling capability compared to
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 QFileSystemWatcher. The 'directoryChanged' and 'fileChanged' signals are emitted
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 to keep the API compatible with QFileSystemWatcher.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 @signal directoryChanged(path: str) emitted when the directory at a given path is
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 modified or removed from disk
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 @signal directoryCreated(path: str) emitted when a directory is created
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 @signal directoryDeleted(path: str) emitted when a directory is removed from disk
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 @signal directoryModified(path: str) emitted when a directory is modified
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 @signal directoryMoved(srcPath: str, dstPath: str) emitted when the directory at a
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 given source path is renamed or moved to destination path
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 @signal fileChanged(path: str) emitted when the file at a given path is modified
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 or removed from disk
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 @signal fileCreated(path: str) emitted when a file is created
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 @signal fileDeleted(path: str) emitted when a file is removed from disk
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 @signal fileModified(path: str) emitted when a file is modified
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 @signal fileMoved(srcPath: str, dstPath: str) emitted when the file at a
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 given source path is renamed or moved to destination path
10685
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
158 @signal error(errno: int, errmsg: str) emitted to indicate an OS error
10679
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 directoryChanged = pyqtSignal(str) # compatibility with QFileSystemWatcher
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 directoryCreated = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 directoryDeleted = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 directoryModified = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 directoryMoved = pyqtSignal(str, str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 fileChanged = pyqtSignal(str) # compatibility with QFileSystemWatcher
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 fileCreated = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 fileDeleted = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 fileModified = pyqtSignal(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 fileMoved = pyqtSignal(str, str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172
10685
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
173 error = pyqtSignal(int, str)
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
174
10679
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 def __init__(self, parent=None):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 Constructor
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 @param parent reference to the parent object (defaults to None)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 @type QObject (optional)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 super().__init__(parent=parent)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 self.__paths = {}
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 # key: file/directory path, value: tuple with created watch and monitor count
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 self.__eventHandler = _EricFileSystemEventHandler(parent=self)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 self.__eventHandler.directoryChanged.connect(self.__directoryChanged)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 self.__eventHandler.directoryCreated.connect(self.directoryCreated)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 self.__eventHandler.directoryDeleted.connect(self.directoryDeleted)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 self.__eventHandler.directoryModified.connect(self.directoryModified)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 self.__eventHandler.directoryMoved.connect(self.directoryMoved)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 self.__eventHandler.fileChanged.connect(self.__fileChanged)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 self.__eventHandler.fileCreated.connect(self.fileCreated)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 self.__eventHandler.fileDeleted.connect(self.fileDeleted)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 self.__eventHandler.fileModified.connect(self.fileModified)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 self.__eventHandler.fileMoved.connect(self.fileMoved)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 self.__observer = Observer()
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 self.__observer.start()
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 def __del__(self):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 Special method called when an instance object is about to be destroyed.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 self.shutdown()
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 @pyqtSlot(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 def __directoryChanged(self, path):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 Private slot handling any change of a directory at a given path.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 It emits the signal 'directoryChanged', if the path is in the list of
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 watched paths. This behavior is compatible with the QFileSystemWatcher signal
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 of identical name.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 @param path path name of the changed directory
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 @type str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 if path in self.__paths:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 self.directoryChanged.emit(path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 @pyqtSlot(str)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 def __fileChanged(self, path):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 Private slot handling any change of a file at a given path.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 It emits the signal 'fileChanged', if the path is in the list of
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 watched paths. This behavior is compatible with the QFileSystemWatcher signal
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 of identical name.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 @param path path name of the changed file
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 @type str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 if path in self.__paths:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 self.fileChanged.emit(path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 def addPath(self, path, recursive=False):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 Public method to add the given path to the list of watched paths.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 If the given path is a directory, a recursive watch may be requested.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 Otherwise only the given directory is watched for changes but none of its
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 subdirectories.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 The path is not added, if it does not exist or if it is already being monitored
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 by the file system watcher.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 @param path file or directory path to be added to the watched paths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 @type str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 @param recursive flag indicating a watch for the complete tree rooted at the
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 given path (for directory paths only) (defaults to False)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 @type bool (optional)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 @return flag indicating a successful creation of a watch for the given path
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 @rtype bool
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 if os.path.exists(path):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 try:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 self.__paths[path][1] += 1
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 return True
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 except KeyError:
10685
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
262 try:
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
263 watch = self.__observer.schedule(
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
264 self.__eventHandler,
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
265 path,
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
266 recursive=recursive and os.path.isdir(path),
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
267 )
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
268 if watch is not None:
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
269 self.__paths[watch.path] = [watch, 1]
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
270 return True
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
271 except OSError as err:
a9134b4e8ed0 Added code to inform the user about exhausted file system watcher resources and a way to get more resources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10679
diff changeset
272 self.error.emit(err.errno, err.strerror)
10679
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 return False
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 def addPaths(self, paths, recursive=False):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 Public method to add each path of the given list to the file system watched.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 If a path of the given paths list is a directory, a recursive watch may be
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 requested. Otherwise only the given directory is watched for changes but none
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 of its subdirectories. This applies to all directory paths of the given list.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 A path of the list is not added, if it does not exist or if it is already being
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 monitored by the file system watcher.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 @param paths list of file or directory paths to be added to the watched paths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 @type list of str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 @param recursive flag indicating a watch for the complete tree rooted at the
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 given path (for directory paths only) (defaults to False)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 @type bool (optional)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 @return list of paths that could not be added to the list of monitored paths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 @rtype list of str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 failedPaths = []
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 for path in paths:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 ok = self.addPath(path, recursive=recursive)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 if not ok:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 failedPaths.append(path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 return failedPaths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 def removePath(self, path):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 Public method to remove a given path from the list of monitored paths.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 @param path directory or file path to be removed
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 @type str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 @return flag indicating a successful removal. The only reason for a failure is,
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 if the given path is not currently being monitored.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312 @rtype bool
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 try:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 self.__paths[path][1] -= 1
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 if self.__paths[path][1] == 0:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 watch, _ = self.__paths.pop(path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 self.__observer.unschedule(watch)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 return True
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 except KeyError:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 return False
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 def removePaths(self, paths):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 Public method to remove the specified paths from the list of monitored paths.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 @param paths list of directory or file paths to be removed
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328 @type list of str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 @return list of paths that could not be removed from the list of monitored paths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 @rtype list of str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 failedPaths = []
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 for path in paths:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 ok = self.removePath(path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 if not ok:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 failedPaths.append(path)
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 return failedPaths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 def directories(self):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 Public method to return a list of paths to directories that are being watched.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 @return list of watched directory paths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 @rtype list of str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 return [p for p in self.__paths if os.path.isdir(p)]
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 def files(self):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 Public method to return a list of paths to files that are being watched.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 @return list of watched file paths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 @rtype list of str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 return [p for p in self.__paths if os.path.isfile(p)]
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 def paths(self):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 Public method to return a list of paths that are being watched.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 @return list of all watched paths
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 @rtype list of str
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 return list(self.__paths.keys())
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 def shutdown(self):
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 Public method to shut down the file system watcher instance.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 This needs to be done in order to stop the monitoring threads doing their
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 work in the background. If this method was not called explicitly when the
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 instance is about to be destroyed, the special method '__del__' will do that.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 if self.__observer is not None:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 self.__observer.stop()
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 self.__observer.join()
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 self.__observer = None
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382 _GlobalFileSystemWatcher = None
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 def instance():
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 Function to get a reference to the global file system monitor object.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 If the global file system monitor does not exist yet, it will be created
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 automatically.
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 @return reference to the global file system monitor object
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 @rtype EricFileSystemWatcher
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 """
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 global _GlobalFileSystemWatcher
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 if _GlobalFileSystemWatcher is None:
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398 _GlobalFileSystemWatcher = EricFileSystemWatcher()
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399
4d3e0ce54322 General
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
400 return _GlobalFileSystemWatcher

eric ide

mercurial