diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 0cb2ca2d..e121a41a 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -16,15 +16,14 @@ This repository contains the `python-bsblan` library, an asynchronous Python cli Always run these commands after making changes: ```bash -# Run all pre-commit hooks (ruff, mypy, pylint, pytest) -uv run pre-commit run --all-files +# Run all prek hooks (ruff, mypy, pylint) +uv run prek run --all-files ``` -### Pre-commit Includes +### Prek Includes - **Ruff**: Linting and formatting (88 char line limit) - **MyPy**: Static type checking - **Pylint**: Code analysis -- **Pytest**: Test execution with coverage ### Coverage Requirements - Maintain **95%+ total test coverage** @@ -77,9 +76,8 @@ Parameters are identified by numeric IDs and mapped to readable names in `consta 2. **Add to model in `models.py`**: ```python - @dataclass - class HotWaterConfig(DataClassORJSONMixin): - legionella_function_setpoint: ParameterValue | None = None + class HotWaterConfig(BaseModel): + legionella_function_setpoint: EntityInfo[float] | None = None ``` 3. **Update method in `bsblan.py`** if the parameter is settable: @@ -129,25 +127,23 @@ Defined in `constants.py`: ## Data Models ### Model Pattern -All models use `mashumaro` for JSON serialization: +All models use `pydantic` `BaseModel` for validation and serialization: ```python -from dataclasses import dataclass -from mashumaro.mixins.orjson import DataClassORJSONMixin +from pydantic import BaseModel -@dataclass -class HotWaterConfig(DataClassORJSONMixin): +class HotWaterConfig(BaseModel): """Hot water configuration parameters.""" - operating_mode: ParameterValue | None = None - nominal_setpoint: ParameterValue | None = None + operating_mode: EntityInfo[int] | None = None + nominal_setpoint: EntityInfo[float] | None = None ``` -### ParameterValue Structure -Each parameter returns a `ParameterValue` with: -- `value`: The actual value +### EntityInfo Structure +Each parameter returns an `EntityInfo[T]` (generic `BaseModel`) with: +- `value`: The actual value (typed via generic `T`) - `unit`: Unit of measurement - `desc`: Human-readable description -- `dataType`: Data type information +- `data_type`: Data type information ## Async Patterns @@ -223,7 +219,7 @@ Test fixtures (JSON responses) are in `tests/fixtures/` 4. Update docstring with parameter description 5. Add state preparation logic in `_prepare_*_state()` method 6. Add tests for the new parameter -7. Run `uv run pre-commit run --all-files` +7. Run `uv run prek run --all-files` ### Renaming a Parameter @@ -233,7 +229,7 @@ When renaming parameters for consistency: 3. Update `bsblan.py` - method parameters and state handling 4. Update `tests/` - all test files using the parameter 5. Update `examples/` - any example code -6. Run `uv run pre-commit run --all-files` +6. Run `uv run prek run --all-files` ## API Versions @@ -245,7 +241,7 @@ Version-specific parameters are handled in `constants.py` with extension diction ## Don't Forget -- ✅ Run `uv run pre-commit run --all-files` after every change +- ✅ Run `uv run prek run --all-files` after every change - ✅ Maintain 95%+ test coverage - ✅ Use type hints on all functions - ✅ Add docstrings to public methods diff --git a/.github/prompts/add-parameter.prompt.md b/.github/prompts/add-parameter.prompt.md index 3c906056..9ccb4a08 100644 --- a/.github/prompts/add-parameter.prompt.md +++ b/.github/prompts/add-parameter.prompt.md @@ -26,7 +26,7 @@ Add a new parameter to the python-bsblan library following the established patte After changes, run: ```bash -uv run pre-commit run --all-files +uv run prek run --all-files ``` Coverage must be 95%+ total and 100% for new code. diff --git a/.github/prompts/code-review.prompt.md b/.github/prompts/code-review.prompt.md index c9340a51..6584c823 100644 --- a/.github/prompts/code-review.prompt.md +++ b/.github/prompts/code-review.prompt.md @@ -21,12 +21,12 @@ Review the changes against the python-bsblan coding standards. - [ ] Patch coverage 100% ### Patterns -- [ ] Uses `mashumaro` for JSON serialization +- [ ] Uses `pydantic` `BaseModel` for validation and serialization - [ ] Uses `aiohttp` for async HTTP - [ ] Follows existing parameter naming conventions - [ ] Error handling uses custom exceptions (`BSBLANError`, `BSBLANConnectionError`) -### Pre-commit +### Prek - [ ] Ruff passes (linting + formatting) - [ ] MyPy passes (type checking) - [ ] Pylint passes (code analysis) @@ -35,6 +35,6 @@ Review the changes against the python-bsblan coding standards. ## Run Validation ```bash -uv run pre-commit run --all-files +uv run prek run --all-files uv run pytest --cov=src/bsblan --cov-report=term-missing ``` diff --git a/.github/skills/bsblan-parameters/SKILL.md b/.github/skills/bsblan-parameters/SKILL.md index 19b42955..e49d5897 100644 --- a/.github/skills/bsblan-parameters/SKILL.md +++ b/.github/skills/bsblan-parameters/SKILL.md @@ -28,12 +28,11 @@ BASE_HOT_WATER_PARAMS: Final[dict[str, str]] = { ### 2. Add to Model in `models.py` -Add the field to the appropriate dataclass: +Add the field to the appropriate model: ```python -@dataclass -class HotWaterConfig(DataClassORJSONMixin): - legionella_function_setpoint: ParameterValue | None = None +class HotWaterConfig(BaseModel): + legionella_function_setpoint: EntityInfo[float] | None = None ``` ### 3. Update Method in `bsblan.py` (if settable) @@ -100,7 +99,7 @@ When adding new sections or groups, the lock is created automatically on first a Always run after changes: ```bash -uv run pre-commit run --all-files +uv run prek run --all-files uv run pytest --cov=src/bsblan --cov-report=term-missing ``` diff --git a/.github/skills/bsblan-testing/SKILL.md b/.github/skills/bsblan-testing/SKILL.md index 44cadd7f..fb653fb3 100644 --- a/.github/skills/bsblan-testing/SKILL.md +++ b/.github/skills/bsblan-testing/SKILL.md @@ -101,12 +101,12 @@ uv run pytest -v uv run pytest tests/test_bsblan.py::test_function_name ``` -## Pre-commit Hooks +## Prek Hooks Always run before committing: ```bash -uv run pre-commit run --all-files +uv run prek run --all-files ``` This runs: @@ -114,7 +114,6 @@ This runs: - **Ruff**: Linting and formatting (88 char line limit) - **MyPy**: Static type checking - **Pylint**: Code analysis -- **Pytest**: Test execution with coverage ## Mock Patterns diff --git a/.github/workflows/linting.yaml b/.github/workflows/linting.yaml index e2f91497..169fc1c8 100644 --- a/.github/workflows/linting.yaml +++ b/.github/workflows/linting.yaml @@ -34,7 +34,7 @@ jobs: - name: 🏗 Install Python dependencies run: uv sync --dev - name: 🚀 Check code for common misspellings - run: uv run pre-commit run codespell --all-files + run: uv run prek run codespell --all-files ruff: name: Ruff @@ -58,8 +58,8 @@ jobs: - name: 🚀 Run ruff formatter run: uv run ruff format --check . - pre-commit-hooks: - name: pre-commit-hooks + prek-hooks: + name: prek-hooks runs-on: ubuntu-latest steps: - name: ⤵️ Check out code from GitHub @@ -76,31 +76,31 @@ jobs: - name: 🏗 Install Python dependencies run: uv sync --dev - name: 🚀 Check Python AST - run: uv run pre-commit run check-ast --all-files + run: uv run prek run check-ast --all-files - name: 🚀 Check for case conflicts - run: uv run pre-commit run check-case-conflict --all-files + run: uv run prek run check-case-conflict --all-files - name: 🚀 Check docstring is first - run: uv run pre-commit run check-docstring-first --all-files + run: uv run prek run check-docstring-first --all-files - name: 🚀 Check that executables have shebangs - run: uv run pre-commit run check-executables-have-shebangs --all-files + run: uv run prek run check-executables-have-shebangs --all-files - name: 🚀 Check JSON files - run: uv run pre-commit run check-json --all-files + run: uv run prek run check-json --all-files - name: 🚀 Check for merge conflicts - run: uv run pre-commit run check-merge-conflict --all-files + run: uv run prek run check-merge-conflict --all-files - name: 🚀 Check for broken symlinks - run: uv run pre-commit run check-symlinks --all-files + run: uv run prek run check-symlinks --all-files - name: 🚀 Check TOML files - run: uv run pre-commit run check-toml --all-files + run: uv run prek run check-toml --all-files - name: 🚀 Check XML files - run: uv run pre-commit run check-yaml --all-files + run: uv run prek run check-yaml --all-files - name: 🚀 Check YAML files - run: uv run pre-commit run check-yaml --all-files + run: uv run prek run check-yaml --all-files - name: 🚀 Detect Private Keys - run: uv run pre-commit run detect-private-key --all-files + run: uv run prek run detect-private-key --all-files - name: 🚀 Check End of Files - run: uv run pre-commit run end-of-file-fixer --all-files + run: uv run prek run end-of-file-fixer --all-files - name: 🚀 Trim Trailing Whitespace - run: uv run pre-commit run trailing-whitespace --all-files + run: uv run prek run trailing-whitespace --all-files pylint: name: pylint @@ -120,7 +120,7 @@ jobs: - name: 🏗 Install Python dependencies run: uv sync --dev - name: 🚀 Run pylint - run: uv run pre-commit run pylint --all-files + run: uv run prek run pylint --all-files yamllint: name: yamllint @@ -167,4 +167,4 @@ jobs: - name: 🏗 Install NPM dependencies run: npm install - name: 🚀 Run prettier - run: uv run pre-commit run prettier --all-files + run: uv run prek run prettier --all-files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 86eac15c..88eb7694 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -109,12 +109,6 @@ repos: language: system types: [python] entry: uv run pylint --exit-zero - - id: pytest - name: 🧪 Running tests and test coverage with pytest - language: system - types: [python] - entry: uv run pytest - pass_filenames: false - id: trailing-whitespace name: ✄ Trim Trailing Whitespace language: system diff --git a/README.md b/README.md index efd2add1..1ba3fc9e 100644 --- a/README.md +++ b/README.md @@ -153,12 +153,12 @@ npm install uv sync --dev ``` -As this repository uses the [pre-commit][pre-commit] framework, all changes -are linted and tested with each commit. You can run all checks and tests -manually, using the following command: +As this repository uses [prek][prek] (a faster, Rust-based drop-in replacement +for pre-commit), all changes are linted and tested with each commit. You can +run all checks and tests manually, using the following command: ```bash -uv run pre-commit run --all-files +uv run prek run --all-files ``` To run just the Python tests: @@ -214,7 +214,7 @@ SOFTWARE. [maintenance-shield]: https://img.shields.io/maintenance/yes/2026.svg [uv]: https://docs.astral.sh/uv/ [uv-install]: https://docs.astral.sh/uv/getting-started/installation/ -[pre-commit]: https://pre-commit.com/ +[prek]: https://github.com/j178/prek [project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg [pypi]: https://pypi.org/project/python-bsblan/ [python-versions-shield]: https://img.shields.io/pypi/pyversions/python-bsblan diff --git a/pyproject.toml b/pyproject.toml index 99d35ee0..6617eeb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -189,7 +189,7 @@ dev = [ "hatch>=1.14.1", "isort==7.0.0", "ty==0.0.18", - "pre-commit==4.5.1", + "prek>=0.3.3", "pre-commit-hooks==6.0.0", "pylint==4.0.5", "pytest>=8.3.5", diff --git a/uv.lock b/uv.lock index c1edb4a5..df79a936 100644 --- a/uv.lock +++ b/uv.lock @@ -376,15 +376,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] -[[package]] -name = "cfgv" -version = "3.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, -] - [[package]] name = "charset-normalizer" version = "3.4.4" @@ -885,15 +876,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4", size = 74638, upload-time = "2021-01-08T05:51:22.906Z" }, ] -[[package]] -name = "identify" -version = "2.6.16" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5b/8d/e8b97e6bd3fb6fb271346f7981362f1e04d6a7463abd0de79e1fda17c067/identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980", size = 99360, upload-time = "2026-01-12T18:58:58.201Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/58/40fbbcefeda82364720eba5cf2270f98496bdfa19ea75b4cccae79c698e6/identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0", size = 99202, upload-time = "2026-01-12T18:58:56.627Z" }, -] - [[package]] name = "idna" version = "3.11" @@ -1244,15 +1226,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl", hash = "sha256:1e209d2b3009110635ed9709a67a1a3e33a10f799490fa71cf4bec218c11c88a", size = 1513404, upload-time = "2025-10-01T07:19:21.648Z" }, ] -[[package]] -name = "nodeenv" -version = "1.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, -] - [[package]] name = "packaging" version = "26.0" @@ -1301,22 +1274,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] -[[package]] -name = "pre-commit" -version = "4.5.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, -] - [[package]] name = "pre-commit-hooks" version = "6.0.0" @@ -1329,6 +1286,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/46/eba9be9daa403fa94854ce16a458c29df9a01c6c047931c3d8be6016cd9a/pre_commit_hooks-6.0.0-py2.py3-none-any.whl", hash = "sha256:76161b76d321d2f8ee2a8e0b84c30ee8443e01376121fd1c90851e33e3bd7ee2", size = 41338, upload-time = "2025-08-09T19:25:03.513Z" }, ] +[[package]] +name = "prek" +version = "0.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/f1/7613dc8347a33e40fc5b79eec6bc7d458d8bbc339782333d8433b665f86f/prek-0.3.3.tar.gz", hash = "sha256:117bd46ebeb39def24298ce021ccc73edcf697b81856fcff36d762dd56093f6f", size = 343697, upload-time = "2026-02-15T13:33:28.723Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/8b/dce13d2a3065fd1e8ffce593a0e51c4a79c3cde9c9a15dc0acc8d9d1573d/prek-0.3.3-py3-none-linux_armv6l.whl", hash = "sha256:e8629cac4bdb131be8dc6e5a337f0f76073ad34a8305f3fe2bc1ab6201ede0a4", size = 4644636, upload-time = "2026-02-15T13:33:43.609Z" }, + { url = "https://files.pythonhosted.org/packages/01/30/06ab4dbe7ce02a8ce833e92deb1d9a8e85ae9d40e33d1959a2070b7494c6/prek-0.3.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4b9e819b9e4118e1e785047b1c8bd9aec7e4d836ed034cb58b7db5bcaaf49437", size = 4651410, upload-time = "2026-02-15T13:33:34.277Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fc/da3bc5cb38471e7192eda06b7a26b7c24ef83e82da2c1dbc145f2bf33640/prek-0.3.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bf29db3b5657c083eb8444c25aadeeec5167dc492e9019e188f87932f01ea50a", size = 4273163, upload-time = "2026-02-15T13:33:42.106Z" }, + { url = "https://files.pythonhosted.org/packages/b4/74/47839395091e2937beced81a5dd2f8ea9c8239c853da8611aaf78ee21a8b/prek-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:ae09736149815b26e64a9d350ca05692bab32c2afdf2939114d3211aaad68a3e", size = 4631808, upload-time = "2026-02-15T13:33:20.076Z" }, + { url = "https://files.pythonhosted.org/packages/e2/89/3f5ef6f7c928c017cb63b029349d6bc03598ab7f6979d4a770ce02575f82/prek-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:856c2b55c51703c366bb4ce81c6a91102b70573a9fc8637db2ac61c66e4565f9", size = 4548959, upload-time = "2026-02-15T13:33:36.325Z" }, + { url = "https://files.pythonhosted.org/packages/b2/18/80002c4c4475f90ca025f27739a016927a0e5d905c60612fc95da1c56ab7/prek-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3acdf13a018f685beaff0a71d4b0d2ccbab4eaa1aced6d08fd471c1a654183eb", size = 4862256, upload-time = "2026-02-15T13:33:37.754Z" }, + { url = "https://files.pythonhosted.org/packages/c5/25/648bf084c2468fa7cfcdbbe9e59956bbb31b81f36e113bc9107d80af26a7/prek-0.3.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0f035667a8bd0a77b2bfa2b2e125da8cb1793949e9eeef0d8daab7f8ac8b57fe", size = 5404486, upload-time = "2026-02-15T13:33:39.239Z" }, + { url = "https://files.pythonhosted.org/packages/8b/43/261fb60a11712a327da345912bd8b338dc5a050199de800faafa278a6133/prek-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d09b2ad14332eede441d977de08eb57fb3f61226ed5fd2ceb7aadf5afcdb6794", size = 4887513, upload-time = "2026-02-15T13:33:40.702Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2c/581e757ee57ec6046b32e0ee25660fc734bc2622c319f57119c49c0cab58/prek-0.3.3-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:c0c3ffac16e37a9daba43a7e8316778f5809b70254be138761a8b5b9ef0df28e", size = 4632336, upload-time = "2026-02-15T13:33:25.867Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d8/aa276ce5d11b77882da4102ca0cb7161095831105043ae7979bbfdcc3dc4/prek-0.3.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a3dc7720b580c07c0386e17af2486a5b4bc2f6cc57034a288a614dcbc4abe555", size = 4679370, upload-time = "2026-02-15T13:33:22.247Z" }, + { url = "https://files.pythonhosted.org/packages/70/19/9d4fa7bde428e58d9f48a74290c08736d42aeb5690dcdccc7a713e34a449/prek-0.3.3-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:60e0fa15da5020a03df2ee40268145ec5b88267ec2141a205317ad4df8c992d6", size = 4540316, upload-time = "2026-02-15T13:33:24.088Z" }, + { url = "https://files.pythonhosted.org/packages/25/b5/973cce29257e0b47b16cc9b4c162772ea01dbb7c080791ea0c068e106e05/prek-0.3.3-py3-none-musllinux_1_1_i686.whl", hash = "sha256:553515da9586d9624dc42db32b744fdb91cf62b053753037a0cadb3c2d8d82a2", size = 4724566, upload-time = "2026-02-15T13:33:29.832Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8b/ad8b2658895a8ed2b0bc630bf38686fe38b7ff2c619c58953a80e4de3048/prek-0.3.3-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:9512cf370e0d1496503463a4a65621480efb41b487841a9e9ff1661edf14b238", size = 4995072, upload-time = "2026-02-15T13:33:27.417Z" }, + { url = "https://files.pythonhosted.org/packages/fd/b7/0540c101c00882adb9d30319d22d8f879413598269ecc60235e41875efd4/prek-0.3.3-py3-none-win32.whl", hash = "sha256:b2b328c7c6dc14ccdc79785348589aa39850f47baff33d8f199f2dee80ff774c", size = 4293144, upload-time = "2026-02-15T13:33:46.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/e4f11da653093040efba2d835aa0995d78940aea30887287aeaebe34a545/prek-0.3.3-py3-none-win_amd64.whl", hash = "sha256:3d7d7acf7ca8db65ba0943c52326c898f84bab0b1c26a35c87e0d177f574ca5f", size = 4652761, upload-time = "2026-02-15T13:33:32.962Z" }, + { url = "https://files.pythonhosted.org/packages/11/e4/d99dec54c6a5fb2763488bff6078166383169a93f3af27d2edae88379a39/prek-0.3.3-py3-none-win_arm64.whl", hash = "sha256:8aa87ee7628cd74482c0dd6537a3def1f162b25cd642d78b1b35dd3e81817f60", size = 4367520, upload-time = "2026-02-15T13:33:31.664Z" }, +] + [[package]] name = "propcache" version = "0.4.1" @@ -1653,8 +1634,8 @@ dev = [ { name = "flake8-simplify" }, { name = "hatch" }, { name = "isort" }, - { name = "pre-commit" }, { name = "pre-commit-hooks" }, + { name = "prek" }, { name = "pylint" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -1692,8 +1673,8 @@ dev = [ { name = "flake8-simplify", specifier = "==0.30.0" }, { name = "hatch", specifier = ">=1.14.1" }, { name = "isort", specifier = "==7.0.0" }, - { name = "pre-commit", specifier = "==4.5.1" }, { name = "pre-commit-hooks", specifier = "==6.0.0" }, + { name = "prek", specifier = ">=0.3.3" }, { name = "pylint", specifier = "==4.0.5" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-asyncio", specifier = "==1.3.0" },