From 60bcb8c2b052ec86b82b4153399ebd5fa626ce75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20T=C3=B3th?= Date: Tue, 13 Feb 2018 14:55:33 +0100 Subject: [PATCH] Refactor webide rate limiting --- lib/tfw/components/directory_monitor.py | 36 ++++++++++++++++--------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/tfw/components/directory_monitor.py b/lib/tfw/components/directory_monitor.py index 9feb46d..5db6d6f 100644 --- a/lib/tfw/components/directory_monitor.py +++ b/lib/tfw/components/directory_monitor.py @@ -1,6 +1,7 @@ from time import time, sleep from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler +from functools import wraps from tfw.networking.event_handlers.server_connector import ServerUplinkConnector @@ -8,23 +9,19 @@ from tfw.config.logs import logging log = logging.getLogger(__name__) -class WebideReloadEventHandler(FileSystemEventHandler): +class RateLimiter: def __init__(self, rate_per_second): - super().__init__() - self.uplink = ServerUplinkConnector() - self.min_interval = 1 / float(rate_per_second) self.last_call = time() - def on_modified(self, event): - self.limit_rate() + def __call__(self, fun): + @wraps(fun) + def wrapper(*args, **kwargs): + self._limit_rate() + fun(*args, **kwargs) + return wrapper - log.debug(event) - anchor = 'anchor_webide' - self.uplink.send(anchor, {'anchor': anchor, - 'data': {'command': 'reload'}}) - - def limit_rate(self): #TODO: pls review me :3 + def _limit_rate(self): #TODO: pls review me :3 since_last_call = time() - self.last_call to_next_call = self.min_interval - since_last_call self.last_call = time() @@ -32,10 +29,23 @@ class WebideReloadEventHandler(FileSystemEventHandler): sleep(to_next_call) +class WebideReloadEventHandler(FileSystemEventHandler): + def __init__(self): + super().__init__() + self.uplink = ServerUplinkConnector() + + @RateLimiter(rate_per_second=5) + def on_modified(self, event): + log.debug(event) + anchor = 'anchor_webide' + self.uplink.send(anchor, {'anchor': anchor, + 'data': {'command': 'reload'}}) + + class DirectoryMonitor: def __init__(self, directory): self.observer = Observer() - self.observer.schedule(WebideReloadEventHandler(rate_per_second=5), directory, recursive=True) + self.observer.schedule(WebideReloadEventHandler(), directory, recursive=True) def watch(self): self.observer.start()