From 0d98b9dcc58f62c6fcb1ab597456b13a24ea88a3 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Sat, 14 Nov 2015 05:57:02 +0100 Subject: finalize script reloading :tada: --- libmproxy/script/reloader.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 libmproxy/script/reloader.py (limited to 'libmproxy/script/reloader.py') 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 -- cgit v1.2.3