latecomers/latecomers/helpers.py

59 lines
1.8 KiB
Python
Raw Permalink Normal View History

2022-08-24 12:42:23 +02:00
# -*- encoding: utf-8 -*-
2022-09-18 23:29:02 +02:00
from datetime import datetime, timedelta
2022-08-25 13:11:33 +02:00
import functools
2022-08-24 12:42:23 +02:00
import logging
2022-08-25 13:11:33 +02:00
import sys
2022-08-24 12:42:23 +02:00
import typing as T
def logit(logger: logging.Logger) -> T.Callable[..., T.Any]:
def wrapper(func: T.Callable[..., T.Any]) -> T.Callable[..., T.Any]:
2022-08-25 13:11:33 +02:00
@functools.wraps(func)
2022-08-24 12:42:23 +02:00
def inner(*args, **kwargs):
try:
value = func(*args, **kwargs)
2022-08-25 13:11:33 +02:00
logger.info(f"Success: {func.__name__}")
logger.debug(f"{func.__name__}(args={args}, kwargs={kwargs})")
2022-08-24 12:42:23 +02:00
return value
except Exception as e:
logger.error(f"Failure: {e}")
2022-08-25 13:11:33 +02:00
logger.debug(f"{func.__name__}(args={args}, kwargs={kwargs})")
sys.exit(1)
2022-08-24 12:42:23 +02:00
return inner
return wrapper
def retry_and_log(logger: logging.Logger, retries: int):
"""
This decorator wraps a function, logs at info in case of success and logs
error in case an exception is raised.
"""
def wrapper(func: T.Callable[..., T.Any]) -> T.Callable[..., T.Any]:
2022-08-25 13:11:33 +02:00
@functools.wraps(func)
2022-08-24 12:42:23 +02:00
def inner(*args, **kwargs):
for i in range(retries):
try:
value = func(*args, **kwargs)
2022-08-25 13:11:33 +02:00
logger.info(f"Success ({i+1} tentative): {func.__name__}")
logger.debug(f"{func.__name__}(args={args}, kwargs={kwargs})")
2022-08-24 12:42:23 +02:00
return value
except Exception as e:
logger.error(f"Failure ({i+1} tentative): {e}")
2022-08-25 13:11:33 +02:00
logger.debug(f"{func.__name__}(args={args}, kwargs={kwargs})")
sys.exit(2)
2022-08-24 12:42:23 +02:00
return inner
return wrapper
2022-09-18 23:29:02 +02:00
def get_date() -> T.Text:
"""
Get yesterday's date in %Y-%m-%d format.
"""
return (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")