Esempio n. 1
0
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()
Esempio n. 2
0
    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()
Esempio n. 3
0
    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()
Esempio n. 4
0
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()
Esempio n. 5
0
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()
Esempio n. 6
0
    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()
Esempio n. 7
0
 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)