"""
----------------------------------------------------------------------------
METADATA:
File: utils.py
Project: paperap
Created: 2025-03-18
Version: 0.0.9
Author: Jess Mann
Email: jess@jmann.me
Copyright (c) 2025 Jess Mann
----------------------------------------------------------------------------
LAST MODIFIED:
2025-03-18 By Jess Mann
"""
import logging
from typing import Any, Protocol, override
import colorlog
# Define a Protocol for alive_bar()
[docs]
class ProgressBar(Protocol):
total: int
def __call__(self, *args: Any, **kwargs: Any) -> None: ...
[docs]
def text(self, text: str) -> None: ...
[docs]
def setup_logging() -> logging.Logger:
"""
Set up logging with colored output.
"""
logging.basicConfig(level=logging.ERROR)
# Define a custom formatter class
class CustomFormatter(colorlog.ColoredFormatter):
@override
def format(self, record: logging.LogRecord) -> str:
self._style._fmt = "(%(log_color)s%(levelname)s%(reset)s) %(message)s"
return super().format(record)
# Configure colored logging with the custom formatter
handler = colorlog.StreamHandler()
handler.setFormatter(
CustomFormatter(
# Initial format string (will be overridden in the formatter)
"",
log_colors={
"DEBUG": "green",
"INFO": "blue",
"WARNING": "yellow",
"ERROR": "red",
"CRITICAL": "red,bg_white",
},
)
)
root_logger = logging.getLogger()
root_logger.handlers = [] # Clear existing handlers
root_logger.addHandler(handler)
root_logger.setLevel(logging.ERROR)
app_logger = logging.getLogger(__name__)
app_logger.setLevel(logging.INFO)
# Suppress logs from the 'requests' library below ERROR level
# logging.getLogger("urllib3").setLevel(logging.ERROR)
# logging.getLogger("requests").setLevel(logging.ERROR)
return app_logger