diff --git a/lib/tfw/components/decorators/__init__.py b/lib/tfw/components/decorators/__init__.py new file mode 100644 index 0000000..c3d1ffd --- /dev/null +++ b/lib/tfw/components/decorators/__init__.py @@ -0,0 +1 @@ +from .rate_limiter import RateLimiter diff --git a/lib/tfw/components/decorators/rate_limiter.py b/lib/tfw/components/decorators/rate_limiter.py new file mode 100644 index 0000000..c71c86c --- /dev/null +++ b/lib/tfw/components/decorators/rate_limiter.py @@ -0,0 +1,22 @@ +from functools import wraps +from time import time, sleep + + +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): + 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) diff --git a/lib/tfw/components/directory_monitor.py b/lib/tfw/components/directory_monitor.py index 5dae10e..6dbf78f 100644 --- a/lib/tfw/components/directory_monitor.py +++ b/lib/tfw/components/directory_monitor.py @@ -2,13 +2,12 @@ from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from tfw.networking.event_handlers.server_connector import ServerUplinkConnector -from tfw.util import RateLimiter +from tfw.components.decorators import RateLimiter from tfw.config.logs import logging log = logging.getLogger(__name__) - class WebideReloadEventHandler(FileSystemEventHandler): def __init__(self): super().__init__() diff --git a/lib/tfw/util.py b/lib/tfw/util.py index bede6e8..388ed56 100644 --- a/lib/tfw/util.py +++ b/lib/tfw/util.py @@ -1,7 +1,3 @@ -from time import time, sleep -from functools import wraps - - def create_source_code_response_data(filename, content, language): return { 'filename': filename, @@ -10,21 +6,3 @@ def create_source_code_response_data(filename, content, language): } -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): - 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) \ No newline at end of file