87 lines
2.0 KiB
Python
87 lines
2.0 KiB
Python
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
|