aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/libmproxy/script/reloader.py
diff options
context:
space:
mode:
Diffstat (limited to 'mitmproxy/libmproxy/script/reloader.py')
-rw-r--r--mitmproxy/libmproxy/script/reloader.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/mitmproxy/libmproxy/script/reloader.py b/mitmproxy/libmproxy/script/reloader.py
new file mode 100644
index 00000000..b4acf51b
--- /dev/null
+++ b/mitmproxy/libmproxy/script/reloader.py
@@ -0,0 +1,46 @@
+import os
+import sys
+from watchdog.events import RegexMatchingEventHandler
+if sys.platform == 'darwin':
+ from watchdog.observers.polling import PollingObserver as Observer
+else:
+ from watchdog.observers import Observer
+# The OSX reloader in watchdog 0.8.3 breaks when unobserving paths.
+# We use the PollingObserver instead.
+
+_observers = {}
+
+
+def watch(script, callback):
+ if script in _observers:
+ raise RuntimeError("Script already observed")
+ script_dir = os.path.dirname(os.path.abspath(script.args[0]))
+ script_name = os.path.basename(script.args[0])
+ event_handler = _ScriptModificationHandler(callback, filename=script_name)
+ 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()
+ observer.join()
+
+
+class _ScriptModificationHandler(RegexMatchingEventHandler):
+
+ def __init__(self, callback, filename='.*'):
+
+ super(_ScriptModificationHandler, self).__init__(
+ ignore_directories=True,
+ regexes=['.*' + filename]
+ )
+ self.callback = callback
+
+ def on_modified(self, event):
+ self.callback()
+
+__all__ = ["watch", "unwatch"]