refactor(utils): split into separate files
This commit is contained in:
60
utils/common.py
Normal file
60
utils/common.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from collections import OrderedDict
|
||||
|
||||
from constants import SECRETS
|
||||
|
||||
|
||||
def format_duration(duration: int, natural: bool = False, short: bool = False):
|
||||
def format_plural(noun, count):
|
||||
if short:
|
||||
return noun[0]
|
||||
return " " + (noun if count == 1 else noun + "s")
|
||||
|
||||
segments = []
|
||||
|
||||
weeks, duration = divmod(duration, 604800)
|
||||
if weeks > 0:
|
||||
segments.append(f"{weeks}{format_plural('week', weeks)}")
|
||||
|
||||
days, duration = divmod(duration, 86400)
|
||||
if days > 0:
|
||||
segments.append(f"{days}{format_plural('day', days)}")
|
||||
|
||||
hours, duration = divmod(duration, 3600)
|
||||
if hours > 0:
|
||||
segments.append(f"{hours}{format_plural('hour', hours)}")
|
||||
|
||||
minutes, duration = divmod(duration, 60)
|
||||
if minutes > 0:
|
||||
segments.append(f"{minutes}{format_plural('minute', minutes)}")
|
||||
|
||||
if duration > 0:
|
||||
segments.append(f"{duration}{format_plural('second', duration)}")
|
||||
|
||||
separator = " " if short else ", "
|
||||
if not natural or len(segments) <= 1:
|
||||
return separator.join(segments)
|
||||
return separator.join(segments[:-1]) + f" and {segments[-1]}"
|
||||
|
||||
|
||||
def filter_secrets(text: str, secrets=SECRETS) -> str:
|
||||
for secret_name, secret in secrets.items():
|
||||
if not secret:
|
||||
continue
|
||||
text = text.replace(secret, f"<{secret_name}>")
|
||||
return text
|
||||
|
||||
|
||||
class LimitedSizeDict(OrderedDict):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.size_limit = kwargs.pop("size_limit", 1000)
|
||||
super().__init__(*args, **kwargs)
|
||||
self._check_size_limit()
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
super().__setitem__(key, value)
|
||||
self._check_size_limit()
|
||||
|
||||
def _check_size_limit(self):
|
||||
if self.size_limit is not None:
|
||||
while len(self) > self.size_limit:
|
||||
self.popitem(last=False)
|
||||
Reference in New Issue
Block a user