from watchdog.observers import Observer from watchdog.events import PatternMatchingEventHandler from os.path import dirname class CallbackEventHandler(PatternMatchingEventHandler): def __init__(self, files, *callbacks): super().__init__(files) self.callbacks = callbacks def on_modified(self, event): for callback in self.callbacks: callback() class HistoryMonitor: def __init__(self, histfile): self.histfile = histfile self._history = [] self._last_length = len(self._history) self._callbacks = [] self.observer = Observer() self.observer.schedule(CallbackEventHandler([self.histfile], self._fetch_history, self._invoke_callbacks), dirname(self.histfile)) @property def history(self): return self._history @property def callbacks(self): return self._callbacks def _fetch_history(self): self._last_length = len(self._history) with open(self.histfile, 'r') as ifile: self._history = [line.rstrip() for line in ifile.readlines()] def _invoke_callbacks(self): if self._last_length < len(self._history): for callback in self.callbacks: callback(self.history) def watch(self): self.observer.start() def stop(self): self.observer.stop() self.observer.join()