From 17b853fcfa8a853e87f45cbc5638680bd0c31db0 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 3 Sep 2024 17:35:35 +0200 Subject: [PATCH 001/138] Fix X2 Omni (#552) --- deebot_client/commands/json/clean.py | 2 +- deebot_client/hardware/deebot/e6ofmn.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deebot_client/commands/json/clean.py b/deebot_client/commands/json/clean.py index 68f32464..99ef10e5 100644 --- a/deebot_client/commands/json/clean.py +++ b/deebot_client/commands/json/clean.py @@ -85,7 +85,7 @@ def _get_args(self, action: CleanAction) -> dict[str, Any]: match action: case CleanAction.START: content["type"] = CleanMode.AUTO.value - case CleanAction.STOP: + case CleanAction.STOP | CleanAction.PAUSE: content["type"] = "" return args diff --git a/deebot_client/hardware/deebot/e6ofmn.py b/deebot_client/hardware/deebot/e6ofmn.py index 2c51c72e..1cf4d299 100644 --- a/deebot_client/hardware/deebot/e6ofmn.py +++ b/deebot_client/hardware/deebot/e6ofmn.py @@ -26,7 +26,7 @@ ) from deebot_client.commands.json.charge import Charge from deebot_client.commands.json.charge_state import GetChargeState -from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean import CleanV2, GetCleanInfoV2 from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount from deebot_client.commands.json.clean_logs import GetCleanLogs from deebot_client.commands.json.clean_preference import ( @@ -112,7 +112,7 @@ battery=CapabilityEvent(BatteryEvent, [GetBattery()]), charge=CapabilityExecute(Charge), clean=CapabilityClean( - action=CapabilityCleanAction(command=Clean, area=CleanArea), + action=CapabilityCleanAction(command=CleanV2), continuous=CapabilitySetEnable( ContinuousCleaningEvent, [GetContinuousCleaning()], @@ -208,7 +208,7 @@ ), volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), ), - state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfoV2()]), stats=CapabilityStats( clean=CapabilityEvent(StatsEvent, [GetStats()]), report=CapabilityEvent(ReportStatsEvent, []), From d39166e7725188d54f109b54b98416467d098379 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 3 Sep 2024 20:17:41 +0200 Subject: [PATCH 002/138] Use uv instead of pip (#564) --- .devcontainer.json | 12 +- .github/workflows/ci.yml | 66 ++- .github/workflows/python-publish.yml | 25 +- .pre-commit-config.yaml | 2 + .python-version | 1 + pyproject.toml | 54 +- uv.lock | 823 +++++++++++++++++++++++++++ 7 files changed, 927 insertions(+), 56 deletions(-) create mode 100644 .python-version create mode 100644 uv.lock diff --git a/.devcontainer.json b/.devcontainer.json index 16fec551..b2f955d2 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -27,12 +27,8 @@ "files.eol": "\n", "files.trimTrailingWhitespace": true, "python.analysis.autoImportCompletions": true, - "python.analysis.autoSearchPaths": false, - "python.analysis.extraPaths": ["/home/vscode/.local/lib/python3.12/"], "python.analysis.typeCheckingMode": "basic", - "python.defaultInterpreterPath": "/usr/local/bin/python", "python.languageServer": "Pylance", - "python.pythonPath": "/usr/local/python/bin/python", "python.testing.pytestEnabled": true, "python.testing.unittestEnabled": false, "terminal.integrated.defaultProfile.linux": "zsh", @@ -48,12 +44,16 @@ "features": { "ghcr.io/devcontainers/features/docker-in-docker:2": {} }, - "image": "mcr.microsoft.com/devcontainers/python:3", + "image": "mcr.microsoft.com/devcontainers/base:debian", "name": "Deebot client", // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. - "postStartCommand": "pip install -r requirements-dev.txt && pre-commit install && pip install -e .", + "postCreateCommand": "curl -LsSf https://astral.sh/uv/install.sh | sh && uv sync --frozen --dev && pre-commit install", + "postStartCommand": "uv sync --dev", + "remoteEnv": { + "PATH": "/home/vscode/.cargo/bin:/workspaces/client.py/.venv/bin:${containerEnv:PATH}" + }, // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. "remoteUser": "vscode", "runArgs": ["-e", "GIT_EDITOR=code --wait"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca932ecf..948d82fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,56 +8,72 @@ on: pull_request: env: - DEFAULT_PYTHON: "3.12" + UV_CACHE_DIR: /tmp/.uv-cache jobs: code-quality: runs-on: "ubuntu-latest" name: Check code quality steps: - - uses: "actions/checkout@v4" - - name: Set up Python ${{ env.DEFAULT_PYTHON }} - id: python - uses: actions/setup-python@v5.2.0 + - uses: actions/checkout@v4 + - name: Set up uv + # Install latest uv version using the installer + run: curl -LsSf https://astral.sh/uv/install.sh | sh + - name: "Set up Python" + uses: actions/setup-python@v5 + with: + python-version-file: ".python-version" + - name: Restore uv cache + uses: actions/cache@v4 with: - python-version: ${{ env.DEFAULT_PYTHON }} - cache: "pip" - cache-dependency-path: "requirements*" - - name: Install dependencies - run: | - pip install -r requirements.txt - pip install -r requirements-test.txt + path: /tmp/.uv-cache + key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} + restore-keys: | + uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} + uv-${{ runner.os }} + - name: Install the project + run: uv sync --locked --dev # Following steps cannot run by pre-commit.ci as repo = local - name: Run mypy - run: mypy deebot_client/ + run: uv run mypy deebot_client/ - name: Pylint review - run: pylint deebot_client/ + run: uv run pylint deebot_client/ - name: Verify no getLogger usages run: scripts/check_getLogger.sh + - name: Minimize uv cache + run: uv cache prune --ci tests: runs-on: "ubuntu-latest" name: Run tests strategy: matrix: - python-version: ["3.12"] + python-version: + - "3.12" steps: - uses: "actions/checkout@v4" + - name: Set up uv + # Install latest uv version using the installer + run: curl -LsSf https://astral.sh/uv/install.sh | sh - name: Set up Python ${{ matrix.python-version }} - id: python - uses: actions/setup-python@v5.2.0 + run: uv python install ${{ matrix.python-version }} + - name: Restore uv cache + uses: actions/cache@v4 with: - python-version: ${{ matrix.python-version }} - cache: "pip" - cache-dependency-path: "requirements*" - - name: Install dependencies - run: | - pip install -r requirements.txt - pip install -r requirements-test.txt + path: /tmp/.uv-cache + key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }}-${{ matrix.python-version }} + restore-keys: | + uv-${{ runner.os }}-${{ hashFiles('uv.lock') }}-${{ matrix.python-version }} + uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} + uv-${{ runner.os }} + - name: Install the project + run: uv sync --locked --dev - name: Run pytest - run: pytest --cov=./ --cov-report=xml + run: uv run pytest tests --cov=./ --cov-report=xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true + - name: Minimize uv cache + run: uv cache prune --ci diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 2480d708..e4632e91 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -22,15 +22,26 @@ jobs: - name: 📥 Checkout the repository uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5.2.0 + - name: Set up uv + # Install latest uv version using the installer + run: curl -LsSf https://astral.sh/uv/install.sh | sh + + - name: "Set up Python" + uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version-file: ".python-version" - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -q build + - name: Restore uv cache + uses: actions/cache@v4 + with: + path: /tmp/.uv-cache + key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} + restore-keys: | + uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} + uv-${{ runner.os }} + + - name: Install the project + run: uv sync --locked - name: 📦 Build package run: python -m build diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 173b59ff..f368d10f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,6 +36,7 @@ repos: exclude_types: - csv - json + exclude: ^uv.lock$ - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.6.0 hooks: @@ -54,6 +55,7 @@ repos: - prettier-plugin-sort-json@3.1.0 exclude_types: - python + exclude: ^uv.lock$ - repo: https://github.com/adrienverge/yamllint.git rev: v1.35.1 hooks: diff --git a/.python-version b/.python-version new file mode 100644 index 00000000..fdcfcfdf --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 26f0cda1..8ca5fdeb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,6 @@ [build-system] -requires = ["setuptools>=60", - "setuptools-scm>=8.0"] -build-backend = "setuptools.build_meta" +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" [project] name = "deebot-client" @@ -21,28 +20,30 @@ classifiers = [ "Topic :: Software Development :: Libraries :: Python Modules", ] requires-python = ">=3.12.0" -dynamic = ["dependencies", "version"] +dependencies = [ + "aiohttp~=3.10", + "aiomqtt>=2.0.0,<3.0", + "cachetools>=5.0.0,<6.0", + "defusedxml>=0.7.1", + "numpy>=1.23.2,<3.0", + "pillow>=10.0.1,<11.0", + "svg-py>=1.4.2", +] +dynamic = ["version"] [project.urls] "Homepage" = "https://deebot.readthedocs.io/" "Source Code" = "https://github.com/DeebotUniverse/client.py" "Bug Reports" = "https://github.com/DeebotUniverse/client.py/issues" -[tool.setuptools] -include-package-data = true - -[tool.setuptools.dynamic] -dependencies = {file = ["requirements.txt"]} - -[tool.setuptools.packages.find] -include = ["deebot_client*"] - -[tool.setuptools_scm] -[tool.black] -target-version = ['py311'] -safe = true +[tool.hatch.build.targets.sdist] +include = [ + "/deebot_client", +] +[tool.hatch.version] +source = "vcs" [tool.ruff.lint] select = [ @@ -173,4 +174,21 @@ expected-line-ending-format = "LF" overgeneral-exceptions = [ "builtins.BaseException", "builtins.Exception", -] \ No newline at end of file +] + +[tool.uv] +dev-dependencies = [ + "mypy==1.11.2", + "pre-commit==3.8.0", + "pycountry==24.6.1", + "pylint==3.2.7", + "pytest-asyncio==0.24.0", + "pytest-cov==5.0.0", + "pytest-docker-fixtures==1.3.19", + "pytest-timeout==2.3.1", + "pytest==8.3.2", + "testfixtures==8.3.0", + "types-cachetools>=5.5.0.20240820", + "types-mock>=5.1.0.20240425", + "types-pillow>=10.2.0.20240822", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..a1ba79a5 --- /dev/null +++ b/uv.lock @@ -0,0 +1,823 @@ +version = 1 +requires-python = ">=3.12.0" + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f7/22bba300a16fd1cad99da1a23793fe43963ee326d012fdf852d0b4035955/aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2", size = 16786 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/b6/58ea188899950d759a837f9a58b2aee1d1a380ea4d6211ce9b1823748851/aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd", size = 12155 }, +] + +[[package]] +name = "aiohttp" +version = "3.10.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/28/ca549838018140b92a19001a8628578b0f2a3b38c16826212cc6f706e6d4/aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691", size = 7524360 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/1c/74f9dad4a2fc4107e73456896283d915937f48177b99867b63381fadac6e/aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487", size = 583468 }, + { url = "https://files.pythonhosted.org/packages/12/29/68d090551f2b58ce76c2b436ced8dd2dfd32115d41299bf0b0c308a5483c/aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a", size = 394066 }, + { url = "https://files.pythonhosted.org/packages/8f/f7/971f88b4cdcaaa4622925ba7d86de47b48ec02a9040a143514b382f78da4/aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d", size = 389098 }, + { url = "https://files.pythonhosted.org/packages/f1/5a/fe3742efdce551667b2ddf1158b27c5b8eb1edc13d5e14e996e52e301025/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75", size = 1332742 }, + { url = "https://files.pythonhosted.org/packages/1a/52/a25c0334a1845eb4967dff279151b67ca32a948145a5812ed660ed900868/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178", size = 1372134 }, + { url = "https://files.pythonhosted.org/packages/96/3d/33c1d8efc2d8ec36bff9a8eca2df9fdf8a45269c6e24a88e74f2aa4f16bd/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e", size = 1414413 }, + { url = "https://files.pythonhosted.org/packages/64/74/0f1ddaa5f0caba1d946f0dd0c31f5744116e4a029beec454ec3726d3311f/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f", size = 1328107 }, + { url = "https://files.pythonhosted.org/packages/0a/32/c10118f0ad50e4093227234f71fd0abec6982c29367f65f32ee74ed652c4/aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73", size = 1280126 }, + { url = "https://files.pythonhosted.org/packages/c6/c9/77e3d648d97c03a42acfe843d03e97be3c5ef1b4d9de52e5bd2d28eed8e7/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf", size = 1292660 }, + { url = "https://files.pythonhosted.org/packages/7e/5d/99c71f8e5c8b64295be421b4c42d472766b263a1fe32e91b64bf77005bf2/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820", size = 1300988 }, + { url = "https://files.pythonhosted.org/packages/8f/2c/76d2377dd947f52fbe8afb19b18a3b816d66c7966755c04030f93b1f7b2d/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca", size = 1339268 }, + { url = "https://files.pythonhosted.org/packages/fd/e6/3d9d935cc705d57ed524d82ec5d6b678a53ac1552720ae41282caa273584/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91", size = 1366993 }, + { url = "https://files.pythonhosted.org/packages/fe/c2/f7eed4d602f3f224600d03ab2e1a7734999b0901b1c49b94dc5891340433/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6", size = 1329459 }, + { url = "https://files.pythonhosted.org/packages/ce/8f/27f205b76531fc592abe29e1ad265a16bf934a9f609509c02d765e6a8055/aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12", size = 356968 }, + { url = "https://files.pythonhosted.org/packages/39/8c/4f6c0b2b3629f6be6c81ab84d9d577590f74f01d4412bfc4067958eaa1e1/aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc", size = 377650 }, + { url = "https://files.pythonhosted.org/packages/7b/b9/03b4327897a5b5d29338fa9b514f1c2f66a3e4fc88a4e40fad478739314d/aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092", size = 576994 }, + { url = "https://files.pythonhosted.org/packages/67/1b/20c2e159cd07b8ed6dde71c2258233902fdf415b2fe6174bd2364ba63107/aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77", size = 390684 }, + { url = "https://files.pythonhosted.org/packages/4d/6b/ff83b34f157e370431d8081c5d1741963f4fb12f9aaddb2cacbf50305225/aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385", size = 386176 }, + { url = "https://files.pythonhosted.org/packages/4d/a1/6e92817eb657de287560962df4959b7ddd22859c4b23a0309e2d3de12538/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972", size = 1303310 }, + { url = "https://files.pythonhosted.org/packages/04/29/200518dc7a39c30ae6d5bc232d7207446536e93d3d9299b8e95db6e79c54/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16", size = 1340445 }, + { url = "https://files.pythonhosted.org/packages/8e/20/53f7bba841ba7b5bb5dea580fea01c65524879ba39cb917d08c845524717/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6", size = 1385121 }, + { url = "https://files.pythonhosted.org/packages/f1/b4/d99354ad614c48dd38fb1ee880a1a54bd9ab2c3bcad3013048d4a1797d3a/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa", size = 1299669 }, + { url = "https://files.pythonhosted.org/packages/51/39/ca1de675f2a5729c71c327e52ac6344e63f036bd37281686ae5c3fb13bfb/aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689", size = 1252638 }, + { url = "https://files.pythonhosted.org/packages/54/cf/a3ae7ff43138422d477348e309ef8275779701bf305ff6054831ef98b782/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57", size = 1266889 }, + { url = "https://files.pythonhosted.org/packages/6e/7a/c6027ad70d9fb23cf254a26144de2723821dade1a624446aa22cd0b6d012/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f", size = 1266249 }, + { url = "https://files.pythonhosted.org/packages/64/fd/ed136d46bc2c7e3342fed24662b4827771d55ceb5a7687847aae977bfc17/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599", size = 1311036 }, + { url = "https://files.pythonhosted.org/packages/76/9a/43eeb0166f1119256d6f43468f900db1aed7fbe32069d2a71c82f987db4d/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5", size = 1338756 }, + { url = "https://files.pythonhosted.org/packages/d5/bc/d01ff0810b3f5e26896f76d44225ed78b088ddd33079b85cd1a23514318b/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987", size = 1299976 }, + { url = "https://files.pythonhosted.org/packages/3e/c9/50a297c4f7ab57a949f4add2d3eafe5f3e68bb42f739e933f8b32a092bda/aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04", size = 355609 }, + { url = "https://files.pythonhosted.org/packages/65/28/aee9d04fb0b3b1f90622c338a08e54af5198e704a910e20947c473298fd0/aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022", size = 375697 }, +] + +[[package]] +name = "aiomqtt" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "paho-mqtt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/c9/168e78bd35b21d9bdbb26178db33a8f265e4a69bb4193e72434e7cb3d1cd/aiomqtt-2.3.0.tar.gz", hash = "sha256:312feebe20bc76dc7c20916663011f3bd37aa6f42f9f687a19a1c58308d80d47", size = 16479 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/5f/73aa0474a75fce798c8c45a0993720c3722688ae5bea1d0a5c4a9f97ae8e/aiomqtt-2.3.0-py3-none-any.whl", hash = "sha256:127926717bd6b012d1630f9087f24552eb9c4af58205bc2964f09d6e304f7e63", size = 15807 }, +] + +[[package]] +name = "aiosignal" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", size = 7617 }, +] + +[[package]] +name = "astroid" +version = "3.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/53/1067e1113ecaf58312357f2cd93063674924119d80d173adc3f6f2387aa2/astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a", size = 397576 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/96/b32bbbb46170a1c8b8b1f28c794202e25cfe743565e9d3469b8eb1e0cc05/astroid-3.2.4-py3-none-any.whl", hash = "sha256:413658a61eeca6202a59231abb473f932038fbcbf1666587f66d482083413a25", size = 276348 }, +] + +[[package]] +name = "attrs" +version = "24.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, +] + +[[package]] +name = "cachetools" +version = "5.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/38/a0f315319737ecf45b4319a8cd1f3a908e29d9277b46942263292115eee7/cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a", size = 27661 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/07/14f8ad37f2d12a5ce41206c21820d8cb6561b728e51fad4530dff0552a67/cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292", size = 9524 }, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892 }, + { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213 }, + { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404 }, + { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275 }, + { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518 }, + { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182 }, + { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869 }, + { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042 }, + { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275 }, + { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819 }, + { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415 }, + { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212 }, + { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167 }, + { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041 }, + { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397 }, + { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "coverage" +version = "7.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983 }, + { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221 }, + { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342 }, + { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371 }, + { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455 }, + { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924 }, + { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252 }, + { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897 }, + { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606 }, + { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373 }, + { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007 }, + { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269 }, + { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886 }, + { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037 }, + { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038 }, + { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690 }, + { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765 }, + { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611 }, + { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671 }, + { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368 }, + { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758 }, + { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035 }, + { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839 }, + { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569 }, + { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927 }, + { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401 }, + { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301 }, + { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598 }, + { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307 }, + { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453 }, +] + +[[package]] +name = "deebot-client" +version = "8.3.1.dev8+g17b853f.d20240903" +source = { editable = "." } +dependencies = [ + { name = "aiohttp" }, + { name = "aiomqtt" }, + { name = "cachetools" }, + { name = "defusedxml" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "svg-py" }, +] + +[package.dev-dependencies] +dev = [ + { name = "mypy" }, + { name = "pre-commit" }, + { name = "pycountry" }, + { name = "pylint" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cov" }, + { name = "pytest-docker-fixtures" }, + { name = "pytest-timeout" }, + { name = "testfixtures" }, + { name = "types-cachetools" }, + { name = "types-mock" }, + { name = "types-pillow" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiohttp", specifier = "~=3.10" }, + { name = "aiomqtt", specifier = ">=2.0.0,<3.0" }, + { name = "cachetools", specifier = ">=5.0.0,<6.0" }, + { name = "defusedxml", specifier = ">=0.7.1" }, + { name = "numpy", specifier = ">=1.23.2,<3.0" }, + { name = "pillow", specifier = ">=10.0.1,<11.0" }, + { name = "svg-py", specifier = ">=1.4.2" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "mypy", specifier = "==1.11.2" }, + { name = "pre-commit", specifier = "==3.8.0" }, + { name = "pycountry", specifier = "==24.6.1" }, + { name = "pylint", specifier = "==3.2.7" }, + { name = "pytest", specifier = "==8.3.2" }, + { name = "pytest-asyncio", specifier = "==0.24.0" }, + { name = "pytest-cov", specifier = "==5.0.0" }, + { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, + { name = "pytest-timeout", specifier = "==2.3.1" }, + { name = "testfixtures", specifier = "==8.3.0" }, + { name = "types-cachetools", specifier = ">=5.5.0.20240820" }, + { name = "types-mock", specifier = ">=5.1.0.20240425" }, + { name = "types-pillow", specifier = ">=10.2.0.20240822" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, +] + +[[package]] +name = "dill" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252 }, +] + +[[package]] +name = "distlib" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/91/e2df406fb4efacdf46871c25cde65d3c6ee5e173b7e5a4547a47bae91920/distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64", size = 609931 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", size = 468850 }, +] + +[[package]] +name = "docker" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774 }, +] + +[[package]] +name = "filelock" +version = "3.15.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/dd/49e06f09b6645156550fb9aee9cc1e59aba7efbc972d665a1bd6ae0435d4/filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", size = 18007 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7", size = 16159 }, +] + +[[package]] +name = "frozenlist" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/3d/2102257e7acad73efc4a0c306ad3953f68c504c16982bbdfee3ad75d8085/frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", size = 37820 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/db/4cf37556a735bcdb2582f2c3fa286aefde2322f92d3141e087b8aeb27177/frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae", size = 93937 }, + { url = "https://files.pythonhosted.org/packages/46/03/69eb64642ca8c05f30aa5931d6c55e50b43d0cd13256fdd01510a1f85221/frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb", size = 53656 }, + { url = "https://files.pythonhosted.org/packages/3f/ab/c543c13824a615955f57e082c8a5ee122d2d5368e80084f2834e6f4feced/frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b", size = 51868 }, + { url = "https://files.pythonhosted.org/packages/a9/b8/438cfd92be2a124da8259b13409224d9b19ef8f5a5b2507174fc7e7ea18f/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86", size = 280652 }, + { url = "https://files.pythonhosted.org/packages/54/72/716a955521b97a25d48315c6c3653f981041ce7a17ff79f701298195bca3/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480", size = 286739 }, + { url = "https://files.pythonhosted.org/packages/65/d8/934c08103637567084568e4d5b4219c1016c60b4d29353b1a5b3587827d6/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09", size = 289447 }, + { url = "https://files.pythonhosted.org/packages/70/bb/d3b98d83ec6ef88f9bd63d77104a305d68a146fd63a683569ea44c3085f6/frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a", size = 265466 }, + { url = "https://files.pythonhosted.org/packages/0b/f2/b8158a0f06faefec33f4dff6345a575c18095a44e52d4f10c678c137d0e0/frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd", size = 281530 }, + { url = "https://files.pythonhosted.org/packages/ea/a2/20882c251e61be653764038ece62029bfb34bd5b842724fff32a5b7a2894/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6", size = 281295 }, + { url = "https://files.pythonhosted.org/packages/4c/f9/8894c05dc927af2a09663bdf31914d4fb5501653f240a5bbaf1e88cab1d3/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1", size = 268054 }, + { url = "https://files.pythonhosted.org/packages/37/ff/a613e58452b60166507d731812f3be253eb1229808e59980f0405d1eafbf/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b", size = 286904 }, + { url = "https://files.pythonhosted.org/packages/cc/6e/0091d785187f4c2020d5245796d04213f2261ad097e0c1cf35c44317d517/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e", size = 290754 }, + { url = "https://files.pythonhosted.org/packages/a5/c2/e42ad54bae8bcffee22d1e12a8ee6c7717f7d5b5019261a8c861854f4776/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8", size = 282602 }, + { url = "https://files.pythonhosted.org/packages/b6/61/56bad8cb94f0357c4bc134acc30822e90e203b5cb8ff82179947de90c17f/frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89", size = 44063 }, + { url = "https://files.pythonhosted.org/packages/3e/dc/96647994a013bc72f3d453abab18340b7f5e222b7b7291e3697ca1fcfbd5/frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5", size = 50452 }, + { url = "https://files.pythonhosted.org/packages/83/10/466fe96dae1bff622021ee687f68e5524d6392b0a2f80d05001cd3a451ba/frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", size = 11552 }, +] + +[[package]] +name = "identify" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/32/f4/8e8f7db397a7ce20fbdeac5f25adaf567fc362472432938d25556008e03a/identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", size = 99116 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/6c/a4f39abe7f19600b74528d0c717b52fff0b300bb0161081510d39c53cb00/identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0", size = 98962 }, +] + +[[package]] +name = "idna" +version = "3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/e349c5e6d4543326c6883ee9491e3921e0d07b55fdf3cce184b40d63e72a/idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603", size = 189467 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", size = 66894 }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, +] + +[[package]] +name = "isort" +version = "5.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/f9/c1eb8635a24e87ade2efce21e3ce8cd6b8630bb685ddc9cdaca1349b2eb5/isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", size = 175303 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", size = 92310 }, +] + +[[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 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, +] + +[[package]] +name = "multidict" +version = "6.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/79/722ca999a3a09a63b35aac12ec27dfa8e5bb3a38b0f857f7a1a209a88836/multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", size = 59867 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/9c/7fda9c0defa09538c97b1f195394be82a1f53238536f70b32eb5399dfd4e/multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e", size = 49575 }, + { url = "https://files.pythonhosted.org/packages/be/21/d6ca80dd1b9b2c5605ff7475699a8ff5dc6ea958cd71fb2ff234afc13d79/multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b", size = 29638 }, + { url = "https://files.pythonhosted.org/packages/9c/18/9565f32c19d186168731e859692dfbc0e98f66a1dcf9e14d69c02a78b75a/multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5", size = 29874 }, + { url = "https://files.pythonhosted.org/packages/4e/4e/3815190e73e6ef101b5681c174c541bf972a1b064e926e56eea78d06e858/multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450", size = 129914 }, + { url = "https://files.pythonhosted.org/packages/0c/08/bb47f886457e2259aefc10044e45c8a1b62f0c27228557e17775869d0341/multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496", size = 134589 }, + { url = "https://files.pythonhosted.org/packages/d5/2f/952f79b5f0795cf4e34852fc5cf4dfda6166f63c06c798361215b69c131d/multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a", size = 133259 }, + { url = "https://files.pythonhosted.org/packages/24/1f/af976383b0b772dd351210af5b60ff9927e3abb2f4a103e93da19a957da0/multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226", size = 130779 }, + { url = "https://files.pythonhosted.org/packages/fc/b1/b0a7744be00b0f5045c7ed4e4a6b8ee6bde4672b2c620474712299df5979/multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271", size = 120125 }, + { url = "https://files.pythonhosted.org/packages/d0/bf/2a1d667acf11231cdf0b97a6cd9f30e7a5cf847037b5cf6da44884284bd0/multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb", size = 167095 }, + { url = "https://files.pythonhosted.org/packages/5e/e8/ad6ee74b1a2050d3bc78f566dabcc14c8bf89cbe87eecec866c011479815/multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef", size = 155823 }, + { url = "https://files.pythonhosted.org/packages/45/7c/06926bb91752c52abca3edbfefac1ea90d9d1bc00c84d0658c137589b920/multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24", size = 170233 }, + { url = "https://files.pythonhosted.org/packages/3c/29/3dd36cf6b9c5abba8b97bba84eb499a168ba59c3faec8829327b3887d123/multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6", size = 169035 }, + { url = "https://files.pythonhosted.org/packages/60/47/9a0f43470c70bbf6e148311f78ef5a3d4996b0226b6d295bdd50fdcfe387/multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda", size = 166229 }, + { url = "https://files.pythonhosted.org/packages/1d/23/c1b7ae7a0b8a3e08225284ef3ecbcf014b292a3ee821bc4ed2185fd4ce7d/multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5", size = 25840 }, + { url = "https://files.pythonhosted.org/packages/4a/68/66fceb758ad7a88993940dbdf3ac59911ba9dc46d7798bf6c8652f89f853/multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556", size = 27905 }, + { url = "https://files.pythonhosted.org/packages/fa/a2/17e1e23c6be0a916219c5292f509360c345b5fa6beeb50d743203c27532c/multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", size = 9729 }, +] + +[[package]] +name = "mypy" +version = "1.11.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/86/5d7cbc4974fd564550b80fbb8103c05501ea11aa7835edf3351d90095896/mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79", size = 3078806 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/3a/ed7b12ecc3f6db2f664ccf85cb2e004d3e90bec928e9d7be6aa2f16b7cdf/mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318", size = 10990335 }, + { url = "https://files.pythonhosted.org/packages/04/e4/1a9051e2ef10296d206519f1df13d2cc896aea39e8683302f89bf5792a59/mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36", size = 10007119 }, + { url = "https://files.pythonhosted.org/packages/f3/3c/350a9da895f8a7e87ade0028b962be0252d152e0c2fbaafa6f0658b4d0d4/mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987", size = 12506856 }, + { url = "https://files.pythonhosted.org/packages/b6/49/ee5adf6a49ff13f4202d949544d3d08abb0ea1f3e7f2a6d5b4c10ba0360a/mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca", size = 12952066 }, + { url = "https://files.pythonhosted.org/packages/27/c0/b19d709a42b24004d720db37446a42abadf844d5c46a2c442e2a074d70d9/mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70", size = 9664000 }, + { url = "https://files.pythonhosted.org/packages/42/3a/bdf730640ac523229dd6578e8a581795720a9321399de494374afc437ec5/mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12", size = 2619625 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, +] + +[[package]] +name = "numpy" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/5f/9003bb3e632f2b58f5e3a3378902dcc73c5518070736c6740fe52454e8e1/numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", size = 18874860 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/11/c573ef66c004f991989c2c6218229d9003164525549409aec5ec9afc0285/numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", size = 20884403 }, + { url = "https://files.pythonhosted.org/packages/6b/6c/a9fbef5fd2f9685212af2a9e47485cde9357c3e303e079ccf85127516f2d/numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", size = 13493375 }, + { url = "https://files.pythonhosted.org/packages/34/f2/1316a6b08ad4c161d793abe81ff7181e9ae2e357a5b06352a383b9f8e800/numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", size = 5088823 }, + { url = "https://files.pythonhosted.org/packages/be/15/fabf78a6d4a10c250e87daf1cd901af05e71501380532ac508879cc46a7e/numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", size = 6619825 }, + { url = "https://files.pythonhosted.org/packages/9f/8a/76ddef3e621541ddd6984bc24d256a4e3422d036790cbbe449e6cad439ee/numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b", size = 13696705 }, + { url = "https://files.pythonhosted.org/packages/cb/22/2b840d297183916a95847c11f82ae11e248fa98113490b2357f774651e1d/numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", size = 16041649 }, + { url = "https://files.pythonhosted.org/packages/c7/e8/6f4825d8f576cfd5e4d6515b9eec22bd618868bdafc8a8c08b446dcb65f0/numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", size = 16409358 }, + { url = "https://files.pythonhosted.org/packages/bf/f8/5edf1105b0dc24fd66fc3e9e7f3bca3d920cde571caaa4375ec1566073c3/numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", size = 14172488 }, + { url = "https://files.pythonhosted.org/packages/f4/c2/dddca3e69a024d2f249a5b68698328163cbdafb7e65fbf6d36373bbabf12/numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", size = 6237195 }, + { url = "https://files.pythonhosted.org/packages/b7/98/5640a09daa3abf0caeaefa6e7bf0d10c0aa28a77c84e507d6a716e0e23df/numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", size = 12568082 }, + { url = "https://files.pythonhosted.org/packages/6b/9e/8bc6f133bc6d359ccc9ec051853aded45504d217685191f31f46d36b7065/numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", size = 20834810 }, + { url = "https://files.pythonhosted.org/packages/32/1b/429519a2fa28681814c511574017d35f3aab7136d554cc65f4c1526dfbf5/numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", size = 13507739 }, + { url = "https://files.pythonhosted.org/packages/25/18/c732d7dd9896d11e4afcd487ac65e62f9fa0495563b7614eb850765361fa/numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", size = 5074465 }, + { url = "https://files.pythonhosted.org/packages/3e/37/838b7ae9262c370ab25312bab365492016f11810ffc03ebebbd54670b669/numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", size = 6606418 }, + { url = "https://files.pythonhosted.org/packages/8b/b9/7ff3bfb71e316a5b43a124c4b7a5881ab12f3c32636014bef1f757f19dbd/numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", size = 13692464 }, + { url = "https://files.pythonhosted.org/packages/42/78/75bcf16e6737cd196ff7ecf0e1fd3f953293a34dff4fd93fb488e8308536/numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", size = 16037763 }, + { url = "https://files.pythonhosted.org/packages/23/99/36bf5ffe034d06df307bc783e25cf164775863166dcd878879559fe0379f/numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", size = 16410374 }, + { url = "https://files.pythonhosted.org/packages/7f/16/04c5dab564887d4cd31a9ed30e51467fa70d52a4425f5a9bd1eed5b3d34c/numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", size = 14169873 }, + { url = "https://files.pythonhosted.org/packages/09/e0/d1b5adbf1731886c4186c59a9fa208585df9452a43a2b60e79af7c649717/numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", size = 6234118 }, + { url = "https://files.pythonhosted.org/packages/d0/9c/2391ee6e9ebe77232ddcab29d92662b545e99d78c3eb3b4e26d59b9ca1ca/numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", size = 12561742 }, + { url = "https://files.pythonhosted.org/packages/38/0e/c4f754f9e73f9bb520e8bf418c646f2c4f70c5d5f2bc561e90f884593193/numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", size = 20858403 }, + { url = "https://files.pythonhosted.org/packages/32/fc/d69092b9171efa0cb8079577e71ce0cac0e08f917d33f6e99c916ed51d44/numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", size = 13519851 }, + { url = "https://files.pythonhosted.org/packages/14/2a/d7cf2cd9f15b23f623075546ea64a2c367cab703338ca22aaaecf7e704df/numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", size = 5115444 }, + { url = "https://files.pythonhosted.org/packages/8e/00/e87b2cb4afcecca3b678deefb8fa53005d7054f3b5c39596e5554e5d98f8/numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", size = 6628903 }, + { url = "https://files.pythonhosted.org/packages/ab/9d/337ae8721b3beec48c3413d71f2d44b2defbf3c6f7a85184fc18b7b61f4a/numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", size = 13665945 }, + { url = "https://files.pythonhosted.org/packages/c0/90/ee8668e84c5d5cc080ef3beb622c016adf19ca3aa51afe9dbdcc6a9baf59/numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", size = 16023473 }, + { url = "https://files.pythonhosted.org/packages/38/a0/57c24b2131879183051dc698fbb53fd43b77c3fa85b6e6311014f2bc2973/numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", size = 16400624 }, + { url = "https://files.pythonhosted.org/packages/bb/4c/14a41eb5c9548c6cee6af0936eabfd985c69230ffa2f2598321431a9aa0a/numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", size = 14155072 }, +] + +[[package]] +name = "packaging" +version = "24.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, +] + +[[package]] +name = "paho-mqtt" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/39/15/0a6214e76d4d32e7f663b109cf71fb22561c2be0f701d67f93950cd40542/paho_mqtt-2.1.0.tar.gz", hash = "sha256:12d6e7511d4137555a3f6ea167ae846af2c7357b10bc6fa4f7c3968fc1723834", size = 148848 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/cb/00451c3cf31790287768bb12c6bec834f5d292eaf3022afc88e14b8afc94/paho_mqtt-2.1.0-py3-none-any.whl", hash = "sha256:6db9ba9b34ed5bc6b6e3812718c7e06e2fd7444540df2455d2c51bd58808feee", size = 67219 }, +] + +[[package]] +name = "pillow" +version = "10.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350 }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980 }, + { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799 }, + { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973 }, + { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054 }, + { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484 }, + { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375 }, + { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773 }, + { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690 }, + { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951 }, + { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427 }, + { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685 }, + { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883 }, + { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837 }, + { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562 }, + { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761 }, + { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767 }, + { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989 }, + { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255 }, + { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603 }, + { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972 }, + { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375 }, +] + +[[package]] +name = "platformdirs" +version = "4.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", size = 20916 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", size = 18146 }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, +] + +[[package]] +name = "pre-commit" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/10/97ee2fa54dff1e9da9badbc5e35d0bbaef0776271ea5907eccf64140f72f/pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", size = 177815 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f", size = 204643 }, +] + +[[package]] +name = "pycountry" +version = "24.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/57/c389fa68c50590881a75b7883eeb3dc15e9e73a0fdc001cdd45c13290c92/pycountry-24.6.1.tar.gz", hash = "sha256:b61b3faccea67f87d10c1f2b0fc0be714409e8fcdcc1315613174f6466c10221", size = 6043910 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/ec/1fb891d8a2660716aadb2143235481d15ed1cbfe3ad669194690b0604492/pycountry-24.6.1-py3-none-any.whl", hash = "sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f", size = 6335189 }, +] + +[[package]] +name = "pylint" +version = "3.2.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill" }, + { name = "isort" }, + { name = "mccabe" }, + { name = "platformdirs" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/e8/d59ce8e54884c9475ed6510685ef4311a10001674c28703b23da30f3b24d/pylint-3.2.7.tar.gz", hash = "sha256:1b7a721b575eaeaa7d39db076b6e7743c993ea44f57979127c517c6c572c803e", size = 1511922 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/4d/c73bc0fca447b918611985c325cd7017fb762050eb9c6ac6fa7d9ac6fbe4/pylint-3.2.7-py3-none-any.whl", hash = "sha256:02f4aedeac91be69fb3b4bea997ce580a4ac68ce58b89eaefeaf06749df73f4b", size = 519906 }, +] + +[[package]] +name = "pytest" +version = "8.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/8c/9862305bdcd6020bc7b45b1b5e7397a6caf1a33d3025b9a003b39075ffb2/pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce", size = 1439314 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", size = 341802 }, +] + +[[package]] +name = "pytest-asyncio" +version = "0.24.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/6d/c6cf50ce320cf8611df7a1254d86233b3df7cc07f9b5f5cbcb82e08aa534/pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276", size = 49855 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b", size = 18024 }, +] + +[[package]] +name = "pytest-cov" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990 }, +] + +[[package]] +name = "pytest-docker-fixtures" +version = "1.3.19" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docker" }, + { name = "pytest" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/6e/cc5395a86f5ef3b71f5bcfcc35cfce734d6010bcc7ea57fcfa704ee94df5/pytest-docker-fixtures-1.3.19.tar.gz", hash = "sha256:016578a1b6a4dfc81e5a09286230cb56e323bdfe3f4dda20a1e7bc2c74492f4a", size = 10518 } + +[[package]] +name = "pytest-timeout" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148 }, +] + +[[package]] +name = "pywin32" +version = "306" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/91/17e016d5923e178346aabda3dfec6629d1a26efe587d19667542105cf0a6/pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b", size = 8507705 }, + { url = "https://files.pythonhosted.org/packages/83/1c/25b79fc3ec99b19b0a0730cc47356f7e2959863bf9f3cd314332bddb4f68/pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e", size = 9227429 }, + { url = "https://files.pythonhosted.org/packages/1c/43/e3444dc9a12f8365d9603c2145d16bf0a2f8180f343cf87be47f5579e547/pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040", size = 10388145 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "svg-py" +version = "1.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/73/1e24a357536ca4e0af3172d83d3d3ccaa821c87c5f69cbf4052b5a99c39a/svg_py-1.4.3.tar.gz", hash = "sha256:d03d87549fb12e1ddcf367420fc196703d725e50b81c44ec2388e0530fc8bab3", size = 40241 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/b2/d8a57401dd954103c14cecf442ecc143e3b8d10a7d822d9904f34b252ae7/svg_py-1.4.3-py3-none-any.whl", hash = "sha256:f76db56ff5439294b32e55f4151eb4b4fcad376dfbad70a989e29a5391994d76", size = 13482 }, +] + +[[package]] +name = "testfixtures" +version = "8.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/25/d7e9d05f87e2ab84657a0dfb1f24fc295d542ac2eb221531d976ea4aa1ff/testfixtures-8.3.0.tar.gz", hash = "sha256:d4c0b84af2f267610f908009b50d6f983a4e58ade22c67bab6787b5a402d59c0", size = 137420 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/4e/699671ba484b94bda0959b281ff59b24f728263befd13e060fa038ce3bc8/testfixtures-8.3.0-py3-none-any.whl", hash = "sha256:3d1e0e0005c4d6ac2a2ab27916704c6471047f0d2f78f2e54adf20abdacc7b10", size = 105085 }, +] + +[[package]] +name = "tomlkit" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, +] + +[[package]] +name = "types-cachetools" +version = "5.5.0.20240820" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/7e/ad6ba4a56b2a994e0f0a04a61a50466b60ee88a13d10a18c83ac14a66c61/types-cachetools-5.5.0.20240820.tar.gz", hash = "sha256:b888ab5c1a48116f7799cd5004b18474cd82b5463acb5ffb2db2fc9c7b053bc0", size = 4198 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/4d/fd7cc050e2d236d5570c4d92531c0396573a1e14b31735870e849351c717/types_cachetools-5.5.0.20240820-py3-none-any.whl", hash = "sha256:efb2ed8bf27a4b9d3ed70d33849f536362603a90b8090a328acf0cd42fda82e2", size = 4149 }, +] + +[[package]] +name = "types-mock" +version = "5.1.0.20240425" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/40/1ed5b983c97161ad1605de42932143bcb24f5e435cc660de4487f78f6a4c/types-mock-5.1.0.20240425.tar.gz", hash = "sha256:5281a645d72e827d70043e3cc144fe33b1c003db084f789dc203aa90e812a5a4", size = 6441 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/6d/7710612643616654ca0094234bce0f0448f4aa9d6f3057e4681143f73e73/types_mock-5.1.0.20240425-py3-none-any.whl", hash = "sha256:d586a01d39ad919d3ddcd73de6cde73ca7f3c69707219f722d1b8d7733641ad7", size = 5714 }, +] + +[[package]] +name = "types-pillow" +version = "10.2.0.20240822" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/4a/4495264dddaa600d65d68bcedb64dcccf9d9da61adff51f7d2ffd8e4c9ce/types-Pillow-10.2.0.20240822.tar.gz", hash = "sha256:559fb52a2ef991c326e4a0d20accb3bb63a7ba8d40eb493e0ecb0310ba52f0d3", size = 35389 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/23/e81a5354859831fcf54d488d33b80ba6133ea84f874a9c0ec40a4881e133/types_Pillow-10.2.0.20240822-py3-none-any.whl", hash = "sha256:d9dab025aba07aeb12fd50a6799d4eac52a9603488eca09d7662543983f16c5d", size = 54354 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "urllib3" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168", size = 292266 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", size = 121444 }, +] + +[[package]] +name = "virtualenv" +version = "20.26.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/60/db9f95e6ad456f1872486769c55628c7901fb4de5a72c2f7bdd912abf0c1/virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", size = 9057588 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/4d/410156100224c5e2f0011d435e477b57aed9576fc7fe137abcf14ec16e11/virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589", size = 5684792 }, +] + +[[package]] +name = "yarl" +version = "1.9.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/50/dcf6d0ea0da893b23f73ea5b21fa1f96fd45e9cb4404cc6b665368b4ab19/yarl-1.9.7.tar.gz", hash = "sha256:f28e602edeeec01fc96daf7728e8052bc2e12a672e2a138561a1ebaf30fd9df7", size = 153261 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/4e/b3d7679b158a981e6fa36c1d4388a7c3f4adb1b5c33ec22708ec550ddf91/yarl-1.9.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d8cf3d0b67996edc11957aece3fbce4c224d0451c7c3d6154ec3a35d0e55f6b", size = 188957 }, + { url = "https://files.pythonhosted.org/packages/0e/7b/2fe90636cf0f745210bcb79347369a3882e829e1070ab7d8b3949684d209/yarl-1.9.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a7748cd66fef49c877e59503e0cc76179caf1158d1080228e67e1db14554f08", size = 113292 }, + { url = "https://files.pythonhosted.org/packages/e2/ee/fae90e40bb4c2af6fd8a1a50d052140101a6634f1d2b32596a6cf53f4244/yarl-1.9.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a6fa3aeca8efabb0fbbb3b15e0956b0cb77f7d9db67c107503c30af07cd9e00", size = 110974 }, + { url = "https://files.pythonhosted.org/packages/28/60/3e985358440d6467c2ea81673000aef762c448462ab88e98e6676845f24f/yarl-1.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf37dd0008e5ac5c3880198976063c491b6a15b288d150d12833248cf2003acb", size = 504133 }, + { url = "https://files.pythonhosted.org/packages/e3/ae/f0730026d7011f5403a8f49fec4e666358db43a0339dc8259b19a7c2e6f1/yarl-1.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87aa5308482f248f8c3bd9311cd6c7dfd98ea1a8e57e35fb11e4adcac3066003", size = 521269 }, + { url = "https://files.pythonhosted.org/packages/24/5d/1b982866e45906f236cb9a93ec9a07a5b61854b34f0f6fa368056ee9cda3/yarl-1.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:867b13c1b361f9ba5d2f84dc5408082f5d744c83f66de45edc2b96793a9c5e48", size = 518617 }, + { url = "https://files.pythonhosted.org/packages/8c/ec/eaab7e272ddf1eab39b793e5cd3af304ac28d9342f6a3f2e356276bcc4fe/yarl-1.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ce93947554c2c85fe97fc4866646ec90840bc1162e4db349b37d692a811755", size = 510893 }, + { url = "https://files.pythonhosted.org/packages/98/c3/ed093752106c61e3b2a108f798649cb24119484802bb5ca521a36cf559bd/yarl-1.9.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcd3d94b848cba132f39a5b40d80b0847d001a91a6f35a2204505cdd46afe1b2", size = 487621 }, + { url = "https://files.pythonhosted.org/packages/71/ff/bce0bda27957d4f8cdb8e56b807f185683e8b6a3717637fb8d1faa39269d/yarl-1.9.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d06d6a8f98dd87646d98f0c468be14b201e47ec6092ad569adf835810ad0dffb", size = 506332 }, + { url = "https://files.pythonhosted.org/packages/ff/b5/95702c9719808331d2401e13660af86b323139f0293feb3a44698a194439/yarl-1.9.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:91567ff4fce73d2e7ac67ed5983ad26ba2343bc28cb22e1e1184a9677df98d7c", size = 505515 }, + { url = "https://files.pythonhosted.org/packages/17/7d/74a41e5d49329be134602a7e840adf3a499c7562afb982282d079067d5e4/yarl-1.9.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1d5594512541e63188fea640b7f066c218d2176203d6e6f82abf702ae3dca3b2", size = 528662 }, + { url = "https://files.pythonhosted.org/packages/c1/f9/8a9083b6b73944c0bb5c99cfc0edf3bec14456b621f76b338fc945afc69f/yarl-1.9.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c2743e43183e4afbb07d5605693299b8756baff0b086c25236c761feb0e3c56", size = 539801 }, + { url = "https://files.pythonhosted.org/packages/44/74/877076885263c214abbed93462ef2e4e95579c047d188530c849ea207846/yarl-1.9.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:daa69a3a2204355af39f4cfe7f3870d87c53d77a597b5100b97e3faa9460428b", size = 524783 }, + { url = "https://files.pythonhosted.org/packages/95/58/e509c4ad1460bce6cf5cd485c5baa5c4c6a9a53999a82f90462f7908ee26/yarl-1.9.7-cp312-cp312-win32.whl", hash = "sha256:36b16884336c15adf79a4bf1d592e0c1ffdb036a760e36a1361565b66785ec6c", size = 98822 }, + { url = "https://files.pythonhosted.org/packages/b0/71/c8136c8c240ccf9d38715aaad31fb4f2c2f14e83c6db6b83d389274b0e9e/yarl-1.9.7-cp312-cp312-win_amd64.whl", hash = "sha256:2ead2f87a1174963cc406d18ac93d731fbb190633d3995fa052d10cefae69ed8", size = 108657 }, + { url = "https://files.pythonhosted.org/packages/2b/3c/c159233854485307e3355af11099d9c351c8475b10b2b3dc64bb8cdc608b/yarl-1.9.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:808eddabcb6f7b2cdb6929b3e021ac824a2c07dc7bc83f7618e18438b1b65781", size = 185789 }, + { url = "https://files.pythonhosted.org/packages/89/f3/24c3b30a9d95827280130ecb6ef33f0ab2bdc690391f19178493cf149196/yarl-1.9.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:395ab0d8ce6d104a988da429bcbfd445e03fb4c911148dfd523f69d13f772e47", size = 111661 }, + { url = "https://files.pythonhosted.org/packages/5c/a1/e610bfb3c74efdbeeff19ee370e6a76dd552c66680a9180777828dc2e7fa/yarl-1.9.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:49827dfccbd59c4499605c13805e947349295466e490860a855b7c7e82ec9c75", size = 109560 }, + { url = "https://files.pythonhosted.org/packages/d0/aa/dc3657bcf79cd98bdfa03c1b85c88de2a36037171894fa56890146e08615/yarl-1.9.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b8bbdd425d0978311520ea99fb6c0e9e04e64aee84fac05f3157ace9f81b05", size = 485985 }, + { url = "https://files.pythonhosted.org/packages/cf/2a/a69ad3ae4facef03df228790e6f4cfd4971cc267ee140fc8f6331c7e6194/yarl-1.9.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71d33fd1c219b5b28ee98cd76da0c9398a4ed4792fd75c94135237db05ba5ca8", size = 501335 }, + { url = "https://files.pythonhosted.org/packages/f5/8f/b0a35ecd3f31fdffa704d11bf452a277ce4b29e7b878a94e636349945d87/yarl-1.9.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62440431741d0b7d410e5cbad800885e3289048140a43390ecab4f0b96dde3bb", size = 502295 }, + { url = "https://files.pythonhosted.org/packages/39/68/bfc953df3a6ee6c0c9cd9f84d488681e377e49b8ced6d2d5b9289d639c89/yarl-1.9.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db97210433366dfba55590e48285b89ad0146c52bf248dd0da492dd9f0f72cf", size = 493550 }, + { url = "https://files.pythonhosted.org/packages/40/5d/5092b93da54659f1e737f95d9a554f79aa68d1fda05e26c9f0e86184d894/yarl-1.9.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653597b615809f2e5f4dba6cd805608b6fd3597128361a22cc612cf7c7a4d1bf", size = 470835 }, + { url = "https://files.pythonhosted.org/packages/66/e6/dedce99c469f8d1c66432006910adf943fdb7d0cfb77f026030e234f234f/yarl-1.9.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df47612129e66f7ce7c9994d4cd4e6852f6e3bf97699375d86991481796eeec8", size = 490437 }, + { url = "https://files.pythonhosted.org/packages/50/52/b36cd8d9356734fda4a668ce358f56ecb16c7171b8a658fdfde31476de7c/yarl-1.9.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5e338b6febbae6c9fe86924bac3ea9c1944e33255c249543cd82a4af6df6047b", size = 492765 }, + { url = "https://files.pythonhosted.org/packages/aa/9e/6ad4300fc040fc34e323f1254a05886a6441d05bd251a9a4063ed8d35c32/yarl-1.9.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e649d37d04665dddb90994bbf0034331b6c14144cc6f3fbce400dc5f28dc05b7", size = 508901 }, + { url = "https://files.pythonhosted.org/packages/77/cc/8b27ea0a0faaba43b389c3a170c25a1fc063c34ae41c8660055e47d5dc89/yarl-1.9.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0a1b8fd849567be56342e988e72c9d28bd3c77b9296c38b9b42d2fe4813c9d3f", size = 519676 }, + { url = "https://files.pythonhosted.org/packages/ca/e6/1b88c9b952c69b4bfb5d38260de4bf65eab4d0787bfcdc0a4d680e084ccb/yarl-1.9.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f9d715b2175dff9a49c6dafdc2ab3f04850ba2f3d4a77f69a5a1786b057a9d45", size = 510005 }, + { url = "https://files.pythonhosted.org/packages/72/81/c456d5060bf4c2cb1213cd71e9211e0859ce6fff444bd13c61e2ae681b64/yarl-1.9.7-cp313-cp313-win32.whl", hash = "sha256:bc9233638b07c2e4a3a14bef70f53983389bffa9e8cb90a2da3f67ac9c5e1842", size = 483263 }, + { url = "https://files.pythonhosted.org/packages/5d/08/fe455390603d0377140c1ef02287dd32d3d4a0a6d596aa4a1fc881ac68d2/yarl-1.9.7-cp313-cp313-win_amd64.whl", hash = "sha256:62e110772330d7116f91e79cd83fef92545cb2f36414c95881477aa01971f75f", size = 491236 }, + { url = "https://files.pythonhosted.org/packages/48/04/8cc40203453e4bce05cd3e9a5bea930ac0086aa4848a9c41aa1da13ae1a0/yarl-1.9.7-py3-none-any.whl", hash = "sha256:49935cc51d272264358962d050d726c3e5603a616f53e52ea88e9df1728aa2ee", size = 35402 }, +] From cf4ebf7c645bcd5420136d1f3371060611282b86 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 3 Sep 2024 20:32:53 +0200 Subject: [PATCH 003/138] Fix release workflow (#565) --- pyproject.toml | 1 + uv.lock | 27 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8ca5fdeb..d1464754 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -178,6 +178,7 @@ overgeneral-exceptions = [ [tool.uv] dev-dependencies = [ + "build>=1.2.1", "mypy==1.11.2", "pre-commit==3.8.0", "pycountry==24.6.1", diff --git a/uv.lock b/uv.lock index a1ba79a5..185c01ea 100644 --- a/uv.lock +++ b/uv.lock @@ -98,6 +98,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, ] +[[package]] +name = "build" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/9e/2d725d2f7729c6e79ca62aeb926492abbc06e25910dd30139d60a68bcb19/build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d", size = 44781 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", size = 21911 }, +] + [[package]] name = "cachetools" version = "5.5.0" @@ -198,7 +212,7 @@ wheels = [ [[package]] name = "deebot-client" -version = "8.3.1.dev8+g17b853f.d20240903" +version = "8.4.0b1.dev0+gd39166e.d20240903" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -212,6 +226,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "build" }, { name = "mypy" }, { name = "pre-commit" }, { name = "pycountry" }, @@ -240,6 +255,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "build", specifier = ">=1.2.1" }, { name = "mypy", specifier = "==1.11.2" }, { name = "pre-commit", specifier = "==3.8.0" }, { name = "pycountry", specifier = "==24.6.1" }, @@ -579,6 +595,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/4d/c73bc0fca447b918611985c325cd7017fb762050eb9c6ac6fa7d9ac6fbe4/pylint-3.2.7-py3-none-any.whl", hash = "sha256:02f4aedeac91be69fb3b4bea997ce580a4ac68ce58b89eaefeaf06749df73f4b", size = 519906 }, ] +[[package]] +name = "pyproject-hooks" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/07/6f63dda440d4abb191b91dc383b472dae3dd9f37e4c1e4a5c3db150531c6/pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965", size = 7838 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2", size = 9184 }, +] + [[package]] name = "pytest" version = "8.3.2" From 13ef2966a84e2729630aca1c48e49a9811a7ebbb Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 3 Sep 2024 18:35:04 +0000 Subject: [PATCH 004/138] Fix --- .github/workflows/python-publish.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index e4632e91..237d5daa 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -41,10 +41,12 @@ jobs: uv-${{ runner.os }} - name: Install the project - run: uv sync --locked + run: uv sync --dev --locked - name: 📦 Build package - run: python -m build + run: | + . .venv/bin/activate + python -m build - name: 📤 Publish package uses: pypa/gh-action-pypi-publish@release/v1 From 14eb03b5ae8c10a853dc0ad6029c1ed309dd8201 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 3 Sep 2024 23:24:39 +0200 Subject: [PATCH 005/138] Replace dependabot with renovate and clean up missed files (#566) --- .devcontainer.json | 2 ++ .github/dependabot.yml | 17 ----------------- .github/renovate.json | 27 +++++++++++++++++++++++++++ requirements-dev.txt | 2 -- requirements-test.txt | 13 ------------- requirements.txt | 7 ------- 6 files changed, 29 insertions(+), 39 deletions(-) delete mode 100644 .github/dependabot.yml create mode 100644 .github/renovate.json delete mode 100644 requirements-dev.txt delete mode 100644 requirements-test.txt delete mode 100644 requirements.txt diff --git a/.devcontainer.json b/.devcontainer.json index b2f955d2..c2c30044 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -28,7 +28,9 @@ "files.trimTrailingWhitespace": true, "python.analysis.autoImportCompletions": true, "python.analysis.typeCheckingMode": "basic", + "python.defaultInterpreterPath": "/workspaces/client.py/.venv/bin/python", "python.languageServer": "Pylance", + "python.pythonPath": "/workspaces/client.py/.venv/bin/python", "python.testing.pytestEnabled": true, "python.testing.unittestEnabled": false, "terminal.integrated.defaultProfile.linux": "zsh", diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 6de98910..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: 2 -updates: - # Maintain dependencies for GitHub Actions - - package-ecosystem: "github-actions" - directory: "/" - labels: - - "pr: dependency-update" - schedule: - interval: "daily" - - # Maintain dependencies for pip - - package-ecosystem: "pip" - directory: "/" - labels: - - "pr: dependency-update" - schedule: - interval: "daily" diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 00000000..84485db0 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "commitMessagePrefix": "⬆️", + "configMigration": true, + "dependencyDashboard": true, + "labels": ["dependencies", "no-stale"], + "lockFileMaintenance": { + "enabled": true + }, + "packageRules": [ + { + "addLabels": ["python"], + "matchManagers": ["pep621"] + }, + { + "matchDepTypes": ["dev"], + "matchManagers": ["pep621"], + "rangeStrategy": "pin" + }, + { + "addLabels": ["github_actions"], + "matchManagers": ["github-actions"], + "rangeStrategy": "pin" + } + ], + "rebaseWhen": "behind-base-branch" +} diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 3062f9bc..00000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,2 +0,0 @@ --r requirements.txt --r requirements-test.txt diff --git a/requirements-test.txt b/requirements-test.txt deleted file mode 100644 index 482e9cde..00000000 --- a/requirements-test.txt +++ /dev/null @@ -1,13 +0,0 @@ -mypy==1.11.2 -pre-commit==3.8.0 -pycountry==24.6.1 -pylint==3.2.7 -pytest==8.3.2 -pytest-asyncio==0.24.0 -pytest-cov==5.0.0 -pytest-docker-fixtures==1.3.19 -pytest-timeout==2.3.1 -testfixtures==8.3.0 -types-cachetools -types-mock -types-Pillow diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 26177a54..00000000 --- a/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -aiohttp~=3.10 -aiomqtt>=2.0.0,<3.0 -cachetools>=5.0.0,<6.0 -defusedxml -numpy>=1.23.2,<3.0 -Pillow>=10.0.1,<11.0 -svg.py>=1.4.2 From d96d0833802b4cfa63bfe37d71887515cbaa6331 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 20:17:08 +0200 Subject: [PATCH 006/138] [pre-commit.ci] pre-commit autoupdate (#569) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f368d10f..8b7b8f03 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.3 + rev: v0.6.4 hooks: - id: ruff args: From c21fbd21d165eb1dc74c79c96d57254649a7569c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 21:09:54 +0200 Subject: [PATCH 007/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pytest=20to=20v8.3.3=20(#570)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d1464754..b0ac3b7a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -187,7 +187,7 @@ dev-dependencies = [ "pytest-cov==5.0.0", "pytest-docker-fixtures==1.3.19", "pytest-timeout==2.3.1", - "pytest==8.3.2", + "pytest==8.3.3", "testfixtures==8.3.0", "types-cachetools>=5.5.0.20240820", "types-mock>=5.1.0.20240425", diff --git a/uv.lock b/uv.lock index 185c01ea..c6f6fccb 100644 --- a/uv.lock +++ b/uv.lock @@ -212,7 +212,7 @@ wheels = [ [[package]] name = "deebot-client" -version = "8.4.0b1.dev0+gd39166e.d20240903" +version = "8.4.1.dev1+gd96d083.d20240910" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -260,7 +260,7 @@ dev = [ { name = "pre-commit", specifier = "==3.8.0" }, { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.2.7" }, - { name = "pytest", specifier = "==8.3.2" }, + { name = "pytest", specifier = "==8.3.3" }, { name = "pytest-asyncio", specifier = "==0.24.0" }, { name = "pytest-cov", specifier = "==5.0.0" }, { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, @@ -606,7 +606,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -614,9 +614,9 @@ dependencies = [ { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/8c/9862305bdcd6020bc7b45b1b5e7397a6caf1a33d3025b9a003b39075ffb2/pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce", size = 1439314 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", size = 341802 }, + { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 }, ] [[package]] From e769b7cd3a7a16e2f455b76aec853a4683299996 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 10 Sep 2024 21:35:33 +0200 Subject: [PATCH 008/138] Use uv build (#571) --- .github/workflows/ci.yml | 19 +++++++++------ .github/workflows/python-publish.yml | 25 +++++++++++++------- pyproject.toml | 35 ++++++++++++++-------------- uv.lock | 27 +-------------------- 4 files changed, 47 insertions(+), 59 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 948d82fb..31796b8a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,15 +15,18 @@ jobs: runs-on: "ubuntu-latest" name: Check code quality steps: - - uses: actions/checkout@v4 - - name: Set up uv - # Install latest uv version using the installer - run: curl -LsSf https://astral.sh/uv/install.sh | sh - - name: "Set up Python" + - name: ⤵️ Checkout repository + uses: actions/checkout@v4 + + - name: 🏗 Install uv + uses: astral-sh/setup-uv@v2 + + - name: 🏗 Set up Python uses: actions/setup-python@v5 with: python-version-file: ".python-version" - - name: Restore uv cache + + - name: 🏗 Restore uv cache uses: actions/cache@v4 with: path: /tmp/.uv-cache @@ -31,8 +34,10 @@ jobs: restore-keys: | uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} uv-${{ runner.os }} - - name: Install the project + + - name: 🏗 Install the project run: uv sync --locked --dev + # Following steps cannot run by pre-commit.ci as repo = local - name: Run mypy run: uv run mypy deebot_client/ diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 237d5daa..ca87145f 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -19,19 +19,19 @@ jobs: permissions: id-token: write steps: - - name: 📥 Checkout the repository + - name: ⤵️ Checkout repository uses: actions/checkout@v4 - - name: Set up uv + - name: 🏗 Install uv # Install latest uv version using the installer run: curl -LsSf https://astral.sh/uv/install.sh | sh - - name: "Set up Python" + - name: 🏗 Set up Python uses: actions/setup-python@v5 with: python-version-file: ".python-version" - - name: Restore uv cache + - name: 🏗 Restore uv cache uses: actions/cache@v4 with: path: /tmp/.uv-cache @@ -40,13 +40,20 @@ jobs: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} uv-${{ runner.os }} - - name: Install the project + - name: 🏗 Install the project run: uv sync --dev --locked - name: 📦 Build package - run: | - . .venv/bin/activate - python -m build + run: uv build - - name: 📤 Publish package + - name: 🚀 Publish package uses: pypa/gh-action-pypi-publish@release/v1 + with: + verbose: true + print-hash: true + + - name: ✍️ Sign published artifacts + uses: sigstore/gh-action-sigstore-python@v3.0.0 + with: + inputs: ./dist/*.tar.gz ./dist/*.whl + release-signing-artifacts: true diff --git a/pyproject.toml b/pyproject.toml index b0ac3b7a..bb360817 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,24 @@ dynamic = ["version"] "Source Code" = "https://github.com/DeebotUniverse/client.py" "Bug Reports" = "https://github.com/DeebotUniverse/client.py/issues" +[tool.uv] +dev-dependencies = [ + "mypy==1.11.2", + "pre-commit==3.8.0", + "pycountry==24.6.1", + "pylint==3.2.7", + "pytest-asyncio==0.24.0", + "pytest-cov==5.0.0", + "pytest-docker-fixtures==1.3.19", + "pytest-timeout==2.3.1", + "pytest==8.3.3", + "testfixtures==8.3.0", + "types-cachetools>=5.5.0.20240820", + "types-mock>=5.1.0.20240425", + "types-pillow>=10.2.0.20240822", +] + + [tool.hatch.build.targets.sdist] include = [ "/deebot_client", @@ -176,20 +194,3 @@ overgeneral-exceptions = [ "builtins.Exception", ] -[tool.uv] -dev-dependencies = [ - "build>=1.2.1", - "mypy==1.11.2", - "pre-commit==3.8.0", - "pycountry==24.6.1", - "pylint==3.2.7", - "pytest-asyncio==0.24.0", - "pytest-cov==5.0.0", - "pytest-docker-fixtures==1.3.19", - "pytest-timeout==2.3.1", - "pytest==8.3.3", - "testfixtures==8.3.0", - "types-cachetools>=5.5.0.20240820", - "types-mock>=5.1.0.20240425", - "types-pillow>=10.2.0.20240822", -] diff --git a/uv.lock b/uv.lock index c6f6fccb..d2462df5 100644 --- a/uv.lock +++ b/uv.lock @@ -98,20 +98,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, ] -[[package]] -name = "build" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "os_name == 'nt'" }, - { name = "packaging" }, - { name = "pyproject-hooks" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ce/9e/2d725d2f7729c6e79ca62aeb926492abbc06e25910dd30139d60a68bcb19/build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d", size = 44781 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", size = 21911 }, -] - [[package]] name = "cachetools" version = "5.5.0" @@ -212,7 +198,7 @@ wheels = [ [[package]] name = "deebot-client" -version = "8.4.1.dev1+gd96d083.d20240910" +version = "8.4.1.dev4+g53da871.d20240910" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -226,7 +212,6 @@ dependencies = [ [package.dev-dependencies] dev = [ - { name = "build" }, { name = "mypy" }, { name = "pre-commit" }, { name = "pycountry" }, @@ -255,7 +240,6 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "build", specifier = ">=1.2.1" }, { name = "mypy", specifier = "==1.11.2" }, { name = "pre-commit", specifier = "==3.8.0" }, { name = "pycountry", specifier = "==24.6.1" }, @@ -595,15 +579,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/4d/c73bc0fca447b918611985c325cd7017fb762050eb9c6ac6fa7d9ac6fbe4/pylint-3.2.7-py3-none-any.whl", hash = "sha256:02f4aedeac91be69fb3b4bea997ce580a4ac68ce58b89eaefeaf06749df73f4b", size = 519906 }, ] -[[package]] -name = "pyproject-hooks" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/07/6f63dda440d4abb191b91dc383b472dae3dd9f37e4c1e4a5c3db150531c6/pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965", size = 7838 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2", size = 9184 }, -] - [[package]] name = "pytest" version = "8.3.3" From b3c3d1d06797e186053d9a73de46f51c7f18b3da Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 10 Sep 2024 21:59:14 +0200 Subject: [PATCH 009/138] Optimize github actions (#572) --- .github/workflows/ci.yml | 55 ++++++++++++---------------- .github/workflows/python-publish.yml | 19 ++++------ 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31796b8a..c2bcefb6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,33 +20,28 @@ jobs: - name: 🏗 Install uv uses: astral-sh/setup-uv@v2 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + cache-local-path: ${{ env.UV_CACHE_DIR }} - name: 🏗 Set up Python uses: actions/setup-python@v5 with: python-version-file: ".python-version" - - name: 🏗 Restore uv cache - uses: actions/cache@v4 - with: - path: /tmp/.uv-cache - key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} - restore-keys: | - uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} - uv-${{ runner.os }} - - name: 🏗 Install the project run: uv sync --locked --dev # Following steps cannot run by pre-commit.ci as repo = local - name: Run mypy - run: uv run mypy deebot_client/ + run: uv run --frozen mypy deebot_client/ + - name: Pylint review - run: uv run pylint deebot_client/ + run: uv run --frozen pylint deebot_client/ + - name: Verify no getLogger usages run: scripts/check_getLogger.sh - - name: Minimize uv cache - run: uv cache prune --ci tests: runs-on: "ubuntu-latest" @@ -56,29 +51,27 @@ jobs: python-version: - "3.12" steps: - - uses: "actions/checkout@v4" - - name: Set up uv - # Install latest uv version using the installer - run: curl -LsSf https://astral.sh/uv/install.sh | sh - - name: Set up Python ${{ matrix.python-version }} - run: uv python install ${{ matrix.python-version }} - - name: Restore uv cache - uses: actions/cache@v4 + - name: ⤵️ Checkout repository + uses: actions/checkout@v4 + + - name: 🏗 Install uv + uses: astral-sh/setup-uv@v2 with: - path: /tmp/.uv-cache - key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }}-${{ matrix.python-version }} - restore-keys: | - uv-${{ runner.os }}-${{ hashFiles('uv.lock') }}-${{ matrix.python-version }} - uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} - uv-${{ runner.os }} - - name: Install the project + enable-cache: true + cache-dependency-glob: "uv.lock" + cache-local-path: ${{ env.UV_CACHE_DIR }} + + - name: 🏗 Set up Python ${{ matrix.python-version }} + run: uv python install ${{ matrix.python-version }} + + - name: 🏗 Install the project run: uv sync --locked --dev + - name: Run pytest - run: uv run pytest tests --cov=./ --cov-report=xml + run: uv run --frozen pytest tests --cov=./ --cov-report=xml + - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index ca87145f..56e1d7ef 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -12,6 +12,9 @@ on: release: types: [published] +env: + UV_CACHE_DIR: /tmp/.uv-cache + jobs: deploy: runs-on: ubuntu-latest @@ -23,23 +26,17 @@ jobs: uses: actions/checkout@v4 - name: 🏗 Install uv - # Install latest uv version using the installer - run: curl -LsSf https://astral.sh/uv/install.sh | sh + uses: astral-sh/setup-uv@v2 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + cache-local-path: ${{ env.UV_CACHE_DIR }} - name: 🏗 Set up Python uses: actions/setup-python@v5 with: python-version-file: ".python-version" - - name: 🏗 Restore uv cache - uses: actions/cache@v4 - with: - path: /tmp/.uv-cache - key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} - restore-keys: | - uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} - uv-${{ runner.os }} - - name: 🏗 Install the project run: uv sync --dev --locked From 794528285818fdeaa796518e23f67399821f3988 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 22:07:28 +0200 Subject: [PATCH 010/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#568)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 143 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 79 insertions(+), 64 deletions(-) diff --git a/uv.lock b/uv.lock index d2462df5..5bbdc925 100644 --- a/uv.lock +++ b/uv.lock @@ -198,7 +198,7 @@ wheels = [ [[package]] name = "deebot-client" -version = "8.4.1.dev4+g53da871.d20240910" +version = "8.4.1.dev4+gb3c3d1d" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -298,11 +298,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/dd/49e06f09b6645156550fb9aee9cc1e59aba7efbc972d665a1bd6ae0435d4/filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", size = 18007 } +sdist = { url = "https://files.pythonhosted.org/packages/e6/76/3981447fd369539aba35797db99a8e2ff7ed01d9aa63e9344a31658b8d81/filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec", size = 18008 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7", size = 16159 }, + { url = "https://files.pythonhosted.org/packages/2f/95/f9310f35376024e1086c59cbb438d319fc9a4ef853289ce7c661539edbd4/filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609", size = 16170 }, ] [[package]] @@ -376,26 +376,41 @@ wheels = [ [[package]] name = "multidict" -version = "6.0.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/79/722ca999a3a09a63b35aac12ec27dfa8e5bb3a38b0f857f7a1a209a88836/multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", size = 59867 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/9c/7fda9c0defa09538c97b1f195394be82a1f53238536f70b32eb5399dfd4e/multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e", size = 49575 }, - { url = "https://files.pythonhosted.org/packages/be/21/d6ca80dd1b9b2c5605ff7475699a8ff5dc6ea958cd71fb2ff234afc13d79/multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b", size = 29638 }, - { url = "https://files.pythonhosted.org/packages/9c/18/9565f32c19d186168731e859692dfbc0e98f66a1dcf9e14d69c02a78b75a/multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5", size = 29874 }, - { url = "https://files.pythonhosted.org/packages/4e/4e/3815190e73e6ef101b5681c174c541bf972a1b064e926e56eea78d06e858/multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450", size = 129914 }, - { url = "https://files.pythonhosted.org/packages/0c/08/bb47f886457e2259aefc10044e45c8a1b62f0c27228557e17775869d0341/multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496", size = 134589 }, - { url = "https://files.pythonhosted.org/packages/d5/2f/952f79b5f0795cf4e34852fc5cf4dfda6166f63c06c798361215b69c131d/multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a", size = 133259 }, - { url = "https://files.pythonhosted.org/packages/24/1f/af976383b0b772dd351210af5b60ff9927e3abb2f4a103e93da19a957da0/multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226", size = 130779 }, - { url = "https://files.pythonhosted.org/packages/fc/b1/b0a7744be00b0f5045c7ed4e4a6b8ee6bde4672b2c620474712299df5979/multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271", size = 120125 }, - { url = "https://files.pythonhosted.org/packages/d0/bf/2a1d667acf11231cdf0b97a6cd9f30e7a5cf847037b5cf6da44884284bd0/multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb", size = 167095 }, - { url = "https://files.pythonhosted.org/packages/5e/e8/ad6ee74b1a2050d3bc78f566dabcc14c8bf89cbe87eecec866c011479815/multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef", size = 155823 }, - { url = "https://files.pythonhosted.org/packages/45/7c/06926bb91752c52abca3edbfefac1ea90d9d1bc00c84d0658c137589b920/multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24", size = 170233 }, - { url = "https://files.pythonhosted.org/packages/3c/29/3dd36cf6b9c5abba8b97bba84eb499a168ba59c3faec8829327b3887d123/multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6", size = 169035 }, - { url = "https://files.pythonhosted.org/packages/60/47/9a0f43470c70bbf6e148311f78ef5a3d4996b0226b6d295bdd50fdcfe387/multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda", size = 166229 }, - { url = "https://files.pythonhosted.org/packages/1d/23/c1b7ae7a0b8a3e08225284ef3ecbcf014b292a3ee821bc4ed2185fd4ce7d/multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5", size = 25840 }, - { url = "https://files.pythonhosted.org/packages/4a/68/66fceb758ad7a88993940dbdf3ac59911ba9dc46d7798bf6c8652f89f853/multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556", size = 27905 }, - { url = "https://files.pythonhosted.org/packages/fa/a2/17e1e23c6be0a916219c5292f509360c345b5fa6beeb50d743203c27532c/multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", size = 9729 }, +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, + { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, + { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, + { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, + { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, + { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, + { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, + { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, + { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, + { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, + { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, + { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, + { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, + { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, + { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, + { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, + { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, + { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, + { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, + { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, + { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, + { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, + { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, + { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, + { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, + { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, + { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, + { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, + { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, + { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, ] [[package]] @@ -520,11 +535,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", size = 20916 } +sdist = { url = "https://files.pythonhosted.org/packages/75/a0/d7cab8409cdc7d39b037c85ac46d92434fb6595432e069251b38e5c8dd0e/platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c", size = 21276 } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", size = 18146 }, + { url = "https://files.pythonhosted.org/packages/da/8b/d497999c4017b80678017ddce745cf675489c110681ad3c84a55eddfd3e7/platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617", size = 18417 }, ] [[package]] @@ -767,57 +782,57 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.26.3" +version = "20.26.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/60/db9f95e6ad456f1872486769c55628c7901fb4de5a72c2f7bdd912abf0c1/virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", size = 9057588 } +sdist = { url = "https://files.pythonhosted.org/packages/84/8a/134f65c3d6066153b84fc176c58877acd8165ed0b79a149ff50502597284/virtualenv-20.26.4.tar.gz", hash = "sha256:c17f4e0f3e6036e9f26700446f85c76ab11df65ff6d8a9cbfad9f71aabfcf23c", size = 9385017 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/4d/410156100224c5e2f0011d435e477b57aed9576fc7fe137abcf14ec16e11/virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589", size = 5684792 }, + { url = "https://files.pythonhosted.org/packages/5d/ea/12f774a18b55754c730c8383dad8f10d7b87397d1cb6b2b944c87381bb3b/virtualenv-20.26.4-py3-none-any.whl", hash = "sha256:48f2695d9809277003f30776d155615ffc11328e6a0a8c1f0ec80188d7874a55", size = 6013327 }, ] [[package]] name = "yarl" -version = "1.9.7" +version = "1.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/50/dcf6d0ea0da893b23f73ea5b21fa1f96fd45e9cb4404cc6b665368b4ab19/yarl-1.9.7.tar.gz", hash = "sha256:f28e602edeeec01fc96daf7728e8052bc2e12a672e2a138561a1ebaf30fd9df7", size = 153261 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/4e/b3d7679b158a981e6fa36c1d4388a7c3f4adb1b5c33ec22708ec550ddf91/yarl-1.9.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d8cf3d0b67996edc11957aece3fbce4c224d0451c7c3d6154ec3a35d0e55f6b", size = 188957 }, - { url = "https://files.pythonhosted.org/packages/0e/7b/2fe90636cf0f745210bcb79347369a3882e829e1070ab7d8b3949684d209/yarl-1.9.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a7748cd66fef49c877e59503e0cc76179caf1158d1080228e67e1db14554f08", size = 113292 }, - { url = "https://files.pythonhosted.org/packages/e2/ee/fae90e40bb4c2af6fd8a1a50d052140101a6634f1d2b32596a6cf53f4244/yarl-1.9.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a6fa3aeca8efabb0fbbb3b15e0956b0cb77f7d9db67c107503c30af07cd9e00", size = 110974 }, - { url = "https://files.pythonhosted.org/packages/28/60/3e985358440d6467c2ea81673000aef762c448462ab88e98e6676845f24f/yarl-1.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf37dd0008e5ac5c3880198976063c491b6a15b288d150d12833248cf2003acb", size = 504133 }, - { url = "https://files.pythonhosted.org/packages/e3/ae/f0730026d7011f5403a8f49fec4e666358db43a0339dc8259b19a7c2e6f1/yarl-1.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87aa5308482f248f8c3bd9311cd6c7dfd98ea1a8e57e35fb11e4adcac3066003", size = 521269 }, - { url = "https://files.pythonhosted.org/packages/24/5d/1b982866e45906f236cb9a93ec9a07a5b61854b34f0f6fa368056ee9cda3/yarl-1.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:867b13c1b361f9ba5d2f84dc5408082f5d744c83f66de45edc2b96793a9c5e48", size = 518617 }, - { url = "https://files.pythonhosted.org/packages/8c/ec/eaab7e272ddf1eab39b793e5cd3af304ac28d9342f6a3f2e356276bcc4fe/yarl-1.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ce93947554c2c85fe97fc4866646ec90840bc1162e4db349b37d692a811755", size = 510893 }, - { url = "https://files.pythonhosted.org/packages/98/c3/ed093752106c61e3b2a108f798649cb24119484802bb5ca521a36cf559bd/yarl-1.9.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcd3d94b848cba132f39a5b40d80b0847d001a91a6f35a2204505cdd46afe1b2", size = 487621 }, - { url = "https://files.pythonhosted.org/packages/71/ff/bce0bda27957d4f8cdb8e56b807f185683e8b6a3717637fb8d1faa39269d/yarl-1.9.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d06d6a8f98dd87646d98f0c468be14b201e47ec6092ad569adf835810ad0dffb", size = 506332 }, - { url = "https://files.pythonhosted.org/packages/ff/b5/95702c9719808331d2401e13660af86b323139f0293feb3a44698a194439/yarl-1.9.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:91567ff4fce73d2e7ac67ed5983ad26ba2343bc28cb22e1e1184a9677df98d7c", size = 505515 }, - { url = "https://files.pythonhosted.org/packages/17/7d/74a41e5d49329be134602a7e840adf3a499c7562afb982282d079067d5e4/yarl-1.9.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1d5594512541e63188fea640b7f066c218d2176203d6e6f82abf702ae3dca3b2", size = 528662 }, - { url = "https://files.pythonhosted.org/packages/c1/f9/8a9083b6b73944c0bb5c99cfc0edf3bec14456b621f76b338fc945afc69f/yarl-1.9.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c2743e43183e4afbb07d5605693299b8756baff0b086c25236c761feb0e3c56", size = 539801 }, - { url = "https://files.pythonhosted.org/packages/44/74/877076885263c214abbed93462ef2e4e95579c047d188530c849ea207846/yarl-1.9.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:daa69a3a2204355af39f4cfe7f3870d87c53d77a597b5100b97e3faa9460428b", size = 524783 }, - { url = "https://files.pythonhosted.org/packages/95/58/e509c4ad1460bce6cf5cd485c5baa5c4c6a9a53999a82f90462f7908ee26/yarl-1.9.7-cp312-cp312-win32.whl", hash = "sha256:36b16884336c15adf79a4bf1d592e0c1ffdb036a760e36a1361565b66785ec6c", size = 98822 }, - { url = "https://files.pythonhosted.org/packages/b0/71/c8136c8c240ccf9d38715aaad31fb4f2c2f14e83c6db6b83d389274b0e9e/yarl-1.9.7-cp312-cp312-win_amd64.whl", hash = "sha256:2ead2f87a1174963cc406d18ac93d731fbb190633d3995fa052d10cefae69ed8", size = 108657 }, - { url = "https://files.pythonhosted.org/packages/2b/3c/c159233854485307e3355af11099d9c351c8475b10b2b3dc64bb8cdc608b/yarl-1.9.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:808eddabcb6f7b2cdb6929b3e021ac824a2c07dc7bc83f7618e18438b1b65781", size = 185789 }, - { url = "https://files.pythonhosted.org/packages/89/f3/24c3b30a9d95827280130ecb6ef33f0ab2bdc690391f19178493cf149196/yarl-1.9.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:395ab0d8ce6d104a988da429bcbfd445e03fb4c911148dfd523f69d13f772e47", size = 111661 }, - { url = "https://files.pythonhosted.org/packages/5c/a1/e610bfb3c74efdbeeff19ee370e6a76dd552c66680a9180777828dc2e7fa/yarl-1.9.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:49827dfccbd59c4499605c13805e947349295466e490860a855b7c7e82ec9c75", size = 109560 }, - { url = "https://files.pythonhosted.org/packages/d0/aa/dc3657bcf79cd98bdfa03c1b85c88de2a36037171894fa56890146e08615/yarl-1.9.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b8bbdd425d0978311520ea99fb6c0e9e04e64aee84fac05f3157ace9f81b05", size = 485985 }, - { url = "https://files.pythonhosted.org/packages/cf/2a/a69ad3ae4facef03df228790e6f4cfd4971cc267ee140fc8f6331c7e6194/yarl-1.9.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71d33fd1c219b5b28ee98cd76da0c9398a4ed4792fd75c94135237db05ba5ca8", size = 501335 }, - { url = "https://files.pythonhosted.org/packages/f5/8f/b0a35ecd3f31fdffa704d11bf452a277ce4b29e7b878a94e636349945d87/yarl-1.9.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62440431741d0b7d410e5cbad800885e3289048140a43390ecab4f0b96dde3bb", size = 502295 }, - { url = "https://files.pythonhosted.org/packages/39/68/bfc953df3a6ee6c0c9cd9f84d488681e377e49b8ced6d2d5b9289d639c89/yarl-1.9.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db97210433366dfba55590e48285b89ad0146c52bf248dd0da492dd9f0f72cf", size = 493550 }, - { url = "https://files.pythonhosted.org/packages/40/5d/5092b93da54659f1e737f95d9a554f79aa68d1fda05e26c9f0e86184d894/yarl-1.9.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653597b615809f2e5f4dba6cd805608b6fd3597128361a22cc612cf7c7a4d1bf", size = 470835 }, - { url = "https://files.pythonhosted.org/packages/66/e6/dedce99c469f8d1c66432006910adf943fdb7d0cfb77f026030e234f234f/yarl-1.9.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df47612129e66f7ce7c9994d4cd4e6852f6e3bf97699375d86991481796eeec8", size = 490437 }, - { url = "https://files.pythonhosted.org/packages/50/52/b36cd8d9356734fda4a668ce358f56ecb16c7171b8a658fdfde31476de7c/yarl-1.9.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5e338b6febbae6c9fe86924bac3ea9c1944e33255c249543cd82a4af6df6047b", size = 492765 }, - { url = "https://files.pythonhosted.org/packages/aa/9e/6ad4300fc040fc34e323f1254a05886a6441d05bd251a9a4063ed8d35c32/yarl-1.9.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e649d37d04665dddb90994bbf0034331b6c14144cc6f3fbce400dc5f28dc05b7", size = 508901 }, - { url = "https://files.pythonhosted.org/packages/77/cc/8b27ea0a0faaba43b389c3a170c25a1fc063c34ae41c8660055e47d5dc89/yarl-1.9.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0a1b8fd849567be56342e988e72c9d28bd3c77b9296c38b9b42d2fe4813c9d3f", size = 519676 }, - { url = "https://files.pythonhosted.org/packages/ca/e6/1b88c9b952c69b4bfb5d38260de4bf65eab4d0787bfcdc0a4d680e084ccb/yarl-1.9.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f9d715b2175dff9a49c6dafdc2ab3f04850ba2f3d4a77f69a5a1786b057a9d45", size = 510005 }, - { url = "https://files.pythonhosted.org/packages/72/81/c456d5060bf4c2cb1213cd71e9211e0859ce6fff444bd13c61e2ae681b64/yarl-1.9.7-cp313-cp313-win32.whl", hash = "sha256:bc9233638b07c2e4a3a14bef70f53983389bffa9e8cb90a2da3f67ac9c5e1842", size = 483263 }, - { url = "https://files.pythonhosted.org/packages/5d/08/fe455390603d0377140c1ef02287dd32d3d4a0a6d596aa4a1fc881ac68d2/yarl-1.9.7-cp313-cp313-win_amd64.whl", hash = "sha256:62e110772330d7116f91e79cd83fef92545cb2f36414c95881477aa01971f75f", size = 491236 }, - { url = "https://files.pythonhosted.org/packages/48/04/8cc40203453e4bce05cd3e9a5bea930ac0086aa4848a9c41aa1da13ae1a0/yarl-1.9.7-py3-none-any.whl", hash = "sha256:49935cc51d272264358962d050d726c3e5603a616f53e52ea88e9df1728aa2ee", size = 35402 }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/3d/4924f9ed49698bac5f112bc9b40aa007bbdcd702462c1df3d2e1383fb158/yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53", size = 162095 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/05/379002019a0c9d5dc0c4cc6f71e324ea43461ae6f58e94ee87e07b8ffa90/yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0", size = 189044 }, + { url = "https://files.pythonhosted.org/packages/23/d5/e62cfba5ceaaf92ee4f9af6f9c9ab2f2b47d8ad48687fa69570a93b0872c/yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265", size = 114867 }, + { url = "https://files.pythonhosted.org/packages/b1/10/6abc0bd7e7fe7c6b9b9e9ce0ff558912c9ecae65a798f5442020ef9e4177/yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867", size = 112737 }, + { url = "https://files.pythonhosted.org/packages/37/a5/ad026afde5efe1849f4f55bd9f9a2cb5b006511b324db430ae5336104fb3/yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd", size = 482887 }, + { url = "https://files.pythonhosted.org/packages/f8/82/b8bee972617b800319b4364cfcd69bfaf7326db052e91a56e63986cc3e05/yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef", size = 498635 }, + { url = "https://files.pythonhosted.org/packages/af/ad/ac688503b134e02e8505415f0b8e94dc8e92a97e82abdd9736658389b5ae/yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8", size = 496198 }, + { url = "https://files.pythonhosted.org/packages/ce/f2/b6cae0ad1afed6e95f82ab2cb9eb5b63e41f1463ece2a80c39d80cf6167a/yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870", size = 489068 }, + { url = "https://files.pythonhosted.org/packages/c8/f4/355e69b5563154b40550233ffba8f6099eac0c99788600191967763046cf/yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2", size = 468286 }, + { url = "https://files.pythonhosted.org/packages/26/3d/3c37f3f150faf87b086f7915724f2fcb9ff2f7c9d3f6c0f42b7722bd9b77/yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/94/ee/d591abbaea3b14e0f68bdec5cbcb75f27107190c51889d518bafe5d8f120/yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa", size = 484947 }, + { url = "https://files.pythonhosted.org/packages/57/70/ad1c65a13315f03ff0c63fd6359dd40d8198e2a42e61bf86507602a0364f/yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff", size = 505610 }, + { url = "https://files.pythonhosted.org/packages/4c/8c/6086dec0f8d7df16d136b38f373c49cf3d2fb94464e5a10bf788b36f3f54/yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239", size = 515951 }, + { url = "https://files.pythonhosted.org/packages/49/79/e0479e9a3bbb7bdcb82779d89711b97cea30902a4bfe28d681463b7071ce/yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45", size = 501273 }, + { url = "https://files.pythonhosted.org/packages/8e/85/eab962453e81073276b22f3d1503dffe6bfc3eb9cd0f31899970de05d490/yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447", size = 101139 }, + { url = "https://files.pythonhosted.org/packages/5d/de/618b3e5cab10af8a2ed3eb625dac61c1d16eb155d1f56f9fdb3500786c12/yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639", size = 110504 }, + { url = "https://files.pythonhosted.org/packages/07/b7/948e4f427817e0178f3737adf6712fea83f76921e11e2092f403a8a9dc4a/yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c", size = 185061 }, + { url = "https://files.pythonhosted.org/packages/f3/67/8d91ad79a3b907b4fef27fafa912350554443ba53364fff3c347b41105cb/yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e", size = 113056 }, + { url = "https://files.pythonhosted.org/packages/a1/77/6b2348a753702fa87f435cc33dcec21981aaca8ef98a46566a7b29940b4a/yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93", size = 110958 }, + { url = "https://files.pythonhosted.org/packages/8e/3e/6eadf32656741549041f549a392f3b15245d3a0a0b12a9bc22bd6b69621f/yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d", size = 470326 }, + { url = "https://files.pythonhosted.org/packages/3d/a4/1b641a8c7899eeaceec45ff105a2e7206ec0eb0fb9d86403963cc8521c5e/yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7", size = 484778 }, + { url = "https://files.pythonhosted.org/packages/8a/f5/80c142f34779a5c26002b2bf1f73b9a9229aa9e019ee6f9fd9d3e9704e78/yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089", size = 485568 }, + { url = "https://files.pythonhosted.org/packages/f8/f2/6b40ffea2d5d3a11f514ab23c30d14f52600c36a3210786f5974b6701bb8/yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5", size = 477801 }, + { url = "https://files.pythonhosted.org/packages/4c/1a/e60c116f3241e4842ed43c104eb2751abe02f6bac0301cdae69e4fda9c3a/yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5", size = 455361 }, + { url = "https://files.pythonhosted.org/packages/b9/98/fe0aeee425a4bc5cd3ed86e867661d2bfa782544fa07a8e3dcd97d51ae3d/yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786", size = 473893 }, + { url = "https://files.pythonhosted.org/packages/6b/9b/677455d146bd3cecd350673f0e4bb28854af66726493ace3b640e9c5552b/yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318", size = 476407 }, + { url = "https://files.pythonhosted.org/packages/33/ca/ce85766247a9a9b56654428fb78a3e14ea6947a580a9c4e891b3aa7da322/yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82", size = 490848 }, + { url = "https://files.pythonhosted.org/packages/6d/d6/717f0f19bcf2c4705ad95550b4b6319a0d8d1d4f137ea5e223207f00df50/yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a", size = 501084 }, + { url = "https://files.pythonhosted.org/packages/14/b5/b93c70d9a462b802c8df65c64b85f49d86b4ba70c393fbad95cf7ec053cb/yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da", size = 491776 }, + { url = "https://files.pythonhosted.org/packages/03/0f/5a52eaa402a6a93265ba82f42c6f6085ccbe483e1b058ad34207e75812b1/yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979", size = 485250 }, + { url = "https://files.pythonhosted.org/packages/dd/97/946d26a5d82706a6769399cabd472c59f9a3227ce1432afb4739b9c29572/yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367", size = 492590 }, + { url = "https://files.pythonhosted.org/packages/5b/b3/841f7d706137bdc8b741c6826106b6f703155076d58f1830f244da857451/yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38", size = 38648 }, ] From bcd8ad2abe7ca73446a35793a9ea5e0be8dd406d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 09:18:36 +0200 Subject: [PATCH 011/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pylint=20to=20v3.3.0=20(#579)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bb360817..5d03979e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dev-dependencies = [ "mypy==1.11.2", "pre-commit==3.8.0", "pycountry==24.6.1", - "pylint==3.2.7", + "pylint==3.3.0", "pytest-asyncio==0.24.0", "pytest-cov==5.0.0", "pytest-docker-fixtures==1.3.19", diff --git a/uv.lock b/uv.lock index 5bbdc925..254042aa 100644 --- a/uv.lock +++ b/uv.lock @@ -82,11 +82,11 @@ wheels = [ [[package]] name = "astroid" -version = "3.2.4" +version = "3.3.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/53/1067e1113ecaf58312357f2cd93063674924119d80d173adc3f6f2387aa2/astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a", size = 397576 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/ba/1b405d964cb37060f331029fa6baedb4f39832c65e270aa435d9ea704c08/astroid-3.3.3.tar.gz", hash = "sha256:63f8c5370d9bad8294163c87b2d440a7fdf546be6c72bbeac0549c93244dbd72", size = 396377 } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/96/b32bbbb46170a1c8b8b1f28c794202e25cfe743565e9d3469b8eb1e0cc05/astroid-3.2.4-py3-none-any.whl", hash = "sha256:413658a61eeca6202a59231abb473f932038fbcbf1666587f66d482083413a25", size = 276348 }, + { url = "https://files.pythonhosted.org/packages/f9/89/adc721e79479bf6d8171033bfa484d7f59da4e33ed4e85f74c421c138c7e/astroid-3.3.3-py3-none-any.whl", hash = "sha256:2d79acfd3c594b6a2d4141fea98a1d62ab4a52e54332b1f1ddcf07b652cc5c0f", size = 274374 }, ] [[package]] @@ -198,7 +198,7 @@ wheels = [ [[package]] name = "deebot-client" -version = "8.4.1.dev4+gb3c3d1d" +version = "8.4.1.dev5+g7945282.d20240920" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -243,7 +243,7 @@ dev = [ { name = "mypy", specifier = "==1.11.2" }, { name = "pre-commit", specifier = "==3.8.0" }, { name = "pycountry", specifier = "==24.6.1" }, - { name = "pylint", specifier = "==3.2.7" }, + { name = "pylint", specifier = "==3.3.0" }, { name = "pytest", specifier = "==8.3.3" }, { name = "pytest-asyncio", specifier = "==0.24.0" }, { name = "pytest-cov", specifier = "==5.0.0" }, @@ -578,7 +578,7 @@ wheels = [ [[package]] name = "pylint" -version = "3.2.7" +version = "3.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "astroid" }, @@ -589,9 +589,9 @@ dependencies = [ { name = "platformdirs" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/e8/d59ce8e54884c9475ed6510685ef4311a10001674c28703b23da30f3b24d/pylint-3.2.7.tar.gz", hash = "sha256:1b7a721b575eaeaa7d39db076b6e7743c993ea44f57979127c517c6c572c803e", size = 1511922 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/38/bd0af116fb2153b3efac3ac0b82953d4ac690b020c28f32d5fa38b979ee1/pylint-3.3.0.tar.gz", hash = "sha256:c685fe3c061ee5fb0ce7c29436174ab84a2f525fce2a268b1986e921e083fe22", size = 1516717 } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/4d/c73bc0fca447b918611985c325cd7017fb762050eb9c6ac6fa7d9ac6fbe4/pylint-3.2.7-py3-none-any.whl", hash = "sha256:02f4aedeac91be69fb3b4bea997ce580a4ac68ce58b89eaefeaf06749df73f4b", size = 519906 }, + { url = "https://files.pythonhosted.org/packages/78/38/7cf2a837c88d27e8471c3d749306ce5fa000ff2c9da7990881c4d70b5b3a/pylint-3.3.0-py3-none-any.whl", hash = "sha256:02dce1845f68974b9b03045894eb3bf05a8b3c7da9fd10af4de3c91e69eb92f1", size = 521768 }, ] [[package]] From 3f5eafbd45e278e5ca875fa04af1757f9becbe6e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 09:20:00 +0200 Subject: [PATCH 012/138] [pre-commit.ci] pre-commit autoupdate (#577) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8b7b8f03..48a8d99b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.4 + rev: v0.6.5 hooks: - id: ruff args: From 3b9869720fae7b72bf70fe82e9f04cb9ce0f9780 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 07:22:46 +0000 Subject: [PATCH 013/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20astral-sh?= =?UTF-8?q?/setup-uv=20action=20to=20v3=20(#578)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 4 ++-- .github/workflows/python-publish.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2bcefb6..3a4f5621 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@v4 - name: 🏗 Install uv - uses: astral-sh/setup-uv@v2 + uses: astral-sh/setup-uv@v3 with: enable-cache: true cache-dependency-glob: "uv.lock" @@ -55,7 +55,7 @@ jobs: uses: actions/checkout@v4 - name: 🏗 Install uv - uses: astral-sh/setup-uv@v2 + uses: astral-sh/setup-uv@v3 with: enable-cache: true cache-dependency-glob: "uv.lock" diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 56e1d7ef..6a56db81 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v4 - name: 🏗 Install uv - uses: astral-sh/setup-uv@v2 + uses: astral-sh/setup-uv@v3 with: enable-cache: true cache-dependency-glob: "uv.lock" From 40ba6ce7550442a519d38f86d2b2cdf5dfa48053 Mon Sep 17 00:00:00 2001 From: flubshi Date: Wed, 30 Oct 2024 08:39:12 +0100 Subject: [PATCH 014/138] Add error code 312 "Dust Bag Full" (#588) --- deebot_client/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deebot_client/const.py b/deebot_client/const.py index 065f0b4e..87ddcd82 100644 --- a/deebot_client/const.py +++ b/deebot_client/const.py @@ -94,7 +94,7 @@ class UndefinedType(Enum): 308: "Communication Malfunction", 310: "Lid open", 311: "Replace the Dust Bag", - 312: "TODO: unknown", + 312: "Dust Bag Full", 313: "TODO: unknown", 314: "Water Supply Module or Silver Ion Sterilization module is not installed", 315: "Water Supply Module is not installed", From bb14f181eb7cd414034f28cd3d57c95ec12af9df Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 08:39:35 +0100 Subject: [PATCH 015/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pytest-cov=20to=20v6=20(#589)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5d03979e..e18b5d8c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ dev-dependencies = [ "pycountry==24.6.1", "pylint==3.3.0", "pytest-asyncio==0.24.0", - "pytest-cov==5.0.0", + "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", "pytest-timeout==2.3.1", "pytest==8.3.3", diff --git a/uv.lock b/uv.lock index 254042aa..70f30286 100644 --- a/uv.lock +++ b/uv.lock @@ -198,7 +198,7 @@ wheels = [ [[package]] name = "deebot-client" -version = "8.4.1.dev5+g7945282.d20240920" +version = "8.4.1.dev8+g3b98697.d20241029" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -246,7 +246,7 @@ dev = [ { name = "pylint", specifier = "==3.3.0" }, { name = "pytest", specifier = "==8.3.3" }, { name = "pytest-asyncio", specifier = "==0.24.0" }, - { name = "pytest-cov", specifier = "==5.0.0" }, + { name = "pytest-cov", specifier = "==6.0.0" }, { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, { name = "pytest-timeout", specifier = "==2.3.1" }, { name = "testfixtures", specifier = "==8.3.0" }, @@ -623,15 +623,15 @@ wheels = [ [[package]] name = "pytest-cov" -version = "5.0.0" +version = "6.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 } +sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990 }, + { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, ] [[package]] From 2b37b961da5068a9a803136548bf923ccccc5dc1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 08:40:15 +0100 Subject: [PATCH 016/138] [pre-commit.ci] pre-commit autoupdate (#580) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 48a8d99b..62868965 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.5 + rev: v0.7.1 hooks: - id: ruff args: @@ -19,7 +19,7 @@ repos: - --unsafe-fixes - id: ruff-format - repo: https://github.com/asottile/pyupgrade - rev: v3.17.0 + rev: v3.19.0 hooks: - id: pyupgrade args: @@ -38,7 +38,7 @@ repos: - json exclude: ^uv.lock$ - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: check-executables-have-shebangs - id: check-merge-conflict From 1e42ef912ed985be2ab5c806373aaada0776d1b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:40:19 +0100 Subject: [PATCH 017/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pylint=20to=20v3.3.1=20(#581)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e18b5d8c..cc183bf2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dev-dependencies = [ "mypy==1.11.2", "pre-commit==3.8.0", "pycountry==24.6.1", - "pylint==3.3.0", + "pylint==3.3.1", "pytest-asyncio==0.24.0", "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", diff --git a/uv.lock b/uv.lock index 70f30286..2e71cdf1 100644 --- a/uv.lock +++ b/uv.lock @@ -82,11 +82,11 @@ wheels = [ [[package]] name = "astroid" -version = "3.3.3" +version = "3.3.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/ba/1b405d964cb37060f331029fa6baedb4f39832c65e270aa435d9ea704c08/astroid-3.3.3.tar.gz", hash = "sha256:63f8c5370d9bad8294163c87b2d440a7fdf546be6c72bbeac0549c93244dbd72", size = 396377 } +sdist = { url = "https://files.pythonhosted.org/packages/38/1e/326fb1d3d83a3bb77c9f9be29d31f2901e35acb94b0605c3f2e5085047f9/astroid-3.3.5.tar.gz", hash = "sha256:5cfc40ae9f68311075d27ef68a4841bdc5cc7f6cf86671b49f00607d30188e2d", size = 397229 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/89/adc721e79479bf6d8171033bfa484d7f59da4e33ed4e85f74c421c138c7e/astroid-3.3.3-py3-none-any.whl", hash = "sha256:2d79acfd3c594b6a2d4141fea98a1d62ab4a52e54332b1f1ddcf07b652cc5c0f", size = 274374 }, + { url = "https://files.pythonhosted.org/packages/41/30/624365383fa4a40329c0f0bbbc151abc4a64e30dfc110fc8f6e2afcd02bb/astroid-3.3.5-py3-none-any.whl", hash = "sha256:a9d1c946ada25098d790e079ba2a1b112157278f3fb7e718ae6a9252f5835dc8", size = 274586 }, ] [[package]] @@ -198,7 +198,7 @@ wheels = [ [[package]] name = "deebot-client" -version = "8.4.1.dev8+g3b98697.d20241029" +version = "8.4.1.dev11+g2b37b96.d20241030" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -243,7 +243,7 @@ dev = [ { name = "mypy", specifier = "==1.11.2" }, { name = "pre-commit", specifier = "==3.8.0" }, { name = "pycountry", specifier = "==24.6.1" }, - { name = "pylint", specifier = "==3.3.0" }, + { name = "pylint", specifier = "==3.3.1" }, { name = "pytest", specifier = "==8.3.3" }, { name = "pytest-asyncio", specifier = "==0.24.0" }, { name = "pytest-cov", specifier = "==6.0.0" }, @@ -578,7 +578,7 @@ wheels = [ [[package]] name = "pylint" -version = "3.3.0" +version = "3.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "astroid" }, @@ -589,9 +589,9 @@ dependencies = [ { name = "platformdirs" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/38/bd0af116fb2153b3efac3ac0b82953d4ac690b020c28f32d5fa38b979ee1/pylint-3.3.0.tar.gz", hash = "sha256:c685fe3c061ee5fb0ce7c29436174ab84a2f525fce2a268b1986e921e083fe22", size = 1516717 } +sdist = { url = "https://files.pythonhosted.org/packages/63/3a/13e90e29777e695d90f422cf4fadb81c999e4755a9089838561bd0590cac/pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e", size = 1516703 } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/38/7cf2a837c88d27e8471c3d749306ce5fa000ff2c9da7990881c4d70b5b3a/pylint-3.3.0-py3-none-any.whl", hash = "sha256:02dce1845f68974b9b03045894eb3bf05a8b3c7da9fd10af4de3c91e69eb92f1", size = 521768 }, + { url = "https://files.pythonhosted.org/packages/4d/11/4a3f814eee14593f3cfcf7046bc765bf1646d5c88132c08c45310fc7d85f/pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9", size = 521768 }, ] [[package]] From 7a6f33ac2292cd9f52c9bc30513d14d68083c533 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:40:27 +0100 Subject: [PATCH 018/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20mypy=20to=20v1.13.0=20(#584)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index cc183bf2..18ba51e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ dynamic = ["version"] [tool.uv] dev-dependencies = [ - "mypy==1.11.2", + "mypy==1.13.0", "pre-commit==3.8.0", "pycountry==24.6.1", "pylint==3.3.1", diff --git a/uv.lock b/uv.lock index 2e71cdf1..108a666c 100644 --- a/uv.lock +++ b/uv.lock @@ -240,7 +240,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "mypy", specifier = "==1.11.2" }, + { name = "mypy", specifier = "==1.13.0" }, { name = "pre-commit", specifier = "==3.8.0" }, { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.1" }, @@ -415,20 +415,25 @@ wheels = [ [[package]] name = "mypy" -version = "1.11.2" +version = "1.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/86/5d7cbc4974fd564550b80fbb8103c05501ea11aa7835edf3351d90095896/mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79", size = 3078806 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/3a/ed7b12ecc3f6db2f664ccf85cb2e004d3e90bec928e9d7be6aa2f16b7cdf/mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318", size = 10990335 }, - { url = "https://files.pythonhosted.org/packages/04/e4/1a9051e2ef10296d206519f1df13d2cc896aea39e8683302f89bf5792a59/mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36", size = 10007119 }, - { url = "https://files.pythonhosted.org/packages/f3/3c/350a9da895f8a7e87ade0028b962be0252d152e0c2fbaafa6f0658b4d0d4/mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987", size = 12506856 }, - { url = "https://files.pythonhosted.org/packages/b6/49/ee5adf6a49ff13f4202d949544d3d08abb0ea1f3e7f2a6d5b4c10ba0360a/mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca", size = 12952066 }, - { url = "https://files.pythonhosted.org/packages/27/c0/b19d709a42b24004d720db37446a42abadf844d5c46a2c442e2a074d70d9/mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70", size = 9664000 }, - { url = "https://files.pythonhosted.org/packages/42/3a/bdf730640ac523229dd6578e8a581795720a9321399de494374afc437ec5/mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12", size = 2619625 }, +sdist = { url = "https://files.pythonhosted.org/packages/e8/21/7e9e523537991d145ab8a0a2fd98548d67646dc2aaaf6091c31ad883e7c1/mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e", size = 3152532 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/31/c526a7bd2e5c710ae47717c7a5f53f616db6d9097caf48ad650581e81748/mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5", size = 11077900 }, + { url = "https://files.pythonhosted.org/packages/83/67/b7419c6b503679d10bd26fc67529bc6a1f7a5f220bbb9f292dc10d33352f/mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e", size = 10074818 }, + { url = "https://files.pythonhosted.org/packages/ba/07/37d67048786ae84e6612575e173d713c9a05d0ae495dde1e68d972207d98/mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2", size = 12589275 }, + { url = "https://files.pythonhosted.org/packages/1f/17/b1018c6bb3e9f1ce3956722b3bf91bff86c1cefccca71cec05eae49d6d41/mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0", size = 13037783 }, + { url = "https://files.pythonhosted.org/packages/cb/32/cd540755579e54a88099aee0287086d996f5a24281a673f78a0e14dba150/mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2", size = 9726197 }, + { url = "https://files.pythonhosted.org/packages/11/bb/ab4cfdc562cad80418f077d8be9b4491ee4fb257440da951b85cbb0a639e/mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7", size = 11069721 }, + { url = "https://files.pythonhosted.org/packages/59/3b/a393b1607cb749ea2c621def5ba8c58308ff05e30d9dbdc7c15028bca111/mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62", size = 10063996 }, + { url = "https://files.pythonhosted.org/packages/d1/1f/6b76be289a5a521bb1caedc1f08e76ff17ab59061007f201a8a18cc514d1/mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8", size = 12584043 }, + { url = "https://files.pythonhosted.org/packages/a6/83/5a85c9a5976c6f96e3a5a7591aa28b4a6ca3a07e9e5ba0cec090c8b596d6/mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7", size = 13036996 }, + { url = "https://files.pythonhosted.org/packages/b4/59/c39a6f752f1f893fccbcf1bdd2aca67c79c842402b5283563d006a67cf76/mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc", size = 9737709 }, + { url = "https://files.pythonhosted.org/packages/3b/86/72ce7f57431d87a7ff17d442f521146a6585019eb8f4f31b7c02801f78ad/mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a", size = 2647043 }, ] [[package]] From 70def4174cdb762dfb0a202e47b0edd2a7cb720b Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 11 Nov 2024 14:03:02 +0100 Subject: [PATCH 019/138] Update release workflow (#591) --- .github/workflows/python-publish.yml | 41 ++++++++++------------------ pyproject.toml | 8 ++---- uv.lock | 2 +- 3 files changed, 17 insertions(+), 34 deletions(-) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 6a56db81..b23011a9 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -12,43 +12,30 @@ on: release: types: [published] -env: - UV_CACHE_DIR: /tmp/.uv-cache - jobs: - deploy: + release: + name: Releasing to PyPi runs-on: ubuntu-latest - environment: release + environment: + name: release + url: https://pypi.org/manage/project/deebot-client/ permissions: + contents: write id-token: write steps: - - name: ⤵️ Checkout repository - uses: actions/checkout@v4 - - - name: 🏗 Install uv + - name: ⤵️ Check out code from GitHub + uses: actions/checkout@v4.2.2 + - name: 🏗 Set up uv uses: astral-sh/setup-uv@v3 with: enable-cache: true - cache-dependency-glob: "uv.lock" - cache-local-path: ${{ env.UV_CACHE_DIR }} - - - name: 🏗 Set up Python - uses: actions/setup-python@v5 - with: - python-version-file: ".python-version" - - - name: 🏗 Install the project - run: uv sync --dev --locked - + - name: 🏗 Set package version + run: | + sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml - name: 📦 Build package run: uv build - - - name: 🚀 Publish package - uses: pypa/gh-action-pypi-publish@release/v1 - with: - verbose: true - print-hash: true - + - name: 🚀 Publish to PyPi + run: uv publish - name: ✍️ Sign published artifacts uses: sigstore/gh-action-sigstore-python@v3.0.0 with: diff --git a/pyproject.toml b/pyproject.toml index 18ba51e5..037142c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["hatchling", "hatch-vcs"] +requires = ["hatchling"] build-backend = "hatchling.build" [project] @@ -29,7 +29,7 @@ dependencies = [ "pillow>=10.0.1,<11.0", "svg-py>=1.4.2", ] -dynamic = ["version"] +version = "0.0.0" [project.urls] "Homepage" = "https://deebot.readthedocs.io/" @@ -59,10 +59,6 @@ include = [ "/deebot_client", ] - -[tool.hatch.version] -source = "vcs" - [tool.ruff.lint] select = [ "ALL", diff --git a/uv.lock b/uv.lock index 108a666c..fea9798a 100644 --- a/uv.lock +++ b/uv.lock @@ -198,7 +198,7 @@ wheels = [ [[package]] name = "deebot-client" -version = "8.4.1.dev11+g2b37b96.d20241030" +version = "0.0.0" source = { editable = "." } dependencies = [ { name = "aiohttp" }, From 2fce9f5adbe547e59d85be8f3af187bdf7839e69 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 14:05:27 +0100 Subject: [PATCH 020/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pre-commit=20to=20v4=20(#582)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 037142c3..9b342c7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ version = "0.0.0" [tool.uv] dev-dependencies = [ "mypy==1.13.0", - "pre-commit==3.8.0", + "pre-commit==4.0.1", "pycountry==24.6.1", "pylint==3.3.1", "pytest-asyncio==0.24.0", diff --git a/uv.lock b/uv.lock index fea9798a..ee2dc284 100644 --- a/uv.lock +++ b/uv.lock @@ -241,7 +241,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ { name = "mypy", specifier = "==1.13.0" }, - { name = "pre-commit", specifier = "==3.8.0" }, + { name = "pre-commit", specifier = "==4.0.1" }, { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.1" }, { name = "pytest", specifier = "==8.3.3" }, @@ -558,7 +558,7 @@ wheels = [ [[package]] name = "pre-commit" -version = "3.8.0" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -567,9 +567,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/10/97ee2fa54dff1e9da9badbc5e35d0bbaef0776271ea5907eccf64140f72f/pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", size = 177815 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f", size = 204643 }, + { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, ] [[package]] From a8013e66b98289ff06cba2987b16ca59f37dc4ff Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 14:05:55 +0100 Subject: [PATCH 021/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pillow=20to=20v11=20(#585)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Robert Resch --- pyproject.toml | 2 +- uv.lock | 62 ++++++++++++++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9b342c7e..f2c391b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "cachetools>=5.0.0,<6.0", "defusedxml>=0.7.1", "numpy>=1.23.2,<3.0", - "pillow>=10.0.1,<11.0", + "pillow>=10,<12", "svg-py>=1.4.2", ] version = "0.0.0" diff --git a/uv.lock b/uv.lock index ee2dc284..71b39693 100644 --- a/uv.lock +++ b/uv.lock @@ -234,7 +234,7 @@ requires-dist = [ { name = "cachetools", specifier = ">=5.0.0,<6.0" }, { name = "defusedxml", specifier = ">=0.7.1" }, { name = "numpy", specifier = ">=1.23.2,<3.0" }, - { name = "pillow", specifier = ">=10.0.1,<11.0" }, + { name = "pillow", specifier = ">=10,<12" }, { name = "svg-py", specifier = ">=1.4.2" }, ] @@ -510,32 +510,40 @@ wheels = [ [[package]] name = "pillow" -version = "10.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350 }, - { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980 }, - { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799 }, - { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973 }, - { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054 }, - { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484 }, - { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375 }, - { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773 }, - { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690 }, - { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951 }, - { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427 }, - { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685 }, - { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883 }, - { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837 }, - { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562 }, - { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761 }, - { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767 }, - { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989 }, - { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255 }, - { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603 }, - { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972 }, - { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375 }, +version = "11.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/26/0d95c04c868f6bdb0c447e3ee2de5564411845e36a858cfd63766bc7b563/pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739", size = 46737780 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/a3/26e606ff0b2daaf120543e537311fa3ae2eb6bf061490e4fea51771540be/pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923", size = 3147642 }, + { url = "https://files.pythonhosted.org/packages/4f/d5/1caabedd8863526a6cfa44ee7a833bd97f945dc1d56824d6d76e11731939/pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903", size = 2978999 }, + { url = "https://files.pythonhosted.org/packages/d9/ff/5a45000826a1aa1ac6874b3ec5a856474821a1b59d838c4f6ce2ee518fe9/pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4", size = 4196794 }, + { url = "https://files.pythonhosted.org/packages/9d/21/84c9f287d17180f26263b5f5c8fb201de0f88b1afddf8a2597a5c9fe787f/pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f", size = 4300762 }, + { url = "https://files.pythonhosted.org/packages/84/39/63fb87cd07cc541438b448b1fed467c4d687ad18aa786a7f8e67b255d1aa/pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9", size = 4210468 }, + { url = "https://files.pythonhosted.org/packages/7f/42/6e0f2c2d5c60f499aa29be14f860dd4539de322cd8fb84ee01553493fb4d/pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7", size = 4381824 }, + { url = "https://files.pythonhosted.org/packages/31/69/1ef0fb9d2f8d2d114db982b78ca4eeb9db9a29f7477821e160b8c1253f67/pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6", size = 4296436 }, + { url = "https://files.pythonhosted.org/packages/44/ea/dad2818c675c44f6012289a7c4f46068c548768bc6c7f4e8c4ae5bbbc811/pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc", size = 4429714 }, + { url = "https://files.pythonhosted.org/packages/af/3a/da80224a6eb15bba7a0dcb2346e2b686bb9bf98378c0b4353cd88e62b171/pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6", size = 2249631 }, + { url = "https://files.pythonhosted.org/packages/57/97/73f756c338c1d86bb802ee88c3cab015ad7ce4b838f8a24f16b676b1ac7c/pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47", size = 2567533 }, + { url = "https://files.pythonhosted.org/packages/0b/30/2b61876e2722374558b871dfbfcbe4e406626d63f4f6ed92e9c8e24cac37/pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25", size = 2254890 }, + { url = "https://files.pythonhosted.org/packages/63/24/e2e15e392d00fcf4215907465d8ec2a2f23bcec1481a8ebe4ae760459995/pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699", size = 3147300 }, + { url = "https://files.pythonhosted.org/packages/43/72/92ad4afaa2afc233dc44184adff289c2e77e8cd916b3ddb72ac69495bda3/pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38", size = 2978742 }, + { url = "https://files.pythonhosted.org/packages/9e/da/c8d69c5bc85d72a8523fe862f05ababdc52c0a755cfe3d362656bb86552b/pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2", size = 4194349 }, + { url = "https://files.pythonhosted.org/packages/cd/e8/686d0caeed6b998351d57796496a70185376ed9c8ec7d99e1d19ad591fc6/pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2", size = 4298714 }, + { url = "https://files.pythonhosted.org/packages/ec/da/430015cec620d622f06854be67fd2f6721f52fc17fca8ac34b32e2d60739/pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527", size = 4208514 }, + { url = "https://files.pythonhosted.org/packages/44/ae/7e4f6662a9b1cb5f92b9cc9cab8321c381ffbee309210940e57432a4063a/pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa", size = 4380055 }, + { url = "https://files.pythonhosted.org/packages/74/d5/1a807779ac8a0eeed57f2b92a3c32ea1b696e6140c15bd42eaf908a261cd/pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f", size = 4296751 }, + { url = "https://files.pythonhosted.org/packages/38/8c/5fa3385163ee7080bc13026d59656267daaaaf3c728c233d530e2c2757c8/pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb", size = 4430378 }, + { url = "https://files.pythonhosted.org/packages/ca/1d/ad9c14811133977ff87035bf426875b93097fb50af747793f013979facdb/pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798", size = 2249588 }, + { url = "https://files.pythonhosted.org/packages/fb/01/3755ba287dac715e6afdb333cb1f6d69740a7475220b4637b5ce3d78cec2/pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de", size = 2567509 }, + { url = "https://files.pythonhosted.org/packages/c0/98/2c7d727079b6be1aba82d195767d35fcc2d32204c7a5820f822df5330152/pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84", size = 2254791 }, + { url = "https://files.pythonhosted.org/packages/eb/38/998b04cc6f474e78b563716b20eecf42a2fa16a84589d23c8898e64b0ffd/pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b", size = 3150854 }, + { url = "https://files.pythonhosted.org/packages/13/8e/be23a96292113c6cb26b2aa3c8b3681ec62b44ed5c2bd0b258bd59503d3c/pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003", size = 2982369 }, + { url = "https://files.pythonhosted.org/packages/97/8a/3db4eaabb7a2ae8203cd3a332a005e4aba00067fc514aaaf3e9721be31f1/pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2", size = 4333703 }, + { url = "https://files.pythonhosted.org/packages/28/ac/629ffc84ff67b9228fe87a97272ab125bbd4dc462745f35f192d37b822f1/pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a", size = 4412550 }, + { url = "https://files.pythonhosted.org/packages/d6/07/a505921d36bb2df6868806eaf56ef58699c16c388e378b0dcdb6e5b2fb36/pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8", size = 4461038 }, + { url = "https://files.pythonhosted.org/packages/d6/b9/fb620dd47fc7cc9678af8f8bd8c772034ca4977237049287e99dda360b66/pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8", size = 2253197 }, + { url = "https://files.pythonhosted.org/packages/df/86/25dde85c06c89d7fc5db17940f07aae0a56ac69aa9ccb5eb0f09798862a8/pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904", size = 2572169 }, + { url = "https://files.pythonhosted.org/packages/51/85/9c33f2517add612e17f3381aee7c4072779130c634921a756c97bc29fb49/pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", size = 2256828 }, ] [[package]] From 14fd6568daa1bfd19aac6a4fffc3f29008f10a3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 14:11:34 +0100 Subject: [PATCH 022/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#576)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 497 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 288 insertions(+), 209 deletions(-) diff --git a/uv.lock b/uv.lock index 71b39693..425ba68f 100644 --- a/uv.lock +++ b/uv.lock @@ -3,16 +3,16 @@ requires-python = ">=3.12.0" [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/f7/22bba300a16fd1cad99da1a23793fe43963ee326d012fdf852d0b4035955/aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2", size = 16786 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/69/2f6d5a019bd02e920a3417689a89887b39ad1e350b562f9955693d900c40/aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586", size = 21809 } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/b6/58ea188899950d759a837f9a58b2aee1d1a380ea4d6211ce9b1823748851/aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd", size = 12155 }, + { url = "https://files.pythonhosted.org/packages/f7/d8/120cd0fe3e8530df0539e71ba9683eade12cae103dd7543e50d15f737917/aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572", size = 14742 }, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -22,38 +22,38 @@ dependencies = [ { name = "multidict" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/28/ca549838018140b92a19001a8628578b0f2a3b38c16826212cc6f706e6d4/aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691", size = 7524360 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/1c/74f9dad4a2fc4107e73456896283d915937f48177b99867b63381fadac6e/aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487", size = 583468 }, - { url = "https://files.pythonhosted.org/packages/12/29/68d090551f2b58ce76c2b436ced8dd2dfd32115d41299bf0b0c308a5483c/aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a", size = 394066 }, - { url = "https://files.pythonhosted.org/packages/8f/f7/971f88b4cdcaaa4622925ba7d86de47b48ec02a9040a143514b382f78da4/aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d", size = 389098 }, - { url = "https://files.pythonhosted.org/packages/f1/5a/fe3742efdce551667b2ddf1158b27c5b8eb1edc13d5e14e996e52e301025/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75", size = 1332742 }, - { url = "https://files.pythonhosted.org/packages/1a/52/a25c0334a1845eb4967dff279151b67ca32a948145a5812ed660ed900868/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178", size = 1372134 }, - { url = "https://files.pythonhosted.org/packages/96/3d/33c1d8efc2d8ec36bff9a8eca2df9fdf8a45269c6e24a88e74f2aa4f16bd/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e", size = 1414413 }, - { url = "https://files.pythonhosted.org/packages/64/74/0f1ddaa5f0caba1d946f0dd0c31f5744116e4a029beec454ec3726d3311f/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f", size = 1328107 }, - { url = "https://files.pythonhosted.org/packages/0a/32/c10118f0ad50e4093227234f71fd0abec6982c29367f65f32ee74ed652c4/aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73", size = 1280126 }, - { url = "https://files.pythonhosted.org/packages/c6/c9/77e3d648d97c03a42acfe843d03e97be3c5ef1b4d9de52e5bd2d28eed8e7/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf", size = 1292660 }, - { url = "https://files.pythonhosted.org/packages/7e/5d/99c71f8e5c8b64295be421b4c42d472766b263a1fe32e91b64bf77005bf2/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820", size = 1300988 }, - { url = "https://files.pythonhosted.org/packages/8f/2c/76d2377dd947f52fbe8afb19b18a3b816d66c7966755c04030f93b1f7b2d/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca", size = 1339268 }, - { url = "https://files.pythonhosted.org/packages/fd/e6/3d9d935cc705d57ed524d82ec5d6b678a53ac1552720ae41282caa273584/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91", size = 1366993 }, - { url = "https://files.pythonhosted.org/packages/fe/c2/f7eed4d602f3f224600d03ab2e1a7734999b0901b1c49b94dc5891340433/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6", size = 1329459 }, - { url = "https://files.pythonhosted.org/packages/ce/8f/27f205b76531fc592abe29e1ad265a16bf934a9f609509c02d765e6a8055/aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12", size = 356968 }, - { url = "https://files.pythonhosted.org/packages/39/8c/4f6c0b2b3629f6be6c81ab84d9d577590f74f01d4412bfc4067958eaa1e1/aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc", size = 377650 }, - { url = "https://files.pythonhosted.org/packages/7b/b9/03b4327897a5b5d29338fa9b514f1c2f66a3e4fc88a4e40fad478739314d/aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092", size = 576994 }, - { url = "https://files.pythonhosted.org/packages/67/1b/20c2e159cd07b8ed6dde71c2258233902fdf415b2fe6174bd2364ba63107/aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77", size = 390684 }, - { url = "https://files.pythonhosted.org/packages/4d/6b/ff83b34f157e370431d8081c5d1741963f4fb12f9aaddb2cacbf50305225/aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385", size = 386176 }, - { url = "https://files.pythonhosted.org/packages/4d/a1/6e92817eb657de287560962df4959b7ddd22859c4b23a0309e2d3de12538/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972", size = 1303310 }, - { url = "https://files.pythonhosted.org/packages/04/29/200518dc7a39c30ae6d5bc232d7207446536e93d3d9299b8e95db6e79c54/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16", size = 1340445 }, - { url = "https://files.pythonhosted.org/packages/8e/20/53f7bba841ba7b5bb5dea580fea01c65524879ba39cb917d08c845524717/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6", size = 1385121 }, - { url = "https://files.pythonhosted.org/packages/f1/b4/d99354ad614c48dd38fb1ee880a1a54bd9ab2c3bcad3013048d4a1797d3a/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa", size = 1299669 }, - { url = "https://files.pythonhosted.org/packages/51/39/ca1de675f2a5729c71c327e52ac6344e63f036bd37281686ae5c3fb13bfb/aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689", size = 1252638 }, - { url = "https://files.pythonhosted.org/packages/54/cf/a3ae7ff43138422d477348e309ef8275779701bf305ff6054831ef98b782/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57", size = 1266889 }, - { url = "https://files.pythonhosted.org/packages/6e/7a/c6027ad70d9fb23cf254a26144de2723821dade1a624446aa22cd0b6d012/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f", size = 1266249 }, - { url = "https://files.pythonhosted.org/packages/64/fd/ed136d46bc2c7e3342fed24662b4827771d55ceb5a7687847aae977bfc17/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599", size = 1311036 }, - { url = "https://files.pythonhosted.org/packages/76/9a/43eeb0166f1119256d6f43468f900db1aed7fbe32069d2a71c82f987db4d/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5", size = 1338756 }, - { url = "https://files.pythonhosted.org/packages/d5/bc/d01ff0810b3f5e26896f76d44225ed78b088ddd33079b85cd1a23514318b/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987", size = 1299976 }, - { url = "https://files.pythonhosted.org/packages/3e/c9/50a297c4f7ab57a949f4add2d3eafe5f3e68bb42f739e933f8b32a092bda/aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04", size = 355609 }, - { url = "https://files.pythonhosted.org/packages/65/28/aee9d04fb0b3b1f90622c338a08e54af5198e704a910e20947c473298fd0/aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022", size = 375697 }, +sdist = { url = "https://files.pythonhosted.org/packages/17/7e/16e57e6cf20eb62481a2f9ce8674328407187950ccc602ad07c685279141/aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", size = 7542993 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/99/4c5aefe5ad06a1baf206aed6598c7cdcbc7c044c46801cd0d1ecb758cae3/aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", size = 583536 }, + { url = "https://files.pythonhosted.org/packages/a9/36/8b3bc49b49cb6d2da40ee61ff15dbcc44fd345a3e6ab5bb20844df929821/aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", size = 395693 }, + { url = "https://files.pythonhosted.org/packages/e1/77/0aa8660dcf11fa65d61712dbb458c4989de220a844bd69778dff25f2d50b/aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", size = 390898 }, + { url = "https://files.pythonhosted.org/packages/38/d2/b833d95deb48c75db85bf6646de0a697e7fb5d87bd27cbade4f9746b48b1/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", size = 1312060 }, + { url = "https://files.pythonhosted.org/packages/aa/5f/29fd5113165a0893de8efedf9b4737e0ba92dfcd791415a528f947d10299/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", size = 1350553 }, + { url = "https://files.pythonhosted.org/packages/ad/cc/f835f74b7d344428469200105236d44606cfa448be1e7c95ca52880d9bac/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", size = 1392646 }, + { url = "https://files.pythonhosted.org/packages/bf/fe/1332409d845ca601893bbf2d76935e0b93d41686e5f333841c7d7a4a770d/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", size = 1306310 }, + { url = "https://files.pythonhosted.org/packages/e4/a1/25a7633a5a513278a9892e333501e2e69c83e50be4b57a62285fb7a008c3/aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", size = 1260255 }, + { url = "https://files.pythonhosted.org/packages/f2/39/30eafe89e0e2a06c25e4762844c8214c0c0cd0fd9ffc3471694a7986f421/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", size = 1271141 }, + { url = "https://files.pythonhosted.org/packages/5b/fc/33125df728b48391ef1fcb512dfb02072158cc10d041414fb79803463020/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", size = 1280244 }, + { url = "https://files.pythonhosted.org/packages/3b/61/e42bf2c2934b5caa4e2ec0b5e5fd86989adb022b5ee60c2572a9d77cf6fe/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", size = 1316805 }, + { url = "https://files.pythonhosted.org/packages/18/32/f52a5e2ae9ad3bba10e026a63a7a23abfa37c7d97aeeb9004eaa98df3ce3/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", size = 1343930 }, + { url = "https://files.pythonhosted.org/packages/05/be/6a403b464dcab3631fe8e27b0f1d906d9e45c5e92aca97ee007e5a895560/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", size = 1306186 }, + { url = "https://files.pythonhosted.org/packages/8e/fd/bb50fe781068a736a02bf5c7ad5f3ab53e39f1d1e63110da6d30f7605edc/aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", size = 359289 }, + { url = "https://files.pythonhosted.org/packages/70/9e/5add7e240f77ef67c275c82cc1d08afbca57b77593118c1f6e920ae8ad3f/aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", size = 379313 }, + { url = "https://files.pythonhosted.org/packages/b1/eb/618b1b76c7fe8082a71c9d62e3fe84c5b9af6703078caa9ec57850a12080/aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", size = 576114 }, + { url = "https://files.pythonhosted.org/packages/aa/37/3126995d7869f8b30d05381b81a2d4fb4ec6ad313db788e009bc6d39c211/aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", size = 391901 }, + { url = "https://files.pythonhosted.org/packages/3e/f2/8fdfc845be1f811c31ceb797968523813f8e1263ee3e9120d61253f6848f/aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", size = 387418 }, + { url = "https://files.pythonhosted.org/packages/60/d5/33d2061d36bf07e80286e04b7e0a4de37ce04b5ebfed72dba67659a05250/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", size = 1287073 }, + { url = "https://files.pythonhosted.org/packages/00/52/affb55be16a4747740bd630b4c002dac6c5eac42f9bb64202fc3cf3f1930/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", size = 1323612 }, + { url = "https://files.pythonhosted.org/packages/94/f2/cddb69b975387daa2182a8442566971d6410b8a0179bb4540d81c97b1611/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", size = 1368406 }, + { url = "https://files.pythonhosted.org/packages/c1/e4/afba7327da4d932da8c6e29aecaf855f9d52dace53ac15bfc8030a246f1b/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", size = 1282761 }, + { url = "https://files.pythonhosted.org/packages/9f/6b/364856faa0c9031ea76e24ef0f7fef79cddd9fa8e7dba9a1771c6acc56b5/aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", size = 1236518 }, + { url = "https://files.pythonhosted.org/packages/46/af/c382846f8356fe64a7b5908bb9b477457aa23b71be7ed551013b7b7d4d87/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", size = 1250344 }, + { url = "https://files.pythonhosted.org/packages/87/53/294f87fc086fd0772d0ab82497beb9df67f0f27a8b3dd5742a2656db2bc6/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414", size = 1248956 }, + { url = "https://files.pythonhosted.org/packages/86/30/7d746717fe11bdfefb88bb6c09c5fc985d85c4632da8bb6018e273899254/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", size = 1293379 }, + { url = "https://files.pythonhosted.org/packages/48/b9/45d670a834458db67a24258e9139ba61fa3bd7d69b98ecf3650c22806f8f/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", size = 1320108 }, + { url = "https://files.pythonhosted.org/packages/72/8c/804bb2e837a175635d2000a0659eafc15b2e9d92d3d81c8f69e141ecd0b0/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", size = 1281546 }, + { url = "https://files.pythonhosted.org/packages/89/c0/862e6a9de3d6eeb126cd9d9ea388243b70df9b871ce1a42b193b7a4a77fc/aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", size = 357516 }, + { url = "https://files.pythonhosted.org/packages/ae/63/3e1aee3e554263f3f1011cca50d78a4894ae16ce99bf78101ac3a2f0ef74/aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", size = 376785 }, ] [[package]] @@ -127,26 +127,41 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892 }, - { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213 }, - { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404 }, - { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275 }, - { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518 }, - { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182 }, - { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869 }, - { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042 }, - { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275 }, - { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819 }, - { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415 }, - { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212 }, - { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167 }, - { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041 }, - { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397 }, - { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543 }, +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, ] [[package]] @@ -160,40 +175,40 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983 }, - { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221 }, - { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342 }, - { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371 }, - { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455 }, - { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924 }, - { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252 }, - { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897 }, - { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606 }, - { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373 }, - { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007 }, - { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269 }, - { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886 }, - { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037 }, - { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038 }, - { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690 }, - { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765 }, - { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611 }, - { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671 }, - { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368 }, - { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758 }, - { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035 }, - { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839 }, - { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569 }, - { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927 }, - { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401 }, - { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301 }, - { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598 }, - { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307 }, - { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453 }, +version = "7.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/12/3669b6382792783e92046730ad3327f53b2726f0603f4c311c4da4824222/coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", size = 798716 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/e7/9291de916d084f41adddfd4b82246e68d61d6a75747f075f7e64628998d2/coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", size = 207013 }, + { url = "https://files.pythonhosted.org/packages/27/03/932c2c5717a7fa80cd43c6a07d3177076d97b79f12f40f882f9916db0063/coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", size = 207251 }, + { url = "https://files.pythonhosted.org/packages/d5/3f/0af47dcb9327f65a45455fbca846fe96eb57c153af46c4754a3ba678938a/coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", size = 240268 }, + { url = "https://files.pythonhosted.org/packages/8a/3c/37a9d81bbd4b23bc7d46ca820e16174c613579c66342faa390a271d2e18b/coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", size = 237298 }, + { url = "https://files.pythonhosted.org/packages/c0/70/6b0627e5bd68204ee580126ed3513140b2298995c1233bd67404b4e44d0e/coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", size = 239367 }, + { url = "https://files.pythonhosted.org/packages/3c/eb/634d7dfab24ac3b790bebaf9da0f4a5352cbc125ce6a9d5c6cf4c6cae3c7/coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", size = 238853 }, + { url = "https://files.pythonhosted.org/packages/d9/0d/8e3ed00f1266ef7472a4e33458f42e39492e01a64281084fb3043553d3f1/coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", size = 237160 }, + { url = "https://files.pythonhosted.org/packages/ce/9c/4337f468ef0ab7a2e0887a9c9da0e58e2eada6fc6cbee637a4acd5dfd8a9/coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", size = 238824 }, + { url = "https://files.pythonhosted.org/packages/5e/09/3e94912b8dd37251377bb02727a33a67ee96b84bbbe092f132b401ca5dd9/coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", size = 209639 }, + { url = "https://files.pythonhosted.org/packages/01/69/d4f3a4101171f32bc5b3caec8ff94c2c60f700107a6aaef7244b2c166793/coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", size = 210428 }, + { url = "https://files.pythonhosted.org/packages/c2/4d/2dede4f7cb5a70fb0bb40a57627fddf1dbdc6b9c1db81f7c4dcdcb19e2f4/coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", size = 207039 }, + { url = "https://files.pythonhosted.org/packages/3f/f9/d86368ae8c79e28f1fb458ebc76ae9ff3e8bd8069adc24e8f2fed03c58b7/coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", size = 207298 }, + { url = "https://files.pythonhosted.org/packages/64/c5/b4cc3c3f64622c58fbfd4d8b9a7a8ce9d355f172f91fcabbba1f026852f6/coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", size = 239813 }, + { url = "https://files.pythonhosted.org/packages/8a/86/14c42e60b70a79b26099e4d289ccdfefbc68624d096f4481163085aa614c/coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", size = 236959 }, + { url = "https://files.pythonhosted.org/packages/7f/f8/4436a643631a2fbab4b44d54f515028f6099bfb1cd95b13cfbf701e7f2f2/coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", size = 238950 }, + { url = "https://files.pythonhosted.org/packages/49/50/1571810ddd01f99a0a8be464a4ac8b147f322cd1e8e296a1528984fc560b/coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", size = 238610 }, + { url = "https://files.pythonhosted.org/packages/f3/8c/6312d241fe7cbd1f0cade34a62fea6f333d1a261255d76b9a87074d8703c/coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", size = 236697 }, + { url = "https://files.pythonhosted.org/packages/ce/5f/fef33dfd05d87ee9030f614c857deb6df6556b8f6a1c51bbbb41e24ee5ac/coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", size = 238541 }, + { url = "https://files.pythonhosted.org/packages/a9/64/6a984b6e92e1ea1353b7ffa08e27f707a5e29b044622445859200f541e8c/coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", size = 209707 }, + { url = "https://files.pythonhosted.org/packages/5c/60/ce5a9e942e9543783b3db5d942e0578b391c25cdd5e7f342d854ea83d6b7/coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", size = 210439 }, + { url = "https://files.pythonhosted.org/packages/78/53/6719677e92c308207e7f10561a1b16ab8b5c00e9328efc9af7cfd6fb703e/coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", size = 207784 }, + { url = "https://files.pythonhosted.org/packages/fa/dd/7054928930671fcb39ae6a83bb71d9ab5f0afb733172543ced4b09a115ca/coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", size = 208058 }, + { url = "https://files.pythonhosted.org/packages/b5/7d/fd656ddc2b38301927b9eb3aae3fe827e7aa82e691923ed43721fd9423c9/coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", size = 250772 }, + { url = "https://files.pythonhosted.org/packages/90/d0/eb9a3cc2100b83064bb086f18aedde3afffd7de6ead28f69736c00b7f302/coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", size = 246490 }, + { url = "https://files.pythonhosted.org/packages/45/44/3f64f38f6faab8a0cfd2c6bc6eb4c6daead246b97cf5f8fc23bf3788f841/coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", size = 248848 }, + { url = "https://files.pythonhosted.org/packages/5d/11/4c465a5f98656821e499f4b4619929bd5a34639c466021740ecdca42aa30/coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", size = 248340 }, + { url = "https://files.pythonhosted.org/packages/f1/96/ebecda2d016cce9da812f404f720ca5df83c6b29f65dc80d2000d0078741/coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", size = 246229 }, + { url = "https://files.pythonhosted.org/packages/16/d9/3d820c00066ae55d69e6d0eae11d6149a5ca7546de469ba9d597f01bf2d7/coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", size = 247510 }, + { url = "https://files.pythonhosted.org/packages/8f/c3/4fa1eb412bb288ff6bfcc163c11700ff06e02c5fad8513817186e460ed43/coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", size = 210353 }, + { url = "https://files.pythonhosted.org/packages/7e/77/03fc2979d1538884d921c2013075917fc927f41cd8526909852fe4494112/coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", size = 211502 }, ] [[package]] @@ -266,20 +281,20 @@ wheels = [ [[package]] name = "dill" -version = "0.3.8" +version = "0.3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847 } +sdist = { url = "https://files.pythonhosted.org/packages/70/43/86fe3f9e130c4137b0f1b50784dd70a5087b911fe07fa81e53e0c4c47fea/dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c", size = 187000 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252 }, + { url = "https://files.pythonhosted.org/packages/46/d1/e73b6ad76f0b1fb7f23c35c6d95dbc506a9c8804f43dda8cb5b0fa6331fd/dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a", size = 119418 }, ] [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/91/e2df406fb4efacdf46871c25cde65d3c6ee5e173b7e5a4547a47bae91920/distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64", size = 609931 } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", size = 468850 }, + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, ] [[package]] @@ -298,53 +313,68 @@ wheels = [ [[package]] name = "filelock" -version = "3.16.0" +version = "3.16.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e6/76/3981447fd369539aba35797db99a8e2ff7ed01d9aa63e9344a31658b8d81/filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec", size = 18008 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/95/f9310f35376024e1086c59cbb438d319fc9a4ef853289ce7c661539edbd4/filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609", size = 16170 }, + { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] [[package]] name = "frozenlist" -version = "1.4.1" +version = "1.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/3d/2102257e7acad73efc4a0c306ad3953f68c504c16982bbdfee3ad75d8085/frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", size = 37820 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/db/4cf37556a735bcdb2582f2c3fa286aefde2322f92d3141e087b8aeb27177/frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae", size = 93937 }, - { url = "https://files.pythonhosted.org/packages/46/03/69eb64642ca8c05f30aa5931d6c55e50b43d0cd13256fdd01510a1f85221/frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb", size = 53656 }, - { url = "https://files.pythonhosted.org/packages/3f/ab/c543c13824a615955f57e082c8a5ee122d2d5368e80084f2834e6f4feced/frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b", size = 51868 }, - { url = "https://files.pythonhosted.org/packages/a9/b8/438cfd92be2a124da8259b13409224d9b19ef8f5a5b2507174fc7e7ea18f/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86", size = 280652 }, - { url = "https://files.pythonhosted.org/packages/54/72/716a955521b97a25d48315c6c3653f981041ce7a17ff79f701298195bca3/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480", size = 286739 }, - { url = "https://files.pythonhosted.org/packages/65/d8/934c08103637567084568e4d5b4219c1016c60b4d29353b1a5b3587827d6/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09", size = 289447 }, - { url = "https://files.pythonhosted.org/packages/70/bb/d3b98d83ec6ef88f9bd63d77104a305d68a146fd63a683569ea44c3085f6/frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a", size = 265466 }, - { url = "https://files.pythonhosted.org/packages/0b/f2/b8158a0f06faefec33f4dff6345a575c18095a44e52d4f10c678c137d0e0/frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd", size = 281530 }, - { url = "https://files.pythonhosted.org/packages/ea/a2/20882c251e61be653764038ece62029bfb34bd5b842724fff32a5b7a2894/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6", size = 281295 }, - { url = "https://files.pythonhosted.org/packages/4c/f9/8894c05dc927af2a09663bdf31914d4fb5501653f240a5bbaf1e88cab1d3/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1", size = 268054 }, - { url = "https://files.pythonhosted.org/packages/37/ff/a613e58452b60166507d731812f3be253eb1229808e59980f0405d1eafbf/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b", size = 286904 }, - { url = "https://files.pythonhosted.org/packages/cc/6e/0091d785187f4c2020d5245796d04213f2261ad097e0c1cf35c44317d517/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e", size = 290754 }, - { url = "https://files.pythonhosted.org/packages/a5/c2/e42ad54bae8bcffee22d1e12a8ee6c7717f7d5b5019261a8c861854f4776/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8", size = 282602 }, - { url = "https://files.pythonhosted.org/packages/b6/61/56bad8cb94f0357c4bc134acc30822e90e203b5cb8ff82179947de90c17f/frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89", size = 44063 }, - { url = "https://files.pythonhosted.org/packages/3e/dc/96647994a013bc72f3d453abab18340b7f5e222b7b7291e3697ca1fcfbd5/frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5", size = 50452 }, - { url = "https://files.pythonhosted.org/packages/83/10/466fe96dae1bff622021ee687f68e5524d6392b0a2f80d05001cd3a451ba/frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", size = 11552 }, +sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, + { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, + { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, + { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, + { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, + { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, + { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, + { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, + { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, + { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, + { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, + { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, + { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, + { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, + { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, + { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, + { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, + { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, + { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, + { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, + { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, + { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, + { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, + { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, + { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, + { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, + { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, + { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, + { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, ] [[package]] name = "identify" -version = "2.6.0" +version = "2.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/32/f4/8e8f7db397a7ce20fbdeac5f25adaf567fc362472432938d25556008e03a/identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", size = 99116 } +sdist = { url = "https://files.pythonhosted.org/packages/02/79/7a520fc5011e02ca3f3285b5f6820eaf80443eb73e3733f73c02fb42ba0b/identify-2.6.2.tar.gz", hash = "sha256:fab5c716c24d7a789775228823797296a2994b075fb6080ac83a102772a98cbd", size = 99113 } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/6c/a4f39abe7f19600b74528d0c717b52fff0b300bb0161081510d39c53cb00/identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0", size = 98962 }, + { url = "https://files.pythonhosted.org/packages/e0/86/c4395700f3c5475424fb5c41e20c16be28d10c904aee4d005ba3217fc8e7/identify-2.6.2-py2.py3-none-any.whl", hash = "sha256:c097384259f49e372f4ea00a19719d95ae27dd5ff0fd77ad630aa891306b82f3", size = 98982 }, ] [[package]] name = "idna" -version = "3.8" +version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/e349c5e6d4543326c6883ee9491e3921e0d07b55fdf3cce184b40d63e72a/idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603", size = 189467 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", size = 66894 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] @@ -456,47 +486,49 @@ wheels = [ [[package]] name = "numpy" -version = "2.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/5f/9003bb3e632f2b58f5e3a3378902dcc73c5518070736c6740fe52454e8e1/numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", size = 18874860 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/11/c573ef66c004f991989c2c6218229d9003164525549409aec5ec9afc0285/numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", size = 20884403 }, - { url = "https://files.pythonhosted.org/packages/6b/6c/a9fbef5fd2f9685212af2a9e47485cde9357c3e303e079ccf85127516f2d/numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", size = 13493375 }, - { url = "https://files.pythonhosted.org/packages/34/f2/1316a6b08ad4c161d793abe81ff7181e9ae2e357a5b06352a383b9f8e800/numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", size = 5088823 }, - { url = "https://files.pythonhosted.org/packages/be/15/fabf78a6d4a10c250e87daf1cd901af05e71501380532ac508879cc46a7e/numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", size = 6619825 }, - { url = "https://files.pythonhosted.org/packages/9f/8a/76ddef3e621541ddd6984bc24d256a4e3422d036790cbbe449e6cad439ee/numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b", size = 13696705 }, - { url = "https://files.pythonhosted.org/packages/cb/22/2b840d297183916a95847c11f82ae11e248fa98113490b2357f774651e1d/numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", size = 16041649 }, - { url = "https://files.pythonhosted.org/packages/c7/e8/6f4825d8f576cfd5e4d6515b9eec22bd618868bdafc8a8c08b446dcb65f0/numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", size = 16409358 }, - { url = "https://files.pythonhosted.org/packages/bf/f8/5edf1105b0dc24fd66fc3e9e7f3bca3d920cde571caaa4375ec1566073c3/numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", size = 14172488 }, - { url = "https://files.pythonhosted.org/packages/f4/c2/dddca3e69a024d2f249a5b68698328163cbdafb7e65fbf6d36373bbabf12/numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", size = 6237195 }, - { url = "https://files.pythonhosted.org/packages/b7/98/5640a09daa3abf0caeaefa6e7bf0d10c0aa28a77c84e507d6a716e0e23df/numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", size = 12568082 }, - { url = "https://files.pythonhosted.org/packages/6b/9e/8bc6f133bc6d359ccc9ec051853aded45504d217685191f31f46d36b7065/numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", size = 20834810 }, - { url = "https://files.pythonhosted.org/packages/32/1b/429519a2fa28681814c511574017d35f3aab7136d554cc65f4c1526dfbf5/numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", size = 13507739 }, - { url = "https://files.pythonhosted.org/packages/25/18/c732d7dd9896d11e4afcd487ac65e62f9fa0495563b7614eb850765361fa/numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", size = 5074465 }, - { url = "https://files.pythonhosted.org/packages/3e/37/838b7ae9262c370ab25312bab365492016f11810ffc03ebebbd54670b669/numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", size = 6606418 }, - { url = "https://files.pythonhosted.org/packages/8b/b9/7ff3bfb71e316a5b43a124c4b7a5881ab12f3c32636014bef1f757f19dbd/numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", size = 13692464 }, - { url = "https://files.pythonhosted.org/packages/42/78/75bcf16e6737cd196ff7ecf0e1fd3f953293a34dff4fd93fb488e8308536/numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", size = 16037763 }, - { url = "https://files.pythonhosted.org/packages/23/99/36bf5ffe034d06df307bc783e25cf164775863166dcd878879559fe0379f/numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", size = 16410374 }, - { url = "https://files.pythonhosted.org/packages/7f/16/04c5dab564887d4cd31a9ed30e51467fa70d52a4425f5a9bd1eed5b3d34c/numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", size = 14169873 }, - { url = "https://files.pythonhosted.org/packages/09/e0/d1b5adbf1731886c4186c59a9fa208585df9452a43a2b60e79af7c649717/numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", size = 6234118 }, - { url = "https://files.pythonhosted.org/packages/d0/9c/2391ee6e9ebe77232ddcab29d92662b545e99d78c3eb3b4e26d59b9ca1ca/numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", size = 12561742 }, - { url = "https://files.pythonhosted.org/packages/38/0e/c4f754f9e73f9bb520e8bf418c646f2c4f70c5d5f2bc561e90f884593193/numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", size = 20858403 }, - { url = "https://files.pythonhosted.org/packages/32/fc/d69092b9171efa0cb8079577e71ce0cac0e08f917d33f6e99c916ed51d44/numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", size = 13519851 }, - { url = "https://files.pythonhosted.org/packages/14/2a/d7cf2cd9f15b23f623075546ea64a2c367cab703338ca22aaaecf7e704df/numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", size = 5115444 }, - { url = "https://files.pythonhosted.org/packages/8e/00/e87b2cb4afcecca3b678deefb8fa53005d7054f3b5c39596e5554e5d98f8/numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", size = 6628903 }, - { url = "https://files.pythonhosted.org/packages/ab/9d/337ae8721b3beec48c3413d71f2d44b2defbf3c6f7a85184fc18b7b61f4a/numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", size = 13665945 }, - { url = "https://files.pythonhosted.org/packages/c0/90/ee8668e84c5d5cc080ef3beb622c016adf19ca3aa51afe9dbdcc6a9baf59/numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", size = 16023473 }, - { url = "https://files.pythonhosted.org/packages/38/a0/57c24b2131879183051dc698fbb53fd43b77c3fa85b6e6311014f2bc2973/numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", size = 16400624 }, - { url = "https://files.pythonhosted.org/packages/bb/4c/14a41eb5c9548c6cee6af0936eabfd985c69230ffa2f2598321431a9aa0a/numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", size = 14155072 }, +version = "2.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ca/1166b75c21abd1da445b97bf1fa2f14f423c6cfb4fc7c4ef31dccf9f6a94/numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", size = 20166090 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/f0/385eb9970309643cbca4fc6eebc8bb16e560de129c91258dfaa18498da8b/numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", size = 20849658 }, + { url = "https://files.pythonhosted.org/packages/54/4a/765b4607f0fecbb239638d610d04ec0a0ded9b4951c56dc68cef79026abf/numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", size = 13492258 }, + { url = "https://files.pythonhosted.org/packages/bd/a7/2332679479c70b68dccbf4a8eb9c9b5ee383164b161bee9284ac141fbd33/numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", size = 5090249 }, + { url = "https://files.pythonhosted.org/packages/c1/67/4aa00316b3b981a822c7a239d3a8135be2a6945d1fd11d0efb25d361711a/numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", size = 6621704 }, + { url = "https://files.pythonhosted.org/packages/5e/da/1a429ae58b3b6c364eeec93bf044c532f2ff7b48a52e41050896cf15d5b1/numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", size = 13606089 }, + { url = "https://files.pythonhosted.org/packages/9e/3e/3757f304c704f2f0294a6b8340fcf2be244038be07da4cccf390fa678a9f/numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", size = 16043185 }, + { url = "https://files.pythonhosted.org/packages/43/97/75329c28fea3113d00c8d2daf9bc5828d58d78ed661d8e05e234f86f0f6d/numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", size = 16410751 }, + { url = "https://files.pythonhosted.org/packages/ad/7a/442965e98b34e0ae9da319f075b387bcb9a1e0658276cc63adb8c9686f7b/numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", size = 14082705 }, + { url = "https://files.pythonhosted.org/packages/ac/b6/26108cf2cfa5c7e03fb969b595c93131eab4a399762b51ce9ebec2332e80/numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", size = 6239077 }, + { url = "https://files.pythonhosted.org/packages/a6/84/fa11dad3404b7634aaab50733581ce11e5350383311ea7a7010f464c0170/numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", size = 12566858 }, + { url = "https://files.pythonhosted.org/packages/4d/0b/620591441457e25f3404c8057eb924d04f161244cb8a3680d529419aa86e/numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", size = 20836263 }, + { url = "https://files.pythonhosted.org/packages/45/e1/210b2d8b31ce9119145433e6ea78046e30771de3fe353f313b2778142f34/numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", size = 13507771 }, + { url = "https://files.pythonhosted.org/packages/55/44/aa9ee3caee02fa5a45f2c3b95cafe59c44e4b278fbbf895a93e88b308555/numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", size = 5075805 }, + { url = "https://files.pythonhosted.org/packages/78/d6/61de6e7e31915ba4d87bbe1ae859e83e6582ea14c6add07c8f7eefd8488f/numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", size = 6608380 }, + { url = "https://files.pythonhosted.org/packages/3e/46/48bdf9b7241e317e6cf94276fe11ba673c06d1fdf115d8b4ebf616affd1a/numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", size = 13602451 }, + { url = "https://files.pythonhosted.org/packages/70/50/73f9a5aa0810cdccda9c1d20be3cbe4a4d6ea6bfd6931464a44c95eef731/numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", size = 16039822 }, + { url = "https://files.pythonhosted.org/packages/ad/cd/098bc1d5a5bc5307cfc65ee9369d0ca658ed88fbd7307b0d49fab6ca5fa5/numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", size = 16411822 }, + { url = "https://files.pythonhosted.org/packages/83/a2/7d4467a2a6d984549053b37945620209e702cf96a8bc658bc04bba13c9e2/numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", size = 14079598 }, + { url = "https://files.pythonhosted.org/packages/e9/6a/d64514dcecb2ee70bfdfad10c42b76cab657e7ee31944ff7a600f141d9e9/numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", size = 6236021 }, + { url = "https://files.pythonhosted.org/packages/bb/f9/12297ed8d8301a401e7d8eb6b418d32547f1d700ed3c038d325a605421a4/numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", size = 12560405 }, + { url = "https://files.pythonhosted.org/packages/a7/45/7f9244cd792e163b334e3a7f02dff1239d2890b6f37ebf9e82cbe17debc0/numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", size = 20859062 }, + { url = "https://files.pythonhosted.org/packages/b1/b4/a084218e7e92b506d634105b13e27a3a6645312b93e1c699cc9025adb0e1/numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", size = 13515839 }, + { url = "https://files.pythonhosted.org/packages/27/45/58ed3f88028dcf80e6ea580311dc3edefdd94248f5770deb980500ef85dd/numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", size = 5116031 }, + { url = "https://files.pythonhosted.org/packages/37/a8/eb689432eb977d83229094b58b0f53249d2209742f7de529c49d61a124a0/numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", size = 6629977 }, + { url = "https://files.pythonhosted.org/packages/42/a3/5355ad51ac73c23334c7caaed01adadfda49544f646fcbfbb4331deb267b/numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", size = 13575951 }, + { url = "https://files.pythonhosted.org/packages/c4/70/ea9646d203104e647988cb7d7279f135257a6b7e3354ea6c56f8bafdb095/numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", size = 16022655 }, + { url = "https://files.pythonhosted.org/packages/14/ce/7fc0612903e91ff9d0b3f2eda4e18ef9904814afcae5b0f08edb7f637883/numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", size = 16399902 }, + { url = "https://files.pythonhosted.org/packages/ef/62/1d3204313357591c913c32132a28f09a26357e33ea3c4e2fe81269e0dca1/numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", size = 14067180 }, + { url = "https://files.pythonhosted.org/packages/24/d7/78a40ed1d80e23a774cb8a34ae8a9493ba1b4271dde96e56ccdbab1620ef/numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", size = 6291907 }, + { url = "https://files.pythonhosted.org/packages/86/09/a5ab407bd7f5f5599e6a9261f964ace03a73e7c6928de906981c31c38082/numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", size = 12644098 }, ] [[package]] name = "packaging" -version = "24.1" +version = "24.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] @@ -548,11 +580,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.3.2" +version = "4.3.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/a0/d7cab8409cdc7d39b037c85ac46d92434fb6595432e069251b38e5c8dd0e/platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c", size = 21276 } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/8b/d497999c4017b80678017ddce745cf675489c110681ad3c84a55eddfd3e7/platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617", size = 18417 }, + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, ] [[package]] @@ -580,6 +612,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, ] +[[package]] +name = "propcache" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/4d/5e5a60b78dbc1d464f8a7bbaeb30957257afdc8512cbb9dfd5659304f5cd/propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", size = 40951 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/46/a41ca1097769fc548fc9216ec4c1471b772cc39720eb47ed7e38ef0006a9/propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", size = 80800 }, + { url = "https://files.pythonhosted.org/packages/75/4f/93df46aab9cc473498ff56be39b5f6ee1e33529223d7a4d8c0a6101a9ba2/propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", size = 46443 }, + { url = "https://files.pythonhosted.org/packages/0b/17/308acc6aee65d0f9a8375e36c4807ac6605d1f38074b1581bd4042b9fb37/propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", size = 45676 }, + { url = "https://files.pythonhosted.org/packages/65/44/626599d2854d6c1d4530b9a05e7ff2ee22b790358334b475ed7c89f7d625/propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", size = 246191 }, + { url = "https://files.pythonhosted.org/packages/f2/df/5d996d7cb18df076debae7d76ac3da085c0575a9f2be6b1f707fe227b54c/propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", size = 251791 }, + { url = "https://files.pythonhosted.org/packages/2e/6d/9f91e5dde8b1f662f6dd4dff36098ed22a1ef4e08e1316f05f4758f1576c/propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", size = 253434 }, + { url = "https://files.pythonhosted.org/packages/3c/e9/1b54b7e26f50b3e0497cd13d3483d781d284452c2c50dd2a615a92a087a3/propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", size = 248150 }, + { url = "https://files.pythonhosted.org/packages/a7/ef/a35bf191c8038fe3ce9a414b907371c81d102384eda5dbafe6f4dce0cf9b/propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", size = 233568 }, + { url = "https://files.pythonhosted.org/packages/97/d9/d00bb9277a9165a5e6d60f2142cd1a38a750045c9c12e47ae087f686d781/propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", size = 229874 }, + { url = "https://files.pythonhosted.org/packages/8e/78/c123cf22469bdc4b18efb78893e69c70a8b16de88e6160b69ca6bdd88b5d/propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", size = 225857 }, + { url = "https://files.pythonhosted.org/packages/31/1b/fd6b2f1f36d028820d35475be78859d8c89c8f091ad30e377ac49fd66359/propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", size = 227604 }, + { url = "https://files.pythonhosted.org/packages/99/36/b07be976edf77a07233ba712e53262937625af02154353171716894a86a6/propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", size = 238430 }, + { url = "https://files.pythonhosted.org/packages/0d/64/5822f496c9010e3966e934a011ac08cac8734561842bc7c1f65586e0683c/propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", size = 244814 }, + { url = "https://files.pythonhosted.org/packages/fd/bd/8657918a35d50b18a9e4d78a5df7b6c82a637a311ab20851eef4326305c1/propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", size = 235922 }, + { url = "https://files.pythonhosted.org/packages/a8/6f/ec0095e1647b4727db945213a9f395b1103c442ef65e54c62e92a72a3f75/propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", size = 40177 }, + { url = "https://files.pythonhosted.org/packages/20/a2/bd0896fdc4f4c1db46d9bc361c8c79a9bf08ccc08ba054a98e38e7ba1557/propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", size = 44446 }, + { url = "https://files.pythonhosted.org/packages/a8/a7/5f37b69197d4f558bfef5b4bceaff7c43cc9b51adf5bd75e9081d7ea80e4/propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", size = 78120 }, + { url = "https://files.pythonhosted.org/packages/c8/cd/48ab2b30a6b353ecb95a244915f85756d74f815862eb2ecc7a518d565b48/propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", size = 45127 }, + { url = "https://files.pythonhosted.org/packages/a5/ba/0a1ef94a3412aab057bd996ed5f0ac7458be5bf469e85c70fa9ceb43290b/propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", size = 44419 }, + { url = "https://files.pythonhosted.org/packages/b4/6c/ca70bee4f22fa99eacd04f4d2f1699be9d13538ccf22b3169a61c60a27fa/propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", size = 229611 }, + { url = "https://files.pythonhosted.org/packages/19/70/47b872a263e8511ca33718d96a10c17d3c853aefadeb86dc26e8421184b9/propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", size = 234005 }, + { url = "https://files.pythonhosted.org/packages/4f/be/3b0ab8c84a22e4a3224719099c1229ddfdd8a6a1558cf75cb55ee1e35c25/propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", size = 237270 }, + { url = "https://files.pythonhosted.org/packages/04/d8/f071bb000d4b8f851d312c3c75701e586b3f643fe14a2e3409b1b9ab3936/propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", size = 231877 }, + { url = "https://files.pythonhosted.org/packages/93/e7/57a035a1359e542bbb0a7df95aad6b9871ebee6dce2840cb157a415bd1f3/propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", size = 217848 }, + { url = "https://files.pythonhosted.org/packages/f0/93/d1dea40f112ec183398fb6c42fde340edd7bab202411c4aa1a8289f461b6/propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", size = 216987 }, + { url = "https://files.pythonhosted.org/packages/62/4c/877340871251145d3522c2b5d25c16a1690ad655fbab7bb9ece6b117e39f/propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", size = 212451 }, + { url = "https://files.pythonhosted.org/packages/7c/bb/a91b72efeeb42906ef58ccf0cdb87947b54d7475fee3c93425d732f16a61/propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", size = 212879 }, + { url = "https://files.pythonhosted.org/packages/9b/7f/ee7fea8faac57b3ec5d91ff47470c6c5d40d7f15d0b1fccac806348fa59e/propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", size = 222288 }, + { url = "https://files.pythonhosted.org/packages/ff/d7/acd67901c43d2e6b20a7a973d9d5fd543c6e277af29b1eb0e1f7bd7ca7d2/propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", size = 228257 }, + { url = "https://files.pythonhosted.org/packages/8d/6f/6272ecc7a8daad1d0754cfc6c8846076a8cb13f810005c79b15ce0ef0cf2/propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", size = 221075 }, + { url = "https://files.pythonhosted.org/packages/7c/bd/c7a6a719a6b3dd8b3aeadb3675b5783983529e4a3185946aa444d3e078f6/propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", size = 39654 }, + { url = "https://files.pythonhosted.org/packages/88/e7/0eef39eff84fa3e001b44de0bd41c7c0e3432e7648ffd3d64955910f002d/propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", size = 43705 }, + { url = "https://files.pythonhosted.org/packages/3d/b6/e6d98278f2d49b22b4d033c9f792eda783b9ab2094b041f013fc69bcde87/propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", size = 11603 }, +] + [[package]] name = "pycountry" version = "24.6.1" @@ -672,12 +745,15 @@ wheels = [ [[package]] name = "pywin32" -version = "306" +version = "308" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/91/17e016d5923e178346aabda3dfec6629d1a26efe587d19667542105cf0a6/pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b", size = 8507705 }, - { url = "https://files.pythonhosted.org/packages/83/1c/25b79fc3ec99b19b0a0730cc47356f7e2959863bf9f3cd314332bddb4f68/pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e", size = 9227429 }, - { url = "https://files.pythonhosted.org/packages/1c/43/e3444dc9a12f8365d9603c2145d16bf0a2f8180f343cf87be47f5579e547/pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040", size = 10388145 }, + { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, + { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, + { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, + { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, + { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, + { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, ] [[package]] @@ -723,11 +799,11 @@ wheels = [ [[package]] name = "svg-py" -version = "1.4.3" +version = "1.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/73/1e24a357536ca4e0af3172d83d3d3ccaa821c87c5f69cbf4052b5a99c39a/svg_py-1.4.3.tar.gz", hash = "sha256:d03d87549fb12e1ddcf367420fc196703d725e50b81c44ec2388e0530fc8bab3", size = 40241 } +sdist = { url = "https://files.pythonhosted.org/packages/b9/6d/4680d284924d66082b39e7508b70346a8132c06a4bac497ef4d2c05430ec/svg_py-1.5.0.tar.gz", hash = "sha256:a036d0118176c2498601fab33b9b68dd9754e6a5fa12e4d36cce071b307b5c11", size = 40710 } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/b2/d8a57401dd954103c14cecf442ecc143e3b8d10a7d822d9904f34b252ae7/svg_py-1.4.3-py3-none-any.whl", hash = "sha256:f76db56ff5439294b32e55f4151eb4b4fcad376dfbad70a989e29a5391994d76", size = 13482 }, + { url = "https://files.pythonhosted.org/packages/51/2b/a541bed029de9ac6a558d3eeeeb0fff5046687651e61d38df3dc43f48e2a/svg_py-1.5.0-py3-none-any.whl", hash = "sha256:5c467efd5a43e8df4dd6f6d078063f195a04966721d36c43d62f5d7529f908d1", size = 13443 }, ] [[package]] @@ -786,66 +862,69 @@ wheels = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168", size = 292266 } +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", size = 121444 }, + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, ] [[package]] name = "virtualenv" -version = "20.26.4" +version = "20.27.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/8a/134f65c3d6066153b84fc176c58877acd8165ed0b79a149ff50502597284/virtualenv-20.26.4.tar.gz", hash = "sha256:c17f4e0f3e6036e9f26700446f85c76ab11df65ff6d8a9cbfad9f71aabfcf23c", size = 9385017 } +sdist = { url = "https://files.pythonhosted.org/packages/8c/b3/7b6a79c5c8cf6d90ea681310e169cf2db2884f4d583d16c6e1d5a75a4e04/virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba", size = 6491145 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/ea/12f774a18b55754c730c8383dad8f10d7b87397d1cb6b2b944c87381bb3b/virtualenv-20.26.4-py3-none-any.whl", hash = "sha256:48f2695d9809277003f30776d155615ffc11328e6a0a8c1f0ec80188d7874a55", size = 6013327 }, + { url = "https://files.pythonhosted.org/packages/ae/92/78324ff89391e00c8f4cf6b8526c41c6ef36b4ea2d2c132250b1a6fc2b8d/virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4", size = 3117838 }, ] [[package]] name = "yarl" -version = "1.11.1" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e4/3d/4924f9ed49698bac5f112bc9b40aa007bbdcd702462c1df3d2e1383fb158/yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53", size = 162095 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/05/379002019a0c9d5dc0c4cc6f71e324ea43461ae6f58e94ee87e07b8ffa90/yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0", size = 189044 }, - { url = "https://files.pythonhosted.org/packages/23/d5/e62cfba5ceaaf92ee4f9af6f9c9ab2f2b47d8ad48687fa69570a93b0872c/yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265", size = 114867 }, - { url = "https://files.pythonhosted.org/packages/b1/10/6abc0bd7e7fe7c6b9b9e9ce0ff558912c9ecae65a798f5442020ef9e4177/yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867", size = 112737 }, - { url = "https://files.pythonhosted.org/packages/37/a5/ad026afde5efe1849f4f55bd9f9a2cb5b006511b324db430ae5336104fb3/yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd", size = 482887 }, - { url = "https://files.pythonhosted.org/packages/f8/82/b8bee972617b800319b4364cfcd69bfaf7326db052e91a56e63986cc3e05/yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef", size = 498635 }, - { url = "https://files.pythonhosted.org/packages/af/ad/ac688503b134e02e8505415f0b8e94dc8e92a97e82abdd9736658389b5ae/yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8", size = 496198 }, - { url = "https://files.pythonhosted.org/packages/ce/f2/b6cae0ad1afed6e95f82ab2cb9eb5b63e41f1463ece2a80c39d80cf6167a/yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870", size = 489068 }, - { url = "https://files.pythonhosted.org/packages/c8/f4/355e69b5563154b40550233ffba8f6099eac0c99788600191967763046cf/yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2", size = 468286 }, - { url = "https://files.pythonhosted.org/packages/26/3d/3c37f3f150faf87b086f7915724f2fcb9ff2f7c9d3f6c0f42b7722bd9b77/yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/94/ee/d591abbaea3b14e0f68bdec5cbcb75f27107190c51889d518bafe5d8f120/yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa", size = 484947 }, - { url = "https://files.pythonhosted.org/packages/57/70/ad1c65a13315f03ff0c63fd6359dd40d8198e2a42e61bf86507602a0364f/yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff", size = 505610 }, - { url = "https://files.pythonhosted.org/packages/4c/8c/6086dec0f8d7df16d136b38f373c49cf3d2fb94464e5a10bf788b36f3f54/yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239", size = 515951 }, - { url = "https://files.pythonhosted.org/packages/49/79/e0479e9a3bbb7bdcb82779d89711b97cea30902a4bfe28d681463b7071ce/yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45", size = 501273 }, - { url = "https://files.pythonhosted.org/packages/8e/85/eab962453e81073276b22f3d1503dffe6bfc3eb9cd0f31899970de05d490/yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447", size = 101139 }, - { url = "https://files.pythonhosted.org/packages/5d/de/618b3e5cab10af8a2ed3eb625dac61c1d16eb155d1f56f9fdb3500786c12/yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639", size = 110504 }, - { url = "https://files.pythonhosted.org/packages/07/b7/948e4f427817e0178f3737adf6712fea83f76921e11e2092f403a8a9dc4a/yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c", size = 185061 }, - { url = "https://files.pythonhosted.org/packages/f3/67/8d91ad79a3b907b4fef27fafa912350554443ba53364fff3c347b41105cb/yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e", size = 113056 }, - { url = "https://files.pythonhosted.org/packages/a1/77/6b2348a753702fa87f435cc33dcec21981aaca8ef98a46566a7b29940b4a/yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93", size = 110958 }, - { url = "https://files.pythonhosted.org/packages/8e/3e/6eadf32656741549041f549a392f3b15245d3a0a0b12a9bc22bd6b69621f/yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d", size = 470326 }, - { url = "https://files.pythonhosted.org/packages/3d/a4/1b641a8c7899eeaceec45ff105a2e7206ec0eb0fb9d86403963cc8521c5e/yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7", size = 484778 }, - { url = "https://files.pythonhosted.org/packages/8a/f5/80c142f34779a5c26002b2bf1f73b9a9229aa9e019ee6f9fd9d3e9704e78/yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089", size = 485568 }, - { url = "https://files.pythonhosted.org/packages/f8/f2/6b40ffea2d5d3a11f514ab23c30d14f52600c36a3210786f5974b6701bb8/yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5", size = 477801 }, - { url = "https://files.pythonhosted.org/packages/4c/1a/e60c116f3241e4842ed43c104eb2751abe02f6bac0301cdae69e4fda9c3a/yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5", size = 455361 }, - { url = "https://files.pythonhosted.org/packages/b9/98/fe0aeee425a4bc5cd3ed86e867661d2bfa782544fa07a8e3dcd97d51ae3d/yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786", size = 473893 }, - { url = "https://files.pythonhosted.org/packages/6b/9b/677455d146bd3cecd350673f0e4bb28854af66726493ace3b640e9c5552b/yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318", size = 476407 }, - { url = "https://files.pythonhosted.org/packages/33/ca/ce85766247a9a9b56654428fb78a3e14ea6947a580a9c4e891b3aa7da322/yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82", size = 490848 }, - { url = "https://files.pythonhosted.org/packages/6d/d6/717f0f19bcf2c4705ad95550b4b6319a0d8d1d4f137ea5e223207f00df50/yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a", size = 501084 }, - { url = "https://files.pythonhosted.org/packages/14/b5/b93c70d9a462b802c8df65c64b85f49d86b4ba70c393fbad95cf7ec053cb/yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da", size = 491776 }, - { url = "https://files.pythonhosted.org/packages/03/0f/5a52eaa402a6a93265ba82f42c6f6085ccbe483e1b058ad34207e75812b1/yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979", size = 485250 }, - { url = "https://files.pythonhosted.org/packages/dd/97/946d26a5d82706a6769399cabd472c59f9a3227ce1432afb4739b9c29572/yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367", size = 492590 }, - { url = "https://files.pythonhosted.org/packages/5b/b3/841f7d706137bdc8b741c6826106b6f703155076d58f1830f244da857451/yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38", size = 38648 }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/9c/9c0a9bfa683fc1be7fdcd9687635151544d992cccd48892dc5e0a5885a29/yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", size = 178163 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/af/e25615c7920396219b943b9ff8b34636ae3e1ad30777649371317d7f05f8/yarl-1.17.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61", size = 141839 }, + { url = "https://files.pythonhosted.org/packages/83/5e/363d9de3495c7c66592523f05d21576a811015579e0c87dd38c7b5788afd/yarl-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d", size = 94125 }, + { url = "https://files.pythonhosted.org/packages/e3/a2/b65447626227ebe36f18f63ac551790068bf42c69bb22dfa3ae986170728/yarl-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139", size = 92048 }, + { url = "https://files.pythonhosted.org/packages/a1/f5/2ef86458446f85cde10582054fd5113495ef8ce8477da35aaaf26d2970ef/yarl-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5", size = 331472 }, + { url = "https://files.pythonhosted.org/packages/f3/6b/1ba79758ba352cdf2ad4c20cab1b982dd369aa595bb0d7601fc89bf82bee/yarl-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac", size = 341260 }, + { url = "https://files.pythonhosted.org/packages/2d/41/4e07c2afca3f9ed3da5b0e38d43d0280d9b624a3d5c478c425e5ce17775c/yarl-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463", size = 340882 }, + { url = "https://files.pythonhosted.org/packages/c3/c0/cd8e94618983c1b811af082e1a7ad7764edb3a6af2bc6b468e0e686238ba/yarl-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147", size = 336648 }, + { url = "https://files.pythonhosted.org/packages/ac/fc/73ec4340d391ffbb8f34eb4c55429784ec9f5bd37973ce86d52d67135418/yarl-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7", size = 325019 }, + { url = "https://files.pythonhosted.org/packages/57/48/da3ebf418fc239d0a156b3bdec6b17a5446f8d2dea752299c6e47b143a85/yarl-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685", size = 342841 }, + { url = "https://files.pythonhosted.org/packages/5d/79/107272745a470a8167924e353a5312eb52b5a9bb58e22686adc46c94f7ec/yarl-1.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172", size = 341433 }, + { url = "https://files.pythonhosted.org/packages/30/9c/6459668b3b8dcc11cd061fc53e12737e740fb6b1575b49c84cbffb387b3a/yarl-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7", size = 344927 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/93a17ed733aca8164fc3a01cb7d47b3f08854ce4f957cce67a6afdb388a0/yarl-1.17.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da", size = 355732 }, + { url = "https://files.pythonhosted.org/packages/9a/63/ead2ed6aec3c59397e135cadc66572330325a0c24cd353cd5c94f5e63463/yarl-1.17.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c", size = 362123 }, + { url = "https://files.pythonhosted.org/packages/89/bf/f6b75b4c2fcf0e7bb56edc0ed74e33f37fac45dc40e5a52a3be66b02587a/yarl-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199", size = 356355 }, + { url = "https://files.pythonhosted.org/packages/45/1f/50a0257cd07eef65c8c65ad6a21f5fb230012d659e021aeb6ac8a7897bf6/yarl-1.17.1-cp312-cp312-win32.whl", hash = "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96", size = 83279 }, + { url = "https://files.pythonhosted.org/packages/bc/82/fafb2c1268d63d54ec08b3a254fbe51f4ef098211501df646026717abee3/yarl-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df", size = 89590 }, + { url = "https://files.pythonhosted.org/packages/06/1e/5a93e3743c20eefbc68bd89334d9c9f04f3f2334380f7bbf5e950f29511b/yarl-1.17.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488", size = 139974 }, + { url = "https://files.pythonhosted.org/packages/a1/be/4e0f6919013c7c5eaea5c31811c551ccd599d2fc80aa3dd6962f1bbdcddd/yarl-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374", size = 93364 }, + { url = "https://files.pythonhosted.org/packages/73/f0/650f994bc491d0cb85df8bb45392780b90eab1e175f103a5edc61445ff67/yarl-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac", size = 91177 }, + { url = "https://files.pythonhosted.org/packages/f3/e8/9945ed555d14b43ede3ae8b1bd73e31068a694cad2b9d3cad0a28486c2eb/yarl-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170", size = 333086 }, + { url = "https://files.pythonhosted.org/packages/a6/c0/7d167e48e14d26639ca066825af8da7df1d2fcdba827e3fd6341aaf22a3b/yarl-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8", size = 343661 }, + { url = "https://files.pythonhosted.org/packages/fa/81/80a266517531d4e3553aecd141800dbf48d02e23ebd52909e63598a80134/yarl-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938", size = 345196 }, + { url = "https://files.pythonhosted.org/packages/b0/77/6adc482ba7f2dc6c0d9b3b492e7cd100edfac4cfc3849c7ffa26fd7beb1a/yarl-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e", size = 338743 }, + { url = "https://files.pythonhosted.org/packages/6d/cc/f0c4c0b92ff3ada517ffde2b127406c001504b225692216d969879ada89a/yarl-1.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556", size = 326719 }, + { url = "https://files.pythonhosted.org/packages/18/3b/7bfc80d3376b5fa162189993a87a5a6a58057f88315bd0ea00610055b57a/yarl-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67", size = 345826 }, + { url = "https://files.pythonhosted.org/packages/2e/66/cf0b0338107a5c370205c1a572432af08f36ca12ecce127f5b558398b4fd/yarl-1.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8", size = 340335 }, + { url = "https://files.pythonhosted.org/packages/2f/52/b084b0eec0fd4d2490e1d33ace3320fad704c5f1f3deaa709f929d2d87fc/yarl-1.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3", size = 345301 }, + { url = "https://files.pythonhosted.org/packages/ef/38/9e2036d948efd3bafcdb4976cb212166fded76615f0dfc6c1492c4ce4784/yarl-1.17.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0", size = 354205 }, + { url = "https://files.pythonhosted.org/packages/81/c1/13dfe1e70b86811733316221c696580725ceb1c46d4e4db852807e134310/yarl-1.17.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299", size = 360501 }, + { url = "https://files.pythonhosted.org/packages/91/87/756e05c74cd8bf9e71537df4a2cae7e8211a9ebe0d2350a3e26949e1e41c/yarl-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258", size = 359452 }, + { url = "https://files.pythonhosted.org/packages/06/b2/b2bb09c1e6d59e1c9b1b36a86caa473e22c3dbf26d1032c030e9bfb554dc/yarl-1.17.1-cp313-cp313-win32.whl", hash = "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2", size = 308904 }, + { url = "https://files.pythonhosted.org/packages/f3/27/f084d9a5668853c1f3b246620269b14ee871ef3c3cc4f3a1dd53645b68ec/yarl-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda", size = 314637 }, + { url = "https://files.pythonhosted.org/packages/52/ad/1fe7ff5f3e8869d4c5070f47b96bac2b4d15e67c100a8278d8e7876329fc/yarl-1.17.1-py3-none-any.whl", hash = "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06", size = 44352 }, ] From 1edfda03f2459709d14330fe7cab5051505af943 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 14:11:49 +0100 Subject: [PATCH 023/138] [pre-commit.ci] pre-commit autoupdate (#590) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 62868965..335327f0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.7.1 + rev: v0.7.2 hooks: - id: ruff args: From bfd7147b3f8f3c7700404b889c81fd2e49ebe4db Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:48:26 +0100 Subject: [PATCH 024/138] Use SPDX license expression (#594) --- pyproject.toml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f2c391b8..af07c341 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "deebot-client" -license = {text = "GPL-3.0"} +license = "GPL-3.0-or-later" description = "Deebot client library in python 3" readme = "README.md" authors = [ @@ -14,7 +14,6 @@ keywords = ["home", "automation", "homeassistant", "vacuum", "robot", "deebot classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Programming Language :: Python :: 3.12", "Topic :: Home Automation", "Topic :: Software Development :: Libraries :: Python Modules", @@ -189,4 +188,3 @@ overgeneral-exceptions = [ "builtins.BaseException", "builtins.Exception", ] - From 1920f908b98fd9086644264ad1f49b14c54dc1d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 11:03:04 +0100 Subject: [PATCH 025/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20astral-sh?= =?UTF-8?q?/setup-uv=20action=20to=20v4=20(#599)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 4 ++-- .github/workflows/python-publish.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a4f5621..31825b71 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@v4 - name: 🏗 Install uv - uses: astral-sh/setup-uv@v3 + uses: astral-sh/setup-uv@v4 with: enable-cache: true cache-dependency-glob: "uv.lock" @@ -55,7 +55,7 @@ jobs: uses: actions/checkout@v4 - name: 🏗 Install uv - uses: astral-sh/setup-uv@v3 + uses: astral-sh/setup-uv@v4 with: enable-cache: true cache-dependency-glob: "uv.lock" diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index b23011a9..ec494757 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -26,7 +26,7 @@ jobs: - name: ⤵️ Check out code from GitHub uses: actions/checkout@v4.2.2 - name: 🏗 Set up uv - uses: astral-sh/setup-uv@v3 + uses: astral-sh/setup-uv@v4 with: enable-cache: true - name: 🏗 Set package version From 159d05de1e60baf84f641451bc95202cbd832b49 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 11:05:19 +0100 Subject: [PATCH 026/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20codecov/c?= =?UTF-8?q?odecov-action=20action=20to=20v5=20(#596)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31825b71..f0e30ba0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,7 +71,7 @@ jobs: run: uv run --frozen pytest tests --cov=./ --cov-report=xml - name: Upload coverage to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true From d7ed9311ef19e70c8e6279b1662fd851c300b862 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 11:05:32 +0100 Subject: [PATCH 027/138] [pre-commit.ci] pre-commit autoupdate (#593) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 335327f0..c948d610 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.7.2 + rev: v0.7.4 hooks: - id: ruff args: From 355d1236ea37697c44b43a05f6cdccbb07552e08 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 11:11:20 +0100 Subject: [PATCH 028/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20python=20?= =?UTF-8?q?Docker=20tag=20to=20v3.13=20(#583)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .python-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.python-version b/.python-version index fdcfcfdf..3a4f41ef 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.12 \ No newline at end of file +3.13 \ No newline at end of file From 3b3c15654142a278f417abd93b2154869ffeca30 Mon Sep 17 00:00:00 2001 From: mimoser89 Date: Mon, 25 Nov 2024 05:11:42 -0500 Subject: [PATCH 029/138] Add Deebot T30 Pro Omni (#597) Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/4vhygi.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/4vhygi.py diff --git a/deebot_client/hardware/deebot/4vhygi.py b/deebot_client/hardware/deebot/4vhygi.py new file mode 120000 index 00000000..0f26ba6a --- /dev/null +++ b/deebot_client/hardware/deebot/4vhygi.py @@ -0,0 +1 @@ +p1jij8.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 56c192dd..ac8a370d 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -284,6 +284,7 @@ def test_all_models_loaded() -> None: assert list(DEVICES) == [ "2ap5uq", "2o4lnm", + "4vhygi", "55aiho", "5xu9h3", "626v6g", From ec366b2462a8476a2d1a1e8d22499d3207fca77f Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 25 Nov 2024 11:53:06 +0100 Subject: [PATCH 030/138] Remove fallback and return unsupported devices too (#600) --- .github/workflows/ci.yml | 1 + .pre-commit-config.yaml | 2 +- README.md | 2 +- deebot_client/api_client.py | 40 ++++- deebot_client/hardware/deebot/__init__.py | 10 +- deebot_client/hardware/deebot/fallback.py | 184 ---------------------- pyproject.toml | 3 +- tests/conftest.py | 6 +- tests/hardware/test_init.py | 45 +----- 9 files changed, 49 insertions(+), 244 deletions(-) delete mode 100644 deebot_client/hardware/deebot/fallback.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0e30ba0..8f1d95d1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,6 +50,7 @@ jobs: matrix: python-version: - "3.12" + - "3.13" steps: - name: ⤵️ Checkout repository uses: actions/checkout@v4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c948d610..392040d9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ ci: - verifyNoGetLogger default_language_version: - python: python3.12 + python: python3.13 repos: - repo: https://github.com/astral-sh/ruff-pre-commit diff --git a/README.md b/README.md index 79d7592e..ae5a902d 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ async def main(): devices_ = await api_client.get_devices() - bot = Device(devices_[0], authenticator) + bot = Device(devices_.mqtt[0], authenticator) mqtt_config = create_mqtt_config(device_id=device_id, country=country) mqtt = MqttClient(mqtt_config, authenticator) diff --git a/deebot_client/api_client.py b/deebot_client/api_client.py index 987ff99c..f767a87b 100644 --- a/deebot_client/api_client.py +++ b/deebot_client/api_client.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio +from dataclasses import dataclass from typing import TYPE_CHECKING, Any from deebot_client.hardware.deebot import get_static_device_info @@ -22,6 +23,15 @@ _LOGGER = get_logger(__name__) +@dataclass(frozen=True) +class Devices: + """Devices.""" + + mqtt: list[DeviceInfo] + xmpp: list[ApiDeviceInfo] + not_supported: list[ApiDeviceInfo] + + class ApiClient: """Api client.""" @@ -46,7 +56,7 @@ async def _get_devices(self, path: str, command: str) -> dict[str, ApiDeviceInfo return result - async def get_devices(self) -> list[DeviceInfo | ApiDeviceInfo]: + async def get_devices(self) -> Devices: """Get compatible devices.""" try: async with asyncio.TaskGroup() as tg: @@ -62,21 +72,35 @@ async def get_devices(self) -> list[DeviceInfo | ApiDeviceInfo]: api_devices = task_device_list.result() api_devices.update(task_global_device_list.result()) - devices: list[DeviceInfo | ApiDeviceInfo] = [] + mqtt: list[DeviceInfo] = [] + xmpp: list[ApiDeviceInfo] = [] + not_supported: list[ApiDeviceInfo] = [] for device in api_devices.values(): match device.get("company"): case "eco-ng": - static_device_info = await get_static_device_info(device["class"]) - devices.append(DeviceInfo(device, static_device_info)) + if static_device_info := await get_static_device_info( + device["class"] + ): + mqtt.append(DeviceInfo(device, static_device_info)) + else: + _LOGGER.warning( + 'Device class "%s" not recognized. Please add support for it: %s', + device["class"], + device, + ) + not_supported.append(device) case "eco-legacy": - devices.append(device) + xmpp.append(device) case _: - _LOGGER.debug("Skipping device as it is not supported: %s", device) + _LOGGER.warning( + "Skipping device as it is not supported: %s", device + ) + not_supported.append(device) - if not devices: + if not mqtt and not xmpp and not not_supported: _LOGGER.warning("No devices returned by the api. Please check the logs.") - return devices + return Devices(mqtt, xmpp, not_supported) async def get_product_iot_map(self) -> dict[str, Any]: """Get product iot map.""" diff --git a/deebot_client/hardware/deebot/__init__.py b/deebot_client/hardware/deebot/__init__.py index 30eca3dd..b6d83c00 100644 --- a/deebot_client/hardware/deebot/__init__.py +++ b/deebot_client/hardware/deebot/__init__.py @@ -17,8 +17,6 @@ _LOGGER = get_logger(__name__) -FALLBACK = "fallback" - DEVICES: dict[str, StaticDeviceInfo] = {} @@ -28,7 +26,7 @@ def _load() -> None: importlib.import_module(full_package_name) -async def get_static_device_info(class_: str) -> StaticDeviceInfo: +async def get_static_device_info(class_: str) -> StaticDeviceInfo | None: """Get static device info for given class.""" if not DEVICES: await asyncio.get_event_loop().run_in_executor(None, _load) @@ -37,8 +35,4 @@ async def get_static_device_info(class_: str) -> StaticDeviceInfo: _LOGGER.debug("Capabilities found for %s", class_) return device - _LOGGER.info( - "No capabilities found for %s, therefore not all features are available. trying to use fallback...", - class_, - ) - return DEVICES[FALLBACK] + return None diff --git a/deebot_client/hardware/deebot/fallback.py b/deebot_client/hardware/deebot/fallback.py deleted file mode 100644 index c5deec88..00000000 --- a/deebot_client/hardware/deebot/fallback.py +++ /dev/null @@ -1,184 +0,0 @@ -"""Fallback Capabilities.""" - -from __future__ import annotations - -from deebot_client.capabilities import ( - Capabilities, - CapabilityClean, - CapabilityCleanAction, - CapabilityCustomCommand, - CapabilityEvent, - CapabilityExecute, - CapabilityLifeSpan, - CapabilityMap, - CapabilitySet, - CapabilitySetEnable, - CapabilitySettings, - CapabilitySetTypes, - CapabilityStats, - DeviceType, -) -from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode -from deebot_client.commands.json.battery import GetBattery -from deebot_client.commands.json.carpet import ( - GetCarpetAutoFanBoost, - SetCarpetAutoFanBoost, -) -from deebot_client.commands.json.charge import Charge -from deebot_client.commands.json.charge_state import GetChargeState -from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo -from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount -from deebot_client.commands.json.clean_logs import GetCleanLogs -from deebot_client.commands.json.clean_preference import ( - GetCleanPreference, - SetCleanPreference, -) -from deebot_client.commands.json.continuous_cleaning import ( - GetContinuousCleaning, - SetContinuousCleaning, -) -from deebot_client.commands.json.custom import CustomCommand -from deebot_client.commands.json.error import GetError -from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed -from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan -from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace -from deebot_client.commands.json.multimap_state import ( - GetMultimapState, - SetMultimapState, -) -from deebot_client.commands.json.network import GetNetInfo -from deebot_client.commands.json.play_sound import PlaySound -from deebot_client.commands.json.pos import GetPos -from deebot_client.commands.json.relocation import SetRelocationState -from deebot_client.commands.json.stats import GetStats, GetTotalStats -from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect -from deebot_client.commands.json.volume import GetVolume, SetVolume -from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo -from deebot_client.const import DataType -from deebot_client.events import ( - AdvancedModeEvent, - AvailabilityEvent, - BatteryEvent, - CachedMapInfoEvent, - CarpetAutoFanBoostEvent, - CleanCountEvent, - CleanLogEvent, - CleanPreferenceEvent, - ContinuousCleaningEvent, - CustomCommandEvent, - ErrorEvent, - FanSpeedEvent, - FanSpeedLevel, - LifeSpan, - LifeSpanEvent, - MajorMapEvent, - MapChangedEvent, - MapTraceEvent, - MultimapStateEvent, - NetworkInfoEvent, - PositionsEvent, - ReportStatsEvent, - RoomsEvent, - StateEvent, - StatsEvent, - TotalStatsEvent, - TrueDetectEvent, - VolumeEvent, - WaterAmount, - WaterInfoEvent, -) -from deebot_client.models import StaticDeviceInfo -from deebot_client.util import short_name - -from . import DEVICES - -DEVICES[short_name(__name__)] = StaticDeviceInfo( - DataType.JSON, - Capabilities( - device_type=DeviceType.VACUUM, - availability=CapabilityEvent( - AvailabilityEvent, [GetBattery(is_available_check=True)] - ), - battery=CapabilityEvent(BatteryEvent, [GetBattery()]), - charge=CapabilityExecute(Charge), - clean=CapabilityClean( - action=CapabilityCleanAction(command=Clean, area=CleanArea), - continuous=CapabilitySetEnable( - ContinuousCleaningEvent, - [GetContinuousCleaning()], - SetContinuousCleaning, - ), - count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), - log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), - preference=CapabilitySetEnable( - CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference - ), - ), - custom=CapabilityCustomCommand( - event=CustomCommandEvent, get=[], set=CustomCommand - ), - error=CapabilityEvent(ErrorEvent, [GetError()]), - fan_speed=CapabilitySetTypes( - event=FanSpeedEvent, - get=[GetFanSpeed()], - set=SetFanSpeed, - types=( - FanSpeedLevel.QUIET, - FanSpeedLevel.NORMAL, - FanSpeedLevel.MAX, - FanSpeedLevel.MAX_PLUS, - ), - ), - life_span=CapabilityLifeSpan( - types=(LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH), - event=LifeSpanEvent, - get=[GetLifeSpan([LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH])], - reset=ResetLifeSpan, - ), - map=CapabilityMap( - cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), - changed=CapabilityEvent(MapChangedEvent, []), - major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), - multi_state=CapabilitySetEnable( - MultimapStateEvent, [GetMultimapState()], SetMultimapState - ), - position=CapabilityEvent(PositionsEvent, [GetPos()]), - relocation=CapabilityExecute(SetRelocationState), - rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), - trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), - ), - network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), - play_sound=CapabilityExecute(PlaySound), - settings=CapabilitySettings( - advanced_mode=CapabilitySetEnable( - AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode - ), - carpet_auto_fan_boost=CapabilitySetEnable( - CarpetAutoFanBoostEvent, - [GetCarpetAutoFanBoost()], - SetCarpetAutoFanBoost, - ), - true_detect=CapabilitySetEnable( - TrueDetectEvent, [GetTrueDetect()], SetTrueDetect - ), - volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), - ), - state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), - stats=CapabilityStats( - clean=CapabilityEvent(StatsEvent, [GetStats()]), - report=CapabilityEvent(ReportStatsEvent, []), - total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), - ), - water=CapabilitySetTypes( - event=WaterInfoEvent, - get=[GetWaterInfo()], - set=SetWaterInfo, - types=( - WaterAmount.LOW, - WaterAmount.MEDIUM, - WaterAmount.HIGH, - WaterAmount.ULTRAHIGH, - ), - ), - ), -) diff --git a/pyproject.toml b/pyproject.toml index af07c341..923c91f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Topic :: Home Automation", "Topic :: Software Development :: Libraries :: Python Modules", ] @@ -133,7 +134,7 @@ max-args = 7 [tool.pylint.MAIN] -py-version = "3.12" +py-version = "3.13" ignore = [ "tests", ] diff --git a/tests/conftest.py b/tests/conftest.py index bbcc1af2..dd41b1b9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,7 +15,7 @@ create_rest_config as create_config_rest, ) from deebot_client.event_bus import EventBus -from deebot_client.hardware.deebot import FALLBACK, get_static_device_info +from deebot_client.hardware.deebot import get_static_device_info from deebot_client.models import ( ApiDeviceInfo, Credentials, @@ -127,7 +127,9 @@ async def test_mqtt_client( @pytest.fixture async def static_device_info() -> StaticDeviceInfo: - return await get_static_device_info(FALLBACK) + info = await get_static_device_info("yna5xi") + assert info is not None + return info @pytest.fixture diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index ac8a370d..d6dc4100 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -79,7 +79,7 @@ from deebot_client.events.network import NetworkInfoEvent from deebot_client.events.water_info import WaterInfoEvent from deebot_client.hardware import get_static_device_info -from deebot_client.hardware.deebot import DEVICES, FALLBACK, _load +from deebot_client.hardware.deebot import DEVICES, _load if TYPE_CHECKING: from collections.abc import Callable @@ -92,7 +92,7 @@ @pytest.mark.parametrize( ("class_", "expected"), [ - ("not_specified", lambda: DEVICES[FALLBACK]), + ("not_specified", lambda: None), ("yna5xi", lambda: DEVICES["yna5xi"]), ], ) @@ -107,40 +107,6 @@ async def test_get_static_device_info( @pytest.mark.parametrize( ("class_", "expected"), [ - ( - FALLBACK, - { - AdvancedModeEvent: [GetAdvancedMode()], - AvailabilityEvent: [GetBattery(is_available_check=True)], - BatteryEvent: [GetBattery()], - CachedMapInfoEvent: [GetCachedMapInfo()], - CarpetAutoFanBoostEvent: [GetCarpetAutoFanBoost()], - CleanCountEvent: [GetCleanCount()], - CleanLogEvent: [GetCleanLogs()], - CleanPreferenceEvent: [GetCleanPreference()], - ContinuousCleaningEvent: [GetContinuousCleaning()], - CustomCommandEvent: [], - ErrorEvent: [GetError()], - FanSpeedEvent: [GetFanSpeed()], - LifeSpanEvent: [ - GetLifeSpan([LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH]) - ], - MapChangedEvent: [], - MajorMapEvent: [GetMajorMap()], - MapTraceEvent: [GetMapTrace()], - MultimapStateEvent: [GetMultimapState()], - NetworkInfoEvent: [GetNetInfo()], - PositionsEvent: [GetPos()], - ReportStatsEvent: [], - RoomsEvent: [GetCachedMapInfo()], - StateEvent: [GetChargeState(), GetCleanInfo()], - StatsEvent: [GetStats()], - TotalStatsEvent: [GetTotalStats()], - TrueDetectEvent: [GetTrueDetect()], - VolumeEvent: [GetVolume()], - WaterInfoEvent: [GetWaterInfo()], - }, - ), ( "5xu9h3", { @@ -265,12 +231,14 @@ async def test_get_static_device_info( }, ), ], - ids=[FALLBACK, "5xu9h3", "itk04l", "yna5xi", "p95mgv"], + ids=["5xu9h3", "itk04l", "yna5xi", "p95mgv"], ) async def test_capabilities_event_extraction( class_: str, expected: dict[type[Event], list[Command]] ) -> None: - capabilities = (await get_static_device_info(class_)).capabilities + info = await get_static_device_info(class_) + assert info is not None + capabilities = info.capabilities assert capabilities._events.keys() == expected.keys() for event, expected_commands in expected.items(): assert ( @@ -294,7 +262,6 @@ def test_all_models_loaded() -> None: "9s1s80", "clojes", "e6ofmn", - "fallback", "guzput", "itk04l", "kr0277", From 438b4cbe93fd261e00f96a095d94e576d71430ed Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 11:59:01 +0100 Subject: [PATCH 031/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#598)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 207 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 104 insertions(+), 103 deletions(-) diff --git a/uv.lock b/uv.lock index 425ba68f..ab8f1c88 100644 --- a/uv.lock +++ b/uv.lock @@ -12,7 +12,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.10.10" +version = "3.11.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -20,40 +20,41 @@ dependencies = [ { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, + { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/7e/16e57e6cf20eb62481a2f9ce8674328407187950ccc602ad07c685279141/aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", size = 7542993 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/99/4c5aefe5ad06a1baf206aed6598c7cdcbc7c044c46801cd0d1ecb758cae3/aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", size = 583536 }, - { url = "https://files.pythonhosted.org/packages/a9/36/8b3bc49b49cb6d2da40ee61ff15dbcc44fd345a3e6ab5bb20844df929821/aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", size = 395693 }, - { url = "https://files.pythonhosted.org/packages/e1/77/0aa8660dcf11fa65d61712dbb458c4989de220a844bd69778dff25f2d50b/aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", size = 390898 }, - { url = "https://files.pythonhosted.org/packages/38/d2/b833d95deb48c75db85bf6646de0a697e7fb5d87bd27cbade4f9746b48b1/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", size = 1312060 }, - { url = "https://files.pythonhosted.org/packages/aa/5f/29fd5113165a0893de8efedf9b4737e0ba92dfcd791415a528f947d10299/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", size = 1350553 }, - { url = "https://files.pythonhosted.org/packages/ad/cc/f835f74b7d344428469200105236d44606cfa448be1e7c95ca52880d9bac/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", size = 1392646 }, - { url = "https://files.pythonhosted.org/packages/bf/fe/1332409d845ca601893bbf2d76935e0b93d41686e5f333841c7d7a4a770d/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", size = 1306310 }, - { url = "https://files.pythonhosted.org/packages/e4/a1/25a7633a5a513278a9892e333501e2e69c83e50be4b57a62285fb7a008c3/aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", size = 1260255 }, - { url = "https://files.pythonhosted.org/packages/f2/39/30eafe89e0e2a06c25e4762844c8214c0c0cd0fd9ffc3471694a7986f421/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", size = 1271141 }, - { url = "https://files.pythonhosted.org/packages/5b/fc/33125df728b48391ef1fcb512dfb02072158cc10d041414fb79803463020/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", size = 1280244 }, - { url = "https://files.pythonhosted.org/packages/3b/61/e42bf2c2934b5caa4e2ec0b5e5fd86989adb022b5ee60c2572a9d77cf6fe/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", size = 1316805 }, - { url = "https://files.pythonhosted.org/packages/18/32/f52a5e2ae9ad3bba10e026a63a7a23abfa37c7d97aeeb9004eaa98df3ce3/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", size = 1343930 }, - { url = "https://files.pythonhosted.org/packages/05/be/6a403b464dcab3631fe8e27b0f1d906d9e45c5e92aca97ee007e5a895560/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", size = 1306186 }, - { url = "https://files.pythonhosted.org/packages/8e/fd/bb50fe781068a736a02bf5c7ad5f3ab53e39f1d1e63110da6d30f7605edc/aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", size = 359289 }, - { url = "https://files.pythonhosted.org/packages/70/9e/5add7e240f77ef67c275c82cc1d08afbca57b77593118c1f6e920ae8ad3f/aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", size = 379313 }, - { url = "https://files.pythonhosted.org/packages/b1/eb/618b1b76c7fe8082a71c9d62e3fe84c5b9af6703078caa9ec57850a12080/aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", size = 576114 }, - { url = "https://files.pythonhosted.org/packages/aa/37/3126995d7869f8b30d05381b81a2d4fb4ec6ad313db788e009bc6d39c211/aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", size = 391901 }, - { url = "https://files.pythonhosted.org/packages/3e/f2/8fdfc845be1f811c31ceb797968523813f8e1263ee3e9120d61253f6848f/aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", size = 387418 }, - { url = "https://files.pythonhosted.org/packages/60/d5/33d2061d36bf07e80286e04b7e0a4de37ce04b5ebfed72dba67659a05250/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", size = 1287073 }, - { url = "https://files.pythonhosted.org/packages/00/52/affb55be16a4747740bd630b4c002dac6c5eac42f9bb64202fc3cf3f1930/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", size = 1323612 }, - { url = "https://files.pythonhosted.org/packages/94/f2/cddb69b975387daa2182a8442566971d6410b8a0179bb4540d81c97b1611/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", size = 1368406 }, - { url = "https://files.pythonhosted.org/packages/c1/e4/afba7327da4d932da8c6e29aecaf855f9d52dace53ac15bfc8030a246f1b/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", size = 1282761 }, - { url = "https://files.pythonhosted.org/packages/9f/6b/364856faa0c9031ea76e24ef0f7fef79cddd9fa8e7dba9a1771c6acc56b5/aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", size = 1236518 }, - { url = "https://files.pythonhosted.org/packages/46/af/c382846f8356fe64a7b5908bb9b477457aa23b71be7ed551013b7b7d4d87/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", size = 1250344 }, - { url = "https://files.pythonhosted.org/packages/87/53/294f87fc086fd0772d0ab82497beb9df67f0f27a8b3dd5742a2656db2bc6/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414", size = 1248956 }, - { url = "https://files.pythonhosted.org/packages/86/30/7d746717fe11bdfefb88bb6c09c5fc985d85c4632da8bb6018e273899254/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", size = 1293379 }, - { url = "https://files.pythonhosted.org/packages/48/b9/45d670a834458db67a24258e9139ba61fa3bd7d69b98ecf3650c22806f8f/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", size = 1320108 }, - { url = "https://files.pythonhosted.org/packages/72/8c/804bb2e837a175635d2000a0659eafc15b2e9d92d3d81c8f69e141ecd0b0/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", size = 1281546 }, - { url = "https://files.pythonhosted.org/packages/89/c0/862e6a9de3d6eeb126cd9d9ea388243b70df9b871ce1a42b193b7a4a77fc/aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", size = 357516 }, - { url = "https://files.pythonhosted.org/packages/ae/63/3e1aee3e554263f3f1011cca50d78a4894ae16ce99bf78101ac3a2f0ef74/aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", size = 376785 }, +sdist = { url = "https://files.pythonhosted.org/packages/4b/cb/f9bb10e0cf6f01730b27d370b10cc15822bea4395acd687abc8cc5fed3ed/aiohttp-3.11.7.tar.gz", hash = "sha256:01a8aca4af3da85cea5c90141d23f4b0eee3cbecfd33b029a45a80f28c66c668", size = 7666482 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/1e/2e96b2526c590dcb99db0b94ac4f9b927ecc07f94735a8a941dee143d48b/aiohttp-3.11.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4bb7493c3e3a36d3012b8564bd0e2783259ddd7ef3a81a74f0dbfa000fce48b7", size = 702326 }, + { url = "https://files.pythonhosted.org/packages/b5/ce/b5d7f3e68849f1f5e0b85af4ac9080b9d3c0a600857140024603653c2209/aiohttp-3.11.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e143b0ef9cb1a2b4f74f56d4fbe50caa7c2bb93390aff52f9398d21d89bc73ea", size = 461944 }, + { url = "https://files.pythonhosted.org/packages/28/fa/f4d98db1b7f8f0c3f74bdbd6d0d98cfc89984205cd33f1b8ee3f588ee5ad/aiohttp-3.11.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7c58a240260822dc07f6ae32a0293dd5bccd618bb2d0f36d51c5dbd526f89c0", size = 454348 }, + { url = "https://files.pythonhosted.org/packages/04/f0/c238dda5dc9a3d12b76636e2cf0ea475890ac3a1c7e4ff0fd6c3cea2fc2d/aiohttp-3.11.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d20cfe63a1c135d26bde8c1d0ea46fd1200884afbc523466d2f1cf517d1fe33", size = 1678795 }, + { url = "https://files.pythonhosted.org/packages/79/ee/3a18f792247e6d95dba13aaedc9dc317c3c6e75f4b88c2dd4b960d20ad2f/aiohttp-3.11.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12e4d45847a174f77b2b9919719203769f220058f642b08504cf8b1cf185dacf", size = 1734411 }, + { url = "https://files.pythonhosted.org/packages/f5/79/3eb84243087a9a32cae821622c935107b4b55a5b21b76772e8e6c41092e9/aiohttp-3.11.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf4efa2d01f697a7dbd0509891a286a4af0d86902fc594e20e3b1712c28c0106", size = 1788959 }, + { url = "https://files.pythonhosted.org/packages/91/93/ad77782c5edfa17aafc070bef978fbfb8459b2f150595ffb01b559c136f9/aiohttp-3.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee6a4cdcbf54b8083dc9723cdf5f41f722c00db40ccf9ec2616e27869151129", size = 1687463 }, + { url = "https://files.pythonhosted.org/packages/ba/48/db35bd21b7877efa0be5f28385d8978c55323c5ce7685712e53f3f6c0bd9/aiohttp-3.11.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6095aaf852c34f42e1bd0cf0dc32d1e4b48a90bfb5054abdbb9d64b36acadcb", size = 1618374 }, + { url = "https://files.pythonhosted.org/packages/ba/77/30f87db55c79fd145ed5fd15b92f2e820ce81065d41ae437797aaa550e3b/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1cf03d27885f8c5ebf3993a220cc84fc66375e1e6e812731f51aab2b2748f4a6", size = 1637021 }, + { url = "https://files.pythonhosted.org/packages/af/76/10b188b78ee18d0595af156d6a238bc60f9d8571f0f546027eb7eaf65b25/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1a17f6a230f81eb53282503823f59d61dff14fb2a93847bf0399dc8e87817307", size = 1650792 }, + { url = "https://files.pythonhosted.org/packages/fa/33/4411bbb8ad04c47d0f4c7bd53332aaf350e49469cf6b65b132d4becafe27/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:481f10a1a45c5f4c4a578bbd74cff22eb64460a6549819242a87a80788461fba", size = 1696248 }, + { url = "https://files.pythonhosted.org/packages/fe/2d/6135d0dc1851a33d3faa937b20fef81340bc95e8310536d4c7f1f8ecc026/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:db37248535d1ae40735d15bdf26ad43be19e3d93ab3f3dad8507eb0f85bb8124", size = 1729188 }, + { url = "https://files.pythonhosted.org/packages/f5/76/a57ceff577ae26fe9a6f31ac799bc638ecf26e4acdf04295290b9929b349/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd", size = 1690038 }, + { url = "https://files.pythonhosted.org/packages/4b/81/b20e09003b6989a7f23a721692137a6143420a151063c750ab2a04878e3c/aiohttp-3.11.7-cp312-cp312-win32.whl", hash = "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8", size = 409887 }, + { url = "https://files.pythonhosted.org/packages/b7/0b/607c98bff1d07bb21e0c39e7711108ef9ff4f2a361a3ec1ce8dce93623a5/aiohttp-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0", size = 436462 }, + { url = "https://files.pythonhosted.org/packages/7a/53/8d77186c6a33bd087714df18274cdcf6e36fd69a9e841c85b7e81a20b18e/aiohttp-3.11.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4", size = 695811 }, + { url = "https://files.pythonhosted.org/packages/62/b6/4c3d107a5406aa6f99f618afea82783f54ce2d9644020f50b9c88f6e823d/aiohttp-3.11.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68", size = 458530 }, + { url = "https://files.pythonhosted.org/packages/d9/05/dbf0bd3966be8ebed3beb4007a2d1356d79af4fe7c93e54f984df6385193/aiohttp-3.11.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5", size = 451371 }, + { url = "https://files.pythonhosted.org/packages/19/6a/2198580314617b6cf9c4b813b84df5832b5f8efedcb8a7e8b321a187233c/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa", size = 1662905 }, + { url = "https://files.pythonhosted.org/packages/2b/65/08696fd7503f6a6f9f782bd012bf47f36d4ed179a7d8c95dba4726d5cc67/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866", size = 1713794 }, + { url = "https://files.pythonhosted.org/packages/c8/a3/b9a72dce6f15e2efbc09fa67c1067c4f3a3bb05661c0ae7b40799cde02b7/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e", size = 1770757 }, + { url = "https://files.pythonhosted.org/packages/78/7e/8fb371b5f8c4c1eaa0d0a50750c0dd68059f86794aeb36919644815486f5/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da", size = 1673136 }, + { url = "https://files.pythonhosted.org/packages/2f/0f/09685d13d2c7634cb808868ea29c170d4dcde4215a4a90fb86491cd3ae25/aiohttp-3.11.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962", size = 1600370 }, + { url = "https://files.pythonhosted.org/packages/00/2e/18fd38b117f9b3a375166ccb70ed43cf7e3dfe2cc947139acc15feefc5a2/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d", size = 1613459 }, + { url = "https://files.pythonhosted.org/packages/2c/94/10a82abc680d753be33506be699aaa330152ecc4f316eaf081f996ee56c2/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd", size = 1613924 }, + { url = "https://files.pythonhosted.org/packages/e9/58/897c0561f5c522dda6e173192f1e4f10144e1a7126096f17a3f12b7aa168/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8", size = 1681164 }, + { url = "https://files.pythonhosted.org/packages/8b/8b/3a48b1cdafa612679d976274355f6a822de90b85d7dba55654ecfb01c979/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791", size = 1712139 }, + { url = "https://files.pythonhosted.org/packages/aa/9d/70ab5b4dd7900db04af72840e033aee06e472b1343e372ea256ed675511c/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52", size = 1667446 }, + { url = "https://files.pythonhosted.org/packages/cb/98/b5fbcc8f6056f0c56001c75227e6b7ca9ee4f2e5572feca82ff3d65d485d/aiohttp-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e", size = 408689 }, + { url = "https://files.pythonhosted.org/packages/ef/07/4d1504577fa6349dd2e3839e89fb56e5dee38d64efe3d4366e9fcfda0cdb/aiohttp-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9", size = 434809 }, ] [[package]] @@ -175,40 +176,40 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/12/3669b6382792783e92046730ad3327f53b2726f0603f4c311c4da4824222/coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", size = 798716 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/e7/9291de916d084f41adddfd4b82246e68d61d6a75747f075f7e64628998d2/coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", size = 207013 }, - { url = "https://files.pythonhosted.org/packages/27/03/932c2c5717a7fa80cd43c6a07d3177076d97b79f12f40f882f9916db0063/coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", size = 207251 }, - { url = "https://files.pythonhosted.org/packages/d5/3f/0af47dcb9327f65a45455fbca846fe96eb57c153af46c4754a3ba678938a/coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", size = 240268 }, - { url = "https://files.pythonhosted.org/packages/8a/3c/37a9d81bbd4b23bc7d46ca820e16174c613579c66342faa390a271d2e18b/coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", size = 237298 }, - { url = "https://files.pythonhosted.org/packages/c0/70/6b0627e5bd68204ee580126ed3513140b2298995c1233bd67404b4e44d0e/coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", size = 239367 }, - { url = "https://files.pythonhosted.org/packages/3c/eb/634d7dfab24ac3b790bebaf9da0f4a5352cbc125ce6a9d5c6cf4c6cae3c7/coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", size = 238853 }, - { url = "https://files.pythonhosted.org/packages/d9/0d/8e3ed00f1266ef7472a4e33458f42e39492e01a64281084fb3043553d3f1/coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", size = 237160 }, - { url = "https://files.pythonhosted.org/packages/ce/9c/4337f468ef0ab7a2e0887a9c9da0e58e2eada6fc6cbee637a4acd5dfd8a9/coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", size = 238824 }, - { url = "https://files.pythonhosted.org/packages/5e/09/3e94912b8dd37251377bb02727a33a67ee96b84bbbe092f132b401ca5dd9/coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", size = 209639 }, - { url = "https://files.pythonhosted.org/packages/01/69/d4f3a4101171f32bc5b3caec8ff94c2c60f700107a6aaef7244b2c166793/coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", size = 210428 }, - { url = "https://files.pythonhosted.org/packages/c2/4d/2dede4f7cb5a70fb0bb40a57627fddf1dbdc6b9c1db81f7c4dcdcb19e2f4/coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", size = 207039 }, - { url = "https://files.pythonhosted.org/packages/3f/f9/d86368ae8c79e28f1fb458ebc76ae9ff3e8bd8069adc24e8f2fed03c58b7/coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", size = 207298 }, - { url = "https://files.pythonhosted.org/packages/64/c5/b4cc3c3f64622c58fbfd4d8b9a7a8ce9d355f172f91fcabbba1f026852f6/coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", size = 239813 }, - { url = "https://files.pythonhosted.org/packages/8a/86/14c42e60b70a79b26099e4d289ccdfefbc68624d096f4481163085aa614c/coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", size = 236959 }, - { url = "https://files.pythonhosted.org/packages/7f/f8/4436a643631a2fbab4b44d54f515028f6099bfb1cd95b13cfbf701e7f2f2/coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", size = 238950 }, - { url = "https://files.pythonhosted.org/packages/49/50/1571810ddd01f99a0a8be464a4ac8b147f322cd1e8e296a1528984fc560b/coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", size = 238610 }, - { url = "https://files.pythonhosted.org/packages/f3/8c/6312d241fe7cbd1f0cade34a62fea6f333d1a261255d76b9a87074d8703c/coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", size = 236697 }, - { url = "https://files.pythonhosted.org/packages/ce/5f/fef33dfd05d87ee9030f614c857deb6df6556b8f6a1c51bbbb41e24ee5ac/coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", size = 238541 }, - { url = "https://files.pythonhosted.org/packages/a9/64/6a984b6e92e1ea1353b7ffa08e27f707a5e29b044622445859200f541e8c/coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", size = 209707 }, - { url = "https://files.pythonhosted.org/packages/5c/60/ce5a9e942e9543783b3db5d942e0578b391c25cdd5e7f342d854ea83d6b7/coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", size = 210439 }, - { url = "https://files.pythonhosted.org/packages/78/53/6719677e92c308207e7f10561a1b16ab8b5c00e9328efc9af7cfd6fb703e/coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", size = 207784 }, - { url = "https://files.pythonhosted.org/packages/fa/dd/7054928930671fcb39ae6a83bb71d9ab5f0afb733172543ced4b09a115ca/coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", size = 208058 }, - { url = "https://files.pythonhosted.org/packages/b5/7d/fd656ddc2b38301927b9eb3aae3fe827e7aa82e691923ed43721fd9423c9/coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", size = 250772 }, - { url = "https://files.pythonhosted.org/packages/90/d0/eb9a3cc2100b83064bb086f18aedde3afffd7de6ead28f69736c00b7f302/coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", size = 246490 }, - { url = "https://files.pythonhosted.org/packages/45/44/3f64f38f6faab8a0cfd2c6bc6eb4c6daead246b97cf5f8fc23bf3788f841/coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", size = 248848 }, - { url = "https://files.pythonhosted.org/packages/5d/11/4c465a5f98656821e499f4b4619929bd5a34639c466021740ecdca42aa30/coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", size = 248340 }, - { url = "https://files.pythonhosted.org/packages/f1/96/ebecda2d016cce9da812f404f720ca5df83c6b29f65dc80d2000d0078741/coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", size = 246229 }, - { url = "https://files.pythonhosted.org/packages/16/d9/3d820c00066ae55d69e6d0eae11d6149a5ca7546de469ba9d597f01bf2d7/coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", size = 247510 }, - { url = "https://files.pythonhosted.org/packages/8f/c3/4fa1eb412bb288ff6bfcc163c11700ff06e02c5fad8513817186e460ed43/coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", size = 210353 }, - { url = "https://files.pythonhosted.org/packages/7e/77/03fc2979d1538884d921c2013075917fc927f41cd8526909852fe4494112/coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", size = 211502 }, +version = "7.6.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/75/aecfd0a3adbec6e45753976bc2a9fed62b42cea9a206d10fd29244a77953/coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", size = 801425 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/ce/3edf581c8fe429ed8ced6e6d9ac693c25975ef9093413276dab6ed68a80a/coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", size = 207285 }, + { url = "https://files.pythonhosted.org/packages/09/9c/cf102ab046c9cf8895c3f7aadcde6f489a4b2ec326757e8c6e6581829b5e/coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", size = 207522 }, + { url = "https://files.pythonhosted.org/packages/39/06/42aa6dd13dbfca72e1fd8ffccadbc921b6e75db34545ebab4d955d1e7ad3/coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", size = 240543 }, + { url = "https://files.pythonhosted.org/packages/a0/20/2932971dc215adeca8eeff446266a7fef17a0c238e881ffedebe7bfa0669/coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", size = 237577 }, + { url = "https://files.pythonhosted.org/packages/ac/85/4323ece0cd5452c9522f4b6e5cc461e6c7149a4b1887c9e7a8b1f4e51146/coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", size = 239646 }, + { url = "https://files.pythonhosted.org/packages/77/52/b2537487d8f36241e518e84db6f79e26bc3343b14844366e35b090fae0d4/coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", size = 239128 }, + { url = "https://files.pythonhosted.org/packages/7c/99/7f007762012186547d0ecc3d328da6b6f31a8c99f05dc1e13dcd929918cd/coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", size = 237434 }, + { url = "https://files.pythonhosted.org/packages/97/53/e9b5cf0682a1cab9352adfac73caae0d77ae1d65abc88975d510f7816389/coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", size = 239095 }, + { url = "https://files.pythonhosted.org/packages/0c/50/054f0b464fbae0483217186478eefa2e7df3a79917ed7f1d430b6da2cf0d/coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", size = 209895 }, + { url = "https://files.pythonhosted.org/packages/df/d0/09ba870360a27ecf09e177ca2ff59d4337fc7197b456f22ceff85cffcfa5/coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", size = 210684 }, + { url = "https://files.pythonhosted.org/packages/9a/84/6f0ccf94a098ac3d6d6f236bd3905eeac049a9e0efcd9a63d4feca37ac4b/coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", size = 207313 }, + { url = "https://files.pythonhosted.org/packages/db/2b/e3b3a3a12ebec738c545897ac9f314620470fcbc368cdac88cf14974ba20/coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", size = 207574 }, + { url = "https://files.pythonhosted.org/packages/db/c0/5bf95d42b6a8d21dfce5025ce187f15db57d6460a59b67a95fe8728162f1/coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", size = 240090 }, + { url = "https://files.pythonhosted.org/packages/57/b8/d6fd17d1a8e2b0e1a4e8b9cb1f0f261afd422570735899759c0584236916/coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", size = 237237 }, + { url = "https://files.pythonhosted.org/packages/d4/e4/a91e9bb46809c8b63e68fc5db5c4d567d3423b6691d049a4f950e38fbe9d/coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", size = 239225 }, + { url = "https://files.pythonhosted.org/packages/31/9c/9b99b0591ec4555b7292d271e005f27b465388ce166056c435b288db6a69/coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", size = 238888 }, + { url = "https://files.pythonhosted.org/packages/a6/85/285c2df9a04bc7c31f21fd9d4a24d19e040ec5e2ff06e572af1f6514c9e7/coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", size = 236974 }, + { url = "https://files.pythonhosted.org/packages/cb/a1/95ec8522206f76cdca033bf8bb61fff56429fb414835fc4d34651dfd29fc/coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", size = 238815 }, + { url = "https://files.pythonhosted.org/packages/8d/ac/687e9ba5e6d0979e9dab5c02e01c4f24ac58260ef82d88d3b433b3f84f1e/coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", size = 209957 }, + { url = "https://files.pythonhosted.org/packages/2f/a3/b61cc8e3fcf075293fb0f3dee405748453c5ba28ac02ceb4a87f52bdb105/coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", size = 210711 }, + { url = "https://files.pythonhosted.org/packages/ee/4b/891c8b9acf1b62c85e4a71dac142ab9284e8347409b7355de02e3f38306f/coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", size = 208053 }, + { url = "https://files.pythonhosted.org/packages/18/a9/9e330409b291cc002723d339346452800e78df1ce50774ca439ade1d374f/coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", size = 208329 }, + { url = "https://files.pythonhosted.org/packages/9c/0d/33635fd429f6589c6e1cdfc7bf581aefe4c1792fbff06383f9d37f59db60/coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", size = 251052 }, + { url = "https://files.pythonhosted.org/packages/23/32/8a08da0e46f3830bbb9a5b40614241b2e700f27a9c2889f53122486443ed/coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", size = 246765 }, + { url = "https://files.pythonhosted.org/packages/56/3f/3b86303d2c14350fdb1c6c4dbf9bc76000af2382f42ca1d4d99c6317666e/coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", size = 249125 }, + { url = "https://files.pythonhosted.org/packages/36/cb/c4f081b9023f9fd8646dbc4ef77be0df090263e8f66f4ea47681e0dc2cff/coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", size = 248615 }, + { url = "https://files.pythonhosted.org/packages/32/ee/53bdbf67760928c44b57b2c28a8c0a4bf544f85a9ee129a63ba5c78fdee4/coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", size = 246507 }, + { url = "https://files.pythonhosted.org/packages/57/49/5a57910bd0af6d8e802b4ca65292576d19b54b49f81577fd898505dee075/coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", size = 247785 }, + { url = "https://files.pythonhosted.org/packages/bd/37/e450c9f6b297c79bb9858407396ed3e084dcc22990dd110ab01d5ceb9770/coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", size = 210605 }, + { url = "https://files.pythonhosted.org/packages/44/79/7d0c7dd237c6905018e2936cd1055fe1d42e7eba2ebab3c00f4aad2a27d7/coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", size = 211777 }, ] [[package]] @@ -885,46 +886,46 @@ wheels = [ [[package]] name = "yarl" -version = "1.17.1" +version = "1.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/9c/9c0a9bfa683fc1be7fdcd9687635151544d992cccd48892dc5e0a5885a29/yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", size = 178163 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/af/e25615c7920396219b943b9ff8b34636ae3e1ad30777649371317d7f05f8/yarl-1.17.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61", size = 141839 }, - { url = "https://files.pythonhosted.org/packages/83/5e/363d9de3495c7c66592523f05d21576a811015579e0c87dd38c7b5788afd/yarl-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d", size = 94125 }, - { url = "https://files.pythonhosted.org/packages/e3/a2/b65447626227ebe36f18f63ac551790068bf42c69bb22dfa3ae986170728/yarl-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139", size = 92048 }, - { url = "https://files.pythonhosted.org/packages/a1/f5/2ef86458446f85cde10582054fd5113495ef8ce8477da35aaaf26d2970ef/yarl-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5", size = 331472 }, - { url = "https://files.pythonhosted.org/packages/f3/6b/1ba79758ba352cdf2ad4c20cab1b982dd369aa595bb0d7601fc89bf82bee/yarl-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac", size = 341260 }, - { url = "https://files.pythonhosted.org/packages/2d/41/4e07c2afca3f9ed3da5b0e38d43d0280d9b624a3d5c478c425e5ce17775c/yarl-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463", size = 340882 }, - { url = "https://files.pythonhosted.org/packages/c3/c0/cd8e94618983c1b811af082e1a7ad7764edb3a6af2bc6b468e0e686238ba/yarl-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147", size = 336648 }, - { url = "https://files.pythonhosted.org/packages/ac/fc/73ec4340d391ffbb8f34eb4c55429784ec9f5bd37973ce86d52d67135418/yarl-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7", size = 325019 }, - { url = "https://files.pythonhosted.org/packages/57/48/da3ebf418fc239d0a156b3bdec6b17a5446f8d2dea752299c6e47b143a85/yarl-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685", size = 342841 }, - { url = "https://files.pythonhosted.org/packages/5d/79/107272745a470a8167924e353a5312eb52b5a9bb58e22686adc46c94f7ec/yarl-1.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172", size = 341433 }, - { url = "https://files.pythonhosted.org/packages/30/9c/6459668b3b8dcc11cd061fc53e12737e740fb6b1575b49c84cbffb387b3a/yarl-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7", size = 344927 }, - { url = "https://files.pythonhosted.org/packages/c5/0b/93a17ed733aca8164fc3a01cb7d47b3f08854ce4f957cce67a6afdb388a0/yarl-1.17.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da", size = 355732 }, - { url = "https://files.pythonhosted.org/packages/9a/63/ead2ed6aec3c59397e135cadc66572330325a0c24cd353cd5c94f5e63463/yarl-1.17.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c", size = 362123 }, - { url = "https://files.pythonhosted.org/packages/89/bf/f6b75b4c2fcf0e7bb56edc0ed74e33f37fac45dc40e5a52a3be66b02587a/yarl-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199", size = 356355 }, - { url = "https://files.pythonhosted.org/packages/45/1f/50a0257cd07eef65c8c65ad6a21f5fb230012d659e021aeb6ac8a7897bf6/yarl-1.17.1-cp312-cp312-win32.whl", hash = "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96", size = 83279 }, - { url = "https://files.pythonhosted.org/packages/bc/82/fafb2c1268d63d54ec08b3a254fbe51f4ef098211501df646026717abee3/yarl-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df", size = 89590 }, - { url = "https://files.pythonhosted.org/packages/06/1e/5a93e3743c20eefbc68bd89334d9c9f04f3f2334380f7bbf5e950f29511b/yarl-1.17.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488", size = 139974 }, - { url = "https://files.pythonhosted.org/packages/a1/be/4e0f6919013c7c5eaea5c31811c551ccd599d2fc80aa3dd6962f1bbdcddd/yarl-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374", size = 93364 }, - { url = "https://files.pythonhosted.org/packages/73/f0/650f994bc491d0cb85df8bb45392780b90eab1e175f103a5edc61445ff67/yarl-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac", size = 91177 }, - { url = "https://files.pythonhosted.org/packages/f3/e8/9945ed555d14b43ede3ae8b1bd73e31068a694cad2b9d3cad0a28486c2eb/yarl-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170", size = 333086 }, - { url = "https://files.pythonhosted.org/packages/a6/c0/7d167e48e14d26639ca066825af8da7df1d2fcdba827e3fd6341aaf22a3b/yarl-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8", size = 343661 }, - { url = "https://files.pythonhosted.org/packages/fa/81/80a266517531d4e3553aecd141800dbf48d02e23ebd52909e63598a80134/yarl-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938", size = 345196 }, - { url = "https://files.pythonhosted.org/packages/b0/77/6adc482ba7f2dc6c0d9b3b492e7cd100edfac4cfc3849c7ffa26fd7beb1a/yarl-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e", size = 338743 }, - { url = "https://files.pythonhosted.org/packages/6d/cc/f0c4c0b92ff3ada517ffde2b127406c001504b225692216d969879ada89a/yarl-1.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556", size = 326719 }, - { url = "https://files.pythonhosted.org/packages/18/3b/7bfc80d3376b5fa162189993a87a5a6a58057f88315bd0ea00610055b57a/yarl-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67", size = 345826 }, - { url = "https://files.pythonhosted.org/packages/2e/66/cf0b0338107a5c370205c1a572432af08f36ca12ecce127f5b558398b4fd/yarl-1.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8", size = 340335 }, - { url = "https://files.pythonhosted.org/packages/2f/52/b084b0eec0fd4d2490e1d33ace3320fad704c5f1f3deaa709f929d2d87fc/yarl-1.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3", size = 345301 }, - { url = "https://files.pythonhosted.org/packages/ef/38/9e2036d948efd3bafcdb4976cb212166fded76615f0dfc6c1492c4ce4784/yarl-1.17.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0", size = 354205 }, - { url = "https://files.pythonhosted.org/packages/81/c1/13dfe1e70b86811733316221c696580725ceb1c46d4e4db852807e134310/yarl-1.17.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299", size = 360501 }, - { url = "https://files.pythonhosted.org/packages/91/87/756e05c74cd8bf9e71537df4a2cae7e8211a9ebe0d2350a3e26949e1e41c/yarl-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258", size = 359452 }, - { url = "https://files.pythonhosted.org/packages/06/b2/b2bb09c1e6d59e1c9b1b36a86caa473e22c3dbf26d1032c030e9bfb554dc/yarl-1.17.1-cp313-cp313-win32.whl", hash = "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2", size = 308904 }, - { url = "https://files.pythonhosted.org/packages/f3/27/f084d9a5668853c1f3b246620269b14ee871ef3c3cc4f3a1dd53645b68ec/yarl-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda", size = 314637 }, - { url = "https://files.pythonhosted.org/packages/52/ad/1fe7ff5f3e8869d4c5070f47b96bac2b4d15e67c100a8278d8e7876329fc/yarl-1.17.1-py3-none-any.whl", hash = "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06", size = 44352 }, +sdist = { url = "https://files.pythonhosted.org/packages/5e/4b/53db4ecad4d54535aff3dfda1f00d6363d79455f62b11b8ca97b82746bd2/yarl-1.18.0.tar.gz", hash = "sha256:20d95535e7d833889982bfe7cc321b7f63bf8879788fee982c76ae2b24cfb715", size = 180098 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/36/c579b80a5c76c0d41c8e08baddb3e6940dfc20569db579a5691392c52afa/yarl-1.18.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1ece25e2251c28bab737bdf0519c88189b3dd9492dc086a1d77336d940c28ced", size = 142376 }, + { url = "https://files.pythonhosted.org/packages/0c/5f/e247dc7c0607a0c505fea6c839721844bee55686dfb183c7d7b8ef8a9cb1/yarl-1.18.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:454902dc1830d935c90b5b53c863ba2a98dcde0fbaa31ca2ed1ad33b2a7171c6", size = 94692 }, + { url = "https://files.pythonhosted.org/packages/eb/e1/3081b578a6f21961711b9a1c49c2947abb3b0d0dd9537378fb06777ce8ee/yarl-1.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01be8688fc211dc237e628fcc209dda412d35de7642453059a0553747018d075", size = 92527 }, + { url = "https://files.pythonhosted.org/packages/2f/fa/d9e1b9fbafa4cc82cd3980b5314741b33c2fe16308d725449a23aed32021/yarl-1.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d26f1fa9fa2167bb238f6f4b20218eb4e88dd3ef21bb8f97439fa6b5313e30d", size = 332096 }, + { url = "https://files.pythonhosted.org/packages/93/b6/dd27165114317875838e216214fb86338dc63d2e50855a8f2a12de2a7fe5/yarl-1.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b234a4a9248a9f000b7a5dfe84b8cb6210ee5120ae70eb72a4dcbdb4c528f72f", size = 342047 }, + { url = "https://files.pythonhosted.org/packages/fc/9f/bad434b5279ae7a356844e14dc771c3d29eb928140bbc01621af811c8a27/yarl-1.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe94d1de77c4cd8caff1bd5480e22342dbd54c93929f5943495d9c1e8abe9f42", size = 341712 }, + { url = "https://files.pythonhosted.org/packages/9a/9f/63864f43d131ba8c8cdf1bde5dd3f02f0eff8a7c883a5d7fad32f204fda5/yarl-1.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4c90c5363c6b0a54188122b61edb919c2cd1119684999d08cd5e538813a28e", size = 336654 }, + { url = "https://files.pythonhosted.org/packages/20/30/b4542bbd9be73de155213207eec019f6fe6495885f7dd59aa1ff705a041b/yarl-1.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a98ecadc5a241c9ba06de08127ee4796e1009555efd791bac514207862b43d", size = 325484 }, + { url = "https://files.pythonhosted.org/packages/69/bc/e2a9808ec26989cf0d1b98fe7b3cc45c1c6506b5ea4fe43ece5991f28f34/yarl-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9106025c7f261f9f5144f9aa7681d43867eed06349a7cfb297a1bc804de2f0d1", size = 344213 }, + { url = "https://files.pythonhosted.org/packages/e2/17/0ee5a68886aca1a8071b0d24a1e1c0fd9970dead2ef2d5e26e027fb7ce88/yarl-1.18.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f275ede6199d0f1ed4ea5d55a7b7573ccd40d97aee7808559e1298fe6efc8dbd", size = 340517 }, + { url = "https://files.pythonhosted.org/packages/fd/db/1fe4ef38ee852bff5ec8f5367d718b3a7dac7520f344b8e50306f68a2940/yarl-1.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f7edeb1dcc7f50a2c8e08b9dc13a413903b7817e72273f00878cb70e766bdb3b", size = 346234 }, + { url = "https://files.pythonhosted.org/packages/b4/ee/5e5bccdb821eb9949ba66abb4d19e3299eee00282e37b42f65236120e892/yarl-1.18.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c083f6dd6951b86e484ebfc9c3524b49bcaa9c420cb4b2a78ef9f7a512bfcc85", size = 359625 }, + { url = "https://files.pythonhosted.org/packages/3f/43/95a64d9e7ab4aa1c34fc5ea0edb35b581bc6ad33fd960a8ae34c2040b319/yarl-1.18.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:80741ec5b471fbdfb997821b2842c59660a1c930ceb42f8a84ba8ca0f25a66aa", size = 364239 }, + { url = "https://files.pythonhosted.org/packages/40/19/09ce976c624c9d3cc898f0be5035ddef0c0759d85b2313321cfe77b69915/yarl-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1a3297b9cad594e1ff0c040d2881d7d3a74124a3c73e00c3c71526a1234a9f7", size = 357599 }, + { url = "https://files.pythonhosted.org/packages/7d/35/6f33fd29791af2ec161aebe8abe63e788c2b74a6c7e8f29c92e5f5e96849/yarl-1.18.0-cp312-cp312-win32.whl", hash = "sha256:cd6ab7d6776c186f544f893b45ee0c883542b35e8a493db74665d2e594d3ca75", size = 83832 }, + { url = "https://files.pythonhosted.org/packages/4e/8e/cdb40ef98597be107de67b11e2f1f23f911e0f1416b938885d17a338e304/yarl-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:039c299a0864d1f43c3e31570045635034ea7021db41bf4842693a72aca8df3a", size = 90132 }, + { url = "https://files.pythonhosted.org/packages/2b/77/2196b657c66f97adaef0244e9e015f30eac0df59c31ad540f79ce328feed/yarl-1.18.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fb64dd45453225f57d82c4764818d7a205ee31ce193e9f0086e493916bd4f72", size = 140512 }, + { url = "https://files.pythonhosted.org/packages/0e/d8/2bb6e26fddba5c01bad284e4571178c651b97e8e06318efcaa16e07eb9fd/yarl-1.18.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3adaaf9c6b1b4fc258584f4443f24d775a2086aee82d1387e48a8b4f3d6aecf6", size = 93875 }, + { url = "https://files.pythonhosted.org/packages/54/e4/99fbb884dd9f814fb0037dc1783766bb9edcd57b32a76f3ec5ac5c5772d7/yarl-1.18.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:da206d1ec78438a563c5429ab808a2b23ad7bc025c8adbf08540dde202be37d5", size = 91705 }, + { url = "https://files.pythonhosted.org/packages/3b/a2/5bd86eca9449e6b15d3b08005cf4e58e3da972240c2bee427b358c311549/yarl-1.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:576d258b21c1db4c6449b1c572c75d03f16a482eb380be8003682bdbe7db2f28", size = 333325 }, + { url = "https://files.pythonhosted.org/packages/94/50/a218da5f159cd985685bc72c500bb1a7fd2d60035d2339b8a9d9e1f99194/yarl-1.18.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60e547c0a375c4bfcdd60eef82e7e0e8698bf84c239d715f5c1278a73050393", size = 344121 }, + { url = "https://files.pythonhosted.org/packages/a4/e3/830ae465811198b4b5ebecd674b5b3dca4d222af2155eb2144bfe190bbb8/yarl-1.18.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3818eabaefb90adeb5e0f62f047310079d426387991106d4fbf3519eec7d90a", size = 345163 }, + { url = "https://files.pythonhosted.org/packages/7a/74/05c4326877ca541eee77b1ef74b7ac8081343d3957af8f9291ca6eca6fec/yarl-1.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5f72421246c21af6a92fbc8c13b6d4c5427dfd949049b937c3b731f2f9076bd", size = 339130 }, + { url = "https://files.pythonhosted.org/packages/29/42/842f35aa1dae25d132119ee92185e8c75d8b9b7c83346506bd31e9fa217f/yarl-1.18.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa7d37f2ada0f42e0723632993ed422f2a679af0e200874d9d861720a54f53e", size = 326418 }, + { url = "https://files.pythonhosted.org/packages/f9/ed/65c0514f2d1e8b92a61f564c914381d078766cab38b5fbde355b3b3af1fb/yarl-1.18.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:42ba84e2ac26a3f252715f8ec17e6fdc0cbf95b9617c5367579fafcd7fba50eb", size = 345204 }, + { url = "https://files.pythonhosted.org/packages/23/31/351f64f0530c372fa01160f38330f44478e7bf3092f5ce2bfcb91605561d/yarl-1.18.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6a49ad0102c0f0ba839628d0bf45973c86ce7b590cdedf7540d5b1833ddc6f00", size = 341652 }, + { url = "https://files.pythonhosted.org/packages/49/aa/0c6e666c218d567727c1d040d01575685e7f9b18052fd68a59c9f61fe5d9/yarl-1.18.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:96404e8d5e1bbe36bdaa84ef89dc36f0e75939e060ca5cd45451aba01db02902", size = 347257 }, + { url = "https://files.pythonhosted.org/packages/36/0b/33a093b0e13bb8cd0f27301779661ff325270b6644929001f8f33307357d/yarl-1.18.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a0509475d714df8f6d498935b3f307cd122c4ca76f7d426c7e1bb791bcd87eda", size = 359735 }, + { url = "https://files.pythonhosted.org/packages/a8/92/dcc0b37c48632e71ffc2b5f8b0509347a0bde55ab5862ff755dce9dd56c4/yarl-1.18.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ff116f0285b5c8b3b9a2680aeca29a858b3b9e0402fc79fd850b32c2bcb9f8b", size = 365982 }, + { url = "https://files.pythonhosted.org/packages/0e/39/30e2a24a7a6c628dccb13eb6c4a03db5f6cd1eb2c6cda56a61ddef764c11/yarl-1.18.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2580c1d7e66e6d29d6e11855e3b1c6381971e0edd9a5066e6c14d79bc8967af", size = 360128 }, + { url = "https://files.pythonhosted.org/packages/76/13/12b65dca23b1fb8ae44269a4d24048fd32ac90b445c985b0a46fdfa30cfe/yarl-1.18.0-cp313-cp313-win32.whl", hash = "sha256:14408cc4d34e202caba7b5ac9cc84700e3421a9e2d1b157d744d101b061a4a88", size = 309888 }, + { url = "https://files.pythonhosted.org/packages/f6/60/478d3d41a4bf0b9e7dca74d870d114e775d1ff7156b7d1e0e9972e8f97fd/yarl-1.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:1db1537e9cb846eb0ff206eac667f627794be8b71368c1ab3207ec7b6f8c5afc", size = 315459 }, + { url = "https://files.pythonhosted.org/packages/30/9c/3f7ab894a37b1520291247cbc9ea6756228d098dae5b37eec848d404a204/yarl-1.18.0-py3-none-any.whl", hash = "sha256:dbf53db46f7cf176ee01d8d98c39381440776fcda13779d269a8ba664f69bec0", size = 44840 }, ] From 979dd8ceae2012f64f6e6d974d401bb85eddd019 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 10:30:05 +0100 Subject: [PATCH 032/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pylint=20to=20v3.3.2=20(#605)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 923c91f4..61c5e392 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dev-dependencies = [ "mypy==1.13.0", "pre-commit==4.0.1", "pycountry==24.6.1", - "pylint==3.3.1", + "pylint==3.3.2", "pytest-asyncio==0.24.0", "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", diff --git a/uv.lock b/uv.lock index ab8f1c88..d6640f4e 100644 --- a/uv.lock +++ b/uv.lock @@ -259,7 +259,7 @@ dev = [ { name = "mypy", specifier = "==1.13.0" }, { name = "pre-commit", specifier = "==4.0.1" }, { name = "pycountry", specifier = "==24.6.1" }, - { name = "pylint", specifier = "==3.3.1" }, + { name = "pylint", specifier = "==3.3.2" }, { name = "pytest", specifier = "==8.3.3" }, { name = "pytest-asyncio", specifier = "==0.24.0" }, { name = "pytest-cov", specifier = "==6.0.0" }, @@ -665,7 +665,7 @@ wheels = [ [[package]] name = "pylint" -version = "3.3.1" +version = "3.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "astroid" }, @@ -676,9 +676,9 @@ dependencies = [ { name = "platformdirs" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/3a/13e90e29777e695d90f422cf4fadb81c999e4755a9089838561bd0590cac/pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e", size = 1516703 } +sdist = { url = "https://files.pythonhosted.org/packages/81/d8/4471b2cb4ad18b4af717918c468209bd2bd5a02c52f60be5ee8a71b5af2c/pylint-3.3.2.tar.gz", hash = "sha256:9ec054ec992cd05ad30a6df1676229739a73f8feeabf3912c995d17601052b01", size = 1516485 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/11/4a3f814eee14593f3cfcf7046bc765bf1646d5c88132c08c45310fc7d85f/pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9", size = 521768 }, + { url = "https://files.pythonhosted.org/packages/61/55/5eaf6c415f6ddb09b9b039278823a8e27fb81ea7a34ec80c6d9223b17f2e/pylint-3.3.2-py3-none-any.whl", hash = "sha256:77f068c287d49b8683cd7c6e624243c74f92890f767f106ffa1ddf3c0a54cb7a", size = 521873 }, ] [[package]] From 27ee4e7a73d26b528150f8feffdda030bad4f2e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:03:57 +0100 Subject: [PATCH 033/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pytest=20to=20v8.3.4=20(#604)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 61c5e392..a30a9e13 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ dev-dependencies = [ "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", "pytest-timeout==2.3.1", - "pytest==8.3.3", + "pytest==8.3.4", "testfixtures==8.3.0", "types-cachetools>=5.5.0.20240820", "types-mock>=5.1.0.20240425", diff --git a/uv.lock b/uv.lock index d6640f4e..95430ca0 100644 --- a/uv.lock +++ b/uv.lock @@ -260,7 +260,7 @@ dev = [ { name = "pre-commit", specifier = "==4.0.1" }, { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.2" }, - { name = "pytest", specifier = "==8.3.3" }, + { name = "pytest", specifier = "==8.3.4" }, { name = "pytest-asyncio", specifier = "==0.24.0" }, { name = "pytest-cov", specifier = "==6.0.0" }, { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, @@ -683,7 +683,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.3.3" +version = "8.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -691,9 +691,9 @@ dependencies = [ { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } +sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 }, + { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, ] [[package]] From 69f89ba1475d54ec466548d5876604447c06bf44 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:12:55 +0100 Subject: [PATCH 034/138] [pre-commit.ci] pre-commit autoupdate (#601) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/astral-sh/ruff-pre-commit: v0.7.4 → v0.8.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.4...v0.8.1) * Fix ruff --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Robert Resch --- .pre-commit-config.yaml | 2 +- deebot_client/commands/json/__init__.py | 66 ++++++++++++------------- deebot_client/util/__init__.py | 12 ++--- pyproject.toml | 2 - 4 files changed, 40 insertions(+), 42 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 392040d9..02c9a824 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.7.4 + rev: v0.8.1 hooks: - id: ruff args: diff --git a/deebot_client/commands/json/__init__.py b/deebot_client/commands/json/__init__.py index aadc2e5e..384e2697 100644 --- a/deebot_client/commands/json/__init__.py +++ b/deebot_client/commands/json/__init__.py @@ -54,42 +54,30 @@ from .common import JsonCommand __all__ = [ + "Charge", + "Clean", + "CleanArea", + "CleanV2", + "ClearMap", "GetAdvancedMode", - "SetAdvancedMode", "GetBattery", "GetBorderSwitch", - "SetBorderSwitch", + "GetCachedMapInfo", "GetCarpetAutoFanBoost", - "SetCarpetAutoFanBoost", - "GetCleanCount", - "SetCleanCount", - "GetCleanPreference", - "SetCleanPreference", - "ClearMap", - "Charge", - "GetChildLock", - "SetChildLock", "GetChargeState", - "Clean", - "CleanV2", - "CleanArea", + "GetChildLock", + "GetCleanCount", "GetCleanInfo", "GetCleanInfoV2", "GetCleanLogs", + "GetCleanPreference", "GetContinuousCleaning", - "SetContinuousCleaning", - "SetCutDirection", - "GetCutDirection", "GetCrossMapBorderWarning", - "SetCrossMapBorderWarning", + "GetCutDirection", "GetEfficiencyMode", - "SetEfficiencyMode", "GetError", "GetFanSpeed", - "SetFanSpeed", "GetLifeSpan", - "ResetLifeSpan", - "GetCachedMapInfo", "GetMajorMap", "GetMapSet", "GetMapSetV2", @@ -97,30 +85,42 @@ "GetMapTrace", "GetMinorMap", "GetMoveUpWarning", - "SetMoveUpWarning", "GetMultimapState", - "SetMultimapState", "GetNetInfo", "GetOta", - "SetOta", - "PlaySound", "GetPos", - "SetRelocationState", "GetSafeProtect", - "SetSafeProtect", "GetStats", "GetSweepMode", - "SetSweepMode", "GetTotalStats", "GetTrueDetect", - "SetTrueDetect", "GetVoiceAssistantState", - "SetVoiceAssistantState", "GetVolume", - "SetVolume", "GetWaterInfo", - "SetWaterInfo", "GetWorkMode", + "PlaySound", + "ResetLifeSpan", + "SetAdvancedMode", + "SetBorderSwitch", + "SetCarpetAutoFanBoost", + "SetChildLock", + "SetCleanCount", + "SetCleanPreference", + "SetContinuousCleaning", + "SetCrossMapBorderWarning", + "SetCutDirection", + "SetEfficiencyMode", + "SetFanSpeed", + "SetMoveUpWarning", + "SetMultimapState", + "SetOta", + "SetRelocationState", + "SetSafeProtect", + "SetSweepMode", + "SetTrueDetect", + "SetVoiceAssistantState", + "SetVolume", + "SetWaterInfo", "SetWorkMode", ] diff --git a/deebot_client/util/__init__.py b/deebot_client/util/__init__.py index 3f0d914b..3d8f2a5c 100644 --- a/deebot_client/util/__init__.py +++ b/deebot_client/util/__init__.py @@ -96,10 +96,10 @@ def __init__( super().__init__(iterable) self._on_change = on_change - def __getattribute__(self, __name: str) -> Any: - if __name in OnChangedList._MODIFYING_FUNCTIONS: + def __getattribute__(self, name: str, /) -> Any: + if name in OnChangedList._MODIFYING_FUNCTIONS: self._on_change() - return super().__getattribute__(__name) + return super().__getattribute__(name) _KT = TypeVar("_KT") @@ -124,10 +124,10 @@ def __init__( super().__init__(iterable) self._on_change = on_change - def __getattribute__(self, __name: str) -> Any: - if __name in OnChangedDict._MODIFYING_FUNCTIONS: + def __getattribute__(self, name: str, /) -> Any: + if name in OnChangedDict._MODIFYING_FUNCTIONS: self._on_change() - return super().__getattribute__(__name) + return super().__getattribute__(name) LST = list[_T] | set[_T] | tuple[_T, ...] diff --git a/pyproject.toml b/pyproject.toml index a30a9e13..ccadde88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,8 +65,6 @@ select = [ ] ignore = [ - "ANN101", # Self... explanatory - "ANN102", # Cls... explanatory "ANN401", # Opinioated warning on disallowing dynamically typed expressions "D203", # Conflicts with other rules "D213", # Conflicts with other rules From c295849cf65251b69374410bd5db4ae2b9ebf8d3 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Wed, 4 Dec 2024 10:14:10 +0100 Subject: [PATCH 035/138] Add Deebot N20 Pro Plus (#608) --- deebot_client/hardware/deebot/qhe2o2.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/qhe2o2.py diff --git a/deebot_client/hardware/deebot/qhe2o2.py b/deebot_client/hardware/deebot/qhe2o2.py new file mode 120000 index 00000000..ee958842 --- /dev/null +++ b/deebot_client/hardware/deebot/qhe2o2.py @@ -0,0 +1 @@ +kr0277.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index d6dc4100..b4039cb1 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -270,6 +270,7 @@ def test_all_models_loaded() -> None: "p1jij8", "p95mgv", "paeygf", + "qhe2o2", "rss8xk", "s69g6z", "umwv6z", From f64582f738927cb86c25b8652dd76ec98bf489db Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:19:17 +0100 Subject: [PATCH 036/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#606)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 230 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/uv.lock b/uv.lock index 95430ca0..c0d00e48 100644 --- a/uv.lock +++ b/uv.lock @@ -3,16 +3,16 @@ requires-python = ">=3.12.0" [[package]] name = "aiohappyeyeballs" -version = "2.4.3" +version = "2.4.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/69/2f6d5a019bd02e920a3417689a89887b39ad1e350b562f9955693d900c40/aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586", size = 21809 } +sdist = { url = "https://files.pythonhosted.org/packages/7f/55/e4373e888fdacb15563ef6fa9fa8c8252476ea071e96fb46defac9f18bf2/aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745", size = 21977 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/d8/120cd0fe3e8530df0539e71ba9683eade12cae103dd7543e50d15f737917/aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572", size = 14742 }, + { url = "https://files.pythonhosted.org/packages/b9/74/fbb6559de3607b3300b9be3cc64e97548d55678e44623db17820dbd20002/aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8", size = 14756 }, ] [[package]] name = "aiohttp" -version = "3.11.7" +version = "3.11.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -23,38 +23,38 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/cb/f9bb10e0cf6f01730b27d370b10cc15822bea4395acd687abc8cc5fed3ed/aiohttp-3.11.7.tar.gz", hash = "sha256:01a8aca4af3da85cea5c90141d23f4b0eee3cbecfd33b029a45a80f28c66c668", size = 7666482 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/1e/2e96b2526c590dcb99db0b94ac4f9b927ecc07f94735a8a941dee143d48b/aiohttp-3.11.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4bb7493c3e3a36d3012b8564bd0e2783259ddd7ef3a81a74f0dbfa000fce48b7", size = 702326 }, - { url = "https://files.pythonhosted.org/packages/b5/ce/b5d7f3e68849f1f5e0b85af4ac9080b9d3c0a600857140024603653c2209/aiohttp-3.11.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e143b0ef9cb1a2b4f74f56d4fbe50caa7c2bb93390aff52f9398d21d89bc73ea", size = 461944 }, - { url = "https://files.pythonhosted.org/packages/28/fa/f4d98db1b7f8f0c3f74bdbd6d0d98cfc89984205cd33f1b8ee3f588ee5ad/aiohttp-3.11.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7c58a240260822dc07f6ae32a0293dd5bccd618bb2d0f36d51c5dbd526f89c0", size = 454348 }, - { url = "https://files.pythonhosted.org/packages/04/f0/c238dda5dc9a3d12b76636e2cf0ea475890ac3a1c7e4ff0fd6c3cea2fc2d/aiohttp-3.11.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d20cfe63a1c135d26bde8c1d0ea46fd1200884afbc523466d2f1cf517d1fe33", size = 1678795 }, - { url = "https://files.pythonhosted.org/packages/79/ee/3a18f792247e6d95dba13aaedc9dc317c3c6e75f4b88c2dd4b960d20ad2f/aiohttp-3.11.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12e4d45847a174f77b2b9919719203769f220058f642b08504cf8b1cf185dacf", size = 1734411 }, - { url = "https://files.pythonhosted.org/packages/f5/79/3eb84243087a9a32cae821622c935107b4b55a5b21b76772e8e6c41092e9/aiohttp-3.11.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf4efa2d01f697a7dbd0509891a286a4af0d86902fc594e20e3b1712c28c0106", size = 1788959 }, - { url = "https://files.pythonhosted.org/packages/91/93/ad77782c5edfa17aafc070bef978fbfb8459b2f150595ffb01b559c136f9/aiohttp-3.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee6a4cdcbf54b8083dc9723cdf5f41f722c00db40ccf9ec2616e27869151129", size = 1687463 }, - { url = "https://files.pythonhosted.org/packages/ba/48/db35bd21b7877efa0be5f28385d8978c55323c5ce7685712e53f3f6c0bd9/aiohttp-3.11.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6095aaf852c34f42e1bd0cf0dc32d1e4b48a90bfb5054abdbb9d64b36acadcb", size = 1618374 }, - { url = "https://files.pythonhosted.org/packages/ba/77/30f87db55c79fd145ed5fd15b92f2e820ce81065d41ae437797aaa550e3b/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1cf03d27885f8c5ebf3993a220cc84fc66375e1e6e812731f51aab2b2748f4a6", size = 1637021 }, - { url = "https://files.pythonhosted.org/packages/af/76/10b188b78ee18d0595af156d6a238bc60f9d8571f0f546027eb7eaf65b25/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1a17f6a230f81eb53282503823f59d61dff14fb2a93847bf0399dc8e87817307", size = 1650792 }, - { url = "https://files.pythonhosted.org/packages/fa/33/4411bbb8ad04c47d0f4c7bd53332aaf350e49469cf6b65b132d4becafe27/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:481f10a1a45c5f4c4a578bbd74cff22eb64460a6549819242a87a80788461fba", size = 1696248 }, - { url = "https://files.pythonhosted.org/packages/fe/2d/6135d0dc1851a33d3faa937b20fef81340bc95e8310536d4c7f1f8ecc026/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:db37248535d1ae40735d15bdf26ad43be19e3d93ab3f3dad8507eb0f85bb8124", size = 1729188 }, - { url = "https://files.pythonhosted.org/packages/f5/76/a57ceff577ae26fe9a6f31ac799bc638ecf26e4acdf04295290b9929b349/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd", size = 1690038 }, - { url = "https://files.pythonhosted.org/packages/4b/81/b20e09003b6989a7f23a721692137a6143420a151063c750ab2a04878e3c/aiohttp-3.11.7-cp312-cp312-win32.whl", hash = "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8", size = 409887 }, - { url = "https://files.pythonhosted.org/packages/b7/0b/607c98bff1d07bb21e0c39e7711108ef9ff4f2a361a3ec1ce8dce93623a5/aiohttp-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0", size = 436462 }, - { url = "https://files.pythonhosted.org/packages/7a/53/8d77186c6a33bd087714df18274cdcf6e36fd69a9e841c85b7e81a20b18e/aiohttp-3.11.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4", size = 695811 }, - { url = "https://files.pythonhosted.org/packages/62/b6/4c3d107a5406aa6f99f618afea82783f54ce2d9644020f50b9c88f6e823d/aiohttp-3.11.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68", size = 458530 }, - { url = "https://files.pythonhosted.org/packages/d9/05/dbf0bd3966be8ebed3beb4007a2d1356d79af4fe7c93e54f984df6385193/aiohttp-3.11.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5", size = 451371 }, - { url = "https://files.pythonhosted.org/packages/19/6a/2198580314617b6cf9c4b813b84df5832b5f8efedcb8a7e8b321a187233c/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa", size = 1662905 }, - { url = "https://files.pythonhosted.org/packages/2b/65/08696fd7503f6a6f9f782bd012bf47f36d4ed179a7d8c95dba4726d5cc67/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866", size = 1713794 }, - { url = "https://files.pythonhosted.org/packages/c8/a3/b9a72dce6f15e2efbc09fa67c1067c4f3a3bb05661c0ae7b40799cde02b7/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e", size = 1770757 }, - { url = "https://files.pythonhosted.org/packages/78/7e/8fb371b5f8c4c1eaa0d0a50750c0dd68059f86794aeb36919644815486f5/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da", size = 1673136 }, - { url = "https://files.pythonhosted.org/packages/2f/0f/09685d13d2c7634cb808868ea29c170d4dcde4215a4a90fb86491cd3ae25/aiohttp-3.11.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962", size = 1600370 }, - { url = "https://files.pythonhosted.org/packages/00/2e/18fd38b117f9b3a375166ccb70ed43cf7e3dfe2cc947139acc15feefc5a2/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d", size = 1613459 }, - { url = "https://files.pythonhosted.org/packages/2c/94/10a82abc680d753be33506be699aaa330152ecc4f316eaf081f996ee56c2/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd", size = 1613924 }, - { url = "https://files.pythonhosted.org/packages/e9/58/897c0561f5c522dda6e173192f1e4f10144e1a7126096f17a3f12b7aa168/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8", size = 1681164 }, - { url = "https://files.pythonhosted.org/packages/8b/8b/3a48b1cdafa612679d976274355f6a822de90b85d7dba55654ecfb01c979/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791", size = 1712139 }, - { url = "https://files.pythonhosted.org/packages/aa/9d/70ab5b4dd7900db04af72840e033aee06e472b1343e372ea256ed675511c/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52", size = 1667446 }, - { url = "https://files.pythonhosted.org/packages/cb/98/b5fbcc8f6056f0c56001c75227e6b7ca9ee4f2e5572feca82ff3d65d485d/aiohttp-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e", size = 408689 }, - { url = "https://files.pythonhosted.org/packages/ef/07/4d1504577fa6349dd2e3839e89fb56e5dee38d64efe3d4366e9fcfda0cdb/aiohttp-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9", size = 434809 }, +sdist = { url = "https://files.pythonhosted.org/packages/3f/24/d5c0aed3ed90896f8505786e3a1e348fd9c61284ef21f54ee9cdf8b92e4f/aiohttp-3.11.9.tar.gz", hash = "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", size = 7668012 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/43/b3c28a7e8f8b5e8ef0bea9fcabe8e99787c70fa526e5bc8185fd89f46434/aiohttp-3.11.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", size = 703661 }, + { url = "https://files.pythonhosted.org/packages/f3/2c/be4624671e5ed344fca9196d0823eb6a17383cbe13d051d22d3a1f6ecbf7/aiohttp-3.11.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", size = 463054 }, + { url = "https://files.pythonhosted.org/packages/d6/21/8d14fa0bdae468ebe419df1764583ecc9e995a2ccd8a11ee8146a09fb5e5/aiohttp-3.11.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", size = 455006 }, + { url = "https://files.pythonhosted.org/packages/42/de/3fc5e94a24bf079709e9fed3572ebb5efb32f0995baf08a985ee9f517b0b/aiohttp-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", size = 1681364 }, + { url = "https://files.pythonhosted.org/packages/69/e0/bd9346efcdd3344284e4b4088bc2c720065176bd9180517bdc7097218903/aiohttp-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", size = 1735986 }, + { url = "https://files.pythonhosted.org/packages/9b/a5/549ce29e21ebf555dcf5c81e19e6eb30eb8de26f8da304f05a28d6d66d8c/aiohttp-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", size = 1792263 }, + { url = "https://files.pythonhosted.org/packages/7a/2b/23124c04701e0d2e215be59bf445c33602b1ccc4d9acb7bccc2ec20c892d/aiohttp-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", size = 1690838 }, + { url = "https://files.pythonhosted.org/packages/af/a6/ebb8be53787c57dd7dd8b9617357af60d603ccd2fbf7a9e306f33178894b/aiohttp-3.11.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", size = 1618311 }, + { url = "https://files.pythonhosted.org/packages/9b/3c/cb8e5af30e33775539b4a6ea818eb16b0b01f68ce7a2fa77dff5df3dee80/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", size = 1640417 }, + { url = "https://files.pythonhosted.org/packages/16/2d/62593ce65e5811ea46e521644e03d0c47345bf9b6c2e6efcb759915d6aa3/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", size = 1645507 }, + { url = "https://files.pythonhosted.org/packages/4f/6b/810981c99932665a225d7bdffacbda512dde6f11364ce11477662e457115/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", size = 1701090 }, + { url = "https://files.pythonhosted.org/packages/1c/01/79c8d156534c034207ccbb94a51f1ae4a625834a31e27670175f1e1e79b2/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", size = 1733598 }, + { url = "https://files.pythonhosted.org/packages/c0/8f/873f0d3a47ec203ccd04dbd623f2428b6010ba6b11107aa9b44ad0ebfc86/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", size = 1693573 }, + { url = "https://files.pythonhosted.org/packages/2f/8c/a4964108383eb8f0e5a85ee0fdc00f9f0bdf28bb6a751be05a63c047ccbe/aiohttp-3.11.9-cp312-cp312-win32.whl", hash = "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", size = 410354 }, + { url = "https://files.pythonhosted.org/packages/c8/9e/79aed1b3e110a02081ca47ba4a27d7e20040af241643a2e527c668634f22/aiohttp-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", size = 436657 }, + { url = "https://files.pythonhosted.org/packages/33/ec/217d8918032703639d64360e4534a33899cc1a5eda89268d4fa621e18b67/aiohttp-3.11.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", size = 696994 }, + { url = "https://files.pythonhosted.org/packages/48/e4/262211b96cba78614be9bae7086af0dba8e8050c43996f2912992173eb57/aiohttp-3.11.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", size = 459669 }, + { url = "https://files.pythonhosted.org/packages/51/f5/ef76735af2d69671aa8cb185c07da84973a2ca74bb44af9fdb980207118f/aiohttp-3.11.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", size = 451949 }, + { url = "https://files.pythonhosted.org/packages/ba/83/867487d4ca86327060b93f3eea70963996a7ebb0c16f61c214f801351d4a/aiohttp-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", size = 1664171 }, + { url = "https://files.pythonhosted.org/packages/ca/7d/b185b4b6b01bf66bcaf1b23afff3073fc85d2f0765203269ee4976be2cf8/aiohttp-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", size = 1716933 }, + { url = "https://files.pythonhosted.org/packages/a9/b3/70d7f26a874e96f932237e53017b048ecd754f06a29947bdf7ce39cade98/aiohttp-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", size = 1774117 }, + { url = "https://files.pythonhosted.org/packages/a5/6e/457acf09ac5bd6db5ae8b1fa68beb3000c989a2a20dc265a507123f7a689/aiohttp-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", size = 1676168 }, + { url = "https://files.pythonhosted.org/packages/e8/e8/2b4719633d0a8189dfce343af800d23163b8831cb5aa175d4c400b03895b/aiohttp-3.11.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", size = 1602187 }, + { url = "https://files.pythonhosted.org/packages/d8/0c/8938b85edaf0a8fee2ede7bbffd32e09b056475f7586b0852973749c5fff/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", size = 1617286 }, + { url = "https://files.pythonhosted.org/packages/1e/5c/825714aa554c4ef331a8c1a16b3183c5e4bf27c66073955d4f51344907dc/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", size = 1615518 }, + { url = "https://files.pythonhosted.org/packages/c8/1c/6c821e7cf956e833a72a5284ff19484c7dedb749224e16fda297fa38bbc2/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", size = 1684466 }, + { url = "https://files.pythonhosted.org/packages/6b/47/3e921cbf7d7c4edfe95ddb7e8315a8f3645d824863ef2c2eab5dfa0342bc/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", size = 1714304 }, + { url = "https://files.pythonhosted.org/packages/25/89/e68e3efd357f233265abcf22c48c4d1e81f992f264cd4dc69b96c5a13c47/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", size = 1671774 }, + { url = "https://files.pythonhosted.org/packages/79/e1/4adaed8c8ef93c2ae54b001cd0e8dd6c84b40044038acb322b649150dc96/aiohttp-3.11.9-cp313-cp313-win32.whl", hash = "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", size = 409216 }, + { url = "https://files.pythonhosted.org/packages/00/9b/bf33704ac9b438d6dad417f86f1e9439e2538180189b0e347a95ff819011/aiohttp-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", size = 435069 }, ] [[package]] @@ -362,11 +362,11 @@ wheels = [ [[package]] name = "identify" -version = "2.6.2" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/02/79/7a520fc5011e02ca3f3285b5f6820eaf80443eb73e3733f73c02fb42ba0b/identify-2.6.2.tar.gz", hash = "sha256:fab5c716c24d7a789775228823797296a2994b075fb6080ac83a102772a98cbd", size = 99113 } +sdist = { url = "https://files.pythonhosted.org/packages/1a/5f/05f0d167be94585d502b4adf8c7af31f1dc0b1c7e14f9938a88fdbbcf4a7/identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02", size = 99179 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/86/c4395700f3c5475424fb5c41e20c16be28d10c904aee4d005ba3217fc8e7/identify-2.6.2-py2.py3-none-any.whl", hash = "sha256:c097384259f49e372f4ea00a19719d95ae27dd5ff0fd77ad630aa891306b82f3", size = 98982 }, + { url = "https://files.pythonhosted.org/packages/c9/f5/09644a3ad803fae9eca8efa17e1f2aef380c7f0b02f7ec4e8d446e51d64a/identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd", size = 99049 }, ] [[package]] @@ -615,43 +615,43 @@ wheels = [ [[package]] name = "propcache" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/4d/5e5a60b78dbc1d464f8a7bbaeb30957257afdc8512cbb9dfd5659304f5cd/propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", size = 40951 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/46/a41ca1097769fc548fc9216ec4c1471b772cc39720eb47ed7e38ef0006a9/propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", size = 80800 }, - { url = "https://files.pythonhosted.org/packages/75/4f/93df46aab9cc473498ff56be39b5f6ee1e33529223d7a4d8c0a6101a9ba2/propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", size = 46443 }, - { url = "https://files.pythonhosted.org/packages/0b/17/308acc6aee65d0f9a8375e36c4807ac6605d1f38074b1581bd4042b9fb37/propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", size = 45676 }, - { url = "https://files.pythonhosted.org/packages/65/44/626599d2854d6c1d4530b9a05e7ff2ee22b790358334b475ed7c89f7d625/propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", size = 246191 }, - { url = "https://files.pythonhosted.org/packages/f2/df/5d996d7cb18df076debae7d76ac3da085c0575a9f2be6b1f707fe227b54c/propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", size = 251791 }, - { url = "https://files.pythonhosted.org/packages/2e/6d/9f91e5dde8b1f662f6dd4dff36098ed22a1ef4e08e1316f05f4758f1576c/propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", size = 253434 }, - { url = "https://files.pythonhosted.org/packages/3c/e9/1b54b7e26f50b3e0497cd13d3483d781d284452c2c50dd2a615a92a087a3/propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", size = 248150 }, - { url = "https://files.pythonhosted.org/packages/a7/ef/a35bf191c8038fe3ce9a414b907371c81d102384eda5dbafe6f4dce0cf9b/propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", size = 233568 }, - { url = "https://files.pythonhosted.org/packages/97/d9/d00bb9277a9165a5e6d60f2142cd1a38a750045c9c12e47ae087f686d781/propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", size = 229874 }, - { url = "https://files.pythonhosted.org/packages/8e/78/c123cf22469bdc4b18efb78893e69c70a8b16de88e6160b69ca6bdd88b5d/propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", size = 225857 }, - { url = "https://files.pythonhosted.org/packages/31/1b/fd6b2f1f36d028820d35475be78859d8c89c8f091ad30e377ac49fd66359/propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", size = 227604 }, - { url = "https://files.pythonhosted.org/packages/99/36/b07be976edf77a07233ba712e53262937625af02154353171716894a86a6/propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", size = 238430 }, - { url = "https://files.pythonhosted.org/packages/0d/64/5822f496c9010e3966e934a011ac08cac8734561842bc7c1f65586e0683c/propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", size = 244814 }, - { url = "https://files.pythonhosted.org/packages/fd/bd/8657918a35d50b18a9e4d78a5df7b6c82a637a311ab20851eef4326305c1/propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", size = 235922 }, - { url = "https://files.pythonhosted.org/packages/a8/6f/ec0095e1647b4727db945213a9f395b1103c442ef65e54c62e92a72a3f75/propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", size = 40177 }, - { url = "https://files.pythonhosted.org/packages/20/a2/bd0896fdc4f4c1db46d9bc361c8c79a9bf08ccc08ba054a98e38e7ba1557/propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", size = 44446 }, - { url = "https://files.pythonhosted.org/packages/a8/a7/5f37b69197d4f558bfef5b4bceaff7c43cc9b51adf5bd75e9081d7ea80e4/propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", size = 78120 }, - { url = "https://files.pythonhosted.org/packages/c8/cd/48ab2b30a6b353ecb95a244915f85756d74f815862eb2ecc7a518d565b48/propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", size = 45127 }, - { url = "https://files.pythonhosted.org/packages/a5/ba/0a1ef94a3412aab057bd996ed5f0ac7458be5bf469e85c70fa9ceb43290b/propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", size = 44419 }, - { url = "https://files.pythonhosted.org/packages/b4/6c/ca70bee4f22fa99eacd04f4d2f1699be9d13538ccf22b3169a61c60a27fa/propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", size = 229611 }, - { url = "https://files.pythonhosted.org/packages/19/70/47b872a263e8511ca33718d96a10c17d3c853aefadeb86dc26e8421184b9/propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", size = 234005 }, - { url = "https://files.pythonhosted.org/packages/4f/be/3b0ab8c84a22e4a3224719099c1229ddfdd8a6a1558cf75cb55ee1e35c25/propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", size = 237270 }, - { url = "https://files.pythonhosted.org/packages/04/d8/f071bb000d4b8f851d312c3c75701e586b3f643fe14a2e3409b1b9ab3936/propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", size = 231877 }, - { url = "https://files.pythonhosted.org/packages/93/e7/57a035a1359e542bbb0a7df95aad6b9871ebee6dce2840cb157a415bd1f3/propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", size = 217848 }, - { url = "https://files.pythonhosted.org/packages/f0/93/d1dea40f112ec183398fb6c42fde340edd7bab202411c4aa1a8289f461b6/propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", size = 216987 }, - { url = "https://files.pythonhosted.org/packages/62/4c/877340871251145d3522c2b5d25c16a1690ad655fbab7bb9ece6b117e39f/propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", size = 212451 }, - { url = "https://files.pythonhosted.org/packages/7c/bb/a91b72efeeb42906ef58ccf0cdb87947b54d7475fee3c93425d732f16a61/propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", size = 212879 }, - { url = "https://files.pythonhosted.org/packages/9b/7f/ee7fea8faac57b3ec5d91ff47470c6c5d40d7f15d0b1fccac806348fa59e/propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", size = 222288 }, - { url = "https://files.pythonhosted.org/packages/ff/d7/acd67901c43d2e6b20a7a973d9d5fd543c6e277af29b1eb0e1f7bd7ca7d2/propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", size = 228257 }, - { url = "https://files.pythonhosted.org/packages/8d/6f/6272ecc7a8daad1d0754cfc6c8846076a8cb13f810005c79b15ce0ef0cf2/propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", size = 221075 }, - { url = "https://files.pythonhosted.org/packages/7c/bd/c7a6a719a6b3dd8b3aeadb3675b5783983529e4a3185946aa444d3e078f6/propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", size = 39654 }, - { url = "https://files.pythonhosted.org/packages/88/e7/0eef39eff84fa3e001b44de0bd41c7c0e3432e7648ffd3d64955910f002d/propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", size = 43705 }, - { url = "https://files.pythonhosted.org/packages/3d/b6/e6d98278f2d49b22b4d033c9f792eda783b9ab2094b041f013fc69bcde87/propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", size = 11603 }, +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/c8/2a13f78d82211490855b2fb303b6721348d0787fdd9a12ac46d99d3acde1/propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64", size = 41735 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/28/1d205fe49be8b1b4df4c50024e62480a442b1a7b818e734308bb0d17e7fb/propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a", size = 79588 }, + { url = "https://files.pythonhosted.org/packages/21/ee/fc4d893f8d81cd4971affef2a6cb542b36617cd1d8ce56b406112cb80bf7/propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0", size = 45825 }, + { url = "https://files.pythonhosted.org/packages/4a/de/bbe712f94d088da1d237c35d735f675e494a816fd6f54e9db2f61ef4d03f/propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d", size = 45357 }, + { url = "https://files.pythonhosted.org/packages/7f/14/7ae06a6cf2a2f1cb382586d5a99efe66b0b3d0c6f9ac2f759e6f7af9d7cf/propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4", size = 241869 }, + { url = "https://files.pythonhosted.org/packages/cc/59/227a78be960b54a41124e639e2c39e8807ac0c751c735a900e21315f8c2b/propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d", size = 247884 }, + { url = "https://files.pythonhosted.org/packages/84/58/f62b4ffaedf88dc1b17f04d57d8536601e4e030feb26617228ef930c3279/propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5", size = 248486 }, + { url = "https://files.pythonhosted.org/packages/1c/07/ebe102777a830bca91bbb93e3479cd34c2ca5d0361b83be9dbd93104865e/propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24", size = 243649 }, + { url = "https://files.pythonhosted.org/packages/ed/bc/4f7aba7f08f520376c4bb6a20b9a981a581b7f2e385fa0ec9f789bb2d362/propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff", size = 229103 }, + { url = "https://files.pythonhosted.org/packages/fe/d5/04ac9cd4e51a57a96f78795e03c5a0ddb8f23ec098b86f92de028d7f2a6b/propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f", size = 226607 }, + { url = "https://files.pythonhosted.org/packages/e3/f0/24060d959ea41d7a7cc7fdbf68b31852331aabda914a0c63bdb0e22e96d6/propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec", size = 221153 }, + { url = "https://files.pythonhosted.org/packages/77/a7/3ac76045a077b3e4de4859a0753010765e45749bdf53bd02bc4d372da1a0/propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348", size = 222151 }, + { url = "https://files.pythonhosted.org/packages/e7/af/5e29da6f80cebab3f5a4dcd2a3240e7f56f2c4abf51cbfcc99be34e17f0b/propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6", size = 233812 }, + { url = "https://files.pythonhosted.org/packages/8c/89/ebe3ad52642cc5509eaa453e9f4b94b374d81bae3265c59d5c2d98efa1b4/propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6", size = 238829 }, + { url = "https://files.pythonhosted.org/packages/e9/2f/6b32f273fa02e978b7577159eae7471b3cfb88b48563b1c2578b2d7ca0bb/propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518", size = 230704 }, + { url = "https://files.pythonhosted.org/packages/5c/2e/f40ae6ff5624a5f77edd7b8359b208b5455ea113f68309e2b00a2e1426b6/propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246", size = 40050 }, + { url = "https://files.pythonhosted.org/packages/3b/77/a92c3ef994e47180862b9d7d11e37624fb1c00a16d61faf55115d970628b/propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1", size = 44117 }, + { url = "https://files.pythonhosted.org/packages/0f/2a/329e0547cf2def8857157f9477669043e75524cc3e6251cef332b3ff256f/propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc", size = 77002 }, + { url = "https://files.pythonhosted.org/packages/12/2d/c4df5415e2382f840dc2ecbca0eeb2293024bc28e57a80392f2012b4708c/propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9", size = 44639 }, + { url = "https://files.pythonhosted.org/packages/d0/5a/21aaa4ea2f326edaa4e240959ac8b8386ea31dedfdaa636a3544d9e7a408/propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439", size = 44049 }, + { url = "https://files.pythonhosted.org/packages/4e/3e/021b6cd86c0acc90d74784ccbb66808b0bd36067a1bf3e2deb0f3845f618/propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536", size = 224819 }, + { url = "https://files.pythonhosted.org/packages/3c/57/c2fdeed1b3b8918b1770a133ba5c43ad3d78e18285b0c06364861ef5cc38/propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629", size = 229625 }, + { url = "https://files.pythonhosted.org/packages/9d/81/70d4ff57bf2877b5780b466471bebf5892f851a7e2ca0ae7ffd728220281/propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b", size = 232934 }, + { url = "https://files.pythonhosted.org/packages/3c/b9/bb51ea95d73b3fb4100cb95adbd4e1acaf2cbb1fd1083f5468eeb4a099a8/propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052", size = 227361 }, + { url = "https://files.pythonhosted.org/packages/f1/20/3c6d696cd6fd70b29445960cc803b1851a1131e7a2e4ee261ee48e002bcd/propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce", size = 213904 }, + { url = "https://files.pythonhosted.org/packages/a1/cb/1593bfc5ac6d40c010fa823f128056d6bc25b667f5393781e37d62f12005/propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d", size = 212632 }, + { url = "https://files.pythonhosted.org/packages/6d/5c/e95617e222be14a34c709442a0ec179f3207f8a2b900273720501a70ec5e/propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce", size = 207897 }, + { url = "https://files.pythonhosted.org/packages/8e/3b/56c5ab3dc00f6375fbcdeefdede5adf9bee94f1fab04adc8db118f0f9e25/propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95", size = 208118 }, + { url = "https://files.pythonhosted.org/packages/86/25/d7ef738323fbc6ebcbce33eb2a19c5e07a89a3df2fded206065bd5e868a9/propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf", size = 217851 }, + { url = "https://files.pythonhosted.org/packages/b3/77/763e6cef1852cf1ba740590364ec50309b89d1c818e3256d3929eb92fabf/propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f", size = 222630 }, + { url = "https://files.pythonhosted.org/packages/4f/e9/0f86be33602089c701696fbed8d8c4c07b6ee9605c5b7536fd27ed540c5b/propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30", size = 216269 }, + { url = "https://files.pythonhosted.org/packages/cc/02/5ac83217d522394b6a2e81a2e888167e7ca629ef6569a3f09852d6dcb01a/propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6", size = 39472 }, + { url = "https://files.pythonhosted.org/packages/f4/33/d6f5420252a36034bc8a3a01171bc55b4bff5df50d1c63d9caa50693662f/propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1", size = 43363 }, + { url = "https://files.pythonhosted.org/packages/41/b6/c5319caea262f4821995dca2107483b94a3345d4607ad797c76cb9c36bcc/propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", size = 11818 }, ] [[package]] @@ -872,60 +872,60 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.27.1" +version = "20.28.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/b3/7b6a79c5c8cf6d90ea681310e169cf2db2884f4d583d16c6e1d5a75a4e04/virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba", size = 6491145 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/75/53316a5a8050069228a2f6d11f32046cfa94fbb6cc3f08703f59b873de2e/virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa", size = 7650368 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/92/78324ff89391e00c8f4cf6b8526c41c6ef36b4ea2d2c132250b1a6fc2b8d/virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4", size = 3117838 }, + { url = "https://files.pythonhosted.org/packages/10/f9/0919cf6f1432a8c4baa62511f8f8da8225432d22e83e3476f5be1a1edc6e/virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0", size = 4276702 }, ] [[package]] name = "yarl" -version = "1.18.0" +version = "1.18.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/4b/53db4ecad4d54535aff3dfda1f00d6363d79455f62b11b8ca97b82746bd2/yarl-1.18.0.tar.gz", hash = "sha256:20d95535e7d833889982bfe7cc321b7f63bf8879788fee982c76ae2b24cfb715", size = 180098 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/36/c579b80a5c76c0d41c8e08baddb3e6940dfc20569db579a5691392c52afa/yarl-1.18.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1ece25e2251c28bab737bdf0519c88189b3dd9492dc086a1d77336d940c28ced", size = 142376 }, - { url = "https://files.pythonhosted.org/packages/0c/5f/e247dc7c0607a0c505fea6c839721844bee55686dfb183c7d7b8ef8a9cb1/yarl-1.18.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:454902dc1830d935c90b5b53c863ba2a98dcde0fbaa31ca2ed1ad33b2a7171c6", size = 94692 }, - { url = "https://files.pythonhosted.org/packages/eb/e1/3081b578a6f21961711b9a1c49c2947abb3b0d0dd9537378fb06777ce8ee/yarl-1.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01be8688fc211dc237e628fcc209dda412d35de7642453059a0553747018d075", size = 92527 }, - { url = "https://files.pythonhosted.org/packages/2f/fa/d9e1b9fbafa4cc82cd3980b5314741b33c2fe16308d725449a23aed32021/yarl-1.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d26f1fa9fa2167bb238f6f4b20218eb4e88dd3ef21bb8f97439fa6b5313e30d", size = 332096 }, - { url = "https://files.pythonhosted.org/packages/93/b6/dd27165114317875838e216214fb86338dc63d2e50855a8f2a12de2a7fe5/yarl-1.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b234a4a9248a9f000b7a5dfe84b8cb6210ee5120ae70eb72a4dcbdb4c528f72f", size = 342047 }, - { url = "https://files.pythonhosted.org/packages/fc/9f/bad434b5279ae7a356844e14dc771c3d29eb928140bbc01621af811c8a27/yarl-1.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe94d1de77c4cd8caff1bd5480e22342dbd54c93929f5943495d9c1e8abe9f42", size = 341712 }, - { url = "https://files.pythonhosted.org/packages/9a/9f/63864f43d131ba8c8cdf1bde5dd3f02f0eff8a7c883a5d7fad32f204fda5/yarl-1.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4c90c5363c6b0a54188122b61edb919c2cd1119684999d08cd5e538813a28e", size = 336654 }, - { url = "https://files.pythonhosted.org/packages/20/30/b4542bbd9be73de155213207eec019f6fe6495885f7dd59aa1ff705a041b/yarl-1.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a98ecadc5a241c9ba06de08127ee4796e1009555efd791bac514207862b43d", size = 325484 }, - { url = "https://files.pythonhosted.org/packages/69/bc/e2a9808ec26989cf0d1b98fe7b3cc45c1c6506b5ea4fe43ece5991f28f34/yarl-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9106025c7f261f9f5144f9aa7681d43867eed06349a7cfb297a1bc804de2f0d1", size = 344213 }, - { url = "https://files.pythonhosted.org/packages/e2/17/0ee5a68886aca1a8071b0d24a1e1c0fd9970dead2ef2d5e26e027fb7ce88/yarl-1.18.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f275ede6199d0f1ed4ea5d55a7b7573ccd40d97aee7808559e1298fe6efc8dbd", size = 340517 }, - { url = "https://files.pythonhosted.org/packages/fd/db/1fe4ef38ee852bff5ec8f5367d718b3a7dac7520f344b8e50306f68a2940/yarl-1.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f7edeb1dcc7f50a2c8e08b9dc13a413903b7817e72273f00878cb70e766bdb3b", size = 346234 }, - { url = "https://files.pythonhosted.org/packages/b4/ee/5e5bccdb821eb9949ba66abb4d19e3299eee00282e37b42f65236120e892/yarl-1.18.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c083f6dd6951b86e484ebfc9c3524b49bcaa9c420cb4b2a78ef9f7a512bfcc85", size = 359625 }, - { url = "https://files.pythonhosted.org/packages/3f/43/95a64d9e7ab4aa1c34fc5ea0edb35b581bc6ad33fd960a8ae34c2040b319/yarl-1.18.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:80741ec5b471fbdfb997821b2842c59660a1c930ceb42f8a84ba8ca0f25a66aa", size = 364239 }, - { url = "https://files.pythonhosted.org/packages/40/19/09ce976c624c9d3cc898f0be5035ddef0c0759d85b2313321cfe77b69915/yarl-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1a3297b9cad594e1ff0c040d2881d7d3a74124a3c73e00c3c71526a1234a9f7", size = 357599 }, - { url = "https://files.pythonhosted.org/packages/7d/35/6f33fd29791af2ec161aebe8abe63e788c2b74a6c7e8f29c92e5f5e96849/yarl-1.18.0-cp312-cp312-win32.whl", hash = "sha256:cd6ab7d6776c186f544f893b45ee0c883542b35e8a493db74665d2e594d3ca75", size = 83832 }, - { url = "https://files.pythonhosted.org/packages/4e/8e/cdb40ef98597be107de67b11e2f1f23f911e0f1416b938885d17a338e304/yarl-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:039c299a0864d1f43c3e31570045635034ea7021db41bf4842693a72aca8df3a", size = 90132 }, - { url = "https://files.pythonhosted.org/packages/2b/77/2196b657c66f97adaef0244e9e015f30eac0df59c31ad540f79ce328feed/yarl-1.18.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fb64dd45453225f57d82c4764818d7a205ee31ce193e9f0086e493916bd4f72", size = 140512 }, - { url = "https://files.pythonhosted.org/packages/0e/d8/2bb6e26fddba5c01bad284e4571178c651b97e8e06318efcaa16e07eb9fd/yarl-1.18.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3adaaf9c6b1b4fc258584f4443f24d775a2086aee82d1387e48a8b4f3d6aecf6", size = 93875 }, - { url = "https://files.pythonhosted.org/packages/54/e4/99fbb884dd9f814fb0037dc1783766bb9edcd57b32a76f3ec5ac5c5772d7/yarl-1.18.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:da206d1ec78438a563c5429ab808a2b23ad7bc025c8adbf08540dde202be37d5", size = 91705 }, - { url = "https://files.pythonhosted.org/packages/3b/a2/5bd86eca9449e6b15d3b08005cf4e58e3da972240c2bee427b358c311549/yarl-1.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:576d258b21c1db4c6449b1c572c75d03f16a482eb380be8003682bdbe7db2f28", size = 333325 }, - { url = "https://files.pythonhosted.org/packages/94/50/a218da5f159cd985685bc72c500bb1a7fd2d60035d2339b8a9d9e1f99194/yarl-1.18.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60e547c0a375c4bfcdd60eef82e7e0e8698bf84c239d715f5c1278a73050393", size = 344121 }, - { url = "https://files.pythonhosted.org/packages/a4/e3/830ae465811198b4b5ebecd674b5b3dca4d222af2155eb2144bfe190bbb8/yarl-1.18.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3818eabaefb90adeb5e0f62f047310079d426387991106d4fbf3519eec7d90a", size = 345163 }, - { url = "https://files.pythonhosted.org/packages/7a/74/05c4326877ca541eee77b1ef74b7ac8081343d3957af8f9291ca6eca6fec/yarl-1.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5f72421246c21af6a92fbc8c13b6d4c5427dfd949049b937c3b731f2f9076bd", size = 339130 }, - { url = "https://files.pythonhosted.org/packages/29/42/842f35aa1dae25d132119ee92185e8c75d8b9b7c83346506bd31e9fa217f/yarl-1.18.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa7d37f2ada0f42e0723632993ed422f2a679af0e200874d9d861720a54f53e", size = 326418 }, - { url = "https://files.pythonhosted.org/packages/f9/ed/65c0514f2d1e8b92a61f564c914381d078766cab38b5fbde355b3b3af1fb/yarl-1.18.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:42ba84e2ac26a3f252715f8ec17e6fdc0cbf95b9617c5367579fafcd7fba50eb", size = 345204 }, - { url = "https://files.pythonhosted.org/packages/23/31/351f64f0530c372fa01160f38330f44478e7bf3092f5ce2bfcb91605561d/yarl-1.18.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6a49ad0102c0f0ba839628d0bf45973c86ce7b590cdedf7540d5b1833ddc6f00", size = 341652 }, - { url = "https://files.pythonhosted.org/packages/49/aa/0c6e666c218d567727c1d040d01575685e7f9b18052fd68a59c9f61fe5d9/yarl-1.18.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:96404e8d5e1bbe36bdaa84ef89dc36f0e75939e060ca5cd45451aba01db02902", size = 347257 }, - { url = "https://files.pythonhosted.org/packages/36/0b/33a093b0e13bb8cd0f27301779661ff325270b6644929001f8f33307357d/yarl-1.18.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a0509475d714df8f6d498935b3f307cd122c4ca76f7d426c7e1bb791bcd87eda", size = 359735 }, - { url = "https://files.pythonhosted.org/packages/a8/92/dcc0b37c48632e71ffc2b5f8b0509347a0bde55ab5862ff755dce9dd56c4/yarl-1.18.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ff116f0285b5c8b3b9a2680aeca29a858b3b9e0402fc79fd850b32c2bcb9f8b", size = 365982 }, - { url = "https://files.pythonhosted.org/packages/0e/39/30e2a24a7a6c628dccb13eb6c4a03db5f6cd1eb2c6cda56a61ddef764c11/yarl-1.18.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2580c1d7e66e6d29d6e11855e3b1c6381971e0edd9a5066e6c14d79bc8967af", size = 360128 }, - { url = "https://files.pythonhosted.org/packages/76/13/12b65dca23b1fb8ae44269a4d24048fd32ac90b445c985b0a46fdfa30cfe/yarl-1.18.0-cp313-cp313-win32.whl", hash = "sha256:14408cc4d34e202caba7b5ac9cc84700e3421a9e2d1b157d744d101b061a4a88", size = 309888 }, - { url = "https://files.pythonhosted.org/packages/f6/60/478d3d41a4bf0b9e7dca74d870d114e775d1ff7156b7d1e0e9972e8f97fd/yarl-1.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:1db1537e9cb846eb0ff206eac667f627794be8b71368c1ab3207ec7b6f8c5afc", size = 315459 }, - { url = "https://files.pythonhosted.org/packages/30/9c/3f7ab894a37b1520291247cbc9ea6756228d098dae5b37eec848d404a204/yarl-1.18.0-py3-none-any.whl", hash = "sha256:dbf53db46f7cf176ee01d8d98c39381440776fcda13779d269a8ba664f69bec0", size = 44840 }, +sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 }, + { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 }, + { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 }, + { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 }, + { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 }, + { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 }, + { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 }, + { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 }, + { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 }, + { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 }, + { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 }, + { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 }, + { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 }, + { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 }, + { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 }, + { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 }, + { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 }, + { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 }, + { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 }, + { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 }, + { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 }, + { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 }, + { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 }, + { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 }, + { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 }, + { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 }, + { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 }, + { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 }, + { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 }, + { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 }, + { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 }, + { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 }, + { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, ] From aa7b6e9222c2f6ec2e662b575ea5b1ae1beb73a9 Mon Sep 17 00:00:00 2001 From: Lorenzo Monaco <1611929+lnx85@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:39:09 +0100 Subject: [PATCH 037/138] Add support for Deebot N8 (#613) * Add support for Deebot N8 * Fix test --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/ty84oi.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/ty84oi.py diff --git a/deebot_client/hardware/deebot/ty84oi.py b/deebot_client/hardware/deebot/ty84oi.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/ty84oi.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index b4039cb1..dac3a4fe 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -273,6 +273,7 @@ def test_all_models_loaded() -> None: "qhe2o2", "rss8xk", "s69g6z", + "ty84oi", "umwv6z", "vi829v", "x5d34r", From f15c2832120a27db2765c05d1a623b5851b9bb9d Mon Sep 17 00:00:00 2001 From: Kokahontas13 <37337892+Kokahontas13@users.noreply.github.com> Date: Thu, 5 Dec 2024 18:00:13 +0100 Subject: [PATCH 038/138] Add support for Deebot N8 Pro+ (#617) Co-authored-by: nils.tanner --- deebot_client/hardware/deebot/ifbw08.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/ifbw08.py diff --git a/deebot_client/hardware/deebot/ifbw08.py b/deebot_client/hardware/deebot/ifbw08.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/ifbw08.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index dac3a4fe..4b16e996 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -263,6 +263,7 @@ def test_all_models_loaded() -> None: "clojes", "e6ofmn", "guzput", + "ifbw08", "itk04l", "kr0277", "lf3bn4", From 7cdc018350aad6079589b31ad120794b466d36f3 Mon Sep 17 00:00:00 2001 From: Davide Bertolotti <50581327+portbusy@users.noreply.github.com> Date: Thu, 5 Dec 2024 18:09:20 +0100 Subject: [PATCH 039/138] Add support for Deebot T10 (#618) * Add support for Deebot T10 * Fix test * Remove it * Add proper symbolic link --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/jtmf04.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/jtmf04.py diff --git a/deebot_client/hardware/deebot/jtmf04.py b/deebot_client/hardware/deebot/jtmf04.py new file mode 120000 index 00000000..0f26ba6a --- /dev/null +++ b/deebot_client/hardware/deebot/jtmf04.py @@ -0,0 +1 @@ +p1jij8.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 4b16e996..2155f75a 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -265,6 +265,7 @@ def test_all_models_loaded() -> None: "guzput", "ifbw08", "itk04l", + "jtmf04", "kr0277", "lf3bn4", "lx3j7m", From 65b935c0e7370e7c78045b52894761229968be4d Mon Sep 17 00:00:00 2001 From: r1cht3r Date: Thu, 5 Dec 2024 12:27:53 -0500 Subject: [PATCH 040/138] Add support for Deebot N8 Pro+ Black (#619) --- deebot_client/hardware/deebot/85as7h.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/85as7h.py diff --git a/deebot_client/hardware/deebot/85as7h.py b/deebot_client/hardware/deebot/85as7h.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/85as7h.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 2155f75a..462afb28 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -257,6 +257,7 @@ def test_all_models_loaded() -> None: "5xu9h3", "626v6g", "77atlz", + "85as7h", "85nbtp", "9ku8nu", "9s1s80", From 76098aaf326adec984bc50051f1fa4c31f8faf31 Mon Sep 17 00:00:00 2001 From: Greg Gibeling Date: Thu, 5 Dec 2024 14:58:33 -0800 Subject: [PATCH 041/138] Add X1 Omni support (1vxt52) (#611) * Add X1 Omni support (sylink to X1 Turbo, based on feature set) * Update test_init.py --- deebot_client/hardware/deebot/1vxt52.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/1vxt52.py diff --git a/deebot_client/hardware/deebot/1vxt52.py b/deebot_client/hardware/deebot/1vxt52.py new file mode 120000 index 00000000..391aa568 --- /dev/null +++ b/deebot_client/hardware/deebot/1vxt52.py @@ -0,0 +1 @@ +2o4lnm.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 462afb28..ff1781e4 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -250,6 +250,7 @@ def test_all_models_loaded() -> None: """Test that all models are loaded.""" _load() assert list(DEVICES) == [ + "1vxt52", "2ap5uq", "2o4lnm", "4vhygi", From 987cc648e07147388b14cc8173802becca66e7b3 Mon Sep 17 00:00:00 2001 From: r1cht3r Date: Thu, 5 Dec 2024 18:00:11 -0500 Subject: [PATCH 042/138] adding Deebot N30 Omni support (zwkcqc) (#622) * adding Deebot N30 Omni support (zwkcqc) * update tests/hardware/test_init.py --- deebot_client/hardware/deebot/zwkcqc.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/zwkcqc.py diff --git a/deebot_client/hardware/deebot/zwkcqc.py b/deebot_client/hardware/deebot/zwkcqc.py new file mode 120000 index 00000000..0f26ba6a --- /dev/null +++ b/deebot_client/hardware/deebot/zwkcqc.py @@ -0,0 +1 @@ +p1jij8.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index ff1781e4..8a0d91ec 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -284,4 +284,5 @@ def test_all_models_loaded() -> None: "yna5xi", "z4lvk7", "zjavof", + "zwkcqc", ] From f7277109dec4e31173359daa2c17c957ca9baea1 Mon Sep 17 00:00:00 2001 From: Yterz <73762135+Yterz@users.noreply.github.com> Date: Fri, 6 Dec 2024 09:46:47 +0100 Subject: [PATCH 043/138] Add Deebot OZMO T9 AIVI (#624) * Add files via upload * Add support for DEEBOT T9 AIVI * Fix test * Change 659yh8.py to a symlink pointing to x5d34r.py --- deebot_client/hardware/deebot/659yh8.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/659yh8.py diff --git a/deebot_client/hardware/deebot/659yh8.py b/deebot_client/hardware/deebot/659yh8.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/659yh8.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 8a0d91ec..914ed14f 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -257,6 +257,7 @@ def test_all_models_loaded() -> None: "55aiho", "5xu9h3", "626v6g", + "659yh8", "77atlz", "85as7h", "85nbtp", From 4cef02792b48f93cf0087c5b0861106b92fc6981 Mon Sep 17 00:00:00 2001 From: monik3r <11802443+monik3r@users.noreply.github.com> Date: Fri, 6 Dec 2024 01:01:14 -0800 Subject: [PATCH 044/138] Add Ozmo T8G support (b742vd) (#625) * First stab at Ozmo T8G support * Fix file - should be symlink, not text. * Re-order list to be alphabetical. --------- Co-authored-by: moniker --- deebot_client/hardware/deebot/b742vd.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/b742vd.py diff --git a/deebot_client/hardware/deebot/b742vd.py b/deebot_client/hardware/deebot/b742vd.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/b742vd.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 914ed14f..da5ecaa8 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -263,6 +263,7 @@ def test_all_models_loaded() -> None: "85nbtp", "9ku8nu", "9s1s80", + "b742vd", "clojes", "e6ofmn", "guzput", From 5f811d72267818bdf69376ddbf00bd41be0ce738 Mon Sep 17 00:00:00 2001 From: brendanm720 <57099145+brendanm720@users.noreply.github.com> Date: Fri, 6 Dec 2024 04:02:00 -0500 Subject: [PATCH 045/138] Add Support for Deebot N8+ (#628) * Add Support for Deebot N8+ * Fix test --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/7bryc5.py | 198 ++++++++++++++++++++++++ tests/hardware/test_init.py | 1 + 2 files changed, 199 insertions(+) create mode 100644 deebot_client/hardware/deebot/7bryc5.py diff --git a/deebot_client/hardware/deebot/7bryc5.py b/deebot_client/hardware/deebot/7bryc5.py new file mode 100644 index 00000000..5571463e --- /dev/null +++ b/deebot_client/hardware/deebot/7bryc5.py @@ -0,0 +1,198 @@ +"""DEEBOT N8+ Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + TrueDetectEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +) diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index da5ecaa8..c54ad6e2 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -259,6 +259,7 @@ def test_all_models_loaded() -> None: "626v6g", "659yh8", "77atlz", + "7bryc5", "85as7h", "85nbtp", "9ku8nu", From ebbc7fd1d272070fe99adb362a5d2dde3a002f2b Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 6 Dec 2024 10:10:12 +0100 Subject: [PATCH 046/138] Optimize CI (#631) --- .github/workflows/ci.yml | 13 +++---------- mypy.ini | 2 +- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8f1d95d1..5e518d8d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,18 +18,13 @@ jobs: - name: ⤵️ Checkout repository uses: actions/checkout@v4 - - name: 🏗 Install uv + - name: 🏗 Install uv and Python uses: astral-sh/setup-uv@v4 with: enable-cache: true cache-dependency-glob: "uv.lock" cache-local-path: ${{ env.UV_CACHE_DIR }} - - name: 🏗 Set up Python - uses: actions/setup-python@v5 - with: - python-version-file: ".python-version" - - name: 🏗 Install the project run: uv sync --locked --dev @@ -55,15 +50,13 @@ jobs: - name: ⤵️ Checkout repository uses: actions/checkout@v4 - - name: 🏗 Install uv + - name: 🏗 Install uv and Python ${{ matrix.python-version }} uses: astral-sh/setup-uv@v4 with: enable-cache: true cache-dependency-glob: "uv.lock" cache-local-path: ${{ env.UV_CACHE_DIR }} - - - name: 🏗 Set up Python ${{ matrix.python-version }} - run: uv python install ${{ matrix.python-version }} + python-version: ${{ matrix.python-version }} - name: 🏗 Install the project run: uv sync --locked --dev diff --git a/mypy.ini b/mypy.ini index 0d27fbb4..27b25ee0 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,5 +1,5 @@ [mypy] -python_version = 3.12 +python_version = 3.13 show_error_codes = true strict_equality = true warn_incomplete_stub = true From e0fde3da60e8a8d63b53938fd0e3a0a8b948829b Mon Sep 17 00:00:00 2001 From: James Townsend Date: Fri, 6 Dec 2024 09:19:08 +0000 Subject: [PATCH 047/138] Add support for Deebot T9 AIVI (8kwdb4) (#630) Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/8kwdb4.py | 198 ++++++++++++++++++++++++ tests/hardware/test_init.py | 1 + 2 files changed, 199 insertions(+) create mode 100644 deebot_client/hardware/deebot/8kwdb4.py diff --git a/deebot_client/hardware/deebot/8kwdb4.py b/deebot_client/hardware/deebot/8kwdb4.py new file mode 100644 index 00000000..c2ecdb41 --- /dev/null +++ b/deebot_client/hardware/deebot/8kwdb4.py @@ -0,0 +1,198 @@ +"""DEEBOT OZMO T9 AIVI Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + TrueDetectEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +) diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index c54ad6e2..cace005b 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -262,6 +262,7 @@ def test_all_models_loaded() -> None: "7bryc5", "85as7h", "85nbtp", + "8kwdb4", "9ku8nu", "9s1s80", "b742vd", From 6c19271e7961d3ceab67798d26f5fd447a2cbe66 Mon Sep 17 00:00:00 2001 From: Marco Date: Tue, 10 Dec 2024 11:57:12 +0100 Subject: [PATCH 048/138] Added support for T9 PLUS (um2ywg) (#632) * Added support for T9 PLUS um2ywg symlinking T8 AIVI * Fix test --------- Co-authored-by: root Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/um2ywg.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/um2ywg.py diff --git a/deebot_client/hardware/deebot/um2ywg.py b/deebot_client/hardware/deebot/um2ywg.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/um2ywg.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index cace005b..6917c532 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -282,6 +282,7 @@ def test_all_models_loaded() -> None: "rss8xk", "s69g6z", "ty84oi", + "um2ywg", "umwv6z", "vi829v", "x5d34r", From 857c36b08511775d08b31e6ce2f47f0e043e43a1 Mon Sep 17 00:00:00 2001 From: XxInvictus <3955293+XxInvictus@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:27:50 +1030 Subject: [PATCH 049/138] Add Deebot X5 Pro Omni (lr4qcs) (#659) - Initial clone of most compatible, requires extra features not supported yet in #555 --- deebot_client/hardware/deebot/lr4qcs.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/lr4qcs.py diff --git a/deebot_client/hardware/deebot/lr4qcs.py b/deebot_client/hardware/deebot/lr4qcs.py new file mode 120000 index 00000000..0f26ba6a --- /dev/null +++ b/deebot_client/hardware/deebot/lr4qcs.py @@ -0,0 +1 @@ +p1jij8.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 6917c532..ce35010c 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -274,6 +274,7 @@ def test_all_models_loaded() -> None: "jtmf04", "kr0277", "lf3bn4", + "lr4qcs", "lx3j7m", "p1jij8", "p95mgv", From 3ea85a73e0bf5e82377ac435dab0aa53a113d498 Mon Sep 17 00:00:00 2001 From: HxNetwork <67411629+HxNetwork@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:02:42 +0100 Subject: [PATCH 050/138] Add old Support for Ozmo T8 (#638) * Update test_init.py Added Ozmo T8 * Create h18jkh.py Ozmo T8 * Fix symlink --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/h18jkh.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/h18jkh.py diff --git a/deebot_client/hardware/deebot/h18jkh.py b/deebot_client/hardware/deebot/h18jkh.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/h18jkh.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index ce35010c..1a41900c 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -269,6 +269,7 @@ def test_all_models_loaded() -> None: "clojes", "e6ofmn", "guzput", + "h18jkh", "ifbw08", "itk04l", "jtmf04", From efeeba8446fbff41ec2713ef757ed8cedf7ae605 Mon Sep 17 00:00:00 2001 From: Brett Jurgens Date: Tue, 10 Dec 2024 06:03:09 -0500 Subject: [PATCH 051/138] Add DEEBOT OZMO T8 AIVI+ (w16crm) (#658) * Add w16crm (`DEEBOT OZMO T8 AIVI+`) This is the same as x5d34r (`DEEBOT OZMO T8 AIVI`) * add to test init --- deebot_client/hardware/deebot/w16crm.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/w16crm.py diff --git a/deebot_client/hardware/deebot/w16crm.py b/deebot_client/hardware/deebot/w16crm.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/w16crm.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 1a41900c..d751a510 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -287,6 +287,7 @@ def test_all_models_loaded() -> None: "um2ywg", "umwv6z", "vi829v", + "w16crm", "x5d34r", "yna5xi", "z4lvk7", From 3d5c74213551abe24a38673349a043e656be7bff Mon Sep 17 00:00:00 2001 From: Eric Stern Date: Tue, 10 Dec 2024 03:03:57 -0800 Subject: [PATCH 052/138] added support for Deebot X1 Plus (n4gstt) (#656) * added support for Deebot X1 Plus (n4gstt) * Fix test --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/n4gstt.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/n4gstt.py diff --git a/deebot_client/hardware/deebot/n4gstt.py b/deebot_client/hardware/deebot/n4gstt.py new file mode 120000 index 00000000..391aa568 --- /dev/null +++ b/deebot_client/hardware/deebot/n4gstt.py @@ -0,0 +1 @@ +2o4lnm.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index d751a510..7aa9b776 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -277,6 +277,7 @@ def test_all_models_loaded() -> None: "lf3bn4", "lr4qcs", "lx3j7m", + "n4gstt", "p1jij8", "p95mgv", "paeygf", From dcfdf890c76ea32e4a902ea95d152af41c2b0db9 Mon Sep 17 00:00:00 2001 From: brendanm720 <57099145+brendanm720@users.noreply.github.com> Date: Tue, 10 Dec 2024 06:04:48 -0500 Subject: [PATCH 053/138] Add Support for Deebot N8+ Black Variant (#644) * Add Support for Deebot N8+ Black Variant Create b2jqs4.py to add support for Deebot N8+ Black variant. * Update test_init.py for Deebot N8+ Black variant --- deebot_client/hardware/deebot/b2jqs4.py | 198 ++++++++++++++++++++++++ tests/hardware/test_init.py | 1 + 2 files changed, 199 insertions(+) create mode 100644 deebot_client/hardware/deebot/b2jqs4.py diff --git a/deebot_client/hardware/deebot/b2jqs4.py b/deebot_client/hardware/deebot/b2jqs4.py new file mode 100644 index 00000000..2dcdd947 --- /dev/null +++ b/deebot_client/hardware/deebot/b2jqs4.py @@ -0,0 +1,198 @@ +"""DEEBOT N8+ Black Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + TrueDetectEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +) diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 7aa9b776..767e61fe 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -265,6 +265,7 @@ def test_all_models_loaded() -> None: "8kwdb4", "9ku8nu", "9s1s80", + "b2jqs4", "b742vd", "clojes", "e6ofmn", From 2e4acefbf1f0f62a820ab368c83c51fff1cc715b Mon Sep 17 00:00:00 2001 From: Michael Savino Date: Tue, 10 Dec 2024 05:09:08 -0600 Subject: [PATCH 054/138] Add support for Deebot N7 (r5zxjr) (#653) * support for n7 * Fix symlink --------- Co-authored-by: freakytoad1 Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/r5zxjr.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/r5zxjr.py diff --git a/deebot_client/hardware/deebot/r5zxjr.py b/deebot_client/hardware/deebot/r5zxjr.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/r5zxjr.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 767e61fe..7999bee2 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -283,6 +283,7 @@ def test_all_models_loaded() -> None: "p95mgv", "paeygf", "qhe2o2", + "r5zxjr", "rss8xk", "s69g6z", "ty84oi", From 09286fd89eddca9c749420674534a24d17f94ae8 Mon Sep 17 00:00:00 2001 From: WARIO2412 <90968225+WARIO2412@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:09:37 +0100 Subject: [PATCH 055/138] Add support for Deebot T9 (ipohi5) (#651) --- deebot_client/hardware/deebot/ipohi5.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/ipohi5.py diff --git a/deebot_client/hardware/deebot/ipohi5.py b/deebot_client/hardware/deebot/ipohi5.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/ipohi5.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 7999bee2..8ab0b7af 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -272,6 +272,7 @@ def test_all_models_loaded() -> None: "guzput", "h18jkh", "ifbw08", + "ipohi5", "itk04l", "jtmf04", "kr0277", From 5249545debfa129c2e29a9b811aeb4b6264776e7 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 10 Dec 2024 12:15:32 +0100 Subject: [PATCH 056/138] Add Deebot U2 Pro (#623) * Add Deebot U2 Pro * Fix test * Update caps --- deebot_client/hardware/deebot/7j1tu6.py | 124 ++++++++++++++++++++++++ tests/hardware/test_init.py | 1 + 2 files changed, 125 insertions(+) create mode 100644 deebot_client/hardware/deebot/7j1tu6.py diff --git a/deebot_client/hardware/deebot/7j1tu6.py b/deebot_client/hardware/deebot/7j1tu6.py new file mode 100644 index 00000000..e9eee3ee --- /dev/null +++ b/deebot_client/hardware/deebot/7j1tu6.py @@ -0,0 +1,124 @@ +"""Deebot U2 Pro Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilitySet, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.const import DataType +from deebot_client.events import ( + AvailabilityEvent, + BatteryEvent, + CleanLogEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + NetworkInfoEvent, + ReportStatsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.SIDE_BRUSH, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + ] + ) + ], + reset=ResetLifeSpan, + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + ), + ), + ), +) diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 8ab0b7af..11636ec3 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -260,6 +260,7 @@ def test_all_models_loaded() -> None: "659yh8", "77atlz", "7bryc5", + "7j1tu6", "85as7h", "85nbtp", "8kwdb4", From e8978c2a43b688178f10313d25566b5bc151e016 Mon Sep 17 00:00:00 2001 From: rhys-e2 <139331008+rhys-e2@users.noreply.github.com> Date: Tue, 10 Dec 2024 22:18:53 +1100 Subject: [PATCH 057/138] Add Deebot OZMO T8+ (#639) * Create fqxoiu.py * Link fqxoiu.py to x5d34r.py * add fqxoiu to tests --------- Co-authored-by: Rhys Edwards --- deebot_client/hardware/deebot/fqxoiu.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/fqxoiu.py diff --git a/deebot_client/hardware/deebot/fqxoiu.py b/deebot_client/hardware/deebot/fqxoiu.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/fqxoiu.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 11636ec3..0a633014 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -270,6 +270,7 @@ def test_all_models_loaded() -> None: "b742vd", "clojes", "e6ofmn", + "fqxoiu", "guzput", "h18jkh", "ifbw08", From 611b68be16dd7f997522c84344ea69663d25507b Mon Sep 17 00:00:00 2001 From: Remco Schipper <7037079+RSchipper@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:21:42 +0100 Subject: [PATCH 058/138] Added T20e Omni (py3qif) (#650) * Add symlink for T20e Omni (py3qif) pointing to T20 Omni (p1jij8) and include it in the tests * Fix test --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/py3qif.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/py3qif.py diff --git a/deebot_client/hardware/deebot/py3qif.py b/deebot_client/hardware/deebot/py3qif.py new file mode 120000 index 00000000..0f26ba6a --- /dev/null +++ b/deebot_client/hardware/deebot/py3qif.py @@ -0,0 +1 @@ +p1jij8.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 0a633014..0652f844 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -285,6 +285,7 @@ def test_all_models_loaded() -> None: "p1jij8", "p95mgv", "paeygf", + "py3qif", "qhe2o2", "r5zxjr", "rss8xk", From 012c88eda51b760f89067d37e21df5ab3c6c9ebc Mon Sep 17 00:00:00 2001 From: Remco Schipper <7037079+RSchipper@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:22:45 +0100 Subject: [PATCH 059/138] Added DEEBOT T9 (ucn2xe) (#649) * Add symlink for T9 (ucn2xe) pointing to T8 AIVI (x5d34r) and include it in the tests * Fix test --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/ucn2xe.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/ucn2xe.py diff --git a/deebot_client/hardware/deebot/ucn2xe.py b/deebot_client/hardware/deebot/ucn2xe.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/ucn2xe.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 0652f844..dfab74de 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -291,6 +291,7 @@ def test_all_models_loaded() -> None: "rss8xk", "s69g6z", "ty84oi", + "ucn2xe", "um2ywg", "umwv6z", "vi829v", From ff58cedbcfcebad1ab339b2443810596948ef607 Mon Sep 17 00:00:00 2001 From: Christian Schmitt Date: Tue, 10 Dec 2024 12:23:48 +0100 Subject: [PATCH 060/138] Add Deebot OZMO T8 Pure (0bdtzz) (#641) --- deebot_client/hardware/deebot/0bdtzz.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/0bdtzz.py diff --git a/deebot_client/hardware/deebot/0bdtzz.py b/deebot_client/hardware/deebot/0bdtzz.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/0bdtzz.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index dfab74de..c09349e2 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -250,6 +250,7 @@ def test_all_models_loaded() -> None: """Test that all models are loaded.""" _load() assert list(DEVICES) == [ + "0bdtzz", "1vxt52", "2ap5uq", "2o4lnm", From 4324b0dfa006a1bd34891bf6ebdbef41bae7067f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:25:46 +0100 Subject: [PATCH 061/138] [pre-commit.ci] pre-commit autoupdate (#657) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.1 → v0.8.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.1...v0.8.2) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02c9a824..38a675f1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.1 + rev: v0.8.2 hooks: - id: ruff args: From 0c634ba8b4435ca2ae9d757e01467a7929d48679 Mon Sep 17 00:00:00 2001 From: innogkph Date: Tue, 10 Dec 2024 12:27:38 +0100 Subject: [PATCH 062/138] Add Support for Deebot N8 Pro (#637) * Create snxbvc.py * Added N8 Pro (snxbvc) to test_init.py --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/snxbvc.py | 1 + tests/hardware/test_init.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 deebot_client/hardware/deebot/snxbvc.py diff --git a/deebot_client/hardware/deebot/snxbvc.py b/deebot_client/hardware/deebot/snxbvc.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/snxbvc.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index c09349e2..50929853 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -291,6 +291,7 @@ def test_all_models_loaded() -> None: "r5zxjr", "rss8xk", "s69g6z", + "snxbvc", "ty84oi", "ucn2xe", "um2ywg", From 3a373c042e729dd84d53f5474364dc5adee2acf1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:28:40 +0100 Subject: [PATCH 063/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#652)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 208 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/uv.lock b/uv.lock index c0d00e48..8612cd5d 100644 --- a/uv.lock +++ b/uv.lock @@ -12,7 +12,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.11.9" +version = "3.11.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -23,38 +23,38 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/24/d5c0aed3ed90896f8505786e3a1e348fd9c61284ef21f54ee9cdf8b92e4f/aiohttp-3.11.9.tar.gz", hash = "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", size = 7668012 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/43/b3c28a7e8f8b5e8ef0bea9fcabe8e99787c70fa526e5bc8185fd89f46434/aiohttp-3.11.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", size = 703661 }, - { url = "https://files.pythonhosted.org/packages/f3/2c/be4624671e5ed344fca9196d0823eb6a17383cbe13d051d22d3a1f6ecbf7/aiohttp-3.11.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", size = 463054 }, - { url = "https://files.pythonhosted.org/packages/d6/21/8d14fa0bdae468ebe419df1764583ecc9e995a2ccd8a11ee8146a09fb5e5/aiohttp-3.11.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", size = 455006 }, - { url = "https://files.pythonhosted.org/packages/42/de/3fc5e94a24bf079709e9fed3572ebb5efb32f0995baf08a985ee9f517b0b/aiohttp-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", size = 1681364 }, - { url = "https://files.pythonhosted.org/packages/69/e0/bd9346efcdd3344284e4b4088bc2c720065176bd9180517bdc7097218903/aiohttp-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", size = 1735986 }, - { url = "https://files.pythonhosted.org/packages/9b/a5/549ce29e21ebf555dcf5c81e19e6eb30eb8de26f8da304f05a28d6d66d8c/aiohttp-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", size = 1792263 }, - { url = "https://files.pythonhosted.org/packages/7a/2b/23124c04701e0d2e215be59bf445c33602b1ccc4d9acb7bccc2ec20c892d/aiohttp-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", size = 1690838 }, - { url = "https://files.pythonhosted.org/packages/af/a6/ebb8be53787c57dd7dd8b9617357af60d603ccd2fbf7a9e306f33178894b/aiohttp-3.11.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", size = 1618311 }, - { url = "https://files.pythonhosted.org/packages/9b/3c/cb8e5af30e33775539b4a6ea818eb16b0b01f68ce7a2fa77dff5df3dee80/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", size = 1640417 }, - { url = "https://files.pythonhosted.org/packages/16/2d/62593ce65e5811ea46e521644e03d0c47345bf9b6c2e6efcb759915d6aa3/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", size = 1645507 }, - { url = "https://files.pythonhosted.org/packages/4f/6b/810981c99932665a225d7bdffacbda512dde6f11364ce11477662e457115/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", size = 1701090 }, - { url = "https://files.pythonhosted.org/packages/1c/01/79c8d156534c034207ccbb94a51f1ae4a625834a31e27670175f1e1e79b2/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", size = 1733598 }, - { url = "https://files.pythonhosted.org/packages/c0/8f/873f0d3a47ec203ccd04dbd623f2428b6010ba6b11107aa9b44ad0ebfc86/aiohttp-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", size = 1693573 }, - { url = "https://files.pythonhosted.org/packages/2f/8c/a4964108383eb8f0e5a85ee0fdc00f9f0bdf28bb6a751be05a63c047ccbe/aiohttp-3.11.9-cp312-cp312-win32.whl", hash = "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", size = 410354 }, - { url = "https://files.pythonhosted.org/packages/c8/9e/79aed1b3e110a02081ca47ba4a27d7e20040af241643a2e527c668634f22/aiohttp-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", size = 436657 }, - { url = "https://files.pythonhosted.org/packages/33/ec/217d8918032703639d64360e4534a33899cc1a5eda89268d4fa621e18b67/aiohttp-3.11.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", size = 696994 }, - { url = "https://files.pythonhosted.org/packages/48/e4/262211b96cba78614be9bae7086af0dba8e8050c43996f2912992173eb57/aiohttp-3.11.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", size = 459669 }, - { url = "https://files.pythonhosted.org/packages/51/f5/ef76735af2d69671aa8cb185c07da84973a2ca74bb44af9fdb980207118f/aiohttp-3.11.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", size = 451949 }, - { url = "https://files.pythonhosted.org/packages/ba/83/867487d4ca86327060b93f3eea70963996a7ebb0c16f61c214f801351d4a/aiohttp-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", size = 1664171 }, - { url = "https://files.pythonhosted.org/packages/ca/7d/b185b4b6b01bf66bcaf1b23afff3073fc85d2f0765203269ee4976be2cf8/aiohttp-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", size = 1716933 }, - { url = "https://files.pythonhosted.org/packages/a9/b3/70d7f26a874e96f932237e53017b048ecd754f06a29947bdf7ce39cade98/aiohttp-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", size = 1774117 }, - { url = "https://files.pythonhosted.org/packages/a5/6e/457acf09ac5bd6db5ae8b1fa68beb3000c989a2a20dc265a507123f7a689/aiohttp-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", size = 1676168 }, - { url = "https://files.pythonhosted.org/packages/e8/e8/2b4719633d0a8189dfce343af800d23163b8831cb5aa175d4c400b03895b/aiohttp-3.11.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", size = 1602187 }, - { url = "https://files.pythonhosted.org/packages/d8/0c/8938b85edaf0a8fee2ede7bbffd32e09b056475f7586b0852973749c5fff/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", size = 1617286 }, - { url = "https://files.pythonhosted.org/packages/1e/5c/825714aa554c4ef331a8c1a16b3183c5e4bf27c66073955d4f51344907dc/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", size = 1615518 }, - { url = "https://files.pythonhosted.org/packages/c8/1c/6c821e7cf956e833a72a5284ff19484c7dedb749224e16fda297fa38bbc2/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", size = 1684466 }, - { url = "https://files.pythonhosted.org/packages/6b/47/3e921cbf7d7c4edfe95ddb7e8315a8f3645d824863ef2c2eab5dfa0342bc/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", size = 1714304 }, - { url = "https://files.pythonhosted.org/packages/25/89/e68e3efd357f233265abcf22c48c4d1e81f992f264cd4dc69b96c5a13c47/aiohttp-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", size = 1671774 }, - { url = "https://files.pythonhosted.org/packages/79/e1/4adaed8c8ef93c2ae54b001cd0e8dd6c84b40044038acb322b649150dc96/aiohttp-3.11.9-cp313-cp313-win32.whl", hash = "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", size = 409216 }, - { url = "https://files.pythonhosted.org/packages/00/9b/bf33704ac9b438d6dad417f86f1e9439e2538180189b0e347a95ff819011/aiohttp-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", size = 435069 }, +sdist = { url = "https://files.pythonhosted.org/packages/94/c4/3b5a937b16f6c2a0ada842a9066aad0b7a5708427d4a202a07bf09c67cbb/aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", size = 7668832 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/17/1dbe2f619f77795409c1a13ab395b98ed1b215d3e938cacde9b8ffdac53d/aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", size = 704448 }, + { url = "https://files.pythonhosted.org/packages/e3/9b/112247ad47e9d7f6640889c6e42cc0ded8c8345dd0033c66bcede799b051/aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", size = 463829 }, + { url = "https://files.pythonhosted.org/packages/8a/36/a64b583771fc673062a7a1374728a6241d49e2eda5a9041fbf248e18c804/aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", size = 455774 }, + { url = "https://files.pythonhosted.org/packages/e5/75/ee1b8f510978b3de5f185c62535b135e4fc3f5a247ca0c2245137a02d800/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", size = 1682134 }, + { url = "https://files.pythonhosted.org/packages/87/46/65e8259432d5f73ca9ebf5edb645ef90e5303724e4e52477516cb4042240/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", size = 1736757 }, + { url = "https://files.pythonhosted.org/packages/03/f6/a6d1e791b7153fb2d101278f7146c0771b0e1569c547f8a8bc3035651984/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", size = 1793033 }, + { url = "https://files.pythonhosted.org/packages/a8/e9/1ac90733e36e7848693aece522936a13bf17eeb617da662f94adfafc1c25/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", size = 1691609 }, + { url = "https://files.pythonhosted.org/packages/6d/a6/77b33da5a0bc04566c7ddcca94500f2c2a2334eecab4885387fffd1fc600/aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", size = 1619082 }, + { url = "https://files.pythonhosted.org/packages/48/94/5bf5f927d9a2fedd2c978adfb70a3680e16f46d178361685b56244eb52ed/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", size = 1641186 }, + { url = "https://files.pythonhosted.org/packages/99/2d/e85103aa01d1064e51bc50cb51e7b40150a8ff5d34e5a3173a46b241860b/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", size = 1646280 }, + { url = "https://files.pythonhosted.org/packages/7b/e0/44651fda8c1d865a51b3a81f1956ea55ce16fc568fe7a3e05db7fc22f139/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", size = 1701862 }, + { url = "https://files.pythonhosted.org/packages/4e/1e/0804459ae325a5b95f6f349778fb465f29d2b863e522b6a349db0aaad54c/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", size = 1734373 }, + { url = "https://files.pythonhosted.org/packages/07/87/b8f6721668cad74bcc9c7cfe6d0230b304d1250196b221e54294a0d78dbe/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", size = 1694343 }, + { url = "https://files.pythonhosted.org/packages/4b/20/42813fc60d9178ba9b1b86c58a5441ddb6cf8ffdfe66387345bff173bcff/aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", size = 411118 }, + { url = "https://files.pythonhosted.org/packages/3a/51/df9c263c861ce93998b5ad2ba3212caab2112d5b66dbe91ddbe90c41ded4/aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", size = 437424 }, + { url = "https://files.pythonhosted.org/packages/8c/1d/88bfdbe28a3d1ba5b94a235f188f27726caf8ade9a0e13574848f44fe0fe/aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", size = 697755 }, + { url = "https://files.pythonhosted.org/packages/86/00/4c4619d6fe5c5be32f74d1422fc719b3e6cd7097af0c9e03877ca9bd4ebc/aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", size = 460440 }, + { url = "https://files.pythonhosted.org/packages/aa/1c/2f927408f50593a29465d198ec3c57c835c8602330233163e8d89c1093db/aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", size = 452726 }, + { url = "https://files.pythonhosted.org/packages/06/6a/ff00ed0a2ba45c34b3c366aa5b0004b1a4adcec5a9b5f67dd0648ee1c88a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", size = 1664944 }, + { url = "https://files.pythonhosted.org/packages/02/c2/61923f2a7c2e14d7424b3a526e054f0358f57ccdf5573d4d3d033b01921a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", size = 1717707 }, + { url = "https://files.pythonhosted.org/packages/8a/08/0d3d074b24d377569ec89d476a95ca918443099c0401bb31b331104e35d1/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", size = 1774890 }, + { url = "https://files.pythonhosted.org/packages/e8/49/052ada2b6e90ed65f0e6a7e548614621b5f8dcd193cb9415d2e6bcecc94a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", size = 1676945 }, + { url = "https://files.pythonhosted.org/packages/7c/9e/0c48e1a48e072a869b8b5e3920c9f6a8092861524a4a6f159cd7e6fda939/aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", size = 1602959 }, + { url = "https://files.pythonhosted.org/packages/ab/98/791f979093ff7f67f80344c182cb0ca4c2c60daed397ecaf454cc8d7a5cd/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", size = 1618058 }, + { url = "https://files.pythonhosted.org/packages/7b/5d/2d4b05feb3fd68eb7c8335f73c81079b56e582633b91002da695ccb439ef/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", size = 1616289 }, + { url = "https://files.pythonhosted.org/packages/50/83/68cc28c00fe681dce6150614f105efe98282da19252cd6e32dfa893bb328/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", size = 1685239 }, + { url = "https://files.pythonhosted.org/packages/16/f9/68fc5c8928f63238ce9314f04f3f59d9190a4db924998bb9be99c7aacce8/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", size = 1715078 }, + { url = "https://files.pythonhosted.org/packages/3f/e0/3dd3f0451c532c77e35780bafb2b6469a046bc15a6ec2e039475a1d2f161/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", size = 1672544 }, + { url = "https://files.pythonhosted.org/packages/a5/b1/3530ab040dd5d7fb016b47115016f9b3a07ea29593b0e07e53dbe06a380c/aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", size = 409984 }, + { url = "https://files.pythonhosted.org/packages/49/1f/deed34e9fca639a7f873d01150d46925d3e1312051eaa591c1aa1f2e6ddc/aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", size = 435837 }, ] [[package]] @@ -83,11 +83,11 @@ wheels = [ [[package]] name = "astroid" -version = "3.3.5" +version = "3.3.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/1e/326fb1d3d83a3bb77c9f9be29d31f2901e35acb94b0605c3f2e5085047f9/astroid-3.3.5.tar.gz", hash = "sha256:5cfc40ae9f68311075d27ef68a4841bdc5cc7f6cf86671b49f00607d30188e2d", size = 397229 } +sdist = { url = "https://files.pythonhosted.org/packages/ca/40/e028137cb19ed577001c76b91c5c50fee5a9c85099f45820b69385574ac5/astroid-3.3.6.tar.gz", hash = "sha256:6aaea045f938c735ead292204afdb977a36e989522b7833ef6fea94de743f442", size = 397452 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/30/624365383fa4a40329c0f0bbbc151abc4a64e30dfc110fc8f6e2afcd02bb/astroid-3.3.5-py3-none-any.whl", hash = "sha256:a9d1c946ada25098d790e079ba2a1b112157278f3fb7e718ae6a9252f5835dc8", size = 274586 }, + { url = "https://files.pythonhosted.org/packages/0c/d2/82c8ccef22ea873a2b0da9636e47d45137eeeb2fb9320c5dbbdd3627bab0/astroid-3.3.6-py3-none-any.whl", hash = "sha256:db676dc4f3ae6bfe31cda227dc60e03438378d7a896aec57422c95634e8d722f", size = 274644 }, ] [[package]] @@ -176,40 +176,40 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/75/aecfd0a3adbec6e45753976bc2a9fed62b42cea9a206d10fd29244a77953/coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", size = 801425 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/ce/3edf581c8fe429ed8ced6e6d9ac693c25975ef9093413276dab6ed68a80a/coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", size = 207285 }, - { url = "https://files.pythonhosted.org/packages/09/9c/cf102ab046c9cf8895c3f7aadcde6f489a4b2ec326757e8c6e6581829b5e/coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", size = 207522 }, - { url = "https://files.pythonhosted.org/packages/39/06/42aa6dd13dbfca72e1fd8ffccadbc921b6e75db34545ebab4d955d1e7ad3/coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", size = 240543 }, - { url = "https://files.pythonhosted.org/packages/a0/20/2932971dc215adeca8eeff446266a7fef17a0c238e881ffedebe7bfa0669/coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", size = 237577 }, - { url = "https://files.pythonhosted.org/packages/ac/85/4323ece0cd5452c9522f4b6e5cc461e6c7149a4b1887c9e7a8b1f4e51146/coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", size = 239646 }, - { url = "https://files.pythonhosted.org/packages/77/52/b2537487d8f36241e518e84db6f79e26bc3343b14844366e35b090fae0d4/coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", size = 239128 }, - { url = "https://files.pythonhosted.org/packages/7c/99/7f007762012186547d0ecc3d328da6b6f31a8c99f05dc1e13dcd929918cd/coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", size = 237434 }, - { url = "https://files.pythonhosted.org/packages/97/53/e9b5cf0682a1cab9352adfac73caae0d77ae1d65abc88975d510f7816389/coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", size = 239095 }, - { url = "https://files.pythonhosted.org/packages/0c/50/054f0b464fbae0483217186478eefa2e7df3a79917ed7f1d430b6da2cf0d/coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", size = 209895 }, - { url = "https://files.pythonhosted.org/packages/df/d0/09ba870360a27ecf09e177ca2ff59d4337fc7197b456f22ceff85cffcfa5/coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", size = 210684 }, - { url = "https://files.pythonhosted.org/packages/9a/84/6f0ccf94a098ac3d6d6f236bd3905eeac049a9e0efcd9a63d4feca37ac4b/coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", size = 207313 }, - { url = "https://files.pythonhosted.org/packages/db/2b/e3b3a3a12ebec738c545897ac9f314620470fcbc368cdac88cf14974ba20/coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", size = 207574 }, - { url = "https://files.pythonhosted.org/packages/db/c0/5bf95d42b6a8d21dfce5025ce187f15db57d6460a59b67a95fe8728162f1/coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", size = 240090 }, - { url = "https://files.pythonhosted.org/packages/57/b8/d6fd17d1a8e2b0e1a4e8b9cb1f0f261afd422570735899759c0584236916/coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", size = 237237 }, - { url = "https://files.pythonhosted.org/packages/d4/e4/a91e9bb46809c8b63e68fc5db5c4d567d3423b6691d049a4f950e38fbe9d/coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", size = 239225 }, - { url = "https://files.pythonhosted.org/packages/31/9c/9b99b0591ec4555b7292d271e005f27b465388ce166056c435b288db6a69/coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", size = 238888 }, - { url = "https://files.pythonhosted.org/packages/a6/85/285c2df9a04bc7c31f21fd9d4a24d19e040ec5e2ff06e572af1f6514c9e7/coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", size = 236974 }, - { url = "https://files.pythonhosted.org/packages/cb/a1/95ec8522206f76cdca033bf8bb61fff56429fb414835fc4d34651dfd29fc/coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", size = 238815 }, - { url = "https://files.pythonhosted.org/packages/8d/ac/687e9ba5e6d0979e9dab5c02e01c4f24ac58260ef82d88d3b433b3f84f1e/coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", size = 209957 }, - { url = "https://files.pythonhosted.org/packages/2f/a3/b61cc8e3fcf075293fb0f3dee405748453c5ba28ac02ceb4a87f52bdb105/coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", size = 210711 }, - { url = "https://files.pythonhosted.org/packages/ee/4b/891c8b9acf1b62c85e4a71dac142ab9284e8347409b7355de02e3f38306f/coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", size = 208053 }, - { url = "https://files.pythonhosted.org/packages/18/a9/9e330409b291cc002723d339346452800e78df1ce50774ca439ade1d374f/coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", size = 208329 }, - { url = "https://files.pythonhosted.org/packages/9c/0d/33635fd429f6589c6e1cdfc7bf581aefe4c1792fbff06383f9d37f59db60/coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", size = 251052 }, - { url = "https://files.pythonhosted.org/packages/23/32/8a08da0e46f3830bbb9a5b40614241b2e700f27a9c2889f53122486443ed/coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", size = 246765 }, - { url = "https://files.pythonhosted.org/packages/56/3f/3b86303d2c14350fdb1c6c4dbf9bc76000af2382f42ca1d4d99c6317666e/coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", size = 249125 }, - { url = "https://files.pythonhosted.org/packages/36/cb/c4f081b9023f9fd8646dbc4ef77be0df090263e8f66f4ea47681e0dc2cff/coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", size = 248615 }, - { url = "https://files.pythonhosted.org/packages/32/ee/53bdbf67760928c44b57b2c28a8c0a4bf544f85a9ee129a63ba5c78fdee4/coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", size = 246507 }, - { url = "https://files.pythonhosted.org/packages/57/49/5a57910bd0af6d8e802b4ca65292576d19b54b49f81577fd898505dee075/coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", size = 247785 }, - { url = "https://files.pythonhosted.org/packages/bd/37/e450c9f6b297c79bb9858407396ed3e084dcc22990dd110ab01d5ceb9770/coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", size = 210605 }, - { url = "https://files.pythonhosted.org/packages/44/79/7d0c7dd237c6905018e2936cd1055fe1d42e7eba2ebab3c00f4aad2a27d7/coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", size = 211777 }, +version = "7.6.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/d2/c25011f4d036cf7e8acbbee07a8e09e9018390aee25ba085596c4b83d510/coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", size = 801710 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/52/b16af8989a2daf0f80a88522bd8e8eed90b5fcbdecf02a6888f3e80f6ba7/coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", size = 207325 }, + { url = "https://files.pythonhosted.org/packages/0f/79/6b7826fca8846c1216a113227b9f114ac3e6eacf168b4adcad0cb974aaca/coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", size = 207563 }, + { url = "https://files.pythonhosted.org/packages/a7/07/0bc73da0ccaf45d0d64ef86d33b7d7fdeef84b4c44bf6b85fb12c215c5a6/coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", size = 240580 }, + { url = "https://files.pythonhosted.org/packages/71/8a/9761f409910961647d892454687cedbaccb99aae828f49486734a82ede6e/coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3", size = 237613 }, + { url = "https://files.pythonhosted.org/packages/8b/10/ee7d696a17ac94f32f2dbda1e17e730bf798ae9931aec1fc01c1944cd4de/coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", size = 239684 }, + { url = "https://files.pythonhosted.org/packages/16/60/aa1066040d3c52fff051243c2d6ccda264da72dc6d199d047624d395b2b2/coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", size = 239112 }, + { url = "https://files.pythonhosted.org/packages/4e/e5/69f35344c6f932ba9028bf168d14a79fedb0dd4849b796d43c81ce75a3c9/coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", size = 237428 }, + { url = "https://files.pythonhosted.org/packages/32/20/adc895523c4a28f63441b8ac645abd74f9bdd499d2d175bef5b41fc7f92d/coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", size = 239098 }, + { url = "https://files.pythonhosted.org/packages/a9/a6/e0e74230c9bb3549ec8ffc137cfd16ea5d56e993d6bffed2218bff6187e3/coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", size = 209940 }, + { url = "https://files.pythonhosted.org/packages/3e/18/cb5b88349d4aa2f41ec78d65f92ea32572b30b3f55bc2b70e87578b8f434/coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", size = 210726 }, + { url = "https://files.pythonhosted.org/packages/35/26/9abab6539d2191dbda2ce8c97b67d74cbfc966cc5b25abb880ffc7c459bc/coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", size = 207356 }, + { url = "https://files.pythonhosted.org/packages/44/da/d49f19402240c93453f606e660a6676a2a1fbbaa6870cc23207790aa9697/coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", size = 207614 }, + { url = "https://files.pythonhosted.org/packages/da/e6/93bb9bf85497816082ec8da6124c25efa2052bd4c887dd3b317b91990c9e/coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", size = 240129 }, + { url = "https://files.pythonhosted.org/packages/df/65/6a824b9406fe066835c1274a9949e06f084d3e605eb1a602727a27ec2fe3/coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", size = 237276 }, + { url = "https://files.pythonhosted.org/packages/9f/79/6c7a800913a9dd23ac8c8da133ebb556771a5a3d4df36b46767b1baffd35/coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", size = 239267 }, + { url = "https://files.pythonhosted.org/packages/57/e7/834d530293fdc8a63ba8ff70033d5182022e569eceb9aec7fc716b678a39/coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", size = 238887 }, + { url = "https://files.pythonhosted.org/packages/15/05/ec9d6080852984f7163c96984444e7cd98b338fd045b191064f943ee1c08/coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", size = 236970 }, + { url = "https://files.pythonhosted.org/packages/0a/d8/775937670b93156aec29f694ce37f56214ed7597e1a75b4083ee4c32121c/coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", size = 238831 }, + { url = "https://files.pythonhosted.org/packages/f4/58/88551cb7fdd5ec98cb6044e8814e38583436b14040a5ece15349c44c8f7c/coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", size = 210000 }, + { url = "https://files.pythonhosted.org/packages/b7/12/cfbf49b95120872785ff8d56ab1c7fe3970a65e35010c311d7dd35c5fd00/coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", size = 210753 }, + { url = "https://files.pythonhosted.org/packages/7c/68/c1cb31445599b04bde21cbbaa6d21b47c5823cdfef99eae470dfce49c35a/coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", size = 208091 }, + { url = "https://files.pythonhosted.org/packages/11/73/84b02c6b19c4a11eb2d5b5eabe926fb26c21c080e0852f5e5a4f01165f9e/coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", size = 208369 }, + { url = "https://files.pythonhosted.org/packages/de/e0/ae5d878b72ff26df2e994a5c5b1c1f6a7507d976b23beecb1ed4c85411ef/coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", size = 251089 }, + { url = "https://files.pythonhosted.org/packages/ab/9c/0aaac011aef95a93ef3cb2fba3fde30bc7e68a6635199ed469b1f5ea355a/coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", size = 246806 }, + { url = "https://files.pythonhosted.org/packages/f8/19/4d5d3ae66938a7dcb2f58cef3fa5386f838f469575b0bb568c8cc9e3a33d/coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", size = 249164 }, + { url = "https://files.pythonhosted.org/packages/b3/0b/4ee8a7821f682af9ad440ae3c1e379da89a998883271f088102d7ca2473d/coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", size = 248642 }, + { url = "https://files.pythonhosted.org/packages/8a/12/36ff1d52be18a16b4700f561852e7afd8df56363a5edcfb04cf26a0e19e0/coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", size = 246516 }, + { url = "https://files.pythonhosted.org/packages/43/d0/8e258f6c3a527c1655602f4f576215e055ac704de2d101710a71a2affac2/coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", size = 247783 }, + { url = "https://files.pythonhosted.org/packages/a9/0d/1e4a48d289429d38aae3babdfcadbf35ca36bdcf3efc8f09b550a845bdb5/coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", size = 210646 }, + { url = "https://files.pythonhosted.org/packages/26/74/b0729f196f328ac55e42b1e22ec2f16d8bcafe4b8158a26ec9f1cdd1d93e/coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", size = 211815 }, ] [[package]] @@ -487,40 +487,40 @@ wheels = [ [[package]] name = "numpy" -version = "2.1.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/ca/1166b75c21abd1da445b97bf1fa2f14f423c6cfb4fc7c4ef31dccf9f6a94/numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", size = 20166090 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/f0/385eb9970309643cbca4fc6eebc8bb16e560de129c91258dfaa18498da8b/numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", size = 20849658 }, - { url = "https://files.pythonhosted.org/packages/54/4a/765b4607f0fecbb239638d610d04ec0a0ded9b4951c56dc68cef79026abf/numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", size = 13492258 }, - { url = "https://files.pythonhosted.org/packages/bd/a7/2332679479c70b68dccbf4a8eb9c9b5ee383164b161bee9284ac141fbd33/numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", size = 5090249 }, - { url = "https://files.pythonhosted.org/packages/c1/67/4aa00316b3b981a822c7a239d3a8135be2a6945d1fd11d0efb25d361711a/numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", size = 6621704 }, - { url = "https://files.pythonhosted.org/packages/5e/da/1a429ae58b3b6c364eeec93bf044c532f2ff7b48a52e41050896cf15d5b1/numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", size = 13606089 }, - { url = "https://files.pythonhosted.org/packages/9e/3e/3757f304c704f2f0294a6b8340fcf2be244038be07da4cccf390fa678a9f/numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", size = 16043185 }, - { url = "https://files.pythonhosted.org/packages/43/97/75329c28fea3113d00c8d2daf9bc5828d58d78ed661d8e05e234f86f0f6d/numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", size = 16410751 }, - { url = "https://files.pythonhosted.org/packages/ad/7a/442965e98b34e0ae9da319f075b387bcb9a1e0658276cc63adb8c9686f7b/numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", size = 14082705 }, - { url = "https://files.pythonhosted.org/packages/ac/b6/26108cf2cfa5c7e03fb969b595c93131eab4a399762b51ce9ebec2332e80/numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", size = 6239077 }, - { url = "https://files.pythonhosted.org/packages/a6/84/fa11dad3404b7634aaab50733581ce11e5350383311ea7a7010f464c0170/numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", size = 12566858 }, - { url = "https://files.pythonhosted.org/packages/4d/0b/620591441457e25f3404c8057eb924d04f161244cb8a3680d529419aa86e/numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", size = 20836263 }, - { url = "https://files.pythonhosted.org/packages/45/e1/210b2d8b31ce9119145433e6ea78046e30771de3fe353f313b2778142f34/numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", size = 13507771 }, - { url = "https://files.pythonhosted.org/packages/55/44/aa9ee3caee02fa5a45f2c3b95cafe59c44e4b278fbbf895a93e88b308555/numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", size = 5075805 }, - { url = "https://files.pythonhosted.org/packages/78/d6/61de6e7e31915ba4d87bbe1ae859e83e6582ea14c6add07c8f7eefd8488f/numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", size = 6608380 }, - { url = "https://files.pythonhosted.org/packages/3e/46/48bdf9b7241e317e6cf94276fe11ba673c06d1fdf115d8b4ebf616affd1a/numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", size = 13602451 }, - { url = "https://files.pythonhosted.org/packages/70/50/73f9a5aa0810cdccda9c1d20be3cbe4a4d6ea6bfd6931464a44c95eef731/numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", size = 16039822 }, - { url = "https://files.pythonhosted.org/packages/ad/cd/098bc1d5a5bc5307cfc65ee9369d0ca658ed88fbd7307b0d49fab6ca5fa5/numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", size = 16411822 }, - { url = "https://files.pythonhosted.org/packages/83/a2/7d4467a2a6d984549053b37945620209e702cf96a8bc658bc04bba13c9e2/numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", size = 14079598 }, - { url = "https://files.pythonhosted.org/packages/e9/6a/d64514dcecb2ee70bfdfad10c42b76cab657e7ee31944ff7a600f141d9e9/numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", size = 6236021 }, - { url = "https://files.pythonhosted.org/packages/bb/f9/12297ed8d8301a401e7d8eb6b418d32547f1d700ed3c038d325a605421a4/numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", size = 12560405 }, - { url = "https://files.pythonhosted.org/packages/a7/45/7f9244cd792e163b334e3a7f02dff1239d2890b6f37ebf9e82cbe17debc0/numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", size = 20859062 }, - { url = "https://files.pythonhosted.org/packages/b1/b4/a084218e7e92b506d634105b13e27a3a6645312b93e1c699cc9025adb0e1/numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", size = 13515839 }, - { url = "https://files.pythonhosted.org/packages/27/45/58ed3f88028dcf80e6ea580311dc3edefdd94248f5770deb980500ef85dd/numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", size = 5116031 }, - { url = "https://files.pythonhosted.org/packages/37/a8/eb689432eb977d83229094b58b0f53249d2209742f7de529c49d61a124a0/numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", size = 6629977 }, - { url = "https://files.pythonhosted.org/packages/42/a3/5355ad51ac73c23334c7caaed01adadfda49544f646fcbfbb4331deb267b/numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", size = 13575951 }, - { url = "https://files.pythonhosted.org/packages/c4/70/ea9646d203104e647988cb7d7279f135257a6b7e3354ea6c56f8bafdb095/numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", size = 16022655 }, - { url = "https://files.pythonhosted.org/packages/14/ce/7fc0612903e91ff9d0b3f2eda4e18ef9904814afcae5b0f08edb7f637883/numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", size = 16399902 }, - { url = "https://files.pythonhosted.org/packages/ef/62/1d3204313357591c913c32132a28f09a26357e33ea3c4e2fe81269e0dca1/numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", size = 14067180 }, - { url = "https://files.pythonhosted.org/packages/24/d7/78a40ed1d80e23a774cb8a34ae8a9493ba1b4271dde96e56ccdbab1620ef/numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", size = 6291907 }, - { url = "https://files.pythonhosted.org/packages/86/09/a5ab407bd7f5f5599e6a9261f964ace03a73e7c6928de906981c31c38082/numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", size = 12644098 }, +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/1b/1d565e0f6e156e1522ab564176b8b29d71e13d8caf003a08768df3d5cec5/numpy-2.2.0.tar.gz", hash = "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", size = 20225497 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/bc/a20dc4e1d051149052762e7647455311865d11c603170c476d1e910a353e/numpy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", size = 20909153 }, + { url = "https://files.pythonhosted.org/packages/60/3d/ac4fb63f36db94f4c7db05b45e3ecb3f88f778ca71850664460c78cfde41/numpy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", size = 14095021 }, + { url = "https://files.pythonhosted.org/packages/41/6d/a654d519d24e4fcc7a83d4a51209cda086f26cf30722b3d8ffc1aa9b775e/numpy-2.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", size = 5125491 }, + { url = "https://files.pythonhosted.org/packages/e6/22/fab7e1510a62e5092f4e6507a279020052b89f11d9cfe52af7f52c243b04/numpy-2.2.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", size = 6658534 }, + { url = "https://files.pythonhosted.org/packages/fc/29/a3d938ddc5a534cd53df7ab79d20a68db8c67578de1df0ae0118230f5f54/numpy-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", size = 14046306 }, + { url = "https://files.pythonhosted.org/packages/90/24/d0bbb56abdd8934f30384632e3c2ca1ebfeb5d17e150c6e366ba291de36b/numpy-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", size = 16095819 }, + { url = "https://files.pythonhosted.org/packages/99/9c/58a673faa9e8a0e77248e782f7a17410cf7259b326265646fd50ed49c4e1/numpy-2.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", size = 15243215 }, + { url = "https://files.pythonhosted.org/packages/9c/61/f311693f78cbf635cfb69ce9e1e857ff83937a27d93c96ac5932fd33e330/numpy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", size = 17860175 }, + { url = "https://files.pythonhosted.org/packages/11/3e/491c34262cb1fc9dd13a00beb80d755ee0517b17db20e54cac7aa524533e/numpy-2.2.0-cp312-cp312-win32.whl", hash = "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", size = 6273281 }, + { url = "https://files.pythonhosted.org/packages/89/ea/00537f599eb230771157bc509f6ea5b2dddf05d4b09f9d2f1d7096a18781/numpy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", size = 12613227 }, + { url = "https://files.pythonhosted.org/packages/bd/4c/0d1eef206545c994289e7a9de21b642880a11e0ed47a2b0c407c688c4f69/numpy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367", size = 20895707 }, + { url = "https://files.pythonhosted.org/packages/16/cb/88f6c1e6df83002c421d5f854ccf134aa088aa997af786a5dac3f32ec99b/numpy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", size = 14110592 }, + { url = "https://files.pythonhosted.org/packages/b4/54/817e6894168a43f33dca74199ba0dd0f1acd99aa6323ed6d323d63d640a2/numpy-2.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", size = 5110858 }, + { url = "https://files.pythonhosted.org/packages/c7/99/00d8a1a8eb70425bba7880257ed73fed08d3e8d05da4202fb6b9a81d5ee4/numpy-2.2.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", size = 6645143 }, + { url = "https://files.pythonhosted.org/packages/34/86/5b9c2b7c56e7a9d9297a0a4be0b8433f498eba52a8f5892d9132b0f64627/numpy-2.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", size = 14042812 }, + { url = "https://files.pythonhosted.org/packages/df/54/13535f74391dbe5f479ceed96f1403267be302c840040700d4fd66688089/numpy-2.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", size = 16093419 }, + { url = "https://files.pythonhosted.org/packages/dd/37/dfb2056842ac61315f225aa56f455da369f5223e4c5a38b91d20da1b628b/numpy-2.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", size = 15238969 }, + { url = "https://files.pythonhosted.org/packages/5a/3d/d20d24ee313992f0b7e7b9d9eef642d9b545d39d5b91c4a2cc8c98776328/numpy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", size = 17855705 }, + { url = "https://files.pythonhosted.org/packages/5b/40/944c9ee264f875a2db6f79380944fd2b5bb9d712bb4a134d11f45ad5b693/numpy-2.2.0-cp313-cp313-win32.whl", hash = "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", size = 6270078 }, + { url = "https://files.pythonhosted.org/packages/30/04/e1ee6f8b22034302d4c5c24e15782bdedf76d90b90f3874ed0b48525def0/numpy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", size = 12605791 }, + { url = "https://files.pythonhosted.org/packages/ef/fb/51d458625cd6134d60ac15180ae50995d7d21b0f2f92a6286ae7b0792d19/numpy-2.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", size = 20920160 }, + { url = "https://files.pythonhosted.org/packages/b4/34/162ae0c5d2536ea4be98c813b5161c980f0443cd5765fde16ddfe3450140/numpy-2.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", size = 14119064 }, + { url = "https://files.pythonhosted.org/packages/17/6c/4195dd0e1c41c55f466d516e17e9e28510f32af76d23061ea3da67438e3c/numpy-2.2.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", size = 5152778 }, + { url = "https://files.pythonhosted.org/packages/2f/47/ea804ae525832c8d05ed85b560dfd242d34e4bb0962bc269ccaa720fb934/numpy-2.2.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", size = 6667605 }, + { url = "https://files.pythonhosted.org/packages/76/99/34d20e50b3d894bb16b5374bfbee399ab8ff3a33bf1e1f0b8acfe7bbd70d/numpy-2.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", size = 14013275 }, + { url = "https://files.pythonhosted.org/packages/69/8f/a1df7bd02d434ab82539517d1b98028985700cfc4300bc5496fb140ca648/numpy-2.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", size = 16074900 }, + { url = "https://files.pythonhosted.org/packages/04/94/b419e7a76bf21a00fcb03c613583f10e389fdc8dfe420412ff5710c8ad3d/numpy-2.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", size = 15219122 }, + { url = "https://files.pythonhosted.org/packages/65/d9/dddf398b2b6c5d750892a207a469c2854a8db0f033edaf72103af8cf05aa/numpy-2.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", size = 17851668 }, + { url = "https://files.pythonhosted.org/packages/d4/dc/09a4e5819a9782a213c0eb4eecacdc1cd75ad8dac99279b04cfccb7eeb0a/numpy-2.2.0-cp313-cp313t-win32.whl", hash = "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", size = 6325288 }, + { url = "https://files.pythonhosted.org/packages/ce/e1/e0d06ec34036c92b43aef206efe99a5f5f04e12c776eab82a36e00c40afc/numpy-2.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", size = 12692303 }, ] [[package]] From 8c6076cd33341db3c43b80bb47b46a96e8328e9e Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Wed, 11 Dec 2024 13:30:10 +0100 Subject: [PATCH 064/138] Add 24 similar models (#666) * Add 24 similar models * Update test --- deebot_client/hardware/deebot/12baap.py | 1 + deebot_client/hardware/deebot/1b23du.py | 1 + deebot_client/hardware/deebot/36xnxf.py | 1 + deebot_client/hardware/deebot/3w7j5e.py | 1 + deebot_client/hardware/deebot/7piq03.py | 1 + deebot_client/hardware/deebot/822x8d.py | 1 + deebot_client/hardware/deebot/c0lwyn.py | 1 + deebot_client/hardware/deebot/d4v1pm.py | 1 + deebot_client/hardware/deebot/edoodo.py | 1 + deebot_client/hardware/deebot/gwtll7.py | 1 + deebot_client/hardware/deebot/lhbd50.py | 1 + deebot_client/hardware/deebot/n6cwdb.py | 1 + deebot_client/hardware/deebot/nq9yhl.py | 1 + deebot_client/hardware/deebot/o0a4ju.py | 1 + deebot_client/hardware/deebot/p0l0af.py | 1 + deebot_client/hardware/deebot/r5y7re.py | 1 + deebot_client/hardware/deebot/rvflzn.py | 1 + deebot_client/hardware/deebot/tlthqk.py | 1 + deebot_client/hardware/deebot/u4h1uk.py | 1 + deebot_client/hardware/deebot/u6eqoa.py | 1 + deebot_client/hardware/deebot/w7k3yc.py | 1 + deebot_client/hardware/deebot/y2qy3m.py | 1 + deebot_client/hardware/deebot/yinacl.py | 1 + deebot_client/hardware/deebot/yu362x.py | 1 + tests/hardware/test_init.py | 72 +++++-------------------- 25 files changed, 37 insertions(+), 59 deletions(-) create mode 120000 deebot_client/hardware/deebot/12baap.py create mode 120000 deebot_client/hardware/deebot/1b23du.py create mode 120000 deebot_client/hardware/deebot/36xnxf.py create mode 120000 deebot_client/hardware/deebot/3w7j5e.py create mode 120000 deebot_client/hardware/deebot/7piq03.py create mode 120000 deebot_client/hardware/deebot/822x8d.py create mode 120000 deebot_client/hardware/deebot/c0lwyn.py create mode 120000 deebot_client/hardware/deebot/d4v1pm.py create mode 120000 deebot_client/hardware/deebot/edoodo.py create mode 120000 deebot_client/hardware/deebot/gwtll7.py create mode 120000 deebot_client/hardware/deebot/lhbd50.py create mode 120000 deebot_client/hardware/deebot/n6cwdb.py create mode 120000 deebot_client/hardware/deebot/nq9yhl.py create mode 120000 deebot_client/hardware/deebot/o0a4ju.py create mode 120000 deebot_client/hardware/deebot/p0l0af.py create mode 120000 deebot_client/hardware/deebot/r5y7re.py create mode 120000 deebot_client/hardware/deebot/rvflzn.py create mode 120000 deebot_client/hardware/deebot/tlthqk.py create mode 120000 deebot_client/hardware/deebot/u4h1uk.py create mode 120000 deebot_client/hardware/deebot/u6eqoa.py create mode 120000 deebot_client/hardware/deebot/w7k3yc.py create mode 120000 deebot_client/hardware/deebot/y2qy3m.py create mode 120000 deebot_client/hardware/deebot/yinacl.py create mode 120000 deebot_client/hardware/deebot/yu362x.py diff --git a/deebot_client/hardware/deebot/12baap.py b/deebot_client/hardware/deebot/12baap.py new file mode 120000 index 00000000..f6783707 --- /dev/null +++ b/deebot_client/hardware/deebot/12baap.py @@ -0,0 +1 @@ +7j1tu6.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/1b23du.py b/deebot_client/hardware/deebot/1b23du.py new file mode 120000 index 00000000..09394ca0 --- /dev/null +++ b/deebot_client/hardware/deebot/1b23du.py @@ -0,0 +1 @@ +1vxt52.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/36xnxf.py b/deebot_client/hardware/deebot/36xnxf.py new file mode 120000 index 00000000..0cf622fe --- /dev/null +++ b/deebot_client/hardware/deebot/36xnxf.py @@ -0,0 +1 @@ +ty84oi.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/3w7j5e.py b/deebot_client/hardware/deebot/3w7j5e.py new file mode 120000 index 00000000..4eeb339a --- /dev/null +++ b/deebot_client/hardware/deebot/3w7j5e.py @@ -0,0 +1 @@ +4vhygi.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/7piq03.py b/deebot_client/hardware/deebot/7piq03.py new file mode 120000 index 00000000..ee958842 --- /dev/null +++ b/deebot_client/hardware/deebot/7piq03.py @@ -0,0 +1 @@ +kr0277.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/822x8d.py b/deebot_client/hardware/deebot/822x8d.py new file mode 120000 index 00000000..0baf6cd5 --- /dev/null +++ b/deebot_client/hardware/deebot/822x8d.py @@ -0,0 +1 @@ +z4lvk7.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/c0lwyn.py b/deebot_client/hardware/deebot/c0lwyn.py new file mode 120000 index 00000000..f6783707 --- /dev/null +++ b/deebot_client/hardware/deebot/c0lwyn.py @@ -0,0 +1 @@ +7j1tu6.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/d4v1pm.py b/deebot_client/hardware/deebot/d4v1pm.py new file mode 120000 index 00000000..f6783707 --- /dev/null +++ b/deebot_client/hardware/deebot/d4v1pm.py @@ -0,0 +1 @@ +7j1tu6.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/edoodo.py b/deebot_client/hardware/deebot/edoodo.py new file mode 120000 index 00000000..ee958842 --- /dev/null +++ b/deebot_client/hardware/deebot/edoodo.py @@ -0,0 +1 @@ +kr0277.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/gwtll7.py b/deebot_client/hardware/deebot/gwtll7.py new file mode 120000 index 00000000..d32cee92 --- /dev/null +++ b/deebot_client/hardware/deebot/gwtll7.py @@ -0,0 +1 @@ +qhe2o2.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/lhbd50.py b/deebot_client/hardware/deebot/lhbd50.py new file mode 120000 index 00000000..dede194c --- /dev/null +++ b/deebot_client/hardware/deebot/lhbd50.py @@ -0,0 +1 @@ +um2ywg.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/n6cwdb.py b/deebot_client/hardware/deebot/n6cwdb.py new file mode 120000 index 00000000..0cf622fe --- /dev/null +++ b/deebot_client/hardware/deebot/n6cwdb.py @@ -0,0 +1 @@ +ty84oi.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/nq9yhl.py b/deebot_client/hardware/deebot/nq9yhl.py new file mode 120000 index 00000000..f6783707 --- /dev/null +++ b/deebot_client/hardware/deebot/nq9yhl.py @@ -0,0 +1 @@ +7j1tu6.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/o0a4ju.py b/deebot_client/hardware/deebot/o0a4ju.py new file mode 120000 index 00000000..0489ef12 --- /dev/null +++ b/deebot_client/hardware/deebot/o0a4ju.py @@ -0,0 +1 @@ +lr4qcs.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/p0l0af.py b/deebot_client/hardware/deebot/p0l0af.py new file mode 120000 index 00000000..d32cee92 --- /dev/null +++ b/deebot_client/hardware/deebot/p0l0af.py @@ -0,0 +1 @@ +qhe2o2.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/r5y7re.py b/deebot_client/hardware/deebot/r5y7re.py new file mode 120000 index 00000000..0cf622fe --- /dev/null +++ b/deebot_client/hardware/deebot/r5y7re.py @@ -0,0 +1 @@ +ty84oi.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/rvflzn.py b/deebot_client/hardware/deebot/rvflzn.py new file mode 120000 index 00000000..0489ef12 --- /dev/null +++ b/deebot_client/hardware/deebot/rvflzn.py @@ -0,0 +1 @@ +lr4qcs.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/tlthqk.py b/deebot_client/hardware/deebot/tlthqk.py new file mode 120000 index 00000000..4eeb339a --- /dev/null +++ b/deebot_client/hardware/deebot/tlthqk.py @@ -0,0 +1 @@ +4vhygi.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/u4h1uk.py b/deebot_client/hardware/deebot/u4h1uk.py new file mode 120000 index 00000000..f6783707 --- /dev/null +++ b/deebot_client/hardware/deebot/u4h1uk.py @@ -0,0 +1 @@ +7j1tu6.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/u6eqoa.py b/deebot_client/hardware/deebot/u6eqoa.py new file mode 120000 index 00000000..f6783707 --- /dev/null +++ b/deebot_client/hardware/deebot/u6eqoa.py @@ -0,0 +1 @@ +7j1tu6.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/w7k3yc.py b/deebot_client/hardware/deebot/w7k3yc.py new file mode 120000 index 00000000..0489ef12 --- /dev/null +++ b/deebot_client/hardware/deebot/w7k3yc.py @@ -0,0 +1 @@ +lr4qcs.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/y2qy3m.py b/deebot_client/hardware/deebot/y2qy3m.py new file mode 120000 index 00000000..f6783707 --- /dev/null +++ b/deebot_client/hardware/deebot/y2qy3m.py @@ -0,0 +1 @@ +7j1tu6.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/yinacl.py b/deebot_client/hardware/deebot/yinacl.py new file mode 120000 index 00000000..ee958842 --- /dev/null +++ b/deebot_client/hardware/deebot/yinacl.py @@ -0,0 +1 @@ +kr0277.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/yu362x.py b/deebot_client/hardware/deebot/yu362x.py new file mode 120000 index 00000000..336ee24b --- /dev/null +++ b/deebot_client/hardware/deebot/yu362x.py @@ -0,0 +1 @@ +snxbvc.py \ No newline at end of file diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 50929853..f0a87236 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -2,6 +2,8 @@ from __future__ import annotations +import os +from pathlib import Path from typing import TYPE_CHECKING import pytest @@ -78,8 +80,7 @@ ) from deebot_client.events.network import NetworkInfoEvent from deebot_client.events.water_info import WaterInfoEvent -from deebot_client.hardware import get_static_device_info -from deebot_client.hardware.deebot import DEVICES, _load +from deebot_client.hardware import deebot as hardware_deebot, get_static_device_info if TYPE_CHECKING: from collections.abc import Callable @@ -93,7 +94,7 @@ ("class_", "expected"), [ ("not_specified", lambda: None), - ("yna5xi", lambda: DEVICES["yna5xi"]), + ("yna5xi", lambda: hardware_deebot.DEVICES["yna5xi"]), ], ) async def test_get_static_device_info( @@ -248,59 +249,12 @@ async def test_capabilities_event_extraction( def test_all_models_loaded() -> None: """Test that all models are loaded.""" - _load() - assert list(DEVICES) == [ - "0bdtzz", - "1vxt52", - "2ap5uq", - "2o4lnm", - "4vhygi", - "55aiho", - "5xu9h3", - "626v6g", - "659yh8", - "77atlz", - "7bryc5", - "7j1tu6", - "85as7h", - "85nbtp", - "8kwdb4", - "9ku8nu", - "9s1s80", - "b2jqs4", - "b742vd", - "clojes", - "e6ofmn", - "fqxoiu", - "guzput", - "h18jkh", - "ifbw08", - "ipohi5", - "itk04l", - "jtmf04", - "kr0277", - "lf3bn4", - "lr4qcs", - "lx3j7m", - "n4gstt", - "p1jij8", - "p95mgv", - "paeygf", - "py3qif", - "qhe2o2", - "r5zxjr", - "rss8xk", - "s69g6z", - "snxbvc", - "ty84oi", - "ucn2xe", - "um2ywg", - "umwv6z", - "vi829v", - "w16crm", - "x5d34r", - "yna5xi", - "z4lvk7", - "zjavof", - "zwkcqc", - ] + hardware_deebot._load() + folder = Path(hardware_deebot.__file__).parent + assert list(hardware_deebot.DEVICES) == sorted( + [ + name.removesuffix(".py") + for name in os.listdir(folder) + if (folder / name).is_file() and name != "__init__.py" + ] + ) From 635d21f15a8f9c07b8a7a3d796e73a90b46cfd00 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Wed, 11 Dec 2024 13:42:51 +0100 Subject: [PATCH 065/138] Add script to check for similar models (#668) --- .gitignore | 1 + pytest.ini | 2 +- scripts/__init__.py | 1 + scripts/check_for_similar_models.py | 66 +++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 scripts/__init__.py create mode 100644 scripts/check_for_similar_models.py diff --git a/.gitignore b/.gitignore index f00ad8e2..bcc8c767 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ nosetests.xml .*_cache test.py +.env \ No newline at end of file diff --git a/pytest.ini b/pytest.ini index 3658dc21..86cdb55f 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,5 +1,5 @@ [pytest] asyncio_mode = auto -timeout = 10 +#timeout = 10 #log_cli=true #log_level=DEBUG \ No newline at end of file diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 00000000..c07cabbb --- /dev/null +++ b/scripts/__init__.py @@ -0,0 +1 @@ +"""Scripts module.""" diff --git a/scripts/check_for_similar_models.py b/scripts/check_for_similar_models.py new file mode 100644 index 00000000..7c0deb96 --- /dev/null +++ b/scripts/check_for_similar_models.py @@ -0,0 +1,66 @@ +"""Script to check for similar models and link them to the same hardware implementation.""" + +from __future__ import annotations + +import asyncio +import logging +import os +import time + +import aiohttp + +from deebot_client.api_client import ApiClient +from deebot_client.authentication import Authenticator, create_rest_config +from deebot_client.hardware.deebot import DEVICES, _load +from deebot_client.util import md5 + + +async def main() -> None: + """Execute script.""" + async with aiohttp.ClientSession() as session: + logging.basicConfig(level=logging.DEBUG) + rest = create_rest_config( + session=session, + device_id=md5(str(time.time())), + alpha_2_country=os.environ["ECOVACS_COUNTRY"], + ) + + authenticator = Authenticator( + rest, os.environ["ECOVACS_USERNAME"], md5(os.environ["ECOVACS_PASSWORD"]) + ) + api_client = ApiClient(authenticator) + + name_map: dict[str, list[str]] = {} + for key, value in (await api_client.get_product_iot_map()).items(): + name_map.setdefault(value["name"], []).append(key) + + # Load current models + await asyncio.get_event_loop().run_in_executor(None, _load) + + for models in name_map.values(): + if len(models) < 2: + # No similar models + continue + + model_to_link = None + for model in models: + if model in DEVICES: + model_to_link = model + break + + if model_to_link: + # Found a model to link + for model in models: + if model != model_to_link and model not in DEVICES: + os.symlink( + f"{model_to_link}.py", + f"{model}.py", + dir_fd=os.open( + "deebot_client/hardware/deebot", os.O_RDONLY + ), + ) + + +if __name__ == "__main__": + loop = asyncio.new_event_loop() + loop.run_until_complete(main()) From e9fd1a3e476a20440e5f60564c2e52dd33f162fb Mon Sep 17 00:00:00 2001 From: Josh Sanders <68405780+josh-sanders@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:48:32 +1000 Subject: [PATCH 066/138] Add DEEBOT Neo (z0gd1j) (#667) Co-authored-by: Josh Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/z0gd1j.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/z0gd1j.py diff --git a/deebot_client/hardware/deebot/z0gd1j.py b/deebot_client/hardware/deebot/z0gd1j.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/z0gd1j.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file From 31a6970483f9aebe3d60b48937031d18bae2cb1e Mon Sep 17 00:00:00 2001 From: elpigeondindo Date: Wed, 11 Dec 2024 13:49:06 +0100 Subject: [PATCH 067/138] Add support for T30S Pro Omni (#662) * Create xco2fc.py Add support for T30S Pro Omni * Add support for T30S Pro omni Add the config in the file * Update xco2fc.py --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/xco2fc.py | 198 ++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 deebot_client/hardware/deebot/xco2fc.py diff --git a/deebot_client/hardware/deebot/xco2fc.py b/deebot_client/hardware/deebot/xco2fc.py new file mode 100644 index 00000000..c27af33f --- /dev/null +++ b/deebot_client/hardware/deebot/xco2fc.py @@ -0,0 +1,198 @@ +"""Deebot T30S Pro Omni Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + TrueDetectEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, + WorkMode, + WorkModeEvent, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + work_mode=CapabilitySetTypes( + event=WorkModeEvent, + get=[GetWorkMode()], + set=SetWorkMode, + types=( + WorkMode.MOP, + WorkMode.MOP_AFTER_VACUUM, + WorkMode.VACUUM, + WorkMode.VACUUM_AND_MOP, + ), + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=(LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH), + event=LifeSpanEvent, + get=[GetLifeSpan([LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH])], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +) From 60b947bdfed9669ddb1a93645ab0f59c2235fc9b Mon Sep 17 00:00:00 2001 From: purewooder Date: Wed, 11 Dec 2024 21:00:02 +0800 Subject: [PATCH 068/138] Add DEEBOT T8 AIVI, class 'bs40nz' (#665) Base on the Deebot OZMO T8 AIVI, class 'x5d34r' Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/bs40nz.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/bs40nz.py diff --git a/deebot_client/hardware/deebot/bs40nz.py b/deebot_client/hardware/deebot/bs40nz.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/bs40nz.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file From 1d390b83843c9c3dd2389be9161b8e17d763071f Mon Sep 17 00:00:00 2001 From: Remco Schipper <7037079+RSchipper@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:01:34 +0100 Subject: [PATCH 069/138] Add support for Deebot N30 pro Omni (87swps) (#663) Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/87swps.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/87swps.py diff --git a/deebot_client/hardware/deebot/87swps.py b/deebot_client/hardware/deebot/87swps.py new file mode 120000 index 00000000..63026c95 --- /dev/null +++ b/deebot_client/hardware/deebot/87swps.py @@ -0,0 +1 @@ +zwkcqc.py \ No newline at end of file From c33fa24df0857af592abb90629d3ab568551c293 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Wed, 11 Dec 2024 14:14:42 +0100 Subject: [PATCH 070/138] Add support for the N20 Plus (#669) Co-authored-by: MarkGodwin <10632972+MarkGodwin@users.noreply.github.com> --- deebot_client/hardware/deebot/buom7k.py | 188 ++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 deebot_client/hardware/deebot/buom7k.py diff --git a/deebot_client/hardware/deebot/buom7k.py b/deebot_client/hardware/deebot/buom7k.py new file mode 100644 index 00000000..4e91d2c5 --- /dev/null +++ b/deebot_client/hardware/deebot/buom7k.py @@ -0,0 +1,188 @@ +"""Deebot N20 Plus Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.child_lock import GetChildLock, SetChildLock +from deebot_client.commands.json.clean import CleanAreaV2, CleanV2, GetCleanInfoV2 +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.const import DataType +from deebot_client.events import ( + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + ChildLockEvent, + CleanCountEvent, + CleanLogEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=CleanV2, area=CleanAreaV2), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + LifeSpan.ROUND_MOP, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + LifeSpan.ROUND_MOP, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent( + CachedMapInfoEvent, [GetCachedMapInfo(version=2)] + ), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo(version=2)]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + child_lock=CapabilitySetEnable( + ChildLockEvent, [GetChildLock()], SetChildLock + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfoV2()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + ), + ), + ), +) From ebaef73c88a16489f44d87cbd0a4be5c89ad483f Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Thu, 12 Dec 2024 13:38:24 +0100 Subject: [PATCH 071/138] Add support for Deebot N10 (#673) --- deebot_client/hardware/deebot/m1wkuw.py | 219 ++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 deebot_client/hardware/deebot/m1wkuw.py diff --git a/deebot_client/hardware/deebot/m1wkuw.py b/deebot_client/hardware/deebot/m1wkuw.py new file mode 100644 index 00000000..fa3148dc --- /dev/null +++ b/deebot_client/hardware/deebot/m1wkuw.py @@ -0,0 +1,219 @@ +"""Deebot N10 Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.efficiency import GetEfficiencyMode, SetEfficiencyMode +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import ( + GetCachedMapInfo, + GetMajorMap, + GetMapTrace, +) +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.ota import GetOta, SetOta +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.voice_assistant_state import ( + GetVoiceAssistantState, + SetVoiceAssistantState, +) +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + CleanCountEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + EfficiencyModeEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + OtaEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + VoiceAssistantStateEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, +) +from deebot_client.events.efficiency_mode import EfficiencyMode +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + efficiency_mode=CapabilitySetTypes( + event=EfficiencyModeEvent, + get=[GetEfficiencyMode()], + set=SetEfficiencyMode, + types=( + EfficiencyMode.ENERGY_EFFICIENT_MODE, + EfficiencyMode.STANDARD_MODE, + ), + ), + ota=CapabilitySetEnable(OtaEvent, [GetOta()], SetOta), + voice_assistant=CapabilitySetEnable( + VoiceAssistantStateEvent, + [GetVoiceAssistantState()], + SetVoiceAssistantState, + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +) From 1cbc8ed1569e91dfc56dd44b0a59a323d2a80713 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Thu, 12 Dec 2024 18:47:24 +0100 Subject: [PATCH 072/138] Add models by similarity (#675) --- deebot_client/hardware/deebot/9kpees.py | 1 + deebot_client/hardware/deebot/cb69w5.py | 1 + deebot_client/hardware/deebot/dlrbzq.py | 1 + deebot_client/hardware/deebot/i35yb6.py | 1 + 4 files changed, 4 insertions(+) create mode 120000 deebot_client/hardware/deebot/9kpees.py create mode 120000 deebot_client/hardware/deebot/cb69w5.py create mode 120000 deebot_client/hardware/deebot/dlrbzq.py create mode 120000 deebot_client/hardware/deebot/i35yb6.py diff --git a/deebot_client/hardware/deebot/9kpees.py b/deebot_client/hardware/deebot/9kpees.py new file mode 120000 index 00000000..0406b5cf --- /dev/null +++ b/deebot_client/hardware/deebot/9kpees.py @@ -0,0 +1 @@ +buom7k.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/cb69w5.py b/deebot_client/hardware/deebot/cb69w5.py new file mode 120000 index 00000000..9b831817 --- /dev/null +++ b/deebot_client/hardware/deebot/cb69w5.py @@ -0,0 +1 @@ +xco2fc.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/dlrbzq.py b/deebot_client/hardware/deebot/dlrbzq.py new file mode 120000 index 00000000..88149b01 --- /dev/null +++ b/deebot_client/hardware/deebot/dlrbzq.py @@ -0,0 +1 @@ +87swps.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/i35yb6.py b/deebot_client/hardware/deebot/i35yb6.py new file mode 120000 index 00000000..0406b5cf --- /dev/null +++ b/deebot_client/hardware/deebot/i35yb6.py @@ -0,0 +1 @@ +buom7k.py \ No newline at end of file From c7a9b2fa99f3997ee623130e9f87e9eb66cb18e0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 08:44:57 +0100 Subject: [PATCH 073/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pytest-asyncio=20to=20v0.25.0=20(#678)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ccadde88..8dbb99b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ dev-dependencies = [ "pre-commit==4.0.1", "pycountry==24.6.1", "pylint==3.3.2", - "pytest-asyncio==0.24.0", + "pytest-asyncio==0.25.0", "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", "pytest-timeout==2.3.1", diff --git a/uv.lock b/uv.lock index 8612cd5d..dee4ee5e 100644 --- a/uv.lock +++ b/uv.lock @@ -261,7 +261,7 @@ dev = [ { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.2" }, { name = "pytest", specifier = "==8.3.4" }, - { name = "pytest-asyncio", specifier = "==0.24.0" }, + { name = "pytest-asyncio", specifier = "==0.25.0" }, { name = "pytest-cov", specifier = "==6.0.0" }, { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, { name = "pytest-timeout", specifier = "==2.3.1" }, @@ -698,14 +698,14 @@ wheels = [ [[package]] name = "pytest-asyncio" -version = "0.24.0" +version = "0.25.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/6d/c6cf50ce320cf8611df7a1254d86233b3df7cc07f9b5f5cbcb82e08aa534/pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276", size = 49855 } +sdist = { url = "https://files.pythonhosted.org/packages/94/18/82fcb4ee47d66d99f6cd1efc0b11b2a25029f303c599a5afda7c1bca4254/pytest_asyncio-0.25.0.tar.gz", hash = "sha256:8c0610303c9e0442a5db8604505fc0f545456ba1528824842b37b4a626cbf609", size = 53298 } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b", size = 18024 }, + { url = "https://files.pythonhosted.org/packages/88/56/2ee0cab25c11d4e38738a2a98c645a8f002e2ecf7b5ed774c70d53b92bb1/pytest_asyncio-0.25.0-py3-none-any.whl", hash = "sha256:db5432d18eac6b7e28b46dcd9b69921b55c3b1086e85febfe04e70b18d9e81b3", size = 19245 }, ] [[package]] From 54264cf89ba3ed5dff2b873802ed860d4aa266c5 Mon Sep 17 00:00:00 2001 From: Christoph Fink Date: Mon, 16 Dec 2024 20:17:46 +0100 Subject: [PATCH 074/138] Add X5 OMNI support (4jd37g) (#679) --- deebot_client/hardware/deebot/4jd37g.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/4jd37g.py diff --git a/deebot_client/hardware/deebot/4jd37g.py b/deebot_client/hardware/deebot/4jd37g.py new file mode 120000 index 00000000..0f26ba6a --- /dev/null +++ b/deebot_client/hardware/deebot/4jd37g.py @@ -0,0 +1 @@ +p1jij8.py \ No newline at end of file From f5c981f8558c3ae3a211bf60b296af7e3ae0eb64 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 16 Dec 2024 21:16:03 +0100 Subject: [PATCH 075/138] Pin to 3.13.0 until Pylint solve the issue (#691) --- .python-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.python-version b/.python-version index 3a4f41ef..77fdc6bb 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.13 \ No newline at end of file +3.13.0 \ No newline at end of file From 201b59df166e46e84b0ee0203431a11872c51068 Mon Sep 17 00:00:00 2001 From: marmer1 <64642738+marmer1@users.noreply.github.com> Date: Mon, 16 Dec 2024 21:18:29 +0100 Subject: [PATCH 076/138] Add Deebot N8 Black (7zya6u) (#686) Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/7zya6u.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/7zya6u.py diff --git a/deebot_client/hardware/deebot/7zya6u.py b/deebot_client/hardware/deebot/7zya6u.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/7zya6u.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file From 0cde1ddfd46e74042001d88308c6ec3c5a2f6a0e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 21:29:10 +0100 Subject: [PATCH 077/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#688)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/uv.lock b/uv.lock index dee4ee5e..30379fc1 100644 --- a/uv.lock +++ b/uv.lock @@ -71,14 +71,14 @@ wheels = [ [[package]] name = "aiosignal" -version = "1.3.1" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", size = 7617 }, + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, ] [[package]] @@ -92,11 +92,11 @@ wheels = [ [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678 } +sdist = { url = "https://files.pythonhosted.org/packages/48/c8/6260f8ccc11f0917360fc0da435c5c9c7504e3db174d5a12a1494887b045/attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", size = 805984 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, + { url = "https://files.pythonhosted.org/packages/89/aa/ab0f7891a01eeb2d2e338ae8fecbe57fcebea1a24dbb64d45801bfab481d/attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308", size = 63397 }, ] [[package]] @@ -110,11 +110,11 @@ wheels = [ [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, + { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, ] [[package]] From a8da71891a284f90708c46b38843b3dcad7631da Mon Sep 17 00:00:00 2001 From: seanyan1994 Date: Tue, 17 Dec 2024 04:30:51 +0800 Subject: [PATCH 078/138] Add DEEBOT T8 MAX (7n95dm) (#680) Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/7n95dm.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/7n95dm.py diff --git a/deebot_client/hardware/deebot/7n95dm.py b/deebot_client/hardware/deebot/7n95dm.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/7n95dm.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file From 5937a2df8f34133fa6bbad7dfdbc5fa069ddf83e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 00:44:20 +0100 Subject: [PATCH 079/138] [pre-commit.ci] pre-commit autoupdate (#693) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 38a675f1..16abd505 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.2 + rev: v0.8.3 hooks: - id: ruff args: From 509e3c871329be2e14faa9103cedda5369f322ed Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 17 Dec 2024 00:57:24 +0100 Subject: [PATCH 080/138] Replace deprecated class properties (#694) --- deebot_client/command.py | 47 +++++++++---------- deebot_client/commands/json/__init__.py | 5 +- deebot_client/commands/json/advanced_mode.py | 6 +-- deebot_client/commands/json/battery.py | 2 +- deebot_client/commands/json/border_switch.py | 6 +-- deebot_client/commands/json/carpet.py | 6 +-- deebot_client/commands/json/charge.py | 2 +- deebot_client/commands/json/charge_state.py | 2 +- deebot_client/commands/json/child_lock.py | 6 +-- deebot_client/commands/json/clean.py | 8 ++-- deebot_client/commands/json/clean_count.py | 4 +- deebot_client/commands/json/clean_logs.py | 4 +- .../commands/json/clean_preference.py | 6 +-- deebot_client/commands/json/clear_map.py | 2 +- deebot_client/commands/json/common.py | 20 ++++---- .../commands/json/continuous_cleaning.py | 6 +-- .../commands/json/cross_map_border_warning.py | 6 +-- deebot_client/commands/json/custom.py | 12 ++--- deebot_client/commands/json/cut_direction.py | 4 +- deebot_client/commands/json/efficiency.py | 4 +- deebot_client/commands/json/error.py | 2 +- deebot_client/commands/json/fan_speed.py | 4 +- deebot_client/commands/json/life_span.py | 4 +- deebot_client/commands/json/map.py | 14 +++--- deebot_client/commands/json/moveup_warning.py | 6 +-- deebot_client/commands/json/multimap_state.py | 6 +-- deebot_client/commands/json/network.py | 2 +- deebot_client/commands/json/ota.py | 4 +- deebot_client/commands/json/play_sound.py | 2 +- deebot_client/commands/json/pos.py | 2 +- deebot_client/commands/json/relocation.py | 2 +- deebot_client/commands/json/safe_protect.py | 6 +-- deebot_client/commands/json/stats.py | 4 +- deebot_client/commands/json/sweep_mode.py | 6 +-- deebot_client/commands/json/true_detect.py | 6 +-- .../commands/json/voice_assistant_state.py | 6 +-- deebot_client/commands/json/volume.py | 4 +- deebot_client/commands/json/water_info.py | 4 +- deebot_client/commands/json/work_mode.py | 4 +- deebot_client/commands/xml/__init__.py | 5 +- deebot_client/commands/xml/charge_state.py | 2 +- deebot_client/commands/xml/common.py | 15 ++---- deebot_client/commands/xml/error.py | 2 +- deebot_client/commands/xml/fan_speed.py | 2 +- deebot_client/commands/xml/pos.py | 2 +- deebot_client/commands/xml/stats.py | 2 +- deebot_client/message.py | 32 +++++++------ deebot_client/messages/json/__init__.py | 2 +- deebot_client/messages/json/battery.py | 2 +- deebot_client/messages/json/map.py | 2 +- deebot_client/messages/json/stats.py | 2 +- deebot_client/util/__init__.py | 12 +++++ tests/commands/json/__init__.py | 4 +- tests/commands/json/test_clean_log.py | 2 +- tests/commands/json/test_common.py | 4 +- tests/test_command.py | 27 +++++++++-- tests/test_mqtt_client.py | 8 ++-- 57 files changed, 195 insertions(+), 178 deletions(-) diff --git a/deebot_client/command.py b/deebot_client/command.py index 416467be..4490b9ff 100644 --- a/deebot_client/command.py +++ b/deebot_client/command.py @@ -12,6 +12,7 @@ ApiTimeoutError, DeebotError, ) +from deebot_client.util import verify_required_class_variables_exists from .const import PATH_API_IOT_DEVMANAGER, REQUEST_HEADERS, DataType from .logging_filter import get_logger @@ -64,24 +65,18 @@ class Command(ABC): """Abstract command object.""" _targets_bot: bool = True + NAME: str + DATA_TYPE: DataType + + def __init_subclass__(cls) -> None: + verify_required_class_variables_exists(cls, ("NAME", "DATA_TYPE")) + return super().__init_subclass__() def __init__(self, args: dict[str, Any] | list[Any] | None = None) -> None: if args is None: args = {} self._args = args - @property # type: ignore[misc] - @classmethod - @abstractmethod - def name(cls) -> str: - """Command name.""" - - @property # type: ignore[misc] - @classmethod - @abstractmethod - def data_type(cls) -> DataType: - """Data type.""" - @abstractmethod def _get_payload(self) -> dict[str, Any] | list[Any] | str: """Get the payload for the rest call.""" @@ -115,7 +110,7 @@ async def execute( except Exception: # pylint: disable=broad-except _LOGGER.warning( "Could not execute command %s", - self.name, + self.NAME, exc_info=True, ) return DeviceCommandResult(device_reached=False) @@ -132,14 +127,14 @@ async def _execute( except ApiTimeoutError: _LOGGER.warning( "Could not execute command %s: Timeout reached", - self.name, + self.NAME, ) return CommandResult(HandlingState.ERROR), {} result = self.__handle_response(event_bus, response) if result.state == HandlingState.ANALYSE: _LOGGER.debug( - "ANALYSE: Could not handle command: %s with %s", self.name, response + "ANALYSE: Could not handle command: %s with %s", self.NAME, response ) return ( CommandResult( @@ -150,16 +145,16 @@ async def _execute( response, ) if result.state == HandlingState.ERROR: - _LOGGER.warning("Could not parse %s: %s", self.name, response) + _LOGGER.warning("Could not parse %s: %s", self.NAME, response) return result, response async def _execute_api_request( self, authenticator: Authenticator, device_info: ApiDeviceInfo ) -> dict[str, Any]: payload = { - "cmdName": self.name, + "cmdName": self.NAME, "payload": self._get_payload(), - "payloadType": self.data_type.value, + "payloadType": self.DATA_TYPE.value, "td": "q", "toId": device_info["did"], "toRes": device_info["resource"], @@ -195,7 +190,7 @@ def __handle_response( result = self._handle_response(event_bus, response) if result.state == HandlingState.ANALYSE: _LOGGER.debug( - "ANALYSE: Could not handle command: %s with %s", self.name, response + "ANALYSE: Could not handle command: %s with %s", self.NAME, response ) return CommandResult( HandlingState.ANALYSE_LOGGED, @@ -206,7 +201,7 @@ def __handle_response( except Exception: # pylint: disable=broad-except _LOGGER.warning( "Could not parse response for %s: %s", - self.name, + self.NAME, response, exc_info=True, ) @@ -223,12 +218,12 @@ def _handle_response( def __eq__(self, obj: object) -> bool: if isinstance(obj, Command): - return self.name == obj.name and self._args == obj._args + return self.NAME == obj.NAME and self._args == obj._args return False def __hash__(self) -> int: - return hash(self.name) + hash(self._args) + return hash(self.NAME) + hash(self._args) class CommandWithMessageHandling(Command, Message, ABC): @@ -253,7 +248,7 @@ def _handle_response( case 4200: # bot offline _LOGGER.info( - 'Device is offline. Could not execute command "%s"', self.name + 'Device is offline. Could not execute command "%s"', self.NAME ) event_bus.notify(AvailabilityEvent(available=False)) return CommandResult(HandlingState.FAILED) @@ -261,16 +256,16 @@ def _handle_response( if self._is_available_check: _LOGGER.info( 'No response received for command "%s" during availability-check.', - self.name, + self.NAME, ) else: _LOGGER.warning( 'No response received for command "%s". This can happen if the device has network issues or does not support the command', - self.name, + self.NAME, ) return CommandResult(HandlingState.FAILED) - _LOGGER.warning('Command "%s" was not successfully.', self.name) + _LOGGER.warning('Command "%s" was not successfully.', self.NAME) return CommandResult(HandlingState.ANALYSE) diff --git a/deebot_client/commands/json/__init__.py b/deebot_client/commands/json/__init__.py index 384e2697..21584825 100644 --- a/deebot_client/commands/json/__init__.py +++ b/deebot_client/commands/json/__init__.py @@ -230,10 +230,7 @@ ] # fmt: on -COMMANDS: dict[str, type[Command]] = { - cmd.name: cmd # type: ignore[misc] - for cmd in _COMMANDS -} +COMMANDS: dict[str, type[Command]] = {cmd.NAME: cmd for cmd in _COMMANDS} COMMANDS_WITH_MQTT_P2P_HANDLING: dict[str, type[CommandMqttP2P]] = { cmd_name: cmd diff --git a/deebot_client/commands/json/advanced_mode.py b/deebot_client/commands/json/advanced_mode.py index 9c000c87..18496edd 100644 --- a/deebot_client/commands/json/advanced_mode.py +++ b/deebot_client/commands/json/advanced_mode.py @@ -10,12 +10,12 @@ class GetAdvancedMode(GetEnableCommand): """Get advanced mode command.""" - name = "getAdvancedMode" - event_type = AdvancedModeEvent + NAME = "getAdvancedMode" + EVENT_TYPE = AdvancedModeEvent class SetAdvancedMode(SetEnableCommand): """Set advanced mode command.""" - name = "setAdvancedMode" + NAME = "setAdvancedMode" get_command = GetAdvancedMode diff --git a/deebot_client/commands/json/battery.py b/deebot_client/commands/json/battery.py index 64c2c33c..a55bb402 100644 --- a/deebot_client/commands/json/battery.py +++ b/deebot_client/commands/json/battery.py @@ -10,7 +10,7 @@ class GetBattery(OnBattery, JsonCommandWithMessageHandling): """Get battery command.""" - name = "getBattery" + NAME = "getBattery" def __init__(self, *, is_available_check: bool = False) -> None: super().__init__() diff --git a/deebot_client/commands/json/border_switch.py b/deebot_client/commands/json/border_switch.py index 9099fd6b..06406f55 100644 --- a/deebot_client/commands/json/border_switch.py +++ b/deebot_client/commands/json/border_switch.py @@ -10,12 +10,12 @@ class GetBorderSwitch(GetEnableCommand): """Get border switch command.""" - name = "getBorderSwitch" - event_type = BorderSwitchEvent + NAME = "getBorderSwitch" + EVENT_TYPE = BorderSwitchEvent class SetBorderSwitch(SetEnableCommand): """Set border switch command.""" - name = "setBorderSwitch" + NAME = "setBorderSwitch" get_command = GetBorderSwitch diff --git a/deebot_client/commands/json/carpet.py b/deebot_client/commands/json/carpet.py index dd30fade..677b4fcf 100644 --- a/deebot_client/commands/json/carpet.py +++ b/deebot_client/commands/json/carpet.py @@ -10,12 +10,12 @@ class GetCarpetAutoFanBoost(GetEnableCommand): """Get carpet auto fan boost command.""" - name = "getCarpertPressure" - event_type = CarpetAutoFanBoostEvent + NAME = "getCarpertPressure" + EVENT_TYPE = CarpetAutoFanBoostEvent class SetCarpetAutoFanBoost(SetEnableCommand): """Set carpet auto fan boost command.""" - name = "setCarpertPressure" + NAME = "setCarpertPressure" get_command = GetCarpetAutoFanBoost diff --git a/deebot_client/commands/json/charge.py b/deebot_client/commands/json/charge.py index b6288b8d..9e1992b5 100644 --- a/deebot_client/commands/json/charge.py +++ b/deebot_client/commands/json/charge.py @@ -21,7 +21,7 @@ class Charge(ExecuteCommand): """Charge command.""" - name = "charge" + NAME = "charge" def __init__(self) -> None: super().__init__({"act": "go"}) diff --git a/deebot_client/commands/json/charge_state.py b/deebot_client/commands/json/charge_state.py index a9ceedad..77adb4ca 100644 --- a/deebot_client/commands/json/charge_state.py +++ b/deebot_client/commands/json/charge_state.py @@ -18,7 +18,7 @@ class GetChargeState(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get charge state command.""" - name = "getChargeState" + NAME = "getChargeState" @classmethod def _handle_body_data_dict( diff --git a/deebot_client/commands/json/child_lock.py b/deebot_client/commands/json/child_lock.py index 5f43e662..f5981b08 100644 --- a/deebot_client/commands/json/child_lock.py +++ b/deebot_client/commands/json/child_lock.py @@ -10,14 +10,14 @@ class GetChildLock(GetEnableCommand): """Get child lock command.""" - name = "getChildLock" - event_type = ChildLockEvent + NAME = "getChildLock" + EVENT_TYPE = ChildLockEvent _field_name = "on" class SetChildLock(SetEnableCommand): """Set child lock command.""" - name = "setChildLock" + NAME = "setChildLock" get_command = GetChildLock _field_name = "on" diff --git a/deebot_client/commands/json/clean.py b/deebot_client/commands/json/clean.py index 99ef10e5..ae0e51c1 100644 --- a/deebot_client/commands/json/clean.py +++ b/deebot_client/commands/json/clean.py @@ -22,7 +22,7 @@ class Clean(ExecuteCommand): """Clean command.""" - name = "clean" + NAME = "clean" def __init__(self, action: CleanAction) -> None: super().__init__(self._get_args(action)) @@ -77,7 +77,7 @@ def _get_args(self, action: CleanAction) -> dict[str, Any]: class CleanV2(Clean): """Clean V2 command.""" - name = "clean_V2" + NAME = "clean_V2" def _get_args(self, action: CleanAction) -> dict[str, Any]: content: dict[str, str] = {} @@ -107,7 +107,7 @@ def _get_args(self, action: CleanAction) -> dict[str, Any]: class GetCleanInfo(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get clean info command.""" - name = "getCleanInfo" + NAME = "getCleanInfo" @classmethod def _handle_body_data_dict( @@ -158,4 +158,4 @@ def _handle_body_data_dict( class GetCleanInfoV2(GetCleanInfo): """Get clean info v2 command.""" - name = "getCleanInfo_V2" + NAME = "getCleanInfo_V2" diff --git a/deebot_client/commands/json/clean_count.py b/deebot_client/commands/json/clean_count.py index d59e009e..dbfae0d9 100644 --- a/deebot_client/commands/json/clean_count.py +++ b/deebot_client/commands/json/clean_count.py @@ -18,7 +18,7 @@ class GetCleanCount(JsonGetCommand): """Get clean count command.""" - name = "getCleanCount" + NAME = "getCleanCount" @classmethod def _handle_body_data_dict( @@ -35,7 +35,7 @@ def _handle_body_data_dict( class SetCleanCount(JsonSetCommand): """Set clean count command.""" - name = "setCleanCount" + NAME = "setCleanCount" get_command = GetCleanCount _mqtt_params = MappingProxyType({"count": InitParam(int)}) diff --git a/deebot_client/commands/json/clean_logs.py b/deebot_client/commands/json/clean_logs.py index 75024805..c80feadf 100644 --- a/deebot_client/commands/json/clean_logs.py +++ b/deebot_client/commands/json/clean_logs.py @@ -23,7 +23,7 @@ class GetCleanLogs(JsonCommand): """Get clean logs command.""" _targets_bot: bool = False - name = "GetCleanLogs" + NAME = "GetCleanLogs" def __init__(self, count: int = 0) -> None: super().__init__({"count": count}) @@ -32,7 +32,7 @@ async def _execute_api_request( self, authenticator: Authenticator, device_info: ApiDeviceInfo ) -> dict[str, Any]: json = { - "td": self.name, + "td": self.NAME, "did": device_info["did"], "resource": device_info["resource"], } diff --git a/deebot_client/commands/json/clean_preference.py b/deebot_client/commands/json/clean_preference.py index 3b46bca3..6d1ab688 100644 --- a/deebot_client/commands/json/clean_preference.py +++ b/deebot_client/commands/json/clean_preference.py @@ -10,12 +10,12 @@ class GetCleanPreference(GetEnableCommand): """Get clean preference command.""" - name = "getCleanPreference" - event_type = CleanPreferenceEvent + NAME = "getCleanPreference" + EVENT_TYPE = CleanPreferenceEvent class SetCleanPreference(SetEnableCommand): """Set clean preference command.""" - name = "setCleanPreference" + NAME = "setCleanPreference" get_command = GetCleanPreference diff --git a/deebot_client/commands/json/clear_map.py b/deebot_client/commands/json/clear_map.py index 4d1c7eaa..11941849 100644 --- a/deebot_client/commands/json/clear_map.py +++ b/deebot_client/commands/json/clear_map.py @@ -8,7 +8,7 @@ class ClearMap(ExecuteCommand): """ClearMap state command.""" - name = "clearMap" + NAME = "clearMap" def __init__(self) -> None: super().__init__({"type": "all"}) diff --git a/deebot_client/commands/json/common.py b/deebot_client/commands/json/common.py index bbb25aff..d7d80811 100644 --- a/deebot_client/commands/json/common.py +++ b/deebot_client/commands/json/common.py @@ -2,7 +2,7 @@ from __future__ import annotations -from abc import ABC, abstractmethod +from abc import ABC from datetime import datetime from types import MappingProxyType from typing import TYPE_CHECKING, Any @@ -22,6 +22,7 @@ MessageBody, MessageBodyDataDict, ) +from deebot_client.util import verify_required_class_variables_exists from .const import CODE @@ -32,10 +33,10 @@ _LOGGER = get_logger(__name__) -class JsonCommand(Command): +class JsonCommand(Command, ABC): """Json base command.""" - data_type: DataType = DataType.JSON + DATA_TYPE = DataType.JSON def _get_payload(self) -> dict[str, Any] | list[Any]: payload = { @@ -72,7 +73,7 @@ def _handle_body(cls, _: EventBus, body: dict[str, Any]) -> HandlingResult: if body.get(CODE, -1) == 0: return HandlingResult.success() - _LOGGER.warning('Command "%s" was not successfully. body=%s', cls.name, body) + _LOGGER.warning('Command "%s" was not successfully. body=%s', cls.NAME, body) return HandlingResult(HandlingState.FAILED) @@ -100,12 +101,11 @@ class GetEnableCommand(JsonGetCommand, ABC): """Abstract get enable command.""" _field_name: str = "enable" + EVENT_TYPE: type[EnableEvent] - @property # type: ignore[misc] - @classmethod - @abstractmethod - def event_type(cls) -> type[EnableEvent]: - """Event type.""" + def __init_subclass__(cls) -> None: + verify_required_class_variables_exists(cls, ("EVENT_TYPE",)) + return super().__init_subclass__() @classmethod def _handle_body_data_dict( @@ -115,7 +115,7 @@ def _handle_body_data_dict( :return: A message response """ - event: EnableEvent = cls.event_type(bool(data[cls._field_name])) # type: ignore[call-arg, assignment] + event: EnableEvent = cls.EVENT_TYPE(bool(data[cls._field_name])) event_bus.notify(event) return HandlingResult.success() diff --git a/deebot_client/commands/json/continuous_cleaning.py b/deebot_client/commands/json/continuous_cleaning.py index 34273c5e..d735daea 100644 --- a/deebot_client/commands/json/continuous_cleaning.py +++ b/deebot_client/commands/json/continuous_cleaning.py @@ -10,12 +10,12 @@ class GetContinuousCleaning(GetEnableCommand): """Get continuous cleaning command.""" - name = "getBreakPoint" - event_type = ContinuousCleaningEvent + NAME = "getBreakPoint" + EVENT_TYPE = ContinuousCleaningEvent class SetContinuousCleaning(SetEnableCommand): """Set continuous cleaning command.""" - name = "setBreakPoint" + NAME = "setBreakPoint" get_command = GetContinuousCleaning diff --git a/deebot_client/commands/json/cross_map_border_warning.py b/deebot_client/commands/json/cross_map_border_warning.py index f2e1d5dd..0117312b 100644 --- a/deebot_client/commands/json/cross_map_border_warning.py +++ b/deebot_client/commands/json/cross_map_border_warning.py @@ -10,12 +10,12 @@ class GetCrossMapBorderWarning(GetEnableCommand): """Get cross map border warning command.""" - name = "getCrossMapBorderWarning" - event_type = CrossMapBorderWarningEvent + NAME = "getCrossMapBorderWarning" + EVENT_TYPE = CrossMapBorderWarningEvent class SetCrossMapBorderWarning(SetEnableCommand): """Set cross map border warning command.""" - name = "setCrossMapBorderWarning" + NAME = "setCrossMapBorderWarning" get_command = GetCrossMapBorderWarning diff --git a/deebot_client/commands/json/custom.py b/deebot_client/commands/json/custom.py index a71c3091..6f8da581 100644 --- a/deebot_client/commands/json/custom.py +++ b/deebot_client/commands/json/custom.py @@ -19,12 +19,12 @@ class CustomCommand(JsonCommand): """Custom command, used when user wants to execute a command, which is not part of this library.""" - name: str = "CustomCommand" + NAME: str = "CustomCommand" def __init__( self, name: str, args: dict[str, Any] | list[Any] | None = None ) -> None: - self.name = name + self.NAME = name super().__init__(args) def _handle_response( @@ -36,20 +36,20 @@ def _handle_response( """ if response.get("ret") == "ok": data = response.get("resp", response) - event_bus.notify(CustomCommandEvent(self.name, data)) + event_bus.notify(CustomCommandEvent(self.NAME, data)) return CommandResult.success() - _LOGGER.warning('Command "%s" was not successfully: %s', self.name, response) + _LOGGER.warning('Command "%s" was not successfully: %s', self.NAME, response) return CommandResult(HandlingState.FAILED) def __eq__(self, obj: object) -> bool: if super().__eq__(obj) and isinstance(obj, CustomCommand): - return self.name == obj.name + return self.NAME == obj.NAME return False def __hash__(self) -> int: - return super().__hash__() + hash(self.name) + return super().__hash__() + hash(self.NAME) class CustomPayloadCommand(CustomCommand): diff --git a/deebot_client/commands/json/cut_direction.py b/deebot_client/commands/json/cut_direction.py index e05bb58f..7e4b3ba5 100644 --- a/deebot_client/commands/json/cut_direction.py +++ b/deebot_client/commands/json/cut_direction.py @@ -18,7 +18,7 @@ class GetCutDirection(JsonGetCommand): """Get cut direction command.""" - name = "getCutDirection" + NAME = "getCutDirection" @classmethod def _handle_body_data_dict( @@ -35,7 +35,7 @@ def _handle_body_data_dict( class SetCutDirection(JsonSetCommand): """Set cut direction command.""" - name = "setCutDirection" + NAME = "setCutDirection" get_command = GetCutDirection _mqtt_params = MappingProxyType({"angle": InitParam(int)}) diff --git a/deebot_client/commands/json/efficiency.py b/deebot_client/commands/json/efficiency.py index 511f1835..33764c87 100644 --- a/deebot_client/commands/json/efficiency.py +++ b/deebot_client/commands/json/efficiency.py @@ -19,7 +19,7 @@ class GetEfficiencyMode(JsonGetCommand): """Get efficiency mode command.""" - name = "getEfficiency" + NAME = "getEfficiency" @classmethod def _handle_body_data_dict( @@ -36,7 +36,7 @@ def _handle_body_data_dict( class SetEfficiencyMode(JsonSetCommand): """Set efficiency mode command.""" - name = "setEfficiency" + NAME = "setEfficiency" get_command = GetEfficiencyMode _mqtt_params = MappingProxyType({"efficiency": InitParam(EfficiencyMode)}) diff --git a/deebot_client/commands/json/error.py b/deebot_client/commands/json/error.py index 605f27d3..8f9bfc05 100644 --- a/deebot_client/commands/json/error.py +++ b/deebot_client/commands/json/error.py @@ -18,7 +18,7 @@ class GetError(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get error command.""" - name = "getError" + NAME = "getError" @classmethod def _handle_body_data_dict( diff --git a/deebot_client/commands/json/fan_speed.py b/deebot_client/commands/json/fan_speed.py index 33902ad8..f4303564 100644 --- a/deebot_client/commands/json/fan_speed.py +++ b/deebot_client/commands/json/fan_speed.py @@ -19,7 +19,7 @@ class GetFanSpeed(JsonGetCommand): """Get fan speed command.""" - name = "getSpeed" + NAME = "getSpeed" @classmethod def _handle_body_data_dict( @@ -36,7 +36,7 @@ def _handle_body_data_dict( class SetFanSpeed(JsonSetCommand): """Set fan speed command.""" - name = "setSpeed" + NAME = "setSpeed" get_command = GetFanSpeed _mqtt_params = MappingProxyType({"speed": InitParam(FanSpeedLevel)}) diff --git a/deebot_client/commands/json/life_span.py b/deebot_client/commands/json/life_span.py index 4091125b..3a7b6e3c 100644 --- a/deebot_client/commands/json/life_span.py +++ b/deebot_client/commands/json/life_span.py @@ -19,7 +19,7 @@ class GetLifeSpan(JsonCommandWithMessageHandling, MessageBodyDataList): """Get life span command.""" - name = "getLifeSpan" + NAME = "getLifeSpan" def __init__(self, life_spans: LST[LifeSpan]) -> None: args = [life_span.value for life_span in life_spans] @@ -50,7 +50,7 @@ def _handle_body_data_list( class ResetLifeSpan(ExecuteCommand, CommandMqttP2P): """Reset life span command.""" - name = "resetLifeSpan" + NAME = "resetLifeSpan" _mqtt_params = MappingProxyType({"type": InitParam(LifeSpan, "life_span")}) def __init__(self, life_span: LifeSpan) -> None: diff --git a/deebot_client/commands/json/map.py b/deebot_client/commands/json/map.py index 73aa0cff..514d4415 100644 --- a/deebot_client/commands/json/map.py +++ b/deebot_client/commands/json/map.py @@ -32,7 +32,7 @@ class GetCachedMapInfo(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get cached map info command.""" - name = "getCachedMapInfo" + NAME = "getCachedMapInfo" # version definition for using type of getMapSet v1 or v2 _map_set_command: type[GetMapSet | GetMapSetV2] @@ -94,7 +94,7 @@ def _handle_response( class GetMajorMap(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get major map command.""" - name = "getMajorMap" + NAME = "getMajorMap" @classmethod def _handle_body_data_dict( @@ -135,7 +135,7 @@ class GetMapSet(JsonCommandWithMessageHandling, MessageBodyDataDict): _ARGS_TYPE = "type" _ARGS_SUBSETS = "subsets" - name = "getMapSet" + NAME = "getMapSet" def __init__( self, @@ -222,7 +222,7 @@ class GetMapSubSet(JsonCommandWithMessageHandling, MessageBodyDataDict): } ) - name = "getMapSubSet" + NAME = "getMapSubSet" def __init__( self, @@ -297,7 +297,7 @@ def _handle_body_data_dict( class GetMapSetV2(GetMapSet): """Get map set v2 command.""" - name = "getMapSet_V2" + NAME = "getMapSet_V2" @classmethod def _get_subset_ids( @@ -341,7 +341,7 @@ class GetMapTrace(JsonCommandWithMessageHandling, MessageBodyDataDict): _TRACE_POINT_COUNT = 200 - name = "getMapTrace" + NAME = "getMapTrace" def __init__(self, trace_start: int = 0) -> None: super().__init__( @@ -387,7 +387,7 @@ def _handle_response( class GetMinorMap(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get minor map command.""" - name = "getMinorMap" + NAME = "getMinorMap" def __init__(self, *, map_id: str, piece_index: int) -> None: super().__init__({"mid": map_id, "type": "ol", "pieceIndex": piece_index}) diff --git a/deebot_client/commands/json/moveup_warning.py b/deebot_client/commands/json/moveup_warning.py index 4c17ccc9..b6063e28 100644 --- a/deebot_client/commands/json/moveup_warning.py +++ b/deebot_client/commands/json/moveup_warning.py @@ -10,12 +10,12 @@ class GetMoveUpWarning(GetEnableCommand): """Get move up lock command.""" - name = "getMoveupWarning" - event_type = MoveUpWarningEvent + NAME = "getMoveupWarning" + EVENT_TYPE = MoveUpWarningEvent class SetMoveUpWarning(SetEnableCommand): """Set move up lock command.""" - name = "setMoveupWarning" + NAME = "setMoveupWarning" get_command = GetMoveUpWarning diff --git a/deebot_client/commands/json/multimap_state.py b/deebot_client/commands/json/multimap_state.py index a9dd5cd0..5d4eeacf 100644 --- a/deebot_client/commands/json/multimap_state.py +++ b/deebot_client/commands/json/multimap_state.py @@ -10,12 +10,12 @@ class GetMultimapState(GetEnableCommand): """Get multimap state command.""" - name = "getMultiMapState" - event_type = MultimapStateEvent + NAME = "getMultiMapState" + EVENT_TYPE = MultimapStateEvent class SetMultimapState(SetEnableCommand): """Set multimap state command.""" - name = "setMultiMapState" + NAME = "setMultiMapState" get_command = GetMultimapState diff --git a/deebot_client/commands/json/network.py b/deebot_client/commands/json/network.py index b5c6c816..50696a57 100644 --- a/deebot_client/commands/json/network.py +++ b/deebot_client/commands/json/network.py @@ -16,7 +16,7 @@ class GetNetInfo(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get network info command.""" - name = "getNetInfo" + NAME = "getNetInfo" @classmethod def _handle_body_data_dict( diff --git a/deebot_client/commands/json/ota.py b/deebot_client/commands/json/ota.py index 8ee5bdcd..7db059c1 100644 --- a/deebot_client/commands/json/ota.py +++ b/deebot_client/commands/json/ota.py @@ -18,7 +18,7 @@ class GetOta(JsonGetCommand): """Get ota command.""" - name = "getOta" + NAME = "getOta" @classmethod def _handle_body_data_dict( @@ -50,7 +50,7 @@ def handle_set_args( class SetOta(JsonSetCommand): """Set ota command.""" - name = "setOta" + NAME = "setOta" get_command = GetOta _mqtt_params = MappingProxyType({"autoSwitch": InitParam(bool, "auto_enabled")}) diff --git a/deebot_client/commands/json/play_sound.py b/deebot_client/commands/json/play_sound.py index ab3bd0b3..47023435 100644 --- a/deebot_client/commands/json/play_sound.py +++ b/deebot_client/commands/json/play_sound.py @@ -8,7 +8,7 @@ class PlaySound(ExecuteCommand): """Play sound command.""" - name = "playSound" + NAME = "playSound" def __init__(self) -> None: super().__init__({"count": 1, "sid": 30}) diff --git a/deebot_client/commands/json/pos.py b/deebot_client/commands/json/pos.py index 27564b9f..27f81773 100644 --- a/deebot_client/commands/json/pos.py +++ b/deebot_client/commands/json/pos.py @@ -16,7 +16,7 @@ class GetPos(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get volume command.""" - name = "getPos" + NAME = "getPos" def __init__(self) -> None: super().__init__(["chargePos", "deebotPos"]) diff --git a/deebot_client/commands/json/relocation.py b/deebot_client/commands/json/relocation.py index 7d394b33..5849ad1f 100644 --- a/deebot_client/commands/json/relocation.py +++ b/deebot_client/commands/json/relocation.py @@ -8,7 +8,7 @@ class SetRelocationState(ExecuteCommand): """Set relocation state command.""" - name = "setRelocationState" + NAME = "setRelocationState" def __init__(self) -> None: super().__init__({"mode": "manu"}) diff --git a/deebot_client/commands/json/safe_protect.py b/deebot_client/commands/json/safe_protect.py index 25444218..1e3cb43e 100644 --- a/deebot_client/commands/json/safe_protect.py +++ b/deebot_client/commands/json/safe_protect.py @@ -10,12 +10,12 @@ class GetSafeProtect(GetEnableCommand): """Get safe protect command.""" - name = "getSafeProtect" - event_type = SafeProtectEvent + NAME = "getSafeProtect" + EVENT_TYPE = SafeProtectEvent class SetSafeProtect(SetEnableCommand): """Set safe protect command.""" - name = "setSafeProtect" + NAME = "setSafeProtect" get_command = GetSafeProtect diff --git a/deebot_client/commands/json/stats.py b/deebot_client/commands/json/stats.py index 133f90f4..70a9cb3e 100644 --- a/deebot_client/commands/json/stats.py +++ b/deebot_client/commands/json/stats.py @@ -16,7 +16,7 @@ class GetStats(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get stats command.""" - name = "getStats" + NAME = "getStats" @classmethod def _handle_body_data_dict( @@ -38,7 +38,7 @@ def _handle_body_data_dict( class GetTotalStats(JsonCommandWithMessageHandling, MessageBodyDataDict): """Get stats command.""" - name = "getTotalStats" + NAME = "getTotalStats" @classmethod def _handle_body_data_dict( diff --git a/deebot_client/commands/json/sweep_mode.py b/deebot_client/commands/json/sweep_mode.py index de12c244..5e8bf5d9 100644 --- a/deebot_client/commands/json/sweep_mode.py +++ b/deebot_client/commands/json/sweep_mode.py @@ -10,14 +10,14 @@ class GetSweepMode(GetEnableCommand): """GetSweepMode command.""" - name = "getSweepMode" - event_type = SweepModeEvent + NAME = "getSweepMode" + EVENT_TYPE = SweepModeEvent _field_name = "type" class SetSweepMode(SetEnableCommand): """SetSweepMode command.""" - name = "setSweepMode" + NAME = "setSweepMode" get_command = GetSweepMode _field_name = "type" diff --git a/deebot_client/commands/json/true_detect.py b/deebot_client/commands/json/true_detect.py index 32f05f2a..982336a4 100644 --- a/deebot_client/commands/json/true_detect.py +++ b/deebot_client/commands/json/true_detect.py @@ -10,12 +10,12 @@ class GetTrueDetect(GetEnableCommand): """Get multimap state command.""" - name = "getTrueDetect" - event_type = TrueDetectEvent + NAME = "getTrueDetect" + EVENT_TYPE = TrueDetectEvent class SetTrueDetect(SetEnableCommand): """Set multimap state command.""" - name = "setTrueDetect" + NAME = "setTrueDetect" get_command = GetTrueDetect diff --git a/deebot_client/commands/json/voice_assistant_state.py b/deebot_client/commands/json/voice_assistant_state.py index 15838ef1..20a445cf 100644 --- a/deebot_client/commands/json/voice_assistant_state.py +++ b/deebot_client/commands/json/voice_assistant_state.py @@ -10,12 +10,12 @@ class GetVoiceAssistantState(GetEnableCommand): """Get voice assistant state command.""" - name = "getVoiceAssistantState" - event_type = VoiceAssistantStateEvent + NAME = "getVoiceAssistantState" + EVENT_TYPE = VoiceAssistantStateEvent class SetVoiceAssistantState(SetEnableCommand): """Set voice assistant state command.""" - name = "setVoiceAssistantState" + NAME = "setVoiceAssistantState" get_command = GetVoiceAssistantState diff --git a/deebot_client/commands/json/volume.py b/deebot_client/commands/json/volume.py index d11f9f17..24fb5927 100644 --- a/deebot_client/commands/json/volume.py +++ b/deebot_client/commands/json/volume.py @@ -18,7 +18,7 @@ class GetVolume(JsonGetCommand): """Get volume command.""" - name = "getVolume" + NAME = "getVolume" @classmethod def _handle_body_data_dict( @@ -35,7 +35,7 @@ def _handle_body_data_dict( class SetVolume(JsonSetCommand): """Set volume command.""" - name = "setVolume" + NAME = "setVolume" get_command = GetVolume _mqtt_params = MappingProxyType( { diff --git a/deebot_client/commands/json/water_info.py b/deebot_client/commands/json/water_info.py index c84bc660..284c82de 100644 --- a/deebot_client/commands/json/water_info.py +++ b/deebot_client/commands/json/water_info.py @@ -19,7 +19,7 @@ class GetWaterInfo(JsonGetCommand): """Get water info command.""" - name = "getWaterInfo" + NAME = "getWaterInfo" @classmethod def _handle_body_data_dict( @@ -49,7 +49,7 @@ def _handle_body_data_dict( class SetWaterInfo(JsonSetCommand): """Set water info command.""" - name = "setWaterInfo" + NAME = "setWaterInfo" get_command = GetWaterInfo _mqtt_params = MappingProxyType( { diff --git a/deebot_client/commands/json/work_mode.py b/deebot_client/commands/json/work_mode.py index aff6a613..f4bf6fc0 100644 --- a/deebot_client/commands/json/work_mode.py +++ b/deebot_client/commands/json/work_mode.py @@ -19,7 +19,7 @@ class GetWorkMode(JsonGetCommand): """Get work mode command.""" - name = "getWorkMode" + NAME = "getWorkMode" @classmethod def _handle_body_data_dict( @@ -36,7 +36,7 @@ def _handle_body_data_dict( class SetWorkMode(JsonSetCommand): """Set work mode command.""" - name = "setWorkMode" + NAME = "setWorkMode" get_command = GetWorkMode _mqtt_params = MappingProxyType({"mode": InitParam(WorkMode)}) diff --git a/deebot_client/commands/xml/__init__.py b/deebot_client/commands/xml/__init__.py index d16c8c57..4f42ad79 100644 --- a/deebot_client/commands/xml/__init__.py +++ b/deebot_client/commands/xml/__init__.py @@ -30,10 +30,7 @@ ] # fmt: on -COMMANDS: dict[str, type[Command]] = { - cmd.name: cmd # type: ignore[misc] - for cmd in _COMMANDS -} +COMMANDS: dict[str, type[Command]] = {cmd.NAME: cmd for cmd in _COMMANDS} COMMANDS_WITH_MQTT_P2P_HANDLING: dict[str, type[CommandMqttP2P]] = { cmd_name: cmd diff --git a/deebot_client/commands/xml/charge_state.py b/deebot_client/commands/xml/charge_state.py index 1d88f876..78b7110a 100644 --- a/deebot_client/commands/xml/charge_state.py +++ b/deebot_client/commands/xml/charge_state.py @@ -19,7 +19,7 @@ class GetChargeState(XmlCommandWithMessageHandling): """GetChargeState command.""" - name = "GetChargeState" + NAME = "GetChargeState" @classmethod def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult: diff --git a/deebot_client/commands/xml/common.py b/deebot_client/commands/xml/common.py index d63e4044..bc04d3d9 100644 --- a/deebot_client/commands/xml/common.py +++ b/deebot_client/commands/xml/common.py @@ -19,23 +19,18 @@ _LOGGER = get_logger(__name__) -class XmlCommand(Command): +class XmlCommand(Command, ABC): """Xml command.""" - data_type: DataType = DataType.XML - - @property # type: ignore[misc] - @classmethod - def has_sub_element(cls) -> bool: - """Return True if command has inner element.""" - return False + DATA_TYPE = DataType.XML + HAS_SUB_ELEMENT = False def _get_payload(self) -> str: element = ctl_element = Element("ctl") if len(self._args) > 0: - if self.has_sub_element: - element = SubElement(element, self.name.lower()) + if self.HAS_SUB_ELEMENT: + element = SubElement(element, self.NAME.lower()) if isinstance(self._args, dict): for key, value in self._args.items(): diff --git a/deebot_client/commands/xml/error.py b/deebot_client/commands/xml/error.py index b72007a2..06b59850 100644 --- a/deebot_client/commands/xml/error.py +++ b/deebot_client/commands/xml/error.py @@ -20,7 +20,7 @@ class GetError(XmlCommandWithMessageHandling): """Get error command.""" - name = "GetError" + NAME = "GetError" @classmethod def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult: diff --git a/deebot_client/commands/xml/fan_speed.py b/deebot_client/commands/xml/fan_speed.py index d0c1f379..2a834554 100644 --- a/deebot_client/commands/xml/fan_speed.py +++ b/deebot_client/commands/xml/fan_speed.py @@ -18,7 +18,7 @@ class GetFanSpeed(XmlCommandWithMessageHandling): """GetFanSpeed command.""" - name = "GetCleanSpeed" + NAME = "GetCleanSpeed" @classmethod def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult: diff --git a/deebot_client/commands/xml/pos.py b/deebot_client/commands/xml/pos.py index 926cf827..4b4eaea1 100644 --- a/deebot_client/commands/xml/pos.py +++ b/deebot_client/commands/xml/pos.py @@ -18,7 +18,7 @@ class GetPos(XmlCommandWithMessageHandling): """GetPos command.""" - name = "GetPos" + NAME = "GetPos" @classmethod def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult: diff --git a/deebot_client/commands/xml/stats.py b/deebot_client/commands/xml/stats.py index 55bc4243..aeb615cd 100644 --- a/deebot_client/commands/xml/stats.py +++ b/deebot_client/commands/xml/stats.py @@ -18,7 +18,7 @@ class GetCleanSum(XmlCommandWithMessageHandling): """GetCleanSum command.""" - name = "GetCleanSum" + NAME = "GetCleanSum" @classmethod def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult: diff --git a/deebot_client/message.py b/deebot_client/message.py index 6aa35af6..e2a0bed7 100644 --- a/deebot_client/message.py +++ b/deebot_client/message.py @@ -8,6 +8,8 @@ import functools from typing import TYPE_CHECKING, Any, TypeVar, final +from deebot_client.util import verify_required_class_variables_exists + from .logging_filter import get_logger if TYPE_CHECKING: @@ -61,13 +63,13 @@ def wrapper( try: response = func(cls, event_bus, data) if response.state == HandlingState.ANALYSE: - _LOGGER.debug("Could not handle %s message: %s", cls.name, data) + _LOGGER.debug("Could not handle %s message: %s", cls.NAME, data) return HandlingResult(HandlingState.ANALYSE_LOGGED, response.args) if response.state == HandlingState.ERROR: - _LOGGER.warning("Could not parse %s: %s", cls.name, data) + _LOGGER.warning("Could not parse %s: %s", cls.NAME, data) return response except Exception: # pylint: disable=broad-except - _LOGGER.warning("Could not parse %s: %s", cls.name, data, exc_info=True) + _LOGGER.warning("Could not parse %s: %s", cls.NAME, data, exc_info=True) return HandlingResult(HandlingState.ERROR) return wrapper @@ -76,11 +78,11 @@ def wrapper( class Message(ABC): """Message.""" - @property # type: ignore[misc] - @classmethod - @abstractmethod - def name(cls) -> str: - """Command name.""" + NAME: str + + def __init_subclass__(cls) -> None: + verify_required_class_variables_exists(cls, ("NAME",)) + return super().__init_subclass__() @classmethod @abstractmethod @@ -105,7 +107,7 @@ def handle( return cls._handle(event_bus, message) -class MessageStr(Message): +class MessageStr(Message, ABC): """String message.""" @classmethod @@ -137,7 +139,7 @@ def _handle( return super()._handle(event_bus, message) -class MessageBody(Message): +class MessageBody(Message, ABC): """Dict message with body attribute.""" @classmethod @@ -168,7 +170,7 @@ def _handle( return super()._handle(event_bus, message) -class MessageBodyData(MessageBody): +class MessageBodyData(MessageBody, ABC): """Dict message with body->data attribute.""" @classmethod @@ -189,11 +191,11 @@ def __handle_body_data( try: response = cls._handle_body_data(event_bus, data) if response.state == HandlingState.ANALYSE: - _LOGGER.debug("Could not handle %s message: %s", cls.name, data) + _LOGGER.debug("Could not handle %s message: %s", cls.NAME, data) return HandlingResult(HandlingState.ANALYSE_LOGGED, response.args) return response except Exception: # pylint: disable=broad-except - _LOGGER.warning("Could not parse %s: %s", cls.name, data, exc_info=True) + _LOGGER.warning("Could not parse %s: %s", cls.NAME, data, exc_info=True) return HandlingResult(HandlingState.ERROR) @classmethod @@ -208,7 +210,7 @@ def _handle_body(cls, event_bus: EventBus, body: dict[str, Any]) -> HandlingResu return super()._handle_body(event_bus, body) -class MessageBodyDataDict(MessageBodyData): +class MessageBodyDataDict(MessageBodyData, ABC): """Dict message with body->data attribute as dict.""" @classmethod @@ -235,7 +237,7 @@ def _handle_body_data( return super()._handle_body_data(event_bus, data) -class MessageBodyDataList(MessageBodyData): +class MessageBodyDataList(MessageBodyData, ABC): """Dict message with body->data attribute as list.""" @classmethod diff --git a/deebot_client/messages/json/__init__.py b/deebot_client/messages/json/__init__.py index 8e8402de..c346e9ba 100644 --- a/deebot_client/messages/json/__init__.py +++ b/deebot_client/messages/json/__init__.py @@ -27,4 +27,4 @@ ] # fmt: on -MESSAGES: dict[str, type[Message]] = {message.name: message for message in _MESSAGES} # type: ignore[misc] +MESSAGES: dict[str, type[Message]] = {message.NAME: message for message in _MESSAGES} diff --git a/deebot_client/messages/json/battery.py b/deebot_client/messages/json/battery.py index 67c1e364..2cf84d43 100644 --- a/deebot_client/messages/json/battery.py +++ b/deebot_client/messages/json/battery.py @@ -14,7 +14,7 @@ class OnBattery(MessageBodyDataDict): """On battery message.""" - name = "onBattery" + NAME = "onBattery" @classmethod def _handle_body_data_dict( diff --git a/deebot_client/messages/json/map.py b/deebot_client/messages/json/map.py index edff8c6a..0d2c0a59 100644 --- a/deebot_client/messages/json/map.py +++ b/deebot_client/messages/json/map.py @@ -14,7 +14,7 @@ class OnMapSetV2(MessageBodyDataDict): """On map set v2 message.""" - name = "onMapSet_V2" + NAME = "onMapSet_V2" @classmethod def _handle_body_data_dict( diff --git a/deebot_client/messages/json/stats.py b/deebot_client/messages/json/stats.py index 0170a8e9..a0c5e982 100644 --- a/deebot_client/messages/json/stats.py +++ b/deebot_client/messages/json/stats.py @@ -14,7 +14,7 @@ class ReportStats(MessageBodyDataDict): """Report stats message.""" - name = "reportStats" + NAME = "reportStats" @classmethod def _handle_body_data_dict( diff --git a/deebot_client/util/__init__.py b/deebot_client/util/__init__.py index 3d8f2a5c..b2693604 100644 --- a/deebot_client/util/__init__.py +++ b/deebot_client/util/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations +from abc import ABC import asyncio import base64 from contextlib import suppress @@ -25,6 +26,17 @@ def md5(text: str) -> str: return hashlib.md5(bytes(str(text), "utf8")).hexdigest() # noqa: S324 +def verify_required_class_variables_exists( + cls: type[Any], required_variables: tuple[str, ...] +) -> None: + """Verify that the class has the given class variables.""" + if ABC not in cls.__bases__: + for required in required_variables: + if not hasattr(cls, required): + msg = f"Class {cls.__name__} must have a {required} attribute" + raise ValueError(msg) + + def decompress_7z_base64_data(data: str) -> bytes: """Decompress base64 decoded 7z compressed string.""" final_array = bytearray() diff --git a/tests/commands/json/__init__.py b/tests/commands/json/__init__.py index 6c5deeca..dace16e9 100644 --- a/tests/commands/json/__init__.py +++ b/tests/commands/json/__init__.py @@ -30,7 +30,7 @@ async def assert_execute_command( command: ExecuteCommand, args: dict[str, Any] | list[Any] | None ) -> None: - assert command.name != "invalid" + assert command.NAME != "invalid" assert command._args == args # success @@ -49,7 +49,7 @@ async def assert_execute_command( ( "deebot_client.commands.json.common", "WARNING", - f'Command "{command.name}" was not successfully. body={body}', + f'Command "{command.NAME}" was not successfully. body={body}', ) ) diff --git a/tests/commands/json/test_clean_log.py b/tests/commands/json/test_clean_log.py index 37759ca7..470cb026 100644 --- a/tests/commands/json/test_clean_log.py +++ b/tests/commands/json/test_clean_log.py @@ -150,5 +150,5 @@ async def test_GetCleanLogs_handle_error(caplog: pytest.LogCaptureFixture) -> No assert ( "deebot_client.command", logging.WARNING, - f"Could not parse response for {GetCleanLogs.name}: {{}}", + f"Could not parse response for {GetCleanLogs.NAME}: {{}}", ) in caplog.record_tuples diff --git a/tests/commands/json/test_common.py b/tests/commands/json/test_common.py index cd04e6a5..24b299e7 100644 --- a/tests/commands/json/test_common.py +++ b/tests/commands/json/test_common.py @@ -84,14 +84,14 @@ async def test_common_functionality( assert ( "deebot_client.command", logging.INFO, - f'No response received for command "{command.name}" during availability-check.', + f'No response received for command "{command.NAME}" during availability-check.', ) in caplog.record_tuples elif expected_log: assert ( "deebot_client.command", expected_log[0], - expected_log[1].format(command.name), + expected_log[1].format(command.NAME), ) in caplog.record_tuples assert available.device_reached is False diff --git a/tests/test_command.py b/tests/test_command.py index 7eb6bef1..daa75cfa 100644 --- a/tests/test_command.py +++ b/tests/test_command.py @@ -7,7 +7,7 @@ from aiohttp import ClientTimeout import pytest -from deebot_client.command import CommandMqttP2P, CommandResult, InitParam +from deebot_client.command import Command, CommandMqttP2P, CommandResult, InitParam from deebot_client.const import DataType from deebot_client.exceptions import ApiTimeoutError, DeebotError @@ -19,8 +19,8 @@ class _TestCommand(CommandMqttP2P): - name = "TestCommand" - data_type = DataType.JSON + NAME = "TestCommand" + DATA_TYPE = DataType.JSON _mqtt_params = MappingProxyType({"field": InitParam(int), "remove": None}) def __init__(self, field: int) -> None: @@ -42,12 +42,31 @@ def _handle_response( def test_CommandMqttP2P_no_mqtt_params() -> None: class TestCommandNoParams(CommandMqttP2P): - pass + NAME = "TestCommand" + DATA_TYPE = DataType.JSON with pytest.raises(DeebotError, match=r"_mqtt_params not set"): TestCommandNoParams.create_from_mqtt({}) +def test_Command_no_NAME() -> None: + with pytest.raises( + ValueError, match="Class TestCommand must have a NAME attribute" + ): + + class TestCommand(Command): + pass + + +def test_Command_no_DATA_TYPE() -> None: + with pytest.raises( + ValueError, match="Class TestCommand must have a DATA_TYPE attribute" + ): + + class TestCommand(Command): + NAME = "TestCommand" + + @pytest.mark.parametrize( ("data", "expected"), [ diff --git a/tests/test_mqtt_client.py b/tests/test_mqtt_client.py index f0307715..e4391315 100644 --- a/tests/test_mqtt_client.py +++ b/tests/test_mqtt_client.py @@ -114,7 +114,7 @@ async def test_p2p_success( assert len(mqtt_client._received_p2p_commands) == 0 command_object = Mock(spec=SetVolume) - command_name = SetVolume.name + command_name = SetVolume.NAME command_type = Mock(spec=SetVolume) create_from_mqtt = command_type.create_from_mqtt create_from_mqtt.return_value = command_object @@ -160,7 +160,7 @@ async def test_p2p_not_supported( ) -> None: """Test that unsupported command will be logged.""" await subscribe(mqtt_client, api_device_info) - command_name: str = GetBattery.name + command_name: str = GetBattery.NAME await _publish_p2p( command_name, api_device_info, {}, "req", test_mqtt_client, is_request=True @@ -214,7 +214,7 @@ async def test_p2p_to_late( assert len(mqtt_client._received_p2p_commands) == 0 command_object = Mock(spec=SetVolume) - command_name = SetVolume.name + command_name = SetVolume.NAME command_type = Mock(spec=SetVolume) create_from_mqtt = command_type.create_from_mqtt create_from_mqtt.return_value = command_object @@ -267,7 +267,7 @@ async def test_p2p_parse_error( await subscribe(mqtt_client, api_device_info) command_object = Mock(spec=SetVolume) - command_name = SetVolume.name + command_name = SetVolume.NAME command_type = Mock(spec=SetVolume, return_value=command_object) with patch.dict( "deebot_client.mqtt_client.COMMANDS_WITH_MQTT_P2P_HANDLING", From e55705383c07d8d6c492ed9bb4e670a2d28224a0 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 17 Dec 2024 01:02:21 +0100 Subject: [PATCH 081/138] Add codecov test analytics (#695) --- .github/workflows/ci.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5e518d8d..a8ab88b2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,10 +62,17 @@ jobs: run: uv sync --locked --dev - name: Run pytest - run: uv run --frozen pytest tests --cov=./ --cov-report=xml + run: uv run --frozen pytest tests --cov=./ --cov-report=xml --junitxml=junit.xml -o junit_family=legacy - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true + + - name: Upload test results to Codecov + if: ${{ !cancelled() }} + uses: codecov/test-results-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true From 09cacfc5803b4c9b13b15f00aff1d571047121f2 Mon Sep 17 00:00:00 2001 From: flubshi Date: Tue, 17 Dec 2024 01:11:26 +0100 Subject: [PATCH 082/138] Add XML command "GetLifeSpan" (#575) * Add XML command "GetLifeSpan" * fix XML command "TypeError: 'classmethod' object is not callable" * Fix some type errors * Fix some type errors * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Review * fix --------- Co-authored-by: flubshi <4031504+flubshi@users.noreply.github.com> Co-authored-by: Robert Resch --- deebot_client/commands/xml/__init__.py | 3 ++ deebot_client/commands/xml/life_span.py | 49 ++++++++++++++++++++ deebot_client/events/__init__.py | 55 +++++++++++++++-------- tests/commands/xml/test_life_span.py | 59 +++++++++++++++++++++++++ 4 files changed, 148 insertions(+), 18 deletions(-) create mode 100644 deebot_client/commands/xml/life_span.py create mode 100644 tests/commands/xml/test_life_span.py diff --git a/deebot_client/commands/xml/__init__.py b/deebot_client/commands/xml/__init__.py index 4f42ad79..03be9996 100644 --- a/deebot_client/commands/xml/__init__.py +++ b/deebot_client/commands/xml/__init__.py @@ -9,6 +9,7 @@ from .charge_state import GetChargeState from .error import GetError from .fan_speed import GetFanSpeed +from .life_span import GetLifeSpan from .pos import GetPos from .stats import GetCleanSum @@ -20,6 +21,7 @@ "GetCleanSum", "GetError", "GetFanSpeed", + "GetLifeSpan", "GetPos", ] @@ -27,6 +29,7 @@ # ordered by file asc _COMMANDS: list[type[XmlCommand]] = [ GetError, + GetLifeSpan, ] # fmt: on diff --git a/deebot_client/commands/xml/life_span.py b/deebot_client/commands/xml/life_span.py new file mode 100644 index 00000000..52cf0bf7 --- /dev/null +++ b/deebot_client/commands/xml/life_span.py @@ -0,0 +1,49 @@ +"""Life span commands.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from deebot_client.events import LifeSpan, LifeSpanEvent +from deebot_client.message import HandlingResult + +from .common import XmlCommandWithMessageHandling + +if TYPE_CHECKING: + from xml.etree.ElementTree import Element + + from deebot_client.event_bus import EventBus + + +class GetLifeSpan(XmlCommandWithMessageHandling): + """GetLifeSpan command.""" + + NAME = "GetLifeSpan" + + def __init__(self, life_span: LifeSpan) -> None: + super().__init__({"type": life_span.xml_value}) + + @classmethod + def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult: + """Handle xml message and notify the correct event subscribers. + + :return: A message response + """ + if ( + xml.attrib.get("ret") != "ok" + or (component_type := xml.attrib.get("type")) is None + or (left_str := xml.attrib.get("left")) is None + or (total_str := xml.attrib.get("total")) is None + ): + return HandlingResult.analyse() + + percent = 0.0 + left = int(left_str) + total = int(total_str) + if total > 0: + percent = round((left / total) * 100, 2) + + event_bus.notify( + LifeSpanEvent(LifeSpan.from_xml(component_type), percent, left) + ) + return HandlingResult.success() diff --git a/deebot_client/events/__init__.py b/deebot_client/events/__init__.py index 12a03b95..b223b734 100644 --- a/deebot_client/events/__init__.py +++ b/deebot_client/events/__init__.py @@ -3,8 +3,8 @@ from __future__ import annotations from dataclasses import dataclass -from enum import Enum, IntEnum, unique -from typing import TYPE_CHECKING, Any +from enum import IntEnum, StrEnum, unique +from typing import TYPE_CHECKING, Any, Self from deebot_client.events.base import Event @@ -122,24 +122,43 @@ class ErrorEvent(Event): @unique -class LifeSpan(str, Enum): +class LifeSpan(StrEnum): """Enum class for all possible life span components.""" - BRUSH = "brush" - FILTER = "heap" - SIDE_BRUSH = "sideBrush" - UNIT_CARE = "unitCare" - ROUND_MOP = "roundMop" - AIR_FRESHENER = "dModule" - UV_SANITIZER = "uv" - HUMIDIFY = "humidify" - HUMIDIFY_MAINTENANCE = "wbCare" - BLADE = "blade" - LENS_BRUSH = "lensBrush" - DUST_BAG = "dustBag" - CLEANING_FLUID = "autoWater_cleaningFluid" - STRAINER = "strainer" - HAND_FILTER = "handFilter" + xml_value: str + + def __new__(cls, value: str, xml_value: str = "") -> Self: + obj = str.__new__(cls) + obj._value_ = value + obj.xml_value = xml_value + return obj + + @classmethod + def from_xml(cls, value: str) -> LifeSpan: + """Get LifeSpan from xml value.""" + for life_span in LifeSpan: + if life_span.xml_value == value: + return life_span + + msg = f"{value} is not a valid {cls.__name__}" + raise ValueError(msg) + + BRUSH = "brush", "Brush" + FILTER = "heap", "Heap" + SIDE_BRUSH = "sideBrush", "SideBrush" + UNIT_CARE = "unitCare", "UnitCare" + ROUND_MOP = "roundMop", "RoundMop" + AIR_FRESHENER = "dModule", "DModule" + UV_SANITIZER = "uv", "Uv" + HUMIDIFY = "humidify", "Humidify" + HUMIDIFY_MAINTENANCE = "wbCare", "WbCare" + BLADE = "blade", "Blade" + LENS_BRUSH = "lensBrush", "LensBrush" + DUST_BAG = "dustBag", "DustBag" + CLEANING_FLUID = "autoWater_cleaningFluid", "AutoWater_cleaningFluid" + STRAINER = "strainer", "Strainer" + HAND_FILTER = "handFilter", "HandFilter" + DUST_CASE_HEAP = "dustCaseHeap", "DustCaseHeap" @dataclass(frozen=True) diff --git a/tests/commands/xml/test_life_span.py b/tests/commands/xml/test_life_span.py new file mode 100644 index 00000000..fb039729 --- /dev/null +++ b/tests/commands/xml/test_life_span.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +import pytest + +from deebot_client.command import CommandResult +from deebot_client.commands.xml import GetLifeSpan +from deebot_client.events import LifeSpan, LifeSpanEvent +from deebot_client.message import HandlingState +from tests.commands import assert_command + +from . import get_request_xml + + +@pytest.mark.parametrize( + ("component_type", "lifespan_type", "left", "total", "expected_event"), + [ + ("Brush", LifeSpan.BRUSH, 50, 100, LifeSpanEvent(LifeSpan.BRUSH, 50, 50)), + ( + "DustCaseHeap", + LifeSpan.DUST_CASE_HEAP, + 50, + 200, + LifeSpanEvent(LifeSpan.DUST_CASE_HEAP, 25, 50), + ), + ( + "SideBrush", + LifeSpan.SIDE_BRUSH, + 25, + 200, + LifeSpanEvent(LifeSpan.SIDE_BRUSH, 12.5, 25), + ), + ], +) +async def test_get_life_span( + component_type: str, + lifespan_type: LifeSpan, + left: int, + total: int, + expected_event: LifeSpanEvent, +) -> None: + json = get_request_xml( + f"" + ) + await assert_command(GetLifeSpan(lifespan_type), json, expected_event) + + +@pytest.mark.parametrize( + "xml", + ["", ""], + ids=["error", "no_state"], +) +async def test_get_life_span_error(xml: str) -> None: + json = get_request_xml(xml) + await assert_command( + GetLifeSpan(LifeSpan.BRUSH), + json, + None, + command_result=CommandResult(HandlingState.ANALYSE_LOGGED), + ) From 6ce175c072eb61a010f1a5c04d7f618b031337b1 Mon Sep 17 00:00:00 2001 From: flammable-gel <73902579+flammable-gel@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:15:28 +0100 Subject: [PATCH 083/138] Add support for DEEBOT X1e OMNI (bro5wu) (#703) --- deebot_client/hardware/deebot/bro5wu.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/bro5wu.py diff --git a/deebot_client/hardware/deebot/bro5wu.py b/deebot_client/hardware/deebot/bro5wu.py new file mode 120000 index 00000000..391aa568 --- /dev/null +++ b/deebot_client/hardware/deebot/bro5wu.py @@ -0,0 +1 @@ +2o4lnm.py \ No newline at end of file From 7ebc150108911b2b1cfc04c8df6698b4a89af8c0 Mon Sep 17 00:00:00 2001 From: wenzet Date: Fri, 20 Dec 2024 10:15:56 +0100 Subject: [PATCH 084/138] Add DEEBOT N8 Pro Care (s1f8g7) (#689) * Add DEEBOT N8 Pro Care (s1f8g7) * Fix symlink --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/s1f8g7.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/s1f8g7.py diff --git a/deebot_client/hardware/deebot/s1f8g7.py b/deebot_client/hardware/deebot/s1f8g7.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/s1f8g7.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file From 479385e7ecef05c0ac5e4dc6c49eccabbf512f37 Mon Sep 17 00:00:00 2001 From: Khrusaor33 Date: Fri, 20 Dec 2024 10:16:17 +0100 Subject: [PATCH 085/138] DEEBOT X2 COMBO (#699) * DEEBOT X2 COMBO * Fix symbolic link --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/e6rcnf.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/e6rcnf.py diff --git a/deebot_client/hardware/deebot/e6rcnf.py b/deebot_client/hardware/deebot/e6rcnf.py new file mode 120000 index 00000000..e2baadee --- /dev/null +++ b/deebot_client/hardware/deebot/e6rcnf.py @@ -0,0 +1 @@ +e6ofmn.py \ No newline at end of file From 02385491b2822ef56b87f575904a97f7b259edf6 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 20 Dec 2024 09:19:08 +0000 Subject: [PATCH 086/138] Add e6yxdm by similarity to T20 --- deebot_client/hardware/deebot/e6yxdm.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/e6yxdm.py diff --git a/deebot_client/hardware/deebot/e6yxdm.py b/deebot_client/hardware/deebot/e6yxdm.py new file mode 120000 index 00000000..576a700d --- /dev/null +++ b/deebot_client/hardware/deebot/e6yxdm.py @@ -0,0 +1 @@ +4jd37g.py \ No newline at end of file From 95a1590d5241ee380334ee3b08340a3377ec53d1 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 20 Dec 2024 13:48:19 +0100 Subject: [PATCH 087/138] Fix LifeSpan enum (#705) --- deebot_client/events/__init__.py | 2 +- tests/events/test_events.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 tests/events/test_events.py diff --git a/deebot_client/events/__init__.py b/deebot_client/events/__init__.py index b223b734..7f710910 100644 --- a/deebot_client/events/__init__.py +++ b/deebot_client/events/__init__.py @@ -128,7 +128,7 @@ class LifeSpan(StrEnum): xml_value: str def __new__(cls, value: str, xml_value: str = "") -> Self: - obj = str.__new__(cls) + obj = str.__new__(cls, value) obj._value_ = value obj.xml_value = xml_value return obj diff --git a/tests/events/test_events.py b/tests/events/test_events.py new file mode 100644 index 00000000..6e7a43a3 --- /dev/null +++ b/tests/events/test_events.py @@ -0,0 +1,11 @@ +"""Test events.""" + +from __future__ import annotations + +from deebot_client.events import LifeSpan + + +def test_life_span() -> None: + """Test life span events.""" + assert LifeSpan.BRUSH != LifeSpan.FILTER + assert LifeSpan.FILTER not in {LifeSpan.BLADE, LifeSpan.BRUSH, LifeSpan.SIDE_BRUSH} From 3b03d2ce1e4dc9e0c0fe45445a3d17d28544db2b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 19:49:27 +0100 Subject: [PATCH 088/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20mypy=20to=20v1.14.0=20(#706)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8dbb99b4..1c69d1e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ version = "0.0.0" [tool.uv] dev-dependencies = [ - "mypy==1.13.0", + "mypy==1.14.0", "pre-commit==4.0.1", "pycountry==24.6.1", "pylint==3.3.2", diff --git a/uv.lock b/uv.lock index 30379fc1..35c12196 100644 --- a/uv.lock +++ b/uv.lock @@ -256,7 +256,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "mypy", specifier = "==1.13.0" }, + { name = "mypy", specifier = "==1.14.0" }, { name = "pre-commit", specifier = "==4.0.1" }, { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.2" }, @@ -446,25 +446,25 @@ wheels = [ [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/21/7e9e523537991d145ab8a0a2fd98548d67646dc2aaaf6091c31ad883e7c1/mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e", size = 3152532 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/31/c526a7bd2e5c710ae47717c7a5f53f616db6d9097caf48ad650581e81748/mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5", size = 11077900 }, - { url = "https://files.pythonhosted.org/packages/83/67/b7419c6b503679d10bd26fc67529bc6a1f7a5f220bbb9f292dc10d33352f/mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e", size = 10074818 }, - { url = "https://files.pythonhosted.org/packages/ba/07/37d67048786ae84e6612575e173d713c9a05d0ae495dde1e68d972207d98/mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2", size = 12589275 }, - { url = "https://files.pythonhosted.org/packages/1f/17/b1018c6bb3e9f1ce3956722b3bf91bff86c1cefccca71cec05eae49d6d41/mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0", size = 13037783 }, - { url = "https://files.pythonhosted.org/packages/cb/32/cd540755579e54a88099aee0287086d996f5a24281a673f78a0e14dba150/mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2", size = 9726197 }, - { url = "https://files.pythonhosted.org/packages/11/bb/ab4cfdc562cad80418f077d8be9b4491ee4fb257440da951b85cbb0a639e/mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7", size = 11069721 }, - { url = "https://files.pythonhosted.org/packages/59/3b/a393b1607cb749ea2c621def5ba8c58308ff05e30d9dbdc7c15028bca111/mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62", size = 10063996 }, - { url = "https://files.pythonhosted.org/packages/d1/1f/6b76be289a5a521bb1caedc1f08e76ff17ab59061007f201a8a18cc514d1/mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8", size = 12584043 }, - { url = "https://files.pythonhosted.org/packages/a6/83/5a85c9a5976c6f96e3a5a7591aa28b4a6ca3a07e9e5ba0cec090c8b596d6/mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7", size = 13036996 }, - { url = "https://files.pythonhosted.org/packages/b4/59/c39a6f752f1f893fccbcf1bdd2aca67c79c842402b5283563d006a67cf76/mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc", size = 9737709 }, - { url = "https://files.pythonhosted.org/packages/3b/86/72ce7f57431d87a7ff17d442f521146a6585019eb8f4f31b7c02801f78ad/mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a", size = 2647043 }, +sdist = { url = "https://files.pythonhosted.org/packages/8c/7b/08046ef9330735f536a09a2e31b00f42bccdb2795dcd979636ba43bb2d63/mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6", size = 3215684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/d8/0e72175ee0253217f5c44524f5e95251c02e95ba9749fb87b0e2074d203a/mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd", size = 11269011 }, + { url = "https://files.pythonhosted.org/packages/e9/6d/4ea13839dabe5db588dc6a1b766da16f420d33cf118a7b7172cdf6c7fcb2/mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1", size = 10253076 }, + { url = "https://files.pythonhosted.org/packages/3e/38/7db2c5d0f4d290e998f7a52b2e2616c7bbad96b8e04278ab09d11978a29e/mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63", size = 12862786 }, + { url = "https://files.pythonhosted.org/packages/bf/4b/62d59c801b34141040989949c2b5c157d0408b45357335d3ec5b2845b0f6/mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d", size = 12971568 }, + { url = "https://files.pythonhosted.org/packages/f1/9c/e0f281b32d70c87b9e4d2939e302b1ff77ada4d7b0f2fb32890c144bc1d6/mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba", size = 9879477 }, + { url = "https://files.pythonhosted.org/packages/13/33/8380efd0ebdfdfac7fc0bf065f03a049800ca1e6c296ec1afc634340d992/mypy-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9f6f4c0b27401d14c483c622bc5105eff3911634d576bbdf6695b9a7c1ba741", size = 11251509 }, + { url = "https://files.pythonhosted.org/packages/15/6d/4e1c21c60fee11af7d8e4f2902a29886d1387d6a836be16229eb3982a963/mypy-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b2280cedcb312c7a79f5001ae5325582d0d339bce684e4a529069d0e7ca1e7", size = 10244282 }, + { url = "https://files.pythonhosted.org/packages/8b/cf/7a8ae5c0161edae15d25c2c67c68ce8b150cbdc45aefc13a8be271ee80b2/mypy-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8", size = 12867676 }, + { url = "https://files.pythonhosted.org/packages/9c/d0/71f7bbdcc7cfd0f2892db5b13b1e8857673f2cc9e0c30e3e4340523dc186/mypy-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc", size = 12964189 }, + { url = "https://files.pythonhosted.org/packages/a7/40/fb4ad65d6d5f8c51396ecf6305ec0269b66013a5bf02d0e9528053640b4a/mypy-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f", size = 9888247 }, + { url = "https://files.pythonhosted.org/packages/39/32/0214608af400cdf8f5102144bb8af10d880675c65ed0b58f7e0e77175d50/mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab", size = 2752803 }, ] [[package]] From 3ed2a376eb89cc55a209a257e5c1a69da209e863 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 19:49:45 +0100 Subject: [PATCH 089/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20astral-sh?= =?UTF-8?q?/setup-uv=20action=20to=20v5=20(#704)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 4 ++-- .github/workflows/python-publish.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a8ab88b2..0af8e8ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@v4 - name: 🏗 Install uv and Python - uses: astral-sh/setup-uv@v4 + uses: astral-sh/setup-uv@v5 with: enable-cache: true cache-dependency-glob: "uv.lock" @@ -51,7 +51,7 @@ jobs: uses: actions/checkout@v4 - name: 🏗 Install uv and Python ${{ matrix.python-version }} - uses: astral-sh/setup-uv@v4 + uses: astral-sh/setup-uv@v5 with: enable-cache: true cache-dependency-glob: "uv.lock" diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index ec494757..612f2748 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -26,7 +26,7 @@ jobs: - name: ⤵️ Check out code from GitHub uses: actions/checkout@v4.2.2 - name: 🏗 Set up uv - uses: astral-sh/setup-uv@v4 + uses: astral-sh/setup-uv@v5 with: enable-cache: true - name: 🏗 Set package version From dc5583294fa5269a504062e98ed5cb41a3f40290 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 20 Dec 2024 20:00:42 +0100 Subject: [PATCH 090/138] Add auto empty message and commands (#603) --- deebot_client/capabilities.py | 55 ++++-- deebot_client/commands/json/__init__.py | 4 + deebot_client/commands/json/auto_empty.py | 36 ++++ deebot_client/commands/json/common.py | 2 +- deebot_client/commands/json/ota.py | 2 +- deebot_client/events/__init__.py | 4 + deebot_client/events/auto_empty.py | 29 +++ deebot_client/hardware/deebot/p95mgv.py | 16 ++ deebot_client/hardware/deebot/qhe2o2.py | 206 +++++++++++++++++++++- deebot_client/messages/json/__init__.py | 4 + deebot_client/messages/json/auto_empty.py | 31 ++++ pyproject.toml | 3 +- tests/commands/json/test_auto_empty.py | 121 +++++++++++++ tests/hardware/test_init.py | 3 + tests/messages/json/test_auto_empty.py | 40 +++++ 15 files changed, 537 insertions(+), 19 deletions(-) create mode 100644 deebot_client/commands/json/auto_empty.py create mode 100644 deebot_client/events/auto_empty.py mode change 120000 => 100644 deebot_client/hardware/deebot/qhe2o2.py create mode 100644 deebot_client/messages/json/auto_empty.py create mode 100644 tests/commands/json/test_auto_empty.py create mode 100644 tests/messages/json/test_auto_empty.py diff --git a/deebot_client/capabilities.py b/deebot_client/capabilities.py index 40bfa2ec..3c743817 100644 --- a/deebot_client/capabilities.py +++ b/deebot_client/capabilities.py @@ -6,7 +6,7 @@ from dataclasses import dataclass, field, fields, is_dataclass from enum import StrEnum from types import MappingProxyType -from typing import TYPE_CHECKING, Any, Generic, TypeVar +from typing import TYPE_CHECKING, Any, Generic, ParamSpec, TypeVar from deebot_client.events import ( AdvancedModeEvent, @@ -51,6 +51,7 @@ WaterInfoEvent, WorkMode, WorkModeEvent, + auto_empty, ) if TYPE_CHECKING: @@ -58,13 +59,15 @@ from _typeshed import DataclassInstance - from deebot_client.command import Command, SetCommand + from deebot_client.command import Command + from deebot_client.commands.json.common import ExecuteCommand from deebot_client.events.efficiency_mode import EfficiencyMode, EfficiencyModeEvent from deebot_client.models import CleanAction, CleanMode _T = TypeVar("_T") _EVENT = TypeVar("_EVENT", bound=Event) +_P = ParamSpec("_P") def _get_events( @@ -92,14 +95,14 @@ class CapabilityEvent(Generic[_EVENT]): @dataclass(frozen=True) -class CapabilitySet(CapabilityEvent[_EVENT], Generic[_EVENT, _T]): +class CapabilitySet(CapabilityEvent[_EVENT], Generic[_EVENT, _P]): """Capability setCommand with event.""" - set: Callable[[_T], SetCommand] + set: Callable[_P, ExecuteCommand] @dataclass(frozen=True) -class CapabilitySetEnable(CapabilitySet[_EVENT, bool]): +class CapabilitySetEnable(CapabilitySet[_EVENT, [bool]]): """Capability for SetEnableCommand with event.""" @@ -118,7 +121,7 @@ class CapabilityTypes(Generic[_T]): @dataclass(frozen=True, kw_only=True) -class CapabilitySetTypes(CapabilitySet[_EVENT, _T | str], CapabilityTypes[_T]): +class CapabilitySetTypes(CapabilitySet[_EVENT, _P], CapabilityTypes[_T]): """Capability for set command and types.""" @@ -136,10 +139,12 @@ class CapabilityClean: action: CapabilityCleanAction continuous: CapabilitySetEnable[ContinuousCleaningEvent] | None = None - count: CapabilitySet[CleanCountEvent, int] | None = None + count: CapabilitySet[CleanCountEvent, [int]] | None = None log: CapabilityEvent[CleanLogEvent] | None = None preference: CapabilitySetEnable[CleanPreferenceEvent] | None = None - work_mode: CapabilitySetTypes[WorkModeEvent, WorkMode] | None = None + work_mode: CapabilitySetTypes[WorkModeEvent, [WorkMode | str], WorkMode] | None = ( + None + ) @dataclass(frozen=True) @@ -186,12 +191,13 @@ class CapabilitySettings: advanced_mode: CapabilitySetEnable[AdvancedModeEvent] | None = None carpet_auto_fan_boost: CapabilitySetEnable[CarpetAutoFanBoostEvent] | None = None - efficiency_mode: CapabilitySetTypes[EfficiencyModeEvent, EfficiencyMode] | None = ( - None - ) + efficiency_mode: ( + CapabilitySetTypes[EfficiencyModeEvent, [EfficiencyMode | str], EfficiencyMode] + | None + ) = None border_switch: CapabilitySetEnable[BorderSwitchEvent] | None = None child_lock: CapabilitySetEnable[ChildLockEvent] | None = None - cut_direction: CapabilitySet[CutDirectionEvent, int] | None = None + cut_direction: CapabilitySet[CutDirectionEvent, [int]] | None = None moveup_warning: CapabilitySetEnable[MoveUpWarningEvent] | None = None cross_map_border_warning: CapabilitySetEnable[CrossMapBorderWarningEvent] | None = ( None @@ -201,7 +207,21 @@ class CapabilitySettings: sweep_mode: CapabilitySetEnable[SweepModeEvent] | None = None true_detect: CapabilitySetEnable[TrueDetectEvent] | None = None voice_assistant: CapabilitySetEnable[VoiceAssistantStateEvent] | None = None - volume: CapabilitySet[VolumeEvent, int] + volume: CapabilitySet[VolumeEvent, [int]] + + +@dataclass(frozen=True, kw_only=True) +class CapabilityStation: + """Capabilities for station.""" + + auto_empty: ( + CapabilitySetTypes[ + auto_empty.AutoEmptyEvent, + [bool | None, auto_empty.Frequency | str | None], + auto_empty.Frequency, + ] + | None + ) = None @dataclass(frozen=True, kw_only=True) @@ -216,15 +236,20 @@ class Capabilities(ABC): clean: CapabilityClean custom: CapabilityCustomCommand[CustomCommandEvent] error: CapabilityEvent[ErrorEvent] - fan_speed: CapabilitySetTypes[FanSpeedEvent, FanSpeedLevel] | None = None + fan_speed: ( + CapabilitySetTypes[FanSpeedEvent, [FanSpeedLevel | str], FanSpeedLevel] | None + ) = None life_span: CapabilityLifeSpan map: CapabilityMap | None = None network: CapabilityEvent[NetworkInfoEvent] play_sound: CapabilityExecute settings: CapabilitySettings state: CapabilityEvent[StateEvent] + station: CapabilityStation = field(default_factory=CapabilityStation) stats: CapabilityStats - water: CapabilitySetTypes[WaterInfoEvent, WaterAmount] | None = None + water: ( + CapabilitySetTypes[WaterInfoEvent, [WaterAmount | str], WaterAmount] | None + ) = None _events: MappingProxyType[type[Event], list[Command]] = field(init=False) diff --git a/deebot_client/commands/json/__init__.py b/deebot_client/commands/json/__init__.py index 21584825..9b4c3dfe 100644 --- a/deebot_client/commands/json/__init__.py +++ b/deebot_client/commands/json/__init__.py @@ -6,6 +6,7 @@ from deebot_client.command import Command, CommandMqttP2P +from . import auto_empty from .advanced_mode import GetAdvancedMode, SetAdvancedMode from .battery import GetBattery from .border_switch import GetBorderSwitch, SetBorderSwitch @@ -130,6 +131,9 @@ GetAdvancedMode, SetAdvancedMode, + auto_empty.GetAutoEmpty, + auto_empty.SetAutoEmpty, + GetBorderSwitch, SetBorderSwitch, diff --git a/deebot_client/commands/json/auto_empty.py b/deebot_client/commands/json/auto_empty.py new file mode 100644 index 00000000..39ade08c --- /dev/null +++ b/deebot_client/commands/json/auto_empty.py @@ -0,0 +1,36 @@ +"""Auto empty commands.""" + +from __future__ import annotations + +from typing import Any + +from deebot_client.events.auto_empty import Frequency +from deebot_client.messages.json.auto_empty import OnAutoEmpty +from deebot_client.util import get_enum + +from .common import ExecuteCommand, JsonGetCommand + + +class GetAutoEmpty(OnAutoEmpty, JsonGetCommand): + """Get auto empty command.""" + + NAME = "getAutoEmpty" + + +class SetAutoEmpty(ExecuteCommand): + """Set auto empty command.""" + + NAME = "setAutoEmpty" + + def __init__( + self, enable: bool | None = None, frequency: Frequency | str | None = None + ) -> None: + if frequency is not None and not isinstance(frequency, Frequency): + frequency = get_enum(Frequency, frequency) + + params: dict[str, Any] = {} + if enable is not None: + params["enable"] = int(enable) + if frequency: + params["frequency"] = frequency.value + super().__init__(params) diff --git a/deebot_client/commands/json/common.py b/deebot_client/commands/json/common.py index d7d80811..dce7ed01 100644 --- a/deebot_client/commands/json/common.py +++ b/deebot_client/commands/json/common.py @@ -132,5 +132,5 @@ def __init_subclass__(cls, **kwargs: Any) -> None: cls._mqtt_params = MappingProxyType({cls._field_name: InitParam(bool, _ENABLE)}) super().__init_subclass__(**kwargs) - def __init__(self, enable: bool) -> None: # noqa: FBT001 + def __init__(self, enable: bool) -> None: super().__init__({self._field_name: 1 if enable else 0}) diff --git a/deebot_client/commands/json/ota.py b/deebot_client/commands/json/ota.py index 7db059c1..eddf57e3 100644 --- a/deebot_client/commands/json/ota.py +++ b/deebot_client/commands/json/ota.py @@ -55,5 +55,5 @@ class SetOta(JsonSetCommand): _mqtt_params = MappingProxyType({"autoSwitch": InitParam(bool, "auto_enabled")}) - def __init__(self, auto_enabled: bool) -> None: # noqa: FBT001 + def __init__(self, auto_enabled: bool) -> None: super().__init__({"autoSwitch": 1 if auto_enabled else 0}) diff --git a/deebot_client/events/__init__.py b/deebot_client/events/__init__.py index 7f710910..1708e6d3 100644 --- a/deebot_client/events/__init__.py +++ b/deebot_client/events/__init__.py @@ -8,6 +8,8 @@ from deebot_client.events.base import Event +from . import auto_empty +from .auto_empty import AutoEmptyEvent from .efficiency_mode import EfficiencyMode, EfficiencyModeEvent from .fan_speed import FanSpeedEvent, FanSpeedLevel from .map import ( @@ -31,6 +33,7 @@ from deebot_client.models import Room, State __all__ = [ + "AutoEmptyEvent", "BatteryEvent", "CachedMapInfoEvent", "CleanJobStatus", @@ -57,6 +60,7 @@ "WaterInfoEvent", "WorkMode", "WorkModeEvent", + "auto_empty", ] diff --git a/deebot_client/events/auto_empty.py b/deebot_client/events/auto_empty.py new file mode 100644 index 00000000..b9936c30 --- /dev/null +++ b/deebot_client/events/auto_empty.py @@ -0,0 +1,29 @@ +"""Auto empty event module.""" + +from __future__ import annotations + +from dataclasses import dataclass +from enum import StrEnum, unique + +from .base import Event as _Event + +__all__ = ["AutoEmptyEvent", "Frequency"] + + +@unique +class Frequency(StrEnum): + """Enum class for all possible frequencies.""" + + MIN_10 = "10" + MIN_15 = "15" + MIN_25 = "25" + AUTO = "auto" + SMART = "smart" + + +@dataclass(frozen=True) +class AutoEmptyEvent(_Event): + """Auto empty event representation.""" + + enabled: bool + frequency: Frequency | None = None diff --git a/deebot_client/hardware/deebot/p95mgv.py b/deebot_client/hardware/deebot/p95mgv.py index b6103f9f..97155f00 100644 --- a/deebot_client/hardware/deebot/p95mgv.py +++ b/deebot_client/hardware/deebot/p95mgv.py @@ -15,10 +15,12 @@ CapabilitySetEnable, CapabilitySettings, CapabilitySetTypes, + CapabilityStation, CapabilityStats, DeviceType, ) from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty from deebot_client.commands.json.battery import GetBattery from deebot_client.commands.json.carpet import ( GetCarpetAutoFanBoost, @@ -97,6 +99,7 @@ VolumeEvent, WaterAmount, WaterInfoEvent, + auto_empty, ) from deebot_client.events.efficiency_mode import EfficiencyMode from deebot_client.models import StaticDeviceInfo @@ -206,6 +209,19 @@ volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), ), state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + station=CapabilityStation( + auto_empty=CapabilitySetTypes( + event=auto_empty.AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.MIN_10, + auto_empty.Frequency.MIN_15, + auto_empty.Frequency.MIN_25, + auto_empty.Frequency.AUTO, + ), + ), + ), stats=CapabilityStats( clean=CapabilityEvent(StatsEvent, [GetStats()]), report=CapabilityEvent(ReportStatsEvent, []), diff --git a/deebot_client/hardware/deebot/qhe2o2.py b/deebot_client/hardware/deebot/qhe2o2.py deleted file mode 120000 index ee958842..00000000 --- a/deebot_client/hardware/deebot/qhe2o2.py +++ /dev/null @@ -1 +0,0 @@ -kr0277.py \ No newline at end of file diff --git a/deebot_client/hardware/deebot/qhe2o2.py b/deebot_client/hardware/deebot/qhe2o2.py new file mode 100644 index 00000000..13c720a5 --- /dev/null +++ b/deebot_client/hardware/deebot/qhe2o2.py @@ -0,0 +1,205 @@ +"""Deebot N20 Pro Plus Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStation, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.child_lock import GetChildLock, SetChildLock +from deebot_client.commands.json.clean import CleanAreaV2, CleanV2, GetCleanInfoV2 +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.const import DataType +from deebot_client.events import ( + AutoEmptyEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + ChildLockEvent, + CleanCountEvent, + CleanLogEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, + auto_empty, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=CleanV2, area=CleanAreaV2), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + LifeSpan.ROUND_MOP, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + LifeSpan.ROUND_MOP, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent( + CachedMapInfoEvent, [GetCachedMapInfo(version=2)] + ), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo(version=2)]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + child_lock=CapabilitySetEnable( + ChildLockEvent, [GetChildLock()], SetChildLock + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfoV2()]), + station=CapabilityStation( + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.MIN_10, + auto_empty.Frequency.MIN_15, + auto_empty.Frequency.MIN_25, + auto_empty.Frequency.AUTO, + ), + ), + ), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + ), + ), + ), +) diff --git a/deebot_client/messages/json/__init__.py b/deebot_client/messages/json/__init__.py index c346e9ba..8508e507 100644 --- a/deebot_client/messages/json/__init__.py +++ b/deebot_client/messages/json/__init__.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING +from .auto_empty import OnAutoEmpty from .battery import OnBattery from .map import OnMapSetV2 from .stats import ReportStats @@ -20,7 +21,10 @@ # fmt: off # ordered by file asc _MESSAGES: list[type[Message]] = [ + OnAutoEmpty, + OnBattery, + OnMapSetV2, ReportStats diff --git a/deebot_client/messages/json/auto_empty.py b/deebot_client/messages/json/auto_empty.py new file mode 100644 index 00000000..282f589e --- /dev/null +++ b/deebot_client/messages/json/auto_empty.py @@ -0,0 +1,31 @@ +"""Auto empty messages.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +from deebot_client.events.auto_empty import AutoEmptyEvent, Frequency +from deebot_client.message import HandlingResult, MessageBodyDataDict + +if TYPE_CHECKING: + from deebot_client.event_bus import EventBus + + +class OnAutoEmpty(MessageBodyDataDict): + """On auto empty message.""" + + NAME = "onAutoEmpty" + + @classmethod + def _handle_body_data_dict( + cls, event_bus: EventBus, data: dict[str, Any] + ) -> HandlingResult: + """Handle message->body->data and notify the correct event subscribers. + + :return: A message response + """ + frequency: Frequency | None = None + if frequency_str := data.get("frequency"): + frequency = Frequency(frequency_str) + event_bus.notify(AutoEmptyEvent(bool(data["enable"]), frequency)) + return HandlingResult.success() diff --git a/pyproject.toml b/pyproject.toml index 1c69d1e0..441672fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,8 +74,9 @@ ignore = [ "D107", # Missing docstring in `__init__` "E501", # line too long - "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable + "FBT", # flake8-boolean-trap + "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable # Conflicts with the Ruff formatter "COM812", diff --git a/tests/commands/json/test_auto_empty.py b/tests/commands/json/test_auto_empty.py new file mode 100644 index 00000000..cae4f0c7 --- /dev/null +++ b/tests/commands/json/test_auto_empty.py @@ -0,0 +1,121 @@ +"""Auto empty tests.""" + +from __future__ import annotations + +from typing import Any + +import pytest + +from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty +from deebot_client.events.auto_empty import AutoEmptyEvent, Frequency +from tests.helpers import ( + get_request_json, + get_success_body, +) + +from . import assert_command, assert_execute_command + + +@pytest.mark.parametrize( + ("json", "expected"), + [ + ( + {"enable": 1, "frequency": "10"}, + AutoEmptyEvent(True, Frequency.MIN_10), + ), + ( + {"enable": 1, "frequency": "15"}, + AutoEmptyEvent(True, Frequency.MIN_15), + ), + ( + {"enable": 1, "frequency": "25"}, + AutoEmptyEvent(True, Frequency.MIN_25), + ), + ( + {"enable": 0, "frequency": "auto"}, + AutoEmptyEvent(False, Frequency.AUTO), + ), + ( + {"enable": 1, "frequency": "auto"}, + AutoEmptyEvent(True, Frequency.AUTO), + ), + ( + {"enable": 1, "frequency": "smart"}, + AutoEmptyEvent(True, Frequency.SMART), + ), + ], +) +async def test_GetAutoEmpty(json: dict[str, Any], expected: AutoEmptyEvent) -> None: + """Test GetAutoEmpty.""" + json = get_request_json(get_success_body(json)) + await assert_command(GetAutoEmpty(), json, expected) + + +@pytest.mark.parametrize( + ("enabled", "frequency", "args"), + [ + ( + True, + "min_10", + {"enable": 1, "frequency": "10"}, + ), + ( + True, + Frequency.MIN_10, + {"enable": 1, "frequency": "10"}, + ), + ( + True, + "smart", + {"enable": 1, "frequency": "smart"}, + ), + ( + False, + "min_10", + {"enable": 0, "frequency": "10"}, + ), + ( + False, + Frequency.MIN_10, + {"enable": 0, "frequency": "10"}, + ), + ( + False, + "smart", + {"enable": 0, "frequency": "smart"}, + ), + ( + None, + "min_10", + {"frequency": "10"}, + ), + ( + None, + Frequency.MIN_10, + {"frequency": "10"}, + ), + ( + None, + "smart", + {"frequency": "smart"}, + ), + ( + True, + None, + {"enable": 1}, + ), + ( + False, + None, + {"enable": 0}, + ), + ], +) +async def test_SetAutoEmpty( + enabled: bool, + frequency: str | Frequency | None, + args: dict[str, Any], +) -> None: + """Test SetAutoEmpty.""" + command = SetAutoEmpty(enabled, frequency) + await assert_execute_command(command, args) diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index f0a87236..94282e9d 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -10,6 +10,7 @@ from deebot_client.commands.json import GetCutDirection from deebot_client.commands.json.advanced_mode import GetAdvancedMode +from deebot_client.commands.json.auto_empty import GetAutoEmpty from deebot_client.commands.json.battery import GetBattery from deebot_client.commands.json.border_switch import GetBorderSwitch from deebot_client.commands.json.carpet import GetCarpetAutoFanBoost @@ -41,6 +42,7 @@ from deebot_client.commands.json.water_info import GetWaterInfo from deebot_client.events import ( AdvancedModeEvent, + AutoEmptyEvent, AvailabilityEvent, BatteryEvent, BorderSwitchEvent, @@ -191,6 +193,7 @@ async def test_get_static_device_info( ( "p95mgv", { + AutoEmptyEvent: [GetAutoEmpty()], AdvancedModeEvent: [GetAdvancedMode()], AvailabilityEvent: [GetBattery(is_available_check=True)], BatteryEvent: [GetBattery()], diff --git a/tests/messages/json/test_auto_empty.py b/tests/messages/json/test_auto_empty.py new file mode 100644 index 00000000..f114740f --- /dev/null +++ b/tests/messages/json/test_auto_empty.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +from typing import Any + +import pytest + +from deebot_client.events import auto_empty +from deebot_client.messages.json.auto_empty import OnAutoEmpty +from tests.messages import assert_message + + +@pytest.mark.parametrize( + ("frequency", "expected_freq"), + [ + (None, None), + ("10", auto_empty.Frequency.MIN_10), + ("auto", auto_empty.Frequency.AUTO), + ("smart", auto_empty.Frequency.SMART), + ], +) +@pytest.mark.parametrize("enable", [True, False]) +def test_onAutoEmpty( + frequency: str | None, expected_freq: auto_empty.Frequency | None, enable: bool +) -> None: + data: dict[str, Any] = { + "header": { + "pri": 1, + "tzm": 60, + "ts": "1734719921057", + "ver": "0.0.1", + "fwVer": "1.30.0", + "hwVer": "0.1.1", + "wkVer": "0.1.54", + }, + "body": {"data": {"status": 0, "enable": int(enable)}}, + } + if frequency is not None: + data["body"]["data"]["frequency"] = frequency + + assert_message(OnAutoEmpty, data, auto_empty.AutoEmptyEvent(enable, expected_freq)) From 4022545b1957f81d564104bf0efb1651ff3f1351 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 20 Dec 2024 20:08:23 +0100 Subject: [PATCH 091/138] Fix N20 Pro auto empty (#708) --- deebot_client/hardware/deebot/qhe2o2.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/deebot_client/hardware/deebot/qhe2o2.py b/deebot_client/hardware/deebot/qhe2o2.py index 13c720a5..42cc73b6 100644 --- a/deebot_client/hardware/deebot/qhe2o2.py +++ b/deebot_client/hardware/deebot/qhe2o2.py @@ -179,10 +179,8 @@ get=[GetAutoEmpty()], set=SetAutoEmpty, types=( - auto_empty.Frequency.MIN_10, - auto_empty.Frequency.MIN_15, - auto_empty.Frequency.MIN_25, auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, ), ), ), From 260db3f36ecae60dda8aca0ade25d39daecd0519 Mon Sep 17 00:00:00 2001 From: MarkGodwin <10632972+MarkGodwin@users.noreply.github.com> Date: Fri, 20 Dec 2024 21:23:28 +0000 Subject: [PATCH 092/138] Add base station functions (#645) Co-authored-by: Robert Resch --- deebot_client/capabilities.py | 25 +++++------ deebot_client/commands/__init__.py | 8 ++++ deebot_client/commands/json/__init__.py | 6 ++- deebot_client/commands/json/station_action.py | 23 ++++++++++ deebot_client/commands/json/station_state.py | 13 ++++++ deebot_client/events/__init__.py | 6 ++- deebot_client/events/base_station.py | 25 +++++++++++ deebot_client/hardware/deebot/buom7k.py | 20 +++++++++ deebot_client/hardware/deebot/p95mgv.py | 33 ++++++++------ deebot_client/hardware/deebot/qhe2o2.py | 29 +++++++------ deebot_client/messages/json/__init__.py | 5 ++- deebot_client/messages/json/station_state.py | 43 +++++++++++++++++++ tests/commands/json/test_station_action.py | 30 +++++++++++++ tests/commands/json/test_station_state.py | 34 +++++++++++++++ tests/hardware/test_init.py | 3 ++ tests/messages/json/test_station_state.py | 41 ++++++++++++++++++ 16 files changed, 303 insertions(+), 41 deletions(-) create mode 100644 deebot_client/commands/json/station_action.py create mode 100644 deebot_client/commands/json/station_state.py create mode 100644 deebot_client/events/base_station.py create mode 100644 deebot_client/messages/json/station_state.py create mode 100644 tests/commands/json/test_station_action.py create mode 100644 tests/commands/json/test_station_state.py create mode 100644 tests/messages/json/test_station_state.py diff --git a/deebot_client/capabilities.py b/deebot_client/capabilities.py index 3c743817..84bd3652 100644 --- a/deebot_client/capabilities.py +++ b/deebot_client/capabilities.py @@ -11,6 +11,7 @@ from deebot_client.events import ( AdvancedModeEvent, AvailabilityEvent, + BaseStationEvent, BatteryEvent, BorderSwitchEvent, CachedMapInfoEvent, @@ -60,6 +61,7 @@ from _typeshed import DataclassInstance from deebot_client.command import Command + from deebot_client.commands import BaseStationAction from deebot_client.commands.json.common import ExecuteCommand from deebot_client.events.efficiency_mode import EfficiencyMode, EfficiencyModeEvent from deebot_client.models import CleanAction, CleanMode @@ -211,17 +213,16 @@ class CapabilitySettings: @dataclass(frozen=True, kw_only=True) -class CapabilityStation: - """Capabilities for station.""" - - auto_empty: ( - CapabilitySetTypes[ - auto_empty.AutoEmptyEvent, - [bool | None, auto_empty.Frequency | str | None], - auto_empty.Frequency, - ] - | None - ) = None +class CapabilityBaseStation: + """Capabilities for the base station.""" + + action: Callable[[BaseStationAction], Command] + auto_empty: CapabilitySetTypes[ + auto_empty.AutoEmptyEvent, + [bool | None, auto_empty.Frequency | str | None], + auto_empty.Frequency, + ] + status: CapabilityEvent[BaseStationEvent] @dataclass(frozen=True, kw_only=True) @@ -231,6 +232,7 @@ class Capabilities(ABC): device_type: DeviceType = field(kw_only=False) availability: CapabilityEvent[AvailabilityEvent] + base_station: CapabilityBaseStation | None = None battery: CapabilityEvent[BatteryEvent] charge: CapabilityExecute clean: CapabilityClean @@ -245,7 +247,6 @@ class Capabilities(ABC): play_sound: CapabilityExecute settings: CapabilitySettings state: CapabilityEvent[StateEvent] - station: CapabilityStation = field(default_factory=CapabilityStation) stats: CapabilityStats water: ( CapabilitySetTypes[WaterInfoEvent, [WaterAmount | str], WaterAmount] | None diff --git a/deebot_client/commands/__init__.py b/deebot_client/commands/__init__.py index 8c8d7df4..90fd37db 100644 --- a/deebot_client/commands/__init__.py +++ b/deebot_client/commands/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations +from enum import IntEnum, unique from typing import TYPE_CHECKING from deebot_client.const import DataType @@ -19,3 +20,10 @@ COMMANDS_WITH_MQTT_P2P_HANDLING: dict[DataType, dict[str, type[CommandMqttP2P]]] = { DataType.JSON: JSON_COMMANDS_WITH_MQTT_P2P_HANDLING } + + +@unique +class BaseStationAction(IntEnum): + """Enum class for all possible base station actions.""" + + EMPTY_DUSTBIN = 1 diff --git a/deebot_client/commands/json/__init__.py b/deebot_client/commands/json/__init__.py index 9b4c3dfe..e9ae08db 100644 --- a/deebot_client/commands/json/__init__.py +++ b/deebot_client/commands/json/__init__.py @@ -6,7 +6,7 @@ from deebot_client.command import Command, CommandMqttP2P -from . import auto_empty +from . import auto_empty, station_action, station_state from .advanced_mode import GetAdvancedMode, SetAdvancedMode from .battery import GetBattery from .border_switch import GetBorderSwitch, SetBorderSwitch @@ -211,6 +211,10 @@ GetSafeProtect, SetSafeProtect, + station_action.StationAction, + + station_state.GetStationState, + GetSweepMode, SetSweepMode, diff --git a/deebot_client/commands/json/station_action.py b/deebot_client/commands/json/station_action.py new file mode 100644 index 00000000..16330e24 --- /dev/null +++ b/deebot_client/commands/json/station_action.py @@ -0,0 +1,23 @@ +"""Charge commands.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from deebot_client.logging_filter import get_logger + +from .common import ExecuteCommand + +if TYPE_CHECKING: + from deebot_client.commands import BaseStationAction + +_LOGGER = get_logger(__name__) + + +class StationAction(ExecuteCommand): + """Station Action command.""" + + NAME = "stationAction" + + def __init__(self, action: BaseStationAction) -> None: + super().__init__({"act": 1, "type": action.value}) diff --git a/deebot_client/commands/json/station_state.py b/deebot_client/commands/json/station_state.py new file mode 100644 index 00000000..88c5047f --- /dev/null +++ b/deebot_client/commands/json/station_state.py @@ -0,0 +1,13 @@ +"""Battery commands.""" + +from __future__ import annotations + +from deebot_client.messages.json.station_state import OnStationState + +from .common import JsonCommandWithMessageHandling + + +class GetStationState(OnStationState, JsonCommandWithMessageHandling): + """Get station state command.""" + + NAME = "getStationState" diff --git a/deebot_client/events/__init__.py b/deebot_client/events/__init__.py index 1708e6d3..32d478b7 100644 --- a/deebot_client/events/__init__.py +++ b/deebot_client/events/__init__.py @@ -8,8 +8,9 @@ from deebot_client.events.base import Event -from . import auto_empty +from . import auto_empty, base_station from .auto_empty import AutoEmptyEvent +from .base_station import BaseStationEvent from .efficiency_mode import EfficiencyMode, EfficiencyModeEvent from .fan_speed import FanSpeedEvent, FanSpeedLevel from .map import ( @@ -34,6 +35,7 @@ __all__ = [ "AutoEmptyEvent", + "BaseStationEvent", "BatteryEvent", "CachedMapInfoEvent", "CleanJobStatus", @@ -61,6 +63,7 @@ "WorkMode", "WorkModeEvent", "auto_empty", + "base_station", ] @@ -163,6 +166,7 @@ def from_xml(cls, value: str) -> LifeSpan: STRAINER = "strainer", "Strainer" HAND_FILTER = "handFilter", "HandFilter" DUST_CASE_HEAP = "dustCaseHeap", "DustCaseHeap" + BASE_STATION_FILTER = "spHeap", "SpHeap" @dataclass(frozen=True) diff --git a/deebot_client/events/base_station.py b/deebot_client/events/base_station.py new file mode 100644 index 00000000..39e609e1 --- /dev/null +++ b/deebot_client/events/base_station.py @@ -0,0 +1,25 @@ +"""Base station event module.""" + +from __future__ import annotations + +from dataclasses import dataclass +from enum import IntEnum, unique + +from .base import Event as _Event + +__all__ = ["BaseStationEvent", "Status"] + + +@unique +class Status(IntEnum): + """Enum class for all possible base station statuses.""" + + IDLE = 0 + EMPTYING = 1 + + +@dataclass(frozen=True) +class BaseStationEvent(_Event): + """Base Station Event representation.""" + + state: Status diff --git a/deebot_client/hardware/deebot/buom7k.py b/deebot_client/hardware/deebot/buom7k.py index 4e91d2c5..4ad44625 100644 --- a/deebot_client/hardware/deebot/buom7k.py +++ b/deebot_client/hardware/deebot/buom7k.py @@ -4,6 +4,7 @@ from deebot_client.capabilities import ( Capabilities, + CapabilityBaseStation, CapabilityClean, CapabilityCleanAction, CapabilityCustomCommand, @@ -18,6 +19,7 @@ CapabilityStats, DeviceType, ) +from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty from deebot_client.commands.json.battery import GetBattery from deebot_client.commands.json.carpet import ( GetCarpetAutoFanBoost, @@ -46,12 +48,15 @@ from deebot_client.commands.json.play_sound import PlaySound from deebot_client.commands.json.pos import GetPos from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.station_action import StationAction +from deebot_client.commands.json.station_state import GetStationState from deebot_client.commands.json.stats import GetStats, GetTotalStats from deebot_client.commands.json.volume import GetVolume, SetVolume from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo from deebot_client.const import DataType from deebot_client.events import ( AvailabilityEvent, + BaseStationEvent, BatteryEvent, CachedMapInfoEvent, CarpetAutoFanBoostEvent, @@ -79,7 +84,9 @@ VolumeEvent, WaterAmount, WaterInfoEvent, + auto_empty, ) +from deebot_client.events.auto_empty import AutoEmptyEvent from deebot_client.models import StaticDeviceInfo from deebot_client.util import short_name @@ -92,6 +99,19 @@ availability=CapabilityEvent( AvailabilityEvent, [GetBattery(is_available_check=True)] ), + base_station=CapabilityBaseStation( + action=StationAction, + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, + ), + ), + status=CapabilityEvent(BaseStationEvent, [GetStationState()]), + ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), charge=CapabilityExecute(Charge), clean=CapabilityClean( diff --git a/deebot_client/hardware/deebot/p95mgv.py b/deebot_client/hardware/deebot/p95mgv.py index 97155f00..d587dcfe 100644 --- a/deebot_client/hardware/deebot/p95mgv.py +++ b/deebot_client/hardware/deebot/p95mgv.py @@ -4,6 +4,7 @@ from deebot_client.capabilities import ( Capabilities, + CapabilityBaseStation, CapabilityClean, CapabilityCleanAction, CapabilityCustomCommand, @@ -15,7 +16,6 @@ CapabilitySetEnable, CapabilitySettings, CapabilitySetTypes, - CapabilityStation, CapabilityStats, DeviceType, ) @@ -57,6 +57,8 @@ from deebot_client.commands.json.play_sound import PlaySound from deebot_client.commands.json.pos import GetPos from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.station_action import StationAction +from deebot_client.commands.json.station_state import GetStationState from deebot_client.commands.json.stats import GetStats, GetTotalStats from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect from deebot_client.commands.json.voice_assistant_state import ( @@ -69,6 +71,7 @@ from deebot_client.events import ( AdvancedModeEvent, AvailabilityEvent, + BaseStationEvent, BatteryEvent, CachedMapInfoEvent, CarpetAutoFanBoostEvent, @@ -114,6 +117,21 @@ availability=CapabilityEvent( AvailabilityEvent, [GetBattery(is_available_check=True)] ), + base_station=CapabilityBaseStation( + action=StationAction, + auto_empty=CapabilitySetTypes( + event=auto_empty.AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.MIN_10, + auto_empty.Frequency.MIN_15, + auto_empty.Frequency.MIN_25, + auto_empty.Frequency.AUTO, + ), + ), + status=CapabilityEvent(BaseStationEvent, [GetStationState()]), + ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), charge=CapabilityExecute(Charge), clean=CapabilityClean( @@ -209,19 +227,6 @@ volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), ), state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), - station=CapabilityStation( - auto_empty=CapabilitySetTypes( - event=auto_empty.AutoEmptyEvent, - get=[GetAutoEmpty()], - set=SetAutoEmpty, - types=( - auto_empty.Frequency.MIN_10, - auto_empty.Frequency.MIN_15, - auto_empty.Frequency.MIN_25, - auto_empty.Frequency.AUTO, - ), - ), - ), stats=CapabilityStats( clean=CapabilityEvent(StatsEvent, [GetStats()]), report=CapabilityEvent(ReportStatsEvent, []), diff --git a/deebot_client/hardware/deebot/qhe2o2.py b/deebot_client/hardware/deebot/qhe2o2.py index 42cc73b6..a2ed8674 100644 --- a/deebot_client/hardware/deebot/qhe2o2.py +++ b/deebot_client/hardware/deebot/qhe2o2.py @@ -4,6 +4,7 @@ from deebot_client.capabilities import ( Capabilities, + CapabilityBaseStation, CapabilityClean, CapabilityCleanAction, CapabilityCustomCommand, @@ -15,7 +16,6 @@ CapabilitySetEnable, CapabilitySettings, CapabilitySetTypes, - CapabilityStation, CapabilityStats, DeviceType, ) @@ -48,6 +48,8 @@ from deebot_client.commands.json.play_sound import PlaySound from deebot_client.commands.json.pos import GetPos from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.station_action import StationAction +from deebot_client.commands.json.station_state import GetStationState from deebot_client.commands.json.stats import GetStats, GetTotalStats from deebot_client.commands.json.volume import GetVolume, SetVolume from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo @@ -55,6 +57,7 @@ from deebot_client.events import ( AutoEmptyEvent, AvailabilityEvent, + BaseStationEvent, BatteryEvent, CachedMapInfoEvent, CarpetAutoFanBoostEvent, @@ -97,6 +100,19 @@ AvailabilityEvent, [GetBattery(is_available_check=True)] ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + base_station=CapabilityBaseStation( + action=StationAction, + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, + ), + ), + status=CapabilityEvent(BaseStationEvent, [GetStationState()]), + ), charge=CapabilityExecute(Charge), clean=CapabilityClean( action=CapabilityCleanAction(command=CleanV2, area=CleanAreaV2), @@ -173,17 +189,6 @@ volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), ), state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfoV2()]), - station=CapabilityStation( - auto_empty=CapabilitySetTypes( - event=AutoEmptyEvent, - get=[GetAutoEmpty()], - set=SetAutoEmpty, - types=( - auto_empty.Frequency.AUTO, - auto_empty.Frequency.SMART, - ), - ), - ), stats=CapabilityStats( clean=CapabilityEvent(StatsEvent, [GetStats()]), report=CapabilityEvent(ReportStatsEvent, []), diff --git a/deebot_client/messages/json/__init__.py b/deebot_client/messages/json/__init__.py index 8508e507..6a916460 100644 --- a/deebot_client/messages/json/__init__.py +++ b/deebot_client/messages/json/__init__.py @@ -7,6 +7,7 @@ from .auto_empty import OnAutoEmpty from .battery import OnBattery from .map import OnMapSetV2 +from .station_state import OnStationState from .stats import ReportStats if TYPE_CHECKING: @@ -27,7 +28,9 @@ OnMapSetV2, - ReportStats + OnStationState, + + ReportStats, ] # fmt: on diff --git a/deebot_client/messages/json/station_state.py b/deebot_client/messages/json/station_state.py new file mode 100644 index 00000000..36ca1409 --- /dev/null +++ b/deebot_client/messages/json/station_state.py @@ -0,0 +1,43 @@ +"""Base station messages.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +from deebot_client.events.base_station import BaseStationEvent, Status +from deebot_client.message import HandlingResult, MessageBodyDataDict + +if TYPE_CHECKING: + from deebot_client.event_bus import EventBus + + +class OnStationState(MessageBodyDataDict): + """On battery message.""" + + NAME = "onStationState" + + @classmethod + def _handle_body_data_dict( + cls, event_bus: EventBus, data: dict[str, Any] + ) -> HandlingResult: + """Handle message->body->data and notify the correct event subscribers. + + :return: A message response + """ + # "body":{"data":{"content":{"error":[],"type":0},"state":0},"code":0,"msg":"ok"} - Idle + # "body":{"data":{"content":{"error":[],"type":1,"motionState":1},"state":1},"code":0,"msg":"ok"} - Emptying + + if (state := data.get("state")) == 0: + reported_state = Status.IDLE + elif ( + state == 1 + and (content := data.get("content")) + and content.get("type") == 1 + and content.get("motionState") == 1 + ): + reported_state = Status.EMPTYING + else: + return HandlingResult.analyse() + + event_bus.notify(BaseStationEvent(reported_state)) + return HandlingResult.success() diff --git a/tests/commands/json/test_station_action.py b/tests/commands/json/test_station_action.py new file mode 100644 index 00000000..61470640 --- /dev/null +++ b/tests/commands/json/test_station_action.py @@ -0,0 +1,30 @@ +"""Auto empty tests.""" + +from __future__ import annotations + +from typing import Any + +import pytest + +from deebot_client.commands import BaseStationAction +from deebot_client.commands.json.station_action import StationAction + +from . import assert_execute_command + + +@pytest.mark.parametrize( + ("action", "args"), + [ + ( + BaseStationAction.EMPTY_DUSTBIN, + {"act": 1, "type": 1}, + ), + ], +) +async def test_StationAction( + action: BaseStationAction, + args: dict[str, Any], +) -> None: + """Test StationAction.""" + command = StationAction(action) + await assert_execute_command(command, args) diff --git a/tests/commands/json/test_station_state.py b/tests/commands/json/test_station_state.py new file mode 100644 index 00000000..aa710468 --- /dev/null +++ b/tests/commands/json/test_station_state.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from typing import Any + +import pytest + +from deebot_client.commands.json.station_state import GetStationState +from deebot_client.events.base_station import BaseStationEvent, Status +from tests.helpers import get_request_json, get_success_body + +from . import assert_command + + +@pytest.mark.parametrize( + ("state", "additional_content", "expected"), + [ + (0, {"type": 0}, Status.IDLE), + (1, {"type": 1, "motionState": 1}, Status.EMPTYING), + ], +) +async def test_GetStationState( + state: int, + additional_content: dict[str, Any], + expected: Status, +) -> None: + json = get_request_json( + get_success_body( + { + "content": {"error": [], **additional_content}, + "state": state, + } + ) + ) + await assert_command(GetStationState(), json, BaseStationEvent(expected)) diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 94282e9d..23fa42c4 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -35,6 +35,7 @@ from deebot_client.commands.json.ota import GetOta from deebot_client.commands.json.pos import GetPos from deebot_client.commands.json.safe_protect import GetSafeProtect +from deebot_client.commands.json.station_state import GetStationState from deebot_client.commands.json.stats import GetStats, GetTotalStats from deebot_client.commands.json.true_detect import GetTrueDetect from deebot_client.commands.json.voice_assistant_state import GetVoiceAssistantState @@ -44,6 +45,7 @@ AdvancedModeEvent, AutoEmptyEvent, AvailabilityEvent, + BaseStationEvent, BatteryEvent, BorderSwitchEvent, CarpetAutoFanBoostEvent, @@ -196,6 +198,7 @@ async def test_get_static_device_info( AutoEmptyEvent: [GetAutoEmpty()], AdvancedModeEvent: [GetAdvancedMode()], AvailabilityEvent: [GetBattery(is_available_check=True)], + BaseStationEvent: [GetStationState()], BatteryEvent: [GetBattery()], CachedMapInfoEvent: [GetCachedMapInfo()], CarpetAutoFanBoostEvent: [GetCarpetAutoFanBoost()], diff --git a/tests/messages/json/test_station_state.py b/tests/messages/json/test_station_state.py new file mode 100644 index 00000000..e862aa07 --- /dev/null +++ b/tests/messages/json/test_station_state.py @@ -0,0 +1,41 @@ +from __future__ import annotations + +from typing import Any + +import pytest + +from deebot_client.events.base_station import BaseStationEvent, Status +from deebot_client.messages.json.station_state import OnStationState +from tests.messages import assert_message + + +@pytest.mark.parametrize( + ("state", "additional_content", "expected"), + [ + (0, {"type": 0}, Status.IDLE), + (1, {"type": 1, "motionState": 1}, Status.EMPTYING), + ], +) +def test_onStationState( + state: int, + additional_content: dict[str, Any], + expected: Status, +) -> None: + data: dict[str, Any] = { + "header": { + "pri": 1, + "tzm": 60, + "ts": "1734719921057", + "ver": "0.0.1", + "fwVer": "1.30.0", + "hwVer": "0.1.1", + "wkVer": "0.1.54", + }, + "body": { + "data": {"content": {"error": [], **additional_content}, "state": state}, + "code": 0, + "msg": "ok", + }, + } + + assert_message(OnStationState, data, BaseStationEvent(expected)) From ecbe6ed9be49bc9d149e1fea4e289039d6249826 Mon Sep 17 00:00:00 2001 From: su_zh <41615701+su-zhangzheng@users.noreply.github.com> Date: Mon, 23 Dec 2024 17:30:13 +0800 Subject: [PATCH 093/138] Add DEEBOT X2 Omni Hight (DEEBOT X2 PRO) (#715) --- deebot_client/hardware/deebot/p7l7iu.py | 228 ++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 deebot_client/hardware/deebot/p7l7iu.py diff --git a/deebot_client/hardware/deebot/p7l7iu.py b/deebot_client/hardware/deebot/p7l7iu.py new file mode 100644 index 00000000..c9ab6c0a --- /dev/null +++ b/deebot_client/hardware/deebot/p7l7iu.py @@ -0,0 +1,228 @@ +"""Deebot X2 Omni Height Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.clean import CleanV2, GetCleanInfoV2 +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.sweep_mode import GetSweepMode, SetSweepMode +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.voice_assistant_state import ( + GetVoiceAssistantState, + SetVoiceAssistantState, +) +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StatsEvent, + SweepModeEvent, + TotalStatsEvent, + TrueDetectEvent, + VoiceAssistantStateEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, + WorkMode, + WorkModeEvent, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=CleanV2), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + work_mode=CapabilitySetTypes( + event=WorkModeEvent, + get=[GetWorkMode()], + set=SetWorkMode, + types=( + WorkMode.MOP, + WorkMode.MOP_AFTER_VACUUM, + WorkMode.VACUUM, + WorkMode.VACUUM_AND_MOP, + ), + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + LifeSpan.ROUND_MOP, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + LifeSpan.ROUND_MOP, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + sweep_mode=CapabilitySetEnable( + SweepModeEvent, [GetSweepMode()], SetSweepMode + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + voice_assistant=CapabilitySetEnable( + VoiceAssistantStateEvent, + [GetVoiceAssistantState()], + SetVoiceAssistantState, + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfoV2()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + ), + ), + ), +) From c8519e5e26bc666102e579aec07168de714645d2 Mon Sep 17 00:00:00 2001 From: Dmytro Lahoza Date: Mon, 23 Dec 2024 09:31:12 +0000 Subject: [PATCH 094/138] Added capabilities for DEEBOT T20 PRO `m4xnd8` similar to T20 (#716) Co-authored-by: Dmytro Lahoza --- deebot_client/hardware/deebot/m4xnd8.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/m4xnd8.py diff --git a/deebot_client/hardware/deebot/m4xnd8.py b/deebot_client/hardware/deebot/m4xnd8.py new file mode 120000 index 00000000..0f26ba6a --- /dev/null +++ b/deebot_client/hardware/deebot/m4xnd8.py @@ -0,0 +1 @@ +p1jij8.py \ No newline at end of file From 53f3f6e7ebbcb512f6a5de67df076c606acf8d3d Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 23 Dec 2024 10:36:09 +0100 Subject: [PATCH 095/138] Rename EnableEvent property to enabled (#718) --- deebot_client/events/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deebot_client/events/__init__.py b/deebot_client/events/__init__.py index 32d478b7..403fa332 100644 --- a/deebot_client/events/__init__.py +++ b/deebot_client/events/__init__.py @@ -249,7 +249,7 @@ class VolumeEvent(Event): class EnableEvent(Event): """Enabled event.""" - enable: bool + enabled: bool @dataclass(frozen=True) From c34162e34fd93364d2cfb29dd30275bcfae09fb9 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 23 Dec 2024 10:43:14 +0100 Subject: [PATCH 096/138] Refactor station action (#709) --- deebot_client/capabilities.py | 25 +++++++++++-------- deebot_client/commands/__init__.py | 4 +-- deebot_client/commands/json/station_action.py | 8 ++---- deebot_client/events/__init__.py | 8 +++--- .../events/{base_station.py => station.py} | 8 +++--- deebot_client/hardware/deebot/buom7k.py | 12 ++++++--- deebot_client/hardware/deebot/p95mgv.py | 12 ++++++--- deebot_client/hardware/deebot/qhe2o2.py | 12 ++++++--- deebot_client/messages/json/station_state.py | 8 +++--- tests/commands/json/test_station_action.py | 10 ++++---- tests/commands/json/test_station_state.py | 10 ++++---- tests/hardware/test_init.py | 4 +-- tests/messages/json/test_station_state.py | 10 ++++---- 13 files changed, 72 insertions(+), 59 deletions(-) rename deebot_client/events/{base_station.py => station.py} (75%) diff --git a/deebot_client/capabilities.py b/deebot_client/capabilities.py index 84bd3652..6a93c765 100644 --- a/deebot_client/capabilities.py +++ b/deebot_client/capabilities.py @@ -11,7 +11,6 @@ from deebot_client.events import ( AdvancedModeEvent, AvailabilityEvent, - BaseStationEvent, BatteryEvent, BorderSwitchEvent, CachedMapInfoEvent, @@ -42,6 +41,7 @@ RoomsEvent, SafeProtectEvent, StateEvent, + StationEvent, StatsEvent, SweepModeEvent, TotalStatsEvent, @@ -61,7 +61,7 @@ from _typeshed import DataclassInstance from deebot_client.command import Command - from deebot_client.commands import BaseStationAction + from deebot_client.commands import StationAction from deebot_client.commands.json.common import ExecuteCommand from deebot_client.events.efficiency_mode import EfficiencyMode, EfficiencyModeEvent from deebot_client.models import CleanAction, CleanMode @@ -109,10 +109,10 @@ class CapabilitySetEnable(CapabilitySet[_EVENT, [bool]]): @dataclass(frozen=True) -class CapabilityExecute: +class CapabilityExecute(Generic[_P]): """Capability to execute a command.""" - execute: type[Command] + execute: Callable[_P, Command] @dataclass(frozen=True, kw_only=True) @@ -122,6 +122,11 @@ class CapabilityTypes(Generic[_T]): types: tuple[_T, ...] +@dataclass(frozen=True, kw_only=True) +class CapabilityExecuteTypes(CapabilityTypes[_T], CapabilityExecute[[_T]]): + """Capability to execute a command with types.""" + + @dataclass(frozen=True, kw_only=True) class CapabilitySetTypes(CapabilitySet[_EVENT, _P], CapabilityTypes[_T]): """Capability for set command and types.""" @@ -169,11 +174,11 @@ class CapabilityMap: cached_info: CapabilityEvent[CachedMapInfoEvent] changed: CapabilityEvent[MapChangedEvent] - clear: CapabilityExecute | None = None + clear: CapabilityExecute[[]] | None = None major: CapabilityEvent[MajorMapEvent] multi_state: CapabilitySetEnable[MultimapStateEvent] position: CapabilityEvent[PositionsEvent] - relocation: CapabilityExecute + relocation: CapabilityExecute[[]] rooms: CapabilityEvent[RoomsEvent] trace: CapabilityEvent[MapTraceEvent] @@ -216,13 +221,13 @@ class CapabilitySettings: class CapabilityBaseStation: """Capabilities for the base station.""" - action: Callable[[BaseStationAction], Command] + action: CapabilityExecuteTypes[StationAction] auto_empty: CapabilitySetTypes[ auto_empty.AutoEmptyEvent, [bool | None, auto_empty.Frequency | str | None], auto_empty.Frequency, ] - status: CapabilityEvent[BaseStationEvent] + state: CapabilityEvent[StationEvent] @dataclass(frozen=True, kw_only=True) @@ -234,7 +239,7 @@ class Capabilities(ABC): availability: CapabilityEvent[AvailabilityEvent] base_station: CapabilityBaseStation | None = None battery: CapabilityEvent[BatteryEvent] - charge: CapabilityExecute + charge: CapabilityExecute[[]] clean: CapabilityClean custom: CapabilityCustomCommand[CustomCommandEvent] error: CapabilityEvent[ErrorEvent] @@ -244,7 +249,7 @@ class Capabilities(ABC): life_span: CapabilityLifeSpan map: CapabilityMap | None = None network: CapabilityEvent[NetworkInfoEvent] - play_sound: CapabilityExecute + play_sound: CapabilityExecute[[]] settings: CapabilitySettings state: CapabilityEvent[StateEvent] stats: CapabilityStats diff --git a/deebot_client/commands/__init__.py b/deebot_client/commands/__init__.py index 90fd37db..5fb527c4 100644 --- a/deebot_client/commands/__init__.py +++ b/deebot_client/commands/__init__.py @@ -23,7 +23,7 @@ @unique -class BaseStationAction(IntEnum): - """Enum class for all possible base station actions.""" +class StationAction(IntEnum): + """Enum class for all possible station actions.""" EMPTY_DUSTBIN = 1 diff --git a/deebot_client/commands/json/station_action.py b/deebot_client/commands/json/station_action.py index 16330e24..0e78bb05 100644 --- a/deebot_client/commands/json/station_action.py +++ b/deebot_client/commands/json/station_action.py @@ -4,14 +4,10 @@ from typing import TYPE_CHECKING -from deebot_client.logging_filter import get_logger - from .common import ExecuteCommand if TYPE_CHECKING: - from deebot_client.commands import BaseStationAction - -_LOGGER = get_logger(__name__) + from deebot_client import commands class StationAction(ExecuteCommand): @@ -19,5 +15,5 @@ class StationAction(ExecuteCommand): NAME = "stationAction" - def __init__(self, action: BaseStationAction) -> None: + def __init__(self, action: commands.StationAction) -> None: super().__init__({"act": 1, "type": action.value}) diff --git a/deebot_client/events/__init__.py b/deebot_client/events/__init__.py index 403fa332..74d636f6 100644 --- a/deebot_client/events/__init__.py +++ b/deebot_client/events/__init__.py @@ -8,9 +8,8 @@ from deebot_client.events.base import Event -from . import auto_empty, base_station +from . import auto_empty, station from .auto_empty import AutoEmptyEvent -from .base_station import BaseStationEvent from .efficiency_mode import EfficiencyMode, EfficiencyModeEvent from .fan_speed import FanSpeedEvent, FanSpeedLevel from .map import ( @@ -27,6 +26,7 @@ PositionType, ) from .network import NetworkInfoEvent +from .station import StationEvent from .water_info import SweepType, WaterAmount, WaterInfoEvent from .work_mode import WorkMode, WorkModeEvent @@ -35,7 +35,6 @@ __all__ = [ "AutoEmptyEvent", - "BaseStationEvent", "BatteryEvent", "CachedMapInfoEvent", "CleanJobStatus", @@ -56,6 +55,7 @@ "Position", "PositionType", "PositionsEvent", + "StationEvent", "SweepModeEvent", "SweepType", "WaterAmount", @@ -63,7 +63,7 @@ "WorkMode", "WorkModeEvent", "auto_empty", - "base_station", + "station", ] diff --git a/deebot_client/events/base_station.py b/deebot_client/events/station.py similarity index 75% rename from deebot_client/events/base_station.py rename to deebot_client/events/station.py index 39e609e1..4f4989cc 100644 --- a/deebot_client/events/base_station.py +++ b/deebot_client/events/station.py @@ -7,11 +7,11 @@ from .base import Event as _Event -__all__ = ["BaseStationEvent", "Status"] +__all__ = ["State", "StationEvent"] @unique -class Status(IntEnum): +class State(IntEnum): """Enum class for all possible base station statuses.""" IDLE = 0 @@ -19,7 +19,7 @@ class Status(IntEnum): @dataclass(frozen=True) -class BaseStationEvent(_Event): +class StationEvent(_Event): """Base Station Event representation.""" - state: Status + state: State diff --git a/deebot_client/hardware/deebot/buom7k.py b/deebot_client/hardware/deebot/buom7k.py index 4ad44625..614850fe 100644 --- a/deebot_client/hardware/deebot/buom7k.py +++ b/deebot_client/hardware/deebot/buom7k.py @@ -10,6 +10,7 @@ CapabilityCustomCommand, CapabilityEvent, CapabilityExecute, + CapabilityExecuteTypes, CapabilityLifeSpan, CapabilityMap, CapabilitySet, @@ -19,6 +20,8 @@ CapabilityStats, DeviceType, ) +from deebot_client.commands import StationAction +from deebot_client.commands.json import station_action from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty from deebot_client.commands.json.battery import GetBattery from deebot_client.commands.json.carpet import ( @@ -48,7 +51,6 @@ from deebot_client.commands.json.play_sound import PlaySound from deebot_client.commands.json.pos import GetPos from deebot_client.commands.json.relocation import SetRelocationState -from deebot_client.commands.json.station_action import StationAction from deebot_client.commands.json.station_state import GetStationState from deebot_client.commands.json.stats import GetStats, GetTotalStats from deebot_client.commands.json.volume import GetVolume, SetVolume @@ -56,7 +58,6 @@ from deebot_client.const import DataType from deebot_client.events import ( AvailabilityEvent, - BaseStationEvent, BatteryEvent, CachedMapInfoEvent, CarpetAutoFanBoostEvent, @@ -79,6 +80,7 @@ ReportStatsEvent, RoomsEvent, StateEvent, + StationEvent, StatsEvent, TotalStatsEvent, VolumeEvent, @@ -100,7 +102,9 @@ AvailabilityEvent, [GetBattery(is_available_check=True)] ), base_station=CapabilityBaseStation( - action=StationAction, + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), auto_empty=CapabilitySetTypes( event=AutoEmptyEvent, get=[GetAutoEmpty()], @@ -110,7 +114,7 @@ auto_empty.Frequency.SMART, ), ), - status=CapabilityEvent(BaseStationEvent, [GetStationState()]), + state=CapabilityEvent(StationEvent, [GetStationState()]), ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), charge=CapabilityExecute(Charge), diff --git a/deebot_client/hardware/deebot/p95mgv.py b/deebot_client/hardware/deebot/p95mgv.py index d587dcfe..660e44bb 100644 --- a/deebot_client/hardware/deebot/p95mgv.py +++ b/deebot_client/hardware/deebot/p95mgv.py @@ -10,6 +10,7 @@ CapabilityCustomCommand, CapabilityEvent, CapabilityExecute, + CapabilityExecuteTypes, CapabilityLifeSpan, CapabilityMap, CapabilitySet, @@ -19,6 +20,8 @@ CapabilityStats, DeviceType, ) +from deebot_client.commands import StationAction +from deebot_client.commands.json import station_action from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty from deebot_client.commands.json.battery import GetBattery @@ -57,7 +60,6 @@ from deebot_client.commands.json.play_sound import PlaySound from deebot_client.commands.json.pos import GetPos from deebot_client.commands.json.relocation import SetRelocationState -from deebot_client.commands.json.station_action import StationAction from deebot_client.commands.json.station_state import GetStationState from deebot_client.commands.json.stats import GetStats, GetTotalStats from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect @@ -71,7 +73,6 @@ from deebot_client.events import ( AdvancedModeEvent, AvailabilityEvent, - BaseStationEvent, BatteryEvent, CachedMapInfoEvent, CarpetAutoFanBoostEvent, @@ -95,6 +96,7 @@ ReportStatsEvent, RoomsEvent, StateEvent, + StationEvent, StatsEvent, TotalStatsEvent, TrueDetectEvent, @@ -118,7 +120,9 @@ AvailabilityEvent, [GetBattery(is_available_check=True)] ), base_station=CapabilityBaseStation( - action=StationAction, + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), auto_empty=CapabilitySetTypes( event=auto_empty.AutoEmptyEvent, get=[GetAutoEmpty()], @@ -130,7 +134,7 @@ auto_empty.Frequency.AUTO, ), ), - status=CapabilityEvent(BaseStationEvent, [GetStationState()]), + state=CapabilityEvent(StationEvent, [GetStationState()]), ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), charge=CapabilityExecute(Charge), diff --git a/deebot_client/hardware/deebot/qhe2o2.py b/deebot_client/hardware/deebot/qhe2o2.py index a2ed8674..9ffda83d 100644 --- a/deebot_client/hardware/deebot/qhe2o2.py +++ b/deebot_client/hardware/deebot/qhe2o2.py @@ -10,6 +10,7 @@ CapabilityCustomCommand, CapabilityEvent, CapabilityExecute, + CapabilityExecuteTypes, CapabilityLifeSpan, CapabilityMap, CapabilitySet, @@ -19,6 +20,8 @@ CapabilityStats, DeviceType, ) +from deebot_client.commands import StationAction +from deebot_client.commands.json import station_action from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty from deebot_client.commands.json.battery import GetBattery from deebot_client.commands.json.carpet import ( @@ -48,7 +51,6 @@ from deebot_client.commands.json.play_sound import PlaySound from deebot_client.commands.json.pos import GetPos from deebot_client.commands.json.relocation import SetRelocationState -from deebot_client.commands.json.station_action import StationAction from deebot_client.commands.json.station_state import GetStationState from deebot_client.commands.json.stats import GetStats, GetTotalStats from deebot_client.commands.json.volume import GetVolume, SetVolume @@ -57,7 +59,6 @@ from deebot_client.events import ( AutoEmptyEvent, AvailabilityEvent, - BaseStationEvent, BatteryEvent, CachedMapInfoEvent, CarpetAutoFanBoostEvent, @@ -80,6 +81,7 @@ ReportStatsEvent, RoomsEvent, StateEvent, + StationEvent, StatsEvent, TotalStatsEvent, VolumeEvent, @@ -101,7 +103,9 @@ ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), base_station=CapabilityBaseStation( - action=StationAction, + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), auto_empty=CapabilitySetTypes( event=AutoEmptyEvent, get=[GetAutoEmpty()], @@ -111,7 +115,7 @@ auto_empty.Frequency.SMART, ), ), - status=CapabilityEvent(BaseStationEvent, [GetStationState()]), + state=CapabilityEvent(StationEvent, [GetStationState()]), ), charge=CapabilityExecute(Charge), clean=CapabilityClean( diff --git a/deebot_client/messages/json/station_state.py b/deebot_client/messages/json/station_state.py index 36ca1409..6d41aaf4 100644 --- a/deebot_client/messages/json/station_state.py +++ b/deebot_client/messages/json/station_state.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Any -from deebot_client.events.base_station import BaseStationEvent, Status +from deebot_client.events.station import State, StationEvent from deebot_client.message import HandlingResult, MessageBodyDataDict if TYPE_CHECKING: @@ -28,16 +28,16 @@ def _handle_body_data_dict( # "body":{"data":{"content":{"error":[],"type":1,"motionState":1},"state":1},"code":0,"msg":"ok"} - Emptying if (state := data.get("state")) == 0: - reported_state = Status.IDLE + reported_state = State.IDLE elif ( state == 1 and (content := data.get("content")) and content.get("type") == 1 and content.get("motionState") == 1 ): - reported_state = Status.EMPTYING + reported_state = State.EMPTYING else: return HandlingResult.analyse() - event_bus.notify(BaseStationEvent(reported_state)) + event_bus.notify(StationEvent(reported_state)) return HandlingResult.success() diff --git a/tests/commands/json/test_station_action.py b/tests/commands/json/test_station_action.py index 61470640..6625253e 100644 --- a/tests/commands/json/test_station_action.py +++ b/tests/commands/json/test_station_action.py @@ -6,8 +6,8 @@ import pytest -from deebot_client.commands import BaseStationAction -from deebot_client.commands.json.station_action import StationAction +from deebot_client.commands import StationAction +from deebot_client.commands.json import station_action from . import assert_execute_command @@ -16,15 +16,15 @@ ("action", "args"), [ ( - BaseStationAction.EMPTY_DUSTBIN, + StationAction.EMPTY_DUSTBIN, {"act": 1, "type": 1}, ), ], ) async def test_StationAction( - action: BaseStationAction, + action: StationAction, args: dict[str, Any], ) -> None: """Test StationAction.""" - command = StationAction(action) + command = station_action.StationAction(action) await assert_execute_command(command, args) diff --git a/tests/commands/json/test_station_state.py b/tests/commands/json/test_station_state.py index aa710468..512a697e 100644 --- a/tests/commands/json/test_station_state.py +++ b/tests/commands/json/test_station_state.py @@ -5,7 +5,7 @@ import pytest from deebot_client.commands.json.station_state import GetStationState -from deebot_client.events.base_station import BaseStationEvent, Status +from deebot_client.events.station import State, StationEvent from tests.helpers import get_request_json, get_success_body from . import assert_command @@ -14,14 +14,14 @@ @pytest.mark.parametrize( ("state", "additional_content", "expected"), [ - (0, {"type": 0}, Status.IDLE), - (1, {"type": 1, "motionState": 1}, Status.EMPTYING), + (0, {"type": 0}, State.IDLE), + (1, {"type": 1, "motionState": 1}, State.EMPTYING), ], ) async def test_GetStationState( state: int, additional_content: dict[str, Any], - expected: Status, + expected: State, ) -> None: json = get_request_json( get_success_body( @@ -31,4 +31,4 @@ async def test_GetStationState( } ) ) - await assert_command(GetStationState(), json, BaseStationEvent(expected)) + await assert_command(GetStationState(), json, StationEvent(expected)) diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 23fa42c4..6a7b2db4 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -45,7 +45,6 @@ AdvancedModeEvent, AutoEmptyEvent, AvailabilityEvent, - BaseStationEvent, BatteryEvent, BorderSwitchEvent, CarpetAutoFanBoostEvent, @@ -67,6 +66,7 @@ RoomsEvent, SafeProtectEvent, StateEvent, + StationEvent, StatsEvent, TotalStatsEvent, TrueDetectEvent, @@ -198,7 +198,7 @@ async def test_get_static_device_info( AutoEmptyEvent: [GetAutoEmpty()], AdvancedModeEvent: [GetAdvancedMode()], AvailabilityEvent: [GetBattery(is_available_check=True)], - BaseStationEvent: [GetStationState()], + StationEvent: [GetStationState()], BatteryEvent: [GetBattery()], CachedMapInfoEvent: [GetCachedMapInfo()], CarpetAutoFanBoostEvent: [GetCarpetAutoFanBoost()], diff --git a/tests/messages/json/test_station_state.py b/tests/messages/json/test_station_state.py index e862aa07..e1bf4084 100644 --- a/tests/messages/json/test_station_state.py +++ b/tests/messages/json/test_station_state.py @@ -4,7 +4,7 @@ import pytest -from deebot_client.events.base_station import BaseStationEvent, Status +from deebot_client.events.station import State, StationEvent from deebot_client.messages.json.station_state import OnStationState from tests.messages import assert_message @@ -12,14 +12,14 @@ @pytest.mark.parametrize( ("state", "additional_content", "expected"), [ - (0, {"type": 0}, Status.IDLE), - (1, {"type": 1, "motionState": 1}, Status.EMPTYING), + (0, {"type": 0}, State.IDLE), + (1, {"type": 1, "motionState": 1}, State.EMPTYING), ], ) def test_onStationState( state: int, additional_content: dict[str, Any], - expected: Status, + expected: State, ) -> None: data: dict[str, Any] = { "header": { @@ -38,4 +38,4 @@ def test_onStationState( }, } - assert_message(OnStationState, data, BaseStationEvent(expected)) + assert_message(OnStationState, data, StationEvent(expected)) From abaa89b832d59e7e3717d3c82894d6751bc2fb47 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 10:43:45 +0100 Subject: [PATCH 097/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#717)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 146 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/uv.lock b/uv.lock index 35c12196..f3911e2a 100644 --- a/uv.lock +++ b/uv.lock @@ -12,7 +12,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.11.10" +version = "3.11.11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -23,38 +23,38 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/c4/3b5a937b16f6c2a0ada842a9066aad0b7a5708427d4a202a07bf09c67cbb/aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", size = 7668832 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/17/1dbe2f619f77795409c1a13ab395b98ed1b215d3e938cacde9b8ffdac53d/aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", size = 704448 }, - { url = "https://files.pythonhosted.org/packages/e3/9b/112247ad47e9d7f6640889c6e42cc0ded8c8345dd0033c66bcede799b051/aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", size = 463829 }, - { url = "https://files.pythonhosted.org/packages/8a/36/a64b583771fc673062a7a1374728a6241d49e2eda5a9041fbf248e18c804/aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", size = 455774 }, - { url = "https://files.pythonhosted.org/packages/e5/75/ee1b8f510978b3de5f185c62535b135e4fc3f5a247ca0c2245137a02d800/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", size = 1682134 }, - { url = "https://files.pythonhosted.org/packages/87/46/65e8259432d5f73ca9ebf5edb645ef90e5303724e4e52477516cb4042240/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", size = 1736757 }, - { url = "https://files.pythonhosted.org/packages/03/f6/a6d1e791b7153fb2d101278f7146c0771b0e1569c547f8a8bc3035651984/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", size = 1793033 }, - { url = "https://files.pythonhosted.org/packages/a8/e9/1ac90733e36e7848693aece522936a13bf17eeb617da662f94adfafc1c25/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", size = 1691609 }, - { url = "https://files.pythonhosted.org/packages/6d/a6/77b33da5a0bc04566c7ddcca94500f2c2a2334eecab4885387fffd1fc600/aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", size = 1619082 }, - { url = "https://files.pythonhosted.org/packages/48/94/5bf5f927d9a2fedd2c978adfb70a3680e16f46d178361685b56244eb52ed/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", size = 1641186 }, - { url = "https://files.pythonhosted.org/packages/99/2d/e85103aa01d1064e51bc50cb51e7b40150a8ff5d34e5a3173a46b241860b/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", size = 1646280 }, - { url = "https://files.pythonhosted.org/packages/7b/e0/44651fda8c1d865a51b3a81f1956ea55ce16fc568fe7a3e05db7fc22f139/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", size = 1701862 }, - { url = "https://files.pythonhosted.org/packages/4e/1e/0804459ae325a5b95f6f349778fb465f29d2b863e522b6a349db0aaad54c/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", size = 1734373 }, - { url = "https://files.pythonhosted.org/packages/07/87/b8f6721668cad74bcc9c7cfe6d0230b304d1250196b221e54294a0d78dbe/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", size = 1694343 }, - { url = "https://files.pythonhosted.org/packages/4b/20/42813fc60d9178ba9b1b86c58a5441ddb6cf8ffdfe66387345bff173bcff/aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", size = 411118 }, - { url = "https://files.pythonhosted.org/packages/3a/51/df9c263c861ce93998b5ad2ba3212caab2112d5b66dbe91ddbe90c41ded4/aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", size = 437424 }, - { url = "https://files.pythonhosted.org/packages/8c/1d/88bfdbe28a3d1ba5b94a235f188f27726caf8ade9a0e13574848f44fe0fe/aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", size = 697755 }, - { url = "https://files.pythonhosted.org/packages/86/00/4c4619d6fe5c5be32f74d1422fc719b3e6cd7097af0c9e03877ca9bd4ebc/aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", size = 460440 }, - { url = "https://files.pythonhosted.org/packages/aa/1c/2f927408f50593a29465d198ec3c57c835c8602330233163e8d89c1093db/aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", size = 452726 }, - { url = "https://files.pythonhosted.org/packages/06/6a/ff00ed0a2ba45c34b3c366aa5b0004b1a4adcec5a9b5f67dd0648ee1c88a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", size = 1664944 }, - { url = "https://files.pythonhosted.org/packages/02/c2/61923f2a7c2e14d7424b3a526e054f0358f57ccdf5573d4d3d033b01921a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", size = 1717707 }, - { url = "https://files.pythonhosted.org/packages/8a/08/0d3d074b24d377569ec89d476a95ca918443099c0401bb31b331104e35d1/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", size = 1774890 }, - { url = "https://files.pythonhosted.org/packages/e8/49/052ada2b6e90ed65f0e6a7e548614621b5f8dcd193cb9415d2e6bcecc94a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", size = 1676945 }, - { url = "https://files.pythonhosted.org/packages/7c/9e/0c48e1a48e072a869b8b5e3920c9f6a8092861524a4a6f159cd7e6fda939/aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", size = 1602959 }, - { url = "https://files.pythonhosted.org/packages/ab/98/791f979093ff7f67f80344c182cb0ca4c2c60daed397ecaf454cc8d7a5cd/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", size = 1618058 }, - { url = "https://files.pythonhosted.org/packages/7b/5d/2d4b05feb3fd68eb7c8335f73c81079b56e582633b91002da695ccb439ef/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", size = 1616289 }, - { url = "https://files.pythonhosted.org/packages/50/83/68cc28c00fe681dce6150614f105efe98282da19252cd6e32dfa893bb328/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", size = 1685239 }, - { url = "https://files.pythonhosted.org/packages/16/f9/68fc5c8928f63238ce9314f04f3f59d9190a4db924998bb9be99c7aacce8/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", size = 1715078 }, - { url = "https://files.pythonhosted.org/packages/3f/e0/3dd3f0451c532c77e35780bafb2b6469a046bc15a6ec2e039475a1d2f161/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", size = 1672544 }, - { url = "https://files.pythonhosted.org/packages/a5/b1/3530ab040dd5d7fb016b47115016f9b3a07ea29593b0e07e53dbe06a380c/aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", size = 409984 }, - { url = "https://files.pythonhosted.org/packages/49/1f/deed34e9fca639a7f873d01150d46925d3e1312051eaa591c1aa1f2e6ddc/aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", size = 435837 }, +sdist = { url = "https://files.pythonhosted.org/packages/fe/ed/f26db39d29cd3cb2f5a3374304c713fe5ab5a0e4c8ee25a0c45cc6adf844/aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e", size = 7669618 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/cf/4bda538c502f9738d6b95ada11603c05ec260807246e15e869fc3ec5de97/aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886", size = 704666 }, + { url = "https://files.pythonhosted.org/packages/46/7b/87fcef2cad2fad420ca77bef981e815df6904047d0a1bd6aeded1b0d1d66/aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2", size = 464057 }, + { url = "https://files.pythonhosted.org/packages/5a/a6/789e1f17a1b6f4a38939fbc39d29e1d960d5f89f73d0629a939410171bc0/aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c", size = 455996 }, + { url = "https://files.pythonhosted.org/packages/b7/dd/485061fbfef33165ce7320db36e530cd7116ee1098e9c3774d15a732b3fd/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a", size = 1682367 }, + { url = "https://files.pythonhosted.org/packages/e9/d7/9ec5b3ea9ae215c311d88b2093e8da17e67b8856673e4166c994e117ee3e/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231", size = 1736989 }, + { url = "https://files.pythonhosted.org/packages/d6/fb/ea94927f7bfe1d86178c9d3e0a8c54f651a0a655214cce930b3c679b8f64/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e", size = 1793265 }, + { url = "https://files.pythonhosted.org/packages/40/7f/6de218084f9b653026bd7063cd8045123a7ba90c25176465f266976d8c82/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8", size = 1691841 }, + { url = "https://files.pythonhosted.org/packages/77/e2/992f43d87831cbddb6b09c57ab55499332f60ad6fdbf438ff4419c2925fc/aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8", size = 1619317 }, + { url = "https://files.pythonhosted.org/packages/96/74/879b23cdd816db4133325a201287c95bef4ce669acde37f8f1b8669e1755/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c", size = 1641416 }, + { url = "https://files.pythonhosted.org/packages/30/98/b123f6b15d87c54e58fd7ae3558ff594f898d7f30a90899718f3215ad328/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab", size = 1646514 }, + { url = "https://files.pythonhosted.org/packages/d7/38/257fda3dc99d6978ab943141d5165ec74fd4b4164baa15e9c66fa21da86b/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da", size = 1702095 }, + { url = "https://files.pythonhosted.org/packages/0c/f4/ddab089053f9fb96654df5505c0a69bde093214b3c3454f6bfdb1845f558/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853", size = 1734611 }, + { url = "https://files.pythonhosted.org/packages/c3/d6/f30b2bc520c38c8aa4657ed953186e535ae84abe55c08d0f70acd72ff577/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e", size = 1694576 }, + { url = "https://files.pythonhosted.org/packages/bc/97/b0a88c3f4c6d0020b34045ee6d954058abc870814f6e310c4c9b74254116/aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600", size = 411363 }, + { url = "https://files.pythonhosted.org/packages/7f/23/cc36d9c398980acaeeb443100f0216f50a7cfe20c67a9fd0a2f1a5a846de/aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d", size = 437666 }, + { url = "https://files.pythonhosted.org/packages/49/d1/d8af164f400bad432b63e1ac857d74a09311a8334b0481f2f64b158b50eb/aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9", size = 697982 }, + { url = "https://files.pythonhosted.org/packages/92/d1/faad3bf9fa4bfd26b95c69fc2e98937d52b1ff44f7e28131855a98d23a17/aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194", size = 460662 }, + { url = "https://files.pythonhosted.org/packages/db/61/0d71cc66d63909dabc4590f74eba71f91873a77ea52424401c2498d47536/aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f", size = 452950 }, + { url = "https://files.pythonhosted.org/packages/07/db/6d04bc7fd92784900704e16b745484ef45b77bd04e25f58f6febaadf7983/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104", size = 1665178 }, + { url = "https://files.pythonhosted.org/packages/54/5c/e95ade9ae29f375411884d9fd98e50535bf9fe316c9feb0f30cd2ac8f508/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff", size = 1717939 }, + { url = "https://files.pythonhosted.org/packages/6f/1c/1e7d5c5daea9e409ed70f7986001b8c9e3a49a50b28404498d30860edab6/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3", size = 1775125 }, + { url = "https://files.pythonhosted.org/packages/5d/66/890987e44f7d2f33a130e37e01a164168e6aff06fce15217b6eaf14df4f6/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1", size = 1677176 }, + { url = "https://files.pythonhosted.org/packages/8f/dc/e2ba57d7a52df6cdf1072fd5fa9c6301a68e1cd67415f189805d3eeb031d/aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4", size = 1603192 }, + { url = "https://files.pythonhosted.org/packages/6c/9e/8d08a57de79ca3a358da449405555e668f2c8871a7777ecd2f0e3912c272/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d", size = 1618296 }, + { url = "https://files.pythonhosted.org/packages/56/51/89822e3ec72db352c32e7fc1c690370e24e231837d9abd056490f3a49886/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87", size = 1616524 }, + { url = "https://files.pythonhosted.org/packages/2c/fa/e2e6d9398f462ffaa095e84717c1732916a57f1814502929ed67dd7568ef/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2", size = 1685471 }, + { url = "https://files.pythonhosted.org/packages/ae/5f/6bb976e619ca28a052e2c0ca7b0251ccd893f93d7c24a96abea38e332bf6/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12", size = 1715312 }, + { url = "https://files.pythonhosted.org/packages/79/c1/756a7e65aa087c7fac724d6c4c038f2faaa2a42fe56dbc1dd62a33ca7213/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5", size = 1672783 }, + { url = "https://files.pythonhosted.org/packages/73/ba/a6190ebb02176c7f75e6308da31f5d49f6477b651a3dcfaaaca865a298e2/aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d", size = 410229 }, + { url = "https://files.pythonhosted.org/packages/b8/62/c9fa5bafe03186a0e4699150a7fed9b1e73240996d0d2f0e5f70f3fdf471/aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99", size = 436081 }, ] [[package]] @@ -83,11 +83,11 @@ wheels = [ [[package]] name = "astroid" -version = "3.3.6" +version = "3.3.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/40/e028137cb19ed577001c76b91c5c50fee5a9c85099f45820b69385574ac5/astroid-3.3.6.tar.gz", hash = "sha256:6aaea045f938c735ead292204afdb977a36e989522b7833ef6fea94de743f442", size = 397452 } +sdist = { url = "https://files.pythonhosted.org/packages/20/f6/7725404e3dcaeafe695d4fe42ad99eefbcba4cad2c83ca122e6b439c9f96/astroid-3.3.7.tar.gz", hash = "sha256:29fe1df7ef64dc17a54dbfad67b40b445340fcdba7c4012e7ecc9270c9b2f5b6", size = 398091 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/d2/82c8ccef22ea873a2b0da9636e47d45137eeeb2fb9320c5dbbdd3627bab0/astroid-3.3.6-py3-none-any.whl", hash = "sha256:db676dc4f3ae6bfe31cda227dc60e03438378d7a896aec57422c95634e8d722f", size = 274644 }, + { url = "https://files.pythonhosted.org/packages/83/0b/ef3a51abbf2064ac50447a02d1cd14c1f008590e96f780042c21108b6b56/astroid-3.3.7-py3-none-any.whl", hash = "sha256:e1ea2c358a3c760ef583d4963e773100fa2c693b27ed158a1d0e81adb4436903", size = 275125 }, ] [[package]] @@ -487,40 +487,40 @@ wheels = [ [[package]] name = "numpy" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/1b/1d565e0f6e156e1522ab564176b8b29d71e13d8caf003a08768df3d5cec5/numpy-2.2.0.tar.gz", hash = "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", size = 20225497 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/bc/a20dc4e1d051149052762e7647455311865d11c603170c476d1e910a353e/numpy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", size = 20909153 }, - { url = "https://files.pythonhosted.org/packages/60/3d/ac4fb63f36db94f4c7db05b45e3ecb3f88f778ca71850664460c78cfde41/numpy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", size = 14095021 }, - { url = "https://files.pythonhosted.org/packages/41/6d/a654d519d24e4fcc7a83d4a51209cda086f26cf30722b3d8ffc1aa9b775e/numpy-2.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", size = 5125491 }, - { url = "https://files.pythonhosted.org/packages/e6/22/fab7e1510a62e5092f4e6507a279020052b89f11d9cfe52af7f52c243b04/numpy-2.2.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", size = 6658534 }, - { url = "https://files.pythonhosted.org/packages/fc/29/a3d938ddc5a534cd53df7ab79d20a68db8c67578de1df0ae0118230f5f54/numpy-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", size = 14046306 }, - { url = "https://files.pythonhosted.org/packages/90/24/d0bbb56abdd8934f30384632e3c2ca1ebfeb5d17e150c6e366ba291de36b/numpy-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", size = 16095819 }, - { url = "https://files.pythonhosted.org/packages/99/9c/58a673faa9e8a0e77248e782f7a17410cf7259b326265646fd50ed49c4e1/numpy-2.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", size = 15243215 }, - { url = "https://files.pythonhosted.org/packages/9c/61/f311693f78cbf635cfb69ce9e1e857ff83937a27d93c96ac5932fd33e330/numpy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", size = 17860175 }, - { url = "https://files.pythonhosted.org/packages/11/3e/491c34262cb1fc9dd13a00beb80d755ee0517b17db20e54cac7aa524533e/numpy-2.2.0-cp312-cp312-win32.whl", hash = "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", size = 6273281 }, - { url = "https://files.pythonhosted.org/packages/89/ea/00537f599eb230771157bc509f6ea5b2dddf05d4b09f9d2f1d7096a18781/numpy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", size = 12613227 }, - { url = "https://files.pythonhosted.org/packages/bd/4c/0d1eef206545c994289e7a9de21b642880a11e0ed47a2b0c407c688c4f69/numpy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367", size = 20895707 }, - { url = "https://files.pythonhosted.org/packages/16/cb/88f6c1e6df83002c421d5f854ccf134aa088aa997af786a5dac3f32ec99b/numpy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", size = 14110592 }, - { url = "https://files.pythonhosted.org/packages/b4/54/817e6894168a43f33dca74199ba0dd0f1acd99aa6323ed6d323d63d640a2/numpy-2.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", size = 5110858 }, - { url = "https://files.pythonhosted.org/packages/c7/99/00d8a1a8eb70425bba7880257ed73fed08d3e8d05da4202fb6b9a81d5ee4/numpy-2.2.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", size = 6645143 }, - { url = "https://files.pythonhosted.org/packages/34/86/5b9c2b7c56e7a9d9297a0a4be0b8433f498eba52a8f5892d9132b0f64627/numpy-2.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", size = 14042812 }, - { url = "https://files.pythonhosted.org/packages/df/54/13535f74391dbe5f479ceed96f1403267be302c840040700d4fd66688089/numpy-2.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", size = 16093419 }, - { url = "https://files.pythonhosted.org/packages/dd/37/dfb2056842ac61315f225aa56f455da369f5223e4c5a38b91d20da1b628b/numpy-2.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", size = 15238969 }, - { url = "https://files.pythonhosted.org/packages/5a/3d/d20d24ee313992f0b7e7b9d9eef642d9b545d39d5b91c4a2cc8c98776328/numpy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", size = 17855705 }, - { url = "https://files.pythonhosted.org/packages/5b/40/944c9ee264f875a2db6f79380944fd2b5bb9d712bb4a134d11f45ad5b693/numpy-2.2.0-cp313-cp313-win32.whl", hash = "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", size = 6270078 }, - { url = "https://files.pythonhosted.org/packages/30/04/e1ee6f8b22034302d4c5c24e15782bdedf76d90b90f3874ed0b48525def0/numpy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", size = 12605791 }, - { url = "https://files.pythonhosted.org/packages/ef/fb/51d458625cd6134d60ac15180ae50995d7d21b0f2f92a6286ae7b0792d19/numpy-2.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", size = 20920160 }, - { url = "https://files.pythonhosted.org/packages/b4/34/162ae0c5d2536ea4be98c813b5161c980f0443cd5765fde16ddfe3450140/numpy-2.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", size = 14119064 }, - { url = "https://files.pythonhosted.org/packages/17/6c/4195dd0e1c41c55f466d516e17e9e28510f32af76d23061ea3da67438e3c/numpy-2.2.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", size = 5152778 }, - { url = "https://files.pythonhosted.org/packages/2f/47/ea804ae525832c8d05ed85b560dfd242d34e4bb0962bc269ccaa720fb934/numpy-2.2.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", size = 6667605 }, - { url = "https://files.pythonhosted.org/packages/76/99/34d20e50b3d894bb16b5374bfbee399ab8ff3a33bf1e1f0b8acfe7bbd70d/numpy-2.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", size = 14013275 }, - { url = "https://files.pythonhosted.org/packages/69/8f/a1df7bd02d434ab82539517d1b98028985700cfc4300bc5496fb140ca648/numpy-2.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", size = 16074900 }, - { url = "https://files.pythonhosted.org/packages/04/94/b419e7a76bf21a00fcb03c613583f10e389fdc8dfe420412ff5710c8ad3d/numpy-2.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", size = 15219122 }, - { url = "https://files.pythonhosted.org/packages/65/d9/dddf398b2b6c5d750892a207a469c2854a8db0f033edaf72103af8cf05aa/numpy-2.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", size = 17851668 }, - { url = "https://files.pythonhosted.org/packages/d4/dc/09a4e5819a9782a213c0eb4eecacdc1cd75ad8dac99279b04cfccb7eeb0a/numpy-2.2.0-cp313-cp313t-win32.whl", hash = "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", size = 6325288 }, - { url = "https://files.pythonhosted.org/packages/ce/e1/e0d06ec34036c92b43aef206efe99a5f5f04e12c776eab82a36e00c40afc/numpy-2.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", size = 12692303 }, +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/fdbf6a7871703df6160b5cf3dd774074b086d278172285c52c2758b76305/numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", size = 20227662 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/12/b928871c570d4a87ab13d2cc19f8817f17e340d5481621930e76b80ffb7d/numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", size = 20909861 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/59df91ae1d8ad7c5e03efd63fd785dec62d96b0fe56d1f9ab600b55009af/numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", size = 14095776 }, + { url = "https://files.pythonhosted.org/packages/af/4e/8ed5868efc8e601fb69419644a280e9c482b75691466b73bfaab7d86922c/numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", size = 5126239 }, + { url = "https://files.pythonhosted.org/packages/1a/74/dd0bbe650d7bc0014b051f092f2de65e34a8155aabb1287698919d124d7f/numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", size = 6659296 }, + { url = "https://files.pythonhosted.org/packages/7f/11/4ebd7a3f4a655764dc98481f97bd0a662fb340d1001be6050606be13e162/numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", size = 14047121 }, + { url = "https://files.pythonhosted.org/packages/7f/a7/c1f1d978166eb6b98ad009503e4d93a8c1962d0eb14a885c352ee0276a54/numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", size = 16096599 }, + { url = "https://files.pythonhosted.org/packages/3d/6d/0e22afd5fcbb4d8d0091f3f46bf4e8906399c458d4293da23292c0ba5022/numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51", size = 15243932 }, + { url = "https://files.pythonhosted.org/packages/03/39/e4e5832820131ba424092b9610d996b37e5557180f8e2d6aebb05c31ae54/numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", size = 17861032 }, + { url = "https://files.pythonhosted.org/packages/5f/8a/3794313acbf5e70df2d5c7d2aba8718676f8d054a05abe59e48417fb2981/numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", size = 6274018 }, + { url = "https://files.pythonhosted.org/packages/17/c1/c31d3637f2641e25c7a19adf2ae822fdaf4ddd198b05d79a92a9ce7cb63e/numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", size = 12613843 }, + { url = "https://files.pythonhosted.org/packages/20/d6/91a26e671c396e0c10e327b763485ee295f5a5a7a48c553f18417e5a0ed5/numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", size = 20896464 }, + { url = "https://files.pythonhosted.org/packages/8c/40/5792ccccd91d45e87d9e00033abc4f6ca8a828467b193f711139ff1f1cd9/numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", size = 14111350 }, + { url = "https://files.pythonhosted.org/packages/c0/2a/fb0a27f846cb857cef0c4c92bef89f133a3a1abb4e16bba1c4dace2e9b49/numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", size = 5111629 }, + { url = "https://files.pythonhosted.org/packages/eb/e5/8e81bb9d84db88b047baf4e8b681a3e48d6390bc4d4e4453eca428ecbb49/numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", size = 6645865 }, + { url = "https://files.pythonhosted.org/packages/7a/1a/a90ceb191dd2f9e2897c69dde93ccc2d57dd21ce2acbd7b0333e8eea4e8d/numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", size = 14043508 }, + { url = "https://files.pythonhosted.org/packages/f1/5a/e572284c86a59dec0871a49cd4e5351e20b9c751399d5f1d79628c0542cb/numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", size = 16094100 }, + { url = "https://files.pythonhosted.org/packages/0c/2c/a79d24f364788386d85899dd280a94f30b0950be4b4a545f4fa4ed1d4ca7/numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", size = 15239691 }, + { url = "https://files.pythonhosted.org/packages/cf/79/1e20fd1c9ce5a932111f964b544facc5bb9bde7865f5b42f00b4a6a9192b/numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", size = 17856571 }, + { url = "https://files.pythonhosted.org/packages/be/5b/cc155e107f75d694f562bdc84a26cc930569f3dfdfbccb3420b626065777/numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", size = 6270841 }, + { url = "https://files.pythonhosted.org/packages/44/be/0e5cd009d2162e4138d79a5afb3b5d2341f0fe4777ab6e675aa3d4a42e21/numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", size = 12606618 }, + { url = "https://files.pythonhosted.org/packages/a8/87/04ddf02dd86fb17c7485a5f87b605c4437966d53de1e3745d450343a6f56/numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", size = 20921004 }, + { url = "https://files.pythonhosted.org/packages/6e/3e/d0e9e32ab14005425d180ef950badf31b862f3839c5b927796648b11f88a/numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", size = 14119910 }, + { url = "https://files.pythonhosted.org/packages/b5/5b/aa2d1905b04a8fb681e08742bb79a7bddfc160c7ce8e1ff6d5c821be0236/numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", size = 5153612 }, + { url = "https://files.pythonhosted.org/packages/ce/35/6831808028df0648d9b43c5df7e1051129aa0d562525bacb70019c5f5030/numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", size = 6668401 }, + { url = "https://files.pythonhosted.org/packages/b1/38/10ef509ad63a5946cc042f98d838daebfe7eaf45b9daaf13df2086b15ff9/numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", size = 14014198 }, + { url = "https://files.pythonhosted.org/packages/df/f8/c80968ae01df23e249ee0a4487fae55a4c0fe2f838dfe9cc907aa8aea0fa/numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", size = 16076211 }, + { url = "https://files.pythonhosted.org/packages/09/69/05c169376016a0b614b432967ac46ff14269eaffab80040ec03ae1ae8e2c/numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", size = 15220266 }, + { url = "https://files.pythonhosted.org/packages/f1/ff/94a4ce67ea909f41cf7ea712aebbe832dc67decad22944a1020bb398a5ee/numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", size = 17852844 }, + { url = "https://files.pythonhosted.org/packages/46/72/8a5dbce4020dfc595592333ef2fbb0a187d084ca243b67766d29d03e0096/numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", size = 6326007 }, + { url = "https://files.pythonhosted.org/packages/7b/9c/4fce9cf39dde2562584e4cfd351a0140240f82c0e3569ce25a250f47037d/numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", size = 12693107 }, ] [[package]] @@ -863,11 +863,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, ] [[package]] From de64f8a3cd02c709579dea1c60e0d4acb0da999e Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 23 Dec 2024 11:14:51 +0100 Subject: [PATCH 098/138] Fix left over after renameing base station to station (#719) --- deebot_client/capabilities.py | 6 ++--- deebot_client/events/__init__.py | 2 +- deebot_client/hardware/deebot/buom7k.py | 32 +++++++++++----------- deebot_client/hardware/deebot/p95mgv.py | 36 ++++++++++++------------- deebot_client/hardware/deebot/qhe2o2.py | 32 +++++++++++----------- 5 files changed, 54 insertions(+), 54 deletions(-) diff --git a/deebot_client/capabilities.py b/deebot_client/capabilities.py index 6a93c765..8efd0dc8 100644 --- a/deebot_client/capabilities.py +++ b/deebot_client/capabilities.py @@ -218,8 +218,8 @@ class CapabilitySettings: @dataclass(frozen=True, kw_only=True) -class CapabilityBaseStation: - """Capabilities for the base station.""" +class CapabilityStation: + """Capabilities for the station.""" action: CapabilityExecuteTypes[StationAction] auto_empty: CapabilitySetTypes[ @@ -237,7 +237,6 @@ class Capabilities(ABC): device_type: DeviceType = field(kw_only=False) availability: CapabilityEvent[AvailabilityEvent] - base_station: CapabilityBaseStation | None = None battery: CapabilityEvent[BatteryEvent] charge: CapabilityExecute[[]] clean: CapabilityClean @@ -252,6 +251,7 @@ class Capabilities(ABC): play_sound: CapabilityExecute[[]] settings: CapabilitySettings state: CapabilityEvent[StateEvent] + station: CapabilityStation | None = None stats: CapabilityStats water: ( CapabilitySetTypes[WaterInfoEvent, [WaterAmount | str], WaterAmount] | None diff --git a/deebot_client/events/__init__.py b/deebot_client/events/__init__.py index 74d636f6..03a93f0a 100644 --- a/deebot_client/events/__init__.py +++ b/deebot_client/events/__init__.py @@ -166,7 +166,7 @@ def from_xml(cls, value: str) -> LifeSpan: STRAINER = "strainer", "Strainer" HAND_FILTER = "handFilter", "HandFilter" DUST_CASE_HEAP = "dustCaseHeap", "DustCaseHeap" - BASE_STATION_FILTER = "spHeap", "SpHeap" + STATION_FILTER = "spHeap", "SpHeap" @dataclass(frozen=True) diff --git a/deebot_client/hardware/deebot/buom7k.py b/deebot_client/hardware/deebot/buom7k.py index 614850fe..9f8a186a 100644 --- a/deebot_client/hardware/deebot/buom7k.py +++ b/deebot_client/hardware/deebot/buom7k.py @@ -4,7 +4,6 @@ from deebot_client.capabilities import ( Capabilities, - CapabilityBaseStation, CapabilityClean, CapabilityCleanAction, CapabilityCustomCommand, @@ -17,6 +16,7 @@ CapabilitySetEnable, CapabilitySettings, CapabilitySetTypes, + CapabilityStation, CapabilityStats, DeviceType, ) @@ -101,21 +101,6 @@ availability=CapabilityEvent( AvailabilityEvent, [GetBattery(is_available_check=True)] ), - base_station=CapabilityBaseStation( - action=CapabilityExecuteTypes( - station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) - ), - auto_empty=CapabilitySetTypes( - event=AutoEmptyEvent, - get=[GetAutoEmpty()], - set=SetAutoEmpty, - types=( - auto_empty.Frequency.AUTO, - auto_empty.Frequency.SMART, - ), - ), - state=CapabilityEvent(StationEvent, [GetStationState()]), - ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), charge=CapabilityExecute(Charge), clean=CapabilityClean( @@ -193,6 +178,21 @@ volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), ), state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfoV2()]), + station=CapabilityStation( + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, + ), + ), + state=CapabilityEvent(StationEvent, [GetStationState()]), + ), stats=CapabilityStats( clean=CapabilityEvent(StatsEvent, [GetStats()]), report=CapabilityEvent(ReportStatsEvent, []), diff --git a/deebot_client/hardware/deebot/p95mgv.py b/deebot_client/hardware/deebot/p95mgv.py index 660e44bb..8b0aeca8 100644 --- a/deebot_client/hardware/deebot/p95mgv.py +++ b/deebot_client/hardware/deebot/p95mgv.py @@ -4,7 +4,6 @@ from deebot_client.capabilities import ( Capabilities, - CapabilityBaseStation, CapabilityClean, CapabilityCleanAction, CapabilityCustomCommand, @@ -17,6 +16,7 @@ CapabilitySetEnable, CapabilitySettings, CapabilitySetTypes, + CapabilityStation, CapabilityStats, DeviceType, ) @@ -119,23 +119,6 @@ availability=CapabilityEvent( AvailabilityEvent, [GetBattery(is_available_check=True)] ), - base_station=CapabilityBaseStation( - action=CapabilityExecuteTypes( - station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) - ), - auto_empty=CapabilitySetTypes( - event=auto_empty.AutoEmptyEvent, - get=[GetAutoEmpty()], - set=SetAutoEmpty, - types=( - auto_empty.Frequency.MIN_10, - auto_empty.Frequency.MIN_15, - auto_empty.Frequency.MIN_25, - auto_empty.Frequency.AUTO, - ), - ), - state=CapabilityEvent(StationEvent, [GetStationState()]), - ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), charge=CapabilityExecute(Charge), clean=CapabilityClean( @@ -231,6 +214,23 @@ volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), ), state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + station=CapabilityStation( + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), + auto_empty=CapabilitySetTypes( + event=auto_empty.AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.MIN_10, + auto_empty.Frequency.MIN_15, + auto_empty.Frequency.MIN_25, + auto_empty.Frequency.AUTO, + ), + ), + state=CapabilityEvent(StationEvent, [GetStationState()]), + ), stats=CapabilityStats( clean=CapabilityEvent(StatsEvent, [GetStats()]), report=CapabilityEvent(ReportStatsEvent, []), diff --git a/deebot_client/hardware/deebot/qhe2o2.py b/deebot_client/hardware/deebot/qhe2o2.py index 9ffda83d..c5d146f9 100644 --- a/deebot_client/hardware/deebot/qhe2o2.py +++ b/deebot_client/hardware/deebot/qhe2o2.py @@ -4,7 +4,6 @@ from deebot_client.capabilities import ( Capabilities, - CapabilityBaseStation, CapabilityClean, CapabilityCleanAction, CapabilityCustomCommand, @@ -17,6 +16,7 @@ CapabilitySetEnable, CapabilitySettings, CapabilitySetTypes, + CapabilityStation, CapabilityStats, DeviceType, ) @@ -102,21 +102,6 @@ AvailabilityEvent, [GetBattery(is_available_check=True)] ), battery=CapabilityEvent(BatteryEvent, [GetBattery()]), - base_station=CapabilityBaseStation( - action=CapabilityExecuteTypes( - station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) - ), - auto_empty=CapabilitySetTypes( - event=AutoEmptyEvent, - get=[GetAutoEmpty()], - set=SetAutoEmpty, - types=( - auto_empty.Frequency.AUTO, - auto_empty.Frequency.SMART, - ), - ), - state=CapabilityEvent(StationEvent, [GetStationState()]), - ), charge=CapabilityExecute(Charge), clean=CapabilityClean( action=CapabilityCleanAction(command=CleanV2, area=CleanAreaV2), @@ -193,6 +178,21 @@ volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), ), state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfoV2()]), + station=CapabilityStation( + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, + ), + ), + state=CapabilityEvent(StationEvent, [GetStationState()]), + ), stats=CapabilityStats( clean=CapabilityEvent(StatsEvent, [GetStats()]), report=CapabilityEvent(ReportStatsEvent, []), From 5d1c7fbee0ab1db885ac9a33b11a9c1206d8c69b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Dec 2024 12:14:08 +0100 Subject: [PATCH 099/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pylint=20to=20v3.3.3=20(#722)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 441672fb..013aa92c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dev-dependencies = [ "mypy==1.14.0", "pre-commit==4.0.1", "pycountry==24.6.1", - "pylint==3.3.2", + "pylint==3.3.3", "pytest-asyncio==0.25.0", "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", diff --git a/uv.lock b/uv.lock index f3911e2a..513deb54 100644 --- a/uv.lock +++ b/uv.lock @@ -83,11 +83,11 @@ wheels = [ [[package]] name = "astroid" -version = "3.3.7" +version = "3.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/f6/7725404e3dcaeafe695d4fe42ad99eefbcba4cad2c83ca122e6b439c9f96/astroid-3.3.7.tar.gz", hash = "sha256:29fe1df7ef64dc17a54dbfad67b40b445340fcdba7c4012e7ecc9270c9b2f5b6", size = 398091 } +sdist = { url = "https://files.pythonhosted.org/packages/80/c5/5c83c48bbf547f3dd8b587529db7cf5a265a3368b33e85e76af8ff6061d3/astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b", size = 398196 } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/0b/ef3a51abbf2064ac50447a02d1cd14c1f008590e96f780042c21108b6b56/astroid-3.3.7-py3-none-any.whl", hash = "sha256:e1ea2c358a3c760ef583d4963e773100fa2c693b27ed158a1d0e81adb4436903", size = 275125 }, + { url = "https://files.pythonhosted.org/packages/07/28/0bc8a17d6cd4cc3c79ae41b7105a2b9a327c110e5ddd37a8a27b29a5c8a2/astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c", size = 275153 }, ] [[package]] @@ -259,7 +259,7 @@ dev = [ { name = "mypy", specifier = "==1.14.0" }, { name = "pre-commit", specifier = "==4.0.1" }, { name = "pycountry", specifier = "==24.6.1" }, - { name = "pylint", specifier = "==3.3.2" }, + { name = "pylint", specifier = "==3.3.3" }, { name = "pytest", specifier = "==8.3.4" }, { name = "pytest-asyncio", specifier = "==0.25.0" }, { name = "pytest-cov", specifier = "==6.0.0" }, @@ -665,7 +665,7 @@ wheels = [ [[package]] name = "pylint" -version = "3.3.2" +version = "3.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "astroid" }, @@ -676,9 +676,9 @@ dependencies = [ { name = "platformdirs" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/d8/4471b2cb4ad18b4af717918c468209bd2bd5a02c52f60be5ee8a71b5af2c/pylint-3.3.2.tar.gz", hash = "sha256:9ec054ec992cd05ad30a6df1676229739a73f8feeabf3912c995d17601052b01", size = 1516485 } +sdist = { url = "https://files.pythonhosted.org/packages/17/fd/e9a739afac274a39596bbe562e9d966db6f3917fdb2bd7322ffc56da0ba2/pylint-3.3.3.tar.gz", hash = "sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a", size = 1516550 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/55/5eaf6c415f6ddb09b9b039278823a8e27fb81ea7a34ec80c6d9223b17f2e/pylint-3.3.2-py3-none-any.whl", hash = "sha256:77f068c287d49b8683cd7c6e624243c74f92890f767f106ffa1ddf3c0a54cb7a", size = 521873 }, + { url = "https://files.pythonhosted.org/packages/91/e1/26d55acea92b1ea4d33672e48f09ceeb274e84d7d542a4fb9a32a556db46/pylint-3.3.3-py3-none-any.whl", hash = "sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183", size = 521918 }, ] [[package]] From ea1d045015ef15fea3315aaec0221816b64c60d6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 28 Dec 2024 11:28:21 +0100 Subject: [PATCH 100/138] [pre-commit.ci] pre-commit autoupdate (#721) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 16abd505..44da71b6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.3 + rev: v0.8.4 hooks: - id: ruff args: @@ -19,7 +19,7 @@ repos: - --unsafe-fixes - id: ruff-format - repo: https://github.com/asottile/pyupgrade - rev: v3.19.0 + rev: v3.19.1 hooks: - id: pyupgrade args: From 44e510c269457419040ef1e567ec6ae22848856d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Dec 2024 10:32:06 +0000 Subject: [PATCH 101/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20python=20?= =?UTF-8?q?Docker=20tag=20to=20v3.13=20(#692)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Robert Resch --- .python-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.python-version b/.python-version index 77fdc6bb..3a4f41ef 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.13.0 \ No newline at end of file +3.13 \ No newline at end of file From f4c1f92cf7e08f693869290e406aef804c108a1b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 08:34:08 +0100 Subject: [PATCH 102/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pytest-asyncio=20to=20v0.25.1=20(#732)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 013aa92c..71202782 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ dev-dependencies = [ "pre-commit==4.0.1", "pycountry==24.6.1", "pylint==3.3.3", - "pytest-asyncio==0.25.0", + "pytest-asyncio==0.25.1", "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", "pytest-timeout==2.3.1", diff --git a/uv.lock b/uv.lock index 513deb54..9e73b95a 100644 --- a/uv.lock +++ b/uv.lock @@ -261,7 +261,7 @@ dev = [ { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.3" }, { name = "pytest", specifier = "==8.3.4" }, - { name = "pytest-asyncio", specifier = "==0.25.0" }, + { name = "pytest-asyncio", specifier = "==0.25.1" }, { name = "pytest-cov", specifier = "==6.0.0" }, { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, { name = "pytest-timeout", specifier = "==2.3.1" }, @@ -698,14 +698,14 @@ wheels = [ [[package]] name = "pytest-asyncio" -version = "0.25.0" +version = "0.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/18/82fcb4ee47d66d99f6cd1efc0b11b2a25029f303c599a5afda7c1bca4254/pytest_asyncio-0.25.0.tar.gz", hash = "sha256:8c0610303c9e0442a5db8604505fc0f545456ba1528824842b37b4a626cbf609", size = 53298 } +sdist = { url = "https://files.pythonhosted.org/packages/4b/04/0477a4bdd176ad678d148c075f43620b3f7a060ff61c7da48500b1fa8a75/pytest_asyncio-0.25.1.tar.gz", hash = "sha256:79be8a72384b0c917677e00daa711e07db15259f4d23203c59012bcd989d4aee", size = 53760 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/56/2ee0cab25c11d4e38738a2a98c645a8f002e2ecf7b5ed774c70d53b92bb1/pytest_asyncio-0.25.0-py3-none-any.whl", hash = "sha256:db5432d18eac6b7e28b46dcd9b69921b55c3b1086e85febfe04e70b18d9e81b3", size = 19245 }, + { url = "https://files.pythonhosted.org/packages/81/fb/efc7226b384befd98d0e00d8c4390ad57f33c8fde00094b85c5e07897def/pytest_asyncio-0.25.1-py3-none-any.whl", hash = "sha256:c84878849ec63ff2ca509423616e071ef9cd8cc93c053aa33b5b8fb70a990671", size = 19357 }, ] [[package]] From 200e347234e1356a59dff6bcda11b16367418c13 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 08:34:29 +0100 Subject: [PATCH 103/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20mypy=20to=20v1.14.1=20(#728)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 32 +++++++++++++++++--------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 71202782..eb626143 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ version = "0.0.0" [tool.uv] dev-dependencies = [ - "mypy==1.14.0", + "mypy==1.14.1", "pre-commit==4.0.1", "pycountry==24.6.1", "pylint==3.3.3", diff --git a/uv.lock b/uv.lock index 9e73b95a..262d00cd 100644 --- a/uv.lock +++ b/uv.lock @@ -256,7 +256,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "mypy", specifier = "==1.14.0" }, + { name = "mypy", specifier = "==1.14.1" }, { name = "pre-commit", specifier = "==4.0.1" }, { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.3" }, @@ -446,25 +446,27 @@ wheels = [ [[package]] name = "mypy" -version = "1.14.0" +version = "1.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/7b/08046ef9330735f536a09a2e31b00f42bccdb2795dcd979636ba43bb2d63/mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6", size = 3215684 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/d8/0e72175ee0253217f5c44524f5e95251c02e95ba9749fb87b0e2074d203a/mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd", size = 11269011 }, - { url = "https://files.pythonhosted.org/packages/e9/6d/4ea13839dabe5db588dc6a1b766da16f420d33cf118a7b7172cdf6c7fcb2/mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1", size = 10253076 }, - { url = "https://files.pythonhosted.org/packages/3e/38/7db2c5d0f4d290e998f7a52b2e2616c7bbad96b8e04278ab09d11978a29e/mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63", size = 12862786 }, - { url = "https://files.pythonhosted.org/packages/bf/4b/62d59c801b34141040989949c2b5c157d0408b45357335d3ec5b2845b0f6/mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d", size = 12971568 }, - { url = "https://files.pythonhosted.org/packages/f1/9c/e0f281b32d70c87b9e4d2939e302b1ff77ada4d7b0f2fb32890c144bc1d6/mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba", size = 9879477 }, - { url = "https://files.pythonhosted.org/packages/13/33/8380efd0ebdfdfac7fc0bf065f03a049800ca1e6c296ec1afc634340d992/mypy-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9f6f4c0b27401d14c483c622bc5105eff3911634d576bbdf6695b9a7c1ba741", size = 11251509 }, - { url = "https://files.pythonhosted.org/packages/15/6d/4e1c21c60fee11af7d8e4f2902a29886d1387d6a836be16229eb3982a963/mypy-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b2280cedcb312c7a79f5001ae5325582d0d339bce684e4a529069d0e7ca1e7", size = 10244282 }, - { url = "https://files.pythonhosted.org/packages/8b/cf/7a8ae5c0161edae15d25c2c67c68ce8b150cbdc45aefc13a8be271ee80b2/mypy-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8", size = 12867676 }, - { url = "https://files.pythonhosted.org/packages/9c/d0/71f7bbdcc7cfd0f2892db5b13b1e8857673f2cc9e0c30e3e4340523dc186/mypy-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc", size = 12964189 }, - { url = "https://files.pythonhosted.org/packages/a7/40/fb4ad65d6d5f8c51396ecf6305ec0269b66013a5bf02d0e9528053640b4a/mypy-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f", size = 9888247 }, - { url = "https://files.pythonhosted.org/packages/39/32/0214608af400cdf8f5102144bb8af10d880675c65ed0b58f7e0e77175d50/mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab", size = 2752803 }, +sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 }, + { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 }, + { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 }, + { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 }, + { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 }, + { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 }, + { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 }, + { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 }, + { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 }, + { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 }, + { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 }, + { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 }, + { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 }, ] [[package]] From 835184594a2469c209c0a933df05185d74c76e4a Mon Sep 17 00:00:00 2001 From: David Roe Date: Wed, 1 Jan 2025 23:35:55 -0800 Subject: [PATCH 104/138] Add T30S Combo support (#730) --- deebot_client/hardware/deebot/4bdkrs.py | 273 ++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 deebot_client/hardware/deebot/4bdkrs.py diff --git a/deebot_client/hardware/deebot/4bdkrs.py b/deebot_client/hardware/deebot/4bdkrs.py new file mode 100644 index 00000000..1e75fb77 --- /dev/null +++ b/deebot_client/hardware/deebot/4bdkrs.py @@ -0,0 +1,273 @@ +"""Deebot DEEBOT T30S COMBO Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityExecuteTypes, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStation, + CapabilityStats, + DeviceType, +) +from deebot_client.commands import StationAction +from deebot_client.commands.json import station_action +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.child_lock import GetChildLock, SetChildLock +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.efficiency import GetEfficiencyMode, SetEfficiencyMode +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.ota import GetOta, SetOta +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.station_state import GetStationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.sweep_mode import GetSweepMode, SetSweepMode +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.voice_assistant_state import ( + GetVoiceAssistantState, + SetVoiceAssistantState, +) +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + ChildLockEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + EfficiencyModeEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + OtaEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StationEvent, + StatsEvent, + SweepModeEvent, + TotalStatsEvent, + TrueDetectEvent, + VoiceAssistantStateEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, + WorkMode, + WorkModeEvent, + auto_empty, +) +from deebot_client.events.auto_empty import AutoEmptyEvent +from deebot_client.events.efficiency_mode import EfficiencyMode +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + work_mode=CapabilitySetTypes( + event=WorkModeEvent, + get=[GetWorkMode()], + set=SetWorkMode, + types=( + WorkMode.MOP, + WorkMode.MOP_AFTER_VACUUM, + WorkMode.VACUUM, + WorkMode.VACUUM_AND_MOP, + ), + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.HAND_FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.HAND_FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + child_lock=CapabilitySetEnable( + ChildLockEvent, [GetChildLock()], SetChildLock + ), + efficiency_mode=CapabilitySetTypes( + event=EfficiencyModeEvent, + get=[GetEfficiencyMode()], + set=SetEfficiencyMode, + types=( + EfficiencyMode.ENERGY_EFFICIENT_MODE, + EfficiencyMode.STANDARD_MODE, + ), + ), + ota=CapabilitySetEnable(OtaEvent, [GetOta()], SetOta), + sweep_mode=CapabilitySetEnable( + SweepModeEvent, [GetSweepMode()], SetSweepMode + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + voice_assistant=CapabilitySetEnable( + VoiceAssistantStateEvent, + [GetVoiceAssistantState()], + SetVoiceAssistantState, + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + station=CapabilityStation( + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, + ), + ), + state=CapabilityEvent(StationEvent, [GetStationState()]), + ), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +) From 253a6271c9353125215e98fb7fdfffbf3603ec6d Mon Sep 17 00:00:00 2001 From: florianbosshard Date: Thu, 2 Jan 2025 08:36:57 +0100 Subject: [PATCH 105/138] Added support for N20e (#731) --- deebot_client/hardware/deebot/zgsvkq.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/zgsvkq.py diff --git a/deebot_client/hardware/deebot/zgsvkq.py b/deebot_client/hardware/deebot/zgsvkq.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/zgsvkq.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file From 24bfe87808272dc99b097a83ec2500dd01b563b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 09:30:40 +0100 Subject: [PATCH 106/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#727)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 140 +++++++++++++++++++++++++++----------------------------- 1 file changed, 68 insertions(+), 72 deletions(-) diff --git a/uv.lock b/uv.lock index 262d00cd..0199d9a5 100644 --- a/uv.lock +++ b/uv.lock @@ -128,41 +128,37 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, - { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, - { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, - { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, - { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, - { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, - { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, - { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, - { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, - { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, - { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, - { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, - { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, - { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, - { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, - { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, - { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, - { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, - { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, - { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, - { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, - { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, - { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, - { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, - { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, - { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, - { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, - { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, - { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, - { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, - { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, ] [[package]] @@ -176,40 +172,40 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5b/d2/c25011f4d036cf7e8acbbee07a8e09e9018390aee25ba085596c4b83d510/coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", size = 801710 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/52/b16af8989a2daf0f80a88522bd8e8eed90b5fcbdecf02a6888f3e80f6ba7/coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", size = 207325 }, - { url = "https://files.pythonhosted.org/packages/0f/79/6b7826fca8846c1216a113227b9f114ac3e6eacf168b4adcad0cb974aaca/coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", size = 207563 }, - { url = "https://files.pythonhosted.org/packages/a7/07/0bc73da0ccaf45d0d64ef86d33b7d7fdeef84b4c44bf6b85fb12c215c5a6/coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", size = 240580 }, - { url = "https://files.pythonhosted.org/packages/71/8a/9761f409910961647d892454687cedbaccb99aae828f49486734a82ede6e/coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3", size = 237613 }, - { url = "https://files.pythonhosted.org/packages/8b/10/ee7d696a17ac94f32f2dbda1e17e730bf798ae9931aec1fc01c1944cd4de/coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", size = 239684 }, - { url = "https://files.pythonhosted.org/packages/16/60/aa1066040d3c52fff051243c2d6ccda264da72dc6d199d047624d395b2b2/coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", size = 239112 }, - { url = "https://files.pythonhosted.org/packages/4e/e5/69f35344c6f932ba9028bf168d14a79fedb0dd4849b796d43c81ce75a3c9/coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", size = 237428 }, - { url = "https://files.pythonhosted.org/packages/32/20/adc895523c4a28f63441b8ac645abd74f9bdd499d2d175bef5b41fc7f92d/coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", size = 239098 }, - { url = "https://files.pythonhosted.org/packages/a9/a6/e0e74230c9bb3549ec8ffc137cfd16ea5d56e993d6bffed2218bff6187e3/coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", size = 209940 }, - { url = "https://files.pythonhosted.org/packages/3e/18/cb5b88349d4aa2f41ec78d65f92ea32572b30b3f55bc2b70e87578b8f434/coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", size = 210726 }, - { url = "https://files.pythonhosted.org/packages/35/26/9abab6539d2191dbda2ce8c97b67d74cbfc966cc5b25abb880ffc7c459bc/coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", size = 207356 }, - { url = "https://files.pythonhosted.org/packages/44/da/d49f19402240c93453f606e660a6676a2a1fbbaa6870cc23207790aa9697/coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", size = 207614 }, - { url = "https://files.pythonhosted.org/packages/da/e6/93bb9bf85497816082ec8da6124c25efa2052bd4c887dd3b317b91990c9e/coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", size = 240129 }, - { url = "https://files.pythonhosted.org/packages/df/65/6a824b9406fe066835c1274a9949e06f084d3e605eb1a602727a27ec2fe3/coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", size = 237276 }, - { url = "https://files.pythonhosted.org/packages/9f/79/6c7a800913a9dd23ac8c8da133ebb556771a5a3d4df36b46767b1baffd35/coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", size = 239267 }, - { url = "https://files.pythonhosted.org/packages/57/e7/834d530293fdc8a63ba8ff70033d5182022e569eceb9aec7fc716b678a39/coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", size = 238887 }, - { url = "https://files.pythonhosted.org/packages/15/05/ec9d6080852984f7163c96984444e7cd98b338fd045b191064f943ee1c08/coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", size = 236970 }, - { url = "https://files.pythonhosted.org/packages/0a/d8/775937670b93156aec29f694ce37f56214ed7597e1a75b4083ee4c32121c/coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", size = 238831 }, - { url = "https://files.pythonhosted.org/packages/f4/58/88551cb7fdd5ec98cb6044e8814e38583436b14040a5ece15349c44c8f7c/coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", size = 210000 }, - { url = "https://files.pythonhosted.org/packages/b7/12/cfbf49b95120872785ff8d56ab1c7fe3970a65e35010c311d7dd35c5fd00/coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", size = 210753 }, - { url = "https://files.pythonhosted.org/packages/7c/68/c1cb31445599b04bde21cbbaa6d21b47c5823cdfef99eae470dfce49c35a/coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", size = 208091 }, - { url = "https://files.pythonhosted.org/packages/11/73/84b02c6b19c4a11eb2d5b5eabe926fb26c21c080e0852f5e5a4f01165f9e/coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", size = 208369 }, - { url = "https://files.pythonhosted.org/packages/de/e0/ae5d878b72ff26df2e994a5c5b1c1f6a7507d976b23beecb1ed4c85411ef/coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", size = 251089 }, - { url = "https://files.pythonhosted.org/packages/ab/9c/0aaac011aef95a93ef3cb2fba3fde30bc7e68a6635199ed469b1f5ea355a/coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", size = 246806 }, - { url = "https://files.pythonhosted.org/packages/f8/19/4d5d3ae66938a7dcb2f58cef3fa5386f838f469575b0bb568c8cc9e3a33d/coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", size = 249164 }, - { url = "https://files.pythonhosted.org/packages/b3/0b/4ee8a7821f682af9ad440ae3c1e379da89a998883271f088102d7ca2473d/coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", size = 248642 }, - { url = "https://files.pythonhosted.org/packages/8a/12/36ff1d52be18a16b4700f561852e7afd8df56363a5edcfb04cf26a0e19e0/coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", size = 246516 }, - { url = "https://files.pythonhosted.org/packages/43/d0/8e258f6c3a527c1655602f4f576215e055ac704de2d101710a71a2affac2/coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", size = 247783 }, - { url = "https://files.pythonhosted.org/packages/a9/0d/1e4a48d289429d38aae3babdfcadbf35ca36bdcf3efc8f09b550a845bdb5/coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", size = 210646 }, - { url = "https://files.pythonhosted.org/packages/26/74/b0729f196f328ac55e42b1e22ec2f16d8bcafe4b8158a26ec9f1cdd1d93e/coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", size = 211815 }, +version = "7.6.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 }, + { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 }, + { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 }, + { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 }, + { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 }, + { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 }, + { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 }, + { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 }, + { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 }, + { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 }, + { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, + { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, + { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, + { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, + { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, + { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, + { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, + { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, + { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, + { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, + { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, + { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, + { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, + { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, + { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, + { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, + { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, + { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, + { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, + { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, ] [[package]] @@ -362,11 +358,11 @@ wheels = [ [[package]] name = "identify" -version = "2.6.3" +version = "2.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1a/5f/05f0d167be94585d502b4adf8c7af31f1dc0b1c7e14f9938a88fdbbcf4a7/identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02", size = 99179 } +sdist = { url = "https://files.pythonhosted.org/packages/49/a5/7de3053524ee006b91099968d7ecb2e0b420f7ae728094394c33e8a2a2b9/identify-2.6.4.tar.gz", hash = "sha256:285a7d27e397652e8cafe537a6cc97dd470a970f48fb2e9d979aa38eae5513ac", size = 99209 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/f5/09644a3ad803fae9eca8efa17e1f2aef380c7f0b02f7ec4e8d446e51d64a/identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd", size = 99049 }, + { url = "https://files.pythonhosted.org/packages/a2/9d/52f036403ae86474804f699c0d084b4b071e333a390b20269bb8accc65e0/identify-2.6.4-py2.py3-none-any.whl", hash = "sha256:993b0f01b97e0568c179bb9196391ff391bfb88a99099dbf5ce392b68f42d0af", size = 99072 }, ] [[package]] From 5bf3f24defcf0b7d5e7f9fc21e894317a92d421a Mon Sep 17 00:00:00 2001 From: David Roe Date: Thu, 2 Jan 2025 08:50:28 -0800 Subject: [PATCH 107/138] Add .local/bin to devcontainer path to fix uv (#729) --- .devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer.json b/.devcontainer.json index c2c30044..109fc735 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -54,7 +54,7 @@ "postCreateCommand": "curl -LsSf https://astral.sh/uv/install.sh | sh && uv sync --frozen --dev && pre-commit install", "postStartCommand": "uv sync --dev", "remoteEnv": { - "PATH": "/home/vscode/.cargo/bin:/workspaces/client.py/.venv/bin:${containerEnv:PATH}" + "PATH": "/home/vscode/.local/bin:/home/vscode/.cargo/bin:/workspaces/client.py/.venv/bin:${containerEnv:PATH}" }, // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. "remoteUser": "vscode", From d8fb08079e313dae712a9ee11abbe6c2fe9ec99a Mon Sep 17 00:00:00 2001 From: myhomeiot <70070601+myhomeiot@users.noreply.github.com> Date: Thu, 2 Jan 2025 18:59:16 +0200 Subject: [PATCH 108/138] Add DEEBOT T8 AIVI + (vdehg6) (#725) * Add DEEBOT T8 AIVI + (vdehg6) Device "DEEBOT T8 AIVI +" not supported. Device class "vdehg6" not recognized. {'did': '[REMOVED]', 'name': '[REMOVED]', 'class': 'vdehg6', 'resource': 'XxT8', 'company': 'eco-ng', 'bindTs': [REMOVED], 'service': {'jmq': 'jmq-ngiot-cn.dc.cn.ecouser.net', 'mqs': 'api-ngiot.dc-cn.cn.ecouser.net'}, 'deviceName': 'DEEBOT T8 AIVI +', 'icon': 'https://portal.ecouser.net/api/pim/file/get/604efe2f0edcb000094199b6', 'ota': True, 'UILogicId': 'DX_AI', 'materialNo': '[REMOVED]', 'pid': '[REMOVED]', 'product_category': 'DEEBOT', 'model': 'DXAIS', 'updateInfo': {'needUpdate': False, 'changeLog': ''}, 'nick': '[REMOVED]', 'homeId': '[REMOVED]', 'homeSort': [REMOVED], 'status': 1, 'otaUpgrade': {}} * fix symlink --------- Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/vdehg6.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/vdehg6.py diff --git a/deebot_client/hardware/deebot/vdehg6.py b/deebot_client/hardware/deebot/vdehg6.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/vdehg6.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file From 4ca414f8416eff5163f3d13b4203bef8fa5e006a Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 3 Jan 2025 19:34:45 +0100 Subject: [PATCH 109/138] Remove main branch (#734) --- .github/workflows/ci.yml | 1 - .github/workflows/codeql-analysis.yml | 1 - .github/workflows/release-drafter.yml | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0af8e8ee..bc25af8c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,7 +3,6 @@ name: CI on: push: branches: - - main - dev pull_request: diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9d651b04..7aa3de79 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -14,7 +14,6 @@ name: "CodeQL" on: push: branches: - - main - dev pull_request: schedule: diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index a9eb7276..148c3aba 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -3,7 +3,7 @@ name: Release Drafter on: push: branches: - - main + - dev jobs: update_release_draft: From 3495ffd8d50c6b468581f6241b01533208b3cbfe Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 3 Jan 2025 19:58:16 +0100 Subject: [PATCH 110/138] Move decompress_7z_base64_data to rust (#723) * Move decompress_7z_base64_data to rust * Add error handling * go on * Fix setup * Fix typing * fix pylint * Enable renovate for rust --- .devcontainer.json | 5 +- .github/renovate.json | 4 + .github/workflows/ci.yml | 2 +- .github/workflows/python-publish.yml | 1 + .gitignore | 7 +- Cargo.lock | 201 +++++++++++++++++++++++++++ Cargo.toml | 15 ++ deebot_client/commands/json/map.py | 6 +- deebot_client/map.py | 8 +- deebot_client/rs.pyi | 2 + deebot_client/util/__init__.py | 18 --- pyproject.toml | 113 ++++++++------- scripts/setup.sh | 17 +++ src/lib.rs | 30 ++++ tests/commands/json/test_map.py | 2 +- tests/test_map.py | 2 +- tests/test_rs.py | 74 ++++++++++ uv.lock | 55 ++++++++ 18 files changed, 478 insertions(+), 84 deletions(-) create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 deebot_client/rs.pyi create mode 100755 scripts/setup.sh create mode 100644 src/lib.rs create mode 100644 tests/test_rs.py diff --git a/.devcontainer.json b/.devcontainer.json index 109fc735..fd360689 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -44,14 +44,15 @@ }, // Add the IDs of extensions you want installed when the container is created. "features": { - "ghcr.io/devcontainers/features/docker-in-docker:2": {} + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/rust:1": {} }, "image": "mcr.microsoft.com/devcontainers/base:debian", "name": "Deebot client", // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "curl -LsSf https://astral.sh/uv/install.sh | sh && uv sync --frozen --dev && pre-commit install", + "postCreateCommand": "scripts/setup.sh", "postStartCommand": "uv sync --dev", "remoteEnv": { "PATH": "/home/vscode/.local/bin:/home/vscode/.cargo/bin:/workspaces/client.py/.venv/bin:${containerEnv:PATH}" diff --git a/.github/renovate.json b/.github/renovate.json index 84485db0..b804995e 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -21,6 +21,10 @@ "addLabels": ["github_actions"], "matchManagers": ["github-actions"], "rangeStrategy": "pin" + }, + { + "addLabels": ["rust"], + "matchManagers": ["cargo"] } ], "rebaseWhen": "behind-base-branch" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc25af8c..d198af21 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: run: uv run --frozen mypy deebot_client/ - name: Pylint review - run: uv run --frozen pylint deebot_client/ + run: uv run --frozen pylint deebot_client/**/*.py - name: Verify no getLogger usages run: scripts/check_getLogger.sh diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 612f2748..47ded734 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -32,6 +32,7 @@ jobs: - name: 🏗 Set package version run: | sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml + sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" cargo.toml - name: 📦 Build package run: uv build - name: 🚀 Publish to PyPi diff --git a/.gitignore b/.gitignore index bcc8c767..6b3890ec 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,9 @@ nosetests.xml .*_cache test.py -.env \ No newline at end of file +.env + +/target + +# rust so +*.cpython*.so \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..5a9c25a8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,201 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "deebot_client" +version = "0.0.0" +dependencies = [ + "base64", + "pyo3", + "rust-lzma", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "portable-atomic" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e484fd2c8b4cb67ab05a318f1fd6fa8f199fcc30819f08f07d200809dba26c15" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0e0469a84f208e20044b98965e1561028180219e35352a2afaf2b942beff3b" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1547a7f9966f6f1a0f0227564a9945fe36b90da5a93b3933fc3dc03fae372d" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb6da8ec6fa5cedd1626c886fc8749bdcbb09424a86461eb8cdf096b7c33257" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38a385202ff5a92791168b1136afae5059d3ac118457bb7bc304c197c2d33e7d" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rust-lzma" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d62915608f6cee1d7f2fc00f28b4f058ff79d6e4ec3c2fe0006b09b52437c84" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "syn" +version = "2.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "unindent" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..2d927b60 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "deebot_client" +version = "0.0.0" +edition = "2021" +authors = ["Robert Resch "] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "deebot_client" +crate-type = ["cdylib"] + +[dependencies] +base64 = "0.22.1" +pyo3 = "0.23.3" +rust-lzma = "0.6.0" diff --git a/deebot_client/commands/json/map.py b/deebot_client/commands/json/map.py index 514d4415..26155fb8 100644 --- a/deebot_client/commands/json/map.py +++ b/deebot_client/commands/json/map.py @@ -18,7 +18,7 @@ from deebot_client.events.map import CachedMapInfoEvent from deebot_client.logging_filter import get_logger from deebot_client.message import HandlingResult, HandlingState, MessageBodyDataDict -from deebot_client.util import decompress_7z_base64_data +from deebot_client.rs import decompress_7z_base64_data from .common import JsonCommandWithMessageHandling @@ -275,7 +275,7 @@ def _handle_body_data_dict( # This command is used by new and old bots if data.get("compress", 0) == 1: # Newer bot's return coordinates as base64 decoded string - coordinates = decompress_7z_base64_data(data["value"]).decode() + coordinates = decompress_7z_base64_data(data["value"]) else: # Older bot's return coordinates direct as comma/semicolon separated list coordinates = data["value"] @@ -305,7 +305,7 @@ def _get_subset_ids( ) -> list[int] | None: """Return subset ids.""" # subset is based64 7z compressed - subsets = json.loads(decompress_7z_base64_data(data["subsets"]).decode()) + subsets = json.loads(decompress_7z_base64_data(data["subsets"])) match data["type"]: case MapSetType.ROOMS: diff --git a/deebot_client/map.py b/deebot_client/map.py index 862b6e46..86ef1df2 100644 --- a/deebot_client/map.py +++ b/deebot_client/map.py @@ -35,10 +35,12 @@ from .exceptions import MapError from .logging_filter import get_logger from .models import Room +from .rs import ( + decompress_7z_base64_data, +) from .util import ( OnChangedDict, OnChangedList, - decompress_7z_base64_data, ) if TYPE_CHECKING: @@ -393,7 +395,7 @@ async def on_map_subset(event: MapSubsetEvent) -> None: def _update_trace_points(self, data: str) -> None: _LOGGER.debug("[_update_trace_points] Begin") - trace_points = decompress_7z_base64_data(data) + trace_points = decompress_7z_base64_data(data).encode() for i in range(0, len(trace_points), 5): position_x, position_y = struct.unpack(" Image.Image: def update_points(self, base64_data: str) -> None: """Add map piece points.""" - decoded = decompress_7z_base64_data(base64_data) + decoded = decompress_7z_base64_data(base64_data).encode() old_crc32 = self._crc32 self._crc32 = zlib.crc32(decoded) diff --git a/deebot_client/rs.pyi b/deebot_client/rs.pyi new file mode 100644 index 00000000..681c46c5 --- /dev/null +++ b/deebot_client/rs.pyi @@ -0,0 +1,2 @@ +def decompress_7z_base64_data(value: str) -> str: + """Decompress base64 decoded 7z compressed string.""" diff --git a/deebot_client/util/__init__.py b/deebot_client/util/__init__.py index b2693604..c6881c96 100644 --- a/deebot_client/util/__init__.py +++ b/deebot_client/util/__init__.py @@ -4,11 +4,9 @@ from abc import ABC import asyncio -import base64 from contextlib import suppress from enum import Enum import hashlib -import lzma from typing import TYPE_CHECKING, Any, TypeVar from deebot_client.logging_filter import get_logger @@ -37,22 +35,6 @@ def verify_required_class_variables_exists( raise ValueError(msg) -def decompress_7z_base64_data(data: str) -> bytes: - """Decompress base64 decoded 7z compressed string.""" - final_array = bytearray() - - # Decode Base64 - decoded = base64.b64decode(data) - - for i, idx in enumerate(decoded): - if i == 8: - final_array.extend(b"\x00\x00\x00\x00") - final_array.append(idx) - - dec = lzma.LZMADecompressor(lzma.FORMAT_AUTO, None, None) - return dec.decompress(final_array) - - def create_task( tasks: set[asyncio.Future[Any]], target: Coroutine[Any, Any, _T] ) -> asyncio.Task[_T]: diff --git a/pyproject.toml b/pyproject.toml index eb626143..80c91a6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,22 @@ [build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" +requires = ["maturin>=1.7,<2.0"] +build-backend = "maturin" [project] -name = "deebot-client" -license = "GPL-3.0-or-later" +name = "deebot-client" +license = "GPL-3.0-or-later" description = "Deebot client library in python 3" -readme = "README.md" -authors = [ - {name = "Robert Resch", email = "robert@resch.dev"} +readme = "README.md" +authors = [{ name = "Robert Resch", email = "robert@resch.dev" }] +keywords = [ + "home", + "automation", + "homeassistant", + "vacuum", + "robot", + "deebot", + "ecovacs", ] -keywords = ["home", "automation", "homeassistant", "vacuum", "robot", "deebot", "ecovacs"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", @@ -32,7 +38,7 @@ dependencies = [ version = "0.0.0" [project.urls] -"Homepage" = "https://deebot.readthedocs.io/" +"Homepage" = "https://deebot.readthedocs.io/" "Source Code" = "https://github.com/DeebotUniverse/client.py" "Bug Reports" = "https://github.com/DeebotUniverse/client.py/issues" @@ -51,42 +57,49 @@ dev-dependencies = [ "types-cachetools>=5.5.0.20240820", "types-mock>=5.1.0.20240425", "types-pillow>=10.2.0.20240822", + "maturin[patchelf]>=1.7.8", + "maturin-import-hook>=0.2.0", ] - -[tool.hatch.build.targets.sdist] -include = [ - "/deebot_client", +[tool.maturin] +features = ["pyo3/extension-module"] +module-name = "deebot_client.rs" +auditwheel = "repair" +strip = true +exclude = [ + { path = "**/.*/**", format = "sdist" }, + { path = "**/.*", format = "sdist" }, + { path = "*.ini", format = "sdist" }, + { path = "tests/**", format = "sdist" }, + { path = "scripts/**", format = "sdist" }, ] [tool.ruff.lint] -select = [ - "ALL", -] +select = ["ALL"] ignore = [ "ANN401", # Opinioated warning on disallowing dynamically typed expressions - "D203", # Conflicts with other rules - "D213", # Conflicts with other rules - "EM101", # raw-string-in-exception + "D203", # Conflicts with other rules + "D213", # Conflicts with other rules + "EM101", # raw-string-in-exception - "D105", # Missing docstring in magic method - "D107", # Missing docstring in `__init__` - "E501", # line too long + "D105", # Missing docstring in magic method + "D107", # Missing docstring in `__init__` + "E501", # line too long "FBT", # flake8-boolean-trap - "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable + "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable # Conflicts with the Ruff formatter "COM812", "ISC001", # Remove later - "TD", # Todos - "A", # bultins - "DTZ", # use tz need to test it first - "TRY", # tryceratops + "TD", # Todos + "A", # bultins + "DTZ", # use tz need to test it first + "TRY", # tryceratops "FIX002", # Line contains TODO, consider resolving the issue "BLE001", # Do not catch blind exception: `Exception` @@ -99,26 +112,27 @@ fixture-parentheses = false [tool.ruff.lint.isort] combine-as-imports = true force-sort-within-sections = true -known-first-party = [ - "deebot_client", -] +known-first-party = ["deebot_client"] required-imports = ["from __future__ import annotations"] [tool.ruff.lint.per-file-ignores] "tests/**" = [ - "D100", # Missing docstring in public module - "D103", # Missing docstring in public function - "D104", # Missing docstring in public package - "N802", # Function name {name} should be lowercase - "N816", # Variable {name} in global scope should not be mixedCase + "D100", # Missing docstring in public module + "D103", # Missing docstring in public function + "D104", # Missing docstring in public package + "N802", # Function name {name} should be lowercase + "N816", # Variable {name} in global scope should not be mixedCase "PLR0913", # Too many arguments in function definition - "S101", # Use of assert detected - "SLF001", # Private member accessed: {access} - "T201", # print found + "S101", # Use of assert detected + "SLF001", # Private member accessed: {access} + "T201", # print found ] "deebot_client/hardware/deebot/*" = [ - "N999", # Invalid module name + "N999", # Invalid module name +] +"deebot_client/rs.pyi" = [ + "PYI021", # docstring-in-stub ] [tool.ruff.lint.flake8-tidy-imports.banned-api] @@ -134,15 +148,12 @@ max-args = 7 [tool.pylint.MAIN] py-version = "3.13" -ignore = [ - "tests", -] -fail-on = [ - "I", -] +ignore = ["tests"] +fail-on = ["I"] +extension-pkg-allow-list = ["deebot_client.rs"] [tool.pylint.BASIC] -good-names= ["i","j","k","ex","_","T","x","y","id","tg"] +good-names = ["i", "j", "k", "ex", "_", "T", "x", "y", "id", "tg"] [tool.pylint."MESSAGES CONTROL"] # Reasons disabled: @@ -171,10 +182,7 @@ disable = [ "too-few-public-methods", "invalid-name", ] -enable = [ - "useless-suppression", - "use-symbolic-message-instead", -] +enable = ["useless-suppression", "use-symbolic-message-instead"] [tool.pylint.REPORTS] score = false @@ -184,7 +192,4 @@ score = false expected-line-ending-format = "LF" [tool.pylint.EXCEPTIONS] -overgeneral-exceptions = [ - "builtins.BaseException", - "builtins.Exception", -] +overgeneral-exceptions = ["builtins.BaseException", "builtins.Exception"] diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100755 index 00000000..560b9230 --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -eu + +# Setup development environment + +# Install uv +curl -LsSf https://astral.sh/uv/install.sh | sh + +# Install required packages for rust-lzma +sudo apt update +sudo apt install -y pkg-config liblzma-dev + +# Install project dependencies +uv sync --frozen --dev + +# Setup pre-commit +pre-commit install \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 00000000..1994812d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,30 @@ +use std::error::Error; + +use base64::{engine::general_purpose, Engine as _}; +use pyo3::exceptions::PyValueError; +use pyo3::prelude::*; + +fn _decompress_7z_base64_data(value: String) -> Result> { + let mut bytes = general_purpose::STANDARD.decode(value)?; + + // Insert required 0 bytes + for _ in 0..=3 { + bytes.insert(8, 0); + } + + let decompressed = lzma::decompress(&bytes)?; + Ok(String::from_utf8(decompressed)?) +} + +/// Decompress base64 decoded 7z compressed string. +#[pyfunction] +fn decompress_7z_base64_data(value: String) -> Result { + Ok(_decompress_7z_base64_data(value).map_err(|err| PyValueError::new_err(err.to_string()))?) +} + +/// Deebot client written in Rust +#[pymodule] +fn rs(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_function(wrap_pyfunction!(decompress_7z_base64_data, m)?)?; + Ok(()) +} diff --git a/tests/commands/json/test_map.py b/tests/commands/json/test_map.py index eb0f3dff..f771234b 100644 --- a/tests/commands/json/test_map.py +++ b/tests/commands/json/test_map.py @@ -383,7 +383,7 @@ async def test_getMapSetV2_virtual_walls() -> None: "batid": "gheijg", "serial": 1, "index": 1, - "subsets": "XQAABADHAAAAAC2WwEHwYhHX3vWwDK80QCnaQU0mwUd9Vk34ub6OxzOk6kdFfbFvpVp4iIlKisAvp0MznQNYEZ8koxFHnO,+iM44GUKgujGQKgzl0bScbQgaon1jI3eyCRikWlkmrbwA=", + "subsets": "XQAABADHAAAAAC2WwEHwYhHX3vWwDK80QCnaQU0mwUd9Vk34ub6OxzOk6kdFfbFvpVp4iIlKisAvp0MznQNYEZ8koxFHnO+iM44GUKgujGQKgzl0bScbQgaon1jI3eyCRikWlkmrbwA=", "infoSize": 199, } ) diff --git a/tests/test_map.py b/tests/test_map.py index 4ff16fe4..21544a4c 100644 --- a/tests/test_map.py +++ b/tests/test_map.py @@ -159,7 +159,7 @@ async def on_change() -> None: @patch( "deebot_client.map.decompress_7z_base64_data", - Mock(return_value=b"\x10\x00\x00\x01\x00"), + Mock(return_value="\x10\x00\x00\x01\x00"), ) async def test_Map_svg_traces_path( execute_mock: AsyncMock, event_bus_mock: Mock diff --git a/tests/test_rs.py b/tests/test_rs.py new file mode 100644 index 00000000..4d1f50a9 --- /dev/null +++ b/tests/test_rs.py @@ -0,0 +1,74 @@ +"""Test rust functions.""" + +from __future__ import annotations + +import base64 +import lzma +from typing import TYPE_CHECKING, Any + +import pytest + +from deebot_client.rs import decompress_7z_base64_data + +if TYPE_CHECKING: + from contextlib import AbstractContextManager + + +@pytest.mark.parametrize( + ("input", "expected"), + [ + ( + "XQAABACZAAAAABaOQmW9Bsibxz42rKUpGlV7Rr4D1S/9x9mDa60v4J1BKrEsnk34EAt6X5gKkxwYzfOu3T8GAPpmIy5o4A==", + "-9125,3225;-9025,3225;-8975,3175;-8975,2475;-8925,2425;-8925,2375;-8325,2375;-8275,2425;-8225,2375;-8225,2425;-8174,2475;-8024,2475;-8024,4375;-9125,4375", + ), + ( + "XQAABABBAAAAAC2WwEIwUhHX3vfFDfs1H1PUqtdWgakwVnMBz3Bb3yaoE5OYkdYA", + '[["4","-6217","3919","-6217","231","-2642","231","-2642","3919"]]', + ), + ( + "XQAABADHAAAAAC2WwEHwYhHX3vWwDK80QCnaQU0mwUd9Vk34ub6OxzOk6kdFfbFvpVp4iIlKisAvp0MznQNYEZ8koxFHnO+iM44GUKgujGQKgzl0bScbQgaon1jI3eyCRikWlkmrbwA=", + '[["0","-5195","-1059","-5195","-37","-5806","-37","-5806","-1059"],["1","-7959","220","-7959","1083","-9254","1083","-9254","220"],["2","-9437","347","-5387","410"],["3","-5667","317","-4888","-56"]]', + ), + ], +) +def test_decompress_7z_base64_data(input: str, expected: str) -> None: + """Test decompress_7z_base64_data function.""" + assert _decompress_7z_base64_data_python(input) == expected + assert decompress_7z_base64_data(input) == expected + + +@pytest.mark.parametrize( + ("input", "error"), + [ + ( + "XQAABADHAAAAAC2WwEHwYhHX3vWwDK80QCnaQU0mwUd9Vk34ub6OxzOk6kdFfbFvpVp4iIlKisAvp0MznQNYEZ8koxFHnO,+iM44GUKgujGQKgzl0bScbQgaon1jI3eyCRikWlkmrbwA=", + pytest.raises(ValueError, match="Invalid symbol 44, offset 94."), + ), + ( + "XQAABABBAAAAAC2WwEIwUhHX3vfFDfs1H1PUqtdWgakwVnMBz3Bb3yaoE5OYkd", + pytest.raises(ValueError, match="Invalid padding"), + ), + ], +) +def test_decompress_7z_base64_data_errors( + input: str, error: AbstractContextManager[Any] +) -> None: + """Test decompress_7z_base64_data function.""" + with error: + assert decompress_7z_base64_data(input) + + +def _decompress_7z_base64_data_python(data: str) -> str: + """Decompress base64 decoded 7z compressed string.""" + final_array = bytearray() + + # Decode Base64 + decoded = base64.b64decode(data) + + for i, idx in enumerate(decoded): + if i == 8: + final_array.extend(b"\x00\x00\x00\x00") + final_array.append(idx) + + dec = lzma.LZMADecompressor(lzma.FORMAT_AUTO, None, None) + return dec.decompress(final_array).decode() diff --git a/uv.lock b/uv.lock index 0199d9a5..b65c10cf 100644 --- a/uv.lock +++ b/uv.lock @@ -224,6 +224,8 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "maturin", extra = ["patchelf"] }, + { name = "maturin-import-hook" }, { name = "mypy" }, { name = "pre-commit" }, { name = "pycountry" }, @@ -252,6 +254,8 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "maturin", extras = ["patchelf"], specifier = ">=1.7.8" }, + { name = "maturin-import-hook", specifier = ">=0.2.0" }, { name = "mypy", specifier = "==1.14.1" }, { name = "pre-commit", specifier = "==4.0.1" }, { name = "pycountry", specifier = "==24.6.1" }, @@ -392,6 +396,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", size = 92310 }, ] +[[package]] +name = "maturin" +version = "1.7.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/1e/085ddc0e5b08ae7af7a743a0dd6ed06b22a1332288488f1a333137885150/maturin-1.7.8.tar.gz", hash = "sha256:649c6ef3f0fa4c5f596140d761dc5a4d577c485cc32fb5b9b344a8280352880d", size = 195704 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/ed/c8bb26e91c879e418ae1b01630722ed20b6fe0e6755be8d538d83666f136/maturin-1.7.8-py3-none-linux_armv6l.whl", hash = "sha256:c6950fd2790acd93265e1501cea66f9249cff19724654424ca75a3b17ebb315b", size = 7515691 }, + { url = "https://files.pythonhosted.org/packages/38/7a/573f969315f0b92a09a0a565d45e98812c87796e2e19a7856159ab234faf/maturin-1.7.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f98288d5c382bacf0c076871dfd50c38f1eb2248f417551e98dd6f47f6ee8afa", size = 14434454 }, + { url = "https://files.pythonhosted.org/packages/a6/17/46834841fbf19231487f185e68b95ca348cc05cce49be8787e0bc7e9dc47/maturin-1.7.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b2d4e0f674ca29864e6b86c2eb9fee8236d1c7496c25f7300e34229272468f4c", size = 7509122 }, + { url = "https://files.pythonhosted.org/packages/c1/8f/bf8b4871eb390a4baef2e0bb5016852c7c0311a9772e2945534cfa2ee40e/maturin-1.7.8-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:6cafb17bf57822bdc04423d9e3e766d42918d474848fe9833e397267514ba891", size = 7598870 }, + { url = "https://files.pythonhosted.org/packages/dc/43/c842be67a7c59568082345249b956138ae93d0b2474fb41c186ce26d05e1/maturin-1.7.8-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:2b2bdee0c3a84696b3a809054c43ead1a04b7b3321cbd5b8f5676e4ba4691d0f", size = 7932310 }, + { url = "https://files.pythonhosted.org/packages/12/12/42435d05f2d6c75eb621751e6f021d29eb34d18e3b9c5c94d828744c2d54/maturin-1.7.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:b8188b71259fc2bc568d9c8acc186fcfed96f42539bcb55b8e6f4ec26e411f37", size = 7321964 }, + { url = "https://files.pythonhosted.org/packages/b4/26/f3272ee985ebf9b3e8c4cd4f4efb022af1e12c9f53aed0dcc9a255399f4e/maturin-1.7.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:a4f58c2a53c2958a1bf090960b08b28e676136cd88ac2f5dfdcf1b14ea54ec06", size = 7408613 }, + { url = "https://files.pythonhosted.org/packages/36/7d/be27bcc7d3ac6e6c2136a8ec0cc56f227a292d6cfdde55e095b6c0aa24a9/maturin-1.7.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:c5d6c0c631d1fc646cd3834795e6cfd72ab4271d289df7e0f911261a02bec75f", size = 9496974 }, + { url = "https://files.pythonhosted.org/packages/e1/e8/0d7323e9a31c11edf69c4473d73eca74803ce3e2390abf8ae3ac7eb10b04/maturin-1.7.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c23664d19dadcbf800ef70f26afb2e0485a985c62889930934f019c565534c23", size = 10828401 }, + { url = "https://files.pythonhosted.org/packages/7e/82/5080e052c0d8c9872f6d4b94cae84c17ed7f2ea270d709210ea6445b655f/maturin-1.7.8-py3-none-win32.whl", hash = "sha256:403eebf1afa6f19b49425f089e39c53b8e597bc86a47f3a76e828dc78d27fa80", size = 6845240 }, + { url = "https://files.pythonhosted.org/packages/6d/c9/9b162361ded893f36038c2f8ac6a972ec441c11df8d17c440997eb28090f/maturin-1.7.8-py3-none-win_amd64.whl", hash = "sha256:1ce48d007438b895f8665314b6748ac0dab31e4f32049a60b52281dd2dccbdde", size = 7762332 }, + { url = "https://files.pythonhosted.org/packages/fa/40/46d4742db742f69a7fe0054cd7c82bc79b2d70cb8c91f7e737e75c28a5f3/maturin-1.7.8-py3-none-win_arm64.whl", hash = "sha256:cc92a62953205e8945b6cfe6943d6a8576a4442d30d9c67141f944f4f4640e62", size = 6501353 }, +] + +[package.optional-dependencies] +patchelf = [ + { name = "patchelf" }, +] + +[[package]] +name = "maturin-import-hook" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/5f/9d426545c49926f4212fbe6244bc397508a29f65e35fe307835c07c0be7b/maturin_import_hook-0.2.0.tar.gz", hash = "sha256:e8a81333179faf7b5f413e44c2a1c89604fefff433679275f724950b0a632adf", size = 31071 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/48/1e88f90750a66825a5ea8fd2e26908e4e4acade0fe5a378c36d14bc0138d/maturin_import_hook-0.2.0-py3-none-any.whl", hash = "sha256:742d882213d6aa24bacf6775ce26ab96bd4ee26ceafbbbad69d60fdc98d95ec8", size = 31134 }, +] + [[package]] name = "mccabe" version = "0.7.0" @@ -539,6 +580,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/cb/00451c3cf31790287768bb12c6bec834f5d292eaf3022afc88e14b8afc94/paho_mqtt-2.1.0-py3-none-any.whl", hash = "sha256:6db9ba9b34ed5bc6b6e3812718c7e06e2fd7444540df2455d2c51bd58808feee", size = 67219 }, ] +[[package]] +name = "patchelf" +version = "0.17.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/ec/ac383eb82792e092d8037649b382cf78a7b79c2ce4e5b861f61519b9b14e/patchelf-0.17.2.1.tar.gz", hash = "sha256:a6eb0dd452ce4127d0d5e1eb26515e39186fa609364274bc1b0b77539cfa7031", size = 167484 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/09/b7ec52d01ad2936c967e929fd076b0a2e4f94ce950c9440e38f98c67675e/patchelf-0.17.2.1-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:fc329da0e8f628bd836dfb8eaf523547e342351fa8f739bf2b3fe4a6db5a297c", size = 421930 }, + { url = "https://files.pythonhosted.org/packages/69/47/e02357d1075cdf4b56be39a6c218a5a2b0bd3896011120ae3765190ab527/patchelf-0.17.2.1-py2.py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:ccb266a94edf016efe80151172c26cff8c2ec120a57a1665d257b0442784195d", size = 381147 }, + { url = "https://files.pythonhosted.org/packages/92/78/3f4e19d6ba7acf1e01db6d82d23e0435a76466187644ce0dbcf6bd621317/patchelf-0.17.2.1-py2.py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:f47b5bdd6885cfb20abdd14c707d26eb6f499a7f52e911865548d4aa43385502", size = 488526 }, + { url = "https://files.pythonhosted.org/packages/08/d3/adedfbcff489605a0e907f390006ef7d59a3ac56a9e2dbe721ddbbb1e58e/patchelf-0.17.2.1-py2.py3-none-manylinux_2_17_s390x.manylinux2014_s390x.musllinux_1_1_s390x.whl", hash = "sha256:a9e6ebb0874a11f7ed56d2380bfaa95f00612b23b15f896583da30c2059fcfa8", size = 470060 }, + { url = "https://files.pythonhosted.org/packages/c6/9b/33e54d5916863904609e40b53206e5a49cf649b71f7f787eddcbc27a9f5c/patchelf-0.17.2.1-py2.py3-none-manylinux_2_5_i686.manylinux1_i686.musllinux_1_1_i686.whl", hash = "sha256:3c8d58f0e4c1929b1c7c45ba8da5a84a8f1aa6a82a46e1cfb2e44a4d40f350e5", size = 499565 }, + { url = "https://files.pythonhosted.org/packages/c6/73/c3105c973dd2afcdc5d946ee211d5c4ecdf9d27bb54ae835b144e706e86d/patchelf-0.17.2.1-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:d1a9bc0d4fd80c038523ebdc451a1cce75237cfcc52dbd1aca224578001d5927", size = 425709 }, +] + [[package]] name = "pillow" version = "11.0.0" From b7fe803361176e18e0d4cd222e6800598258ecaa Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 3 Jan 2025 20:03:43 +0100 Subject: [PATCH 111/138] Fix typo in release flow (#735) --- .github/workflows/python-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 47ded734..78f58fed 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -32,7 +32,7 @@ jobs: - name: 🏗 Set package version run: | sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml - sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" cargo.toml + sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" Cargo.toml - name: 📦 Build package run: uv build - name: 🚀 Publish to PyPi From baa87f8221cf8cfda89deb73432f55d492604959 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 3 Jan 2025 20:16:23 +0100 Subject: [PATCH 112/138] Don't update rust lib version as it's only embedded (#736) --- .github/workflows/python-publish.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 78f58fed..612f2748 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -32,7 +32,6 @@ jobs: - name: 🏗 Set package version run: | sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml - sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" Cargo.toml - name: 📦 Build package run: uv build - name: 🚀 Publish to PyPi From 4cbe79121b65508e3e29ae4e23f86c5b2e932c5d Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 3 Jan 2025 21:41:09 +0100 Subject: [PATCH 113/138] Upload more wheels (#737) --- .github/workflows/python-publish.yml | 67 +++++++++++++++++++++------- pyproject.toml | 6 +++ 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 612f2748..23ed6368 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -13,31 +13,66 @@ on: types: [published] jobs: - release: - name: Releasing to PyPi + wheels: + name: Build wheels runs-on: ubuntu-latest - environment: - name: release - url: https://pypi.org/manage/project/deebot-client/ - permissions: - contents: write - id-token: write + strategy: + matrix: + python-version: + - "3.12" + - "3.13" + linux-compatibility: + - "manylinux_2_34" + - "musllinux_1_2" steps: - name: ⤵️ Check out code from GitHub uses: actions/checkout@v4.2.2 - - name: 🏗 Set up uv + - name: 🏗 Set up uv and Python ${{ matrix.python-version }} uses: astral-sh/setup-uv@v5 with: enable-cache: true + python-version: ${{ matrix.python-version }} - name: 🏗 Set package version run: | sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml - name: 📦 Build package - run: uv build - - name: 🚀 Publish to PyPi - run: uv publish - - name: ✍️ Sign published artifacts - uses: sigstore/gh-action-sigstore-python@v3.0.0 + run: uv build --config-settings build-args='--compatibility ${{ matrix.linux-compatibility }}' + - name: ⬆️ Upload wheels + uses: actions/upload-artifact@v4 with: - inputs: ./dist/*.tar.gz ./dist/*.whl - release-signing-artifacts: true + name: wheels-${{ matrix.python-version }}-${{ matrix.linux-compatibility }} + path: dist + +release: + name: Releasing to PyPi + runs-on: ubuntu-latest + needs: ["wheels"] + environment: + name: release + url: https://pypi.org/manage/project/deebot-client/ + permissions: + contents: write + id-token: write + steps: + - name: ⤵️ Check out code from GitHub + uses: actions/checkout@v4.2.2 + - name: 🏗 Set up uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + - name: 🏗 Set package version + run: | + sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml + - name: 📦 Build source package + run: uv build --sdist + - name: ⬇️ Download wheels + uses: actions/download-artifact@v4 + with: + name: wheels-* + - name: 🚀 Publish to PyPi + run: uv publish + - name: ✍️ Sign published artifacts + uses: sigstore/gh-action-sigstore-python@v3.0.0 + with: + inputs: ./dist/*.tar.gz ./dist/*.whl + release-signing-artifacts: true diff --git a/pyproject.toml b/pyproject.toml index 80c91a6e..bb451cda 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,12 @@ version = "0.0.0" "Bug Reports" = "https://github.com/DeebotUniverse/client.py/issues" [tool.uv] +# Rebuild package when any rust files change +cache-keys = [ + { file = "pyproject.toml" }, + { file = "Cargo.toml" }, + { file = "**/*.rs" }, +] dev-dependencies = [ "mypy==1.14.1", "pre-commit==4.0.1", From 37c8b7a3f71f459ad41675fb011c9e5d76b3106a Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 3 Jan 2025 20:45:17 +0000 Subject: [PATCH 114/138] Build only wheel --- .github/workflows/python-publish.yml | 68 ++++++++++++++-------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 23ed6368..6ce2bd18 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -36,43 +36,43 @@ jobs: run: | sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml - name: 📦 Build package - run: uv build --config-settings build-args='--compatibility ${{ matrix.linux-compatibility }}' + run: uv build --wheel --config-settings build-args='--compatibility ${{ matrix.linux-compatibility }}' - name: ⬆️ Upload wheels uses: actions/upload-artifact@v4 with: name: wheels-${{ matrix.python-version }}-${{ matrix.linux-compatibility }} path: dist -release: - name: Releasing to PyPi - runs-on: ubuntu-latest - needs: ["wheels"] - environment: - name: release - url: https://pypi.org/manage/project/deebot-client/ - permissions: - contents: write - id-token: write - steps: - - name: ⤵️ Check out code from GitHub - uses: actions/checkout@v4.2.2 - - name: 🏗 Set up uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: 🏗 Set package version - run: | - sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml - - name: 📦 Build source package - run: uv build --sdist - - name: ⬇️ Download wheels - uses: actions/download-artifact@v4 - with: - name: wheels-* - - name: 🚀 Publish to PyPi - run: uv publish - - name: ✍️ Sign published artifacts - uses: sigstore/gh-action-sigstore-python@v3.0.0 - with: - inputs: ./dist/*.tar.gz ./dist/*.whl - release-signing-artifacts: true + release: + name: Releasing to PyPi + runs-on: ubuntu-latest + needs: ["wheels"] + environment: + name: release + url: https://pypi.org/manage/project/deebot-client/ + permissions: + contents: write + id-token: write + steps: + - name: ⤵️ Check out code from GitHub + uses: actions/checkout@v4.2.2 + - name: 🏗 Set up uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + - name: 🏗 Set package version + run: | + sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml + - name: 📦 Build source package + run: uv build --sdist + - name: ⬇️ Download wheels + uses: actions/download-artifact@v4 + with: + pattern: wheels-* + - name: 🚀 Publish to PyPi + run: uv publish + - name: ✍️ Sign published artifacts + uses: sigstore/gh-action-sigstore-python@v3.0.0 + with: + inputs: ./dist/*.tar.gz ./dist/*.whl + release-signing-artifacts: true From 2869261f46e7ca2e8d6d44f364f3623b7d30eae8 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 3 Jan 2025 20:55:44 +0000 Subject: [PATCH 115/138] Fix artifactory download --- .github/workflows/python-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 6ce2bd18..bc48dc9c 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -69,6 +69,7 @@ jobs: uses: actions/download-artifact@v4 with: pattern: wheels-* + path: dist - name: 🚀 Publish to PyPi run: uv publish - name: ✍️ Sign published artifacts From 3217e7d3f8bfd2b0b355eac9c059450538e9e544 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Fri, 3 Jan 2025 22:07:38 +0100 Subject: [PATCH 116/138] Fix wheels upload (#738) --- .github/workflows/python-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index bc48dc9c..4516c5bc 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -70,6 +70,7 @@ jobs: with: pattern: wheels-* path: dist + merge-multiple: true - name: 🚀 Publish to PyPi run: uv publish - name: ✍️ Sign published artifacts From eed26b27256baedacc37df80fadd0fbb0056a7f8 Mon Sep 17 00:00:00 2001 From: phoenix <1797318+phoenixxie0@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:27:15 +0800 Subject: [PATCH 117/138] Add DEEBOT X1 PRO OMNI (s523z1) support (#739) Co-authored-by: root --- deebot_client/hardware/deebot/s523z1.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/s523z1.py diff --git a/deebot_client/hardware/deebot/s523z1.py b/deebot_client/hardware/deebot/s523z1.py new file mode 120000 index 00000000..391aa568 --- /dev/null +++ b/deebot_client/hardware/deebot/s523z1.py @@ -0,0 +1 @@ +2o4lnm.py \ No newline at end of file From 9b8ccf17a3fed9643d8f6d3f17dbbe96c6f2cfb5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 10:27:28 +0100 Subject: [PATCH 118/138] [pre-commit.ci] pre-commit autoupdate (#744) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 44da71b6..c368a487 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.4 + rev: v0.8.6 hooks: - id: ruff args: From aea5923ae8ea54cd552dc6d6981ae985079cc372 Mon Sep 17 00:00:00 2001 From: Arthur Revaclier Date: Tue, 7 Jan 2025 15:30:55 +0100 Subject: [PATCH 119/138] Added support for Deebot U2 (ipzjy0) (#745) --- deebot_client/hardware/deebot/ipzjy0.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/ipzjy0.py diff --git a/deebot_client/hardware/deebot/ipzjy0.py b/deebot_client/hardware/deebot/ipzjy0.py new file mode 120000 index 00000000..ade0eb9b --- /dev/null +++ b/deebot_client/hardware/deebot/ipzjy0.py @@ -0,0 +1 @@ +x5d34r.py \ No newline at end of file From 6f575526702b7fc58e15ea8857ec3d18b287635f Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 14 Jan 2025 11:32:11 +0100 Subject: [PATCH 120/138] Fix CI (#757) --- .github/workflows/ci.yml | 14 ++++++++++++++ .github/workflows/python-publish.yml | 7 ++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d198af21..d80946d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,13 @@ jobs: cache-dependency-glob: "uv.lock" cache-local-path: ${{ env.UV_CACHE_DIR }} + - name: Install additional OS dependencies + run: | + sudo apt-get update + sudo apt-get -y install \ + pkg-config \ + liblzma-dev + - name: 🏗 Install the project run: uv sync --locked --dev @@ -57,6 +64,13 @@ jobs: cache-local-path: ${{ env.UV_CACHE_DIR }} python-version: ${{ matrix.python-version }} + - name: Install additional OS dependencies + run: | + sudo apt-get update + sudo apt-get -y install \ + pkg-config \ + liblzma-dev + - name: 🏗 Install the project run: uv sync --locked --dev diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 4516c5bc..e9e0625a 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -23,7 +23,6 @@ jobs: - "3.13" linux-compatibility: - "manylinux_2_34" - - "musllinux_1_2" steps: - name: ⤵️ Check out code from GitHub uses: actions/checkout@v4.2.2 @@ -32,6 +31,12 @@ jobs: with: enable-cache: true python-version: ${{ matrix.python-version }} + - name: Install additional OS dependencies + run: | + sudo apt-get update + sudo apt-get -y install \ + pkg-config \ + liblzma-dev - name: 🏗 Set package version run: | sed -i "s/^version = \".*\"/version = \"${{ github.event.release.tag_name }}\"/" pyproject.toml From f598eabeac565d4a8f104b829a60c1fe00135f80 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:35:36 +0100 Subject: [PATCH 121/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20Rust=20cr?= =?UTF-8?q?ate=20pyo3=20to=20v0.23.4=20(#755)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Cargo.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a9c25a8..5ca8b7f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -85,9 +85,9 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e484fd2c8b4cb67ab05a318f1fd6fa8f199fcc30819f08f07d200809dba26c15" +checksum = "57fe09249128b3173d092de9523eaa75136bf7ba85e0d69eca241c7939c933cc" dependencies = [ "cfg-if", "indoc", @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e0469a84f208e20044b98965e1561028180219e35352a2afaf2b942beff3b" +checksum = "1cd3927b5a78757a0d71aa9dff669f903b1eb64b54142a9bd9f757f8fde65fd7" dependencies = [ "once_cell", "target-lexicon", @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1547a7f9966f6f1a0f0227564a9945fe36b90da5a93b3933fc3dc03fae372d" +checksum = "dab6bb2102bd8f991e7749f130a70d05dd557613e39ed2deeee8e9ca0c4d548d" dependencies = [ "libc", "pyo3-build-config", @@ -123,9 +123,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb6da8ec6fa5cedd1626c886fc8749bdcbb09424a86461eb8cdf096b7c33257" +checksum = "91871864b353fd5ffcb3f91f2f703a22a9797c91b9ab497b1acac7b07ae509c7" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -135,9 +135,9 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38a385202ff5a92791168b1136afae5059d3ac118457bb7bc304c197c2d33e7d" +checksum = "43abc3b80bc20f3facd86cd3c60beed58c3e2aa26213f3cda368de39c60a27e4" dependencies = [ "heck", "proc-macro2", From 278c8d007d86b5477bb7efcbb7420ec003be66ac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:35:50 +0100 Subject: [PATCH 122/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pytest-asyncio=20to=20v0.25.2=20(#748)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bb451cda..c34af9a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,7 @@ dev-dependencies = [ "pre-commit==4.0.1", "pycountry==24.6.1", "pylint==3.3.3", - "pytest-asyncio==0.25.1", + "pytest-asyncio==0.25.2", "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", "pytest-timeout==2.3.1", diff --git a/uv.lock b/uv.lock index b65c10cf..4141f225 100644 --- a/uv.lock +++ b/uv.lock @@ -261,7 +261,7 @@ dev = [ { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.3" }, { name = "pytest", specifier = "==8.3.4" }, - { name = "pytest-asyncio", specifier = "==0.25.1" }, + { name = "pytest-asyncio", specifier = "==0.25.2" }, { name = "pytest-cov", specifier = "==6.0.0" }, { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, { name = "pytest-timeout", specifier = "==2.3.1" }, @@ -751,14 +751,14 @@ wheels = [ [[package]] name = "pytest-asyncio" -version = "0.25.1" +version = "0.25.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/04/0477a4bdd176ad678d148c075f43620b3f7a060ff61c7da48500b1fa8a75/pytest_asyncio-0.25.1.tar.gz", hash = "sha256:79be8a72384b0c917677e00daa711e07db15259f4d23203c59012bcd989d4aee", size = 53760 } +sdist = { url = "https://files.pythonhosted.org/packages/72/df/adcc0d60f1053d74717d21d58c0048479e9cab51464ce0d2965b086bd0e2/pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f", size = 53950 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/fb/efc7226b384befd98d0e00d8c4390ad57f33c8fde00094b85c5e07897def/pytest_asyncio-0.25.1-py3-none-any.whl", hash = "sha256:c84878849ec63ff2ca509423616e071ef9cd8cc93c053aa33b5b8fb70a990671", size = 19357 }, + { url = "https://files.pythonhosted.org/packages/61/d8/defa05ae50dcd6019a95527200d3b3980043df5aa445d40cb0ef9f7f98ab/pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075", size = 19400 }, ] [[package]] From b58ce16ec657c09b26dda574e259ebf1e2f4248e Mon Sep 17 00:00:00 2001 From: jonnynch Date: Tue, 14 Jan 2025 21:38:03 +1100 Subject: [PATCH 123/138] Add support for Deebot U2 (ts2ofl) (#752) Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/ts2ofl.py | 125 ++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 deebot_client/hardware/deebot/ts2ofl.py diff --git a/deebot_client/hardware/deebot/ts2ofl.py b/deebot_client/hardware/deebot/ts2ofl.py new file mode 100644 index 00000000..6aa2cc5a --- /dev/null +++ b/deebot_client/hardware/deebot/ts2ofl.py @@ -0,0 +1,125 @@ +"""Deebot U2 Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityLifeSpan, + CapabilitySet, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStats, + DeviceType, +) +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.const import DataType +from deebot_client.events import ( + AvailabilityEvent, + BatteryEvent, + CleanLogEvent, + CustomCommandEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + NetworkInfoEvent, + ReportStatsEvent, + StateEvent, + StatsEvent, + TotalStatsEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, +) +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.SIDE_BRUSH, + ] + ) + ], + reset=ResetLifeSpan, + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + ), + ), + ), +) From 76bdfee511c13269f7e9b7238419202f9717c17e Mon Sep 17 00:00:00 2001 From: RocketHcgs Date: Tue, 14 Jan 2025 18:38:40 +0800 Subject: [PATCH 124/138] Add DEEBOT T10 OMNI (yi396x) support (#749) Co-authored-by: Robert Resch --- deebot_client/hardware/deebot/yi396x.py | 1 + 1 file changed, 1 insertion(+) create mode 120000 deebot_client/hardware/deebot/yi396x.py diff --git a/deebot_client/hardware/deebot/yi396x.py b/deebot_client/hardware/deebot/yi396x.py new file mode 120000 index 00000000..0f26ba6a --- /dev/null +++ b/deebot_client/hardware/deebot/yi396x.py @@ -0,0 +1 @@ +p1jij8.py \ No newline at end of file From 2abe14151b95688052a798b0278d39055ecc9683 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:42:34 +0000 Subject: [PATCH 125/138] [pre-commit.ci] pre-commit autoupdate (#756) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Robert Resch --- .pre-commit-config.yaml | 2 +- deebot_client/messages/__init__.py | 3 +-- tests/commands/json/test_charge.py | 2 +- tests/hardware/test_init.py | 6 +++--- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c368a487..8598914f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.6 + rev: v0.9.1 hooks: - id: ruff args: diff --git a/deebot_client/messages/__init__.py b/deebot_client/messages/__init__.py index ec9aefaa..f4e529d2 100644 --- a/deebot_client/messages/__init__.py +++ b/deebot_client/messages/__init__.py @@ -62,8 +62,7 @@ def get_message(message_name: str, data_type: DataType) -> type[Message] | None: converted_name = message_name # T8 series and newer - if converted_name.endswith("_V2"): - converted_name = converted_name[:-3] + converted_name = converted_name.removesuffix("_V2") if message_type := messages.get(converted_name, None): return message_type diff --git a/tests/commands/json/test_charge.py b/tests/commands/json/test_charge.py index 88c5429f..b4d2df6a 100644 --- a/tests/commands/json/test_charge.py +++ b/tests/commands/json/test_charge.py @@ -46,5 +46,5 @@ async def test_Charge_failed(caplog: pytest.LogCaptureFixture) -> None: assert ( "deebot_client.commands.json.common", logging.WARNING, - f'Command "charge" was not successfully. body={json['resp']['body']}', + f'Command "charge" was not successfully. body={json["resp"]["body"]}', ) in caplog.record_tuples diff --git a/tests/hardware/test_init.py b/tests/hardware/test_init.py index 6a7b2db4..b2969a36 100644 --- a/tests/hardware/test_init.py +++ b/tests/hardware/test_init.py @@ -248,9 +248,9 @@ async def test_capabilities_event_extraction( capabilities = info.capabilities assert capabilities._events.keys() == expected.keys() for event, expected_commands in expected.items(): - assert ( - capabilities.get_refresh_commands(event) == expected_commands - ), f"Refresh commands doesn't match for {event}" + assert capabilities.get_refresh_commands(event) == expected_commands, ( + f"Refresh commands doesn't match for {event}" + ) def test_all_models_loaded() -> None: From 7b53d82fc0d5321b5245edbf2f1738c6f3d662d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:43:56 +0000 Subject: [PATCH 126/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#743)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Cargo.lock | 12 +++--- uv.lock | 108 ++++++++++++++++++++++++++--------------------------- 2 files changed, 60 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5ca8b7f5..874922a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,9 +76,9 @@ checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -148,9 +148,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -167,9 +167,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.91" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", diff --git a/uv.lock b/uv.lock index 4141f225..866421dd 100644 --- a/uv.lock +++ b/uv.lock @@ -362,11 +362,11 @@ wheels = [ [[package]] name = "identify" -version = "2.6.4" +version = "2.6.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/a5/7de3053524ee006b91099968d7ecb2e0b420f7ae728094394c33e8a2a2b9/identify-2.6.4.tar.gz", hash = "sha256:285a7d27e397652e8cafe537a6cc97dd470a970f48fb2e9d979aa38eae5513ac", size = 99209 } +sdist = { url = "https://files.pythonhosted.org/packages/cf/92/69934b9ef3c31ca2470980423fda3d00f0460ddefdf30a67adf7f17e2e00/identify-2.6.5.tar.gz", hash = "sha256:c10b33f250e5bba374fae86fb57f3adcebf1161bce7cdf92031915fd480c13bc", size = 99213 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/9d/52f036403ae86474804f699c0d084b4b071e333a390b20269bb8accc65e0/identify-2.6.4-py2.py3-none-any.whl", hash = "sha256:993b0f01b97e0568c179bb9196391ff391bfb88a99099dbf5ce392b68f42d0af", size = 99072 }, + { url = "https://files.pythonhosted.org/packages/ec/fa/dce098f4cdf7621aa8f7b4f919ce545891f489482f0bfa5102f3eca8608b/identify-2.6.5-py2.py3-none-any.whl", hash = "sha256:14181a47091eb75b337af4c23078c9d09225cd4c48929f521f3bf16b09d02566", size = 99078 }, ] [[package]] @@ -398,22 +398,22 @@ wheels = [ [[package]] name = "maturin" -version = "1.7.8" +version = "1.8.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/1e/085ddc0e5b08ae7af7a743a0dd6ed06b22a1332288488f1a333137885150/maturin-1.7.8.tar.gz", hash = "sha256:649c6ef3f0fa4c5f596140d761dc5a4d577c485cc32fb5b9b344a8280352880d", size = 195704 } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/ccb0f917722a35ab0d758be9bb5edaf645c3a3d6170061f10d396ecd273f/maturin-1.8.1.tar.gz", hash = "sha256:49cd964aabf59f8b0a6969f9860d2cdf194ac331529caae14c884f5659568857", size = 197397 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/ed/c8bb26e91c879e418ae1b01630722ed20b6fe0e6755be8d538d83666f136/maturin-1.7.8-py3-none-linux_armv6l.whl", hash = "sha256:c6950fd2790acd93265e1501cea66f9249cff19724654424ca75a3b17ebb315b", size = 7515691 }, - { url = "https://files.pythonhosted.org/packages/38/7a/573f969315f0b92a09a0a565d45e98812c87796e2e19a7856159ab234faf/maturin-1.7.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f98288d5c382bacf0c076871dfd50c38f1eb2248f417551e98dd6f47f6ee8afa", size = 14434454 }, - { url = "https://files.pythonhosted.org/packages/a6/17/46834841fbf19231487f185e68b95ca348cc05cce49be8787e0bc7e9dc47/maturin-1.7.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b2d4e0f674ca29864e6b86c2eb9fee8236d1c7496c25f7300e34229272468f4c", size = 7509122 }, - { url = "https://files.pythonhosted.org/packages/c1/8f/bf8b4871eb390a4baef2e0bb5016852c7c0311a9772e2945534cfa2ee40e/maturin-1.7.8-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:6cafb17bf57822bdc04423d9e3e766d42918d474848fe9833e397267514ba891", size = 7598870 }, - { url = "https://files.pythonhosted.org/packages/dc/43/c842be67a7c59568082345249b956138ae93d0b2474fb41c186ce26d05e1/maturin-1.7.8-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:2b2bdee0c3a84696b3a809054c43ead1a04b7b3321cbd5b8f5676e4ba4691d0f", size = 7932310 }, - { url = "https://files.pythonhosted.org/packages/12/12/42435d05f2d6c75eb621751e6f021d29eb34d18e3b9c5c94d828744c2d54/maturin-1.7.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:b8188b71259fc2bc568d9c8acc186fcfed96f42539bcb55b8e6f4ec26e411f37", size = 7321964 }, - { url = "https://files.pythonhosted.org/packages/b4/26/f3272ee985ebf9b3e8c4cd4f4efb022af1e12c9f53aed0dcc9a255399f4e/maturin-1.7.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:a4f58c2a53c2958a1bf090960b08b28e676136cd88ac2f5dfdcf1b14ea54ec06", size = 7408613 }, - { url = "https://files.pythonhosted.org/packages/36/7d/be27bcc7d3ac6e6c2136a8ec0cc56f227a292d6cfdde55e095b6c0aa24a9/maturin-1.7.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:c5d6c0c631d1fc646cd3834795e6cfd72ab4271d289df7e0f911261a02bec75f", size = 9496974 }, - { url = "https://files.pythonhosted.org/packages/e1/e8/0d7323e9a31c11edf69c4473d73eca74803ce3e2390abf8ae3ac7eb10b04/maturin-1.7.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c23664d19dadcbf800ef70f26afb2e0485a985c62889930934f019c565534c23", size = 10828401 }, - { url = "https://files.pythonhosted.org/packages/7e/82/5080e052c0d8c9872f6d4b94cae84c17ed7f2ea270d709210ea6445b655f/maturin-1.7.8-py3-none-win32.whl", hash = "sha256:403eebf1afa6f19b49425f089e39c53b8e597bc86a47f3a76e828dc78d27fa80", size = 6845240 }, - { url = "https://files.pythonhosted.org/packages/6d/c9/9b162361ded893f36038c2f8ac6a972ec441c11df8d17c440997eb28090f/maturin-1.7.8-py3-none-win_amd64.whl", hash = "sha256:1ce48d007438b895f8665314b6748ac0dab31e4f32049a60b52281dd2dccbdde", size = 7762332 }, - { url = "https://files.pythonhosted.org/packages/fa/40/46d4742db742f69a7fe0054cd7c82bc79b2d70cb8c91f7e737e75c28a5f3/maturin-1.7.8-py3-none-win_arm64.whl", hash = "sha256:cc92a62953205e8945b6cfe6943d6a8576a4442d30d9c67141f944f4f4640e62", size = 6501353 }, + { url = "https://files.pythonhosted.org/packages/4c/00/f34077315f34db8ad2ccf6bfe11b864ca27baab3a1320634da8e3cf89a48/maturin-1.8.1-py3-none-linux_armv6l.whl", hash = "sha256:7e590a23d9076b8a994f2e67bc63dc9a2d1c9a41b1e7b45ac354ba8275254e89", size = 7568415 }, + { url = "https://files.pythonhosted.org/packages/5c/07/9219976135ce0cb32d2fa6ea5c6d0ad709013d9a17967312e149b98153a6/maturin-1.8.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d8251a95682c83ea60988c804b620c181911cd824aa107b4a49ac5333c92968", size = 14527816 }, + { url = "https://files.pythonhosted.org/packages/e6/04/fa009a00903acdd1785d58322193140bfe358595347c39f315112dabdf9e/maturin-1.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9fc1a4354cac5e32c190410208039812ea88c4a36bd2b6499268ec49ef5de00", size = 7580446 }, + { url = "https://files.pythonhosted.org/packages/9b/d4/414b2aab9bbfe88182b734d3aa1b4fef7d7701e50f6be48500378b8c8721/maturin-1.8.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:621e171c6b39f95f1d0df69a118416034fbd59c0f89dcaea8c2ea62019deecba", size = 7650535 }, + { url = "https://files.pythonhosted.org/packages/f0/64/879418a8a0196013ec1fb19eada0781c04a30e8d6d9227e80f91275a4f5b/maturin-1.8.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:98f638739a5132962347871b85c91f525c9246ef4d99796ae98a2031e3df029f", size = 8006702 }, + { url = "https://files.pythonhosted.org/packages/39/c2/605829324f8371294f70303aca130682df75318958efed246873d3d604ab/maturin-1.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:f9f5c47521924b6e515cbc652a042fe5f17f8747445be9d931048e5d8ddb50a4", size = 7368164 }, + { url = "https://files.pythonhosted.org/packages/be/6c/30e136d397bb146b94b628c0ef7f17708281611b97849e2cf37847025ac7/maturin-1.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:0f4407c7353c31bfbb8cdeb82bc2170e474cbfb97b5ba27568f440c9d6c1fdd4", size = 7450889 }, + { url = "https://files.pythonhosted.org/packages/1b/50/e1f5023512696d4e56096f702e2f68d6d9a30afe0a4eec82b0e27b8eb4e4/maturin-1.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:ec49cd70cad3c389946c6e2bc0bd50772a7fcb463040dd800720345897eec9bf", size = 9585819 }, + { url = "https://files.pythonhosted.org/packages/b7/80/b24b5248d89d2e5982553900237a337ea098ca9297b8369ca2aa95549e0f/maturin-1.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08767d794de8f8a11c5c8b1b47a4ff9fb6ae2d2d97679e27030f2f509c8c2a0", size = 10920801 }, + { url = "https://files.pythonhosted.org/packages/6e/f4/8ede7a662fabf93456b44390a5ad22630e25fb5ddaecf787251071b2e143/maturin-1.8.1-py3-none-win32.whl", hash = "sha256:d678407713f3e10df33c5b3d7a343ec0551eb7f14d8ad9ba6febeb96f4e4c75c", size = 6873556 }, + { url = "https://files.pythonhosted.org/packages/9c/22/757f093ed0e319e9648155b8c9d716765442bea5bc98ebc58ad4ad5b0524/maturin-1.8.1-py3-none-win_amd64.whl", hash = "sha256:a526f90fe0e5cb59ffb81f4ff547ddc42e823bbdeae4a31012c0893ca6dcaf46", size = 7823153 }, + { url = "https://files.pythonhosted.org/packages/a4/f5/051413e04f6da25069db5e76759ecdb8cd2a8ab4a94045b5a3bf548c66fa/maturin-1.8.1-py3-none-win_arm64.whl", hash = "sha256:e95f077fd2ddd2f048182880eed458c308571a534be3eb2add4d3dac55bf57f4", size = 6552131 }, ] [package.optional-dependencies] @@ -596,40 +596,40 @@ wheels = [ [[package]] name = "pillow" -version = "11.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/26/0d95c04c868f6bdb0c447e3ee2de5564411845e36a858cfd63766bc7b563/pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739", size = 46737780 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/a3/26e606ff0b2daaf120543e537311fa3ae2eb6bf061490e4fea51771540be/pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923", size = 3147642 }, - { url = "https://files.pythonhosted.org/packages/4f/d5/1caabedd8863526a6cfa44ee7a833bd97f945dc1d56824d6d76e11731939/pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903", size = 2978999 }, - { url = "https://files.pythonhosted.org/packages/d9/ff/5a45000826a1aa1ac6874b3ec5a856474821a1b59d838c4f6ce2ee518fe9/pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4", size = 4196794 }, - { url = "https://files.pythonhosted.org/packages/9d/21/84c9f287d17180f26263b5f5c8fb201de0f88b1afddf8a2597a5c9fe787f/pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f", size = 4300762 }, - { url = "https://files.pythonhosted.org/packages/84/39/63fb87cd07cc541438b448b1fed467c4d687ad18aa786a7f8e67b255d1aa/pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9", size = 4210468 }, - { url = "https://files.pythonhosted.org/packages/7f/42/6e0f2c2d5c60f499aa29be14f860dd4539de322cd8fb84ee01553493fb4d/pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7", size = 4381824 }, - { url = "https://files.pythonhosted.org/packages/31/69/1ef0fb9d2f8d2d114db982b78ca4eeb9db9a29f7477821e160b8c1253f67/pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6", size = 4296436 }, - { url = "https://files.pythonhosted.org/packages/44/ea/dad2818c675c44f6012289a7c4f46068c548768bc6c7f4e8c4ae5bbbc811/pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc", size = 4429714 }, - { url = "https://files.pythonhosted.org/packages/af/3a/da80224a6eb15bba7a0dcb2346e2b686bb9bf98378c0b4353cd88e62b171/pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6", size = 2249631 }, - { url = "https://files.pythonhosted.org/packages/57/97/73f756c338c1d86bb802ee88c3cab015ad7ce4b838f8a24f16b676b1ac7c/pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47", size = 2567533 }, - { url = "https://files.pythonhosted.org/packages/0b/30/2b61876e2722374558b871dfbfcbe4e406626d63f4f6ed92e9c8e24cac37/pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25", size = 2254890 }, - { url = "https://files.pythonhosted.org/packages/63/24/e2e15e392d00fcf4215907465d8ec2a2f23bcec1481a8ebe4ae760459995/pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699", size = 3147300 }, - { url = "https://files.pythonhosted.org/packages/43/72/92ad4afaa2afc233dc44184adff289c2e77e8cd916b3ddb72ac69495bda3/pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38", size = 2978742 }, - { url = "https://files.pythonhosted.org/packages/9e/da/c8d69c5bc85d72a8523fe862f05ababdc52c0a755cfe3d362656bb86552b/pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2", size = 4194349 }, - { url = "https://files.pythonhosted.org/packages/cd/e8/686d0caeed6b998351d57796496a70185376ed9c8ec7d99e1d19ad591fc6/pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2", size = 4298714 }, - { url = "https://files.pythonhosted.org/packages/ec/da/430015cec620d622f06854be67fd2f6721f52fc17fca8ac34b32e2d60739/pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527", size = 4208514 }, - { url = "https://files.pythonhosted.org/packages/44/ae/7e4f6662a9b1cb5f92b9cc9cab8321c381ffbee309210940e57432a4063a/pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa", size = 4380055 }, - { url = "https://files.pythonhosted.org/packages/74/d5/1a807779ac8a0eeed57f2b92a3c32ea1b696e6140c15bd42eaf908a261cd/pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f", size = 4296751 }, - { url = "https://files.pythonhosted.org/packages/38/8c/5fa3385163ee7080bc13026d59656267daaaaf3c728c233d530e2c2757c8/pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb", size = 4430378 }, - { url = "https://files.pythonhosted.org/packages/ca/1d/ad9c14811133977ff87035bf426875b93097fb50af747793f013979facdb/pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798", size = 2249588 }, - { url = "https://files.pythonhosted.org/packages/fb/01/3755ba287dac715e6afdb333cb1f6d69740a7475220b4637b5ce3d78cec2/pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de", size = 2567509 }, - { url = "https://files.pythonhosted.org/packages/c0/98/2c7d727079b6be1aba82d195767d35fcc2d32204c7a5820f822df5330152/pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84", size = 2254791 }, - { url = "https://files.pythonhosted.org/packages/eb/38/998b04cc6f474e78b563716b20eecf42a2fa16a84589d23c8898e64b0ffd/pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b", size = 3150854 }, - { url = "https://files.pythonhosted.org/packages/13/8e/be23a96292113c6cb26b2aa3c8b3681ec62b44ed5c2bd0b258bd59503d3c/pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003", size = 2982369 }, - { url = "https://files.pythonhosted.org/packages/97/8a/3db4eaabb7a2ae8203cd3a332a005e4aba00067fc514aaaf3e9721be31f1/pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2", size = 4333703 }, - { url = "https://files.pythonhosted.org/packages/28/ac/629ffc84ff67b9228fe87a97272ab125bbd4dc462745f35f192d37b822f1/pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a", size = 4412550 }, - { url = "https://files.pythonhosted.org/packages/d6/07/a505921d36bb2df6868806eaf56ef58699c16c388e378b0dcdb6e5b2fb36/pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8", size = 4461038 }, - { url = "https://files.pythonhosted.org/packages/d6/b9/fb620dd47fc7cc9678af8f8bd8c772034ca4977237049287e99dda360b66/pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8", size = 2253197 }, - { url = "https://files.pythonhosted.org/packages/df/86/25dde85c06c89d7fc5db17940f07aae0a56ac69aa9ccb5eb0f09798862a8/pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904", size = 2572169 }, - { url = "https://files.pythonhosted.org/packages/51/85/9c33f2517add612e17f3381aee7c4072779130c634921a756c97bc29fb49/pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", size = 2256828 }, +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 }, + { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 }, + { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 }, + { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 }, + { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 }, + { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 }, + { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 }, + { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 }, + { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 }, + { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 }, + { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 }, + { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 }, + { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 }, + { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 }, + { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 }, + { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 }, + { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 }, + { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 }, + { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 }, + { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 }, + { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 }, + { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 }, + { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 }, + { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 }, + { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 }, + { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 }, + { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, + { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, + { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, ] [[package]] @@ -925,16 +925,16 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.28.0" +version = "20.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/75/53316a5a8050069228a2f6d11f32046cfa94fbb6cc3f08703f59b873de2e/virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa", size = 7650368 } +sdist = { url = "https://files.pythonhosted.org/packages/50/39/689abee4adc85aad2af8174bb195a819d0be064bf55fcc73b49d2b28ae77/virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329", size = 7650532 } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/f9/0919cf6f1432a8c4baa62511f8f8da8225432d22e83e3476f5be1a1edc6e/virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0", size = 4276702 }, + { url = "https://files.pythonhosted.org/packages/51/8f/dfb257ca6b4e27cb990f1631142361e4712badab8e3ca8dc134d96111515/virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb", size = 4276719 }, ] [[package]] From 63fe09b73a81c617baf556178605391785afa2e4 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 14 Jan 2025 11:58:56 +0100 Subject: [PATCH 127/138] Unignore ruff rule ISC001 as it no longer collides with the formatter in ruff 0.9.1 (#758) --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c34af9a8..5d461a23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -99,7 +99,6 @@ ignore = [ # Conflicts with the Ruff formatter "COM812", - "ISC001", # Remove later "TD", # Todos From 765319a19cff22f49f876d71b677ff3d5840ea7f Mon Sep 17 00:00:00 2001 From: Kesp92 Date: Mon, 20 Jan 2025 09:01:12 +0100 Subject: [PATCH 128/138] Add missing t30s combo vacuums (#763) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ¨Kesp92¨ <¨kevespig@gmail.com¨> --- deebot_client/hardware/deebot/ee23uv.py | 273 ++++++++++++++++++++++++ deebot_client/hardware/deebot/ue8kcc.py | 273 ++++++++++++++++++++++++ 2 files changed, 546 insertions(+) create mode 100644 deebot_client/hardware/deebot/ee23uv.py create mode 100644 deebot_client/hardware/deebot/ue8kcc.py diff --git a/deebot_client/hardware/deebot/ee23uv.py b/deebot_client/hardware/deebot/ee23uv.py new file mode 100644 index 00000000..1e75fb77 --- /dev/null +++ b/deebot_client/hardware/deebot/ee23uv.py @@ -0,0 +1,273 @@ +"""Deebot DEEBOT T30S COMBO Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityExecuteTypes, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStation, + CapabilityStats, + DeviceType, +) +from deebot_client.commands import StationAction +from deebot_client.commands.json import station_action +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.child_lock import GetChildLock, SetChildLock +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.efficiency import GetEfficiencyMode, SetEfficiencyMode +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.ota import GetOta, SetOta +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.station_state import GetStationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.sweep_mode import GetSweepMode, SetSweepMode +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.voice_assistant_state import ( + GetVoiceAssistantState, + SetVoiceAssistantState, +) +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + ChildLockEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + EfficiencyModeEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + OtaEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StationEvent, + StatsEvent, + SweepModeEvent, + TotalStatsEvent, + TrueDetectEvent, + VoiceAssistantStateEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, + WorkMode, + WorkModeEvent, + auto_empty, +) +from deebot_client.events.auto_empty import AutoEmptyEvent +from deebot_client.events.efficiency_mode import EfficiencyMode +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + work_mode=CapabilitySetTypes( + event=WorkModeEvent, + get=[GetWorkMode()], + set=SetWorkMode, + types=( + WorkMode.MOP, + WorkMode.MOP_AFTER_VACUUM, + WorkMode.VACUUM, + WorkMode.VACUUM_AND_MOP, + ), + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.HAND_FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.HAND_FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + child_lock=CapabilitySetEnable( + ChildLockEvent, [GetChildLock()], SetChildLock + ), + efficiency_mode=CapabilitySetTypes( + event=EfficiencyModeEvent, + get=[GetEfficiencyMode()], + set=SetEfficiencyMode, + types=( + EfficiencyMode.ENERGY_EFFICIENT_MODE, + EfficiencyMode.STANDARD_MODE, + ), + ), + ota=CapabilitySetEnable(OtaEvent, [GetOta()], SetOta), + sweep_mode=CapabilitySetEnable( + SweepModeEvent, [GetSweepMode()], SetSweepMode + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + voice_assistant=CapabilitySetEnable( + VoiceAssistantStateEvent, + [GetVoiceAssistantState()], + SetVoiceAssistantState, + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + station=CapabilityStation( + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, + ), + ), + state=CapabilityEvent(StationEvent, [GetStationState()]), + ), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +) diff --git a/deebot_client/hardware/deebot/ue8kcc.py b/deebot_client/hardware/deebot/ue8kcc.py new file mode 100644 index 00000000..1e75fb77 --- /dev/null +++ b/deebot_client/hardware/deebot/ue8kcc.py @@ -0,0 +1,273 @@ +"""Deebot DEEBOT T30S COMBO Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityExecuteTypes, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStation, + CapabilityStats, + DeviceType, +) +from deebot_client.commands import StationAction +from deebot_client.commands.json import station_action +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty +from deebot_client.commands.json.battery import GetBattery +from deebot_client.commands.json.carpet import ( + GetCarpetAutoFanBoost, + SetCarpetAutoFanBoost, +) +from deebot_client.commands.json.charge import Charge +from deebot_client.commands.json.charge_state import GetChargeState +from deebot_client.commands.json.child_lock import GetChildLock, SetChildLock +from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo +from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount +from deebot_client.commands.json.clean_logs import GetCleanLogs +from deebot_client.commands.json.clean_preference import ( + GetCleanPreference, + SetCleanPreference, +) +from deebot_client.commands.json.continuous_cleaning import ( + GetContinuousCleaning, + SetContinuousCleaning, +) +from deebot_client.commands.json.custom import CustomCommand +from deebot_client.commands.json.efficiency import GetEfficiencyMode, SetEfficiencyMode +from deebot_client.commands.json.error import GetError +from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed +from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan +from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.ota import GetOta, SetOta +from deebot_client.commands.json.play_sound import PlaySound +from deebot_client.commands.json.pos import GetPos +from deebot_client.commands.json.relocation import SetRelocationState +from deebot_client.commands.json.station_state import GetStationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.sweep_mode import GetSweepMode, SetSweepMode +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.voice_assistant_state import ( + GetVoiceAssistantState, + SetVoiceAssistantState, +) +from deebot_client.commands.json.volume import GetVolume, SetVolume +from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo +from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode +from deebot_client.const import DataType +from deebot_client.events import ( + AdvancedModeEvent, + AvailabilityEvent, + BatteryEvent, + CachedMapInfoEvent, + CarpetAutoFanBoostEvent, + ChildLockEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + EfficiencyModeEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + OtaEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StationEvent, + StatsEvent, + SweepModeEvent, + TotalStatsEvent, + TrueDetectEvent, + VoiceAssistantStateEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, + WorkMode, + WorkModeEvent, + auto_empty, +) +from deebot_client.events.auto_empty import AutoEmptyEvent +from deebot_client.events.efficiency_mode import EfficiencyMode +from deebot_client.models import StaticDeviceInfo +from deebot_client.util import short_name + +from . import DEVICES + +DEVICES[short_name(__name__)] = StaticDeviceInfo( + DataType.JSON, + Capabilities( + device_type=DeviceType.VACUUM, + availability=CapabilityEvent( + AvailabilityEvent, [GetBattery(is_available_check=True)] + ), + battery=CapabilityEvent(BatteryEvent, [GetBattery()]), + charge=CapabilityExecute(Charge), + clean=CapabilityClean( + action=CapabilityCleanAction(command=Clean, area=CleanArea), + continuous=CapabilitySetEnable( + ContinuousCleaningEvent, + [GetContinuousCleaning()], + SetContinuousCleaning, + ), + count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount), + log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]), + preference=CapabilitySetEnable( + CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference + ), + work_mode=CapabilitySetTypes( + event=WorkModeEvent, + get=[GetWorkMode()], + set=SetWorkMode, + types=( + WorkMode.MOP, + WorkMode.MOP_AFTER_VACUUM, + WorkMode.VACUUM, + WorkMode.VACUUM_AND_MOP, + ), + ), + ), + custom=CapabilityCustomCommand( + event=CustomCommandEvent, get=[], set=CustomCommand + ), + error=CapabilityEvent(ErrorEvent, [GetError()]), + fan_speed=CapabilitySetTypes( + event=FanSpeedEvent, + get=[GetFanSpeed()], + set=SetFanSpeed, + types=( + FanSpeedLevel.QUIET, + FanSpeedLevel.NORMAL, + FanSpeedLevel.MAX, + FanSpeedLevel.MAX_PLUS, + ), + ), + life_span=CapabilityLifeSpan( + types=( + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.HAND_FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.HAND_FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + multi_state=CapabilitySetEnable( + MultimapStateEvent, [GetMultimapState()], SetMultimapState + ), + position=CapabilityEvent(PositionsEvent, [GetPos()]), + relocation=CapabilityExecute(SetRelocationState), + rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]), + trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]), + ), + network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]), + play_sound=CapabilityExecute(PlaySound), + settings=CapabilitySettings( + advanced_mode=CapabilitySetEnable( + AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode + ), + carpet_auto_fan_boost=CapabilitySetEnable( + CarpetAutoFanBoostEvent, + [GetCarpetAutoFanBoost()], + SetCarpetAutoFanBoost, + ), + child_lock=CapabilitySetEnable( + ChildLockEvent, [GetChildLock()], SetChildLock + ), + efficiency_mode=CapabilitySetTypes( + event=EfficiencyModeEvent, + get=[GetEfficiencyMode()], + set=SetEfficiencyMode, + types=( + EfficiencyMode.ENERGY_EFFICIENT_MODE, + EfficiencyMode.STANDARD_MODE, + ), + ), + ota=CapabilitySetEnable(OtaEvent, [GetOta()], SetOta), + sweep_mode=CapabilitySetEnable( + SweepModeEvent, [GetSweepMode()], SetSweepMode + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + voice_assistant=CapabilitySetEnable( + VoiceAssistantStateEvent, + [GetVoiceAssistantState()], + SetVoiceAssistantState, + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + station=CapabilityStation( + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, + ), + ), + state=CapabilityEvent(StationEvent, [GetStationState()]), + ), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +) From fe35037c4a23e05dc224080bf0abf268feac54bf Mon Sep 17 00:00:00 2001 From: flubshi Date: Mon, 20 Jan 2025 09:02:27 +0100 Subject: [PATCH 129/138] Add XML command "PlaySound" (#574) Co-authored-by: flubshi <4031504+flubshi@users.noreply.github.com> Co-authored-by: Robert Resch Co-authored-by: Tim Kranz Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- deebot_client/commands/xml/__init__.py | 3 +++ deebot_client/commands/xml/common.py | 30 ++++++++++++++++++++++-- deebot_client/commands/xml/play_sound.py | 14 +++++++++++ tests/commands/xml/test_play_sound.py | 24 +++++++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 deebot_client/commands/xml/play_sound.py create mode 100644 tests/commands/xml/test_play_sound.py diff --git a/deebot_client/commands/xml/__init__.py b/deebot_client/commands/xml/__init__.py index 03be9996..20166cc8 100644 --- a/deebot_client/commands/xml/__init__.py +++ b/deebot_client/commands/xml/__init__.py @@ -10,6 +10,7 @@ from .error import GetError from .fan_speed import GetFanSpeed from .life_span import GetLifeSpan +from .play_sound import PlaySound from .pos import GetPos from .stats import GetCleanSum @@ -23,6 +24,7 @@ "GetFanSpeed", "GetLifeSpan", "GetPos", + "PlaySound", ] # fmt: off @@ -30,6 +32,7 @@ _COMMANDS: list[type[XmlCommand]] = [ GetError, GetLifeSpan, + PlaySound, ] # fmt: on diff --git a/deebot_client/commands/xml/common.py b/deebot_client/commands/xml/common.py index bc04d3d9..ac026df7 100644 --- a/deebot_client/commands/xml/common.py +++ b/deebot_client/commands/xml/common.py @@ -8,10 +8,10 @@ from defusedxml import ElementTree # type: ignore[import-untyped] -from deebot_client.command import Command, CommandWithMessageHandling +from deebot_client.command import Command, CommandWithMessageHandling, SetCommand from deebot_client.const import DataType from deebot_client.logging_filter import get_logger -from deebot_client.message import HandlingResult, MessageStr +from deebot_client.message import HandlingResult, HandlingState, MessageStr if TYPE_CHECKING: from deebot_client.event_bus import EventBus @@ -60,3 +60,29 @@ def _handle_str(cls, event_bus: EventBus, message: str) -> HandlingResult: """ xml = ElementTree.fromstring(message) return cls._handle_xml(event_bus, xml) + + +class ExecuteCommand(XmlCommandWithMessageHandling, ABC): + """Command, which is executing something (ex. Charge).""" + + @classmethod + def _handle_xml(cls, _: EventBus, xml: Element) -> HandlingResult: + """Handle message->xml and notify the correct event subscribers. + + :return: A message response + """ + # Success event looks like + if xml.attrib.get("ret") == "ok": + return HandlingResult.success() + + _LOGGER.warning( + 'Command "%s" was not successful. XML response: %s', cls.NAME, xml + ) + return HandlingResult(HandlingState.FAILED) + + +class XmlSetCommand(ExecuteCommand, SetCommand, ABC): + """Xml base set command. + + Command needs to be linked to the "get" command, for handling (updating) the sensors. + """ diff --git a/deebot_client/commands/xml/play_sound.py b/deebot_client/commands/xml/play_sound.py new file mode 100644 index 00000000..31eaf6be --- /dev/null +++ b/deebot_client/commands/xml/play_sound.py @@ -0,0 +1,14 @@ +"""Play sound commands.""" + +from __future__ import annotations + +from .common import ExecuteCommand + + +class PlaySound(ExecuteCommand): + """Play sound command.""" + + NAME = "PlaySound" + + def __init__(self) -> None: + super().__init__({"sid": "30"}) diff --git a/tests/commands/xml/test_play_sound.py b/tests/commands/xml/test_play_sound.py new file mode 100644 index 00000000..f3b158da --- /dev/null +++ b/tests/commands/xml/test_play_sound.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +import pytest + +from deebot_client.command import CommandResult +from deebot_client.commands.xml import PlaySound +from deebot_client.message import HandlingState +from tests.commands import assert_command + +from . import get_request_xml + + +@pytest.mark.parametrize( + ("xml_response", "command_result"), + [ + ("", HandlingState.SUCCESS), + ("", HandlingState.FAILED), + ], +) +async def test_play_sound(xml_response: str, command_result: HandlingState) -> None: + json = get_request_xml(xml_response) + await assert_command( + PlaySound(), json, None, command_result=CommandResult(command_result) + ) From c58f6a4943d32fa3914f4af259725f79abcbbaf9 Mon Sep 17 00:00:00 2001 From: flubshi Date: Mon, 20 Jan 2025 09:03:24 +0100 Subject: [PATCH 130/138] Test SetVolume: adjust c&p method name (#762) Co-authored-by: flubshi <4031504+flubshi@users.noreply.github.com> --- tests/commands/json/test_volume.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/commands/json/test_volume.py b/tests/commands/json/test_volume.py index af8406d8..dc0e767d 100644 --- a/tests/commands/json/test_volume.py +++ b/tests/commands/json/test_volume.py @@ -15,6 +15,6 @@ async def test_GetVolume() -> None: @pytest.mark.parametrize("level", [0, 2, 10]) -async def test_SetCleanCount(level: int) -> None: +async def test_SetVolume(level: int) -> None: args = {"volume": level} await assert_set_command(SetVolume(level), args, VolumeEvent(level, None)) From 6eab513714370d429432b94636778e030c8c4de2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 08:06:25 +0000 Subject: [PATCH 131/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Lock=20file=20main?= =?UTF-8?q?tenance=20(#764)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 74 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/uv.lock b/uv.lock index 866421dd..acd686d7 100644 --- a/uv.lock +++ b/uv.lock @@ -526,40 +526,40 @@ wheels = [ [[package]] name = "numpy" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/fdbf6a7871703df6160b5cf3dd774074b086d278172285c52c2758b76305/numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", size = 20227662 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/12/b928871c570d4a87ab13d2cc19f8817f17e340d5481621930e76b80ffb7d/numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", size = 20909861 }, - { url = "https://files.pythonhosted.org/packages/3d/c3/59df91ae1d8ad7c5e03efd63fd785dec62d96b0fe56d1f9ab600b55009af/numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", size = 14095776 }, - { url = "https://files.pythonhosted.org/packages/af/4e/8ed5868efc8e601fb69419644a280e9c482b75691466b73bfaab7d86922c/numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", size = 5126239 }, - { url = "https://files.pythonhosted.org/packages/1a/74/dd0bbe650d7bc0014b051f092f2de65e34a8155aabb1287698919d124d7f/numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", size = 6659296 }, - { url = "https://files.pythonhosted.org/packages/7f/11/4ebd7a3f4a655764dc98481f97bd0a662fb340d1001be6050606be13e162/numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", size = 14047121 }, - { url = "https://files.pythonhosted.org/packages/7f/a7/c1f1d978166eb6b98ad009503e4d93a8c1962d0eb14a885c352ee0276a54/numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", size = 16096599 }, - { url = "https://files.pythonhosted.org/packages/3d/6d/0e22afd5fcbb4d8d0091f3f46bf4e8906399c458d4293da23292c0ba5022/numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51", size = 15243932 }, - { url = "https://files.pythonhosted.org/packages/03/39/e4e5832820131ba424092b9610d996b37e5557180f8e2d6aebb05c31ae54/numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", size = 17861032 }, - { url = "https://files.pythonhosted.org/packages/5f/8a/3794313acbf5e70df2d5c7d2aba8718676f8d054a05abe59e48417fb2981/numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", size = 6274018 }, - { url = "https://files.pythonhosted.org/packages/17/c1/c31d3637f2641e25c7a19adf2ae822fdaf4ddd198b05d79a92a9ce7cb63e/numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", size = 12613843 }, - { url = "https://files.pythonhosted.org/packages/20/d6/91a26e671c396e0c10e327b763485ee295f5a5a7a48c553f18417e5a0ed5/numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", size = 20896464 }, - { url = "https://files.pythonhosted.org/packages/8c/40/5792ccccd91d45e87d9e00033abc4f6ca8a828467b193f711139ff1f1cd9/numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", size = 14111350 }, - { url = "https://files.pythonhosted.org/packages/c0/2a/fb0a27f846cb857cef0c4c92bef89f133a3a1abb4e16bba1c4dace2e9b49/numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", size = 5111629 }, - { url = "https://files.pythonhosted.org/packages/eb/e5/8e81bb9d84db88b047baf4e8b681a3e48d6390bc4d4e4453eca428ecbb49/numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", size = 6645865 }, - { url = "https://files.pythonhosted.org/packages/7a/1a/a90ceb191dd2f9e2897c69dde93ccc2d57dd21ce2acbd7b0333e8eea4e8d/numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", size = 14043508 }, - { url = "https://files.pythonhosted.org/packages/f1/5a/e572284c86a59dec0871a49cd4e5351e20b9c751399d5f1d79628c0542cb/numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", size = 16094100 }, - { url = "https://files.pythonhosted.org/packages/0c/2c/a79d24f364788386d85899dd280a94f30b0950be4b4a545f4fa4ed1d4ca7/numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", size = 15239691 }, - { url = "https://files.pythonhosted.org/packages/cf/79/1e20fd1c9ce5a932111f964b544facc5bb9bde7865f5b42f00b4a6a9192b/numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", size = 17856571 }, - { url = "https://files.pythonhosted.org/packages/be/5b/cc155e107f75d694f562bdc84a26cc930569f3dfdfbccb3420b626065777/numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", size = 6270841 }, - { url = "https://files.pythonhosted.org/packages/44/be/0e5cd009d2162e4138d79a5afb3b5d2341f0fe4777ab6e675aa3d4a42e21/numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", size = 12606618 }, - { url = "https://files.pythonhosted.org/packages/a8/87/04ddf02dd86fb17c7485a5f87b605c4437966d53de1e3745d450343a6f56/numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", size = 20921004 }, - { url = "https://files.pythonhosted.org/packages/6e/3e/d0e9e32ab14005425d180ef950badf31b862f3839c5b927796648b11f88a/numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", size = 14119910 }, - { url = "https://files.pythonhosted.org/packages/b5/5b/aa2d1905b04a8fb681e08742bb79a7bddfc160c7ce8e1ff6d5c821be0236/numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", size = 5153612 }, - { url = "https://files.pythonhosted.org/packages/ce/35/6831808028df0648d9b43c5df7e1051129aa0d562525bacb70019c5f5030/numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", size = 6668401 }, - { url = "https://files.pythonhosted.org/packages/b1/38/10ef509ad63a5946cc042f98d838daebfe7eaf45b9daaf13df2086b15ff9/numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", size = 14014198 }, - { url = "https://files.pythonhosted.org/packages/df/f8/c80968ae01df23e249ee0a4487fae55a4c0fe2f838dfe9cc907aa8aea0fa/numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", size = 16076211 }, - { url = "https://files.pythonhosted.org/packages/09/69/05c169376016a0b614b432967ac46ff14269eaffab80040ec03ae1ae8e2c/numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", size = 15220266 }, - { url = "https://files.pythonhosted.org/packages/f1/ff/94a4ce67ea909f41cf7ea712aebbe832dc67decad22944a1020bb398a5ee/numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", size = 17852844 }, - { url = "https://files.pythonhosted.org/packages/46/72/8a5dbce4020dfc595592333ef2fbb0a187d084ca243b67766d29d03e0096/numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", size = 6326007 }, - { url = "https://files.pythonhosted.org/packages/7b/9c/4fce9cf39dde2562584e4cfd351a0140240f82c0e3569ce25a250f47037d/numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", size = 12693107 }, +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 }, + { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 }, + { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 }, + { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 }, + { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 }, + { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 }, + { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 }, + { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 }, + { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 }, + { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 }, + { url = "https://files.pythonhosted.org/packages/e1/fe/df5624001f4f5c3e0b78e9017bfab7fdc18a8d3b3d3161da3d64924dd659/numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc", size = 20899188 }, + { url = "https://files.pythonhosted.org/packages/a9/80/d349c3b5ed66bd3cb0214be60c27e32b90a506946857b866838adbe84040/numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369", size = 14113972 }, + { url = "https://files.pythonhosted.org/packages/9d/50/949ec9cbb28c4b751edfa64503f0913cbfa8d795b4a251e7980f13a8a655/numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd", size = 5114294 }, + { url = "https://files.pythonhosted.org/packages/8d/f3/399c15629d5a0c68ef2aa7621d430b2be22034f01dd7f3c65a9c9666c445/numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be", size = 6648426 }, + { url = "https://files.pythonhosted.org/packages/2c/03/c72474c13772e30e1bc2e558cdffd9123c7872b731263d5648b5c49dd459/numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84", size = 14045990 }, + { url = "https://files.pythonhosted.org/packages/83/9c/96a9ab62274ffafb023f8ee08c88d3d31ee74ca58869f859db6845494fa6/numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff", size = 16096614 }, + { url = "https://files.pythonhosted.org/packages/d5/34/cd0a735534c29bec7093544b3a509febc9b0df77718a9b41ffb0809c9f46/numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0", size = 15242123 }, + { url = "https://files.pythonhosted.org/packages/5e/6d/541717a554a8f56fa75e91886d9b79ade2e595918690eb5d0d3dbd3accb9/numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de", size = 17859160 }, + { url = "https://files.pythonhosted.org/packages/b9/a5/fbf1f2b54adab31510728edd06a05c1b30839f37cf8c9747cb85831aaf1b/numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9", size = 6273337 }, + { url = "https://files.pythonhosted.org/packages/56/e5/01106b9291ef1d680f82bc47d0c5b5e26dfed15b0754928e8f856c82c881/numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369", size = 12609010 }, + { url = "https://files.pythonhosted.org/packages/9f/30/f23d9876de0f08dceb707c4dcf7f8dd7588266745029debb12a3cdd40be6/numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391", size = 20924451 }, + { url = "https://files.pythonhosted.org/packages/6a/ec/6ea85b2da9d5dfa1dbb4cb3c76587fc8ddcae580cb1262303ab21c0926c4/numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39", size = 14122390 }, + { url = "https://files.pythonhosted.org/packages/68/05/bfbdf490414a7dbaf65b10c78bc243f312c4553234b6d91c94eb7c4b53c2/numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317", size = 5156590 }, + { url = "https://files.pythonhosted.org/packages/f7/ec/fe2e91b2642b9d6544518388a441bcd65c904cea38d9ff998e2e8ebf808e/numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49", size = 6671958 }, + { url = "https://files.pythonhosted.org/packages/b1/6f/6531a78e182f194d33ee17e59d67d03d0d5a1ce7f6be7343787828d1bd4a/numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2", size = 14019950 }, + { url = "https://files.pythonhosted.org/packages/e1/fb/13c58591d0b6294a08cc40fcc6b9552d239d773d520858ae27f39997f2ae/numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7", size = 16079759 }, + { url = "https://files.pythonhosted.org/packages/2c/f2/f2f8edd62abb4b289f65a7f6d1f3650273af00b91b7267a2431be7f1aec6/numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb", size = 15226139 }, + { url = "https://files.pythonhosted.org/packages/aa/29/14a177f1a90b8ad8a592ca32124ac06af5eff32889874e53a308f850290f/numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648", size = 17856316 }, + { url = "https://files.pythonhosted.org/packages/95/03/242ae8d7b97f4e0e4ab8dd51231465fb23ed5e802680d629149722e3faf1/numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4", size = 6329134 }, + { url = "https://files.pythonhosted.org/packages/80/94/cd9e9b04012c015cb6320ab3bf43bc615e248dddfeb163728e800a5d96f0/numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576", size = 12696208 }, ] [[package]] @@ -925,16 +925,16 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.28.1" +version = "20.29.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/39/689abee4adc85aad2af8174bb195a819d0be064bf55fcc73b49d2b28ae77/virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329", size = 7650532 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/ca/f23dcb02e161a9bba141b1c08aa50e8da6ea25e6d780528f1d385a3efe25/virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35", size = 7658028 } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/8f/dfb257ca6b4e27cb990f1631142361e4712badab8e3ca8dc134d96111515/virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb", size = 4276719 }, + { url = "https://files.pythonhosted.org/packages/89/9b/599bcfc7064fbe5740919e78c5df18e5dceb0887e676256a1061bb5ae232/virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779", size = 4282379 }, ] [[package]] From 87eb61c8d3e895d8dd8cfc3a6163062dd2e37c90 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 20 Jan 2025 12:00:06 +0100 Subject: [PATCH 132/138] Fix decompress_7z_base64_data (#765) --- deebot_client/commands/json/map.py | 4 ++-- deebot_client/map.py | 4 ++-- deebot_client/rs.pyi | 2 +- src/lib.rs | 7 +++---- tests/test_map.py | 2 +- tests/test_rs.py | 17 +++++++++++------ 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/deebot_client/commands/json/map.py b/deebot_client/commands/json/map.py index 26155fb8..d0c9678f 100644 --- a/deebot_client/commands/json/map.py +++ b/deebot_client/commands/json/map.py @@ -275,7 +275,7 @@ def _handle_body_data_dict( # This command is used by new and old bots if data.get("compress", 0) == 1: # Newer bot's return coordinates as base64 decoded string - coordinates = decompress_7z_base64_data(data["value"]) + coordinates = decompress_7z_base64_data(data["value"]).decode() else: # Older bot's return coordinates direct as comma/semicolon separated list coordinates = data["value"] @@ -305,7 +305,7 @@ def _get_subset_ids( ) -> list[int] | None: """Return subset ids.""" # subset is based64 7z compressed - subsets = json.loads(decompress_7z_base64_data(data["subsets"])) + subsets = json.loads(decompress_7z_base64_data(data["subsets"]).decode()) match data["type"]: case MapSetType.ROOMS: diff --git a/deebot_client/map.py b/deebot_client/map.py index 86ef1df2..97d49175 100644 --- a/deebot_client/map.py +++ b/deebot_client/map.py @@ -395,7 +395,7 @@ async def on_map_subset(event: MapSubsetEvent) -> None: def _update_trace_points(self, data: str) -> None: _LOGGER.debug("[_update_trace_points] Begin") - trace_points = decompress_7z_base64_data(data).encode() + trace_points = decompress_7z_base64_data(data) for i in range(0, len(trace_points), 5): position_x, position_y = struct.unpack(" Image.Image: def update_points(self, base64_data: str) -> None: """Add map piece points.""" - decoded = decompress_7z_base64_data(base64_data).encode() + decoded = decompress_7z_base64_data(base64_data) old_crc32 = self._crc32 self._crc32 = zlib.crc32(decoded) diff --git a/deebot_client/rs.pyi b/deebot_client/rs.pyi index 681c46c5..b43362f0 100644 --- a/deebot_client/rs.pyi +++ b/deebot_client/rs.pyi @@ -1,2 +1,2 @@ -def decompress_7z_base64_data(value: str) -> str: +def decompress_7z_base64_data(value: str) -> bytes: """Decompress base64 decoded 7z compressed string.""" diff --git a/src/lib.rs b/src/lib.rs index 1994812d..62c2f617 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ use base64::{engine::general_purpose, Engine as _}; use pyo3::exceptions::PyValueError; use pyo3::prelude::*; -fn _decompress_7z_base64_data(value: String) -> Result> { +fn _decompress_7z_base64_data(value: String) -> Result, Box> { let mut bytes = general_purpose::STANDARD.decode(value)?; // Insert required 0 bytes @@ -12,13 +12,12 @@ fn _decompress_7z_base64_data(value: String) -> Result> { bytes.insert(8, 0); } - let decompressed = lzma::decompress(&bytes)?; - Ok(String::from_utf8(decompressed)?) + Ok(lzma::decompress(&bytes)?) } /// Decompress base64 decoded 7z compressed string. #[pyfunction] -fn decompress_7z_base64_data(value: String) -> Result { +fn decompress_7z_base64_data(value: String) -> Result, PyErr> { Ok(_decompress_7z_base64_data(value).map_err(|err| PyValueError::new_err(err.to_string()))?) } diff --git a/tests/test_map.py b/tests/test_map.py index 21544a4c..4ff16fe4 100644 --- a/tests/test_map.py +++ b/tests/test_map.py @@ -159,7 +159,7 @@ async def on_change() -> None: @patch( "deebot_client.map.decompress_7z_base64_data", - Mock(return_value="\x10\x00\x00\x01\x00"), + Mock(return_value=b"\x10\x00\x00\x01\x00"), ) async def test_Map_svg_traces_path( execute_mock: AsyncMock, event_bus_mock: Mock diff --git a/tests/test_rs.py b/tests/test_rs.py index 4d1f50a9..b84b1092 100644 --- a/tests/test_rs.py +++ b/tests/test_rs.py @@ -19,19 +19,24 @@ [ ( "XQAABACZAAAAABaOQmW9Bsibxz42rKUpGlV7Rr4D1S/9x9mDa60v4J1BKrEsnk34EAt6X5gKkxwYzfOu3T8GAPpmIy5o4A==", - "-9125,3225;-9025,3225;-8975,3175;-8975,2475;-8925,2425;-8925,2375;-8325,2375;-8275,2425;-8225,2375;-8225,2425;-8174,2475;-8024,2475;-8024,4375;-9125,4375", + b"-9125,3225;-9025,3225;-8975,3175;-8975,2475;-8925,2425;-8925,2375;-8325,2375;-8275,2425;-8225,2375;-8225,2425;-8174,2475;-8024,2475;-8024,4375;-9125,4375", ), ( "XQAABABBAAAAAC2WwEIwUhHX3vfFDfs1H1PUqtdWgakwVnMBz3Bb3yaoE5OYkdYA", - '[["4","-6217","3919","-6217","231","-2642","231","-2642","3919"]]', + b'[["4","-6217","3919","-6217","231","-2642","231","-2642","3919"]]', ), ( "XQAABADHAAAAAC2WwEHwYhHX3vWwDK80QCnaQU0mwUd9Vk34ub6OxzOk6kdFfbFvpVp4iIlKisAvp0MznQNYEZ8koxFHnO+iM44GUKgujGQKgzl0bScbQgaon1jI3eyCRikWlkmrbwA=", - '[["0","-5195","-1059","-5195","-37","-5806","-37","-5806","-1059"],["1","-7959","220","-7959","1083","-9254","1083","-9254","220"],["2","-9437","347","-5387","410"],["3","-5667","317","-4888","-56"]]', + b'[["0","-5195","-1059","-5195","-37","-5806","-37","-5806","-1059"],["1","-7959","220","-7959","1083","-9254","1083","-9254","220"],["2","-9437","347","-5387","410"],["3","-5667","317","-4888","-56"]]', + ), + ( + "XQAABACvAAAAAAAAAEINQkt4BfqEvt9Pow7YU9KWRVBcSBosIDAOtACCicHy+vmfexxcutQUhqkAPQlBawOeXo/VSrOqF7yhdJ1JPICUs3IhIebU62Qego0vdk8oObiLh3VY/PVkqQyvR4dHxUDzMhX7HAguZVn3yC17+cQ18N4kaydN3LfSUtV/zejrBM4=", + b'\x00\x00\x01\x00\x98\xf6\xff\x01\x00\x18\xf9\xff\xf8\xff@\x00\x00\xf1\xff@\x06\x00\xe9\xff@\x0b\x00\xe0\xff@\x15\x00\xe2\xff@\x1f\x00\xe2\xff@(\x00\xde\xff@.\x00\xd6\xff@5\x00\xcd\xff@4\x00\xc3\xff@0\x00\xba\xff@,\x00\xb1\xff@"\x00\xad\xff@\x18\x00\xad\xff@\x0e\x00\xae\xff@\x06\x00\xb4\xff@\x00\x00\xbc\xff@\xfe\xff\xc5\xff@\x00\x00\xd0\xff@\x03\x00\xda\xff@\x0b\x00\xe0\xff@\x15\x00\xe3\xff@\x15\x00\xed\xffH\x0e\x00\xf4\xffH\x05\x00\xf9\xffH\x0c\x00\xf2\xffH\x15\x00\xee\xffH\x1f\x00\xec\xffH)\x00\xec\xffH3\x00\xe8\xffH:\x00\xe1\xffH@\x00\xd9\xff@F\x00\xd1\xff@', ), ], + ids=["1", "2", "3", "4"], ) -def test_decompress_7z_base64_data(input: str, expected: str) -> None: +def test_decompress_7z_base64_data(input: str, expected: bytes) -> None: """Test decompress_7z_base64_data function.""" assert _decompress_7z_base64_data_python(input) == expected assert decompress_7z_base64_data(input) == expected @@ -58,7 +63,7 @@ def test_decompress_7z_base64_data_errors( assert decompress_7z_base64_data(input) -def _decompress_7z_base64_data_python(data: str) -> str: +def _decompress_7z_base64_data_python(data: str) -> bytes: """Decompress base64 decoded 7z compressed string.""" final_array = bytearray() @@ -71,4 +76,4 @@ def _decompress_7z_base64_data_python(data: str) -> str: final_array.append(idx) dec = lzma.LZMADecompressor(lzma.FORMAT_AUTO, None, None) - return dec.decompress(final_array).decode() + return dec.decompress(final_array) From 1af8940c9adc02cc00a5b0d56f04f15ecd2dd4b1 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 20 Jan 2025 17:31:08 +0100 Subject: [PATCH 133/138] Add codspeed and first benchmark test (#766) --- .github/workflows/ci.yml | 35 ++++++++++++- .gitignore | 4 +- pyproject.toml | 1 + tests/test_rs.py | 14 ++++-- uv.lock | 105 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 153 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d80946d9..7d10b62d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,12 +80,43 @@ jobs: - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: - token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true - name: Upload test results to Codecov if: ${{ !cancelled() }} uses: codecov/test-results-action@v1 with: - token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true + + benchmarks: + runs-on: "ubuntu-latest" + name: Run benchmarks + steps: + - name: ⤵️ Checkout repository + uses: actions/checkout@v4 + + - name: 🏗 Install uv + uses: astral-sh/setup-uv@v5 + + - name: 🏗 Setup Python + uses: actions/setup-python@v5 + with: + python-version-file: ".python-version" + + - name: Install additional OS dependencies + run: | + sudo apt-get update + sudo apt-get -y install \ + pkg-config \ + liblzma-dev + + - name: 🏗 Install the project + run: | + uv export --dev > requirements.txt + uv pip install -e . --system -r requirements.txt + + - name: Run benchmarks + uses: CodSpeedHQ/action@main + with: + run: pytest tests/ --codspeed + token: ${{ secrets.CODSPEED_TOKEN }} diff --git a/.gitignore b/.gitignore index 6b3890ec..a3b4c0c0 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,6 @@ test.py /target # rust so -*.cpython*.so \ No newline at end of file +*.cpython*.so + +.codspeed \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 5d461a23..03af1540 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,7 @@ dev-dependencies = [ "types-pillow>=10.2.0.20240822", "maturin[patchelf]>=1.7.8", "maturin-import-hook>=0.2.0", + "pytest-codspeed>=3.1.2", ] [tool.maturin] diff --git a/tests/test_rs.py b/tests/test_rs.py index b84b1092..5bbb3b43 100644 --- a/tests/test_rs.py +++ b/tests/test_rs.py @@ -13,6 +13,8 @@ if TYPE_CHECKING: from contextlib import AbstractContextManager + from pytest_codspeed import BenchmarkFixture + @pytest.mark.parametrize( ("input", "expected"), @@ -36,10 +38,16 @@ ], ids=["1", "2", "3", "4"], ) -def test_decompress_7z_base64_data(input: str, expected: bytes) -> None: +def test_decompress_7z_base64_data( + benchmark: BenchmarkFixture, input: str, expected: bytes +) -> None: """Test decompress_7z_base64_data function.""" - assert _decompress_7z_base64_data_python(input) == expected - assert decompress_7z_base64_data(input) == expected + # Benchmark only the production function + result = benchmark(decompress_7z_base64_data, input) + assert result == expected + + # Verify that the old python function is producing the same result + assert _decompress_7z_base64_data_python(input) == result @pytest.mark.parametrize( diff --git a/uv.lock b/uv.lock index acd686d7..0933ea4c 100644 --- a/uv.lock +++ b/uv.lock @@ -117,6 +117,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, ] +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + [[package]] name = "cfgv" version = "3.4.0" @@ -232,6 +265,7 @@ dev = [ { name = "pylint" }, { name = "pytest" }, { name = "pytest-asyncio" }, + { name = "pytest-codspeed" }, { name = "pytest-cov" }, { name = "pytest-docker-fixtures" }, { name = "pytest-timeout" }, @@ -262,6 +296,7 @@ dev = [ { name = "pylint", specifier = "==3.3.3" }, { name = "pytest", specifier = "==8.3.4" }, { name = "pytest-asyncio", specifier = "==0.25.2" }, + { name = "pytest-codspeed", specifier = ">=3.1.2" }, { name = "pytest-cov", specifier = "==6.0.0" }, { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, { name = "pytest-timeout", specifier = "==2.3.1" }, @@ -396,6 +431,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", size = 92310 }, ] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + [[package]] name = "maturin" version = "1.8.1" @@ -442,6 +489,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + [[package]] name = "multidict" version = "6.1.0" @@ -716,6 +772,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b1/ec/1fb891d8a2660716aadb2143235481d15ed1cbfe3ad669194690b0604492/pycountry-24.6.1-py3-none-any.whl", hash = "sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f", size = 6335189 }, ] +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + [[package]] name = "pylint" version = "3.3.3" @@ -761,6 +835,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/d8/defa05ae50dcd6019a95527200d3b3980043df5aa445d40cb0ef9f7f98ab/pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075", size = 19400 }, ] +[[package]] +name = "pytest-codspeed" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, + { name = "pytest" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/39/4a94b61e981f993d52d0fbff259c3de08a2fb884a77464f35522031125d5/pytest_codspeed-3.1.2.tar.gz", hash = "sha256:09c1733af3aab35e94a621aa510f2d2114f65591e6f644c42ca3f67547edad4b", size = 18277 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/bb/42fa7de046ddd0cefb1987d72e7ed4ee5ae4d962c8e6c62c29a8d6334e90/pytest_codspeed-3.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d0f264991de5b5cdc118b96fc671386cca3f0f34e411482939bf2459dc599097", size = 27114 }, + { url = "https://files.pythonhosted.org/packages/0a/8e/bc84e8f94637ef31323961e25ce83508edb630e05a5956ce585fa96b57f2/pytest_codspeed-3.1.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0695a4bcd5ff04e8379124dba5d9795ea5e0cadf38be7a0406432fc1467b555", size = 25870 }, + { url = "https://files.pythonhosted.org/packages/d6/a1/b85a880916d8c8992a18ce2ee41b179e867af1b5d9ea1c27a68190780d3d/pytest_codspeed-3.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dc356c8dcaaa883af83310f397ac06c96fac9b8a1146e303d4b374b2cb46a18", size = 27112 }, + { url = "https://files.pythonhosted.org/packages/23/44/2ba137983072cad2c853687fa737138b790cc0f71dc1842f3672488c61fc/pytest_codspeed-3.1.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc8a5d0366322a75cf562f7d8d672d28c1cf6948695c4dddca50331e08f6b3d5", size = 25859 }, + { url = "https://files.pythonhosted.org/packages/a0/9f/7833be9ce5ceed7284955e1c1602a19552c397861a5b3c1eab3d6b26fca7/pytest_codspeed-3.1.2-py3-none-any.whl", hash = "sha256:5e7ed0315e33496c5c07dba262b50303b8d0bc4c3d10bf1d422a41e70783f1cb", size = 14938 }, +] + [[package]] name = "pytest-cov" version = "6.0.0" @@ -851,6 +943,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] +[[package]] +name = "rich" +version = "13.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, +] + [[package]] name = "svg-py" version = "1.5.0" From d4295810f1d25eba0f0a5569e84d91e2ac9c9d43 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 20 Jan 2025 17:49:09 +0100 Subject: [PATCH 134/138] Use dependencies groups (#767) --- .devcontainer.json | 2 +- .github/workflows/ci.yml | 6 ++--- pyproject.toml | 27 ++++++++++++++------ scripts/setup.sh | 2 +- uv.lock | 54 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 13 deletions(-) diff --git a/.devcontainer.json b/.devcontainer.json index fd360689..646467e3 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -53,7 +53,7 @@ // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "scripts/setup.sh", - "postStartCommand": "uv sync --dev", + "postStartCommand": "uv sync --group dev", "remoteEnv": { "PATH": "/home/vscode/.local/bin:/home/vscode/.cargo/bin:/workspaces/client.py/.venv/bin:${containerEnv:PATH}" }, diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7d10b62d..6eaaa367 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: liblzma-dev - name: 🏗 Install the project - run: uv sync --locked --dev + run: uv sync --locked --group lint # Following steps cannot run by pre-commit.ci as repo = local - name: Run mypy @@ -72,7 +72,7 @@ jobs: liblzma-dev - name: 🏗 Install the project - run: uv sync --locked --dev + run: uv sync --locked --group test - name: Run pytest run: uv run --frozen pytest tests --cov=./ --cov-report=xml --junitxml=junit.xml -o junit_family=legacy @@ -112,7 +112,7 @@ jobs: - name: 🏗 Install the project run: | - uv export --dev > requirements.txt + uv export --group benchmark > requirements.txt uv pip install -e . --system -r requirements.txt - name: Run benchmarks diff --git a/pyproject.toml b/pyproject.toml index 03af1540..62850e14 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,23 +49,34 @@ cache-keys = [ { file = "Cargo.toml" }, { file = "**/*.rs" }, ] -dev-dependencies = [ + +[dependency-groups] +benchmark = [{ include-group = "test" }, "pytest-codspeed>=3.1.2"] +dev = [ + { include-group = "benchmark" }, + { include-group = "test" }, + { include-group = "lint" }, + "pycountry==24.6.1", + "maturin[patchelf]>=1.7.8", + "maturin-import-hook>=0.2.0", +] +lint = [ "mypy==1.14.1", "pre-commit==4.0.1", - "pycountry==24.6.1", "pylint==3.3.3", + "types-cachetools>=5.5.0.20240820", + "types-mock>=5.1.0.20240425", + "types-pillow>=10.2.0.20240822", + "maturin[patchelf]>=1.7.8", + "maturin-import-hook>=0.2.0", +] +test = [ "pytest-asyncio==0.25.2", "pytest-cov==6.0.0", "pytest-docker-fixtures==1.3.19", "pytest-timeout==2.3.1", "pytest==8.3.4", "testfixtures==8.3.0", - "types-cachetools>=5.5.0.20240820", - "types-mock>=5.1.0.20240425", - "types-pillow>=10.2.0.20240822", - "maturin[patchelf]>=1.7.8", - "maturin-import-hook>=0.2.0", - "pytest-codspeed>=3.1.2", ] [tool.maturin] diff --git a/scripts/setup.sh b/scripts/setup.sh index 560b9230..0ee5a116 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -11,7 +11,7 @@ sudo apt update sudo apt install -y pkg-config liblzma-dev # Install project dependencies -uv sync --frozen --dev +uv sync --frozen --group dev # Setup pre-commit pre-commit install \ No newline at end of file diff --git a/uv.lock b/uv.lock index 0933ea4c..78f7f944 100644 --- a/uv.lock +++ b/uv.lock @@ -256,6 +256,15 @@ dependencies = [ ] [package.dev-dependencies] +benchmark = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-codspeed" }, + { name = "pytest-cov" }, + { name = "pytest-docker-fixtures" }, + { name = "pytest-timeout" }, + { name = "testfixtures" }, +] dev = [ { name = "maturin", extra = ["patchelf"] }, { name = "maturin-import-hook" }, @@ -274,6 +283,24 @@ dev = [ { name = "types-mock" }, { name = "types-pillow" }, ] +lint = [ + { name = "maturin", extra = ["patchelf"] }, + { name = "maturin-import-hook" }, + { name = "mypy" }, + { name = "pre-commit" }, + { name = "pylint" }, + { name = "types-cachetools" }, + { name = "types-mock" }, + { name = "types-pillow" }, +] +test = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cov" }, + { name = "pytest-docker-fixtures" }, + { name = "pytest-timeout" }, + { name = "testfixtures" }, +] [package.metadata] requires-dist = [ @@ -287,6 +314,15 @@ requires-dist = [ ] [package.metadata.requires-dev] +benchmark = [ + { name = "pytest", specifier = "==8.3.4" }, + { name = "pytest-asyncio", specifier = "==0.25.2" }, + { name = "pytest-codspeed", specifier = ">=3.1.2" }, + { name = "pytest-cov", specifier = "==6.0.0" }, + { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, + { name = "pytest-timeout", specifier = "==2.3.1" }, + { name = "testfixtures", specifier = "==8.3.0" }, +] dev = [ { name = "maturin", extras = ["patchelf"], specifier = ">=1.7.8" }, { name = "maturin-import-hook", specifier = ">=0.2.0" }, @@ -305,6 +341,24 @@ dev = [ { name = "types-mock", specifier = ">=5.1.0.20240425" }, { name = "types-pillow", specifier = ">=10.2.0.20240822" }, ] +lint = [ + { name = "maturin", extras = ["patchelf"], specifier = ">=1.7.8" }, + { name = "maturin-import-hook", specifier = ">=0.2.0" }, + { name = "mypy", specifier = "==1.14.1" }, + { name = "pre-commit", specifier = "==4.0.1" }, + { name = "pylint", specifier = "==3.3.3" }, + { name = "types-cachetools", specifier = ">=5.5.0.20240820" }, + { name = "types-mock", specifier = ">=5.1.0.20240425" }, + { name = "types-pillow", specifier = ">=10.2.0.20240822" }, +] +test = [ + { name = "pytest", specifier = "==8.3.4" }, + { name = "pytest-asyncio", specifier = "==0.25.2" }, + { name = "pytest-cov", specifier = "==6.0.0" }, + { name = "pytest-docker-fixtures", specifier = "==1.3.19" }, + { name = "pytest-timeout", specifier = "==2.3.1" }, + { name = "testfixtures", specifier = "==8.3.0" }, +] [[package]] name = "defusedxml" From 25cb6187103e23e6af33d770f4391d28af125979 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Mon, 20 Jan 2025 21:05:56 +0100 Subject: [PATCH 135/138] Add test for svg map (#768) --- deebot_client/map.py | 13 ++- tests/test_map.py | 272 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 280 insertions(+), 5 deletions(-) diff --git a/deebot_client/map.py b/deebot_client/map.py index 97d49175..3dc9dad0 100644 --- a/deebot_client/map.py +++ b/deebot_client/map.py @@ -468,7 +468,18 @@ async def on_minor_map(event: MinorMapEvent) -> None: unsubscribers.append(self._event_bus.subscribe(MinorMapEvent, on_minor_map)) - self._event_bus.request_refresh(CachedMapInfoEvent) + async def on_cached_info(_: CachedMapInfoEvent) -> None: + # We need to subscribe to it, otherwise it could happen + # that the required MapSet Events are not get + pass + + cached_map_subscribers = self._event_bus.has_subscribers(CachedMapInfoEvent) + unsubscribers.append( + self._event_bus.subscribe(CachedMapInfoEvent, on_cached_info) + ) + if cached_map_subscribers: + # Request update only if there was already a subscriber before + self._event_bus.request_refresh(CachedMapInfoEvent) async def on_position(event: PositionsEvent) -> None: self._map_data.positions = event.positions diff --git a/tests/test_map.py b/tests/test_map.py index 4ff16fe4..0fa0a4a1 100644 --- a/tests/test_map.py +++ b/tests/test_map.py @@ -23,6 +23,7 @@ ) from deebot_client.events.map import ( + CachedMapInfoEvent, MajorMapEvent, MapChangedEvent, MapSetEvent, @@ -52,9 +53,12 @@ from .common import block_till_done if TYPE_CHECKING: - from collections.abc import Sequence + from collections.abc import Callable, Sequence + + from pytest_codspeed import BenchmarkFixture from deebot_client.event_bus import EventBus + from deebot_client.events.base import Event _test_calc_point_data = [ (5000, 0, Point(100.0, 0.0)), @@ -120,9 +124,27 @@ async def test_cycle() -> None: await test_cycle() +def _test_Map_subscriptions_subscribe(event_bus_mock: Mock) -> None: + async def on_cached_info(_: CachedMapInfoEvent) -> None: + pass + + event_bus_mock.subscribe(CachedMapInfoEvent, on_cached_info) + event_bus_mock.subscribe.reset_mock() + + +@pytest.mark.parametrize( + ("prepare_fn", "events_with_subscriber"), + [(lambda _: None, []), (_test_Map_subscriptions_subscribe, [CachedMapInfoEvent])], + ids=["No CachedMapInfoEvent subscribers", "Already CachedMapInfoEvent subscribers"], +) async def test_Map_subscriptions( - execute_mock: AsyncMock, event_bus_mock: Mock, event_bus: EventBus + execute_mock: AsyncMock, + event_bus_mock: Mock, + event_bus: EventBus, + prepare_fn: Callable[[Mock], None], + events_with_subscriber: list[type[Event]], ) -> None: + prepare_fn(event_bus_mock) map = Map(execute_mock, event_bus_mock) calls = [call(MapSetEvent, ANY), call(MapSubsetEvent, ANY)] @@ -140,7 +162,13 @@ async def on_change() -> None: event_unsub = event_bus_mock.subscribe(MapChangedEvent, on_change) await block_till_done(event_bus) - events = [MajorMapEvent, MinorMapEvent, PositionsEvent, MapTraceEvent] + events = [ + MajorMapEvent, + MinorMapEvent, + CachedMapInfoEvent, + PositionsEvent, + MapTraceEvent, + ] calls.append(call(MapChangedEvent, on_change)) calls.extend([call(event, ANY) for event in events]) @@ -151,7 +179,8 @@ async def on_change() -> None: event_unsub() for event in events: - assert not event_bus.has_subscribers(event) + if event not in events_with_subscriber: + assert not event_bus.has_subscribers(event) await map.teardown() assert not map._unsubscribers @@ -333,3 +362,238 @@ def test_get_svg_positions( ) -> None: result = _get_svg_positions(positions, ViewBoxFloat(view_box)) assert result == expected + + +def test_get_svg_map( + event_loop: asyncio.AbstractEventLoop, + benchmark: BenchmarkFixture, + execute_mock: AsyncMock, + event_bus: EventBus, +) -> None: + """Test getting svg map.""" + + async def on_change(_: MapChangedEvent) -> None: + pass + + async def test_fn() -> str | None: + map = Map(execute_mock, event_bus) + event_bus.subscribe(MapChangedEvent, on_change) + await block_till_done(event_bus) + + for event in _events_for_map_test(): + event_bus.notify(event) + + await block_till_done(event_bus) + return map.get_svg_map() + + @benchmark + def svg_map() -> str | None: + return event_loop.run_until_complete(test_fn()) + + assert ( + svg_map + == '' + ) + + +def _events_for_map_test() -> list[Event]: + """Events for map test.""" + return [ + PositionsEvent( + positions=[ + Position(type=PositionType.DEEBOT, x=-400, y=-358, a=43), + Position(type=PositionType.CHARGER, x=-400, y=-358, a=43), + ] + ), + MajorMapEvent( + map_id="1132127808", + values=[ + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "2998807512", + "652761817", + "3897196952", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1037493650", + "166816722", + "3059522245", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "2736690636", + "4255162210", + "298631438", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "2295463665", + "78164421", + "2619958765", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "1295764014", + "3614459914", + "376640576", + "2782182568", + "1295764014", + "1295764014", + "1295764014", + ], + requested=True, + ), + CachedMapInfoEvent(name="Erdgeschoss", active=True), + MapTraceEvent( + start=0, + total=35, + data="XQAABACvAAAAAAAAAEINQkt4BfqEvt9Pow7YU9KWRVBcSBosIDAOtACCicHy+vmfexxcutQUhqkAPQlBawOeXo/VSrOqF7yhdJ1JPICUs3IhIebU62Qego0vdk8oObiLh3VY/PVkqQyvR4dHxUDzMhX7HAguZVn3yC17+cQ18N4kaydN3LfSUtV/zejrBM4=", + ), + MinorMapEvent( + index=26, + value="XQAABAAQJwAAAABv/f//o7f/Rz5IFXI5YVG4kijmo4YH+e7kHoLTL8U6OwczrMl+5Cn+j6EvprKUdquBVZgFpQToAHLTz2AlAA==", + ), + MapSetEvent(type=MapSetType.ROOMS, subsets=[5, 8, 10, 3, 4, 7, 9]), + MapSubsetEvent( + id=0, + type=MapSetType.VIRTUAL_WALLS, + coordinates="['12023', '1979', '12135', '-6720']", + name=None, + ), + MapSubsetEvent( + id=1, + type=MapSetType.VIRTUAL_WALLS, + coordinates="['2120', '-4581', '2106', '-6271']", + name=None, + ), + MinorMapEvent( + index=27, + value="XQAABAAQJwAAAABv/f//o7f/Rz5IFXI5YVG4kijmo4YH+e7kHoLTL8U6OoIUllGvXGckqgrY3KwNpyZGro/5e86CkfTA/8SmXTF6vyQbpfm3aKaB+BUT4HR4Nh+9bBIA2F6P732TMOPPUVCNgk0iTfsofTrBHnDwU1v6Vu89JmUeZ4WnTF6XnZm4TLATbNsidiEYdPjJtfGfc/aBpCFaBu4OUZWDkCbTfRxll4st1S/a9536TigRw5i94zhfAA==", + ), + MinorMapEvent( + index=28, + value="XQAABAAQJwAAAABv/f//o7f/Rz5IFXI5YVG4kijmo4YH+e7kHoLTL8U6O/tP7Y2EYYVDkNYQ8LR1ByAxWylpYxNq9+RlCIPZ1PEy+i79EP/P9zFmbs/FXBaDyknS4oOvAx6U", + ), + MapSubsetEvent( + id=5, + type=MapSetType.ROOMS, + coordinates="-1074,-474;-574,-474;-424,-624;-424,-674;-374,-724;-374,-1224;925,-1224;975,-1274;975,-1624;1025,-1574;1025,-1524;1075,-1474;1775,-1474;1775,-774;1825,-724;1875,-724;1925,-774;1925,-1174;2525,-1174;2525,175;2175,175;2125,225;2175,275;2325,275;2325,475;2225,475;2175,525;2225,575;2475,575;2475,675;2525,725;2575,675;2575,275;3425,275;3425,775;3175,775;3125,825;3125,875;3175,925;3425,925;3425,1925;3125,1925;3075,1975;3075,2125;2925,2125;2875,2175;2875,2475;1675,2475;1675,2175;1625,2125;1575,2175;1575,2525;425,2525;425,1875;375,1825;-1074,1825", + name="Wohnzimmer", + ), + MapSubsetEvent( + id=3, + type=MapSetType.ROOMS, + coordinates="3175,-4825;3425,-4825;3475,-4874;3475,-6075;3925,-6075;3975,-6124;3975,-6325;4525,-6325;4525,-6224;4575,-6174;4675,-6174;4675,-5325;4475,-5325;4425,-5274;4425,-5224;4475,-5174;4775,-5174;4775,-3574;4225,-3574;4175,-3524;4175,-3024;3625,-3024;3625,-3174;3575,-3224;3425,-3224;3425,-3474;3375,-3524;3325,-3524;3275,-3474;3275,-3324;3175,-3324", + name="Badezimmer", + ), + MapSubsetEvent( + id=8, + type=MapSetType.ROOMS, + coordinates="-1274,-2874;-1174,-2874;-1174,-2824;-1124,-2774;1175,-2774;1225,-2824;3575,-2824;3625,-2874;3625,-2974;4175,-2974;4175,-2874;4225,-2824;6325,-2824;6375,-2874;6375,-2974;6375,-2924;6425,-2874;7175,-2874;7225,-2924;7225,-2974;7325,-2974;7275,-2974;7225,-2924;7225,-2874;7275,-2824;8375,-2824;8375,-1924;8425,-1874;8325,-1774;5675,-1774;5675,-1874;5625,-1924;4775,-1924;4725,-1874;4725,-1724;4675,-1724;4625,-1674;4625,-1374;4325,-1374;4275,-1324;4075,-1324;3975,-1224;3975,-1174;3925,-1174;3975,-1224;3925,-1274;3775,-1274;3775,-1624;3725,-1674;1825,-1674;1775,-1624;1775,-1524;1075,-1524;1075,-1574;925,-1724;-1274,-1724", + name="Flur", + ), + MapSubsetEvent( + id=4, + type=MapSetType.ROOMS, + coordinates="3625,-1174;3875,-1174;3925,-1124;3975,-1124;4025,-1174;4025,-1224;4075,-1274;4275,-1274;4325,-1324;4625,-1324;4625,-1274;4675,-1224;4825,-1224;4825,-874;4875,-824;5075,-824;5075,-724;5125,-674;6675,-674;6675,-624;6725,-574;6975,-574;7025,-624;7025,-1074;7525,-1074;7525,-524;7325,-524;7275,-474;7275,-124;7075,-124;7025,-74;7025,-24;7075,25;7675,25;7675,225;7725,275;7925,275;7925,1325;7775,1325;7725,1375;7725,1475;7775,1525;7875,1525;7875,1775;6575,1775;6575,1475;6525,1425;6075,1425;6025,1475;6075,1525;6375,1525;6375,1975;6425,2025;6575,2025;6575,2375;6075,2375;6025,2425;6025,2625;5325,2625;5325,2525;5275,2475;4275,2475;4275,-174;4225,-224;3925,-224;3925,-524;3875,-574;3625,-574", + name="Büro", + ), + MapSubsetEvent( + id=10, + type=MapSetType.ROOMS, + coordinates="-1174,-4674;-874,-4674;-824,-4724;-824,-5724;2125,-5724;2125,-5575;2175,-5524;2825,-5524;2825,-4924;2575,-4924;2525,-4874;1625,-4874;1575,-4825;1575,-2924;1225,-2924;1175,-2874;1175,-2824;-1124,-2824;-1124,-2874;-1074,-2874;-1024,-2924;-1074,-2974;-1174,-2974;-1174,-3324;-874,-3324;-824,-3374;-824,-3424;-874,-3474;-1174,-3474", + name="Küche", + ), + MapSubsetEvent( + id=9, + type=MapSetType.ROOMS, + coordinates="8375,-1774;8475,-1874;8425,-1924;8425,-2824;8475,-2824;8525,-2874;8525,-3124;9075,-3124;9125,-3174;9075,-3224;8525,-3224;8525,-4624;9125,-4624;9125,-4174;9175,-4124;9225,-4174;9225,-4774;9175,-4825;8525,-4825;8525,-5924;12075,-5924;12125,-5974;12125,-6075;12525,-6075;12525,-5924;12575,-5874;13875,-5874;13875,-5724;13925,-5674;14375,-5674;14425,-5724;14425,-5974;15375,-5974;15375,-5674;14975,-5674;14925,-5624;14925,-5374;14375,-5374;14325,-5325;14375,-5274;14825,-5274;14825,-4874;14075,-4874;14025,-4825;14025,-4774;13425,-4774;13375,-4724;13375,-4325;13425,-4274;13825,-4274;13825,-4024;13575,-4024;13525,-3974;13525,-3674;13575,-3624;13775,-3624;13775,-3424;13825,-3374;13925,-3374;13925,-2074;13525,-2074;13475,-2024;13475,-1824;13525,-1774;13975,-1774;14025,-1824;14025,-2624;14875,-2624;14875,-2524;14925,-2474;15275,-2474;15325,-2524;15325,-2674;16125,-2674;16125,-2524;16025,-2524;15975,-2474;15975,-1974;14475,-1974;14425,-1924;14425,-1674;14475,-1624;15325,-1624;15325,-1374;15075,-1374;15025,-1324;15075,-1274;15475,-1274;15475,-324;15175,-324;15125,-274;15125,-224;13525,-224;13475,-174;13525,-124;14725,-124;14725,-24;14775,25;15375,25;15375,325;14375,325;14325,375;14375,425;15125,425;15125,525;15175,575;15475,575;15475,1425;15225,1425;15175,1475;14725,1475;14675,1525;14675,1725;12675,1725;12675,925;12625,875;12575,875;12525,925;12525,1625;12125,1625;12125,675;12075,625;12025,625;11975,675;11975,1725;9225,1725;9225,1425;9175,1375;8875,1375;8825,1425;8825,1675;8525,1675;8525,-1724;8475,-1774", + name="Wintergarten", + ), + MapSubsetEvent( + id=7, + type=MapSetType.ROOMS, + coordinates="5075,-4474;5575,-4474;5625,-4524;5625,-6325;7325,-6325;7325,-4374;7375,-4325;7425,-4374;7425,-5974;8075,-5974;8075,-4274;7975,-4274;7925,-4224;7925,-3824;7575,-3824;7525,-3774;7525,-2974;7375,-2974;7325,-3024;7225,-3024;7175,-2974;7175,-2924;6425,-2924;6425,-2974;6375,-3024;6375,-3824;6325,-3874;6275,-3874;6225,-3824;6225,-3574;5075,-3574", + name="Schlafzimmer", + ), + MinorMapEvent( + index=34, + value="XQAABAAQJwAAAABugkgp5bzuDTsxgTfHTugMraGXP+ltaKAyC/YRb7guQlLvRs3pB8oB2eN85q4BuFvjNcnL2R9zlaWiYy8lilO/Mh3qPXSR7uNinsSaPtMOdXeDHC1pkpU02xnWK/qQBNAC1B+ncz1tePV7ybL7gpMnZLISW5ZG3pqqghgSRuA=", + ), + MinorMapEvent( + index=35, + value="XQAABAAQJwAAADfuKAXQNczI4gAIXkUZbxSKxosq0+XZzOajuOyPl9wWdg3EwBu+azWjbNbUz666XGaYC3gUR+F1Cb5IWCFnqbndxSgwtgNiAPLo9M2Ipn+mB9ZIzkWLVouj8UF//TcugHTWJ1kwiS27tm/4TZxarvpI5RoVG1rRwbgVe6b6uhSt1BHuWEkL2EgrA32jzQGOwwnRrQGOx5jYZop8R7sXCo9508Rkiv0E9ezyKq5wQLnOPppspzs1vHYgLNV8UcOKchfAOfWQAW4BGUupPdrkskIUMw1A0LCgkdfwp/JCfSDPhtWqGnD5htDijz+52sT+52scY4KwYe7L3O/2lEKkGxG8UQPbyDGX1A==", + ), + MinorMapEvent( + index=36, + value="XQAABAAQJwAAADVuIATZv7b3qYZ+EcqBeKoxiESZjVeBXbaP4M86YXV4mh7ZG/frZiwmDHyYVuT6iMBXbrEvdUz13BLebxWB4Irc67tBA+hOe5hePKz4Xn83vhUceNl1crFlgzOivS9TvfHlVLe3O5QxeueJyjM/7aG23GwXqPMoeJPVzz17Zx+F1JnOIYr3hi6Qa+0pWqVTePoz1VrHNW2Pa8GFRAIPGCD4Fz+rkN2h5WccfOaZ4uKi4IiMww==", + ), + MinorMapEvent( + index=42, + value="XQAABAAQJwAAAABubEsjyjym4p3tetMqOx59dgIvptMvdoM4GxpnShdpXptVMLzFuYVDRf7/h/S7UPCRO4eeAoCtxihXhsGWRAB8T4dLkNtTamGpWIlWwDBygo7emXe1+tSSSFL7jgb728ddCkaFlPxBn4oNQBE3Q+QdC5k4gh3pgb314puwRhjXEtc952WgQ05xy6W97oYmLtk2FadXPJXyXUUVPH1Zw2OX48vTiLITEro4ClqFHXevQTRuqLDy1gHC0GS+xoMUwArUl5wm2dS7zaA=", + ), + MinorMapEvent( + index=43, + value="XQAABAAQJwAAAAJuJAACx4OBcQprP91YASA7KCbdhQbxy2wl6f6aGqcvnCpJECtL1cqKITtl8qDVmgho3vYlUYorTlB2GZ17Lq2boEnJFFVoz0YEPiclQR8l7RVNAYDAAkEJaWNT6CA+TVx9+tNvQev54U2vE9fLG5G/QC7kQqiEBxnYkvfGwCUg7GRHrE/3jUWZ/n0mCAFW9iNnYCyhDQ3cPwTsMIiqkdNwD2OQlHWlFZs2C/A37NLjnzIpKrdvm2H/oWyEf4+qqOEH85dUiQ9k5FRfx2pfKhL8A42ZgA4C623W26zXcSl7Vlgrm7sBicJbTVTRwTY5HufJkZ+aYsn6TNvUhKY/zvgA", + ), + MinorMapEvent( + index=44, + value="XQAABAAQJwAAADTuOgQB/72wZx/w8zQuXJA7zMEekl0dPMB8OvQiz3AkdtwkgOUDB5hW9x0BLag1lRbKqjYgKc0NhT/ebcTX57E4ETcwZ+8ptzWztNzk1Kh+poLJXLouDpCNENY8ZY/+2pAopPvMtWH5w9ftXNoBr51d8MLRGJw6vqw72JJqnAaEryA=", + ), + MinorMapEvent( + index=50, + value="XQAABAAQJwAAAABuekhJZt5pbU4RwYAHIDtReEcz/S9uYyPJr+DpMLWpsnw6WqOhWKh7QfXFTlx0h5RHxZrYItBKU+9ZoSx939S5IfAB2QNSiaD7oyz180jVKegOv0CoeKW5rEmG5WYQspq+xJ8AAA==", + ), + MinorMapEvent( + index=51, + value="XQAABAAQJwAAADdt/gXVg0greQ8SOVJWwRx/WGMASUHLAUJaxnPABa/xpu01j1MnlZ5Cw9kqBnzhE4LNyfUIxhAjQsTur5wf4jpbQVR9fhC9QIdo4KEwTqJOxqhVbWGDwoAXsJfCXnocOWFUfMDoAYA6WIcyUy1abkvM7S+G3+WfdJ79yn9yqGwHLF/BDsLRP5sWkC0xfEbYG3/kVTvVuer9tkJJZuUtPuoDeke7jtt7fbKmSdRlqV8W4ryky9MwxQGaG2rVUFMTA/21VA36oME8BgiPf8tluiJBqIVS3LenDFSx4TlEHRDvIvgiUTLoR9kgZS39pEXmzvwyfRTfhD89aZBYncw+/WHT9c75Qp0JM+5jbp++7Ti/qcY5rSf4qA8h9OLnsVQpP5vHDrsH5SsTqob/rd/aXyyhwKF75/aVb1SCXCtRpLuZQLLF9ysn9xUUIBItgbxTU4Y85Cny8zRYCnIMyISzyu3FR18gbsQjlyHsYdP4ox+taOavKEBalU8wtmFSpMNLZPvClAqHpBEoSfH7wXbwS/waNWxhm1bduNMjYX0QocQdCItL9uSqMLhHb7gDl0DyNw==", + ), + MinorMapEvent( + index=52, + value="XQAABAAQJwAAADduHADckpSIU6Lc7gaVYbkAJ7nzivxyykJm7S5UENTnwWPpUkCxzMqUbZUSOVQynE7gXFy0B/peslyR7qCxAZQSixx4AIJgTKtHOHGEXPt5wHceFvpRYUj1Y2r2Ap7FZnNxd6gdrFj6BemyU8hHnIfgGjCPLKK8IPiDUuFDlsn0u1KjAMvgKlB/0idGrOcp6RGHSyax/VzEd6/R03+KvUGtFxDk+rptMh+PxCmkpQNySUhF0qL/5hrYErPq+18df58ID54k9vt/KDkgUZNdmWxcP93wE6hGkEPpMdavYM55ig==", + ), + MinorMapEvent( + index=58, + value="XQAABAAQJwAAAABueEhRYy/zcKOyJula+ms1kF6/s3HLunhYjJwX3JUQ0S4YWBPnRSjIfE3XhUM/SCd3HJoe72si", + ), + MinorMapEvent( + index=59, + value="XQAABAAQJwAAAABuPElBZUtUurqaYu0MeEeAil4++JRw2vImdzqzdC/RlvGuG6OzaK3Xuy5nIu1m+tUotWkHqnR3Fx3UnAFgYtDFmfCCLNpG3jndVAbv3p7ZKCcacQA=", + ), + MinorMapEvent( + index=60, + value="XQAABAAQJwAAADcBXQeAAHimLPzHwr4JpEB5N7g5Lk+Dg/WqdIeFBDEA0yVh4AgSu169o8v2gNILCNK85c9hT2/ETMWSbq1CxPOqitsPIFQNsni7AA==", + ), + ] From aa399fb87a630fc3176093dd765440e950c1f91d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 21:13:35 +0100 Subject: [PATCH 136/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependenc?= =?UTF-8?q?y=20pre-commit=20to=20v4.1.0=20(#769)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 62850e14..323f3a4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,7 @@ dev = [ ] lint = [ "mypy==1.14.1", - "pre-commit==4.0.1", + "pre-commit==4.1.0", "pylint==3.3.3", "types-cachetools>=5.5.0.20240820", "types-mock>=5.1.0.20240425", diff --git a/uv.lock b/uv.lock index 78f7f944..de8294d3 100644 --- a/uv.lock +++ b/uv.lock @@ -327,7 +327,7 @@ dev = [ { name = "maturin", extras = ["patchelf"], specifier = ">=1.7.8" }, { name = "maturin-import-hook", specifier = ">=0.2.0" }, { name = "mypy", specifier = "==1.14.1" }, - { name = "pre-commit", specifier = "==4.0.1" }, + { name = "pre-commit", specifier = "==4.1.0" }, { name = "pycountry", specifier = "==24.6.1" }, { name = "pylint", specifier = "==3.3.3" }, { name = "pytest", specifier = "==8.3.4" }, @@ -345,7 +345,7 @@ lint = [ { name = "maturin", extras = ["patchelf"], specifier = ">=1.7.8" }, { name = "maturin-import-hook", specifier = ">=0.2.0" }, { name = "mypy", specifier = "==1.14.1" }, - { name = "pre-commit", specifier = "==4.0.1" }, + { name = "pre-commit", specifier = "==4.1.0" }, { name = "pylint", specifier = "==3.3.3" }, { name = "types-cachetools", specifier = ">=5.5.0.20240820" }, { name = "types-mock", specifier = ">=5.1.0.20240425" }, @@ -762,7 +762,7 @@ wheels = [ [[package]] name = "pre-commit" -version = "4.0.1" +version = "4.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -771,9 +771,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/13/b62d075317d8686071eb843f0bb1f195eb332f48869d3c31a4c6f1e063ac/pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4", size = 193330 } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, + { url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 }, ] [[package]] From e43d49786c8ef9149d126ea594aa14bb435504c0 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 21 Jan 2025 10:40:47 +0100 Subject: [PATCH 137/138] Use real life map for better performance testing (#772) --- tests/test_map.py | 203 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 159 insertions(+), 44 deletions(-) diff --git a/tests/test_map.py b/tests/test_map.py index 0fa0a4a1..0d83a68c 100644 --- a/tests/test_map.py +++ b/tests/test_map.py @@ -392,7 +392,7 @@ def svg_map() -> str | None: assert ( svg_map - == '' + == '' ) @@ -401,8 +401,8 @@ def _events_for_map_test() -> list[Event]: return [ PositionsEvent( positions=[ - Position(type=PositionType.DEEBOT, x=-400, y=-358, a=43), - Position(type=PositionType.CHARGER, x=-400, y=-358, a=43), + Position(type=PositionType.DEEBOT, x=1477, y=-1296, a=0), + Position(type=PositionType.CHARGER, x=-377, y=-365, a=44), ] ), MajorMapEvent( @@ -435,32 +435,32 @@ def _events_for_map_test() -> list[Event]: "1295764014", "1295764014", "2998807512", - "652761817", - "3897196952", + "360128560", + "369397284", "1295764014", "1295764014", "1295764014", "1295764014", "1295764014", - "1037493650", - "166816722", - "3059522245", + "3559776670", + "1727671436", + "1921229554", "1295764014", "1295764014", "1295764014", "1295764014", "1295764014", - "2736690636", - "4255162210", - "298631438", + "4036787402", + "1564564697", + "1307495088", "1295764014", "1295764014", "1295764014", "1295764014", "1295764014", - "2295463665", - "78164421", - "2619958765", + "30638198", + "487720185", + "3165113179", "1295764014", "1295764014", "1295764014", @@ -478,8 +478,8 @@ def _events_for_map_test() -> list[Event]: CachedMapInfoEvent(name="Erdgeschoss", active=True), MapTraceEvent( start=0, - total=35, - data="XQAABACvAAAAAAAAAEINQkt4BfqEvt9Pow7YU9KWRVBcSBosIDAOtACCicHy+vmfexxcutQUhqkAPQlBawOeXo/VSrOqF7yhdJ1JPICUs3IhIebU62Qego0vdk8oObiLh3VY/PVkqQyvR4dHxUDzMhX7HAguZVn3yC17+cQ18N4kaydN3LfSUtV/zejrBM4=", + total=4739, + data="XQAABADoAwAAAAAAAEINQkt4BmELocLzQwjmT1Njwlrk9CovzBCzC3LpPT3rXO6nYWr5WmICwI2TJGOldXPb4Ub5BHFynepTObhKC2Tox787y206axT1vhaD2/P7F4WVMw5lXOY9pltSNQgn76ILc0vnjKCyNxzKUj4B+WrweCmfcFDbpKYTYJygDSJEVxSCeHXrBVLYM31ExWSm7EPUeqMJYpXFTDbH/bWnYi8uQyrkb9Wm9lHXiEXbOg1CkXLxU+9VUP8vNgcHmxuDw+F8DWGxKFTzK76xrPp2z/dfKH+qkKejPEDA9lF9vALsBoxBum1zLbxbSEixaks0DpmntOxe5qIb/6JMwJBe6RHdsNBRGWYzIH3Oc14HctC74aUt3OI283x9lu8MeLakyV+GZoSExQ9mR4ZDJxCeFgkM+iaYAeXGo1+Nb1vUBLtYyUNreNOzjlI/0GMgLlhQFJgbIs4gCeK6LyshxR5wfCgLThzBwRoP7H5JXfzzP0nOjbG7nkJNmEGNzniRhRyjSVSM/73thyYnvQLsoowJGaNFw2vLZRhJuTJ/1g4XV7cSYQljCNKeY4xtlDMiunnsPAOkN4Xr1vbTCoaDmFxdpKnw3fEveVRiVoZ4A0RpRLTjfR1hilN31LbhyW4lTxCsAHaJyMmoRt7xX+bEZGhQjnGP1qh9M14z6HtDikodzSxODQ/qBW2xxTX0Ufi8NfoeM/vGVY0Y6lypoD5O2OYASCkmxalbb7oOnsHxePpiUDMrk4JPvWXbQU+hlPYs0r88f5J2Y8auzIeoReOke1met+Wigd8l85uRdaMRjFyEX9hHo7EBAc+K7o8=", ), MinorMapEvent( index=26, @@ -498,13 +498,14 @@ def _events_for_map_test() -> list[Event]: coordinates="['2120', '-4581', '2106', '-6271']", name=None, ), - MinorMapEvent( - index=27, - value="XQAABAAQJwAAAABv/f//o7f/Rz5IFXI5YVG4kijmo4YH+e7kHoLTL8U6OoIUllGvXGckqgrY3KwNpyZGro/5e86CkfTA/8SmXTF6vyQbpfm3aKaB+BUT4HR4Nh+9bBIA2F6P732TMOPPUVCNgk0iTfsofTrBHnDwU1v6Vu89JmUeZ4WnTF6XnZm4TLATbNsidiEYdPjJtfGfc/aBpCFaBu4OUZWDkCbTfRxll4st1S/a9536TigRw5i94zhfAA==", + MapTraceEvent( + start=200, + total=4739, + data="XQAABADoAwAAACYAE0gB8D7Fr+Y1fhSFbwP2VgxT307ev0J0gP6ExAicwgr9TBNLiFjmrPlOXXvU11TaXYMsGp5XcHW8z0hvQSoOrlS6meLm4THCE5Qm2ufY103i+c+0KtXMwnL7wv3W1dTt1Q9EqIWHP1BU7gNhwY3u5yB0QHTHbLQoLSlzGgZrPKoFEWGTmy+uqF93TDug9mcUNPnVdU27lkB2vosDR5ArMALOpzgRrmzUwgDRCVsQpsbrHDT23P2y88AibK8RSSfW23PzSE6wXNrt3dmsLIhTVvsye/c3LrGOD2MNYFhKpEpL4IswcPbHKMR1dezFHHYC38TLIYrqlgUOK5H4OziGC5IYeJ6NMh3qmO1dcu+3MowYDnLpM9XlRKifnZrRxVo2gbtQeKvZZxTWBeOp5tUCfMffrdrXsAI+w1svaqvzYDRBvL/RszU6JlRoS6UGte7HYKbwhg2POKActTecQKKAiTxZvqVmBkiTvyQkgX/9bAF3l8V1t1hF8qY11TegAQmgExnMUYDf5t3oI0UgtsacA3OUjGnjdlMUcYTuiy9nlT9ku9nZoM+swz1SjlqISV2YJGN5cJxYxH2BUtj7Vbkv8I/g0g37cy1rKs7bRixIMyac61CkSmW7fgm4ajIQYE48oStouMg1KFApDVeyxlmZxp7NMYXNZt2sHr07E+6ZaTm+D+u2s5gnuTH9GnIRnMT5KOtAd6E59bTaNl0D8YeXxlMLxsWuQmsquDgAMGXnzumtOg==", ), MinorMapEvent( - index=28, - value="XQAABAAQJwAAAABv/f//o7f/Rz5IFXI5YVG4kijmo4YH+e7kHoLTL8U6O/tP7Y2EYYVDkNYQ8LR1ByAxWylpYxNq9+RlCIPZ1PEy+i79EP/P9zFmbs/FXBaDyknS4oOvAx6U", + index=27, + value="XQAABAAQJwAAAABv/f//o7f/Rz5IFXI5YVG4kijmo4YH+e7kHoLTL8U6OoLNmPkOR/iAKW494L6pU5z5weGz1LDuY+9sN12pb+fQQ6KxxRd6/vNOGnbZaGVn+xYVn7SJGugVyEhrIT8A62bQxjIeETOCqCkvFufRmAZauPeS6A1no+YyTf1GiP5t9QCqi8Zy9kyh/543wBWoL3qLjpSRH8YLZKsAezhwAW5oxW4A", ), MapSubsetEvent( id=5, @@ -512,18 +513,18 @@ def _events_for_map_test() -> list[Event]: coordinates="-1074,-474;-574,-474;-424,-624;-424,-674;-374,-724;-374,-1224;925,-1224;975,-1274;975,-1624;1025,-1574;1025,-1524;1075,-1474;1775,-1474;1775,-774;1825,-724;1875,-724;1925,-774;1925,-1174;2525,-1174;2525,175;2175,175;2125,225;2175,275;2325,275;2325,475;2225,475;2175,525;2225,575;2475,575;2475,675;2525,725;2575,675;2575,275;3425,275;3425,775;3175,775;3125,825;3125,875;3175,925;3425,925;3425,1925;3125,1925;3075,1975;3075,2125;2925,2125;2875,2175;2875,2475;1675,2475;1675,2175;1625,2125;1575,2175;1575,2525;425,2525;425,1875;375,1825;-1074,1825", name="Wohnzimmer", ), - MapSubsetEvent( - id=3, - type=MapSetType.ROOMS, - coordinates="3175,-4825;3425,-4825;3475,-4874;3475,-6075;3925,-6075;3975,-6124;3975,-6325;4525,-6325;4525,-6224;4575,-6174;4675,-6174;4675,-5325;4475,-5325;4425,-5274;4425,-5224;4475,-5174;4775,-5174;4775,-3574;4225,-3574;4175,-3524;4175,-3024;3625,-3024;3625,-3174;3575,-3224;3425,-3224;3425,-3474;3375,-3524;3325,-3524;3275,-3474;3275,-3324;3175,-3324", - name="Badezimmer", - ), MapSubsetEvent( id=8, type=MapSetType.ROOMS, coordinates="-1274,-2874;-1174,-2874;-1174,-2824;-1124,-2774;1175,-2774;1225,-2824;3575,-2824;3625,-2874;3625,-2974;4175,-2974;4175,-2874;4225,-2824;6325,-2824;6375,-2874;6375,-2974;6375,-2924;6425,-2874;7175,-2874;7225,-2924;7225,-2974;7325,-2974;7275,-2974;7225,-2924;7225,-2874;7275,-2824;8375,-2824;8375,-1924;8425,-1874;8325,-1774;5675,-1774;5675,-1874;5625,-1924;4775,-1924;4725,-1874;4725,-1724;4675,-1724;4625,-1674;4625,-1374;4325,-1374;4275,-1324;4075,-1324;3975,-1224;3975,-1174;3925,-1174;3975,-1224;3925,-1274;3775,-1274;3775,-1624;3725,-1674;1825,-1674;1775,-1624;1775,-1524;1075,-1524;1075,-1574;925,-1724;-1274,-1724", name="Flur", ), + MapSubsetEvent( + id=10, + type=MapSetType.ROOMS, + coordinates="-1174,-4674;-874,-4674;-824,-4724;-824,-5724;2125,-5724;2125,-5575;2175,-5524;2825,-5524;2825,-4924;2575,-4924;2525,-4874;1625,-4874;1575,-4825;1575,-2924;1225,-2924;1175,-2874;1175,-2824;-1124,-2824;-1124,-2874;-1074,-2874;-1024,-2924;-1074,-2974;-1174,-2974;-1174,-3324;-874,-3324;-824,-3374;-824,-3424;-874,-3474;-1174,-3474", + name="Küche", + ), MapSubsetEvent( id=4, type=MapSetType.ROOMS, @@ -531,10 +532,16 @@ def _events_for_map_test() -> list[Event]: name="Büro", ), MapSubsetEvent( - id=10, + id=7, type=MapSetType.ROOMS, - coordinates="-1174,-4674;-874,-4674;-824,-4724;-824,-5724;2125,-5724;2125,-5575;2175,-5524;2825,-5524;2825,-4924;2575,-4924;2525,-4874;1625,-4874;1575,-4825;1575,-2924;1225,-2924;1175,-2874;1175,-2824;-1124,-2824;-1124,-2874;-1074,-2874;-1024,-2924;-1074,-2974;-1174,-2974;-1174,-3324;-874,-3324;-824,-3374;-824,-3424;-874,-3474;-1174,-3474", - name="Küche", + coordinates="5075,-4474;5575,-4474;5625,-4524;5625,-6325;7325,-6325;7325,-4374;7375,-4325;7425,-4374;7425,-5974;8075,-5974;8075,-4274;7975,-4274;7925,-4224;7925,-3824;7575,-3824;7525,-3774;7525,-2974;7375,-2974;7325,-3024;7225,-3024;7175,-2974;7175,-2924;6425,-2924;6425,-2974;6375,-3024;6375,-3824;6325,-3874;6275,-3874;6225,-3824;6225,-3574;5075,-3574", + name="Schlafzimmer", + ), + MapSubsetEvent( + id=3, + type=MapSetType.ROOMS, + coordinates="3175,-4825;3425,-4825;3475,-4874;3475,-6075;3925,-6075;3975,-6124;3975,-6325;4525,-6325;4525,-6224;4575,-6174;4675,-6174;4675,-5325;4475,-5325;4425,-5274;4425,-5224;4475,-5174;4775,-5174;4775,-3574;4225,-3574;4175,-3524;4175,-3024;3625,-3024;3625,-3174;3575,-3224;3425,-3224;3425,-3474;3375,-3524;3325,-3524;3275,-3474;3275,-3324;3175,-3324", + name="Badezimmer", ), MapSubsetEvent( id=9, @@ -542,47 +549,75 @@ def _events_for_map_test() -> list[Event]: coordinates="8375,-1774;8475,-1874;8425,-1924;8425,-2824;8475,-2824;8525,-2874;8525,-3124;9075,-3124;9125,-3174;9075,-3224;8525,-3224;8525,-4624;9125,-4624;9125,-4174;9175,-4124;9225,-4174;9225,-4774;9175,-4825;8525,-4825;8525,-5924;12075,-5924;12125,-5974;12125,-6075;12525,-6075;12525,-5924;12575,-5874;13875,-5874;13875,-5724;13925,-5674;14375,-5674;14425,-5724;14425,-5974;15375,-5974;15375,-5674;14975,-5674;14925,-5624;14925,-5374;14375,-5374;14325,-5325;14375,-5274;14825,-5274;14825,-4874;14075,-4874;14025,-4825;14025,-4774;13425,-4774;13375,-4724;13375,-4325;13425,-4274;13825,-4274;13825,-4024;13575,-4024;13525,-3974;13525,-3674;13575,-3624;13775,-3624;13775,-3424;13825,-3374;13925,-3374;13925,-2074;13525,-2074;13475,-2024;13475,-1824;13525,-1774;13975,-1774;14025,-1824;14025,-2624;14875,-2624;14875,-2524;14925,-2474;15275,-2474;15325,-2524;15325,-2674;16125,-2674;16125,-2524;16025,-2524;15975,-2474;15975,-1974;14475,-1974;14425,-1924;14425,-1674;14475,-1624;15325,-1624;15325,-1374;15075,-1374;15025,-1324;15075,-1274;15475,-1274;15475,-324;15175,-324;15125,-274;15125,-224;13525,-224;13475,-174;13525,-124;14725,-124;14725,-24;14775,25;15375,25;15375,325;14375,325;14325,375;14375,425;15125,425;15125,525;15175,575;15475,575;15475,1425;15225,1425;15175,1475;14725,1475;14675,1525;14675,1725;12675,1725;12675,925;12625,875;12575,875;12525,925;12525,1625;12125,1625;12125,675;12075,625;12025,625;11975,675;11975,1725;9225,1725;9225,1425;9175,1375;8875,1375;8825,1425;8825,1675;8525,1675;8525,-1724;8475,-1774", name="Wintergarten", ), - MapSubsetEvent( - id=7, - type=MapSetType.ROOMS, - coordinates="5075,-4474;5575,-4474;5625,-4524;5625,-6325;7325,-6325;7325,-4374;7375,-4325;7425,-4374;7425,-5974;8075,-5974;8075,-4274;7975,-4274;7925,-4224;7925,-3824;7575,-3824;7525,-3774;7525,-2974;7375,-2974;7325,-3024;7225,-3024;7175,-2974;7175,-2924;6425,-2924;6425,-2974;6375,-3024;6375,-3824;6325,-3874;6275,-3874;6225,-3824;6225,-3574;5075,-3574", - name="Schlafzimmer", + MapTraceEvent( + start=400, + total=4739, + data="XQAABADoAwAAAFT//LoAX2vNwroEQLzmnQtJ6t+EkvyFzO1+DHg/irN4w3ZO8zLJdslWe8QEx/yq4JQmEIpb9E/G88rYCed8NdW2KziFXiQKWmJLRBejBYCYFhw6tSuUIQMvZxJDanAH6Fv2TO+hBVOAnfHNVcM+yCeu4xPgQDAL98lugcGMnxUwXViikqRbaFiaDJGUtDMi3WhUGGo0yYjL1Hdh73uNoTtdnNjdLC+lGZlLyvKbXkRhhwsbG+EoXtiaXQRgL5WkeLS4PrRWBD9oEDYdmjhFjAKUNvvS7SBOIhFEjyn+832eaPjg86yPyvAj72kBDQQon7wd8+xyHr8CwjbHOZFLnPUt27nE3fWMrUQSUdn87nwrfrVyUV1RLsbZhwE0E6sbIdsHKDloxvfAKnfCNU3yNryGmhGtY2PIfPcp/ldd7IZgw7DhoXPNp/9609+FWsokILF0bL2/9N8XuQM9tuPqCt2H1uKfr00I75bl/SdVGNjmq0MfHM86MjXpNu3/BbQM3Zy9SbKsVlXTWskIk4Tng5iLACBOBFJ+KVWRASzP9iaT5vcRVY4xKMI56lLJBHc51Q/EUtGTx1Ln9ejkdCSyc/PoBI0nITSE/WW8/EpCSXG/HSvm7JC1Fs8dIoRbIbrdyKaYaO0NEjKGe31c3yfsYBFfgZ/7HicjC5qv6kwCya8ZztxakHTzci6TXH6dtB2X5LSN3kK1xqNhudL7+GU7qb+CJMN2kIw7hZ9fViVlTT3ID+HACYkRtLBrMDTb9RYe2390GW8sHBY2GA==", + ), + MinorMapEvent( + index=28, + value="XQAABAAQJwAAAABv/f//o7f/Rz5IFXI5YVG4kijmo4YH+e7kHoLTL8U6O/tP7Y2EYYVDkNYQ8LR1ByAxWv3mdF+TTjdYkU6qYd1k9vps4CYGibMeVCmQFUjplKR+PheFK+l5+yPnp9MA", ), MinorMapEvent( index=34, - value="XQAABAAQJwAAAABugkgp5bzuDTsxgTfHTugMraGXP+ltaKAyC/YRb7guQlLvRs3pB8oB2eN85q4BuFvjNcnL2R9zlaWiYy8lilO/Mh3qPXSR7uNinsSaPtMOdXeDHC1pkpU02xnWK/qQBNAC1B+ncz1tePV7ybL7gpMnZLISW5ZG3pqqghgSRuA=", + value="XQAABAAQJwAAAABugkgp5bzuDTsxgTfHTugMraGXP+ltaKAyC/YRb7guQlLvRsd2n53gBzbaSGj1F2zRCzVK4ZuJKsUKZc36xbnsfUnGC+A2Kcqjy81+BegacAibMi1Cigweb2tjnWTUkut51NJxB8n14PCo02RCfy3Z39PaElYt8PFdIcyDAA==", + ), + MapTraceEvent( + start=600, + total=4739, + data="XQAABADoAwAAABSAT+QAgFQO2QqISbxzWjlNKH+CX3wUnNo7mcW1eHHbhNLLYQJ/57TDLDZ5miN5Up6Q8tNadb6toVK6s7DYNDslT25kjA91cxQOAkzNMpE9+4BxJC+gx+5z4tRGHX5YExg6UljXqFTVRqIYDULSRGria8DpcCKu+Xms7SWIw+EE6bVd/irNAb72DRltNX9Sl94pSQKpEuZz/of+iAm6jpaLHxhBZkb4+cjHuB+62gaCs0287+VgAqFLL8wxtHSC3O9ZS3StH7rp18z0jbEOjF6CHQCyD8IiDSMWZIar/hkIxUciLP7kcnnNYExR0o543mid/7dONjzYIeo5o/c2N7vm94NdTtKgFoKSmU6QXaRymVBwkRvrgt42/vDJ0Opf6aRUbY8ruhfSeJWs4b7w03lwAeEdNesAci7/9cuDhHyb+CivYYPoeVVQl19tQ6GDETdMe2s/98biKm8zNY3IwjngbclHBLN3/g2TJUuY3CuePRNPdHxAvpob4FTdZPsSUaCHI/LkBRHwWb5a7E+uFKhTkHi0gKXut2yCAvmgMOpOnHBHVRM9eiG/F2r/JP9gVnw0xpaW0e4HQ0e2v8SdbrPWu6v4yiCrJThLukrBWXTuZObEXWodVHyK6b61tiJfHfa1q6VOO/q3PA5QRli55Sa20ESNjPQ0dPGxiFwprYPJ5UpAsaOA1X46LCKbVcJZ/rr9yN/CXy9szhv5qpS6vwe7RpTMfOMN5AzB5EQBvrjeOdquaYfp+v4rcVojWEKZFcncyvZc8gA=", ), MinorMapEvent( index=35, - value="XQAABAAQJwAAADfuKAXQNczI4gAIXkUZbxSKxosq0+XZzOajuOyPl9wWdg3EwBu+azWjbNbUz666XGaYC3gUR+F1Cb5IWCFnqbndxSgwtgNiAPLo9M2Ipn+mB9ZIzkWLVouj8UF//TcugHTWJ1kwiS27tm/4TZxarvpI5RoVG1rRwbgVe6b6uhSt1BHuWEkL2EgrA32jzQGOwwnRrQGOx5jYZop8R7sXCo9508Rkiv0E9ezyKq5wQLnOPppspzs1vHYgLNV8UcOKchfAOfWQAW4BGUupPdrkskIUMw1A0LCgkdfwp/JCfSDPhtWqGnD5htDijz+52sT+52scY4KwYe7L3O/2lEKkGxG8UQPbyDGX1A==", + value="XQAABAAQJwAAADfuMG3bzJl9/2wGCDArOSBeCsMQwsIdtJkf8Ko2AZGg4lT8xBGfsdqBjv7fAVfGNe3o5IsjH8MUTse1S9YAw03J4cnRmT+xva7YRC6RJz4glbjMiJRQQI3OGksS/bTVRwHEvWrSKX2MfYgjOTCcro4TYxvHUfrzYNpsMe6Yl8GHm47xsGVSU30lcYSxO9tEPI82/vSXmcWYnnu98Gc4AYK6P/8axwh4+MJC9UCIlWCC5noW2VYnzS/npxKUuPiYMHBXuaqpuzQyJ3YyfZPLQyvp7MmLLQJt/81lsH+YoL9ooSqhwVCsfwU5ItJJIJXnni9xbeeSn6TxrJ7FqRLPARw=", ), MinorMapEvent( index=36, - value="XQAABAAQJwAAADVuIATZv7b3qYZ+EcqBeKoxiESZjVeBXbaP4M86YXV4mh7ZG/frZiwmDHyYVuT6iMBXbrEvdUz13BLebxWB4Irc67tBA+hOe5hePKz4Xn83vhUceNl1crFlgzOivS9TvfHlVLe3O5QxeueJyjM/7aG23GwXqPMoeJPVzz17Zx+F1JnOIYr3hi6Qa+0pWqVTePoz1VrHNW2Pa8GFRAIPGCD4Fz+rkN2h5WccfOaZ4uKi4IiMww==", + value="XQAABAAQJwAAADVuIATZv7b3qYZ+EcqBeKoxiESZjVeBXbaP4M86YXV4mh7ZHA99IEA/aVt4HPe52di9JMR8vnrIwx0QM5Wbmsc9WzNL9DE1tFKDY0HopJI7tvrje5hr0HiWD5pnoq/DFyifTTPGuo33X8jz9Niz45E9ZjTp352TmrRpGl4nfrbcj52srts2AYIWBksNDxc91VyuYET4kSz+J4JJlHzkEG1erdbYVtoiXKI3PGcSsVg2", + ), + MapTraceEvent( + start=800, + total=4739, + data="XQAABADoAwAAACIAENwAfMU+Zl3P7plKqfQitkzzy30GMkb2Te2tVVQIdKT0KoBuTYnQb0ij/Rjc87kMRhgLtghZ+jnbpjz3wtH4xyHRIYWOF2kS/MMpc62yq0/xFvlJg6NHbcxJysHYDpjEzSJU3GbaXR6cTrRzpfM7yfgr90JJYpsxlgbY4GJhJXkYpv7OsLtSPK66VWTNzV7acTYNFz+W8QW0vHlgYFSxra0ISBQ6pVgG5zthLmxu5UQvmJvBAxH2oAkwPig/vrvUoymYe7FR/xOMQa0QDUhUV7i5by6DxwurVdPqsPWHY2OHxyrdKlfMcjytqInLyZp7qBGIVvmCsBFXe2X3rtvLGZSG+wMySW0v294kxaLo3W9+kbbhfeDEAVK21Cj6MpJoxuWdOmbq6wkGmvxR2z9u0FPgcosF5PD5SVGHeKD5c07oP3IWpUrcs0oAZow4RnDEEbzQrdcnjjLUQc9dvBA9cW4LEGRMdG4LjA1+iE/zi+3lQFUaBKysM2BA9vxO9qeIrqM2HBPOc8Izkwm7B27ulZI98Gltzw7SdbOPK3Anzr9TNp6DB6kD6zpOnfilWk9zfBFDqI6e+pjDXhgIO9xWIL7/fRJgbWKaaRMODvMeBSj5DWX0mKJG19dF0GP3IugDuvoBtdKWz4dVmWa3zCOStULdT34AaIzbaQcamDED3YaUdjUwRhzSAQ35eEMVrhUDtRAEloYHHe1PpIApcZEb6MHACI1kvhZobNIXsdM88nQ236jy82XhamQBAA==", ), MinorMapEvent( index=42, - value="XQAABAAQJwAAAABubEsjyjym4p3tetMqOx59dgIvptMvdoM4GxpnShdpXptVMLzFuYVDRf7/h/S7UPCRO4eeAoCtxihXhsGWRAB8T4dLkNtTamGpWIlWwDBygo7emXe1+tSSSFL7jgb728ddCkaFlPxBn4oNQBE3Q+QdC5k4gh3pgb314puwRhjXEtc952WgQ05xy6W97oYmLtk2FadXPJXyXUUVPH1Zw2OX48vTiLITEro4ClqFHXevQTRuqLDy1gHC0GS+xoMUwArUl5wm2dS7zaA=", + value="XQAABAAQJwAAAABubEsjyjym4p3tetMqOx59dgIvptMvdoM4GxpnShdpXptVMLzFuYVDRf7/h/S7UPCRO4eeAoCtxihXhsGWRAB8T4dLkNtTamGpWIlWwDBygo7emXe1+tSSSFL7jgb728ddCkaFlPxBn4oNQBE3Q+QdC5k4gh3pgb314puwRhjXEtc952WgQ05xvj4E2tsyb5ksOKzj2ZsFMN0dZt/uUQmKeAE5mbkGHD+hzzb1z64jwvskvIYTWgpqgqyn6new0Cse+DxSAA==", ), MinorMapEvent( index=43, - value="XQAABAAQJwAAAAJuJAACx4OBcQprP91YASA7KCbdhQbxy2wl6f6aGqcvnCpJECtL1cqKITtl8qDVmgho3vYlUYorTlB2GZ17Lq2boEnJFFVoz0YEPiclQR8l7RVNAYDAAkEJaWNT6CA+TVx9+tNvQev54U2vE9fLG5G/QC7kQqiEBxnYkvfGwCUg7GRHrE/3jUWZ/n0mCAFW9iNnYCyhDQ3cPwTsMIiqkdNwD2OQlHWlFZs2C/A37NLjnzIpKrdvm2H/oWyEf4+qqOEH85dUiQ9k5FRfx2pfKhL8A42ZgA4C623W26zXcSl7Vlgrm7sBicJbTVTRwTY5HufJkZ+aYsn6TNvUhKY/zvgA", + value="XQAABAAQJwAAAAJuJAACQ1SWRw8CS7i+oTNI/oRNIlOy3pTQnMs7S23RGiZ37I4JBRqPPB+zvngCz4KbPeIKiYrAIdGPOweVaXYyEuax3Sbl86zyXF6Ulb2D5xXQTMGOVXx+kowfklIuvL3ZqHG70n6AVGZ4ft+Xsya4HbknfHCF7J7Exc9MNSHfiaLMEnOfE5h5fRjz/zvXeRM3SSriB2p4f8cXbnfUAjt0fqWseq+wO2MmIk9B9v8YdVIAJ0XR3t2qXyQVvhHIrP316+kaCzoINKvQ0m7lozCJiuojuSRuJm5g4tLSJa9y5ycJ/uCNAsx0CnhE", + ), + MapTraceEvent( + start=1000, + total=4739, + data="XQAABADoAwAAAGC/y2AAQwuK71Am43P130Yu8WZ48y6qAHPn7ZqZVIIulzOiDnCZnnnsvfwdCaLjaSH2x3UJlEeprtlh1Iql7WpY/DxD23SwFqSjVBw6EFwvzKr1Y3itNJxX0Ukioe78FotStM5ogjVhCQdqZBRxX6WacMV2HCXjIR5JkT8joKHyh9dc5CApRV+0eXpZia2mFdOANn03CLZSTEtHkqP+6oBATXoB5GFNS+OPmYPGSWeGn90Ij/Sy59WEgHx8uOsoElcUkLr8U/Tg1jkPiPPXD0y1Rtv1q+l4TvLED8aEouYZ4VWg9G0xi5CNcvcBCCMHUZFDp7Uc6GOw5paa268Kx0qDTj7iJNmKQEY22gBkK0oLu1ikcukyWMDUpAqUl2zuuCYR6xpuhqB1DJPBT/5i0/hYEHUz8+sINSbcf3L3aTkbxC+RqtkpASLCVq/qIiNBd/AaDf3cwKxkBvhsl+E4Qmub3p6VfwX/Oj2bzrIZl4SqCQLjiJwm+Ni2Ih3XHo1dR6y2bjkceyzVbxdEyRQTWAX9Iit9GdmHmlqbpXMTLF5smTy9vjc3nzOd9CiQR7ImYuZdzKufHIHwdAi1tnc64PezJ9kYA0ypbwJxTq7juOTsVWYr/Wc2RPvqA6JrZSsI/uQJqWw0qJGTTztmhYRZCD/kx0sXtDFIZGltkmrU8PdCwvdVKRWnpsaFBPy0EiujNa+slifpBAuCQxwH+Xd3/gy5BrSr/rZOW8zDEcZ9VT39qlJpA7Gf/Btopo8+TD4dmQ==", ), MinorMapEvent( index=44, - value="XQAABAAQJwAAADTuOgQB/72wZx/w8zQuXJA7zMEekl0dPMB8OvQiz3AkdtwkgOUDB5hW9x0BLag1lRbKqjYgKc0NhT/ebcTX57E4ETcwZ+8ptzWztNzk1Kh+poLJXLouDpCNENY8ZY/+2pAopPvMtWH5w9ftXNoBr51d8MLRGJw6vqw72JJqnAaEryA=", + value="XQAABAAQJwAAADTuOgQB/72wZx/w10vVxCJkURY5oE0S41Uc5f7JT6LYZ6fL04AwJBSq0587KyQUskSvz4T5UE1F6sA/FfNTZLwEDfTGKfG8wak9ReEY0SvWBj8PmjXJcgaqmIsfJror8V2ESV4I/1h/mQSRhL9n59VQ3tzDUES7BumIKlgIucZjahrna+TOiq3FQnv+ue5ZEM5vJZ5QIZ1h946uG7MrrAGOFGXC", ), MinorMapEvent( index=50, - value="XQAABAAQJwAAAABuekhJZt5pbU4RwYAHIDtReEcz/S9uYyPJr+DpMLWpsnw6WqOhWKh7QfXFTlx0h5RHxZrYItBKU+9ZoSx939S5IfAB2QNSiaD7oyz180jVKegOv0CoeKW5rEmG5WYQspq+xJ8AAA==", + value="XQAABAAQJwAAAABudkoiWLJuOTk5RKILbyMBfP76HtHTCtvZ/YJNhEzK9NwMo87NlHgSUCJWpP/9Est/iTGHsSf9pBRbSFDN5oBWJxxWY/btgx8ANGHmAJZcvZ2dEclyro6MkCYu3L0uBe/7aDxjkWMZKQemJ1Q4QA==", + ), + MapTraceEvent( + start=1200, + total=4739, + data="XQAABADoAwAAAHMAEl5If0S6ssowg4MubOYBDNEojGRhPSJfVOzMVWSve9WubGK+Y4A9p476wbLPrCQdBBJCCZEEZwS8OAlCagXvTDItzyPAUQAVdyEqy2FDWFQWRRkJXZK0kKKNJ5y5pybrUy4Mb0iUWssiPV4w/vi8kb+R5hahfR3iPjKmY6uvCsgonerzo4GgsS+pGpwWSBY6SVZahKM3Rvi6bDFmdBam1rIia4mAHTRYg/KIKtwISiC4eknE1RMGFoOpTKNl9aUMZp5dJZ4bFhkGP19rSwtk6vxSc7P/DrK5adQyfLApIcIDPW8BiTDQkiEwEHFiq1tWXHLcfCBJPkn4qHYgSIf24aKtSSTYzi5eqXNW4CZofC6rgP8/jQJz3ld2lexqwYRnGr0892gSLceNgUSsGazjvRJ8g8JOAegwgtju4Dy351BDkPQkWXTWiSEiKZw5VJaPzdkjtFmMxmstf5WKkuGFB7jzOODwdtke+LKUdOOeBdNGvqi2bNZ8xDTIV7l9RjlvlR+5Y2EggwMVkhNCVWt6OWmPAhCl8dz8SWIART+EIUgxLpEYTuKJmEDZqO59+AprAsaM+Jr9XsCYZg5cGPnCVAhWvH4BKJuB/6a+N+8gl3joJr3eyAfydPP2U28w7DlGbQncK0ujHdGhJsmtogyV5v4vJOZenqfj2E8MKbU=", ), MinorMapEvent( index=51, - value="XQAABAAQJwAAADdt/gXVg0greQ8SOVJWwRx/WGMASUHLAUJaxnPABa/xpu01j1MnlZ5Cw9kqBnzhE4LNyfUIxhAjQsTur5wf4jpbQVR9fhC9QIdo4KEwTqJOxqhVbWGDwoAXsJfCXnocOWFUfMDoAYA6WIcyUy1abkvM7S+G3+WfdJ79yn9yqGwHLF/BDsLRP5sWkC0xfEbYG3/kVTvVuer9tkJJZuUtPuoDeke7jtt7fbKmSdRlqV8W4ryky9MwxQGaG2rVUFMTA/21VA36oME8BgiPf8tluiJBqIVS3LenDFSx4TlEHRDvIvgiUTLoR9kgZS39pEXmzvwyfRTfhD89aZBYncw+/WHT9c75Qp0JM+5jbp++7Ti/qcY5rSf4qA8h9OLnsVQpP5vHDrsH5SsTqob/rd/aXyyhwKF75/aVb1SCXCtRpLuZQLLF9ysn9xUUIBItgbxTU4Y85Cny8zRYCnIMyISzyu3FR18gbsQjlyHsYdP4ox+taOavKEBalU8wtmFSpMNLZPvClAqHpBEoSfH7wXbwS/waNWxhm1bduNMjYX0QocQdCItL9uSqMLhHb7gDl0DyNw==", + value="XQAABAAQJwAAADdt/gXVD01DCV/9DeewX+I2e4Oe5DwxyMDjkw983YgdhGbJX7VzgStunzm8//vTjuLSjPDxx8I7W8X8CaQ4XWq/snwo42YHIMPYJY4WDnMOvpzesXkhMCuXwXK9oGzTptDVrWXBRUCbsNRHvlMiglnrVb4DYZjdr/krvnpPscHHnNvhBt5Bbu7QWF/ESu5w3srpIMdpCmme07Sq2m39Aq5jvA9wPIhZD0vLamFnVIB9wSdero74BHVF16veKNTsh0zY9WfdB4qBcF+dKzIaTCyEK5EnY7rhtEsfOJx9auFm3loMQjt6yRYExRXww1Al0YEm4ikxG264AyaA6ifHUsAHBzNCv14qh9MeIjSJPZrtpClrKSJSs23SbKges6IoNzTGkOQ03c8/dCWKBfg6ChXA4nCP+PjMWjYGg3p4mfvSKwwuZpZTYsIUWvg+H48cM835AJXGpNIJ4HHLU8CgtqVuVEYjx7kqOmVpdYANoDDTPhV3+wFPdKilDYcts8ID3UPjfG5W7zHSqJBfrEn8pfmls5Vjt5xbbLfjWYAF7TIokrIoFsKBy1ZMDFYTvO24A09hzLr2ynXpoe+Q/wFVkkd3RvKD+EqoAm7Yerc/IlaM5nBncemiGX4wUX4+TT8A", ), MinorMapEvent( index=52, - value="XQAABAAQJwAAADduHADckpSIU6Lc7gaVYbkAJ7nzivxyykJm7S5UENTnwWPpUkCxzMqUbZUSOVQynE7gXFy0B/peslyR7qCxAZQSixx4AIJgTKtHOHGEXPt5wHceFvpRYUj1Y2r2Ap7FZnNxd6gdrFj6BemyU8hHnIfgGjCPLKK8IPiDUuFDlsn0u1KjAMvgKlB/0idGrOcp6RGHSyax/VzEd6/R03+KvUGtFxDk+rptMh+PxCmkpQNySUhF0qL/5hrYErPq+18df58ID54k9vt/KDkgUZNdmWxcP93wE6hGkEPpMdavYM55ig==", + value="XQAABAAQJwAAADduHADckpSIU6Lc7gaVYbkAJ7nzivxyykJm7S5UENTnwWPpUkCxzMqUbZUSOVQynE7gXFy0B/peslyR7qCxAZQSixx4AIJgTKtHOHGEXPt5wHceFvpRYUj1Y2r2Ap7FZnNxd6gdrFj6BemyU8hHnIfgGjCPLKK8IPiDUuFDlsn0u1KjAMvgKlB/0idGrOcp6hstEh5qZBgQ8yG/iIVTpPjDhY9dbLb2z1NrdYuICNeslaume4uDY6p/yTvY/2G3wqE50maoBmTOFjlNz7Jtjp44dwNPT44nZ/n7kO3fQwA=", + ), + MapTraceEvent( + start=1400, + total=4739, + data="XQAABADoAwAAACeABPNsLnS2XUX2wZx3t9P5x8w1Pdcv82IkyPvltnWdfU89fL9E98HxRC33HtCpBGHEPTNEtcSt/ETEuQHGLTJDiqNpdBF41VXt602b8fjtK+IpdkXc5fj2q5lUwffMJ8yILNGk6TthibuKq3ALDoloI4GxOlzOSwHU2lAaK3YKFP8YHJ6zPT7qUZgo9fXv2wlwS4M6j+FY8Daf9PRvwnmP6A3wFFaTuAJUVlelW5MKF7lsR1v2DI+WLWWmgjKWoueurGBwbKt5Q5/Bc31WdT2IBOCDVHJAk16i1NoRMzLsOkz9yamy7/4/vTX+GWibpKWdFFnemIVNd+0oxllo3Jz+l7Xc3FzDXYSZvHTfWjCVN6i0jz5deXkYQ1WKPYe/cpDykZNi/myqEzGsmkGEezdlmrhyyAMwPyEnjRnXaHXERkthX+Jy6CocxfaM0epk/hRlPIczRa8wH9wRLRMjpUyN0rlMJf9JWQAQgPTVhiFWclP44Fv57POkjOyia/VHfcdeZULHLMZyBFoAzsR990bzNm34LSySSoCJ561FTlJNzH8si6GR1n3ifKYvFIyV0hwHI/uiIE79izJaA7N57UmKfKXI8H5rTAGBHb+aOdxS6+BcadpcwDBjTzLITEWQoQzx3CHWWA22XcAtUZVYfq2rPGH0zK2jlA8ujUqYyBEyF2PiCD7SEAex9TOyOvYlTSIvv7dYzbCI9TPnI01vBfZU55E9gFq2q0i6ej1/OXPrmybV4TzVjf55BKaHryVYejrhHMLipyyGeGAV+RRUfOgWkJwSq5I8jK1nXDS2IPIEFlRe42ISweSJxlW/6g==", ), MinorMapEvent( index=58, @@ -592,8 +627,88 @@ def _events_for_map_test() -> list[Event]: index=59, value="XQAABAAQJwAAAABuPElBZUtUurqaYu0MeEeAil4++JRw2vImdzqzdC/RlvGuG6OzaK3Xuy5nIu1m+tUotWkHqnR3Fx3UnAFgYtDFmfCCLNpG3jndVAbv3p7ZKCcacQA=", ), + MapTraceEvent( + start=1600, + total=4739, + data="XQAABADoAwAAACT//N/IZdU9vqFeSZYXx9dD03iTtRKrCeSq2QWQeIO3UB9g5fg8/cTzNYS9fDMLZLSCj+vw4/Gk2u9mgn0iwqzQmH33O8B1iaI140q8I6SSWIIKLpA8uEpiuGdGEb1fK0SXYc+mfOX2NansQvyKBB2/gyH6kSgR7XaG7+P+J/sAt/IZ9g/Xlxs7ARIMBBgtKR0JKExhYsv62QSJCQB/A1Yr5vGIUNy0xmhDuQu6Dbb9Xj3v6pOAdmwuGH6bj52z1z2BHgqV0Jme61EF1LkypVG6rqPaLe7yNqjRL1kJW9h/15/RmFqUnXCA9mI1kmvOv8/efqqZyf1SH78Zyev0sHtCpWTXC8no6NtrbgbZOMD6zGk7iy8Y7LjLbZmhWvprhOXzVt16f6Z3HPsWty9tTLoeUKevWBZFYJ1wbf5YwsYZqFLI2psUylfSlF9/sFhd0iYCCMIpS0Jp/4z2L6cMHYLuYjIhzqIiyzbHGKr57Yihe2uFF2NZ0+onJJKwHxqkmPrrarstdSRu4MJDtGEYdE+JGvh4/kCcL5UE3snc3H3DgewFofA3lVD0AE3LhXScP84nfHsgwiEYjsyCQ6RmkR11HDT6LnN1U/yDRqNlr/onVTjSVHajjsVOBK3p9PKmouk8wtkjIcRUOUEDy3BBkwut0d5BbTmrDq1U7N1DRpTe3T8YVXGmWUtZAXUG9eGCgcBf+E5AXGGxIC1XVOcXoQtEobfBr/gK2aFAYeckDYPDgZPLISQ/L+OqKruvPOW1AehUYCht0C0=", + ), MinorMapEvent( index=60, value="XQAABAAQJwAAADcBXQeAAHimLPzHwr4JpEB5N7g5Lk+Dg/WqdIeFBDEA0yVh4AgSu169o8v2gNILCNK85c9hT2/ETMWSbq1CxPOqitsPIFQNsni7AA==", ), + MapTraceEvent( + start=1800, + total=4739, + data="XQAABADoAwAAADuADaZywW8As/oBlmkB11D+UPOuAHdTsZ3B8clwt2bcaVswjpi5G52FGS0Dui/7WuT4yp+A5VnFxhAKjEuoWDKxWSkaejiIw8dbmveIVLAr/z6eNp6atARmvVUw127SdrQkSssjlj61S10TsNciR4l5K7rp/jv+SgSHPpk1NJMat74pffUxjdmOWldkEjLeIXuUrJXP224scwfSqJSWPDkGhittT2qRwZL8RhgemHgvZ+PX9qXp2I2iH0CiR2Fjg1Xtc7chUpOZv9hYt9+aBMtPZdryJ0ocMqJ3tmatsgMtsdV0BnxpDyRwJcqYwUQcE9/LRWANWHg7pzbx7LLn5C34fn0zpyjHc2NaJ/oyNkS977K1vRqDw2JCtlzsB/fQbaSrcIJJeuBl6wbgwrtce6SnWo9QagVw8J0q3DV0s1VQ9b9Lz+cFyw+7Z2v6b+KsOi+RPG3XG+H2+0+fxSPMWJZUpuNm/8/LwjWLHtBPyzlIg19E/lEler6BJBlzmxYTu77o/mYJLC8p92jSujxYT9ZHYB9WWt/lKGBAT34miw5YgHb8fCzkJo+9HkDTaTMBuBTb71ovxqFP6vhzKefEhOPVMa8OufrDIic2vFsTvw5YXjAeJ4hGGSqM+NYHktFSHkpQ/l4jLEB5R2iDvYDSzeKimvzmIELj5JqZboC0S5F7UuQYRFBCQIoGFK/BQXE+/Hra+aav9B+d2+h4PdH79/ATghhACjzwbxZ3YhAkjMmM18hmoFIRPWo=", + ), + MapTraceEvent( + start=2000, + total=4739, + data="XQAABADoAwAAACiARA7xKOpXh9w6tRV/962X4AXM7KEoJWSZYUUFgM4TbOom4ZOmIuNCVyZ5NCHl33WVqTkckmbLWT/00NIMPElrWAEfyyPAwGaZqxMq5EPBUbcfFbYl0tzV4rPEWQuHl4ME+YOtOhjLHo7pYPN2vbVQEzcHvh6XwbKuA3cJ5Z40XNfVGxwA7UHEFBfV5jBSVdM4dWhZa+mEghHPb4XGagUpJZhPpAWWR1C6B5Q1PaAA+Ddp70tB9hqh9OMCA1/Wq/TyaIwQhb+j0BhtoL0JHdGn37aTQZ9pwoVW7DONXlQzBoXaQe3dQOOrAw1NMP+hfj2J1JBU6uBXWGalgf374/xeGdEI8Tj2q2dlb4gdGsfgUeJGGSq1fMz8fkEXN5K4GWgxR7VQyAaOsBP7kccu+efuamSzriTaadPOYdGR7L7R8yphLFCMTvfgXiGjAjoXsICPOoa13bUpGONiVmlXOIgKnOQFKg3E9TqlEKJMYZCME64UFpWbKrD6hp5Y8j/Khe2saj3hrYd8AgQxLOz8oMBouJ+Qv6iV8+J8cwXhpzRlmqSSvSNIKCECfNdDvMr4L+k6+iHsDrRsKlwxBJaI4q4GogLCLdennX38hxqHPAQQyOtytHopd1+k2AcgXzsi3K3cX8uBPQZdQsSml9Cw61tavdjSjMhoSB8W7Xt888GaPZyXAA==", + ), + MapTraceEvent( + start=2200, + total=4739, + data="XQAABADoAwAAAHSAgMhwztkS+/sUwQeeU+yxxnKuxKi4QpZwFsSQmIH+fZ3AfvjTIOLIaYPpkLRS3vLaAF3EVEBWg/dOumpWaHSmC4ns3tcGM72pwk5Z9W4GvJ6EMXocUBX+pxru2h3i10+vl479URY9fLmgzPYxYSerYVzYUzYTNKlAr+b5VPIL5Y/cfZ/51cwDflG4GrVlcn5bCEa7vsozaLzlSicyBwIkr92HtyDuiI0FeH07MI3hjNJTsxuPeT4HV4cErHSub6249ljTUUbuPDyK4d5MnZyQQECQ4vJeepzGkLDbvXB9r15iO1cLJTPdBD3PJtIaDpuoswk93JIUdehJMoFaggDWnLtvpEGp8gzneFot921sE8dpfIiHcXEAijev+gjfmzTHek6ISG7iOYfOlzL7+EzbAEU9dj874mTwwIaLEFJjzSFuFmzQZJBA9/S81DMKdX3eI1/HduD9ujFKK2g7+LV2hRxpkhRh5JAVdBj2ZgoZwt0Xf1draRgPt0Bn9v+YIzDNvksSAyPtuToS0ctkKcMUeIzYqYMP4kOhbA==", + ), + MapTraceEvent( + start=2400, + total=4739, + data="XQAABADoAwAAACyAfe91Pq+r/Dh5CD8VsGd8dbH1zwm5kOblw18/by2wMlizbkCaC4bXVVVOK7+K+k6o80pRd4CBZ3eTtMXjuufKS+MBX7KrJq6o9BBoeQlidyJkuUuETTCUPRW6uizLnIv9GKU+Mb3DfArCMxKFpgqFJ0KUV8U4OAXLwrQm41anwpn2qAVTILILaaXo5ooWg+Pb9JvoAEDja1m94mChobxAtssK09yY3dkwY1fnOoV0v5DO1QNpSbhh++PPIWs6zdLm0clXWFGr381j7pbsXsGwpcQpSE2+02rtRxTVgjygz9/zZJdfKFgfM7etA+z+Ni4aKx3P2fNyxOYeIaO59Qsclj45wZToUHrI80091MZvFtwJtYp5cwG4OgSjujbaNcjiZHhugGc8gQtR+hhvPMKA9wLwREMSgtPpZwz4zPdjsDMIUkBT4uSFXlguNVRy7oHFTPYNgbE/vyjtYJnaaEIlN1kH4smHV++37FtvRipuMIZ4HZxTTHJDhiCVT5Kr0MKMfMQHjIWRjVfR4YIvCQuG5vzyl+TOPeaSbbteCh4GP7imlADTEXGNdcMMCk45fU8cWY0XfCoEmgUDDCrpyAGpJSck7nxoF3MNeWZxtVO8EbkRKF9L6FuEvw9JvosyeG4JJvwXxJiKXMKmMd4OZQtHhvLh00SNSDfdAs7msuohAdVQ+jNoXMJgnDYTiu24OQ==", + ), + MapTraceEvent( + start=2600, + total=4739, + data="XQAABADoAwAAAAMAj7doM+KAaNXWbt7UpPlHlLh70MylOnzcyVEBu5J5jkKoYKm1xZreFXjeBcdIvmJ6cNH3VgOiTSuusOnClu0r5Y7wr54Nba5nJUcLNsiqb5ClLQsZOm45w8rdG0ucpq+FOMgNUR/TRoT9SIJWRcpQnG+BJZSU4+IjxXdCnhSrDf+15YQCfUniHQ7NINoi03sP7JRedfHzFby32oZNCdxjvnhfZEn/f4zT+k3YwcaC9Q5irzb9VIxm0WQQ/pHO+GrOPTpztRkmG7U/J8uidR6kmOuxqrGpPokS3lAHOt8SvWYS5Td+fKGtYTE6yAe0jlGHDa9UojgAoJOhWtf92+JzT+X4kV6lzhxm9gjcyYTPb0qcPzyhnjmJmE2FFFomA1F/P3o74WRKElLWhNdNkgcFrqYGiuYwbtLBjZ5NXBdxdv0O7E+gZOl+KnpCdR4McdDORx1tHeHwfxW0EGZUKwlaeOnJucy0Afw2OWQJ0vmnlGz35FEPvUv0UfyHzsTD8bbBOu4KtRY+Oig912pHyALkTpHOcsPwjYTQbCxzs8tZ2wSiQTErlo2fYNY/FHiRuTOhvizTym8W0CTOdkUwBMScnR5HnzTqXSaV/zQNlLmqfuE4SKTBgf0u+gENX2gowFBlqvc4IOvxzA1jucigCESdEjmwq95xlUgDxvkQXmJttr5dCKM2QkXS4xg6l8HuLgabJDP+1MDaukxY+jwjkSER6sriqMl1voEsqnv3gKxLjsFxSB+tYxueDzZRdwpHYHo6cJwIX5/LD2/6OgjHEv3UkpNbqhtqotIyb1QkZucvizdyswA=", + ), + MapTraceEvent( + start=2800, + total=4739, + data="XQAABADoAwAAAC6AgU6cR4qDJz3RxK0kXJTqJ/nP0e+yBNe/36uAPDV9k8HoJYTAerk7RYO5F0Xm8PtC5HuXm8GSsF3y8fHrfUrMBozo0+y065ReEC4tImniW1Iu5v2+wacefdCqtCj4j6rvMb4C8QHnGTPwPMhO+9tDS42mZfPWWCxKonVfqBZxfhqpOp40Q30g25f07DId7qGkX4eS9nl+rsS3OJ5btqCgz1t7cIVbm+1K/MS5hUVbTK6I7AnMmUS9JIdn8kGLrLqV2WpcvpSAriN9mn3+OoZLWVDGpGsVIIers+MxPkFcr2oFdCBnctpVpx9KxjSlbwKM1XfZysz4+i5ttukVlo6otFpjPT2anGe6AEMw2xe88G32DaQJ591RmNK6o8KzJ+opn2OtoFiLgrUQ3dbGRaMBgtgWC2R39QoZ3rEpaCC/azbMP0Wku337enQyE8rA+d7Da6RR8azSqw68Z4huiieE3U9hz4zRY86yTZpvBokyXhv+boRf7BatBiXDrdkhHB95U1UlGPtCrRvcKUzJf3BE2GwvVXPSoQmUPdd/6ysMNHcgUW9e0NuIfdsjSgdeTh7glEBUy8ns3qtO/8fXDtqcjh2RVmntWGZlwY8QsPC9FW9TqKi1XIQYsAraXVux2TLy0i9cBeVBlGYxPa96nty8rcE++QlxjdcbEyc/qyEVTQaZ3Me6TjoAg9Aja2EEwXlOAv86Gr7O9L7e+xlHW9yFAe/sotATldKF8zo7SWSxgpXKnBytvg0IGnqO0rHadjeGlAEZfuxoeSDtMwwzhyGuw8F67Cb1smvitCokoHn85Tiq++wpLFTSXNIwJ0RCwlFLvd8EXVsA", + ), + MapTraceEvent( + start=3000, + total=4739, + data="XQAABADoAwAAAEkAPKpxfXap/xBapiyOHws9nLMEqUj9mdV+Kd5qUam2KgIUojCz2UNUKJIcTEGY0H+5K8Q7XKsq2aus9UjER3WZKLvC1KpLceDXecA2+EAbo1QTIeTXZbSGj7Rk4Ru2INBVrwDkVD2p2/00F4rtcxxGCqSfU6Go4oxeG36qwJ9khqHufDlwWwW6zbXhkF2l0cWyZlwEWaer6jpTMsz1KwwqPA/i1g7DLdlgXhyNU2SJE1pIUyd+ddc8/Ij22ow/hcCebD/DGtaDlJJqvZ/jFjWnDYgMJqLTThthI7HbwS7fr0k1zKjE6XenaYLpsdWzxZ1zPP40RdnWiE0Zs7Oz7nBI+zKgKFra35ei5MCs03p5deIZ5PeFKBxvCKZYr2kEzfdBL+zaViChuKSewmIXnXavjkSe7rYrsrBs+2fnCL9fyMDR46vQYDpnzGTJDNYqR3OJ0pmXU+IgD5xJkderva8BgSYf/Y3hlc+e+gCj5xuhO64VnPMJjFIS0fnoZrkEp3jjkaEPdR4AW+EBVyEu59PH2xlR7yu7PWNuVP4v5VtnjYfa4lBrIhRGMc70q++eAE2oYG9IiTD+weKgningkefhGOien8ieS40aSmA+y122YdQUGksAEAAe8FPNxvo1BN19OZb/vgYx4JAxo9yb4rSgSWCiy4h7mFfeiajqJc6q+2OW7E8I9dLGdIFO0PlEr+H3jiLvAOLGSHj08gZD4dxAhdBmtT1hW1DHkNQZhxflGJ9HIYjEBhILEfjXOwA06qWpawA=", + ), + MapTraceEvent( + start=3200, + total=4739, + data="XQAABADoAwAAAEaAAWNwwjUHjfU2jDlLQj0uZSSbXdZdssPevhGzmgPjxsivnu6BYhDOxi0BvtI7AdLuP6Iq+uCw/5m0/f2oroOD2eVIQUP9DQjQmC+T/6GQwyhZkr1vei3AsfaMRIyyHyXgUpnyLWATSU+AnHxToAaKxf7ZpjOz7hx1sNtB8GVpBiSeLOnaYsS0G4uESc5YsPrRO7LcomGVGY4mkYnHq1XLqFtzobXrEAs4MuwKitA0cVodBtALbVgAqdYO3HzNC0JkgmxpUb2A0IpfHRp3nNhtUKVTXmbz7W0r0Zih/3elYF5JVbi/XSvkazM/Zhs35dYDedb1ulNN0TIEn6SfjV67C3wGBmlltqH5QKuf3XmIXxLGtq8r4AYrFrT4OAbRY9JR8KyrgWa1IwavJ+Xz7ch2r5X8/QlpeOQ3Q8XG2wxCPPmUzVgyYzbNSG0nbQYXk2XRYwJFohSGrjTnwh73AZiawQ93LPC6+RZE5QtsIuH2+sSjgQGCJsy79hBAuE+PnAYQaATGv/znEA226OJFjNr/2QkVSFm6gRQJ1pJmTer4YDO3rMDhCuSJ98H8NhJq80TheHVUhktm2JvZ3IKNH4e0hTaRHUvFhZU0oVzQ+NBVDdas9APRSkWBMhfuvzxqpNCldiI3pKTVZ/vTIGYkqOqtYx2Lzd7y2G00pz2O16WaFOmMFwDCOGLq47puY0LazE/ha3Iw+JZEeh8yLoFRDpX3/QQvQk2Q3lbPaffgcObJW+95WfPB4KzcbQDCQWpxF6/b8sTEFIqBeFpUnVz8I/DEx1Y0KwA=", + ), + MapTraceEvent( + start=3400, + total=4739, + data="XQAABADoAwAAABqAG7JjLm9/ZG46gP4hG6A5/8B4p/bXl7E2MEbwer/OBUEcrN6OKtXdNBpDMKS8YTAOs4d+EtDFgMlDaZEcThcukXpSW0vNubcz/UuV1onHV0cJkboriXTwh4ndjpUXu57ZSsDc8ilrTgglbe+UBlZtxJ6Ztefr0gm/Jz1fbpUc1EmK0kDBU8sB6BDeoJXkpH9ll8sk/oShUdZAatG3tg9lJ6p9OeLAlxvk1xYwHN4oIq/s9orwkH/R5+JCKOYW0TLoRfABgATu2W3rJgjTyZJz9tD35XPqSV89GwCuy1NkN4jS1NygyobqwhblX/oa3gGT/b27M/HTysgh0kmNwzr48sAfea2149m5QQJYp5WTNvDL+EOJ1MLgnYtRJZw+ahjpFP9S+ndPx7v0gzyFvX3qHxxGF1pXj/0O3THIXVtwgmdB4SrcrNeKVsPZAEJp8TzlFuyQlSv8eXKOsuXnrqUxsxp9oJ8CIw/4voudQ87WoFL78Sb24UpMYoF0y2sOtjUPZfx/zO9cJENYKJgUXvvWkVsg8XhaJnQFAoZlW44iEDYrvCAjDPmmT8PQpOs5YrzM8wkozD891guj89W8uWqA2Fyx+l52dN9ffFh28ufs6XXggQeK2lpPEdYhc2C2sZ/weotMKgkBq87G1R/4q7MMa/9vO/IcqBAh0yEnHALSoca5I1kSjhRgzRO9wNzkvCzhFX4o10Frq0sccJWYZ6lJVQZsFfLUWhPFOFbw9lfJMVicUuobk+CpI3MTVM4DMqSCw9H+VZo0c00z1Khax6Yqnq8A", + ), + MapTraceEvent( + start=3600, + total=4739, + data="XQAABADoAwAAACqAGtlRwe/zwKkal1hNtl2teyhkF00CALfRnaGAuS9/OJmoy+0/0lxqQUZAT/9jFxpuOScm/03kUwELq2xILjWp3N+iCl8Ng8IQei4v9et6sbhnHZGphSa8Z9ZGkXYrykVM7rnVOKtKet1/buPB8lOadjcQDmrVTEhSN6W56q3HmF/ebWEmP91fwRrkMVq7RZpCglys7Bxrnn5FEhiQ+NgSNkN01ahORObp5e2EovhgbD/J4putrzZU4lqPEHXg7hZzLjTJi+nGzw8g1G7WwjnKtIr47J7kir9E+YnZYYVXWNCHXAZHoGURzNYhfE+O64FJjkmCQUgnBOKAF/pz/ZWgDNlTw/Z8LwddUuVgFddNM5nRUTxqwagnTxZIUhEgZAEh37pOYTZGLCL5TLYsCGA4x6ZMaEjGkP5xTJPwqgsV7yQWRy2ETJCY6IJjarcWdckGId813mvukGpH4FLk6HrzBix6AzXhyOdYKMbpNgloI4oQOFHawCfWtxrY3t7Dvid1wHkkeuil+juQAGUgauLl831l7Ws+stGiHoL2v7Q+R1yWI/29sZ7Nt5T3QZuz7XNZ3PD3TYyc9+7s1UuJZDelDF31WcSng///QKIB9aC/g8QR9dbG29RbXwj2coEDz7Bbz2qVD/o02wNltNLW02kR4WUSYdjuMMjtdh/gaT2JCDP2O73hu32qeJLKfbccrTj2B/Jmf0r13SxsbmahXPhoW5YZlMNJ2y9sh2ZrcaxwEWahA0N/LaYgNC9RBv4VYgA=", + ), + MapTraceEvent( + start=3800, + total=4739, + data="XQAABADoAwAAAAV//HTdUuzE6litCrf8schzCGNAJYJycY7ZEcJhmgr2Ialj1Rm5ImKIrNjZfS/hon4H3nAaV4MFR0vB94iE8/pg6+1P+WnBl5ffU6feNCD9ZsnN8hoitYYXhXOGgoUpXwdmgL60wkoZ7WSTgUnvEQB0UcVl5dMynOcFYkwj4WhPYlYU3c3Oe/rFo2L5AOfYDv8bHMVjSBYKHoOpNL7b+DOJwrS/G5P5WIgj03+BNbH12v2CoDt8IKtTwedmkTyUu2X5/lZGw1MhXunoIHbYPHT0GZFF1r0NE90KuJf4PUOpjECoZ4IjbwyPvC3RcmWkvpxsNCmMjj5Pj/3y1/jRN1cZX6sUlvDJwxy6GkAgnM5sHZx8yid2ArVq7wLogpQw7iwtSLvI6emzt84/00RcME1RQjfiAdNRA1McUUnJugEmQgPcJgDkCquEtJ6sPQpmQwkXbt1FzTniCSXgNBCAxVO7KZ7YVZ/mT3DA/7G3PcJDT04QBA0frOfmvvrcwHKj1PLaeZ06a3tbUl2Kf/6W3D+nMPok7hdChCRh5zLiLF87sGJEHGtk0x0y9sDPlabeBFLXhKy/+dnjYqISUU3r/whMQeOEK36eUSXAkZkZ3GJ5OzGglyTSsEiiCmWDIzX/wULcDf45SVpB+KIoS9Sad9Et9TVjTW2Ou9dWyk2rrjbvlRQUyHnJGEfIHsjWshWhS59ycXhbsbm218UvQpS2TaJLQTYF8U84/N2pIFbt", + ), + MapTraceEvent( + start=4000, + total=4739, + data="XQAABADoAwAAACIAEgJhQTEi1WOLx+qywvu0oPpS3shx2ap98o9qfiwObRjMPrNJ59PySJGQlopSxkwpPoluSlSNPJW1r9YlNDBFu0Fy4eTdUWnRD047yzXfRlUYjKWkHbU95bwD9p6HkBNSx91CeJG47qIEfx6FTP3sjH5NFhZNyh2UJePDB+zn9u7M3yAdMRsvvwuw3eUDeeraA1a+10xI2ZamwQnOrAP2MzEwmqBRGaX55e8kKyUpGBk0kW0PDr2Cu9bHwM82d2NQaHUqTdm8fpspXVq0XO/ZB8XHqKfGxmhKsqJS0a8A0mQeVMqQ+brOiomUKgsQFgNQeh6zt5gPuz9Ql1HlqiM+1T4I1mJ/+BIGgbObbxH4CInNtn4jwb1lVoBIsAi4Qns5nEIYF5dikSazwsIVSEV6mdTBlftaMIccjjiDRoSoj/usRItG1qzolWdHArHXWI9yVZiDVAUE7HZ5pWUI81ZgTtmvVBVLv1vcJu1kNNlmE6t/cUShgeUK4wNvqALoO5qUIaEf5a2uiwGX6/nW5Z2Yvs51J6x5nRRsHgZG5Sv1kgW+D6Tq3nX2FQUDTxPeZL7KpJywaJau1C6qR873eMnzwA9zgu3xt0eXHPhAtxP5gIdO8zYdZJwwvDnjpmz4dE6hgoZIDTJ0nbJNFh55mPc5jDtCcRvUqB5SVnsxo4DpzMG2zHK4UH2EU0DjCJqUeEbJXwjXtJJldEUGWCqH4ZTxUa89DPczgi2vbZi9IdMFgpLgK+66wD2x1CC/1afTUMEl8L0=", + ), + MapTraceEvent( + start=4200, + total=4739, + data="XQAABADoAwAAAC3//g9vLf0BAiLh0C1Un665COfziot1ZmldOUbLEljsuAg6O6vlHZ1ckG5vfCgExDK21UGT8IlMb78qRC+eVfn4Eue+0rkXOfu+zomiDeeJnvJS51MhOfKEgra/JIE/lyalimYZ1ZfGCKOc9DSjuxEi/KwetYZaFPxkVmDenAn2egEwBBK4x2Buz7kH/9CgS/dn2ZHfROMiuJHYEyUXGcDW+t9OSA1GjzAukPN9cz/IxxhGqIWeu4PPTaKUNmXL3USlNjuBtmU4Tv7FaiwH+7leFIofxML3txH0kiOCl1PGyM4HD5lS5AQANquI4aXNSpylDRbAfPC/yteOkMjMCE/xvcC5vdVxHspvat//rfO2QoxkzK+0WRZSxeu93o/IXJuXPz1RhkQz4dseKcdwm1sKSVFtM6H9GN0lepWZMTTTp5oosPLvjYXGP7ZYX3tnr5xwOXIdgvxw/pDeF89UCRoXSH4dlUNEhGf5a3mklbAhtO1ZfSf6bPY/1ue9k9+h5RemKEFmsmaY4lsOEj2DbrfPvPbCrmRfsMu6YUp5JR9eQbvaBVJfl69mn873/HyoQRBTwo+fL+bW7Bee0xKlPRbBBxCxlkI1h7Ok8PcM2w0bSbtNys4txzPkvQUK1dyeUDTqeNdGiHnEkbm+jHsVkuTCIyj3/8LQbKbou8QMoVle/7ZyxlSx/OtWZNn7zWrBVr7nHc+uollNrCuUfyt899qgjbSHO83thNfiQs7nR9GphhQHiLsYg7E0cS45z+LIsqeWDTDOfuSgnhK49CTOLhNSXgA=", + ), + MapTraceEvent( + start=4400, + total=4739, + data="XQAABADoAwAAAFAAWZBszgDAX7GMUAs9P2fe2hlqEA7N3dsyPePDguFw2duGJrKri1JcbAVjkJiw99K6tZTFJIqxwMdXXQbf+fujYBZAI7EmTavJI+gLoU/NF/4JS7kHtK2xgC9N+5zU+uBqzafLvY/olqkSckXS5IpKNqQPTX2PeTn+khpBpG8gQ0b9I2X1UDbTcg5xdGJJLbBPtOpjHjlEdgFcswLFE2OGs5Dt2qgEvf+51Kl3ufNniT8E/wt0oRB+HWPr1iJXd9YO3jGxBj3vA0PsZn5lmI4PDxjOlaWl5/H8swLzS8mJ4hft6EOzDYV8+fotP7Nj9BW/CIZ5yH1WFWiAkjfNv7cKHTI5yH6xtzjzwD2axNhaU65PTrxOv3OmIzJ66Ro7fD3wcDsVWtaLVgmPqLW0Yu3XhaQDwmpeJ7VcgYf5KbQeMiCVzHDL3ZswfhJmDp7CkgxgT9shdtHYHBa4/hkaBvXc4gKhr48p8WAWVRyhIk6B+uC8j5+iaK0BuvI7HBBf8B6mfK82u4g2k8hlp9aF/nqAWjqzkKn8Crigw4zVwAfVtAN0iJuWIp1ox0Sg+OI8NGAQUubetPj7l7djXHfvTQkTPwqaEKysDnWyr5qSnYsfO4IP3Xbr0rHc/69nrlqHoXCxe+iwsgjObA7sV8wAHTNf1mV//msCYuHNL6EGghdXeXqlNqf5/pERjI+Kf0kXirW9ZfaM8hnwsu3DPkbaTdJ6FF5cww==", + ), + MapTraceEvent( + start=4600, + total=4739, + data="XQAABAC3AgAAAEAARrdhQjJgt6Qn+EaHUnhtBqcbRDJt7MLo1Z37lF/8QWg0KUCq9lx6rbNOO8aMysAimBy1sUGefkUEhZu/XcDUcvqb2P2ohSjvV6akkGdG2Jg6Q+WfObCqNwgi55dn7PeR3OIzq9Q9IvgTbGE3wcAOK51vI5rqrw0JRqkeMIt56lmDCGRWaiiw3ydmwYUT0NSMJixjd1F12AZyDnhXLqVu+oHguEtwWen2bSgDpQowWZ/79jZOKiBjPVfRNp/Jda8xZvOPd0f5s64BdTXbhTBArcQ/gMg0gcZSD5RnDSNL0jGt74LZtOy6oL/Q0b+hJd6g8gC7G8LWhgY5RucJoq2MZXhoxgdatdAJDUWhyWvxc+n7E2fpfXCCBPlEOl2PRR4f2NktXTBFdizFjeUHefZABceGJo0rRYlq4HlesvczC5kbciiIFhvtZFzHJebBWeH1Xd2RFqlxjP2qlWDvqoSrEKctwk6G0tumLf+pE+Iebzf8koLKmsvwRdBcOrEqfkEek61DFPTtyRH/GihnJfyw6xJNyC0ac8eKJWy+JYRrqGcm1i3c", + ), ] From 94ecd7281da53c3ec3caf1ba3a4ea17ed5588603 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 10:48:39 +0100 Subject: [PATCH 138/138] [pre-commit.ci] pre-commit autoupdate (#771) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8598914f..e9d8d653 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ default_language_version: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.1 + rev: v0.9.2 hooks: - id: ruff args: