diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE
index e31472a..eba1f84 100755
--- a/.github/PULL_REQUEST_TEMPLATE
+++ b/.github/PULL_REQUEST_TEMPLATE
@@ -12,18 +12,10 @@
- [ ] Documentation
- [ ] CI/CD or build configuration
- [ ] Dependencies update
+- [ ] Other
## Testing
-- [ ] Unit tests added/updated
-- [ ] Integration tests added/updated
-- [ ] All existing tests pass
- [ ] Manual testing performed
-## Checklist
-- [ ] Code follows the project's style and conventions
-- [ ] Documentation updated (if applicable)
-- [ ] No new warnings or linter errors introduced
-- [ ] I have considered how this change may affect other services
-
## Reviewer
- [ ] I understand that by approving this PR, I share responsibility for these changes
diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml
index 5e43d48..edcf01a 100755
--- a/.github/workflows/workflow.yml
+++ b/.github/workflows/workflow.yml
@@ -26,7 +26,7 @@ jobs:
fail-fast: false
matrix:
os: ['ubuntu-latest', 'macos-latest', 'windows-latest']
- python-version: ['3.11', '3.14']
+ python-version: ['3.12', '3.14']
defaults:
run:
working-directory: ${{ github.workspace }}
diff --git a/.gitignore b/.gitignore
index 38d305f..1337bdb 100755
--- a/.gitignore
+++ b/.gitignore
@@ -158,3 +158,4 @@ cython_debug/
# Custom
/junit.xml
*.prof
+/requirements.txt
diff --git a/LICENSE b/LICENSE
index badf491..56823d1 100755
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2024-present ddc
+Copyright (C) 2024 DDC Softwares
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 38a3417..086192d 100755
--- a/README.md
+++ b/README.md
@@ -1,26 +1,28 @@
-
+
- pythonLogs
+ pythonlogs
-
-
-
-
+
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
High-performance Python logging library with file rotation and optimized caching for better performance
@@ -67,7 +69,7 @@
# Installation
```shell
-pip install pythonLogs
+pip install pythonlogs
```
@@ -83,7 +85,7 @@ Console-only logging without file output. Perfect for development and simple app
### Usage
```python
-from pythonLogs import BasicLog
+from pythonlogs import BasicLog
logger = BasicLog(
name="my_app",
@@ -113,7 +115,7 @@ File-based logging with automatic rotation when files reach a specified size. Ro
### Usage
```python
-from pythonLogs import SizeRotatingLog
+from pythonlogs import SizeRotatingLog
logger = SizeRotatingLog(
name="my_app",
@@ -149,7 +151,7 @@ File-based logging with automatic rotation based on time intervals. Rotated file
### Usage
```python
-from pythonLogs import TimedRotatingLog
+from pythonlogs import TimedRotatingLog
logger = TimedRotatingLog(
name="my_app",
@@ -180,10 +182,10 @@ All logger types support context managers for automatic resource cleanup and exc
## Usage Examples
```python
-from pythonLogs import LogLevel
-from pythonLogs.basic_log import BasicLog
-from pythonLogs.size_rotating import SizeRotatingLog
-from pythonLogs.timed_rotating import TimedRotatingLog
+from pythonlogs import LogLevel
+from pythonlogs.basic_log import BasicLog
+from pythonlogs.size_rotating import SizeRotatingLog
+from pythonlogs.timed_rotating import TimedRotatingLog
# Automatic cleanup with context managers
with BasicLog(name="app", level=LogLevel.INFO) as logger:
@@ -210,7 +212,7 @@ except ValueError:
# Using With Multiple Log Levels and Files
```python
-from pythonLogs import SizeRotatingLog, TimedRotatingLog, LogLevel, RotateWhen
+from pythonlogs import SizeRotatingLog, TimedRotatingLog, LogLevel, RotateWhen
# Application logger
app_logger = SizeRotatingLog(
@@ -260,7 +262,7 @@ The .env variables file can be used by leaving all options blank when calling th
If not specified inside the .env file, it will use the default value.\
This is a good approach for production environments, since options can be changed easily.
```python
-from pythonLogs import TimedRotatingLog
+from pythonlogs import TimedRotatingLog
log = TimedRotatingLog()
```
@@ -292,7 +294,7 @@ LOG_ROTATE_FILE_SUFIX="%Y%m%d"
Use `get_log_settings()` to inspect current configuration and `clear_settings_cache()` to reload configuration from environment variables:
```python
-from pythonLogs import get_log_settings, clear_settings_cache
+from pythonlogs import get_log_settings, clear_settings_cache
# Inspect current settings
settings = get_log_settings()
@@ -316,7 +318,7 @@ clear_settings_cache(reload_env=False)
You can use either enums (for type safety) or strings (for simplicity):
```python
-from pythonLogs import LogLevel, RotateWhen
+from pythonlogs import LogLevel, RotateWhen
# Option 1: Type-safe enums (recommended)
LogLevel.DEBUG # "DEBUG"
@@ -397,8 +399,8 @@ Released under the [MIT License](LICENSE)
# Support
-If you find this project helpful, consider supporting development:
+If you find this project helpful, consider supporting development.
-- [GitHub Sponsor](https://github.com/sponsors/ddc)
-- [ko-fi](https://ko-fi.com/ddcsta)
-- [PayPal](https://www.paypal.com/ncp/payment/6G9Z78QHUD4RJ)
+
+
+
diff --git a/pyproject.toml b/pyproject.toml
index 53451c9..ea73d4d 100755
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,17 +6,17 @@ build-backend = "hatchling.build"
allow-direct-references = true
[tool.hatch.build]
-include = ["pythonLogs/**/*"]
+include = ["pythonlogs/**/*"]
[tool.hatch.build.targets.wheel]
-packages = ["pythonLogs"]
+packages = ["pythonlogs"]
[project]
-name = "pythonLogs"
-version = "6.0.3"
+name = "pythonlogs"
+version = "7.0.0"
description = "High-performance Python logging library with file rotation and optimized caching for better performance"
-urls.Repository = "https://github.com/ddc/pythonLogs"
-urls.Homepage = "https://pypi.org/project/pythonLogs"
+urls.Repository = "https://github.com/ddc/pythonlogs"
+urls.Homepage = "https://pypi.org/project/pythonlogs"
license = {text = "MIT"}
readme = "README.md"
authors = [
@@ -28,14 +28,13 @@ maintainers = [
keywords = [
"python", "python3", "python-3",
"log", "logging", "logger",
- "logutils", "log-utils", "pythonLogs"
+ "logutils", "log-utils", "pythonlogs"
]
classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules",
"Development Status :: 5 - Production/Stable",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
@@ -44,7 +43,7 @@ classifiers = [
"Intended Audience :: Developers",
"Natural Language :: English",
]
-requires-python = ">=3.11"
+requires-python = ">=3.12"
dependencies = [
"pydantic-settings>=2.11.0",
]
@@ -53,12 +52,14 @@ dependencies = [
dev = [
"psutil>=7.2.2",
"pytest-cov>=7.0.0",
- "poethepoet>=0.42.0",
- "ruff>=0.15.2",
+ "poethepoet>=0.42.1",
+ "ruff>=0.15.7",
]
[tool.poe.tasks]
linter.shell = "uv run ruff check --fix . && uv run ruff format ."
+snyk-export.shell = "rm -f requirements.txt && uv export --no-hashes --no-annotate --format requirements-txt > requirements.txt && uvx pre-commit run --all-files || uvx pre-commit run --all-files"
+snyk.sequence = ["snyk-export", { shell = "uv pip install pip && snyk test --file=requirements.txt && snyk code test; uv pip uninstall pip" }]
profile = "uv run python -m cProfile -o cprofile_unit.prof -m pytest --no-cov"
tests.sequence = ["linter", {shell = "uv run pytest"}]
updatedev.sequence = ["linter", {shell = "uv lock --upgrade && uv sync --all-extras --group dev"}]
@@ -96,18 +97,18 @@ exclude_lines = [
[tool.ruff]
line-length = 120
-target-version = "py311"
+target-version = "py312"
[tool.ruff.lint]
-select = ["E", "W", "F", "I", "B", "C4", "UP"]
+select = ["E", "W", "F", "I", "B", "C4", "UP", "S", "SLF"]
ignore = ["E501", "E402", "UP046", "UP047"]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"]
-"tests/**/*.py" = ["S101", "S105", "S106", "S311", "SLF001", "F841"]
+"tests/**/*.py" = ["S101", "S103", "S105", "S106", "S110", "S311", "S603", "S607", "SLF001", "F841"]
[tool.ruff.lint.isort]
-known-first-party = ["pythonLogs"]
+known-first-party = ["pythonlogs"]
force-sort-within-sections = false
from-first = false
no-sections = true
diff --git a/pythonLogs/.env.example b/pythonlogs/.env.example
similarity index 96%
rename from pythonLogs/.env.example
rename to pythonlogs/.env.example
index 42657fc..d6c1e5c 100644
--- a/pythonLogs/.env.example
+++ b/pythonlogs/.env.example
@@ -1,4 +1,4 @@
-# pythonLogs Environment Configuration
+# pythonlogs Environment Configuration
# Copy this file to .env and modify values as needed
# Main Settings
diff --git a/pythonLogs/__init__.py b/pythonlogs/__init__.py
similarity index 69%
rename from pythonLogs/__init__.py
rename to pythonlogs/__init__.py
index 69f2774..1063037 100755
--- a/pythonLogs/__init__.py
+++ b/pythonlogs/__init__.py
@@ -1,8 +1,8 @@
import logging
from importlib.metadata import version
-from pythonLogs.core.constants import LogLevel, RotateWhen
-from pythonLogs.core.factory import BasicLog, SizeRotatingLog, TimedRotatingLog
-from pythonLogs.core.settings import clear_settings_cache, get_log_settings
+from pythonlogs.core.constants import LogLevel, RotateWhen
+from pythonlogs.core.factory import BasicLog, SizeRotatingLog, TimedRotatingLog
+from pythonlogs.core.settings import clear_settings_cache, get_log_settings
__all__ = (
"BasicLog",
@@ -14,7 +14,7 @@
"get_log_settings",
)
-__title__ = "pythonLogs"
+__title__ = "pythonlogs"
__author__ = "Daniel Costa"
__email__ = "daniel@ddcsoftwares.com"
__license__ = "MIT"
diff --git a/pythonLogs/basic_log.py b/pythonlogs/basic_log.py
similarity index 89%
rename from pythonLogs/basic_log.py
rename to pythonlogs/basic_log.py
index 55e52b4..dcea3f3 100644
--- a/pythonLogs/basic_log.py
+++ b/pythonlogs/basic_log.py
@@ -1,8 +1,8 @@
import logging
-from pythonLogs.core.log_utils import cleanup_logger_handlers, get_format, get_level, get_timezone_function
-from pythonLogs.core.memory_utils import register_logger_weakref
-from pythonLogs.core.settings import get_log_settings
-from pythonLogs.core.thread_safety import auto_thread_safe
+from pythonlogs.core.log_utils import cleanup_logger_handlers, get_format, get_level, get_timezone_function
+from pythonlogs.core.memory_utils import register_logger_weakref
+from pythonlogs.core.settings import get_log_settings
+from pythonlogs.core.thread_safety import auto_thread_safe
@auto_thread_safe(["init"])
diff --git a/pythonLogs/core/__init__.py b/pythonlogs/core/__init__.py
similarity index 100%
rename from pythonLogs/core/__init__.py
rename to pythonlogs/core/__init__.py
diff --git a/pythonLogs/core/constants.py b/pythonlogs/core/constants.py
similarity index 100%
rename from pythonLogs/core/constants.py
rename to pythonlogs/core/constants.py
diff --git a/pythonLogs/core/factory.py b/pythonlogs/core/factory.py
similarity index 66%
rename from pythonLogs/core/factory.py
rename to pythonlogs/core/factory.py
index cf8bc3b..36ed39a 100644
--- a/pythonLogs/core/factory.py
+++ b/pythonlogs/core/factory.py
@@ -1,16 +1,16 @@
import atexit
+import dataclasses
import logging
import threading
import time
from dataclasses import dataclass
from enum import StrEnum
-from pythonLogs.basic_log import BasicLog as _BasicLogImpl
-from pythonLogs.core.constants import LogLevel, RotateWhen
-from pythonLogs.core.log_utils import cleanup_logger_handlers
-from pythonLogs.core.settings import get_log_settings
-from pythonLogs.size_rotating import SizeRotatingLog as _SizeRotatingLogImpl
-from pythonLogs.timed_rotating import TimedRotatingLog as _TimedRotatingLogImpl
-from typing import assert_never
+from pythonlogs.basic_log import BasicLog as _BasicLogImpl
+from pythonlogs.core.constants import LogLevel, RotateWhen
+from pythonlogs.core.log_utils import cleanup_logger_handlers
+from pythonlogs.core.settings import get_log_settings
+from pythonlogs.size_rotating import SizeRotatingLog as _SizeRotatingLogImpl
+from pythonlogs.timed_rotating import TimedRotatingLog as _TimedRotatingLogImpl
@dataclass
@@ -217,6 +217,48 @@ def get_memory_limits(cls) -> dict[str, int]:
with cls._registry_lock:
return {"max_loggers": cls._max_loggers, "ttl_seconds": cls._logger_ttl}
+ # Mapping of logger types to their implementation classes and accepted fields
+ _LOGGER_IMPL = {
+ LoggerType.BASIC: (
+ _BasicLogImpl,
+ {"level", "name", "encoding", "datefmt", "timezone", "showlocation"},
+ ),
+ LoggerType.SIZE_ROTATING: (
+ _SizeRotatingLogImpl,
+ {
+ "level",
+ "name",
+ "directory",
+ "filenames",
+ "maxmbytes",
+ "daystokeep",
+ "encoding",
+ "datefmt",
+ "timezone",
+ "streamhandler",
+ "showlocation",
+ },
+ ),
+ LoggerType.TIMED_ROTATING: (
+ _TimedRotatingLogImpl,
+ {
+ "level",
+ "name",
+ "directory",
+ "filenames",
+ "when",
+ "sufix",
+ "daystokeep",
+ "encoding",
+ "datefmt",
+ "timezone",
+ "streamhandler",
+ "showlocation",
+ "rotateatutc",
+ },
+ ),
+ }
+
@staticmethod
def create_logger(logger_type: LoggerType | str, config: LoggerConfig | None = None, **kwargs) -> logging.Logger:
"""
@@ -225,7 +267,7 @@ def create_logger(logger_type: LoggerType | str, config: LoggerConfig | None = N
Args:
logger_type: Type of logger to create (LoggerType enum or string)
config: LoggerConfig object with logger parameters
- **kwargs: Individual logger parameters (for backward compatibility)
+ **kwargs: Individual logger parameters (kwargs take precedence over config)
Returns:
Configured logger instance
@@ -242,159 +284,21 @@ def create_logger(logger_type: LoggerType | str, config: LoggerConfig | None = N
f"Invalid logger type: {logger_type}. Valid types: {[t.value for t in LoggerType]}"
) from err
- # Merge config and kwargs (kwargs take precedence for backward compatibility)
+ # Merge config and kwargs (kwargs take precedence)
if config is None:
config = LoggerConfig()
-
- # Create a new config with kwargs overriding config values
- final_config = LoggerConfig(
- level=kwargs.get("level", config.level),
- name=kwargs.get("name", config.name),
- directory=kwargs.get("directory", config.directory),
- filenames=kwargs.get("filenames", config.filenames),
- encoding=kwargs.get("encoding", config.encoding),
- datefmt=kwargs.get("datefmt", config.datefmt),
- timezone=kwargs.get("timezone", config.timezone),
- streamhandler=kwargs.get("streamhandler", config.streamhandler),
- showlocation=kwargs.get("showlocation", config.showlocation),
- maxmbytes=kwargs.get("maxmbytes", config.maxmbytes),
- when=kwargs.get("when", config.when),
- sufix=kwargs.get("sufix", config.sufix),
- rotateatutc=kwargs.get("rotateatutc", config.rotateatutc),
- daystokeep=kwargs.get("daystokeep", config.daystokeep),
- )
+ merged = {f.name: kwargs.get(f.name, getattr(config, f.name)) for f in dataclasses.fields(LoggerConfig)}
# Convert enum values to strings for logger classes
- level_str = final_config.level.value if isinstance(final_config.level, LogLevel) else final_config.level
- when_str = final_config.when.value if isinstance(final_config.when, RotateWhen) else final_config.when
-
- # Create logger based on type
- match logger_type:
- case LoggerType.BASIC:
- return _BasicLogImpl(
- level=level_str,
- name=final_config.name,
- encoding=final_config.encoding,
- datefmt=final_config.datefmt,
- timezone=final_config.timezone,
- showlocation=final_config.showlocation,
- ).init()
- case LoggerType.SIZE_ROTATING:
- return _SizeRotatingLogImpl(
- level=level_str,
- name=final_config.name,
- directory=final_config.directory,
- filenames=final_config.filenames,
- maxmbytes=final_config.maxmbytes,
- daystokeep=final_config.daystokeep,
- encoding=final_config.encoding,
- datefmt=final_config.datefmt,
- timezone=final_config.timezone,
- streamhandler=final_config.streamhandler,
- showlocation=final_config.showlocation,
- ).init()
- case LoggerType.TIMED_ROTATING:
- return _TimedRotatingLogImpl(
- level=level_str,
- name=final_config.name,
- directory=final_config.directory,
- filenames=final_config.filenames,
- when=when_str,
- sufix=final_config.sufix,
- daystokeep=final_config.daystokeep,
- encoding=final_config.encoding,
- datefmt=final_config.datefmt,
- timezone=final_config.timezone,
- streamhandler=final_config.streamhandler,
- showlocation=final_config.showlocation,
- rotateatutc=final_config.rotateatutc,
- ).init()
- case _ as unreachable: # pragma: no cover
- assert_never(unreachable)
-
- @staticmethod
- def create_basic_logger(
- level: LogLevel | str | None = None,
- name: str | None = None,
- encoding: str | None = None,
- datefmt: str | None = None,
- timezone: str | None = None,
- showlocation: bool | None = None,
- ) -> logging.Logger:
- """Convenience method for creating a basic logger"""
- return LoggerFactory.create_logger(
- LoggerType.BASIC,
- level=level,
- name=name,
- encoding=encoding,
- datefmt=datefmt,
- timezone=timezone,
- showlocation=showlocation,
- )
-
- @staticmethod
- def create_size_rotating_logger(
- level: LogLevel | str | None = None,
- name: str | None = None,
- directory: str | None = None,
- filenames: list | tuple | None = None,
- maxmbytes: int | None = None,
- daystokeep: int | None = None,
- encoding: str | None = None,
- datefmt: str | None = None,
- timezone: str | None = None,
- streamhandler: bool | None = None,
- showlocation: bool | None = None,
- ) -> logging.Logger:
- """Convenience method for creating a size rotating logger"""
- return LoggerFactory.create_logger(
- LoggerType.SIZE_ROTATING,
- level=level,
- name=name,
- directory=directory,
- filenames=filenames,
- maxmbytes=maxmbytes,
- daystokeep=daystokeep,
- encoding=encoding,
- datefmt=datefmt,
- timezone=timezone,
- streamhandler=streamhandler,
- showlocation=showlocation,
- )
+ if isinstance(merged.get("level"), LogLevel):
+ merged["level"] = merged["level"].value
+ if isinstance(merged.get("when"), RotateWhen):
+ merged["when"] = merged["when"].value
- @staticmethod
- def create_timed_rotating_logger(
- level: LogLevel | str | None = None,
- name: str | None = None,
- directory: str | None = None,
- filenames: list | tuple | None = None,
- when: RotateWhen | str | None = None,
- sufix: str | None = None,
- daystokeep: int | None = None,
- encoding: str | None = None,
- datefmt: str | None = None,
- timezone: str | None = None,
- streamhandler: bool | None = None,
- showlocation: bool | None = None,
- rotateatutc: bool | None = None,
- ) -> logging.Logger:
- """Convenience method for creating a timed rotating logger"""
- return LoggerFactory.create_logger(
- LoggerType.TIMED_ROTATING,
- level=level,
- name=name,
- directory=directory,
- filenames=filenames,
- when=when,
- sufix=sufix,
- daystokeep=daystokeep,
- encoding=encoding,
- datefmt=datefmt,
- timezone=timezone,
- streamhandler=streamhandler,
- showlocation=showlocation,
- rotateatutc=rotateatutc,
- )
+ # Create logger using table-driven dispatch
+ impl_class, valid_fields = LoggerFactory._LOGGER_IMPL[logger_type]
+ logger_kwargs = {k: v for k, v in merged.items() if k in valid_fields}
+ return impl_class(**logger_kwargs).init()
# Public API wrapper classes - act like logging.Logger with context manager support
@@ -439,7 +343,8 @@ def __init__(
timezone: str | None = None,
showlocation: bool | None = None,
):
- self._logger = LoggerFactory.create_basic_logger(
+ self._logger = LoggerFactory.create_logger(
+ LoggerType.BASIC,
level=level,
name=name,
encoding=encoding,
@@ -477,7 +382,8 @@ def __init__(
streamhandler: bool | None = None,
showlocation: bool | None = None,
):
- self._logger = LoggerFactory.create_size_rotating_logger(
+ self._logger = LoggerFactory.create_logger(
+ LoggerType.SIZE_ROTATING,
level=level,
name=name,
directory=directory,
@@ -522,7 +428,8 @@ def __init__(
showlocation: bool | None = None,
rotateatutc: bool | None = None,
):
- self._logger = LoggerFactory.create_timed_rotating_logger(
+ self._logger = LoggerFactory.create_logger(
+ LoggerType.TIMED_ROTATING,
level=level,
name=name,
directory=directory,
diff --git a/pythonLogs/core/log_utils.py b/pythonlogs/core/log_utils.py
similarity index 99%
rename from pythonLogs/core/log_utils.py
rename to pythonlogs/core/log_utils.py
index af6479b..9d2f6a3 100644
--- a/pythonLogs/core/log_utils.py
+++ b/pythonlogs/core/log_utils.py
@@ -11,7 +11,7 @@
from datetime import UTC, datetime, timedelta
from functools import lru_cache
from pathlib import Path
-from pythonLogs.core.constants import DEFAULT_FILE_MODE, LEVEL_MAP
+from pythonlogs.core.constants import DEFAULT_FILE_MODE, LEVEL_MAP
from zoneinfo import ZoneInfo
diff --git a/pythonLogs/core/memory_utils.py b/pythonlogs/core/memory_utils.py
similarity index 100%
rename from pythonLogs/core/memory_utils.py
rename to pythonlogs/core/memory_utils.py
diff --git a/pythonLogs/core/settings.py b/pythonlogs/core/settings.py
similarity index 98%
rename from pythonLogs/core/settings.py
rename to pythonlogs/core/settings.py
index af9ea0a..a58456b 100644
--- a/pythonLogs/core/settings.py
+++ b/pythonlogs/core/settings.py
@@ -2,7 +2,7 @@
from functools import lru_cache
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
-from pythonLogs.core.constants import (
+from pythonlogs.core.constants import (
DEFAULT_BACKUP_COUNT,
DEFAULT_DATE_FORMAT,
DEFAULT_ENCODING,
diff --git a/pythonLogs/core/thread_safety.py b/pythonlogs/core/thread_safety.py
similarity index 93%
rename from pythonLogs/core/thread_safety.py
rename to pythonlogs/core/thread_safety.py
index e8f2031..79ba958 100644
--- a/pythonLogs/core/thread_safety.py
+++ b/pythonlogs/core/thread_safety.py
@@ -52,12 +52,13 @@ def wrapper(self, *args, **kwargs):
if lock is None:
# Check if class has lock, if not create one
if not hasattr(self.__class__, "_lock"):
- self.__class__._lock = threading.RLock()
- lock = self.__class__._lock
+ self.__class__._lock = threading.RLock() # noqa: SLF001
+ lock = self.__class__._lock # noqa: SLF001
with lock:
return func(self, *args, **kwargs)
+ wrapper.thread_safe_wrapped = True
return wrapper
@@ -83,7 +84,7 @@ def _ensure_class_has_lock(cls: type) -> None:
def _should_wrap_method(cls: type, method_name: str, original_method: Any) -> bool:
"""Check if a method should be wrapped with thread safety."""
return (
- hasattr(cls, method_name) and callable(original_method) and not hasattr(original_method, "_thread_safe_wrapped")
+ hasattr(cls, method_name) and callable(original_method) and not hasattr(original_method, "thread_safe_wrapped")
)
@@ -105,7 +106,6 @@ def decorator(cls: type) -> type:
original_method = getattr(cls, method_name, None)
if _should_wrap_method(cls, method_name, original_method):
wrapped_method = thread_safe(original_method)
- wrapped_method._thread_safe_wrapped = True
setattr(cls, method_name, wrapped_method)
return cls
@@ -131,9 +131,8 @@ def __init_subclass__(cls, **kwargs):
for attr_name in dir(cls):
if not attr_name.startswith("_"):
attr = getattr(cls, attr_name)
- if callable(attr) and not hasattr(attr, "_thread_safe_wrapped"):
+ if callable(attr) and not hasattr(attr, "thread_safe_wrapped"):
wrapped_attr = thread_safe(attr)
- wrapped_attr._thread_safe_wrapped = True
setattr(cls, attr_name, wrapped_attr)
diff --git a/pythonLogs/size_rotating.py b/pythonlogs/size_rotating.py
similarity index 94%
rename from pythonLogs/size_rotating.py
rename to pythonlogs/size_rotating.py
index 361e3e2..380ce6f 100755
--- a/pythonLogs/size_rotating.py
+++ b/pythonlogs/size_rotating.py
@@ -2,8 +2,8 @@
import os
import re
from pathlib import Path
-from pythonLogs.core.constants import MB_TO_BYTES
-from pythonLogs.core.log_utils import (
+from pythonlogs.core.constants import MB_TO_BYTES
+from pythonlogs.core.log_utils import (
RotatingLogMixin,
check_directory_permissions,
check_filename_instance,
@@ -15,9 +15,9 @@
remove_old_logs,
write_stderr,
)
-from pythonLogs.core.memory_utils import register_logger_weakref
-from pythonLogs.core.settings import get_log_settings
-from pythonLogs.core.thread_safety import auto_thread_safe
+from pythonlogs.core.memory_utils import register_logger_weakref
+from pythonlogs.core.settings import get_log_settings
+from pythonlogs.core.thread_safety import auto_thread_safe
@auto_thread_safe(["init"])
diff --git a/pythonLogs/timed_rotating.py b/pythonlogs/timed_rotating.py
similarity index 94%
rename from pythonLogs/timed_rotating.py
rename to pythonlogs/timed_rotating.py
index ac2298f..ee4f237 100755
--- a/pythonLogs/timed_rotating.py
+++ b/pythonlogs/timed_rotating.py
@@ -1,6 +1,6 @@
import logging.handlers
import os
-from pythonLogs.core.log_utils import (
+from pythonlogs.core.log_utils import (
RotatingLogMixin,
check_directory_permissions,
check_filename_instance,
@@ -11,9 +11,9 @@
gzip_file_with_sufix,
remove_old_logs,
)
-from pythonLogs.core.memory_utils import register_logger_weakref
-from pythonLogs.core.settings import get_log_settings
-from pythonLogs.core.thread_safety import auto_thread_safe
+from pythonlogs.core.memory_utils import register_logger_weakref
+from pythonlogs.core.settings import get_log_settings
+from pythonlogs.core.thread_safety import auto_thread_safe
@auto_thread_safe(["init"])
diff --git a/tests/context_management/test_context_managers.py b/tests/context_management/test_context_managers.py
index e5f5cc6..3fee60d 100644
--- a/tests/context_management/test_context_managers.py
+++ b/tests/context_management/test_context_managers.py
@@ -7,14 +7,14 @@
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import pytest
-from pythonLogs import (
+from pythonlogs import (
LogLevel,
RotateWhen,
)
-from pythonLogs.basic_log import BasicLog
-from pythonLogs.core.factory import LoggerFactory, clear_logger_registry
-from pythonLogs.size_rotating import SizeRotatingLog
-from pythonLogs.timed_rotating import TimedRotatingLog
+from pythonlogs.basic_log import BasicLog
+from pythonlogs.core.factory import LoggerFactory, clear_logger_registry
+from pythonlogs.size_rotating import SizeRotatingLog
+from pythonlogs.timed_rotating import TimedRotatingLog
@pytest.mark.skipif(
diff --git a/tests/context_management/test_resource_management.py b/tests/context_management/test_resource_management.py
index 5d94c25..f22131f 100644
--- a/tests/context_management/test_resource_management.py
+++ b/tests/context_management/test_resource_management.py
@@ -11,11 +11,11 @@
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import pytest
-from pythonLogs import (
+from pythonlogs import (
LogLevel,
)
-from pythonLogs.basic_log import BasicLog as BasicLogImpl
-from pythonLogs.core.factory import (
+from pythonlogs.basic_log import BasicLog as BasicLogImpl
+from pythonlogs.core.factory import (
LoggerFactory,
LoggerType,
clear_logger_registry,
@@ -51,7 +51,8 @@ def test_factory_registry_cleanup(self):
logger_name = "test_registry_cleanup"
# Create logger through factory (returns logging.Logger)
- logger = LoggerFactory.create_size_rotating_logger(
+ logger = LoggerFactory.create_logger(
+ LoggerType.SIZE_ROTATING,
name=logger_name,
directory=self.temp_dir,
filenames=[self.log_file],
@@ -150,7 +151,8 @@ def test_registry_clear_with_file_handlers(self):
logger_name = "test_file_handlers"
# Create logger with file handlers (returns logging.Logger)
- logger = LoggerFactory.create_size_rotating_logger(
+ logger = LoggerFactory.create_logger(
+ LoggerType.SIZE_ROTATING,
name=logger_name,
directory=self.temp_dir,
filenames=[self.log_file, "second.log"],
@@ -186,7 +188,8 @@ def test_resource_cleanup_performance(self):
# Create multiple loggers using factory
start_time = time.time()
for name in logger_names:
- logger = LoggerFactory.create_size_rotating_logger(
+ logger = LoggerFactory.create_logger(
+ LoggerType.SIZE_ROTATING,
name=name,
directory=self.temp_dir,
filenames=[f"{name}.log"],
@@ -218,7 +221,8 @@ def test_memory_usage_after_cleanup(self):
logger_name = "memory_test_logger"
# Create logger using factory (returns logging.Logger)
- logger = LoggerFactory.create_size_rotating_logger(
+ logger = LoggerFactory.create_logger(
+ LoggerType.SIZE_ROTATING,
name=logger_name,
directory=self.temp_dir,
filenames=[self.log_file],
@@ -258,7 +262,7 @@ def create_and_cleanup_logger(index):
"""Create a logger and immediately clean it up."""
logger_name = f"concurrent_test_{index}"
# Use factory to create logger (returns logging.Logger)
- logger = LoggerFactory.create_basic_logger(name=logger_name, level=LogLevel.INFO.value)
+ logger = LoggerFactory.create_logger(LoggerType.BASIC, name=logger_name, level=LogLevel.INFO.value)
# Add to registry
LoggerFactory._logger_registry[logger_name] = (logger, time.time())
diff --git a/tests/core/test_basic_log.py b/tests/core/test_basic_log.py
index 11b1b1b..998375a 100644
--- a/tests/core/test_basic_log.py
+++ b/tests/core/test_basic_log.py
@@ -6,9 +6,9 @@
# Add the parent directory to sys.path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import LogLevel
-from pythonLogs.basic_log import BasicLog
-from pythonLogs.core.factory import clear_logger_registry
+from pythonlogs import LogLevel
+from pythonlogs.basic_log import BasicLog
+from pythonlogs.core.factory import clear_logger_registry
class TestBasicLog:
diff --git a/tests/core/test_log_utils.py b/tests/core/test_log_utils.py
index 877414b..73eafe1 100644
--- a/tests/core/test_log_utils.py
+++ b/tests/core/test_log_utils.py
@@ -15,7 +15,7 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs.core import log_utils
+from pythonlogs.core import log_utils
# ============================================================================
# UTILITY FUNCTIONS
@@ -1494,7 +1494,7 @@ def mock_zoneinfo(key):
return ZoneInfo(key)
try:
- with unittest.mock.patch("pythonLogs.core.log_utils.ZoneInfo", side_effect=mock_zoneinfo):
+ with unittest.mock.patch("pythonlogs.core.log_utils.ZoneInfo", side_effect=mock_zoneinfo):
result = log_utils.get_timezone_function("UTC")
# Should fall back to localtime (lines 273-275)
@@ -1519,7 +1519,7 @@ def mock_zoneinfo(key):
return ZoneInfo(key)
try:
- with unittest.mock.patch("pythonLogs.core.log_utils.ZoneInfo", side_effect=mock_zoneinfo):
+ with unittest.mock.patch("pythonlogs.core.log_utils.ZoneInfo", side_effect=mock_zoneinfo):
result = log_utils.get_timezone_function("Custom/Timezone")
# Should fall back to localtime (lines 283-285)
diff --git a/tests/core/test_log_utils_windows.py b/tests/core/test_log_utils_windows.py
index 1f8b90a..8be2b22 100644
--- a/tests/core/test_log_utils_windows.py
+++ b/tests/core/test_log_utils_windows.py
@@ -20,7 +20,7 @@
# Add current directory to path for local imports
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
-from pythonLogs.core import log_utils
+from pythonlogs.core import log_utils
# Import utility functions from the same directory
from test_log_utils import (
@@ -170,7 +170,7 @@ def test_gzip_file_windows_retry_mechanism(self):
file_handle.close()
# Mock time.sleep to verify retry mechanism
- with patch("pythonLogs.core.log_utils.time.sleep") as mock_sleep:
+ with patch("pythonlogs.core.log_utils.time.sleep") as mock_sleep:
# Mock open to raise PermissionError on first call, succeed on second
call_count = 0
original_open = open
@@ -186,8 +186,8 @@ def mock_open_side_effect(*args, real_open=original_open, **kwargs):
return real_open(*args, **kwargs)
# Always mock platform as win32 and open with retry behavior
- with patch("pythonLogs.core.log_utils.sys.platform", "win32"):
- with patch("pythonLogs.core.log_utils.open", side_effect=mock_open_side_effect):
+ with patch("pythonlogs.core.log_utils.sys.platform", "win32"):
+ with patch("pythonlogs.core.log_utils.open", side_effect=mock_open_side_effect):
result = log_utils.gzip_file_with_sufix(file_path, "retry_test")
# Verify retry was attempted (sleep was called)
@@ -504,9 +504,9 @@ def mock_open_side_effect(*args, **kwargs):
return original_open(*args, **kwargs)
# Mock sys.platform to be Windows and time.sleep to verify retry
- with unittest.mock.patch("pythonLogs.core.log_utils.sys.platform", "win32"):
- with unittest.mock.patch("pythonLogs.core.log_utils.time.sleep") as mock_sleep:
- with unittest.mock.patch("pythonLogs.core.log_utils.open", side_effect=mock_open_side_effect):
+ with unittest.mock.patch("pythonlogs.core.log_utils.sys.platform", "win32"):
+ with unittest.mock.patch("pythonlogs.core.log_utils.time.sleep") as mock_sleep:
+ with unittest.mock.patch("pythonlogs.core.log_utils.open", side_effect=mock_open_side_effect):
result = log_utils.gzip_file_with_sufix(file_path, "comprehensive_retry")
# Verify retries were attempted (sleep should be called twice)
diff --git a/tests/core/test_settings.py b/tests/core/test_settings.py
index 2f830d8..5489486 100644
--- a/tests/core/test_settings.py
+++ b/tests/core/test_settings.py
@@ -1,14 +1,14 @@
"""Tests for settings module."""
import os
-from pythonLogs.core.constants import (
+from pythonlogs.core.constants import (
DEFAULT_BACKUP_COUNT,
DEFAULT_DATE_FORMAT,
DEFAULT_ENCODING,
DEFAULT_ROTATE_SUFFIX,
DEFAULT_TIMEZONE,
)
-from pythonLogs.core.settings import (
+from pythonlogs.core.settings import (
LogSettings,
clear_settings_cache,
get_log_settings,
@@ -61,7 +61,7 @@ def test_env_prefix(self):
def test_custom_values(self):
"""Test LogSettings with custom values."""
- from pythonLogs.core.constants import LogLevel
+ from pythonlogs.core.constants import LogLevel
settings = LogSettings(
level=LogLevel.DEBUG,
@@ -156,7 +156,7 @@ def test_clears_cache(self):
def test_reloads_env_by_default(self):
"""Test that clear_settings_cache resets dotenv flag by default."""
- import pythonLogs.core.settings as settings_module
+ import pythonlogs.core.settings as settings_module
# Ensure dotenv is loaded
get_log_settings()
@@ -168,7 +168,7 @@ def test_reloads_env_by_default(self):
def test_keeps_env_when_reload_false(self):
"""Test that clear_settings_cache keeps dotenv flag when reload_env=False."""
- import pythonLogs.core.settings as settings_module
+ import pythonlogs.core.settings as settings_module
# Ensure dotenv is loaded
get_log_settings()
@@ -200,27 +200,27 @@ class TestPublicExports:
"""Test that clear_settings_cache and get_log_settings are exported from main module."""
def test_clear_settings_cache_import_from_main_module(self):
- """Test that clear_settings_cache can be imported from pythonLogs."""
- from pythonLogs import clear_settings_cache as exported_func
- from pythonLogs.core.settings import clear_settings_cache as original_func
+ """Test that clear_settings_cache can be imported from pythonlogs."""
+ from pythonlogs import clear_settings_cache as exported_func
+ from pythonlogs.core.settings import clear_settings_cache as original_func
assert exported_func is original_func
def test_clear_settings_cache_in_all(self):
"""Test that clear_settings_cache is in __all__."""
- import pythonLogs
+ import pythonlogs
- assert "clear_settings_cache" in pythonLogs.__all__
+ assert "clear_settings_cache" in pythonlogs.__all__
def test_get_log_settings_import_from_main_module(self):
- """Test that get_log_settings can be imported from pythonLogs."""
- from pythonLogs import get_log_settings as exported_func
- from pythonLogs.core.settings import get_log_settings as original_func
+ """Test that get_log_settings can be imported from pythonlogs."""
+ from pythonlogs import get_log_settings as exported_func
+ from pythonlogs.core.settings import get_log_settings as original_func
assert exported_func is original_func
def test_get_log_settings_in_all(self):
"""Test that get_log_settings is in __all__."""
- import pythonLogs
+ import pythonlogs
- assert "get_log_settings" in pythonLogs.__all__
+ assert "get_log_settings" in pythonlogs.__all__
diff --git a/tests/factory/test_enums.py b/tests/factory/test_enums.py
index 2eae93f..1725fcc 100644
--- a/tests/factory/test_enums.py
+++ b/tests/factory/test_enums.py
@@ -9,13 +9,13 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
RotateWhen,
TimedRotatingLog,
)
-from pythonLogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
+from pythonlogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
class TestEnumUsage:
diff --git a/tests/factory/test_factory.py b/tests/factory/test_factory.py
index 68128c6..dad9644 100644
--- a/tests/factory/test_factory.py
+++ b/tests/factory/test_factory.py
@@ -11,14 +11,14 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
RotateWhen,
SizeRotatingLog,
TimedRotatingLog,
)
-from pythonLogs.core.factory import (
+from pythonlogs.core.factory import (
LoggerFactory,
LoggerType,
clear_logger_registry,
@@ -164,8 +164,12 @@ def test_factory_create_logger_invalid_type(self):
def test_factory_create_size_rotating_logger(self):
"""Test factory create_size_rotating_logger method."""
with tempfile.TemporaryDirectory() as temp_dir:
- logger = LoggerFactory.create_size_rotating_logger(
- name="size_factory_test", directory=temp_dir, maxmbytes=10, level=LogLevel.INFO
+ logger = LoggerFactory.create_logger(
+ LoggerType.SIZE_ROTATING,
+ name="size_factory_test",
+ directory=temp_dir,
+ maxmbytes=10,
+ level=LogLevel.INFO,
)
assert logger.name == "size_factory_test"
@@ -176,14 +180,18 @@ def test_factory_create_size_rotating_logger(self):
def test_factory_create_timed_rotating_logger(self):
"""Test factory create_timed_rotating_logger method."""
with tempfile.TemporaryDirectory() as temp_dir:
- logger = LoggerFactory.create_timed_rotating_logger(
- name="timed_factory_test", directory=temp_dir, when=RotateWhen.DAILY, level="ERROR"
+ logger = LoggerFactory.create_logger(
+ LoggerType.TIMED_ROTATING,
+ name="timed_factory_test",
+ directory=temp_dir,
+ when=RotateWhen.DAILY,
+ level="ERROR",
)
assert logger.name == "timed_factory_test"
def test_factory_create_basic_logger(self):
"""Test factory create_basic_logger method."""
- logger = LoggerFactory.create_basic_logger(name="basic_factory_test", level=LogLevel.CRITICAL)
+ logger = LoggerFactory.create_logger(LoggerType.BASIC, name="basic_factory_test", level=LogLevel.CRITICAL)
assert logger.name == "basic_factory_test"
assert logger.level == 50 # CRITICAL level
@@ -382,7 +390,7 @@ def test_factory_memory_limits_from_settings(self):
mock_settings.logger_ttl_seconds = 1800
# Patch the import inside the function
- with patch("pythonLogs.core.factory.get_log_settings", return_value=mock_settings):
+ with patch("pythonlogs.core.factory.get_log_settings", return_value=mock_settings):
# Reset initialization flag
LoggerFactory._initialized = False
@@ -478,7 +486,7 @@ def test_timed_rotating_log_context_manager(self):
def test_shutdown_logger_convenience_function(self):
"""Test shutdown_logger convenience function."""
- from pythonLogs.core.factory import shutdown_logger
+ from pythonlogs.core.factory import shutdown_logger
# Create and register a logger
LoggerFactory.get_or_create_logger(LoggerType.BASIC, name="shutdown_conv_test")
diff --git a/tests/factory/test_factory_examples.py b/tests/factory/test_factory_examples.py
index c7afbf0..2ae6918 100644
--- a/tests/factory/test_factory_examples.py
+++ b/tests/factory/test_factory_examples.py
@@ -10,14 +10,14 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
RotateWhen,
SizeRotatingLog,
TimedRotatingLog,
)
-from pythonLogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
+from pythonlogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
class TestFactoryExamples:
diff --git a/tests/factory/test_factory_windows.py b/tests/factory/test_factory_windows.py
index 490fb8c..545c6b8 100644
--- a/tests/factory/test_factory_windows.py
+++ b/tests/factory/test_factory_windows.py
@@ -8,14 +8,14 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
RotateWhen,
SizeRotatingLog,
TimedRotatingLog,
)
-from pythonLogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
+from pythonlogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
# Import Windows-safe utilities for test cleanup
from tests.core.test_log_utils import (
@@ -69,7 +69,8 @@ def test_logger_with_file_output_windows(self):
def test_factory_create_size_rotating_logger_windows(self):
"""Test factory create_size_rotating_logger method on Windows."""
with windows_safe_temp_directory() as temp_dir:
- logger = LoggerFactory.create_size_rotating_logger(
+ logger = LoggerFactory.create_logger(
+ LoggerType.SIZE_ROTATING,
name="size_factory_test_win",
directory=temp_dir,
maxmbytes=10,
@@ -81,7 +82,8 @@ def test_factory_create_size_rotating_logger_windows(self):
def test_factory_create_timed_rotating_logger_windows(self):
"""Test factory create_timed_rotating_logger method on Windows."""
with windows_safe_temp_directory() as temp_dir:
- logger = LoggerFactory.create_timed_rotating_logger(
+ logger = LoggerFactory.create_logger(
+ LoggerType.TIMED_ROTATING,
name="timed_factory_test_win",
directory=temp_dir,
when=RotateWhen.DAILY,
@@ -379,7 +381,8 @@ def test_windows_file_locking_resilience_factory(self):
"""Test that Windows file locking resilience works with factory-created loggers."""
with windows_safe_temp_directory() as temp_dir:
# Create multiple loggers that write to the same directory
- logger1 = LoggerFactory.create_size_rotating_logger(
+ logger1 = LoggerFactory.create_logger(
+ LoggerType.SIZE_ROTATING,
name="resilience_test1_win",
directory=temp_dir,
filenames=["resilience1.log"],
@@ -387,7 +390,8 @@ def test_windows_file_locking_resilience_factory(self):
level=LogLevel.INFO,
)
- logger2 = LoggerFactory.create_timed_rotating_logger(
+ logger2 = LoggerFactory.create_logger(
+ LoggerType.TIMED_ROTATING,
name="resilience_test2_win",
directory=temp_dir,
filenames=["resilience2.log"],
diff --git a/tests/factory/test_string_levels.py b/tests/factory/test_string_levels.py
index 7f930c0..469f4a0 100644
--- a/tests/factory/test_string_levels.py
+++ b/tests/factory/test_string_levels.py
@@ -7,14 +7,14 @@
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import pytest
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
RotateWhen,
SizeRotatingLog,
TimedRotatingLog,
)
-from pythonLogs.core.factory import LoggerFactory, clear_logger_registry
+from pythonlogs.core.factory import LoggerFactory, clear_logger_registry
from tests.core.test_log_utils import cleanup_all_loggers, safe_delete_directory
diff --git a/tests/logger_types/test_size_rotating.py b/tests/logger_types/test_size_rotating.py
index 661c2cc..9022296 100644
--- a/tests/logger_types/test_size_rotating.py
+++ b/tests/logger_types/test_size_rotating.py
@@ -12,7 +12,7 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs.size_rotating import GZipRotatorSize, SizeRotatingLog
+from pythonlogs.size_rotating import GZipRotatorSize, SizeRotatingLog
class TestSizeRotatingLog:
@@ -322,7 +322,7 @@ def test_gzip_rotator_size_call_with_nonexistent_source(self):
gz_files = list(Path(temp_dir).glob("*.gz"))
assert len(gz_files) == 0
- @patch("pythonLogs.size_rotating.remove_old_logs")
+ @patch("pythonlogs.size_rotating.remove_old_logs")
@pytest.mark.skipif(
sys.platform == "win32",
reason="Windows file locking issues with TemporaryDirectory - see equivalent Windows-specific test file",
diff --git a/tests/logger_types/test_timed_rotating.py b/tests/logger_types/test_timed_rotating.py
index 873437f..75d552d 100644
--- a/tests/logger_types/test_timed_rotating.py
+++ b/tests/logger_types/test_timed_rotating.py
@@ -12,8 +12,8 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import RotateWhen
-from pythonLogs.timed_rotating import GZipRotatorTimed, TimedRotatingLog
+from pythonlogs import RotateWhen
+from pythonlogs.timed_rotating import GZipRotatorTimed, TimedRotatingLog
class TestTimedRotatingLog:
@@ -323,7 +323,7 @@ def test_gzip_rotator_timed_suffix_extraction(self):
# Reset source file
source_file.write_text("Test content")
- with patch("pythonLogs.timed_rotating.gzip_file_with_sufix") as mock_gzip:
+ with patch("pythonlogs.timed_rotating.gzip_file_with_sufix") as mock_gzip:
rotator(str(source_file), dest_filename)
mock_gzip.assert_called_once_with(str(source_file), expected_suffix)
@@ -343,7 +343,7 @@ def test_gzip_rotator_timed_with_nonexistent_source(self):
gz_files = list(Path(temp_dir).glob("*.gz"))
assert len(gz_files) == 0
- @patch("pythonLogs.timed_rotating.remove_old_logs")
+ @patch("pythonlogs.timed_rotating.remove_old_logs")
@pytest.mark.skipif(
sys.platform == "win32",
reason="Windows file locking issues with TemporaryDirectory - see equivalent Windows-specific test file",
@@ -362,7 +362,7 @@ def test_gzip_rotator_timed_calls_remove_old_logs(self, mock_remove_old_logs):
# Should have called remove_old_logs
mock_remove_old_logs.assert_called_once_with(temp_dir, 7)
- @patch("pythonLogs.timed_rotating.gzip_file_with_sufix")
+ @patch("pythonlogs.timed_rotating.gzip_file_with_sufix")
@pytest.mark.skipif(
sys.platform == "win32",
reason="Windows file locking issues with TemporaryDirectory - see equivalent Windows-specific test file",
@@ -431,7 +431,7 @@ def test_gzip_rotator_timed_suffix_edge_cases(self):
for dest_filename, expected_suffix in edge_cases:
source_file.write_text("Test content") # Reset file
- with patch("pythonLogs.timed_rotating.gzip_file_with_sufix") as mock_gzip:
+ with patch("pythonlogs.timed_rotating.gzip_file_with_sufix") as mock_gzip:
rotator(str(source_file), dest_filename)
if dest_filename: # Only call if dest_filename is not empty
mock_gzip.assert_called_once_with(str(source_file), expected_suffix)
diff --git a/tests/performance/test_memory_optimization.py b/tests/performance/test_memory_optimization.py
index 3337a76..96cf47d 100644
--- a/tests/performance/test_memory_optimization.py
+++ b/tests/performance/test_memory_optimization.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-"""Test memory optimization features of the pythonLogs library."""
+"""Test memory optimization features of the pythonlogs library."""
import gc
import os
@@ -11,12 +11,12 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
)
-from pythonLogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
-from pythonLogs.core.memory_utils import (
+from pythonlogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
+from pythonlogs.core.memory_utils import (
clear_directory_cache,
clear_formatter_cache,
force_garbage_collection,
@@ -91,7 +91,7 @@ def test_logger_registry_ttl(self):
def test_directory_cache_size_limit(self):
"""Test that directory cache enforces size limits."""
- import pythonLogs.core.log_utils as log_utils
+ import pythonlogs.core.log_utils as log_utils
# Set a small limit for testing
set_directory_cache_limit(3)
@@ -117,7 +117,7 @@ def test_directory_cache_size_limit(self):
def test_formatter_cache_efficiency(self):
"""Test that formatters are cached and reused efficiently."""
- from pythonLogs.core.memory_utils import get_cached_formatter
+ from pythonlogs.core.memory_utils import get_cached_formatter
# Clear cache first
clear_formatter_cache()
@@ -170,7 +170,7 @@ def test_memory_stats_reporting(self):
def test_weak_reference_tracking(self):
"""Test that weak references track active loggers correctly."""
- from pythonLogs.core.memory_utils import get_active_logger_count
+ from pythonlogs.core.memory_utils import get_active_logger_count
initial_count = get_active_logger_count()
@@ -194,7 +194,7 @@ def create_temporary_loggers():
def test_lru_cache_optimization(self):
"""Test LRU cache size optimization."""
- from pythonLogs.core import log_utils
+ from pythonlogs.core import log_utils
# Get initial cache info
initial_timezone_cache = log_utils.get_timezone_function.cache_info()
@@ -259,7 +259,7 @@ def memory_worker(worker_id):
stats = get_memory_stats()
# Use formatter cache
- from pythonLogs.core.memory_utils import get_cached_formatter
+ from pythonlogs.core.memory_utils import get_cached_formatter
formatter = get_cached_formatter(f"[%(levelname)s]:{worker_id}:%(message)s")
@@ -331,8 +331,8 @@ def test_logger_cleanup_on_context_exit(self):
"""Test that logger cleanup works properly with context managers."""
# Track initial handler count
import logging
- from pythonLogs.basic_log import BasicLog
- from pythonLogs.size_rotating import SizeRotatingLog
+ from pythonlogs.basic_log import BasicLog
+ from pythonlogs.size_rotating import SizeRotatingLog
initial_handlers = len(logging.getLogger().handlers)
@@ -386,7 +386,7 @@ def test_registry_memory_management_edge_cases(self):
def test_cleanup_logger_handlers_standalone(self):
"""Test cleanup_logger_handlers function directly."""
import logging
- from pythonLogs.core.log_utils import cleanup_logger_handlers
+ from pythonlogs.core.log_utils import cleanup_logger_handlers
# Test with None logger
cleanup_logger_handlers(None) # Should not raise error
@@ -417,7 +417,7 @@ def test_cleanup_logger_handlers_standalone(self):
def test_cleanup_logger_handlers_error_handling(self):
"""Test cleanup_logger_handlers with handler errors."""
import logging
- from pythonLogs.core.log_utils import cleanup_logger_handlers
+ from pythonlogs.core.log_utils import cleanup_logger_handlers
from unittest.mock import Mock
logger = logging.getLogger("cleanup_error_test")
@@ -433,7 +433,7 @@ def test_cleanup_logger_handlers_error_handling(self):
def test_formatter_cache_eviction_detailed(self):
"""Test detailed formatter cache eviction scenarios."""
- from pythonLogs.core.memory_utils import clear_formatter_cache, get_cached_formatter
+ from pythonlogs.core.memory_utils import clear_formatter_cache, get_cached_formatter
clear_formatter_cache()
@@ -444,7 +444,7 @@ def test_formatter_cache_eviction_detailed(self):
formatters.append(formatter)
# Verify cache is at capacity
- from pythonLogs.core.memory_utils import _formatter_cache, _formatter_cache_lock
+ from pythonlogs.core.memory_utils import _formatter_cache, _formatter_cache_lock
with _formatter_cache_lock:
cache_size = len(_formatter_cache)
@@ -460,8 +460,8 @@ def test_formatter_cache_eviction_detailed(self):
def test_set_directory_cache_limit_edge_cases(self):
"""Test set_directory_cache_limit with edge cases."""
- import pythonLogs.core.log_utils as log_utils
- from pythonLogs.core.memory_utils import clear_directory_cache, set_directory_cache_limit
+ import pythonlogs.core.log_utils as log_utils
+ from pythonlogs.core.memory_utils import clear_directory_cache, set_directory_cache_limit
# Setup some directories in cache using context managers
clear_directory_cache()
@@ -500,7 +500,7 @@ def test_set_directory_cache_limit_edge_cases(self):
def test_register_logger_weakref_direct(self):
"""Test register_logger_weakref function directly."""
import logging
- from pythonLogs.core.memory_utils import get_active_logger_count, register_logger_weakref
+ from pythonlogs.core.memory_utils import get_active_logger_count, register_logger_weakref
initial_count = get_active_logger_count()
@@ -529,7 +529,7 @@ def test_weakref_callback_behavior(self):
import gc
import logging
import weakref
- from pythonLogs.core.memory_utils import _active_loggers, _weak_ref_lock
+ from pythonlogs.core.memory_utils import _active_loggers, _weak_ref_lock
initial_weak_refs = len(_active_loggers)
@@ -554,8 +554,8 @@ def test_callback(ref):
def test_optimize_lru_cache_sizes_normal_operation(self):
"""Test optimize_lru_cache_sizes normal operation."""
- from pythonLogs.core import log_utils
- from pythonLogs.core.memory_utils import optimize_lru_cache_sizes
+ from pythonlogs.core import log_utils
+ from pythonlogs.core.memory_utils import optimize_lru_cache_sizes
# Get initial cache info
initial_cache = log_utils.get_timezone_function.cache_info()
@@ -570,7 +570,7 @@ def test_optimize_lru_cache_sizes_normal_operation(self):
def test_formatter_cache_thread_safety(self):
"""Test thread safety of formatter cache operations."""
import concurrent.futures
- from pythonLogs.core.memory_utils import clear_formatter_cache, get_cached_formatter
+ from pythonlogs.core.memory_utils import clear_formatter_cache, get_cached_formatter
clear_formatter_cache()
errors = []
@@ -601,7 +601,7 @@ def formatter_worker(worker_id):
def test_weak_reference_cleanup_mechanism(self):
"""Test weak reference cleanup mechanism without relying on GC timing."""
- from pythonLogs.core.memory_utils import _active_loggers, _weak_ref_lock, get_active_logger_count
+ from pythonlogs.core.memory_utils import _active_loggers, _weak_ref_lock, get_active_logger_count
# Test the cleanup detection logic in get_active_logger_count
with _weak_ref_lock:
@@ -628,7 +628,7 @@ def __call__(self):
def test_memory_stats_comprehensive(self):
"""Test comprehensive memory statistics reporting."""
- from pythonLogs.core.memory_utils import get_cached_formatter, get_memory_stats
+ from pythonlogs.core.memory_utils import get_cached_formatter, get_memory_stats
# Create some items to populate stats
LoggerFactory.get_or_create_logger(LoggerType.BASIC, name="stats_test_1")
@@ -660,7 +660,7 @@ def test_memory_stats_comprehensive(self):
def test_force_garbage_collection_comprehensive(self):
"""Test comprehensive garbage collection functionality."""
- from pythonLogs.core.memory_utils import force_garbage_collection
+ from pythonlogs.core.memory_utils import force_garbage_collection
# Create objects that could be garbage collected
test_objects = []
@@ -692,7 +692,7 @@ def test_force_garbage_collection_comprehensive(self):
def test_memory_optimization_integration(self):
"""Test integration of all memory optimization features."""
- from pythonLogs.core.memory_utils import (
+ from pythonlogs.core.memory_utils import (
clear_directory_cache,
clear_formatter_cache,
force_garbage_collection,
@@ -729,7 +729,7 @@ def test_memory_optimization_integration(self):
def test_memory_utils_module_constants(self):
"""Test module-level constants and their behavior."""
- from pythonLogs.core import memory_utils
+ from pythonlogs.core import memory_utils
# Verify module constants exist and have reasonable values
assert hasattr(memory_utils, "_formatter_cache")
diff --git a/tests/performance/test_performance.py b/tests/performance/test_performance.py
index a7bb469..82e4458 100644
--- a/tests/performance/test_performance.py
+++ b/tests/performance/test_performance.py
@@ -9,15 +9,15 @@
# Add parent directory to path for imports
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-sys.path.insert(0, project_root) # For pythonLogs
+sys.path.insert(0, project_root) # For pythonlogs
# Import test utilities
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
SizeRotatingLog,
)
-from pythonLogs.core.factory import (
+from pythonlogs.core.factory import (
LoggerFactory,
LoggerType,
clear_logger_registry,
diff --git a/tests/performance/test_performance_windows.py b/tests/performance/test_performance_windows.py
index 118f944..e9a6116 100644
--- a/tests/performance/test_performance_windows.py
+++ b/tests/performance/test_performance_windows.py
@@ -8,14 +8,14 @@
# Add parent directory to path for imports
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-sys.path.insert(0, project_root) # For pythonLogs
+sys.path.insert(0, project_root) # For pythonlogs
# Import test utilities
-from pythonLogs import (
+from pythonlogs import (
LogLevel,
SizeRotatingLog,
)
-from pythonLogs.core.factory import (
+from pythonlogs.core.factory import (
LoggerFactory,
LoggerType,
clear_logger_registry,
diff --git a/tests/performance/test_performance_zoneinfo.py b/tests/performance/test_performance_zoneinfo.py
index 2728bfd..20ff3b1 100644
--- a/tests/performance/test_performance_zoneinfo.py
+++ b/tests/performance/test_performance_zoneinfo.py
@@ -10,12 +10,12 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
SizeRotatingLog,
)
-from pythonLogs.core.factory import clear_logger_registry
+from pythonlogs.core.factory import clear_logger_registry
@pytest.mark.skipif(os.getenv("CI") == "true", reason="Performance tests unstable in CI")
@@ -27,7 +27,7 @@ def setup_method(self):
clear_logger_registry()
# Clear timezone caches
- from pythonLogs.core.log_utils import get_stderr_timezone, get_timezone_function, get_timezone_offset
+ from pythonlogs.core.log_utils import get_stderr_timezone, get_timezone_function, get_timezone_offset
get_timezone_function.cache_clear()
get_timezone_offset.cache_clear()
@@ -35,7 +35,7 @@ def setup_method(self):
def test_timezone_function_caching_performance(self):
"""Test that timezone function caching improves performance."""
- from pythonLogs.core.log_utils import get_timezone_function
+ from pythonlogs.core.log_utils import get_timezone_function
# First call (not cached) - single call to prime the cache
start_time = time.time()
@@ -55,7 +55,7 @@ def test_timezone_function_caching_performance(self):
def test_timezone_offset_caching_performance(self):
"""Test timezone offset calculation caching performance."""
- from pythonLogs.core.log_utils import get_timezone_offset
+ from pythonlogs.core.log_utils import get_timezone_offset
# Test with multiple calls to the same timezone
start_time = time.time()
@@ -161,7 +161,7 @@ def test_timezone_memory_efficiency(self):
def test_timezone_function_performance_comparison(self):
"""Compare performance of different timezone function types."""
- from pythonLogs.core.log_utils import get_timezone_function
+ from pythonlogs.core.log_utils import get_timezone_function
# Test UTC (should return time.gmtime - fastest)
start_time = time.time()
diff --git a/tests/smoke_test.py b/tests/smoke_test.py
index 01ab688..1507947 100644
--- a/tests/smoke_test.py
+++ b/tests/smoke_test.py
@@ -1,10 +1,10 @@
"""Smoke test to verify the built package works correctly."""
-from pythonLogs import BasicLog, SizeRotatingLog, TimedRotatingLog, __version__
+from pythonlogs import BasicLog, SizeRotatingLog, TimedRotatingLog, __version__
assert __version__, "Version should not be empty"
assert BasicLog, "BasicLog should be importable"
assert TimedRotatingLog, "TimedRotatingLog should be importable"
assert SizeRotatingLog, "SizeRotatingLog should be importable"
-print(f"pythonLogs {__version__} OK")
+print(f"pythonlogs {__version__} OK")
diff --git a/tests/thread_safety/test_automatic_features.py b/tests/thread_safety/test_automatic_features.py
index cee3eb4..d751fcf 100644
--- a/tests/thread_safety/test_automatic_features.py
+++ b/tests/thread_safety/test_automatic_features.py
@@ -6,11 +6,11 @@
import tempfile
import threading
import time
-from pythonLogs.basic_log import BasicLog
-from pythonLogs.core.constants import RotateWhen
-from pythonLogs.core.memory_utils import get_active_logger_count
-from pythonLogs.size_rotating import SizeRotatingLog
-from pythonLogs.timed_rotating import TimedRotatingLog
+from pythonlogs.basic_log import BasicLog
+from pythonlogs.core.constants import RotateWhen
+from pythonlogs.core.memory_utils import get_active_logger_count
+from pythonlogs.size_rotating import SizeRotatingLog
+from pythonlogs.timed_rotating import TimedRotatingLog
class TestAutomaticFeatures:
@@ -144,7 +144,7 @@ def test_automatic_features_verification(self):
# 3. Automatic Thread Safety: Decorator applied
assert hasattr(basic_log.__class__, "_lock")
- assert hasattr(basic_log.init, "_thread_safe_wrapped")
+ assert hasattr(basic_log.init, "thread_safe_wrapped")
# cleanup_logger is a static method, so it's not wrapped
BasicLog.cleanup_logger(logger)
diff --git a/tests/thread_safety/test_automatic_thread_safety.py b/tests/thread_safety/test_automatic_thread_safety.py
index 1b00455..d8f6750 100644
--- a/tests/thread_safety/test_automatic_thread_safety.py
+++ b/tests/thread_safety/test_automatic_thread_safety.py
@@ -3,10 +3,10 @@
import pytest
import sys
import threading
-from pythonLogs.basic_log import BasicLog
-from pythonLogs.core.constants import RotateWhen
-from pythonLogs.size_rotating import SizeRotatingLog
-from pythonLogs.timed_rotating import TimedRotatingLog
+from pythonlogs.basic_log import BasicLog
+from pythonlogs.core.constants import RotateWhen
+from pythonlogs.size_rotating import SizeRotatingLog
+from pythonlogs.timed_rotating import TimedRotatingLog
class TestAutomaticThreadSafety:
@@ -125,7 +125,7 @@ def test_automatic_locking_verification(self):
# Verify the class has the automatic thread safety decorator applied
assert hasattr(basic_log.__class__, "_lock"), "Class should have automatic lock"
- assert hasattr(basic_log.init, "_thread_safe_wrapped"), "Method should be wrapped for thread safety"
+ assert hasattr(basic_log.init, "thread_safe_wrapped"), "Method should be wrapped for thread safety"
# cleanup_logger is a static method, so it's not wrapped with thread safety
# Test that methods can still be called normally
diff --git a/tests/thread_safety/test_thread_safety.py b/tests/thread_safety/test_thread_safety.py
index 9ede916..24fc980 100644
--- a/tests/thread_safety/test_thread_safety.py
+++ b/tests/thread_safety/test_thread_safety.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-"""Test thread safety of the pythonLogs library."""
+"""Test thread safety of the pythonlogs library."""
import concurrent.futures
import os
@@ -12,13 +12,13 @@
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from pythonLogs import (
+from pythonlogs import (
LogLevel,
)
-from pythonLogs.basic_log import BasicLog
-from pythonLogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
-from pythonLogs.size_rotating import SizeRotatingLog
-from pythonLogs.timed_rotating import TimedRotatingLog
+from pythonlogs.basic_log import BasicLog
+from pythonlogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
+from pythonlogs.size_rotating import SizeRotatingLog
+from pythonlogs.timed_rotating import TimedRotatingLog
class TestThreadSafety:
@@ -107,7 +107,7 @@ def mixed_operations_worker(worker_id):
)
def test_concurrent_directory_cache_access(self):
"""Test concurrent access to directory permission cache."""
- import pythonLogs.core.log_utils as log_utils
+ import pythonlogs.core.log_utils as log_utils
num_threads = 15
temp_dirs = []
diff --git a/tests/thread_safety/test_thread_safety_module.py b/tests/thread_safety/test_thread_safety_module.py
index a429ddd..0b9c6d2 100644
--- a/tests/thread_safety/test_thread_safety_module.py
+++ b/tests/thread_safety/test_thread_safety_module.py
@@ -3,7 +3,7 @@
import pytest
import threading
import time
-from pythonLogs.core.thread_safety import (
+from pythonlogs.core.thread_safety import (
AutoThreadSafe,
ThreadSafeContext,
ThreadSafeMeta,
@@ -113,9 +113,9 @@ def unsafe_increment(self):
obj = TestClass()
# Check that the specified method is wrapped
- assert hasattr(obj.increment, "_thread_safe_wrapped")
+ assert hasattr(obj.increment, "thread_safe_wrapped")
# Check that non-specified method is not wrapped
- assert not hasattr(obj.unsafe_increment, "_thread_safe_wrapped")
+ assert not hasattr(obj.unsafe_increment, "thread_safe_wrapped")
# Test thread safety of wrapped method
threads = []
@@ -152,10 +152,10 @@ def _private_method(self):
obj = TestClass()
# Public methods should be wrapped
- assert hasattr(obj.increment, "_thread_safe_wrapped")
- assert hasattr(obj.decrement, "_thread_safe_wrapped")
+ assert hasattr(obj.increment, "thread_safe_wrapped")
+ assert hasattr(obj.decrement, "thread_safe_wrapped")
# Private method should not be wrapped
- assert not hasattr(obj._private_method, "_thread_safe_wrapped")
+ assert not hasattr(obj._private_method, "thread_safe_wrapped")
def test_auto_thread_safe_no_double_wrapping(self):
"""Test that methods are not wrapped multiple times."""
@@ -246,7 +246,7 @@ def increment(self):
# Should have instance lock
assert hasattr(obj, "_lock")
# Public method should be wrapped
- assert hasattr(obj.increment, "_thread_safe_wrapped")
+ assert hasattr(obj.increment, "thread_safe_wrapped")
# Test thread safety
threads = []
@@ -282,8 +282,8 @@ def derived_method(self):
obj = DerivedClass()
# Both base and derived methods should be thread-safe
- assert hasattr(obj.base_method, "_thread_safe_wrapped")
- assert hasattr(obj.derived_method, "_thread_safe_wrapped")
+ assert hasattr(obj.base_method, "thread_safe_wrapped")
+ assert hasattr(obj.derived_method, "thread_safe_wrapped")
class TestSynchronizedMethodDecorator:
@@ -378,7 +378,7 @@ def static_method():
obj = TestClass()
# Regular method should be wrapped
- assert hasattr(obj.regular_method, "_thread_safe_wrapped")
+ assert hasattr(obj.regular_method, "thread_safe_wrapped")
# Static method should not be affected
assert TestClass.static_method() == "static"
@@ -399,7 +399,7 @@ def class_method(cls):
obj = TestClass()
# Regular method should be wrapped
- assert hasattr(obj.regular_method, "_thread_safe_wrapped")
+ assert hasattr(obj.regular_method, "thread_safe_wrapped")
# Class method should work normally
assert TestClass.class_method() == "class"
diff --git a/tests/timezone/test_timezone_migration.py b/tests/timezone/test_timezone_migration.py
index 529f034..ee46331 100644
--- a/tests/timezone/test_timezone_migration.py
+++ b/tests/timezone/test_timezone_migration.py
@@ -8,18 +8,18 @@
# Add parent directory to path for imports
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-sys.path.insert(0, project_root) # For pythonLogs
+sys.path.insert(0, project_root) # For pythonlogs
# Import test utilities
-from pythonLogs import (
+from pythonlogs import (
BasicLog,
LogLevel,
RotateWhen,
SizeRotatingLog,
TimedRotatingLog,
)
-from pythonLogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
-from pythonLogs.core.log_utils import (
+from pythonlogs.core.factory import LoggerFactory, LoggerType, clear_logger_registry
+from pythonlogs.core.log_utils import (
get_stderr_timezone,
get_timezone_function,
get_timezone_offset,
@@ -38,7 +38,7 @@ def setup_method(self):
@requires_zoneinfo_utc
def test_zoneinfo_import_success(self):
"""Test that ZoneInfo is properly imported."""
- from pythonLogs.core.log_utils import ZoneInfo
+ from pythonlogs.core.log_utils import ZoneInfo
# Should be able to create timezone objects
utc_tz = ZoneInfo("UTC")
diff --git a/tests/timezone/test_zoneinfo_fallbacks.py b/tests/timezone/test_zoneinfo_fallbacks.py
index b70c945..918d947 100644
--- a/tests/timezone/test_zoneinfo_fallbacks.py
+++ b/tests/timezone/test_zoneinfo_fallbacks.py
@@ -9,7 +9,7 @@
# Add parent directory to path for imports
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-sys.path.insert(0, project_root) # For pythonLogs
+sys.path.insert(0, project_root) # For pythonlogs
# Import test utilities
from tests.core.test_log_utils import get_safe_timezone, requires_zoneinfo_utc
@@ -28,7 +28,7 @@ def test_zoneinfo_import_available(self):
def test_timezone_error_handling(self):
"""Test proper error handling for timezone operations."""
- from pythonLogs import BasicLog, LogLevel
+ from pythonlogs import BasicLog, LogLevel
# With the new fallback system, invalid timezones should gracefully fall back
# to localtime instead of raising exceptions for better robustness
@@ -43,7 +43,7 @@ def test_timezone_error_handling(self):
def test_timezone_offset_edge_cases(self):
"""Test timezone offset calculation for edge cases."""
- from pythonLogs.core.log_utils import get_timezone_offset
+ from pythonlogs.core.log_utils import get_timezone_offset
# Test UTC (may fall back to localtime on systems without UTC data)
utc_offset = get_timezone_offset("UTC")
@@ -66,7 +66,7 @@ def test_stderr_timezone_fallback(self):
"""Test stderr timezone fallback behavior."""
import io
from contextlib import redirect_stderr
- from pythonLogs.core.log_utils import write_stderr
+ from pythonlogs.core.log_utils import write_stderr
# Mock environment variable
with patch.dict(os.environ, {"LOG_TIMEZONE": "UTC"}):
@@ -81,7 +81,7 @@ def test_stderr_timezone_fallback(self):
def test_timezone_function_fallback(self):
"""Test timezone function fallback for edge cases."""
import time
- from pythonLogs.core.log_utils import get_timezone_function
+ from pythonlogs.core.log_utils import get_timezone_function
# Test standard cases - UTC may fall back to localtime on systems without UTC data
utc_func = get_timezone_function("UTC")
@@ -99,7 +99,7 @@ def test_timezone_function_fallback(self):
def test_logger_creation_with_fallback_timezone(self):
"""Test logger creation when timezone operations might fail."""
- from pythonLogs import BasicLog, LogLevel
+ from pythonlogs import BasicLog, LogLevel
# Use safe timezone that works on all platforms
safe_tz = get_safe_timezone()
@@ -114,7 +114,7 @@ def test_logger_creation_with_fallback_timezone(self):
)
def test_complex_timezone_scenarios(self):
"""Test complex timezone scenarios and edge cases."""
- from pythonLogs import LogLevel, SizeRotatingLog
+ from pythonlogs import LogLevel, SizeRotatingLog
with tempfile.TemporaryDirectory() as temp_dir:
# Test with various timezone formats
@@ -137,7 +137,7 @@ def test_complex_timezone_scenarios(self):
def test_zoneinfo_caching_behavior(self):
"""Test that zoneinfo objects are properly cached."""
- from pythonLogs.core.log_utils import get_timezone_function, get_timezone_offset
+ from pythonlogs.core.log_utils import get_timezone_function, get_timezone_offset
# Test function caching
func1 = get_timezone_function("America/Chicago")
@@ -155,7 +155,7 @@ def test_environment_variable_timezone_handling(self):
# Test with environment variable
with patch.dict(os.environ, {"LOG_TIMEZONE": "Europe/Paris"}):
# Environment variable should be used for stderr
- from pythonLogs.core.log_utils import get_stderr_timezone
+ from pythonlogs.core.log_utils import get_stderr_timezone
# Clear cache to test new environment
get_stderr_timezone.cache_clear()
@@ -171,7 +171,7 @@ def test_environment_variable_timezone_handling(self):
def test_concurrent_timezone_access(self):
"""Test timezone functionality under concurrent access."""
import threading
- from pythonLogs import BasicLog, LogLevel
+ from pythonlogs import BasicLog, LogLevel
# Use safe timezone that works on all platforms
safe_tz = get_safe_timezone()
@@ -204,8 +204,8 @@ def create_logger_worker(worker_id):
@requires_zoneinfo_utc
def test_memory_usage_with_timezone_caching(self):
"""Test that timezone caching doesn't cause memory leaks."""
- from pythonLogs import BasicLog
- from pythonLogs.core.factory import clear_logger_registry
+ from pythonlogs import BasicLog
+ from pythonlogs.core.factory import clear_logger_registry
# Create many loggers with same timezone (should use cache)
for i in range(100):
@@ -220,7 +220,7 @@ def test_memory_usage_with_timezone_caching(self):
@requires_zoneinfo_utc
def test_timezone_validation_edge_cases(self):
"""Test timezone validation for various edge cases."""
- from pythonLogs.core.log_utils import get_timezone_offset
+ from pythonlogs.core.log_utils import get_timezone_offset
# Test case variations (timezone names are case-sensitive except for localtime)
test_cases = [
diff --git a/uv.lock b/uv.lock
index 598f715..727ca27 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1,6 +1,6 @@
version = 1
revision = 3
-requires-python = ">=3.11"
+requires-python = ">=3.12"
[[package]]
name = "annotated-types"
@@ -22,106 +22,86 @@ wheels = [
[[package]]
name = "coverage"
-version = "7.13.4"
+version = "7.13.5"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", size = 827239, upload-time = "2026-02-09T12:59:03.86Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053", size = 219278, upload-time = "2026-02-09T12:56:31.673Z" },
- { url = "https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11", size = 219783, upload-time = "2026-02-09T12:56:33.104Z" },
- { url = "https://files.pythonhosted.org/packages/ab/63/325d8e5b11e0eaf6d0f6a44fad444ae58820929a9b0de943fa377fe73e85/coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa", size = 250200, upload-time = "2026-02-09T12:56:34.474Z" },
- { url = "https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7", size = 252114, upload-time = "2026-02-09T12:56:35.749Z" },
- { url = "https://files.pythonhosted.org/packages/eb/c2/7ab36d8b8cc412bec9ea2d07c83c48930eb4ba649634ba00cb7e4e0f9017/coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00", size = 254220, upload-time = "2026-02-09T12:56:37.796Z" },
- { url = "https://files.pythonhosted.org/packages/d6/4d/cf52c9a3322c89a0e6febdfbc83bb45c0ed3c64ad14081b9503adee702e7/coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef", size = 256164, upload-time = "2026-02-09T12:56:39.016Z" },
- { url = "https://files.pythonhosted.org/packages/78/e9/eb1dd17bd6de8289df3580e967e78294f352a5df8a57ff4671ee5fc3dcd0/coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903", size = 250325, upload-time = "2026-02-09T12:56:40.668Z" },
- { url = "https://files.pythonhosted.org/packages/71/07/8c1542aa873728f72267c07278c5cc0ec91356daf974df21335ccdb46368/coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f", size = 251913, upload-time = "2026-02-09T12:56:41.97Z" },
- { url = "https://files.pythonhosted.org/packages/74/d7/c62e2c5e4483a748e27868e4c32ad3daa9bdddbba58e1bc7a15e252baa74/coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299", size = 249974, upload-time = "2026-02-09T12:56:43.323Z" },
- { url = "https://files.pythonhosted.org/packages/98/9f/4c5c015a6e98ced54efd0f5cf8d31b88e5504ecb6857585fc0161bb1e600/coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505", size = 253741, upload-time = "2026-02-09T12:56:45.155Z" },
- { url = "https://files.pythonhosted.org/packages/bd/59/0f4eef89b9f0fcd9633b5d350016f54126ab49426a70ff4c4e87446cabdc/coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6", size = 249695, upload-time = "2026-02-09T12:56:46.636Z" },
- { url = "https://files.pythonhosted.org/packages/b5/2c/b7476f938deb07166f3eb281a385c262675d688ff4659ad56c6c6b8e2e70/coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9", size = 250599, upload-time = "2026-02-09T12:56:48.13Z" },
- { url = "https://files.pythonhosted.org/packages/b8/34/c3420709d9846ee3785b9f2831b4d94f276f38884032dca1457fa83f7476/coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9", size = 221780, upload-time = "2026-02-09T12:56:50.479Z" },
- { url = "https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f", size = 222715, upload-time = "2026-02-09T12:56:51.815Z" },
- { url = "https://files.pythonhosted.org/packages/18/1a/54c3c80b2f056164cc0a6cdcb040733760c7c4be9d780fe655f356f433e4/coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f", size = 221385, upload-time = "2026-02-09T12:56:53.194Z" },
- { url = "https://files.pythonhosted.org/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", size = 219449, upload-time = "2026-02-09T12:56:54.889Z" },
- { url = "https://files.pythonhosted.org/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", size = 219810, upload-time = "2026-02-09T12:56:56.33Z" },
- { url = "https://files.pythonhosted.org/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", size = 251308, upload-time = "2026-02-09T12:56:57.858Z" },
- { url = "https://files.pythonhosted.org/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", size = 254052, upload-time = "2026-02-09T12:56:59.754Z" },
- { url = "https://files.pythonhosted.org/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", size = 255165, upload-time = "2026-02-09T12:57:01.287Z" },
- { url = "https://files.pythonhosted.org/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", size = 257432, upload-time = "2026-02-09T12:57:02.637Z" },
- { url = "https://files.pythonhosted.org/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", size = 251716, upload-time = "2026-02-09T12:57:04.056Z" },
- { url = "https://files.pythonhosted.org/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", size = 253089, upload-time = "2026-02-09T12:57:05.503Z" },
- { url = "https://files.pythonhosted.org/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", size = 251232, upload-time = "2026-02-09T12:57:06.879Z" },
- { url = "https://files.pythonhosted.org/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", size = 255299, upload-time = "2026-02-09T12:57:08.245Z" },
- { url = "https://files.pythonhosted.org/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", size = 250796, upload-time = "2026-02-09T12:57:10.142Z" },
- { url = "https://files.pythonhosted.org/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", size = 252673, upload-time = "2026-02-09T12:57:12.197Z" },
- { url = "https://files.pythonhosted.org/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", size = 221990, upload-time = "2026-02-09T12:57:14.085Z" },
- { url = "https://files.pythonhosted.org/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", size = 222800, upload-time = "2026-02-09T12:57:15.944Z" },
- { url = "https://files.pythonhosted.org/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", size = 221415, upload-time = "2026-02-09T12:57:17.497Z" },
- { url = "https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9", size = 219474, upload-time = "2026-02-09T12:57:19.332Z" },
- { url = "https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac", size = 219844, upload-time = "2026-02-09T12:57:20.66Z" },
- { url = "https://files.pythonhosted.org/packages/97/fd/7e859f8fab324cef6c4ad7cff156ca7c489fef9179d5749b0c8d321281c2/coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea", size = 250832, upload-time = "2026-02-09T12:57:22.007Z" },
- { url = "https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b", size = 253434, upload-time = "2026-02-09T12:57:23.339Z" },
- { url = "https://files.pythonhosted.org/packages/5a/88/6728a7ad17428b18d836540630487231f5470fb82454871149502f5e5aa2/coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525", size = 254676, upload-time = "2026-02-09T12:57:24.774Z" },
- { url = "https://files.pythonhosted.org/packages/7c/bc/21244b1b8cedf0dff0a2b53b208015fe798d5f2a8d5348dbfece04224fff/coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242", size = 256807, upload-time = "2026-02-09T12:57:26.125Z" },
- { url = "https://files.pythonhosted.org/packages/97/a0/ddba7ed3251cff51006737a727d84e05b61517d1784a9988a846ba508877/coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148", size = 251058, upload-time = "2026-02-09T12:57:27.614Z" },
- { url = "https://files.pythonhosted.org/packages/9b/55/e289addf7ff54d3a540526f33751951bf0878f3809b47f6dfb3def69c6f7/coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a", size = 252805, upload-time = "2026-02-09T12:57:29.066Z" },
- { url = "https://files.pythonhosted.org/packages/13/4e/cc276b1fa4a59be56d96f1dabddbdc30f4ba22e3b1cd42504c37b3313255/coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23", size = 250766, upload-time = "2026-02-09T12:57:30.522Z" },
- { url = "https://files.pythonhosted.org/packages/94/44/1093b8f93018f8b41a8cf29636c9292502f05e4a113d4d107d14a3acd044/coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80", size = 254923, upload-time = "2026-02-09T12:57:31.946Z" },
- { url = "https://files.pythonhosted.org/packages/8b/55/ea2796da2d42257f37dbea1aab239ba9263b31bd91d5527cdd6db5efe174/coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea", size = 250591, upload-time = "2026-02-09T12:57:33.842Z" },
- { url = "https://files.pythonhosted.org/packages/d4/fa/7c4bb72aacf8af5020675aa633e59c1fbe296d22aed191b6a5b711eb2bc7/coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a", size = 252364, upload-time = "2026-02-09T12:57:35.743Z" },
- { url = "https://files.pythonhosted.org/packages/5c/38/a8d2ec0146479c20bbaa7181b5b455a0c41101eed57f10dd19a78ab44c80/coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d", size = 222010, upload-time = "2026-02-09T12:57:37.25Z" },
- { url = "https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd", size = 222818, upload-time = "2026-02-09T12:57:38.734Z" },
- { url = "https://files.pythonhosted.org/packages/04/d1/934918a138c932c90d78301f45f677fb05c39a3112b96fd2c8e60503cdc7/coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af", size = 221438, upload-time = "2026-02-09T12:57:40.223Z" },
- { url = "https://files.pythonhosted.org/packages/52/57/ee93ced533bcb3e6df961c0c6e42da2fc6addae53fb95b94a89b1e33ebd7/coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d", size = 220165, upload-time = "2026-02-09T12:57:41.639Z" },
- { url = "https://files.pythonhosted.org/packages/c5/e0/969fc285a6fbdda49d91af278488d904dcd7651b2693872f0ff94e40e84a/coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12", size = 220516, upload-time = "2026-02-09T12:57:44.215Z" },
- { url = "https://files.pythonhosted.org/packages/b1/b8/9531944e16267e2735a30a9641ff49671f07e8138ecf1ca13db9fd2560c7/coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b", size = 261804, upload-time = "2026-02-09T12:57:45.989Z" },
- { url = "https://files.pythonhosted.org/packages/8a/f3/e63df6d500314a2a60390d1989240d5f27318a7a68fa30ad3806e2a9323e/coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9", size = 263885, upload-time = "2026-02-09T12:57:47.42Z" },
- { url = "https://files.pythonhosted.org/packages/f3/67/7654810de580e14b37670b60a09c599fa348e48312db5b216d730857ffe6/coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092", size = 266308, upload-time = "2026-02-09T12:57:49.345Z" },
- { url = "https://files.pythonhosted.org/packages/37/6f/39d41eca0eab3cc82115953ad41c4e77935286c930e8fad15eaed1389d83/coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9", size = 267452, upload-time = "2026-02-09T12:57:50.811Z" },
- { url = "https://files.pythonhosted.org/packages/50/6d/39c0fbb8fc5cd4d2090811e553c2108cf5112e882f82505ee7495349a6bf/coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26", size = 261057, upload-time = "2026-02-09T12:57:52.447Z" },
- { url = "https://files.pythonhosted.org/packages/a4/a2/60010c669df5fa603bb5a97fb75407e191a846510da70ac657eb696b7fce/coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2", size = 263875, upload-time = "2026-02-09T12:57:53.938Z" },
- { url = "https://files.pythonhosted.org/packages/3e/d9/63b22a6bdbd17f1f96e9ed58604c2a6b0e72a9133e37d663bef185877cf6/coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940", size = 261500, upload-time = "2026-02-09T12:57:56.012Z" },
- { url = "https://files.pythonhosted.org/packages/70/bf/69f86ba1ad85bc3ad240e4c0e57a2e620fbc0e1645a47b5c62f0e941ad7f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c", size = 265212, upload-time = "2026-02-09T12:57:57.5Z" },
- { url = "https://files.pythonhosted.org/packages/ae/f2/5f65a278a8c2148731831574c73e42f57204243d33bedaaf18fa79c5958f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0", size = 260398, upload-time = "2026-02-09T12:57:59.027Z" },
- { url = "https://files.pythonhosted.org/packages/ef/80/6e8280a350ee9fea92f14b8357448a242dcaa243cb2c72ab0ca591f66c8c/coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b", size = 262584, upload-time = "2026-02-09T12:58:01.129Z" },
- { url = "https://files.pythonhosted.org/packages/22/63/01ff182fc95f260b539590fb12c11ad3e21332c15f9799cb5e2386f71d9f/coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9", size = 222688, upload-time = "2026-02-09T12:58:02.736Z" },
- { url = "https://files.pythonhosted.org/packages/a9/43/89de4ef5d3cd53b886afa114065f7e9d3707bdb3e5efae13535b46ae483d/coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd", size = 223746, upload-time = "2026-02-09T12:58:05.362Z" },
- { url = "https://files.pythonhosted.org/packages/35/39/7cf0aa9a10d470a5309b38b289b9bb07ddeac5d61af9b664fe9775a4cb3e/coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997", size = 222003, upload-time = "2026-02-09T12:58:06.952Z" },
- { url = "https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601", size = 219522, upload-time = "2026-02-09T12:58:08.623Z" },
- { url = "https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689", size = 219855, upload-time = "2026-02-09T12:58:10.176Z" },
- { url = "https://files.pythonhosted.org/packages/e5/69/233459ee9eb0c0d10fcc2fe425a029b3fa5ce0f040c966ebce851d030c70/coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c", size = 250887, upload-time = "2026-02-09T12:58:12.503Z" },
- { url = "https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129", size = 253396, upload-time = "2026-02-09T12:58:14.615Z" },
- { url = "https://files.pythonhosted.org/packages/ac/15/ea4da0f85bf7d7b27635039e649e99deb8173fe551096ea15017f7053537/coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552", size = 254745, upload-time = "2026-02-09T12:58:16.162Z" },
- { url = "https://files.pythonhosted.org/packages/99/11/bb356e86920c655ca4d61daee4e2bbc7258f0a37de0be32d233b561134ff/coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a", size = 257055, upload-time = "2026-02-09T12:58:17.892Z" },
- { url = "https://files.pythonhosted.org/packages/c9/0f/9ae1f8cb17029e09da06ca4e28c9e1d5c1c0a511c7074592e37e0836c915/coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356", size = 250911, upload-time = "2026-02-09T12:58:19.495Z" },
- { url = "https://files.pythonhosted.org/packages/89/3a/adfb68558fa815cbc29747b553bc833d2150228f251b127f1ce97e48547c/coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71", size = 252754, upload-time = "2026-02-09T12:58:21.064Z" },
- { url = "https://files.pythonhosted.org/packages/32/b1/540d0c27c4e748bd3cd0bd001076ee416eda993c2bae47a73b7cc9357931/coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5", size = 250720, upload-time = "2026-02-09T12:58:22.622Z" },
- { url = "https://files.pythonhosted.org/packages/c7/95/383609462b3ffb1fe133014a7c84fc0dd01ed55ac6140fa1093b5af7ebb1/coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98", size = 254994, upload-time = "2026-02-09T12:58:24.548Z" },
- { url = "https://files.pythonhosted.org/packages/f7/ba/1761138e86c81680bfc3c49579d66312865457f9fe405b033184e5793cb3/coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5", size = 250531, upload-time = "2026-02-09T12:58:26.271Z" },
- { url = "https://files.pythonhosted.org/packages/f8/8e/05900df797a9c11837ab59c4d6fe94094e029582aab75c3309a93e6fb4e3/coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0", size = 252189, upload-time = "2026-02-09T12:58:27.807Z" },
- { url = "https://files.pythonhosted.org/packages/00/bd/29c9f2db9ea4ed2738b8a9508c35626eb205d51af4ab7bf56a21a2e49926/coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb", size = 222258, upload-time = "2026-02-09T12:58:29.441Z" },
- { url = "https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505", size = 223073, upload-time = "2026-02-09T12:58:31.026Z" },
- { url = "https://files.pythonhosted.org/packages/51/5b/84100025be913b44e082ea32abcf1afbf4e872f5120b7a1cab1d331b1e13/coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2", size = 221638, upload-time = "2026-02-09T12:58:32.599Z" },
- { url = "https://files.pythonhosted.org/packages/a7/e4/c884a405d6ead1370433dad1e3720216b4f9fd8ef5b64bfd984a2a60a11a/coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056", size = 220246, upload-time = "2026-02-09T12:58:34.181Z" },
- { url = "https://files.pythonhosted.org/packages/81/5c/4d7ed8b23b233b0fffbc9dfec53c232be2e695468523242ea9fd30f97ad2/coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc", size = 220514, upload-time = "2026-02-09T12:58:35.704Z" },
- { url = "https://files.pythonhosted.org/packages/2f/6f/3284d4203fd2f28edd73034968398cd2d4cb04ab192abc8cff007ea35679/coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9", size = 261877, upload-time = "2026-02-09T12:58:37.864Z" },
- { url = "https://files.pythonhosted.org/packages/09/aa/b672a647bbe1556a85337dc95bfd40d146e9965ead9cc2fe81bde1e5cbce/coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf", size = 264004, upload-time = "2026-02-09T12:58:39.492Z" },
- { url = "https://files.pythonhosted.org/packages/79/a1/aa384dbe9181f98bba87dd23dda436f0c6cf2e148aecbb4e50fc51c1a656/coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55", size = 266408, upload-time = "2026-02-09T12:58:41.852Z" },
- { url = "https://files.pythonhosted.org/packages/53/5e/5150bf17b4019bc600799f376bb9606941e55bd5a775dc1e096b6ffea952/coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72", size = 267544, upload-time = "2026-02-09T12:58:44.093Z" },
- { url = "https://files.pythonhosted.org/packages/e0/ed/f1de5c675987a4a7a672250d2c5c9d73d289dbf13410f00ed7181d8017dd/coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a", size = 260980, upload-time = "2026-02-09T12:58:45.721Z" },
- { url = "https://files.pythonhosted.org/packages/b3/e3/fe758d01850aa172419a6743fe76ba8b92c29d181d4f676ffe2dae2ba631/coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6", size = 263871, upload-time = "2026-02-09T12:58:47.334Z" },
- { url = "https://files.pythonhosted.org/packages/b6/76/b829869d464115e22499541def9796b25312b8cf235d3bb00b39f1675395/coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3", size = 261472, upload-time = "2026-02-09T12:58:48.995Z" },
- { url = "https://files.pythonhosted.org/packages/14/9e/caedb1679e73e2f6ad240173f55218488bfe043e38da577c4ec977489915/coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750", size = 265210, upload-time = "2026-02-09T12:58:51.178Z" },
- { url = "https://files.pythonhosted.org/packages/3a/10/0dd02cb009b16ede425b49ec344aba13a6ae1dc39600840ea6abcb085ac4/coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39", size = 260319, upload-time = "2026-02-09T12:58:53.081Z" },
- { url = "https://files.pythonhosted.org/packages/92/8e/234d2c927af27c6d7a5ffad5bd2cf31634c46a477b4c7adfbfa66baf7ebb/coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0", size = 262638, upload-time = "2026-02-09T12:58:55.258Z" },
- { url = "https://files.pythonhosted.org/packages/2f/64/e5547c8ff6964e5965c35a480855911b61509cce544f4d442caa759a0702/coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea", size = 223040, upload-time = "2026-02-09T12:58:56.936Z" },
- { url = "https://files.pythonhosted.org/packages/c7/96/38086d58a181aac86d503dfa9c47eb20715a79c3e3acbdf786e92e5c09a8/coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932", size = 224148, upload-time = "2026-02-09T12:58:58.645Z" },
- { url = "https://files.pythonhosted.org/packages/ce/72/8d10abd3740a0beb98c305e0c3faf454366221c0f37a8bcf8f60020bb65a/coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b", size = 222172, upload-time = "2026-02-09T12:59:00.396Z" },
- { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" },
-]
-
-[package.optional-dependencies]
-toml = [
- { name = "tomli", marker = "python_full_version <= '3.11'" },
+ { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" },
+ { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" },
+ { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" },
+ { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" },
+ { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" },
+ { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" },
+ { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" },
+ { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" },
+ { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" },
+ { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" },
+ { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" },
+ { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" },
+ { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" },
+ { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" },
+ { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" },
+ { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" },
+ { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" },
+ { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" },
+ { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" },
+ { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" },
+ { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" },
+ { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" },
+ { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" },
+ { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" },
+ { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" },
+ { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" },
+ { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" },
]
[[package]]
@@ -162,15 +142,15 @@ wheels = [
[[package]]
name = "poethepoet"
-version = "0.42.0"
+version = "0.42.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pastel" },
{ name = "pyyaml" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/4a/9a/4e81fafef2ba94e5c974b4701343d1f053a27575ab5133cbd264348925dd/poethepoet-0.42.0.tar.gz", hash = "sha256:c9a2828259e585e9ed152857602130ff339f7b1638879b80d4a23f25588be4f8", size = 91278, upload-time = "2026-02-22T14:24:50.967Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/05/9b/e717572686bbf23e17483389c1bf3a381ca2427c84c7e0af0cdc0f23fccc/poethepoet-0.42.1.tar.gz", hash = "sha256:205747e276062c2aaba8afd8a98838f8a3a0237b7ab94715fab8d82718aac14f", size = 93209, upload-time = "2026-02-26T22:57:50.883Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f1/3e/58041b7e4d49b69e859dc81c35e221cf02d91ed4dbb5a2f6cc4698a29f44/poethepoet-0.42.0-py3-none-any.whl", hash = "sha256:e43cc20d458ee5bfccaa4572bc5783bcb93991a7d2fcf8dadc9c43f1ebc9b277", size = 118091, upload-time = "2026-02-22T14:24:49.53Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/68/75fa0a5ef39718ea6ba7ab6a3d031fa93640e57585580cec85539540bb65/poethepoet-0.42.1-py3-none-any.whl", hash = "sha256:d8d1345a5ca521be9255e7c13bc2c4c8698ed5e5ac5e9e94890d239fcd423d0a", size = 119967, upload-time = "2026-02-26T22:57:49.467Z" },
]
[[package]]
@@ -225,20 +205,6 @@ dependencies = [
]
sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" },
- { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" },
- { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" },
- { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" },
- { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" },
- { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" },
- { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" },
- { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" },
- { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" },
- { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" },
- { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" },
- { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" },
- { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" },
- { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" },
{ url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" },
{ url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" },
{ url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" },
@@ -295,22 +261,10 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" },
{ url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" },
{ url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" },
- { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" },
- { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" },
- { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" },
- { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" },
{ url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" },
{ url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" },
{ url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" },
{ url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" },
- { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" },
- { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" },
- { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" },
- { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" },
- { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" },
- { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" },
- { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" },
- { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" },
]
[[package]]
@@ -357,7 +311,7 @@ name = "pytest-cov"
version = "7.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "coverage", extra = ["toml"] },
+ { name = "coverage" },
{ name = "pluggy" },
{ name = "pytest" },
]
@@ -368,16 +322,16 @@ wheels = [
[[package]]
name = "python-dotenv"
-version = "1.2.1"
+version = "1.2.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" },
]
[[package]]
name = "pythonlogs"
-version = "6.0.3"
+version = "7.0.0"
source = { editable = "." }
dependencies = [
{ name = "pydantic-settings" },
@@ -396,10 +350,10 @@ requires-dist = [{ name = "pydantic-settings", specifier = ">=2.11.0" }]
[package.metadata.requires-dev]
dev = [
- { name = "poethepoet", specifier = ">=0.42.0" },
+ { name = "poethepoet", specifier = ">=0.42.1" },
{ name = "psutil", specifier = ">=7.2.2" },
{ name = "pytest-cov", specifier = ">=7.0.0" },
- { name = "ruff", specifier = ">=0.15.2" },
+ { name = "ruff", specifier = ">=0.15.7" },
]
[[package]]
@@ -408,15 +362,6 @@ version = "6.0.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" },
- { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" },
- { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" },
- { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" },
- { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" },
- { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" },
- { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" },
- { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" },
- { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" },
{ url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
{ url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
{ url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
@@ -459,81 +404,27 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.15.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/06/04/eab13a954e763b0606f460443fcbf6bb5a0faf06890ea3754ff16523dce5/ruff-0.15.2.tar.gz", hash = "sha256:14b965afee0969e68bb871eba625343b8673375f457af4abe98553e8bbb98342", size = 4558148, upload-time = "2026-02-19T22:32:20.271Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2f/70/3a4dc6d09b13cb3e695f28307e5d889b2e1a66b7af9c5e257e796695b0e6/ruff-0.15.2-py3-none-linux_armv6l.whl", hash = "sha256:120691a6fdae2f16d65435648160f5b81a9625288f75544dc40637436b5d3c0d", size = 10430565, upload-time = "2026-02-19T22:32:41.824Z" },
- { url = "https://files.pythonhosted.org/packages/71/0b/bb8457b56185ece1305c666dc895832946d24055be90692381c31d57466d/ruff-0.15.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a89056d831256099658b6bba4037ac6dd06f49d194199215befe2bb10457ea5e", size = 10820354, upload-time = "2026-02-19T22:32:07.366Z" },
- { url = "https://files.pythonhosted.org/packages/2d/c1/e0532d7f9c9e0b14c46f61b14afd563298b8b83f337b6789ddd987e46121/ruff-0.15.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e36dee3a64be0ebd23c86ffa3aa3fd3ac9a712ff295e192243f814a830b6bd87", size = 10170767, upload-time = "2026-02-19T22:32:13.188Z" },
- { url = "https://files.pythonhosted.org/packages/47/e8/da1aa341d3af017a21c7a62fb5ec31d4e7ad0a93ab80e3a508316efbcb23/ruff-0.15.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9fb47b6d9764677f8c0a193c0943ce9a05d6763523f132325af8a858eadc2b9", size = 10529591, upload-time = "2026-02-19T22:32:02.547Z" },
- { url = "https://files.pythonhosted.org/packages/93/74/184fbf38e9f3510231fbc5e437e808f0b48c42d1df9434b208821efcd8d6/ruff-0.15.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f376990f9d0d6442ea9014b19621d8f2aaf2b8e39fdbfc79220b7f0c596c9b80", size = 10260771, upload-time = "2026-02-19T22:32:36.938Z" },
- { url = "https://files.pythonhosted.org/packages/05/ac/605c20b8e059a0bc4b42360414baa4892ff278cec1c91fff4be0dceedefd/ruff-0.15.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2dcc987551952d73cbf5c88d9fdee815618d497e4df86cd4c4824cc59d5dd75f", size = 11045791, upload-time = "2026-02-19T22:32:31.642Z" },
- { url = "https://files.pythonhosted.org/packages/fd/52/db6e419908f45a894924d410ac77d64bdd98ff86901d833364251bd08e22/ruff-0.15.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42a47fd785cbe8c01b9ff45031af875d101b040ad8f4de7bbb716487c74c9a77", size = 11879271, upload-time = "2026-02-19T22:32:29.305Z" },
- { url = "https://files.pythonhosted.org/packages/3e/d8/7992b18f2008bdc9231d0f10b16df7dda964dbf639e2b8b4c1b4e91b83af/ruff-0.15.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbe9f49354866e575b4c6943856989f966421870e85cd2ac94dccb0a9dcb2fea", size = 11303707, upload-time = "2026-02-19T22:32:22.492Z" },
- { url = "https://files.pythonhosted.org/packages/d7/02/849b46184bcfdd4b64cde61752cc9a146c54759ed036edd11857e9b8443b/ruff-0.15.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7a672c82b5f9887576087d97be5ce439f04bbaf548ee987b92d3a7dede41d3a", size = 11149151, upload-time = "2026-02-19T22:32:44.234Z" },
- { url = "https://files.pythonhosted.org/packages/70/04/f5284e388bab60d1d3b99614a5a9aeb03e0f333847e2429bebd2aaa1feec/ruff-0.15.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ecc64f46f7019e2bcc3cdc05d4a7da958b629a5ab7033195e11a438403d956", size = 11091132, upload-time = "2026-02-19T22:32:24.691Z" },
- { url = "https://files.pythonhosted.org/packages/fa/ae/88d844a21110e14d92cf73d57363fab59b727ebeabe78009b9ccb23500af/ruff-0.15.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8dcf243b15b561c655c1ef2f2b0050e5d50db37fe90115507f6ff37d865dc8b4", size = 10504717, upload-time = "2026-02-19T22:32:26.75Z" },
- { url = "https://files.pythonhosted.org/packages/64/27/867076a6ada7f2b9c8292884ab44d08fd2ba71bd2b5364d4136f3cd537e1/ruff-0.15.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dab6941c862c05739774677c6273166d2510d254dac0695c0e3f5efa1b5585de", size = 10263122, upload-time = "2026-02-19T22:32:10.036Z" },
- { url = "https://files.pythonhosted.org/packages/e7/ef/faf9321d550f8ebf0c6373696e70d1758e20ccdc3951ad7af00c0956be7c/ruff-0.15.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b9164f57fc36058e9a6806eb92af185b0697c9fe4c7c52caa431c6554521e5c", size = 10735295, upload-time = "2026-02-19T22:32:39.227Z" },
- { url = "https://files.pythonhosted.org/packages/2f/55/e8089fec62e050ba84d71b70e7834b97709ca9b7aba10c1a0b196e493f97/ruff-0.15.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:80d24fcae24d42659db7e335b9e1531697a7102c19185b8dc4a028b952865fd8", size = 11241641, upload-time = "2026-02-19T22:32:34.617Z" },
- { url = "https://files.pythonhosted.org/packages/23/01/1c30526460f4d23222d0fabd5888868262fd0e2b71a00570ca26483cd993/ruff-0.15.2-py3-none-win32.whl", hash = "sha256:fd5ff9e5f519a7e1bd99cbe8daa324010a74f5e2ebc97c6242c08f26f3714f6f", size = 10507885, upload-time = "2026-02-19T22:32:15.635Z" },
- { url = "https://files.pythonhosted.org/packages/5c/10/3d18e3bbdf8fc50bbb4ac3cc45970aa5a9753c5cb51bf9ed9a3cd8b79fa3/ruff-0.15.2-py3-none-win_amd64.whl", hash = "sha256:d20014e3dfa400f3ff84830dfb5755ece2de45ab62ecea4af6b7262d0fb4f7c5", size = 11623725, upload-time = "2026-02-19T22:32:04.947Z" },
- { url = "https://files.pythonhosted.org/packages/6d/78/097c0798b1dab9f8affe73da9642bb4500e098cb27fd8dc9724816ac747b/ruff-0.15.2-py3-none-win_arm64.whl", hash = "sha256:cabddc5822acdc8f7b5527b36ceac55cc51eec7b1946e60181de8fe83ca8876e", size = 10941649, upload-time = "2026-02-19T22:32:18.108Z" },
-]
-
-[[package]]
-name = "tomli"
-version = "2.4.0"
+version = "0.15.7"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" },
- { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" },
- { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" },
- { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" },
- { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" },
- { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" },
- { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" },
- { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" },
- { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" },
- { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" },
- { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" },
- { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" },
- { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" },
- { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" },
- { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" },
- { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" },
- { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" },
- { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" },
- { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" },
- { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" },
- { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" },
- { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" },
- { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" },
- { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" },
- { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" },
- { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" },
- { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" },
- { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" },
- { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" },
- { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" },
- { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" },
- { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" },
- { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" },
- { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" },
- { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" },
- { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" },
- { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" },
- { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" },
- { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" },
- { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" },
- { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" },
- { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" },
- { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" },
- { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" },
- { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" },
- { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" },
+ { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" },
+ { url = "https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477", size = 10955433, upload-time = "2026-03-19T16:27:00.205Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/87/b8a8f3d56b8d848008559e7c9d8bf367934d5367f6d932ba779456e2f73b/ruff-0.15.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb0511670002c6c529ec66c0e30641c976c8963de26a113f3a30456b702468b0", size = 11138536, upload-time = "2026-03-19T16:27:06.101Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" },
+ { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" },
+ { url = "https://files.pythonhosted.org/packages/99/9e/271afdffb81fe7bfc8c43ba079e9d96238f674380099457a74ccb3863857/ruff-0.15.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b4705e0e85cedc74b0a23cf6a179dbb3df184cb227761979cc76c0440b5ab0d", size = 10840752, upload-time = "2026-03-19T16:26:45.723Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" },
+ { url = "https://files.pythonhosted.org/packages/26/6b/8786ba5736562220d588a2f6653e6c17e90c59ced34a2d7b512ef8956103/ruff-0.15.7-py3-none-win32.whl", hash = "sha256:6d39e2d3505b082323352f733599f28169d12e891f7dd407f2d4f54b4c2886de", size = 10582538, upload-time = "2026-03-19T16:26:15.992Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl", hash = "sha256:4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1", size = 11755839, upload-time = "2026-03-19T16:26:19.897Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" },
]
[[package]]