diff --git a/src/hupper/interfaces.py b/src/hupper/interfaces.py index eca0a64..b586ca8 100644 --- a/src/hupper/interfaces.py +++ b/src/hupper/interfaces.py @@ -14,7 +14,7 @@ def trigger_reload(self): class IFileMonitorFactory(with_metaclass(abc.ABCMeta)): - def __call__(self, callback): + def __call__(self, callback, **kw): """ Return an :class:`.IFileMonitor` instance. ``callback`` is a callable to be invoked by the ``IFileMonitor`` diff --git a/src/hupper/polling.py b/src/hupper/polling.py index c9413ef..9554e02 100644 --- a/src/hupper/polling.py +++ b/src/hupper/polling.py @@ -16,10 +16,10 @@ class PollingFileMonitor(threading.Thread, IFileMonitor): disk. Do not set this too low or it will eat your CPU and kill your drive. """ - def __init__(self, callback, poll_interval=1): + def __init__(self, callback, interval=1, **kw): super(PollingFileMonitor, self).__init__() self.callback = callback - self.poll_interval = poll_interval + self.poll_interval = interval self.paths = set() self.mtimes = {} self.lock = threading.Lock() diff --git a/src/hupper/reloader.py b/src/hupper/reloader.py index 46d9e4e..19ca3a0 100644 --- a/src/hupper/reloader.py +++ b/src/hupper/reloader.py @@ -25,8 +25,9 @@ class FileMonitorProxy(object): when it should reload. """ - def __init__(self, monitor_factory, verbose=1): - self.monitor = monitor_factory(self.file_changed) + monitor = None + + def __init__(self, verbose=1): self.verbose = verbose self.change_event = threading.Event() self.changed_paths = set() @@ -199,7 +200,12 @@ def _wait_for_changes(self): self.monitor.clear_changes() def _start_monitor(self): - self.monitor = FileMonitorProxy(self.monitor_factory, self.verbose) + proxy = FileMonitorProxy(self.verbose) + proxy.monitor = self.monitor_factory( + proxy.file_changed, + interval=self.reload_interval, + ) + self.monitor = proxy self.monitor.start() def _stop_monitor(self): @@ -221,7 +227,7 @@ def _restore_signals(self): signal.signal(signal.SIGHUP, signal.SIG_DFL) -def find_default_monitor_factory(verbose, reload_interval): +def find_default_monitor_factory(verbose): spec = os.environ.get('HUPPER_DEFAULT_MONITOR') if spec: monitor_factory = resolve_spec(spec) @@ -230,19 +236,13 @@ def find_default_monitor_factory(verbose, reload_interval): print('File monitor backend: ' + spec) elif is_watchdog_supported(): - from .watchdog import WatchdogFileMonitor - - def monitor_factory(callback): - return WatchdogFileMonitor(callback) + from .watchdog import WatchdogFileMonitor as monitor_factory if verbose > 1: print('File monitor backend: watchdog') else: - from .polling import PollingFileMonitor - - def monitor_factory(callback): - return PollingFileMonitor(callback, reload_interval) + from .polling import PollingFileMonitor as monitor_factory if verbose > 1: print('File monitor backend: polling') @@ -295,8 +295,7 @@ def start_reloader( return get_reloader() if monitor_factory is None: - monitor_factory = find_default_monitor_factory( - verbose, reload_interval) + monitor_factory = find_default_monitor_factory(verbose) reloader = Reloader( worker_path=worker_path, diff --git a/src/hupper/watchdog.py b/src/hupper/watchdog.py index d153cd3..9174be9 100644 --- a/src/hupper/watchdog.py +++ b/src/hupper/watchdog.py @@ -17,7 +17,7 @@ class WatchdogFileMonitor(FileSystemEventHandler, Observer, IFileMonitor): ``callback`` is a callable that accepts a path to a changed file. """ - def __init__(self, callback): + def __init__(self, callback, **kw): super(WatchdogFileMonitor, self).__init__() self.callback = callback self.paths = set() diff --git a/tests/test_reloader.py b/tests/test_reloader.py index 3bb3bd7..463894a 100644 --- a/tests/test_reloader.py +++ b/tests/test_reloader.py @@ -2,15 +2,17 @@ here = os.path.abspath(os.path.dirname(__file__)) -def make_proxy(*args, **kwargs): +def make_proxy(monitor_factory): from hupper.reloader import FileMonitorProxy - return FileMonitorProxy(*args, **kwargs) + proxy = FileMonitorProxy() + proxy.monitor = monitor_factory(proxy.file_changed) + return proxy def test_proxy_proxies(): class DummyMonitor(object): started = stopped = joined = False - def __call__(self, cb): + def __call__(self, cb, **kw): self.cb = cb return self @@ -34,7 +36,7 @@ def join(self): def test_proxy_expands_paths(tmpdir): class DummyMonitor(object): - def __call__(self, cb): + def __call__(self, cb, **kw): self.cb = cb self.paths = [] return self @@ -59,7 +61,7 @@ def add_path(self, path): def test_proxy_tracks_changes(capsys): class DummyMonitor(object): - def __call__(self, cb): + def __call__(self, cb, **kw): self.cb = cb return self