Initial commit

This commit is contained in:
2026-06-15 08:11:11 +00:00
commit 093c553f6c
15 changed files with 758 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
import importlib.metadata
PKG_NAME = __name__
PKG_VERSION = importlib.metadata.version(PKG_NAME)
+13
View File
@@ -0,0 +1,13 @@
import logging
import sys
from . import PKG_NAME, PKG_VERSION
from .logs import setup_logs
from .params import parse_parameters
def main() -> int:
params = parse_parameters(sys.argv[1:])
setup_logs(params)
logging.getLogger().info("%s %s", PKG_NAME, PKG_VERSION)
return 0
+84
View File
@@ -0,0 +1,84 @@
import enum
import logging
import typing
if typing.TYPE_CHECKING:
from .params import Parameters
class TermColor(enum.StrEnum):
RESET = "0"
BOLD = "1"
FEINT = "2"
UNDERLINE = "4"
BLACK = "30"
RED = "31"
GREEN = "32"
YELLOW = "33"
BLUE = "34"
MAGENTA = "35"
CYAN = "36"
WHITE = "37"
GREY = "38"
def __str__(self) -> str:
return f"\033[{self.value}m"
@typing.override
def __add__(self, value: typing.Any, /) -> str: # ty:ignore[invalid-method-override]
return str(self) + str(value)
def __radd__(self, value: typing.Any, /) -> str:
return str(value) + str(self)
class ColoredLoggingFormatter(logging.Formatter):
pre_format = "%(asctime)s | "
level_format = "%(levelname)-8s"
post_format = " | [%(name)s] %(message)s"
trace_format = (
TermColor.FEINT
+ TermColor.GREY
+ " (%(filename)s:%(lineno)d)"
+ TermColor.RESET
)
FORMAT_COLORS: typing.ClassVar[dict[int, TermColor | str]] = {
logging.DEBUG: TermColor.FEINT + TermColor.GREY,
logging.INFO: TermColor.GREEN,
logging.WARNING: TermColor.YELLOW,
logging.ERROR: TermColor.RED,
logging.CRITICAL: TermColor.RED,
}
@typing.override
def __init__(self, trace: bool) -> None:
self.trace: bool = trace
super().__init__()
@typing.override
def format(self, record: logging.LogRecord) -> str:
log_color: TermColor | str = self.FORMAT_COLORS.get(
record.levelno,
TermColor.MAGENTA,
)
formatter = logging.Formatter(
self.pre_format
+ log_color
+ TermColor.BOLD
+ self.level_format
+ TermColor.RESET
+ self.post_format
+ (self.trace_format if self.trace else ""),
)
return formatter.format(record)
def setup_logs(params: Parameters) -> None:
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(ColoredLoggingFormatter(trace=params.debug))
log_level = logging.INFO
if params.debug:
log_level = logging.DEBUG
logging.basicConfig(level=log_level, handlers=[stream_handler])
+31
View File
@@ -0,0 +1,31 @@
import argparse
import dataclasses
import typing
from . import PKG_NAME
@dataclasses.dataclass(frozen=True, slots=True)
class Parameters:
debug: bool = False
quiet: bool = False
@classmethod
def from_namespace(cls, args: argparse.Namespace) -> Parameters:
return Parameters(**vars(args))
def parse_parameters(args: typing.Sequence[str]) -> Parameters:
default_values = Parameters()
parser = argparse.ArgumentParser(
PKG_NAME,
suggest_on_error=True,
)
parser.add_argument(
"--debug", action=argparse.BooleanOptionalAction, default=default_values.debug
)
parser.add_argument(
"--quiet", action=argparse.BooleanOptionalAction, default=default_values.quiet
)
parsed_args = parser.parse_args(args)
return Parameters.from_namespace(parsed_args)