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 from tfw.config.logs import logging log = logging.getLogger(__name__) class RateLimiter: def __init__(self, rate_per_second): self.min_interval = 1 / float(rate_per_second) self.last_call = time() def __call__(self, fun): @wraps(fun) def wrapper(*args, **kwargs): self._limit_rate() fun(*args, **kwargs) return wrapper 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() if to_next_call > 0: 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(), directory, recursive=True) def watch(self): self.observer.start() def stop(self): self.observer.stop() self.observer.join()