diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 120fd912..00000000 --- a/.flake8 +++ /dev/null @@ -1,12 +0,0 @@ -[flake8] -max-line-length = 88 -ignore = E203,E265,E402,E501,E721,E722,E741,F401,F402,F811,F841,W503 -exclude = - .git, - __pycache__, - build, - dist, - node_modules, - env, - .venv - diff --git a/.github/workflows/release-packages.yml b/.github/workflows/release-packages.yml index 62228936..2ad97362 100644 --- a/.github/workflows/release-packages.yml +++ b/.github/workflows/release-packages.yml @@ -31,12 +31,10 @@ jobs: run: python -m pip install --upgrade uv - name: Install dependencies with uv run: uv pip install --system --editable . --group dev - - name: Lint with flake8 - run: | - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Lint with ruff - run: ruff check --exit-zero . + - name: Check formatting with Ruff + run: uv run ruff format --check . + - name: Lint with Ruff + run: uv run ruff check . - name: Test with pytest run: | pytest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9b037784..b3d5be8f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,40 +2,21 @@ minimum_pre_commit_version: "3.6.0" # All hooks must be local to allow offline usage # ─── PYTHON ──────────────────────────────────────────────────────────────────── -# NOTE: hooks run in the order they appear – isort before black is critical. +# NOTE: hooks run in the order they appear so Ruff formats before it lints. repos: - repo: local hooks: - # 1️⃣ Sort imports **first** – with Black-compatible style - - id: isort - name: isort (black-profile) - entry: uv run isort --profile=black --filter-files - language: system - types: [python] - - - repo: local - hooks: - # 2️⃣ Let Black format everything after isort touched the imports - - id: black - name: black - entry: uv run black --line-length 88 - language: system - types: [python] - - - repo: local - hooks: - # 3️⃣ Flake8 only checks; it should never re-write files - - id: flake8 - name: flake8 - entry: uv run flake8 --config=.flake8 + - id: ruff-format + name: ruff format + entry: uv run ruff format language: system types: [python] - repo: local hooks: - id: ruff - name: ruff - entry: ruff check --exit-zero + name: ruff check + entry: uv run ruff check language: system types: [python] diff --git a/AGENTS.md b/AGENTS.md index 16758a1f..331522d2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,7 @@ Keep commits small and focused. Use conventional commit messages. -Format code with `black` and/or `prettier` -Run `flake8` for lint checks. +Format Python code with `ruff format` and front-end assets with `prettier`. +Run `ruff check` for linting. Run `pre-commit run --all-files`. Run tests with `pytest`. Use `pyproject.toml` for dependencies; do not use requirements files. diff --git a/Makefile b/Makefile index cdf7074e..7ccfac98 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,16 @@ .PHONY: format format-yaml lint test test-js precommit setup format: - uv run black . - prettier --write app/static/js/**/*.js app/static/css/**/*.css + uv run ruff format . + prettier --write app/static/js/**/*.js app/static/css/**/*.css format-yaml: prettier --write '*.yml' lint: - uv run flake8 - uv run ruff check --exit-zero . - eslint 'app/static/js/**/*.js' + uv run ruff format --check . + uv run ruff check . + eslint 'app/static/js/**/*.js' test: uv run pytest diff --git a/README.md b/README.md index de222fb1..775249c4 100644 --- a/README.md +++ b/README.md @@ -220,7 +220,8 @@ To set up the project for development: ```sh uv run pre-commit run --all-files - uv run flake8 + uv run ruff format --check . + uv run ruff check . uv run pytest npm test -- --coverage ``` diff --git a/app/AGENTS.md b/app/AGENTS.md index 10c7e96a..e449e402 100644 --- a/app/AGENTS.md +++ b/app/AGENTS.md @@ -1,5 +1,5 @@ -Keep Python modules PEP8 compliant with `black` formatting. +Keep Python modules PEP8 compliant with `ruff format`. Use descriptive docstrings for all public functions and classes. Prefer type hints. Avoid introducing heavy dependencies without discussion. -Run `flake8` and `pytest` before committing changes. +Run `ruff check` and `pytest` before committing changes. diff --git a/app/routes.py b/app/routes.py index 4fe7c528..c9e837b5 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,4 +1,4 @@ -# flake8: noqa +# ruff: noqa """HTTP route handlers and helper utilities. This module registers all Flask endpoints for the application. Routes handle diff --git a/docs/ci_checks.md b/docs/ci_checks.md index 8076c39f..bbca05b9 100644 --- a/docs/ci_checks.md +++ b/docs/ci_checks.md @@ -6,7 +6,7 @@ and on pull requests targeting those branches. The workflow located at `.github/workflows/python-app.yml` performs the following tasks: -- Formats Python code with `black`, sorts imports with `isort`, and lints with `ruff` and `flake8`. +- Formats and lints Python code with Ruff. - Checks type hints with `mypy`. - Lints JavaScript with `eslint` and verifies formatting with `prettier`. - Executes `pytest` and `jest` test suites and uploads coverage. @@ -15,8 +15,8 @@ following tasks: - Caches Python, Node, and pre-commit dependencies to speed up builds. - Skips the workflow when only documentation files change. -Running `pre-commit run --all-files` locally will execute the same Black, -isort, Flake8, and mypy checks before they fail in CI. These checks help catch +Running `pre-commit run --all-files` locally will execute the same Ruff and +Mypy checks before they fail in CI. These checks help catch regressions and security issues before code is merged. On pull requests the workflow lints only the files that changed, while pushes to `staging` or `main` run the linter across the entire repository. diff --git a/docs/developer_guide.md b/docs/developer_guide.md index 3dad0252..82cedd4b 100644 --- a/docs/developer_guide.md +++ b/docs/developer_guide.md @@ -6,7 +6,6 @@ This guide provides tips for extending Glimpser, running tests, and contributing 1. Clone the repository and create a virtual environment: ```sh - ruff check --exit-zero . git clone https://github.com/KristopherKubicki/glimpser.git cd glimpser python -m venv env @@ -49,11 +48,11 @@ to the web interface. ## Running Tests -The project uses `pytest` for testing and lints Python with `ruff` and `flake8`. After activating your environment, run: +The project uses `pytest` for testing and relies on Ruff for formatting and linting. After activating your environment, run: ```sh -ruff check --exit-zero . -flake8 +uv run ruff format --check . +uv run ruff check . pytest # runs in parallel via pytest-xdist ``` diff --git a/docs/testing.md b/docs/testing.md index 1d5cdcaf..2232d4c1 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -9,11 +9,11 @@ python -m coverage html The HTML report will be generated in `htmlcov/index.html`. -Before submitting a patch, lint the code with `ruff` and `flake8`: +Before submitting a patch, lint and format the code with Ruff: ```sh -ruff check --exit-zero . -flake8 +uv run ruff format --check . +uv run ruff check . ``` Refer to [developer_guide.md](developer_guide.md) for setting up your environment. diff --git a/pyproject.toml b/pyproject.toml index 986a61a1..ce4fcf29 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,10 +70,7 @@ glimpser-dashboard = "app.utils.console_dashboard:main" [project.optional-dependencies] dev = [ # Core dev tooling - all required for building - "black>=25.1", "coverage>=7.9", - "flake8>=7.2", - "isort==6.0.1", "mkdocs>=1.6", "mypy>=1.16", "pre-commit>=4.2", @@ -122,24 +119,18 @@ packages = ["app", "scripts"] # ───────────────────────────────────────────────────────────────────────────── # Tooling configuration # ───────────────────────────────────────────────────────────────────────────── -[tool.black] -line-length = 88 -target-version = ["py311"] -required-version = "25.1.0" - -[tool.isort] -profile = "black" -line_length = 88 - -# Ruff replaces most flake8 / isort / pylint rules, but you can keep the -# originals for now; just run Ruff first so they have little to flag. [tool.ruff] line-length = 88 target-version = "py311" exclude = [".git", "__pycache__", "build", "dist", "node_modules", "env", ".venv"] -# Enable Ruff’s equivalents of common Flake8 & Pylint rules + isort style -extend-select = ["E", "F", "I", "UP", "PL"] # E=pycodestyle, F=pyflakes, I=isort, UP=pyupgrade, PL=pylint +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +skip-magic-trailing-comma = false + +[tool.ruff.lint] +select = ["E", "F", "I", "UP", "PL"] # E=pycodestyle, F=pyflakes, I=isort, UP=pyupgrade, PL=pylint # MyPy stays as-is [tool.mypy] @@ -170,10 +161,7 @@ tag_format = "v$version" # Everything here installs with `pip install .[dev]` dev = [ # ✂︎ existing dev deps kept (versions bumped where useful) ✂︎ - "black>=25.1", "coverage>=7.9", # keep for standalone HTML reports - "flake8>=7.2", - "isort==6.0.1", # now mirrors runtime pin "mkdocs>=1.6", "mypy>=1.16", "pre-commit>=4.2", diff --git a/tests/AGENTS.md b/tests/AGENTS.md index 84fdcaff..fd615134 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -3,5 +3,5 @@ - Write new tests for every feature or bug fix. - Use `pytest` for Python and Jest for JavaScript. - Keep tests isolated by using fixtures. -- Run `flake8` and `pytest` (and `npm test` if JS tests change) before committing. +- Run `ruff check` and `pytest` (and `npm test` if JS tests change) before committing. - The test environment has no network access after setup; design tests accordingly. diff --git a/uv.lock b/uv.lock index 25f83592..736d6d94 100644 --- a/uv.lock +++ b/uv.lock @@ -234,44 +234,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/b0/5c8976e61944f91904d4fd33bdbe55248138bfbd1a6092753b1b0fb7abbc/bandit-1.8.5-py3-none-any.whl", hash = "sha256:cb2e57524e99e33ced48833c6cc9c12ac78ae970bb6a450a83c4b506ecc1e2f9", size = 131759, upload-time = "2025-06-17T01:43:35.045Z" }, ] -[[package]] -name = "black" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload-time = "2025-01-29T04:15:40.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/3b/4ba3f93ac8d90410423fdd31d7541ada9bcee1df32fb90d26de41ed40e1d/black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", size = 1629419, upload-time = "2025-01-29T05:37:06.642Z" }, - { url = "https://files.pythonhosted.org/packages/b4/02/0bde0485146a8a5e694daed47561785e8b77a0466ccc1f3e485d5ef2925e/black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", size = 1461080, upload-time = "2025-01-29T05:37:09.321Z" }, - { url = "https://files.pythonhosted.org/packages/52/0e/abdf75183c830eaca7589144ff96d49bce73d7ec6ad12ef62185cc0f79a2/black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", size = 1766886, upload-time = "2025-01-29T04:18:24.432Z" }, - { url = "https://files.pythonhosted.org/packages/dc/a6/97d8bb65b1d8a41f8a6736222ba0a334db7b7b77b8023ab4568288f23973/black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", size = 1419404, upload-time = "2025-01-29T04:19:04.296Z" }, - { url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372, upload-time = "2025-01-29T05:37:11.71Z" }, - { url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865, upload-time = "2025-01-29T05:37:14.309Z" }, - { url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699, upload-time = "2025-01-29T04:18:17.688Z" }, - { url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028, upload-time = "2025-01-29T04:18:51.711Z" }, - { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988, upload-time = "2025-01-29T05:37:16.707Z" }, - { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985, upload-time = "2025-01-29T05:37:18.273Z" }, - { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816, upload-time = "2025-01-29T04:18:33.823Z" }, - { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860, upload-time = "2025-01-29T04:19:12.944Z" }, - { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673, upload-time = "2025-01-29T05:37:20.574Z" }, - { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190, upload-time = "2025-01-29T05:37:22.106Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926, upload-time = "2025-01-29T04:18:58.564Z" }, - { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613, upload-time = "2025-01-29T04:19:27.63Z" }, - { url = "https://files.pythonhosted.org/packages/d3/b6/ae7507470a4830dbbfe875c701e84a4a5fb9183d1497834871a715716a92/black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", size = 1628593, upload-time = "2025-01-29T05:37:23.672Z" }, - { url = "https://files.pythonhosted.org/packages/24/c1/ae36fa59a59f9363017ed397750a0cd79a470490860bc7713967d89cdd31/black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f", size = 1460000, upload-time = "2025-01-29T05:37:25.829Z" }, - { url = "https://files.pythonhosted.org/packages/ac/b6/98f832e7a6c49aa3a464760c67c7856363aa644f2f3c74cf7d624168607e/black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", size = 1765963, upload-time = "2025-01-29T04:18:38.116Z" }, - { url = "https://files.pythonhosted.org/packages/ce/e9/2cb0a017eb7024f70e0d2e9bdb8c5a5b078c5740c7f8816065d06f04c557/black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", size = 1419419, upload-time = "2025-01-29T04:18:30.191Z" }, - { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload-time = "2025-01-29T04:15:38.082Z" }, -] - [[package]] name = "blinker" version = "1.9.0" @@ -776,20 +738,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, ] -[[package]] -name = "flake8" -version = "7.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mccabe" }, - { name = "pycodestyle" }, - { name = "pyflakes" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/c4/5842fc9fc94584c455543540af62fd9900faade32511fab650e9891ec225/flake8-7.2.0.tar.gz", hash = "sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426", size = 48177, upload-time = "2025-03-29T20:08:39.329Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/5c/0627be4c9976d56b1217cb5187b7504e7fd7d3503f8bfd312a04077bd4f7/flake8-7.2.0-py2.py3-none-any.whl", hash = "sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343", size = 57786, upload-time = "2025-03-29T20:08:37.902Z" }, -] - [[package]] name = "flask" version = "3.1.1" @@ -1047,12 +995,9 @@ agents = [ ] dev = [ { name = "bandit" }, - { name = "black" }, { name = "commitizen" }, { name = "coverage" }, - { name = "flake8" }, { name = "hypothesis" }, - { name = "isort" }, { name = "mkdocs" }, { name = "mypy" }, { name = "nox" }, @@ -1081,12 +1026,9 @@ agents = [ ] dev = [ { name = "bandit" }, - { name = "black" }, { name = "commitizen" }, { name = "coverage" }, - { name = "flake8" }, { name = "hypothesis" }, - { name = "isort" }, { name = "mkdocs" }, { name = "mypy" }, { name = "nox" }, @@ -1109,19 +1051,16 @@ requires-dist = [ { name = "alembic", specifier = "==1.16.1" }, { name = "apscheduler", specifier = "==3.11.0" }, { name = "bandit", marker = "extra == 'dev'", specifier = ">=1.7" }, - { name = "black", marker = "extra == 'dev'", specifier = ">=25.1" }, { name = "commitizen", marker = "extra == 'dev'", specifier = ">=3.12" }, { name = "coverage", marker = "extra == 'dev'", specifier = ">=7.9" }, { name = "fake-useragent", specifier = "==2.2.0" }, { name = "filelock", specifier = ">=3.12" }, - { name = "flake8", marker = "extra == 'dev'", specifier = ">=7.2" }, { name = "flask", specifier = "==3.1.1" }, { name = "flask-apscheduler", specifier = "==1.13.1" }, { name = "flask-login", specifier = "==0.6.3" }, { name = "gitlint", marker = "extra == 'agents'" }, { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.135" }, { name = "interrogate", marker = "extra == 'agents'" }, - { name = "isort", marker = "extra == 'dev'", specifier = "==6.0.1" }, { name = "jinja2", specifier = "==3.1.6" }, { name = "mkdocs", marker = "extra == 'dev'", specifier = ">=1.6" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.16" }, @@ -1178,12 +1117,9 @@ agents = [ ] dev = [ { name = "bandit", specifier = ">=1.7" }, - { name = "black", specifier = ">=25.1" }, { name = "commitizen", specifier = ">=3.12" }, { name = "coverage", specifier = ">=7.9" }, - { name = "flake8", specifier = ">=7.2" }, { name = "hypothesis", specifier = ">=6.135" }, - { name = "isort", specifier = "==6.0.1" }, { name = "mkdocs", specifier = ">=1.6" }, { name = "mypy", specifier = ">=1.16" }, { name = "nox", specifier = ">=2025.2" }, @@ -1552,15 +1488,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506, upload-time = "2024-10-18T15:21:52.974Z" }, ] -[[package]] -name = "mccabe" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, -] - [[package]] name = "mdurl" version = "0.1.2" @@ -2488,15 +2415,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/fb/b877a221b09dabcebeb073d5e7f19244f3fa1d5aec87092c359a6049a006/py_vapid-1.9.2-py3-none-any.whl", hash = "sha256:4ccf8a00fc54f1f99f66fb543c96f2c82622508ad814b6e9225f2c26948934d7", size = 21492, upload-time = "2024-11-19T21:55:40.832Z" }, ] -[[package]] -name = "pycodestyle" -version = "2.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/6e/1f4a62078e4d95d82367f24e685aef3a672abfd27d1a868068fed4ed2254/pycodestyle-2.13.0.tar.gz", hash = "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae", size = 39312, upload-time = "2025-03-29T17:33:30.669Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/be/b00116df1bfb3e0bb5b45e29d604799f7b91dd861637e4d448b4e09e6a3e/pycodestyle-2.13.0-py2.py3-none-any.whl", hash = "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", size = 31424, upload-time = "2025-03-29T17:33:29.405Z" }, -] - [[package]] name = "pycparser" version = "2.22" @@ -2506,15 +2424,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, ] -[[package]] -name = "pyflakes" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/cc/1df338bd7ed1fa7c317081dcf29bf2f01266603b301e6858856d346a12b3/pyflakes-3.3.2.tar.gz", hash = "sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b", size = 64175, upload-time = "2025-03-31T13:21:20.34Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/40/b293a4fa769f3b02ab9e387c707c4cbdc34f073f945de0386107d4e669e6/pyflakes-3.3.2-py2.py3-none-any.whl", hash = "sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a", size = 63164, upload-time = "2025-03-31T13:21:18.503Z" }, -] - [[package]] name = "pygments" version = "2.19.1" @@ -2587,6 +2496,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e8/83/bff755d09e31b5d25cc7fdc4bf3915d1a404e181f1abf0359af376845c24/pylint-3.3.7-py3-none-any.whl", hash = "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d", size = 522565, upload-time = "2025-05-04T17:07:48.714Z" }, ] +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, +] + [[package]] name = "pynput" version = "1.8.1"