import logging import sys import time from logging.config import dictConfig from typing import Sized import urllib3 from core.Env import Env from core.extend import fs logFile = fs.getPath(__file__, f"../../logs/{Env.LOGGING_DIR}.log").resolve() logFile.parent.mkdir(parents=True, exist_ok=True) # WARGNINGS urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # ERRORS ON WINDOWS CONSOLE sys.stdin.reconfigure(encoding='utf-8') if hasattr(sys.stdout, "reconfigure"): sys.stdout.reconfigure(encoding='utf-8') logging.config.dictConfig({ 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'default': { 'format': "%(asctime)s | %(processName)s | %(module)40s:%(lineno)-3d | %(levelname)-7s | %(message)s", 'datefmt': "%Y.%m.%d %H:%M:%S", }, }, 'handlers': { 'console': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'default', 'stream': sys.stderr, }, 'file': { 'level': 'DEBUG', 'class': "logging.handlers.RotatingFileHandler", 'formatter': 'default', 'encoding': 'UTF-8', "filename": logFile, "maxBytes": 1e9, "backupCount": 10, }, }, 'loggers': { 'app.services.PostaApiService': { 'level': 'WARN' }, 'sqlalchemy.engine.Engine': { 'level': 'WARN' }, '': { 'handlers': ['console', 'file'], 'level': 'INFO', 'propagate': True } } }) log = logging.getLogger(__name__) class Progress: def __init__(self, title: str, iter: Sized | int): self.title = title self.size = len(iter) if isinstance(iter, Sized) else iter self.startTime = time.time() self.nowTime = self.startTime def log(self, i: int, info: str = None) -> callable: nowTime = time.time() if nowTime - self.nowTime > 1: percent = round(i / self.size * 100, 2) secondsPerIter = (nowTime - self.startTime) / (i + 1) iterLeft = self.size - i secondsLeft = secondsPerIter * iterLeft minutesLeft = round(secondsLeft / 60, 2) log.info(f"{self.title if info is None else info}: {percent}% => {iterLeft} => {minutesLeft} minutes") self.nowTime = nowTime