def watch( # noqa: C901 func: callable, path: str = None, *, poll_time=0.5, skip_first=False, name=None): """ Execute function and re-execute if everytime a file under the given path changes. """ import time from watchdog.observers import Observer from watchdog.events import ( FileSystemEventHandler, FileCreatedEvent, FileDeletedEvent, FileModifiedEvent, FileMovedEvent, ) # Create the dispatch function that throttles execution so func is # executed at most every poll_time seconds file_event = (FileCreatedEvent, FileDeletedEvent, FileModifiedEvent, FileMovedEvent) last = time.time() def dispatch(ev): nonlocal last if (ev.src_path.endswith("__") or ev.src_path.startswith("__") or ev.src_path.startswith("~") or ev.src_path.startswith(".")): return if isinstance(ev, file_event): last = start = time.time() time.sleep(poll_time) if last == start: print(f"File modified: {ev.src_path}") func() # Initialize observer and mokey-match the instance dispatch method observer = Observer() handler = FileSystemEventHandler() handler.dispatch = dispatch observer.schedule(handler, path or os.getcwd(), recursive=True) observer.start() name = name or func.__name__ # Starts execution loop print(f"Running {name} in watch mode.") if not skip_first: func() try: while True: time.sleep(0.5) except KeyboardInterrupt: observer.stop() observer.join()
def clear_queue(self): """Commits queue to index and clears it.""" print("Emtpying queue...") urls = [] while not self.queue.empty(): event = self.queue.get() if watchdog.utils.has_attribute(event, 'dest_path'): if event.dest_path not in urls: urls.append(event.dest_path) FileSystemEventHandler.dispatch(self, event) else: if event.src_path not in urls: urls.append(event.src_path) FileSystemEventHandler.dispatch(self, event) if urls != []: print(("Commiting %i changes." % len(urls))) self.writer.commit() print("Done.") threading.Timer(self.delay, self.clear_queue).start()
def clear_queue(self): """Commits queue to index and clears it.""" print("Emtpying queue...") urls = [] while not self.queue.empty(): event = self.queue.get() if watchdog.utils.has_attribute(event, 'dest_path'): if event.dest_path not in urls: urls.append(event.dest_path) FileSystemEventHandler.dispatch(self, event) else: if event.src_path not in urls: urls.append(event.src_path) FileSystemEventHandler.dispatch(self, event) if urls != []: print("Commiting %i changes." % len(urls)) self.writer.commit() print("Done.") threading.Timer(self.delay, self.clear_queue).start()
def watch_path(path, func, poll_time=0.5, name=None, skip_first=False): """ Watch path and execute the given function everytime a file changes. """ import time from watchdog.observers import Observer from watchdog.events import ( FileSystemEventHandler, FileCreatedEvent, FileDeletedEvent, FileModifiedEvent, FileMovedEvent, ) file_event = (FileCreatedEvent, FileDeletedEvent, FileModifiedEvent, FileMovedEvent) last = time.time() def dispatch(ev): nonlocal last if (ev.src_path.endswith("__") or ev.src_path.startswith("__") or ev.src_path.startswith("~") or ev.src_path.startswith(".")): return if isinstance(ev, file_event): last = start = time.time() time.sleep(poll_time) if last == start: print(f"File modified: {ev.src_path}") func() observer = Observer() handler = FileSystemEventHandler() handler.dispatch = dispatch observer.schedule(handler, path, recursive=True) observer.start() name = name or func.__name__ print(f"Running {name} in watch mode.") if not skip_first: func() try: while True: time.sleep(0.5) except KeyboardInterrupt: observer.stop() observer.join()
def start_fs_loop(): init() try: os.makedirs("albums") except: None ev_handler = FileSystemEventHandler() ev_handler.dispatch = handle_fs_events event_handler = LoggingEventHandler() observer = Observer() observer.schedule(ev_handler, "albums/", recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()
def __start_observer(self) -> None: """ Start observation of students, missions and checkers. Args: self: the instance Returns: None """ event_handler = FileSystemEventHandler() def dispatch(event) -> None: """ Dispatches events to the appropriate methods. Args: event: The event object representing the file system event. Returns: None """ if event.is_directory: return if event.event_type == EVENT_TYPE_CREATED: return path = Path(event.src_path) logger.debug('%s:%s', event.event_type, event.src_path) if path.name == config.STUDENTS_SUBPATH: self.read_students() elif path.suffix == '.json': self.read_missions() elif path.suffix == '.py': self.read_checkers() event_handler.dispatch = dispatch self.observer.schedule(event_handler, config.db_path, recursive=True) self.observer.start()
def dispatch(self, event): with LOCK: if event.src_path.endswith('.py'): self.serverChanged = True elif event.src_path.endswith('.part.xml'): FileSystemEventHandler.dispatch(self, event)