diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 6505644..b909b3c 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ github: ddc -ko_fi: ddcsta +ko_fi: ddc custom: "https://www.paypal.com/ncp/payment/6G9Z78QHUD4RJ" diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE index eba1f84..63a0801 100755 --- a/.github/PULL_REQUEST_TEMPLATE +++ b/.github/PULL_REQUEST_TEMPLATE @@ -1,6 +1,3 @@ -## Summary - - ## Changes Made diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index fc832bc..f6e5fc9 100755 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -42,7 +42,7 @@ jobs: run: uv python install ${{ matrix.python-version }} - name: Install dependencies - run: uv sync --locked --all-extras --group dev + run: uv sync --locked --all-extras --all-groups - name: Run tests with coverage uses: nick-fields/retry@v3 diff --git a/README.md b/README.md index 086192d..eb451e1 100755 --- a/README.md +++ b/README.md @@ -10,14 +10,14 @@ Ko-fi Donate
- PyPi - PyPI Downloads - License: MIT -
Python uv Ruff
+ PyPi + PyPI Downloads + License: MIT +
issues codecov Quality Gate Status @@ -285,7 +285,6 @@ LOG_MAX_FILE_SIZE_MB=10 # TimedRotatingLog LOG_ROTATE_WHEN=midnight -LOG_ROTATE_AT_UTC=True LOG_ROTATE_FILE_SUFIX="%Y%m%d" ``` diff --git a/pyproject.toml b/pyproject.toml index ea73d4d..7d5717a 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ packages = ["pythonlogs"] [project] name = "pythonlogs" -version = "7.0.0" +version = "7.0.1" 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" @@ -51,9 +51,9 @@ dependencies = [ [dependency-groups] dev = [ "psutil>=7.2.2", - "pytest-cov>=7.0.0", - "poethepoet>=0.42.1", - "ruff>=0.15.7", + "pytest-cov>=7.1.0", + "poethepoet>=0.43.0", + "ruff>=0.15.9", ] [tool.poe.tasks] @@ -62,7 +62,7 @@ snyk-export.shell = "rm -f requirements.txt && uv export --no-hashes --no-annota 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"}] +updatedev.sequence = ["linter", {shell = "uv lock --upgrade && uv sync --all-extras --all-groups"}] build.sequence = ["updatedev", "tests", {shell = "uv build --wheel"}] [tool.pytest.ini_options] diff --git a/pythonlogs/.env.example b/pythonlogs/.env.example index d6c1e5c..0ffbe93 100644 --- a/pythonlogs/.env.example +++ b/pythonlogs/.env.example @@ -23,7 +23,6 @@ LOG_MAX_FILE_SIZE_MB=10 # TimedRotatingLog Settings (only needed when using TimedRotatingLog) LOG_ROTATE_WHEN=midnight -LOG_ROTATE_AT_UTC=True LOG_ROTATE_FILE_SUFIX=%Y%m%d diff --git a/pythonlogs/core/constants.py b/pythonlogs/core/constants.py index 3b5b0b1..bf8cac5 100644 --- a/pythonlogs/core/constants.py +++ b/pythonlogs/core/constants.py @@ -1,20 +1,21 @@ import logging from enum import StrEnum +from typing import Final # File and Directory Constants -MB_TO_BYTES = 1024 * 1024 -DEFAULT_FILE_MODE = 0o755 -DEFAULT_BACKUP_COUNT = 30 +MB_TO_BYTES: Final = 1024 * 1024 +DEFAULT_FILE_MODE: Final = 0o755 +DEFAULT_BACKUP_COUNT: Final = 30 # Date Format Constants -DEFAULT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" -DEFAULT_ROTATE_SUFFIX = "%Y%m%d" +DEFAULT_DATE_FORMAT: Final = "%Y-%m-%dT%H:%M:%S" +DEFAULT_ROTATE_SUFFIX: Final = "%Y%m%d" # Encoding Constants -DEFAULT_ENCODING = "UTF-8" +DEFAULT_ENCODING: Final = "UTF-8" # Timezone Constants -DEFAULT_TIMEZONE = "UTC" +DEFAULT_TIMEZONE: Final = "UTC" class LogLevel(StrEnum): @@ -45,7 +46,7 @@ class RotateWhen(StrEnum): # Level mapping for performance optimization -LEVEL_MAP = { +LEVEL_MAP: Final = { LogLevel.DEBUG.value.lower(): logging.DEBUG, LogLevel.WARNING.value.lower(): logging.WARNING, LogLevel.WARN.value.lower(): logging.WARNING, diff --git a/pythonlogs/core/factory.py b/pythonlogs/core/factory.py index 36ed39a..d8b7ab8 100644 --- a/pythonlogs/core/factory.py +++ b/pythonlogs/core/factory.py @@ -29,7 +29,6 @@ class LoggerConfig: maxmbytes: int | None = None when: RotateWhen | str | None = None sufix: str | None = None - rotateatutc: bool | None = None daystokeep: int | None = None @@ -254,7 +253,6 @@ def get_memory_limits(cls) -> dict[str, int]: "timezone", "streamhandler", "showlocation", - "rotateatutc", }, ), } @@ -426,7 +424,6 @@ def __init__( timezone: str | None = None, streamhandler: bool | None = None, showlocation: bool | None = None, - rotateatutc: bool | None = None, ): self._logger = LoggerFactory.create_logger( LoggerType.TIMED_ROTATING, @@ -442,7 +439,6 @@ def __init__( timezone=timezone, streamhandler=streamhandler, showlocation=showlocation, - rotateatutc=rotateatutc, ) self._name = name or get_log_settings().appname diff --git a/pythonlogs/core/settings.py b/pythonlogs/core/settings.py index a58456b..6cd49b1 100644 --- a/pythonlogs/core/settings.py +++ b/pythonlogs/core/settings.py @@ -95,10 +95,6 @@ class LogSettings(BaseSettings): default=RotateWhen.MIDNIGHT, description="When to rotate log files (midnight, hourly, daily, weekly)", ) - rotate_at_utc: bool = Field( - default=True, - description="Use UTC time for rotation timing", - ) rotate_file_sufix: str = Field( default=DEFAULT_ROTATE_SUFFIX, description="Date suffix format for rotated log files", diff --git a/pythonlogs/timed_rotating.py b/pythonlogs/timed_rotating.py index ee4f237..34a2c7d 100755 --- a/pythonlogs/timed_rotating.py +++ b/pythonlogs/timed_rotating.py @@ -43,7 +43,6 @@ def __init__( timezone: str | None = None, streamhandler: bool | None = None, showlocation: bool | None = None, - rotateatutc: bool | None = None, ): _settings = get_log_settings() self.level = get_level(level or _settings.level) @@ -58,7 +57,7 @@ def __init__( self.timezone = timezone or _settings.timezone self.streamhandler = streamhandler or _settings.stream_handler self.showlocation = showlocation or _settings.show_location - self.rotateatutc = rotateatutc or _settings.rotate_at_utc + self.rotateatutc = self.timezone.upper() == "UTC" self.logger = None def init(self): diff --git a/tests/core/test_settings.py b/tests/core/test_settings.py index 5489486..c48d0a6 100644 --- a/tests/core/test_settings.py +++ b/tests/core/test_settings.py @@ -41,7 +41,6 @@ def test_default_values(self): assert settings.logger_ttl_seconds == 3600 assert settings.max_file_size_mb == 10 assert settings.rotate_when.value == "midnight" - assert settings.rotate_at_utc is True assert settings.rotate_file_sufix == DEFAULT_ROTATE_SUFFIX finally: # Restore environment variables diff --git a/tests/factory/test_factory_examples.py b/tests/factory/test_factory_examples.py index 2ae6918..1843857 100644 --- a/tests/factory/test_factory_examples.py +++ b/tests/factory/test_factory_examples.py @@ -239,7 +239,6 @@ def test_logger_customization_example(self): timezone="UTC", streamhandler=True, showlocation=True, - rotateatutc=True, ) # Test all log levels diff --git a/tests/factory/test_factory_windows.py b/tests/factory/test_factory_windows.py index 545c6b8..442c50f 100644 --- a/tests/factory/test_factory_windows.py +++ b/tests/factory/test_factory_windows.py @@ -290,7 +290,6 @@ def test_logger_customization_example_windows(self): timezone="UTC", streamhandler=True, showlocation=True, - rotateatutc=True, ) # Test all log levels diff --git a/tests/logger_types/test_timed_rotating.py b/tests/logger_types/test_timed_rotating.py index 75d552d..b4854c5 100644 --- a/tests/logger_types/test_timed_rotating.py +++ b/tests/logger_types/test_timed_rotating.py @@ -51,7 +51,6 @@ def test_timed_rotating_log_initialization_with_all_params(self): timezone="UTC", streamhandler=True, showlocation=True, - rotateatutc=True, ) assert timed_log.appname == "test_comprehensive" assert timed_log.filenames == ["test1.log", "test2.log"] @@ -250,7 +249,7 @@ def test_timed_rotating_log_with_custom_suffix(self): def test_timed_rotating_log_utc_rotation(self): """Test TimedRotatingLog with UTC rotation.""" with tempfile.TemporaryDirectory() as temp_dir: - timed_log = TimedRotatingLog(name="test_utc", directory=temp_dir, rotateatutc=True) + timed_log = TimedRotatingLog(name="test_utc", directory=temp_dir, timezone="UTC") logger = timed_log.init() # Check that handler is configured for UTC @@ -466,7 +465,6 @@ def test_timed_rotating_log_handler_configuration(self): encoding="utf-8", when="H", daystokeep=10, - # Note: rotateatutc defaults to True from settings ) logger = timed_log.init() diff --git a/uv.lock b/uv.lock index 727ca27..cd5b0c1 100644 --- a/uv.lock +++ b/uv.lock @@ -142,15 +142,15 @@ wheels = [ [[package]] name = "poethepoet" -version = "0.42.1" +version = "0.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pastel" }, { name = "pyyaml" }, ] -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" } +sdist = { url = "https://files.pythonhosted.org/packages/91/4a/3cdfd054e4e81913028d8c399d04e51a8c2431110d5797e302206d350ffa/poethepoet-0.43.0.tar.gz", hash = "sha256:62b058ef92ca76fc758dd6362918f5054b9f519fa5328e2eeaa00c72bdc90e85", size = 95454, upload-time = "2026-04-03T10:56:26.299Z" } wheels = [ - { 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" }, + { url = "https://files.pythonhosted.org/packages/e0/6f/23f86e5abfb3308ef1fa749571ba06d86e437d355862356ff8e3dfd66b05/poethepoet-0.43.0-py3-none-any.whl", hash = "sha256:c12f8be41dbecee8abac4266bda4b04060b7129d2868edf50823e6509c249431", size = 122290, upload-time = "2026-04-03T10:56:24.645Z" }, ] [[package]] @@ -283,11 +283,11 @@ wheels = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] @@ -308,16 +308,16 @@ wheels = [ [[package]] name = "pytest-cov" -version = "7.0.0" +version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage" }, { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] [[package]] @@ -331,7 +331,7 @@ wheels = [ [[package]] name = "pythonlogs" -version = "7.0.0" +version = "7.0.1" source = { editable = "." } dependencies = [ { name = "pydantic-settings" }, @@ -350,10 +350,10 @@ requires-dist = [{ name = "pydantic-settings", specifier = ">=2.11.0" }] [package.metadata.requires-dev] dev = [ - { name = "poethepoet", specifier = ">=0.42.1" }, + { name = "poethepoet", specifier = ">=0.43.0" }, { name = "psutil", specifier = ">=7.2.2" }, - { name = "pytest-cov", specifier = ">=7.0.0" }, - { name = "ruff", specifier = ">=0.15.7" }, + { name = "pytest-cov", specifier = ">=7.1.0" }, + { name = "ruff", specifier = ">=0.15.9" }, ] [[package]] @@ -404,27 +404,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.7" +version = "0.15.9" source = { registry = "https://pypi.org/simple" } -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" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/97/e9f1ca355108ef7194e38c812ef40ba98c7208f47b13ad78d023caa583da/ruff-0.15.9.tar.gz", hash = "sha256:29cbb1255a9797903f6dde5ba0188c707907ff44a9006eb273b5a17bfa0739a2", size = 4617361, upload-time = "2026-04-02T18:17:20.829Z" } wheels = [ - { 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" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/9cdfd0ac4b9d1e5a6cf09bedabdf0b56306ab5e333c85c87281273e7b041/ruff-0.15.9-py3-none-linux_armv6l.whl", hash = "sha256:6efbe303983441c51975c243e26dff328aca11f94b70992f35b093c2e71801e1", size = 10511206, upload-time = "2026-04-02T18:16:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f6/32bfe3e9c136b35f02e489778d94384118bb80fd92c6d92e7ccd97db12ce/ruff-0.15.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4965bac6ac9ea86772f4e23587746f0b7a395eccabb823eb8bfacc3fa06069f7", size = 10923307, upload-time = "2026-04-02T18:17:08.645Z" }, + { url = "https://files.pythonhosted.org/packages/ca/25/de55f52ab5535d12e7aaba1de37a84be6179fb20bddcbe71ec091b4a3243/ruff-0.15.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf05aad70ca5b5a0a4b0e080df3a6b699803916d88f006efd1f5b46302daab8", size = 10316722, upload-time = "2026-04-02T18:16:44.206Z" }, + { url = "https://files.pythonhosted.org/packages/48/11/690d75f3fd6278fe55fff7c9eb429c92d207e14b25d1cae4064a32677029/ruff-0.15.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9439a342adb8725f32f92732e2bafb6d5246bd7a5021101166b223d312e8fc59", size = 10623674, upload-time = "2026-04-02T18:16:50.951Z" }, + { url = "https://files.pythonhosted.org/packages/bd/ec/176f6987be248fc5404199255522f57af1b4a5a1b57727e942479fec98ad/ruff-0.15.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5e6faf9d97c8edc43877c3f406f47446fc48c40e1442d58cfcdaba2acea745", size = 10351516, upload-time = "2026-04-02T18:16:57.206Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fc/51cffbd2b3f240accc380171d51446a32aa2ea43a40d4a45ada67368fbd2/ruff-0.15.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b34a9766aeec27a222373d0b055722900fbc0582b24f39661aa96f3fe6ad901", size = 11150202, upload-time = "2026-04-02T18:17:06.452Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d4/25292a6dfc125f6b6528fe6af31f5e996e19bf73ca8e3ce6eb7fa5b95885/ruff-0.15.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89dd695bc72ae76ff484ae54b7e8b0f6b50f49046e198355e44ea656e521fef9", size = 11988891, upload-time = "2026-04-02T18:17:18.575Z" }, + { url = "https://files.pythonhosted.org/packages/13/e1/1eebcb885c10e19f969dcb93d8413dfee8172578709d7ee933640f5e7147/ruff-0.15.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce187224ef1de1bd225bc9a152ac7102a6171107f026e81f317e4257052916d5", size = 11480576, upload-time = "2026-04-02T18:16:52.986Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6b/a1548ac378a78332a4c3dcf4a134c2475a36d2a22ddfa272acd574140b50/ruff-0.15.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0c7c341f68adb01c488c3b7d4b49aa8ea97409eae6462d860a79cf55f431b6", size = 11254525, upload-time = "2026-04-02T18:17:02.041Z" }, + { url = "https://files.pythonhosted.org/packages/42/aa/4bb3af8e61acd9b1281db2ab77e8b2c3c5e5599bf2a29d4a942f1c62b8d6/ruff-0.15.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:55cc15eee27dc0eebdfcb0d185a6153420efbedc15eb1d38fe5e685657b0f840", size = 11204072, upload-time = "2026-04-02T18:17:13.581Z" }, + { url = "https://files.pythonhosted.org/packages/69/48/d550dc2aa6e423ea0bcc1d0ff0699325ffe8a811e2dba156bd80750b86dc/ruff-0.15.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6537f6eed5cda688c81073d46ffdfb962a5f29ecb6f7e770b2dc920598997ed", size = 10594998, upload-time = "2026-04-02T18:16:46.369Z" }, + { url = "https://files.pythonhosted.org/packages/63/47/321167e17f5344ed5ec6b0aa2cff64efef5f9e985af8f5622cfa6536043f/ruff-0.15.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6d3fcbca7388b066139c523bda744c822258ebdcfbba7d24410c3f454cc9af71", size = 10359769, upload-time = "2026-04-02T18:17:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/67/5e/074f00b9785d1d2c6f8c22a21e023d0c2c1817838cfca4c8243200a1fa87/ruff-0.15.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:058d8e99e1bfe79d8a0def0b481c56059ee6716214f7e425d8e737e412d69677", size = 10850236, upload-time = "2026-04-02T18:16:48.749Z" }, + { url = "https://files.pythonhosted.org/packages/76/37/804c4135a2a2caf042925d30d5f68181bdbd4461fd0d7739da28305df593/ruff-0.15.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8e1ddb11dbd61d5983fa2d7d6370ef3eb210951e443cace19594c01c72abab4c", size = 11358343, upload-time = "2026-04-02T18:16:55.068Z" }, + { url = "https://files.pythonhosted.org/packages/88/3d/1364fcde8656962782aa9ea93c92d98682b1ecec2f184e625a965ad3b4a6/ruff-0.15.9-py3-none-win32.whl", hash = "sha256:bde6ff36eaf72b700f32b7196088970bf8fdb2b917b7accd8c371bfc0fd573ec", size = 10583382, upload-time = "2026-04-02T18:17:04.261Z" }, + { url = "https://files.pythonhosted.org/packages/4c/56/5c7084299bd2cacaa07ae63a91c6f4ba66edc08bf28f356b24f6b717c799/ruff-0.15.9-py3-none-win_amd64.whl", hash = "sha256:45a70921b80e1c10cf0b734ef09421f71b5aa11d27404edc89d7e8a69505e43d", size = 11744969, upload-time = "2026-04-02T18:16:59.611Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/76704c4f312257d6dbaae3c959add2a622f63fcca9d864659ce6d8d97d3d/ruff-0.15.9-py3-none-win_arm64.whl", hash = "sha256:0694e601c028fd97dc5c6ee244675bc241aeefced7ef80cd9c6935a871078f53", size = 11005870, upload-time = "2026-04-02T18:17:15.773Z" }, ] [[package]]