summaryrefslogtreecommitdiff
path: root/qface/watch.py
diff options
context:
space:
mode:
Diffstat (limited to 'qface/watch.py')
-rw-r--r--qface/watch.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/qface/watch.py b/qface/watch.py
new file mode 100644
index 0000000..4a8512f
--- /dev/null
+++ b/qface/watch.py
@@ -0,0 +1,54 @@
+from watchdog.events import FileSystemEventHandler
+from watchdog.observers import Observer
+import click
+from path import Path
+import time
+from .shell import sh
+
+"""
+Provides an API to monitor the file system
+"""
+
+class RunScriptChangeHandler(FileSystemEventHandler):
+ def __init__(self, argv):
+ super().__init__()
+ self.argv = argv
+ self.is_running = False
+
+ def on_modified(self, event):
+ self.run()
+
+ def run(self):
+ if self.is_running:
+ return
+ self.is_running = True
+ # cmd = '{0} {1}'.format(sys.executable, ' '.join(self.argv))
+ sh(' '.join(self.argv), cwd=Path.getcwd())
+ self.is_running = False
+
+
+def monitor(src, argv):
+ """
+ reloads the script given by argv when src files changes
+ """
+ script = Path(argv[0]).expand().abspath()
+ src = src if isinstance(src, (list, tuple)) else [src]
+ src = [Path(entry).expand().abspath() for entry in src]
+ event_handler = RunScriptChangeHandler(argv)
+ observer = Observer()
+ path = script.dirname().expand().abspath()
+ click.secho('watch recursive: {0}'.format(path), fg='blue')
+ observer.schedule(event_handler, path, recursive=True)
+ for entry in src:
+ entry = entry.dirname().expand().abspath()
+ click.secho('watch recursive: {0}'.format(entry), fg='blue')
+ observer.schedule(event_handler, entry, recursive=True)
+ event_handler.run() # run always once
+ observer.start()
+
+ try:
+ while True:
+ time.sleep(1)
+ except KeyboardInterrupt:
+ observer.stop()
+ observer.join()