diff --git a/mitmproxy/script/reloader.py b/mitmproxy/script/reloader.py index b4acf51b4..99ce7f601 100644 --- a/mitmproxy/script/reloader.py +++ b/mitmproxy/script/reloader.py @@ -1,7 +1,7 @@ import os import sys from watchdog.events import RegexMatchingEventHandler -if sys.platform == 'darwin': +if sys.platform == 'darwin': # pragma: no cover from watchdog.observers.polling import PollingObserver as Observer else: from watchdog.observers import Observer @@ -14,8 +14,8 @@ _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]) + script_dir = os.path.dirname(os.path.abspath(script.filename)) + script_name = os.path.basename(script.filename) event_handler = _ScriptModificationHandler(callback, filename=script_name) observer = Observer() observer.schedule(event_handler, script_dir) diff --git a/test/mitmproxy/script/test_reloader.py b/test/mitmproxy/script/test_reloader.py new file mode 100644 index 000000000..af0ab88fd --- /dev/null +++ b/test/mitmproxy/script/test_reloader.py @@ -0,0 +1,29 @@ +import mock +from mitmproxy.script.reloader import watch, unwatch +from test.mitmproxy import tutils +from threading import Event + + +def test_simple(): + with tutils.tmpdir(): + with open("foo.py", "wb"): + pass + + script = mock.Mock() + script.filename = "foo.py" + + e = Event() + + def _onchange(): + e.set() + + watch(script, _onchange) + with tutils.raises("already observed"): + watch(script, _onchange) + + with open("foo.py", "ab") as f: + f.write(".") + + assert e.wait(10) + + unwatch(script)