aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/script/reloader.py
diff options
context:
space:
mode:
Diffstat (limited to 'libmproxy/script/reloader.py')
-rw-r--r--libmproxy/script/reloader.py37
1 files changed, 37 insertions, 0 deletions
diff --git a/libmproxy/script/reloader.py b/libmproxy/script/reloader.py
new file mode 100644
index 00000000..b867238f
--- /dev/null
+++ b/libmproxy/script/reloader.py
@@ -0,0 +1,37 @@
+import os
+from watchdog.events import PatternMatchingEventHandler
+from watchdog.observers import Observer
+
+_observers = {}
+
+
+def watch(script, callback):
+ script_dir = os.path.dirname(os.path.abspath(script.args[0]))
+ event_handler = _ScriptModificationHandler(callback)
+ observer = Observer()
+ observer.schedule(event_handler, script_dir)
+ observer.start()
+ _observers[script] = observer
+
+
+def unwatch(script):
+ observer = _observers.pop(script, None)
+ if observer:
+ observer.stop()
+
+
+class _ScriptModificationHandler(PatternMatchingEventHandler):
+ def __init__(self, callback):
+ # We could enumerate all relevant *.py files (as werkzeug does it),
+ # but our case looks like it isn't as simple as enumerating sys.modules.
+ # This should be good enough for now.
+ super(_ScriptModificationHandler, self).__init__(
+ ignore_directories=True,
+ patterns=["*.py"]
+ )
+ self.callback = callback
+
+ def on_modified(self, event):
+ self.callback()
+
+__all__ = ["watch", "unwatch"] \ No newline at end of file