pax_global_header00006660000000000000000000000064147016576740014533gustar00rootroot0000000000000052 comment=13ba2ae2815d06055ce1015d4ec3bf7963d6265d python-ipp-0.17.0/000077500000000000000000000000001470165767400137275ustar00rootroot00000000000000python-ipp-0.17.0/.devcontainer/000077500000000000000000000000001470165767400164665ustar00rootroot00000000000000python-ipp-0.17.0/.devcontainer/devcontainer.json000066400000000000000000000042771470165767400220540ustar00rootroot00000000000000{ "containerEnv": { "POETRY_VIRTUALENVS_IN_PROJECT": "true" }, "customizations": { "codespaces": { "openFiles": ["README.md", "src/pyipp/ipp.py", "src/pyipp/models.py"] }, "vscode": { "extensions": [ "ms-python.python", "redhat.vscode-yaml", "esbenp.prettier-vscode", "GitHub.vscode-pull-request-github", "charliermarsh.ruff", "GitHub.vscode-github-actions", "ryanluker.vscode-coverage-gutters" ], "settings": { "[python]": { "editor.codeActionsOnSave": { "source.fixAll": true, "source.organizeImports": true } }, "coverage-gutters.customizable.context-menu": true, "coverage-gutters.customizable.status-bar-toggler-watchCoverageAndVisibleEditors-enabled": true, "coverage-gutters.showGutterCoverage": false, "coverage-gutters.showLineCoverage": true, "coverage-gutters.xmlname": "coverage.xml", "python.analysis.extraPaths": ["${workspaceFolder}/src"], "python.defaultInterpreterPath": ".venv/bin/python", "python.formatting.provider": "black", "python.linting.enabled": true, "python.linting.mypyEnabled": true, "python.linting.pylintEnabled": true, "python.testing.cwd": "${workspaceFolder}", "python.testing.pytestArgs": ["--cov-report=xml"], "python.testing.pytestEnabled": true, "ruff.importStrategy": "fromEnvironment", "ruff.interpreter": [".venv/bin/python"], "terminal.integrated.defaultProfile.linux": "zsh" } } }, "features": { "ghcr.io/devcontainers-contrib/features/poetry:2": {}, "ghcr.io/devcontainers/features/github-cli:1": {}, "ghcr.io/devcontainers/features/node:1": {}, "ghcr.io/devcontainers/features/python:1": { "installTools": false } }, "image": "mcr.microsoft.com/devcontainers/base:ubuntu", "name": "Async Python client for IPP", "updateContentCommand": ". ${NVM_DIR}/nvm.sh && nvm install && nvm use && npm install && poetry install", "postStartCommand": "git config --global --add safe.directory ${containerWorkspaceFolder} && poetry run pre-commit install" } python-ipp-0.17.0/.editorconfig000066400000000000000000000004741470165767400164110ustar00rootroot00000000000000root = true [*] charset = utf-8 end_of_line = lf indent_style = space insert_final_newline = true trim_trailing_whitespace = true indent_size = 4 [*.md] indent_size = 2 trim_trailing_whitespace = false [*.json] indent_size = 2 [{.gitignore,.gitkeep,.editorconfig}] indent_size = 2 [Makefile] indent_style = tab python-ipp-0.17.0/.github/000077500000000000000000000000001470165767400152675ustar00rootroot00000000000000python-ipp-0.17.0/.github/labels.yml000066400000000000000000000050711470165767400172570ustar00rootroot00000000000000--- - name: "breaking-change" color: ee0701 description: "A breaking change for existing users." - name: "bugfix" color: ee0701 description: "Inconsistencies or issues which will cause a problem for users or implementers." - name: "documentation" color: 0052cc description: "Solely about the documentation of the project." - name: "enhancement" color: 1d76db description: "Enhancement of the code, not introducing new features." - name: "refactor" color: 1d76db description: "Improvement of existing code, not introducing new features." - name: "performance" color: 1d76db description: "Improving performance, not introducing new features." - name: "new-feature" color: 0e8a16 description: "New features or options." - name: "maintenance" color: 2af79e description: "Generic maintenance tasks." - name: "ci" color: 1d76db description: "Work that improves the continue integration." - name: "dependencies" color: 1d76db description: "Upgrade or downgrade of project dependencies." - name: "in-progress" color: fbca04 description: "Issue is currently being resolved by a developer." - name: "stale" color: fef2c0 description: "There has not been activity on this issue or PR for quite some time." - name: "no-stale" color: fef2c0 description: "This issue or PR is exempted from the stable bot." - name: "security" color: ee0701 description: "Marks a security issue that needs to be resolved asap." - name: "incomplete" color: fef2c0 description: "Marks a PR or issue that is missing information." - name: "invalid" color: fef2c0 description: "Marks a PR or issue that is missing information." - name: "beginner-friendly" color: 0e8a16 description: "Good first issue for people wanting to contribute to the project." - name: "help-wanted" color: 0e8a16 description: "We need some extra helping hands or expertise in order to resolve this." - name: "priority-critical" color: ee0701 description: "This should be dealt with ASAP. Not fixing this issue would be a serious error." - name: "priority-high" color: b60205 description: "After critical issues are fixed, these should be dealt with before any further issues." - name: "priority-medium" color: 0e8a16 description: "This issue may be useful, and needs some attention." - name: "priority-low" color: e4ea8a description: "Nice addition, maybe... someday..." - name: "major" color: b60205 description: "This PR causes a major version bump in the version number." - name: "minor" color: 0e8a16 description: "This PR causes a minor version bump in the version number." python-ipp-0.17.0/.github/release-drafter.yml000066400000000000000000000020011470165767400210500ustar00rootroot00000000000000--- name-template: "$RESOLVED_VERSION" tag-template: "$RESOLVED_VERSION" change-template: "- $TITLE @$AUTHOR (#$NUMBER)" sort-direction: ascending categories: - title: "Breaking changes" labels: - "breaking-change" - title: "New features" labels: - "new-feature" - title: "Bug fixes" labels: - "bugfix" - title: "Enhancements" labels: - "enhancement" - "refactor" - "performance" - title: "Maintenance" labels: - "maintenance" - "ci" - title: "Documentation" labels: - "documentation" - title: "Dependency updates" labels: - "dependencies" version-resolver: major: labels: - "major" - "breaking-change" minor: labels: - "minor" - "new-feature" patch: labels: - "bugfix" - "chore" - "ci" - "dependencies" - "documentation" - "enhancement" - "performance" - "refactor" default: patch template: | ## What’s changed $CHANGES python-ipp-0.17.0/.github/workflows/000077500000000000000000000000001470165767400173245ustar00rootroot00000000000000python-ipp-0.17.0/.github/workflows/labels.yaml000066400000000000000000000007071470165767400214560ustar00rootroot00000000000000--- name: Sync labels # yamllint disable-line rule:truthy on: push: branches: - main paths: - .github/labels.yml workflow_dispatch: jobs: labels: name: Sync labels runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4 - name: Run Label Syncer uses: micnncim/action-label-syncer@v1.3.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} python-ipp-0.17.0/.github/workflows/linting.yaml000066400000000000000000000154231470165767400216610ustar00rootroot00000000000000--- name: Linting # yamllint disable-line rule:truthy on: push: branches: - master pull_request: workflow_dispatch: env: DEFAULT_PYTHON: "3.11" jobs: codespell: name: codespell runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install Python dependencies run: poetry install --no-interaction - name: Check code for common misspellings run: poetry run pre-commit run codespell --all-files ruff: name: Ruff runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install Python dependencies run: poetry install --no-interaction - name: Run Ruff run: poetry run ruff check . black: name: black runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install Python dependencies run: poetry install --no-interaction - name: Run black on docs run: poetry run blacken-docs pre-commit-hooks: name: pre-commit-hooks runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install Python dependencies run: poetry install --no-interaction - name: Check Python AST run: poetry run pre-commit run check-ast --all-files - name: Check for case conflicts run: poetry run pre-commit run check-case-conflict --all-files - name: Check docstring is first run: poetry run pre-commit run check-docstring-first --all-files - name: Check that executables have shebangs run: poetry run pre-commit run check-executables-have-shebangs --all-files - name: Check JSON files run: poetry run pre-commit run check-json --all-files - name: Check for merge conflicts run: poetry run pre-commit run check-merge-conflict --all-files - name: Check for broken symlinks run: poetry run pre-commit run check-symlinks --all-files - name: Check TOML files run: poetry run pre-commit run check-toml --all-files - name: Check XML files run: poetry run pre-commit run check-xml --all-files - name: Check YAML files run: poetry run pre-commit run check-yaml --all-files - name: Check YAML files run: poetry run pre-commit run check-yaml --all-files - name: Detect Private Keys run: poetry run pre-commit run detect-private-key --all-files - name: Check End of Files run: poetry run pre-commit run end-of-file-fixer --all-files - name: Trim Trailing Whitespace run: poetry run pre-commit run trailing-whitespace --all-files pylint: name: pylint runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install Python dependencies run: poetry install --no-interaction - name: Run pylint run: poetry run pre-commit run pylint --all-files yamllint: name: yamllint runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install Python dependencies run: poetry install --no-interaction - name: Run yamllint run: poetry run yamllint . prettier: name: Prettier runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install Python dependencies run: poetry install --no-interaction - name: Set up Node.js uses: actions/setup-node@v4 with: node-version-file: ".nvmrc" cache: "npm" - name: Install NPM dependencies run: npm install - name: Run prettier run: poetry run pre-commit run prettier --all-files python-ipp-0.17.0/.github/workflows/pr-labels.yaml000066400000000000000000000012741470165767400220750ustar00rootroot00000000000000--- name: PR Labels # yamllint disable-line rule:truthy on: pull_request_target: types: [opened, labeled, unlabeled, synchronize] jobs: pr_labels: name: Verify runs-on: ubuntu-latest steps: - name: Verify PR has a valid label uses: jesusvasquez333/verify-pr-label-action@657d111bbbe13e22bbd55870f1813c699bde1401 # v1.4.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" pull-request-number: "${{ github.event.pull_request.number }}" valid-labels: >- breaking-change, bugfix, documentation, enhancement, refactor, performance, new-feature, maintenance, ci, dependencies disable-reviews: true python-ipp-0.17.0/.github/workflows/release-drafter.yml000066400000000000000000000005621470165767400231170ustar00rootroot00000000000000--- name: Release Drafter # yamllint disable-line rule:truthy on: push: branches: - master workflow_dispatch: jobs: update_release_draft: name: Draft release runs-on: ubuntu-latest steps: - name: Run Release Drafter uses: release-drafter/release-drafter@v6.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} python-ipp-0.17.0/.github/workflows/release.yml000066400000000000000000000025131470165767400214700ustar00rootroot00000000000000--- name: Release # yamllint disable-line rule:truthy on: release: types: - published env: DEFAULT_PYTHON: "3.10" jobs: release: name: Releasing to PyPi runs-on: ubuntu-latest environment: name: release url: https://pypi.org/p/pyipp permissions: id-token: write steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install dependencies run: poetry install --no-interaction - name: Set package version run: | version="${{ github.event.release.tag_name }}" version="${version,,}" version="${version#v}" poetry version --no-interaction "${version}" - name: Build package run: poetry build --no-interaction - name: Publish to PyPi uses: pypa/gh-action-pypi-publish@v1.10.3 with: verbose: true print-hash: true python-ipp-0.17.0/.github/workflows/tests.yaml000066400000000000000000000042461470165767400213600ustar00rootroot00000000000000--- name: Testing # yamllint disable-line rule:truthy on: push: branches: - master pull_request: workflow_dispatch: env: DEFAULT_PYTHON: "3.10" jobs: pytest: name: Python ${{ matrix.python }} runs-on: ubuntu-latest strategy: matrix: python: ["3.9", "3.10", "3.11"] steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ matrix.python }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ matrix.python }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install dependencies run: poetry install --no-interaction - name: Run pytest run: poetry run pytest --cov pyipp tests - name: Upload coverage artifact uses: actions/upload-artifact@v4.3.3 with: name: coverage-${{ matrix.python }} path: .coverage coverage: runs-on: ubuntu-latest needs: pytest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 with: fetch-depth: 0 - name: Download coverage data uses: actions/download-artifact@v4.1.7 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install dependencies run: poetry install --no-interaction - name: Process coverage results run: | poetry run coverage combine coverage*/.coverage* poetry run coverage xml -i - name: Upload coverage report uses: codecov/codecov-action@v4.6.0 with: token: ${{ secrets.CODECOV_TOKEN }} python-ipp-0.17.0/.github/workflows/typing.yaml000066400000000000000000000015701470165767400215250ustar00rootroot00000000000000--- name: Typing # yamllint disable-line rule:truthy on: push: branches: - master pull_request: workflow_dispatch: env: DEFAULT_PYTHON: "3.10" jobs: mypy: name: mypy runs-on: ubuntu-latest steps: - name: Check out code from GitHub uses: actions/checkout@v4.2.1 - name: Set up Poetry run: pipx install poetry - name: Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: Install dependencies run: poetry install --no-interaction - name: Run mypy run: poetry run mypy examples src tests python-ipp-0.17.0/.gitignore000066400000000000000000000026251470165767400157240ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # OSX useful to ignore *.DS_Store .AppleDouble .LSOverride # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # pyenv .python-version # virtualenv .venv venv/ ENV/ # mypy .mypy_cache/ # Visual Studio Code .vscode # IntelliJ Idea family of suites .idea *.iml ## File-based project format: *.ipr *.iws ## mpeltonen/sbt-idea plugin .idea_modules/ # PyBuilder target/ # Cookiecutter output/ python_boilerplate/ # Node node_modules/ python-ipp-0.17.0/.nvmrc000066400000000000000000000000101470165767400150440ustar00rootroot0000000000000020.14.0 python-ipp-0.17.0/.pre-commit-config.yaml000066400000000000000000000101111470165767400202020ustar00rootroot00000000000000--- repos: - repo: local hooks: - id: ruff name: Ruff language: system types: [python] entry: poetry run ruff check --fix require_serial: true stages: [commit, push, manual] - id: black name: Format using black language: system types: [python] entry: poetry run black require_serial: true - id: blacken-docs name: Format documentation examples using black language: system files: '\.(rst|md|markdown|py|tex)$' entry: poetry run blacken-docs require_serial: true - id: check-ast name: Check Python AST language: system types: [python] entry: poetry run check-ast - id: check-case-conflict name: Check for case conflicts language: system entry: poetry run check-case-conflict - id: check-docstring-first name: Check docstring is first language: system types: [python] entry: poetry run check-docstring-first - id: check-executables-have-shebangs name: Check that executables have shebangs language: system types: [text, executable] entry: poetry run check-executables-have-shebangs stages: [commit, push, manual] - id: check-json name: Check JSON files language: system types: [json] entry: poetry run check-json - id: check-merge-conflict name: Check for merge conflicts language: system types: [text] entry: poetry run check-merge-conflict - id: check-symlinks name: Check for broken symlinks language: system types: [symlink] entry: poetry run check-symlinks - id: check-toml name: Check TOML files language: system types: [toml] entry: poetry run check-toml - id: check-xml name: Check XML files entry: check-xml language: system types: [xml] - id: check-yaml name: Check YAML files language: system types: [yaml] entry: poetry run check-yaml - id: codespell name: Check code for common misspellings language: system types: [text] exclude: ^poetry\.lock$ entry: poetry run codespell - id: detect-private-key name: Detect Private Keys language: system types: [text] entry: poetry run detect-private-key - id: end-of-file-fixer name: Fix End of Files language: system types: [text] entry: poetry run end-of-file-fixer stages: [commit, push, manual] - id: mypy name: Static type checking using mypy language: system types: [python] entry: poetry run mypy require_serial: true - id: no-commit-to-branch name: Don't commit to main branch language: system entry: poetry run no-commit-to-branch pass_filenames: false always_run: true args: - --branch=master - id: poetry name: Check pyproject with Poetry language: system entry: poetry check pass_filenames: false always_run: true - id: prettier name: Ensuring files are prettier language: system types: [yaml, json, markdown] entry: npm run prettier pass_filenames: false - id: pylint name: Starring code with pylint language: system types: [python] entry: poetry run pylint - id: pytest name: Running tests and test coverage with pytest language: system types: [python] entry: poetry run pytest pass_filenames: false - id: trailing-whitespace name: Trim Trailing Whitespace language: system types: [text] entry: poetry run trailing-whitespace-fixer stages: [commit, push, manual] - id: yamllint name: Check YAML files with yamllint language: system types: [yaml] entry: poetry run yamllint python-ipp-0.17.0/.yamllint000066400000000000000000000024001470165767400155550ustar00rootroot00000000000000--- ignore: - .venv rules: braces: level: error min-spaces-inside: 0 max-spaces-inside: 1 min-spaces-inside-empty: -1 max-spaces-inside-empty: -1 brackets: level: error min-spaces-inside: 0 max-spaces-inside: 0 min-spaces-inside-empty: -1 max-spaces-inside-empty: -1 colons: level: error max-spaces-before: 0 max-spaces-after: 1 commas: level: error max-spaces-before: 0 min-spaces-after: 1 max-spaces-after: 1 comments: level: error require-starting-space: true min-spaces-from-content: 1 comments-indentation: level: error document-end: level: error present: false document-start: level: error present: true empty-lines: level: error max: 1 max-start: 0 max-end: 1 hyphens: level: error max-spaces-after: 1 indentation: level: error spaces: 2 indent-sequences: true check-multi-line-strings: false key-duplicates: level: error line-length: level: warning max: 120 allow-non-breakable-words: true allow-non-breakable-inline-mappings: true new-line-at-end-of-file: level: error new-lines: level: error type: unix trailing-spaces: level: error truthy: level: error python-ipp-0.17.0/LICENSE000066400000000000000000000020611470165767400147330ustar00rootroot00000000000000MIT License Copyright (c) 2020 Chris Talkington Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. python-ipp-0.17.0/README.md000066400000000000000000000026431470165767400152130ustar00rootroot00000000000000# Python: Internet Printing Protocol (IPP) Client Asynchronous Python client for Internet Printing Protocol (IPP). ## About This package allows you to monitor printers that support the Internet Printing Protocol (IPP) programmatically. ## Installation ```bash pip install pyipp ``` ## Usage ```python import asyncio from pyipp import IPP, Printer async def main(): """Show example of connecting to your IPP print server.""" async with IPP("ipps://EPSON123456.local:631/ipp/print") as ipp: printer: Printer = await ipp.printer() print(printer) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ## Setting up development environment This Python project is fully managed using the [Poetry](https://python-poetry.org) dependency manager. But also relies on the use of NodeJS for certain checks during development. You need at least: - Python 3.9+ - [Poetry](https://python-poetry.org/docs/#installation) - NodeJS 20+ (including NPM) To install all packages, including all development requirements: ```bash npm install poetry install ``` As this repository uses the [pre-commit](https://pre-commit.com/) framework, all changes are linted and tested with each commit. You can run all checks and tests manually, using the following command: ```bash poetry run pre-commit run --all-files ``` To run just the Python tests: ```bash poetry run pytest ``` python-ipp-0.17.0/examples/000077500000000000000000000000001470165767400155455ustar00rootroot00000000000000python-ipp-0.17.0/examples/debug.py000066400000000000000000000034531470165767400172120ustar00rootroot00000000000000# pylint: disable=W0621 """Asynchronous Python client for IPP.""" import asyncio from pyipp import IPP from pyipp.enums import IppOperation async def main() -> None: """Show example of connecting to your IPP print server.""" async with IPP("ipps://192.168.1.92:631/ipp/print") as ipp: response = await ipp.raw( IppOperation.GET_PRINTER_ATTRIBUTES, { "version": (2, 0), # try (1, 1) for older devices "operation-attributes-tag": { "requested-attributes": [ "printer-device-id", "printer-name", "printer-type", "printer-location", "printer-info", "printer-make-and-model", "printer-state", "printer-state-message", "printer-state-reason", "printer-supply", "printer-up-time", "printer-uri-supported", "device-uri", "printer-is-shared", "printer-more-info", "printer-firmware-string-version", "marker-colors", "marker-high-levels", "marker-levels", "marker-low-levels", "marker-names", "marker-types", ], }, }, ) with open("printer-attributes.bin", "wb") as file: # noqa: PTH123, ASYNC230 file.write(response) file.close() if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main()) python-ipp-0.17.0/examples/execute.py000066400000000000000000000033061470165767400175630ustar00rootroot00000000000000# pylint: disable=W0621 """Asynchronous Python client for IPP.""" import asyncio from pyipp import IPP from pyipp.enums import IppOperation async def main() -> None: """Show example of executing operation against your IPP print server.""" async with IPP("ipps://192.168.1.92:631/ipp/print") as ipp: response = await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "version": (2, 0), # try (1, 1) for older devices "operation-attributes-tag": { "requested-attributes": [ "printer-device-id", "printer-name", "printer-type", "printer-location", "printer-info", "printer-make-and-model", "printer-state", "printer-state-message", "printer-state-reason", "printer-supply", "printer-up-time", "printer-uri-supported", "device-uri", "printer-is-shared", "printer-more-info", "printer-firmware-string-version", "marker-colors", "marker-high-levels", "marker-levels", "marker-low-levels", "marker-names", "marker-types", ], }, }, ) print(response) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main()) python-ipp-0.17.0/examples/print_example.py000066400000000000000000000016111470165767400207650ustar00rootroot00000000000000# pylint: disable=W0621 """Asynchronous Python client for IPP.""" import asyncio from pyipp import IPP from pyipp.enums import IppOperation async def main() -> None: """Show example of printing via IPP print server.""" pdf_file = "/path/to/pdf.pfd" with open(pdf_file, "rb") as f: # noqa: PTH123, ASYNC230 content = f.read() async with IPP("ipp://192.168.1.92:631/ipp/print") as ipp: response = await ipp.execute( IppOperation.PRINT_JOB, { "operation-attributes-tag": { "requesting-user-name": "Me", "job-name": "My Test Job", "document-format": "application/pdf", }, "data": content, }, ) print(response) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main()) python-ipp-0.17.0/examples/printer.py000066400000000000000000000011351470165767400176020ustar00rootroot00000000000000# pylint: disable=W0621 """Asynchronous Python client for IPP.""" import asyncio from pyipp import IPP async def main() -> None: """Show example of connecting to your IPP print server.""" async with IPP("ipps://EPSON761251.local:631/ipp/print") as ipp: # Get Printer Info printer = await ipp.printer() print(printer) async with IPP("ipp://hp6830.local:631/ipp/print") as ipp: # Get Printer Info printer = await ipp.printer() print(printer) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main()) python-ipp-0.17.0/examples/ruff.toml000066400000000000000000000002571470165767400174100ustar00rootroot00000000000000# This extend our general Ruff rules specifically for the examples extend = "../pyproject.toml" lint.extend-ignore = [ "T201", # Allow the use of print() in examples ] python-ipp-0.17.0/package-lock.json000066400000000000000000000014131470165767400171420ustar00rootroot00000000000000{ "name": "python-ipp", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "python-ipp", "version": "0.0.0", "license": "MIT", "devDependencies": { "prettier": "3.3.3" } }, "node_modules/prettier": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } } } } python-ipp-0.17.0/package.json000066400000000000000000000006051470165767400162160ustar00rootroot00000000000000{ "name": "python-ipp", "version": "0.0.0", "private": true, "description": "Asynchronous Python client for Internet Printing Protocol (IPP)", "scripts": { "prettier": "prettier --write **/*.{json,js,md,yml,yaml} *.{json,js,md,yml,yaml}" }, "author": "Chris Talkington ", "license": "MIT", "devDependencies": { "prettier": "3.3.3" } } python-ipp-0.17.0/poetry.lock000066400000000000000000006056251470165767400161410ustar00rootroot00000000000000# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" version = "3.10.9" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2"}, {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef"}, {file = "aiohttp-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746"}, {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373"}, {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067"}, {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32"}, {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581"}, {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12"}, {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257"}, {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b"}, {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2"}, {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442"}, {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a"}, {file = "aiohttp-3.10.9-cp310-cp310-win32.whl", hash = "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2"}, {file = "aiohttp-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593"}, {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"}, {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"}, {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"}, {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"}, {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"}, {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"}, {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"}, {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"}, {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"}, {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"}, {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"}, {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"}, {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"}, {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"}, {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"}, {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0"}, {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1"}, {file = "aiohttp-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf"}, {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5"}, {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431"}, {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0"}, {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9"}, {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd"}, {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e"}, {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465"}, {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900"}, {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7"}, {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044"}, {file = "aiohttp-3.10.9-cp312-cp312-win32.whl", hash = "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21"}, {file = "aiohttp-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a"}, {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d"}, {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56"}, {file = "aiohttp-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5"}, {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c"}, {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5"}, {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e"}, {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69"}, {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036"}, {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16"}, {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677"}, {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582"}, {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7"}, {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f"}, {file = "aiohttp-3.10.9-cp313-cp313-win32.whl", hash = "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16"}, {file = "aiohttp-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd"}, {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8"}, {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5"}, {file = "aiohttp-3.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f"}, {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1"}, {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729"}, {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517"}, {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7"}, {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88"}, {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6"}, {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066"}, {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d"}, {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04"}, {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d"}, {file = "aiohttp-3.10.9-cp38-cp38-win32.whl", hash = "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25"}, {file = "aiohttp-3.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea"}, {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71"}, {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156"}, {file = "aiohttp-3.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c"}, {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1"}, {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948"}, {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb"}, {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6"}, {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e"}, {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab"}, {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a"}, {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8"}, {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab"}, {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322"}, {file = "aiohttp-3.10.9-cp39-cp39-win32.whl", hash = "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b"}, {file = "aiohttp-3.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa"}, {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"}, ] [package.dependencies] aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.7" files = [ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, ] [package.dependencies] frozenlist = ">=1.1.0" [[package]] name = "annotated-types" version = "0.6.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, ] [[package]] name = "aresponses" version = "3.0.0" description = "Asyncio response mocking. Similar to the responses library used for 'requests'" optional = false python-versions = ">=3.7" files = [ {file = "aresponses-3.0.0-py3-none-any.whl", hash = "sha256:8093ab4758eb4aba91c765a50295b269ecfc0a9e7c7158954760bc0c23503970"}, {file = "aresponses-3.0.0.tar.gz", hash = "sha256:8731d0609fe4c954e21f17753dc868dca9e2e002b020a33dc9212004599b11e7"}, ] [package.dependencies] aiohttp = [ {version = ">=3.7.0", markers = "python_version >= \"3.10\" and python_version < \"3.12\""}, {version = ">=3.6.0", markers = "python_version >= \"3.8\" and python_version < \"3.10\""}, {version = ">=3.7.0,<3.8.dev0 || >=3.9.dev0", markers = "python_version >= \"3.12\""}, ] pytest-asyncio = {version = ">=0.17.0", markers = "python_version >= \"3.7\""} [[package]] name = "astroid" version = "3.3.5" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.9.0" files = [ {file = "astroid-3.3.5-py3-none-any.whl", hash = "sha256:a9d1c946ada25098d790e079ba2a1b112157278f3fb7e718ae6a9252f5835dc8"}, {file = "astroid-3.3.5.tar.gz", hash = "sha256:5cfc40ae9f68311075d27ef68a4841bdc5cc7f6cf86671b49f00607d30188e2d"}, ] [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.7" files = [ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "attrs" version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "authlib" version = "1.3.0" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." optional = false python-versions = ">=3.8" files = [ {file = "Authlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:9637e4de1fb498310a56900b3e2043a206b03cb11c05422014b0302cbc814be3"}, {file = "Authlib-1.3.0.tar.gz", hash = "sha256:959ea62a5b7b5123c5059758296122b57cd2585ae2ed1c0622c21b371ffdae06"}, ] [package.dependencies] cryptography = "*" [[package]] name = "awesomeversion" version = "24.2.0" description = "One version package to rule them all, One version package to find them, One version package to bring them all, and in the darkness bind them." optional = false python-versions = ">=3.8,<4.0" files = [ {file = "awesomeversion-24.2.0-py3-none-any.whl", hash = "sha256:ba365d1ad4e42aa5afdbc46b639f349e52db2d859d7c46a34744ca15ebf1430a"}, {file = "awesomeversion-24.2.0.tar.gz", hash = "sha256:47a6dcbbe2921b725f75106a66ab30f26f1f33dbc5e07bc8e1e39d8eb921f53c"}, ] [[package]] name = "backoff" version = "2.2.1" description = "Function decoration for backoff and retry" optional = false python-versions = ">=3.7,<4.0" files = [ {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, ] [[package]] name = "black" version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "blacken-docs" version = "1.16.0" description = "Run Black on Python code blocks in documentation files." optional = false python-versions = ">=3.8" files = [ {file = "blacken_docs-1.16.0-py3-none-any.whl", hash = "sha256:b0dcb84b28ebfb352a2539202d396f50e15a54211e204a8005798f1d1edb7df8"}, {file = "blacken_docs-1.16.0.tar.gz", hash = "sha256:b4bdc3f3d73898dfbf0166f292c6ccfe343e65fc22ddef5319c95d1a8dcc6c1c"}, ] [package.dependencies] black = ">=22.1.0" [[package]] name = "certifi" version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] pycparser = "*" [[package]] name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "codespell" version = "2.3.0" description = "Codespell" optional = false python-versions = ">=3.8" files = [ {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, ] [package.extras] dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] hard-encoding-detection = ["chardet"] toml = ["tomli"] types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] name = "covdefaults" version = "2.3.0" description = "A coverage plugin to provide sensible default settings" optional = false python-versions = ">=3.7" files = [ {file = "covdefaults-2.3.0-py2.py3-none-any.whl", hash = "sha256:2832961f6ffcfe4b57c338bc3418a3526f495c26fb9c54565409c5532f7c41be"}, {file = "covdefaults-2.3.0.tar.gz", hash = "sha256:4e99f679f12d792bc62e5510fa3eb59546ed47bd569e36e4fddc4081c9c3ebf7"}, ] [package.dependencies] coverage = ">=6.0.2" [[package]] name = "coverage" version = "7.6.2" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ {file = "coverage-7.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9df1950fb92d49970cce38100d7e7293c84ed3606eaa16ea0b6bc27175bb667"}, {file = "coverage-7.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:24500f4b0e03aab60ce575c85365beab64b44d4db837021e08339f61d1fbfe52"}, {file = "coverage-7.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a663b180b6669c400b4630a24cc776f23a992d38ce7ae72ede2a397ce6b0f170"}, {file = "coverage-7.6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfde025e2793a22efe8c21f807d276bd1d6a4bcc5ba6f19dbdfc4e7a12160909"}, {file = "coverage-7.6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087932079c065d7b8ebadd3a0160656c55954144af6439886c8bcf78bbbcde7f"}, {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9c6b0c1cafd96213a0327cf680acb39f70e452caf8e9a25aeb05316db9c07f89"}, {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6e85830eed5b5263ffa0c62428e43cb844296f3b4461f09e4bdb0d44ec190bc2"}, {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62ab4231c01e156ece1b3a187c87173f31cbeee83a5e1f6dff17f288dca93345"}, {file = "coverage-7.6.2-cp310-cp310-win32.whl", hash = "sha256:7b80fbb0da3aebde102a37ef0138aeedff45997e22f8962e5f16ae1742852676"}, {file = "coverage-7.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:d20c3d1f31f14d6962a4e2f549c21d31e670b90f777ef4171be540fb7fb70f02"}, {file = "coverage-7.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb21bac7783c1bf6f4bbe68b1e0ff0d20e7e7732cfb7995bc8d96e23aa90fc7b"}, {file = "coverage-7.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7b2e437fbd8fae5bc7716b9c7ff97aecc95f0b4d56e4ca08b3c8d8adcaadb84"}, {file = "coverage-7.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:536f77f2bf5797983652d1d55f1a7272a29afcc89e3ae51caa99b2db4e89d658"}, {file = "coverage-7.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f361296ca7054f0936b02525646b2731b32c8074ba6defab524b79b2b7eeac72"}, {file = "coverage-7.6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7926d8d034e06b479797c199747dd774d5e86179f2ce44294423327a88d66ca7"}, {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0bbae11c138585c89fb4e991faefb174a80112e1a7557d507aaa07675c62e66b"}, {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fcad7d5d2bbfeae1026b395036a8aa5abf67e8038ae7e6a25c7d0f88b10a8e6a"}, {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f01e53575f27097d75d42de33b1b289c74b16891ce576d767ad8c48d17aeb5e0"}, {file = "coverage-7.6.2-cp311-cp311-win32.whl", hash = "sha256:7781f4f70c9b0b39e1b129b10c7d43a4e0c91f90c60435e6da8288efc2b73438"}, {file = "coverage-7.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:9bcd51eeca35a80e76dc5794a9dd7cb04b97f0e8af620d54711793bfc1fbba4b"}, {file = "coverage-7.6.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ebc94fadbd4a3f4215993326a6a00e47d79889391f5659bf310f55fe5d9f581c"}, {file = "coverage-7.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9681516288e3dcf0aa7c26231178cc0be6cac9705cac06709f2353c5b406cfea"}, {file = "coverage-7.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d9c5d13927d77af4fbe453953810db766f75401e764727e73a6ee4f82527b3e"}, {file = "coverage-7.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92f9ca04b3e719d69b02dc4a69debb795af84cb7afd09c5eb5d54b4a1ae2191"}, {file = "coverage-7.6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ff2ef83d6d0b527b5c9dad73819b24a2f76fdddcfd6c4e7a4d7e73ecb0656b4"}, {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47ccb6e99a3031ffbbd6e7cc041e70770b4fe405370c66a54dbf26a500ded80b"}, {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a867d26f06bcd047ef716175b2696b315cb7571ccb951006d61ca80bbc356e9e"}, {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cdfcf2e914e2ba653101157458afd0ad92a16731eeba9a611b5cbb3e7124e74b"}, {file = "coverage-7.6.2-cp312-cp312-win32.whl", hash = "sha256:f9035695dadfb397bee9eeaf1dc7fbeda483bf7664a7397a629846800ce6e276"}, {file = "coverage-7.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:5ed69befa9a9fc796fe015a7040c9398722d6b97df73a6b608e9e275fa0932b0"}, {file = "coverage-7.6.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eea60c79d36a8f39475b1af887663bc3ae4f31289cd216f514ce18d5938df40"}, {file = "coverage-7.6.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa68a6cdbe1bc6793a9dbfc38302c11599bbe1837392ae9b1d238b9ef3dafcf1"}, {file = "coverage-7.6.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ec528ae69f0a139690fad6deac8a7d33629fa61ccce693fdd07ddf7e9931fba"}, {file = "coverage-7.6.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed5ac02126f74d190fa2cc14a9eb2a5d9837d5863920fa472b02eb1595cdc925"}, {file = "coverage-7.6.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21c0ea0d4db8a36b275cb6fb2437a3715697a4ba3cb7b918d3525cc75f726304"}, {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35a51598f29b2a19e26d0908bd196f771a9b1c5d9a07bf20be0adf28f1ad4f77"}, {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c9192925acc33e146864b8cf037e2ed32a91fdf7644ae875f5d46cd2ef086a5f"}, {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf4eeecc9e10f5403ec06138978235af79c9a79af494eb6b1d60a50b49ed2869"}, {file = "coverage-7.6.2-cp313-cp313-win32.whl", hash = "sha256:e4ee15b267d2dad3e8759ca441ad450c334f3733304c55210c2a44516e8d5530"}, {file = "coverage-7.6.2-cp313-cp313-win_amd64.whl", hash = "sha256:c71965d1ced48bf97aab79fad56df82c566b4c498ffc09c2094605727c4b7e36"}, {file = "coverage-7.6.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7571e8bbecc6ac066256f9de40365ff833553e2e0c0c004f4482facb131820ef"}, {file = "coverage-7.6.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:078a87519057dacb5d77e333f740708ec2a8f768655f1db07f8dfd28d7a005f0"}, {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5e92e3e84a8718d2de36cd8387459cba9a4508337b8c5f450ce42b87a9e760"}, {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebabdf1c76593a09ee18c1a06cd3022919861365219ea3aca0247ededf6facd6"}, {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12179eb0575b8900912711688e45474f04ab3934aaa7b624dea7b3c511ecc90f"}, {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:39d3b964abfe1519b9d313ab28abf1d02faea26cd14b27f5283849bf59479ff5"}, {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:84c4315577f7cd511d6250ffd0f695c825efe729f4205c0340f7004eda51191f"}, {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ff797320dcbff57caa6b2301c3913784a010e13b1f6cf4ab3f563f3c5e7919db"}, {file = "coverage-7.6.2-cp313-cp313t-win32.whl", hash = "sha256:2b636a301e53964550e2f3094484fa5a96e699db318d65398cfba438c5c92171"}, {file = "coverage-7.6.2-cp313-cp313t-win_amd64.whl", hash = "sha256:d03a060ac1a08e10589c27d509bbdb35b65f2d7f3f8d81cf2fa199877c7bc58a"}, {file = "coverage-7.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c37faddc8acd826cfc5e2392531aba734b229741d3daec7f4c777a8f0d4993e5"}, {file = "coverage-7.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab31fdd643f162c467cfe6a86e9cb5f1965b632e5e65c072d90854ff486d02cf"}, {file = "coverage-7.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97df87e1a20deb75ac7d920c812e9326096aa00a9a4b6d07679b4f1f14b06c90"}, {file = "coverage-7.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:343056c5e0737487a5291f5691f4dfeb25b3e3c8699b4d36b92bb0e586219d14"}, {file = "coverage-7.6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4ef1c56b47b6b9024b939d503ab487231df1f722065a48f4fc61832130b90e"}, {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fca4a92c8a7a73dee6946471bce6d1443d94155694b893b79e19ca2a540d86e"}, {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69f251804e052fc46d29d0e7348cdc5fcbfc4861dc4a1ebedef7e78d241ad39e"}, {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e8ea055b3ea046c0f66217af65bc193bbbeca1c8661dc5fd42698db5795d2627"}, {file = "coverage-7.6.2-cp39-cp39-win32.whl", hash = "sha256:6c2ba1e0c24d8fae8f2cf0aeb2fc0a2a7f69b6d20bd8d3749fd6b36ecef5edf0"}, {file = "coverage-7.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:2186369a654a15628e9c1c9921409a6b3eda833e4b91f3ca2a7d9f77abb4987c"}, {file = "coverage-7.6.2-pp39.pp310-none-any.whl", hash = "sha256:667952739daafe9616db19fbedbdb87917eee253ac4f31d70c7587f7ab531b4e"}, {file = "coverage-7.6.2.tar.gz", hash = "sha256:a5f81e68aa62bc0cfca04f7b19eaa8f9c826b53fc82ab9e2121976dc74f131f3"}, ] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] toml = ["tomli"] [[package]] name = "cryptography" version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "deepmerge" version = "1.1.1" description = "a toolset to deeply merge python dictionaries." optional = false python-versions = "*" files = [ {file = "deepmerge-1.1.1-py3-none-any.whl", hash = "sha256:7219dad9763f15be9dcd4bcb53e00f48e4eed6f5ed8f15824223eb934bb35977"}, {file = "deepmerge-1.1.1.tar.gz", hash = "sha256:53a489dc9449636e480a784359ae2aab3191748c920649551c8e378622f0eca4"}, ] [[package]] name = "dill" version = "0.3.8" description = "serialize all of Python" optional = false python-versions = ">=3.8" files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "distlib" version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" files = [ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] name = "dparse" version = "0.6.4b0" description = "A parser for Python dependency files" optional = false python-versions = ">=3.7" files = [ {file = "dparse-0.6.4b0-py3-none-any.whl", hash = "sha256:592ff183348b8a5ea0a18442a7965e29445d3a26063654ec2c7e8ef42cd5753c"}, {file = "dparse-0.6.4b0.tar.gz", hash = "sha256:f8d49b41a527f3d16a269f854e6665245b325e50e41d2c213810cb984553e5c8"}, ] [package.dependencies] packaging = "*" tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] all = ["dparse[conda]", "dparse[pipenv]", "dparse[poetry]"] conda = ["pyyaml"] pipenv = ["pipenv"] poetry = ["poetry"] [[package]] name = "exceptiongroup" version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] test = ["pytest (>=6)"] [[package]] name = "filelock" version = "3.12.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, ] [package.extras] docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] typing = ["typing-extensions (>=4.7.1)"] [[package]] name = "frozenlist" version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, {file = "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"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] [[package]] name = "identify" version = "2.5.36" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, ] [package.extras] license = ["ukkonen"] [[package]] name = "idna" version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "isort" version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] colors = ["colorama (>=0.4.6)"] [[package]] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] [[package]] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] [package.dependencies] mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] code-style = ["pre-commit (>=3.0,<4.0)"] compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "marshmallow" version = "3.21.2" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false python-versions = ">=3.8" files = [ {file = "marshmallow-3.21.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] tests = ["pytest", "pytz", "simplejson"] [[package]] name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] [[package]] name = "multidict" version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] name = "mypy" version = "1.10.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, ] [package.dependencies] setuptools = "*" [[package]] name = "packaging" version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "platformdirs" version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] type = ["mypy (>=1.8)"] [[package]] name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" version = "3.7.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, ] [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" [[package]] name = "pre-commit-hooks" version = "4.6.0" description = "Some out-of-the-box hooks for pre-commit." optional = false python-versions = ">=3.8" files = [ {file = "pre_commit_hooks-4.6.0-py2.py3-none-any.whl", hash = "sha256:a69199e6a2d45ec59c1020a81ca1549abddc2afb798276d9a0d951752d6abbfe"}, {file = "pre_commit_hooks-4.6.0.tar.gz", hash = "sha256:eb1f43ee67869cd41b4c59017fad4a0f9d4d61201d163f2135535aaf65035a2b"}, ] [package.dependencies] "ruamel.yaml" = ">=0.15" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [[package]] name = "propcache" version = "0.2.0" description = "Accelerated property cache" optional = false python-versions = ">=3.8" files = [ {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, ] [[package]] name = "psutil" version = "6.0.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, ] [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "pycparser" version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pydantic" version = "2.7.1" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, ] [package.dependencies] annotated-types = ">=0.4.0" pydantic-core = "2.18.2" typing-extensions = ">=4.6.1" [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" version = "2.18.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylint" version = "3.3.1" description = "python code static checker" optional = false python-versions = ">=3.9.0" files = [ {file = "pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9"}, {file = "pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e"}, ] [package.dependencies] astroid = ">=3.3.4,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} tomlkit = ">=0.10.1" typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] [[package]] name = "pytest" version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" version = "0.24.0" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" files = [ {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, ] [package.dependencies] pytest = ">=8.2,<9" [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] name = "pytest-cov" version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." optional = false python-versions = ">=3.7" files = [ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, ] [package.dependencies] markdown-it-py = ">=2.2.0" pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruamel-yaml" version = "0.18.6" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3.7" files = [ {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, ] [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} [package.extras] docs = ["mercurial (>5.7)", "ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false python-versions = ">=3.6" files = [ {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, ] [[package]] name = "ruff" version = "0.6.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, ] [[package]] name = "safety" version = "3.2.8" description = "Checks installed dependencies for known vulnerabilities and licenses." optional = false python-versions = ">=3.7" files = [ {file = "safety-3.2.8-py3-none-any.whl", hash = "sha256:af6b8c0bb5305b27e00a24b91d3c691d980d43c9becc919d16e5264a78a0437e"}, {file = "safety-3.2.8.tar.gz", hash = "sha256:4385ea2b321fda163910d1a96ecaaca89d518e28ea5a88c1bb3f53171b45bf94"}, ] [package.dependencies] Authlib = ">=1.2.0" Click = ">=8.0.2" dparse = ">=0.6.4b0" filelock = ">=3.12.2,<3.13.0" jinja2 = ">=3.1.0" marshmallow = ">=3.15.0" packaging = ">=21.0" psutil = ">=6.0.0,<6.1.0" pydantic = ">=1.10.12" requests = "*" rich = "*" "ruamel.yaml" = ">=0.17.21" safety-schemas = ">=0.0.4" setuptools = ">=65.5.1" typer = "*" typing-extensions = ">=4.7.1" urllib3 = ">=1.26.5" [package.extras] github = ["pygithub (>=1.43.3)"] gitlab = ["python-gitlab (>=1.3.0)"] spdx = ["spdx-tools (>=0.8.2)"] [[package]] name = "safety-schemas" version = "0.0.5" description = "Schemas for Safety tools" optional = false python-versions = ">=3.7" files = [ {file = "safety_schemas-0.0.5-py3-none-any.whl", hash = "sha256:6ac9eb71e60f0d4e944597c01dd48d6d8cd3d467c94da4aba3702a05a3a6ab4f"}, {file = "safety_schemas-0.0.5.tar.gz", hash = "sha256:0de5fc9a53d4423644a8ce9a17a2e474714aa27e57f3506146e95a41710ff104"}, ] [package.dependencies] dparse = ">=0.6.4b0" packaging = ">=21.0" pydantic = "*" ruamel-yaml = ">=0.17.21" typing-extensions = ">=4.7.1" [[package]] name = "setuptools" version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shellingham" version = "1.5.4" description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] [[package]] name = "syrupy" version = "4.6.1" description = "Pytest Snapshot Test Utility" optional = false python-versions = ">=3.8.1,<4" files = [ {file = "syrupy-4.6.1-py3-none-any.whl", hash = "sha256:203e52f9cb9fa749cf683f29bd68f02c16c3bc7e7e5fe8f2fc59bdfe488ce133"}, {file = "syrupy-4.6.1.tar.gz", hash = "sha256:37a835c9ce7857eeef86d62145885e10b3cb9615bc6abeb4ce404b3f18e1bb36"}, ] [package.dependencies] pytest = ">=7.0.0,<9.0.0" [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] [[package]] name = "tomlkit" version = "0.12.5" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, ] [[package]] name = "typer" version = "0.12.3" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false python-versions = ">=3.7" files = [ {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, ] [package.dependencies] click = ">=8.0.0" rich = ">=10.11.0" shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" [[package]] name = "types-cachetools" version = "5.3.0.7" description = "Typing stubs for cachetools" optional = false python-versions = ">=3.7" files = [ {file = "types-cachetools-5.3.0.7.tar.gz", hash = "sha256:27c982cdb9cf3fead8b0089ee6b895715ecc99dac90ec29e2cab56eb1aaf4199"}, {file = "types_cachetools-5.3.0.7-py3-none-any.whl", hash = "sha256:98c069dc7fc087b1b061703369c80751b0a0fc561f6fb072b554e5eee23773a0"}, ] [[package]] name = "typing-extensions" version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "urllib3" version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" version = "20.26.2" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "yamllint" version = "1.35.1" description = "A linter for YAML files." optional = false python-versions = ">=3.8" files = [ {file = "yamllint-1.35.1-py3-none-any.whl", hash = "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3"}, {file = "yamllint-1.35.1.tar.gz", hash = "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd"}, ] [package.dependencies] pathspec = ">=0.5.3" pyyaml = "*" [package.extras] dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] [[package]] name = "yarl" version = "1.14.0" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1bfc25aa6a7c99cf86564210f79a0b7d4484159c67e01232b116e445b3036547"}, {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0cf21f46a15d445417de8fc89f2568852cf57fe8ca1ab3d19ddb24d45c0383ae"}, {file = "yarl-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dda53508df0de87b6e6b0a52d6718ff6c62a5aca8f5552748404963df639269"}, {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:587c3cc59bc148a9b1c07a019346eda2549bc9f468acd2f9824d185749acf0a6"}, {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3007a5b75cb50140708420fe688c393e71139324df599434633019314ceb8b59"}, {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06ff23462398333c78b6f4f8d3d70410d657a471c2c5bbe6086133be43fc8f1a"}, {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689a99a42ee4583fcb0d3a67a0204664aa1539684aed72bdafcbd505197a91c4"}, {file = "yarl-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0547ab1e9345dc468cac8368d88ea4c5bd473ebc1d8d755347d7401982b5dd8"}, {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:742aef0a99844faaac200564ea6f5e08facb285d37ea18bd1a5acf2771f3255a"}, {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:176110bff341b6730f64a1eb3a7070e12b373cf1c910a9337e7c3240497db76f"}, {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46a9772a1efa93f9cd170ad33101c1817c77e0e9914d4fe33e2da299d7cf0f9b"}, {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ee2c68e4f2dd1b1c15b849ba1c96fac105fca6ffdb7c1e8be51da6fabbdeafb9"}, {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:047b258e00b99091b6f90355521f026238c63bd76dcf996d93527bb13320eefd"}, {file = "yarl-1.14.0-cp310-cp310-win32.whl", hash = "sha256:0aa92e3e30a04f9462a25077db689c4ac5ea9ab6cc68a2e563881b987d42f16d"}, {file = "yarl-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:d9baec588f015d0ee564057aa7574313c53a530662ffad930b7886becc85abdf"}, {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:07f9eaf57719d6721ab15805d85f4b01a5b509a0868d7320134371bcb652152d"}, {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c14b504a74e58e2deb0378b3eca10f3d076635c100f45b113c18c770b4a47a50"}, {file = "yarl-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a682a127930f3fc4e42583becca6049e1d7214bcad23520c590edd741d2114"}, {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73bedd2be05f48af19f0f2e9e1353921ce0c83f4a1c9e8556ecdcf1f1eae4892"}, {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3ab950f8814f3b7b5e3eebc117986f817ec933676f68f0a6c5b2137dd7c9c69"}, {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b693c63e7e64b524f54aa4888403c680342d1ad0d97be1707c531584d6aeeb4f"}, {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cb3e40eaa98489f1e2e8b29f5ad02ee1ee40d6ce6b88d50cf0f205de1d9d2c"}, {file = "yarl-1.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f24f08b6c9b9818fd80612c97857d28f9779f0d1211653ece9844fc7b414df2"}, {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29a84a46ec3ebae7a1c024c055612b11e9363a8a23238b3e905552d77a2bc51b"}, {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5cd5dad8366e0168e0fd23d10705a603790484a6dbb9eb272b33673b8f2cce72"}, {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a152751af7ef7b5d5fa6d215756e508dd05eb07d0cf2ba51f3e740076aa74373"}, {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3d569f877ed9a708e4c71a2d13d2940cb0791da309f70bd970ac1a5c088a0a92"}, {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a615cad11ec3428020fb3c5a88d85ce1b5c69fd66e9fcb91a7daa5e855325dd"}, {file = "yarl-1.14.0-cp311-cp311-win32.whl", hash = "sha256:bab03192091681d54e8225c53f270b0517637915d9297028409a2a5114ff4634"}, {file = "yarl-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:985623575e5c4ea763056ffe0e2d63836f771a8c294b3de06d09480538316b13"}, {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fc2c80bc87fba076e6cbb926216c27fba274dae7100a7b9a0983b53132dd99f2"}, {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:55c144d363ad4626ca744556c049c94e2b95096041ac87098bb363dcc8635e8d"}, {file = "yarl-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b03384eed107dbeb5f625a99dc3a7de8be04fc8480c9ad42fccbc73434170b20"}, {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f72a0d746d38cb299b79ce3d4d60ba0892c84bbc905d0d49c13df5bace1b65f8"}, {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8648180b34faaea4aa5b5ca7e871d9eb1277033fa439693855cf0ea9195f85f1"}, {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9557c9322aaa33174d285b0c1961fb32499d65ad1866155b7845edc876c3c835"}, {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f50eb3837012a937a2b649ec872b66ba9541ad9d6f103ddcafb8231cfcafd22"}, {file = "yarl-1.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8892fa575ac9b1b25fae7b221bc4792a273877b9b56a99ee2d8d03eeb3dbb1d2"}, {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6a2c5c5bb2556dfbfffffc2bcfb9c235fd2b566d5006dfb2a37afc7e3278a07"}, {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ab3abc0b78a5dfaa4795a6afbe7b282b6aa88d81cf8c1bb5e394993d7cae3457"}, {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:47eede5d11d669ab3759b63afb70d28d5328c14744b8edba3323e27dc52d298d"}, {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe4d2536c827f508348d7b40c08767e8c7071614250927233bf0c92170451c0a"}, {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0fd7b941dd1b00b5f0acb97455fea2c4b7aac2dd31ea43fb9d155e9bc7b78664"}, {file = "yarl-1.14.0-cp312-cp312-win32.whl", hash = "sha256:99ff3744f5fe48288be6bc402533b38e89749623a43208e1d57091fc96b783b9"}, {file = "yarl-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ca3894e9e9f72da93544f64988d9c052254a338a9f855165f37f51edb6591de"}, {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d02d700705d67e09e1f57681f758f0b9d4412eeb70b2eb8d96ca6200b486db3"}, {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:30600ba5db60f7c0820ef38a2568bb7379e1418ecc947a0f76fd8b2ff4257a97"}, {file = "yarl-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e85d86527baebb41a214cc3b45c17177177d900a2ad5783dbe6f291642d4906f"}, {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37001e5d4621cef710c8dc1429ca04e189e572f128ab12312eab4e04cf007132"}, {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4f4547944d4f5cfcdc03f3f097d6f05bbbc915eaaf80a2ee120d0e756de377d"}, {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75ff4c819757f9bdb35de049a509814d6ce851fe26f06eb95a392a5640052482"}, {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ac1a09392ed6e3fd14be880d39b951d7b981fd135416db7d18a6208c536561"}, {file = "yarl-1.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96952f642ac69075e44c7d0284528938fdff39422a1d90d3e45ce40b72e5e2d9"}, {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a56fbe3d7f3bce1d060ea18d2413a2ca9ca814eea7cedc4d247b5f338d54844e"}, {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e2637d75e92763d1322cb5041573279ec43a80c0f7fbbd2d64f5aee98447b17"}, {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9abe80ae2c9d37c17599557b712e6515f4100a80efb2cda15f5f070306477cd2"}, {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:217a782020b875538eebf3948fac3a7f9bbbd0fd9bf8538f7c2ad7489e80f4e8"}, {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9cfef3f14f75bf6aba73a76caf61f9d00865912a04a4393c468a7ce0981b519"}, {file = "yarl-1.14.0-cp313-cp313-win32.whl", hash = "sha256:d8361c7d04e6a264481f0b802e395f647cd3f8bbe27acfa7c12049efea675bd1"}, {file = "yarl-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:bc24f968b82455f336b79bf37dbb243b7d76cd40897489888d663d4e028f5069"}, {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:91d875f75fabf76b3018c5f196bf3d308ed2b49ddcb46c1576d6b075754a1393"}, {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4009def9be3a7e5175db20aa2d7307ecd00bbf50f7f0f989300710eee1d0b0b9"}, {file = "yarl-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:582cedde49603f139be572252a318b30dc41039bc0b8165f070f279e5d12187f"}, {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbd9ff43a04f8ffe8a959a944c2dca10d22f5f99fc6a459f49c3ebfb409309d9"}, {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f805e37ed16cc212fdc538a608422d7517e7faf539bedea4fe69425bc55d76"}, {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95e16e9eaa2d7f5d87421b8fe694dd71606aa61d74b824c8d17fc85cc51983d1"}, {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:816d24f584edefcc5ca63428f0b38fee00b39fe64e3c5e558f895a18983efe96"}, {file = "yarl-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd2660c01367eb3ef081b8fa0a5da7fe767f9427aa82023a961a5f28f0d4af6c"}, {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:94b2bb9bcfd5be9d27004ea4398fb640373dd0c1a9e219084f42c08f77a720ab"}, {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c2089a9afef887664115f7fa6d3c0edd6454adaca5488dba836ca91f60401075"}, {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2192f718db4a8509f63dd6d950f143279211fa7e6a2c612edc17d85bf043d36e"}, {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:8385ab36bf812e9d37cf7613999a87715f27ef67a53f0687d28c44b819df7cb0"}, {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b4c1ecba93e7826dc71ddba75fb7740cdb52e7bd0be9f03136b83f54e6a1f511"}, {file = "yarl-1.14.0-cp38-cp38-win32.whl", hash = "sha256:e749af6c912a7bb441d105c50c1a3da720474e8acb91c89350080dd600228f0e"}, {file = "yarl-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:147e36331f6f63e08a14640acf12369e041e0751bb70d9362df68c2d9dcf0c87"}, {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a9f917966d27f7ce30039fe8d900f913c5304134096554fd9bea0774bcda6d1"}, {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a2f8fb7f944bcdfecd4e8d855f84c703804a594da5123dd206f75036e536d4d"}, {file = "yarl-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f4e475f29a9122f908d0f1f706e1f2fc3656536ffd21014ff8a6f2e1b14d1d8"}, {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8089d4634d8fa2b1806ce44fefa4979b1ab2c12c0bc7ef3dfa45c8a374811348"}, {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b16f6c75cffc2dc0616ea295abb0e1967601bd1fb1e0af6a1de1c6c887f3439"}, {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498b3c55087b9d762636bca9b45f60d37e51d24341786dc01b81253f9552a607"}, {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3f8bfc1db82589ef965ed234b87de30d140db8b6dc50ada9e33951ccd8ec07a"}, {file = "yarl-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:625f207b1799e95e7c823f42f473c1e9dbfb6192bd56bba8695656d92be4535f"}, {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:781e2495e408a81e4eaeedeb41ba32b63b1980dddf8b60dbbeff6036bcd35049"}, {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:659603d26d40dd4463200df9bfbc339fbfaed3fe32e5c432fe1dc2b5d4aa94b4"}, {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4e0d45ebf975634468682c8bec021618b3ad52c37619e5c938f8f831fa1ac5c0"}, {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a2e4725a08cb2b4794db09e350c86dee18202bb8286527210e13a1514dc9a59a"}, {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:19268b4fec1d7760134f2de46ef2608c2920134fb1fa61e451f679e41356dc55"}, {file = "yarl-1.14.0-cp39-cp39-win32.whl", hash = "sha256:337912bcdcf193ade64b9aae5a4017a0a1950caf8ca140362e361543c6773f21"}, {file = "yarl-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:b6d0147574ce2e7b812c989e50fa72bbc5338045411a836bd066ce5fc8ac0bce"}, {file = "yarl-1.14.0-py3-none-any.whl", hash = "sha256:c8ed4034f0765f8861620c1f2f2364d2e58520ea288497084dae880424fc0d9f"}, {file = "yarl-1.14.0.tar.gz", hash = "sha256:88c7d9d58aab0724b979ab5617330acb1c7030b79379c8138c1c8c94e121d1b3"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.9" content-hash = "43b41e8bd33c0476e0b10142b2457facf08ee52c12260eb2eaf95d35554a4952" python-ipp-0.17.0/pyproject.toml000066400000000000000000000076101470165767400166470ustar00rootroot00000000000000[tool.poetry] name = "pyipp" description = "Asynchronous Python client for Internet Printing Protocol (IPP)" authors = ["Chris Talkington "] classifiers = [ "Development Status :: 4 - Beta", "Framework :: AsyncIO", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules", ] keywords = ["ipp", "api", "async", "client", "printer"] documentation = "https://github.com/ctalkington/python-ipp" homepage = "https://github.com/ctalkington/python-ipp" license = "MIT" maintainers = ["Chris Talkington "] packages = [ {include = "pyipp", from = "src"}, ] readme = "README.md" repository = "https://github.com/ctalkington/python-ipp" version = "0.0.0" [tool.poetry.dependencies] aiohttp = ">=3.0.0" async-timeout = { version = "4.0.3", python = "<3.11" } awesomeversion = ">=21.10.1" backoff = ">=2.2.0" deepmerge = ">=1.1.0" python = "^3.9" yarl = ">=1.6.0" [tool.poetry.dev-dependencies] aresponses = "3.0.0" black = "24.4.2" blacken-docs = "1.16.0" codespell = "2.3.0" covdefaults = "2.3.0" coverage = {version = "7.6.2", extras = ["toml"]} mypy = "1.10.0" pre-commit = "3.7.1" pre-commit-hooks = "4.6.0" pylint = "3.3.1" pytest = "8.3.3" pytest-asyncio = "0.24.0" pytest-cov = "5.0.0" ruff = "0.6.9" safety = "3.2.8" syrupy = "4.6.1" types-cachetools = "^5.3.0" yamllint = "1.35.1" [tool.poetry.urls] "Bug Tracker" = "https://github.com/ctalkington/python-ipp/issues" Changelog = "https://github.com/ctalkington/python-ipp/releases" [tool.coverage.report] show_missing = true fail_under = 53 [tool.coverage.run] plugins = ["covdefaults"] source = ["pyipp"] [tool.mypy] # Specify the target platform details in config, so your developers are # free to run mypy on Windows, Linux, or macOS and get consistent # results. platform = "linux" python_version = 3.9 # show error messages from unrelated files follow_imports = "normal" # suppress errors about unsatisfied imports ignore_missing_imports = true # be strict check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true disallow_subclassing_any = true disallow_untyped_calls = true disallow_untyped_decorators = true disallow_untyped_defs = true no_implicit_optional = true no_implicit_reexport = true strict_optional = true warn_incomplete_stub = true warn_no_return = true warn_redundant_casts = true warn_return_any = true warn_unused_configs = true warn_unused_ignores = true [[tool.mypy.overrides]] follow_imports = "skip" module = "mypy-aiohttp.*" [tool.pylint.MASTER] extension-pkg-whitelist = [ "pydantic", ] ignore = [ "examples", "tests", ] [tool.pylint.BASIC] good-names = [ "_", "ex", "fp", "i", "id", "j", "k", "on", "Run", "T", "wv", ] [tool.pylint."MESSAGES CONTROL"] disable = [ "too-few-public-methods", "too-many-arguments", "duplicate-code", "format", "unsubscriptable-object", ] [tool.pylint.SIMILARITIES] ignore-imports = true [tool.pylint.FORMAT] max-line-length = 88 [tool.pylint.DESIGN] max-attributes = 20 [tool.pyright] include = ["src"] [tool.pytest.ini_options] addopts = "--cov" asyncio_mode = "auto" [tool.ruff.lint] select = ["ALL"] ignore = [ "ANN101", # Self... explanatory "ANN401", # Opinionated warning on disallowing dynamically typed expressions "D203", # Conflicts with other rules "D213", # Conflicts with other rules "D417", # False positives in some occasions "PLR2004", # Just annoying, not really useful "TRY003", "EM101", "EXE002", ] [tool.ruff.lint.flake8-pytest-style] mark-parentheses = false fixture-parentheses = false [tool.ruff.lint.isort] known-first-party = ["pyipp"] [tool.ruff.lint.mccabe] max-complexity = 25 [build-system] build-backend = "poetry.core.masonry.api" requires = ["poetry-core>=1.0.0"] python-ipp-0.17.0/renovate.json000066400000000000000000000020741470165767400164500ustar00rootroot00000000000000{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:base", "schedule:daily" ], "timezone": "America/Chicago", "labels": ["dependencies"], "lockFileMaintenance": { "enabled": true, "automerge": true }, "packageRules": [ { "matchManagers": ["poetry"], "addLabels": ["python"] }, { "matchManagers": ["poetry"], "matchDepTypes": ["dev"], "rangeStrategy": "pin" }, { "matchManagers": ["poetry"], "matchUpdateTypes": ["minor", "patch"], "automerge": true }, { "matchManagers": ["npm", "nvm"], "addLabels": ["javascript"], "rangeStrategy": "pin" }, { "matchManagers": ["npm", "nvm"], "matchUpdateTypes": ["minor", "patch"], "automerge": true }, { "matchManagers": ["github-actions"], "addLabels": ["github_actions"], "rangeStrategy": "pin" }, { "matchManagers": ["github-actions"], "matchUpdateTypes": ["minor", "patch"], "automerge": true } ] } python-ipp-0.17.0/src/000077500000000000000000000000001470165767400145165ustar00rootroot00000000000000python-ipp-0.17.0/src/pyipp/000077500000000000000000000000001470165767400156575ustar00rootroot00000000000000python-ipp-0.17.0/src/pyipp/__init__.py000066400000000000000000000010651470165767400177720ustar00rootroot00000000000000"""Asynchronous Python client for IPP.""" from .exceptions import ( IPPConnectionError, IPPConnectionUpgradeRequired, IPPError, IPPParseError, IPPResponseError, IPPVersionNotSupportedError, ) from .ipp import IPP from .models import ( Info, Marker, Printer, State, Uri, ) __all__ = [ "Info", "Marker", "Printer", "State", "Uri", "IPP", "IPPConnectionError", "IPPConnectionUpgradeRequired", "IPPError", "IPPParseError", "IPPResponseError", "IPPVersionNotSupportedError", ] python-ipp-0.17.0/src/pyipp/const.py000066400000000000000000000020031470165767400173520ustar00rootroot00000000000000"""Constants for IPP.""" DEFAULT_CHARSET = "utf-8" DEFAULT_CHARSET_LANGUAGE = "en-US" DEFAULT_CLASS_ATTRIBUTES = ["printer-name", "member-names"] DEFAULT_JOB_ATTRIBUTES = [ "job-id", "job-name", "printer-uri", "job-state", "job-state-reasons", "job-hold-until", "job-media-progress", "job-k-octets", "number-of-documents", "copies", "job-originating-user-name", ] DEFAULT_PRINTER_ATTRIBUTES = [ "printer-device-id", "printer-name", "printer-type", "printer-location", "printer-info", "printer-make-and-model", "printer-state", "printer-state-message", "printer-state-reason", "printer-supply", "printer-up-time", "printer-uri-supported", "device-uri", "printer-is-shared", "printer-more-info", "printer-firmware-string-version", "marker-colors", "marker-high-levels", "marker-levels", "marker-low-levels", "marker-names", "marker-types", ] DEFAULT_PORT = 631 DEFAULT_PROTO_VERSION = (2, 0) python-ipp-0.17.0/src/pyipp/enums.py000066400000000000000000000225301470165767400173620ustar00rootroot00000000000000"""Enumerators for IPP.""" from enum import IntEnum class IppStatus(IntEnum): """Represent the ENUMs of a status response.""" CUPS_INVALID = -1 OK = 0x0000 OK_IGNORED_OR_SUBSTITUTED = 0x0001 OK_CONFLICTING = 0x0002 OK_IGNORED_SUBSCRIPTIONS = 0x0003 OK_IGNORED_NOTIFICATIONS = 0x0004 OK_TOO_MANY_EVENTS = 0x0005 OK_BUT_CANCEL_SUBSCRIPTION = 0x0006 OK_EVENTS_COMPLETE = 0x0007 REDIRECTION_OTHER_SITE = 0x0200 CUPS_SEE_OTHER = 0x0280 ERROR_BAD_REQUEST = 0x0400 ERROR_FORBIDDEN = 0x0401 ERROR_NOT_AUTHENTICATED = 0x0402 ERROR_NOT_AUTHORIZED = 0x0403 ERROR_NOT_POSSIBLE = 0x0404 ERROR_TIMEOUT = 0x0405 ERROR_NOT_FOUND = 0x0406 ERROR_GONE = 0x0407 ERROR_REQUEST_ENTITY = 0x0408 ERROR_REQUEST_VALUE = 0x0409 ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED = 0x040A ERROR_ATTRIBUTES_OR_VALUES = 0x040B ERROR_URI_SCHEME = 0x040C ERROR_CHARSET = 0x040D ERROR_CONFLICTING = 0x040E ERROR_COMPRESSION_ERROR = 0x040F ERROR_DOCUMENT_FORMAT_ERROR = 0x0410 ERROR_DOCUMENT_ACCESS = 0x0411 ERROR_ATTRIBUTES_NOT_SETTABLE = 0x0412 ERROR_IGNORED_ALL_SUBSCRIPTIONS = 0x0413 ERROR_TOO_MANY_SUBSCRIPTIONS = 0x0414 ERROR_IGNORED_ALL_NOTIFICATIONS = 0x0415 ERROR_PRINT_SUPPORT_FILE_NOT_FOUND = 0x0416 ERROR_DOCUMENT_PASSWORD = 0x0417 ERROR_DOCUMENT_PERMISSION = 0x0418 ERROR_DOCUMENT_SECURITY = 0x0419 ERROR_DOCUMENT_UNPRINTABLE = 0x041A ERROR_ACCOUNT_INFO_NEEDED = 0x041B ERROR_ACCOUNT_CLOSED = 0x041C ERROR_ACCOUNT_LIMIT_REACHED = 0x041D ERROR_ACCOUNT_AUTHORIZATION_FAILED = 0x041E ERROR_NOT_FETCHABLE = 0x041F ERROR_CUPS_ACCOUNT_INFO_NEEDED = 0x049C ERROR_CUPS_ACCOUNT_CLOSED = 0x049D ERROR_CUPS_ACCOUNT_LIMIT_REACHED = 0x049E ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED = 0x049F ERROR_INTERNAL = 0x0500 ERROR_OPERATION_NOT_SUPPORTED = 0x0501 ERROR_SERVICE_UNAVAILABLE = 0x0502 ERROR_VERSION_NOT_SUPPORTED = 0x0503 ERROR_DEVICE = 0x0504 ERROR_TEMPORARY = 0x0505 ERROR_NOT_ACCEPTING_JOBS = 0x0506 ERROR_BUSY = 0x0507 ERROR_JOB_CANCELED = 0x0508 ERROR_MULTIPLE_JOBS_NOT_SUPPORTED = 0x0509 ERROR_PRINTER_IS_DEACTIVATED = 0x050A ERROR_TOO_MANY_JOBS = 0x050B ERROR_TOO_MANY_DOCUMENTS = 0x050C ERROR_CUPS_AUTHENTICATION_CANCELED = 0x1000 ERROR_CUPS_PKI = 0x1001 ERROR_CUPS_UPGRADE_REQUIRED = 0x1002 class IppOperation(IntEnum): """Represent the ENUMs of an operation.""" CUPS_INVALID = -0x0001 CUPS_NONE = 0x0000 PRINT_JOB = 0x0002 PRINT_URI = 0x0003 VALIDATE_JOB = 0x0004 CREATE_JOB = 0x0005 SEND_DOCUMENT = 0x0006 SEND_URI = 0x0007 CANCEL_JOB = 0x0008 GET_JOB_ATTRIBUTES = 0x0009 GET_JOBS = 0x000A GET_PRINTER_ATTRIBUTES = 0x000B HOLD_JOB = 0x000C RELEASE_JOB = 0x000D RESTART_JOB = 0x000E PAUSE_PRINTER = 0x0010 RESUME_PRINTER = 0x0011 PURGE_JOBS = 0x0012 SET_PRINTER_ATTRIBUTES = 0x0013 SET_JOB_ATTRIBUTES = 0x0014 GET_PRINTER_SUPPORTED_VALUES = 0x0015 CREATE_PRINTER_SUBSCRIPTIONS = 0x0016 CREATE_JOB_SUBSCRIPTIONS = 0x0017 GET_SUBSCRIPTION_ATTRIBUTES = 0x0018 GET_SUBSCRIPTIONS = 0x0019 RENEW_SUBSCRIPTION = 0x001A CANCEL_SUBSCRIPTION = 0x001B GET_NOTIFICATIONS = 0x001C SEND_NOTIFICATIONS = 0x001D GET_RESOURCE_ATTRIBUTES = 0x001E GET_RESOURCE_DATA = 0x001F GET_RESOURCES = 0x0020 GET_PRINT_SUPPORT_FILES = 0x0021 ENABLE_PRINTER = 0x0022 DISABLE_PRINTER = 0x0023 PAUSE_PRINTER_AFTER_CURRENT_JOB = 0x0024 HOLD_NEW_JOBS = 0x0025 RELEASE_HELD_NEW_JOBS = 0x0026 DEACTIVATE_PRINTER = 0x0027 ACTIVATE_PRINTER = 0x0028 RESTART_PRINTER = 0x0029 SHUTDOWN_PRINTER = 0x002A STARTUP_PRINTER = 0x002B REPROCESS_JOB = 0x002C CANCEL_CURRENT_JOB = 0x002D SUSPEND_CURRENT_JOB = 0x002E RESUME_JOB = 0x002F PROMOTE_JOB = 0x0030 SCHEDULE_JOB_AFTER = 0x0031 CANCEL_DOCUMENT = 0x0033 GET_DOCUMENT_ATTRIBUTES = 0x0034 GET_DOCUMENTS = 0x0035 DELETE_DOCUMENT = 0x0036 SET_DOCUMENT_ATTRIBUTES = 0x0037 CANCEL_JOBS = 0x0038 CANCEL_MY_JOBS = 0x0039 RESUBMIT_JOB = 0x003A CLOSE_JOB = 0x003B IDENTIFY_PRINTER = 0x003C VALIDATE_DOCUMENT = 0x003D ADD_DOCUMENT_IMAGES = 0x003E ACKNOWLEDGE_DOCUMENT = 0x003F ACKNOWLEDGE_IDENTIFY_PRINTER = 0x0040 ACKNOWLEDGE_JOB = 0x0041 FETCH_DOCUMENT = 0x0042 FETCH_JOB = 0x0043 GET_OUTPUT_DEVICE_ATTRIBUTES = 0x0044 UPDATE_ACTIVE_JOBS = 0x0045 DEREGISTER_OUTPUT_DEVICE = 0x0046 UPDATE_DOCUMENT_STATUS = 0x0047 UPDATE_JOB_STATUS = 0x0048 UPDATE_OUTPUT_DEVICE_ATTRIBUTES = 0x0049 GET_NEXT_DOCUMENT_DATA = 0x004A ALLOCATE_PRINTER_RESOURCES = 0x004B CREATE_PRINTER = 0x004C DEALLOCATE_PRINTER_RESOURCES = 0x004D DELETE_PRINTER = 0x004E GET_PRINTERS = 0x004F SHUTDOWN_ONE_PRINTER = 0x0050 STARTUP_ONE_PRINTER = 0x0051 CANCEL_RESOURCE = 0x0052 CREATE_RESOURCE = 0x0053 INSTALL_RESOURCE = 0x0054 SEND_RESOURCE_DATA = 0x0055 SET_RESOURCE_ATTRIBUTES = 0x0056 CREATE_RESOURCE_SUBSCRIPTIONS = 0x0057 CREATE_SYSTEM_SUBSCRIPTIONS = 0x0058 DISABLE_ALL_PRINTERS = 0x0059 ENABLE_ALL_PRINTERS = 0x005A GET_SYSTEM_ATTRIBUTES = 0x005B GET_SYSTEM_SUPPORTED_VALUES = 0x005C PAUSE_ALL_PRINTERS = 0x005D PAUSE_ALL_PRINTERS_AFTER_CURRENT_JOB = 0x005E REGISTER_OUTPUT_DEVICE = 0x005F RESTART_SYSTEM = 0x0060 RESUME_ALL_PRINTERS = 0x0061 SET_SYSTEM_ATTRIBUTES = 0x0062 SHUTDOWN_ALL_PRINTER = 0x0063 STARTUP_ALL_PRINTERS = 0x0064 PRIVATE = 0x4000 CUPS_GET_DEFAULT = 0x4001 CUPS_GET_PRINTERS = 0x4002 CUPS_ADD_MODIFY_PRINTER = 0x4003 CUPS_DELETE_PRINTER = 0x4004 CUPS_GET_CLASSES = 0x4005 CUPS_ADD_MODIFY_CLASS = 0x4006 CUPS_DELETE_CLASS = 0x4007 CUPS_ACCEPT_JOBS = 0x4008 CUPS_REJECT_JOBS = 0x4009 CUPS_SET_DEFAULT = 0x400A CUPS_GET_DEVICES = 0x400B CUPS_GET_PPDS = 0x400C CUPS_MOVE_JOB = 0x400D CUPS_AUTHENTICATE_JOB = 0x400E CUPS_GET_PPD = 0x400F CUPS_GET_DOCUMENT = 0x4027 CUPS_CREATE_LOCAL_PRINTER = 0x4028 class IppTag(IntEnum): """Represent the ENUMs of a tag.""" CUPS_INVALID = -1 ZERO = 0x00 OPERATION = 0x01 JOB = 0x02 END = 0x03 PRINTER = 0x04 UNSUPPORTED_GROUP = 0x05 SUBSCRIPTION = 0x06 EVENT_NOTIFICATION = 0x07 RESOURCE = 0x08 DOCUMENT = 0x09 SYSTEM = 0x0A UNSUPPORTED_VALUE = 0x10 DEFAULT = 0x11 UNKNOWN = 0x12 NO_VALUE = 0x013 NOT_SETTABLE = 0x15 DELETE_ATTR = 0x16 ADMIN_DEFINE = 0x17 INTEGER = 0x21 BOOLEAN = 0x22 ENUM = 0x23 STRING = 0x30 DATE = 0x31 RESOLUTION = 0x32 RANGE = 0x33 BEGIN_COLLECTION = 0x34 TEXT_LANG = 0x35 NAME_LANG = 0x36 END_COLLECTION = 0x37 TEXT = 0x41 NAME = 0x42 RESERVED_STRING = 0x43 KEYWORD = 0x44 URI = 0x45 URI_SCHEME = 0x46 CHARSET = 0x47 LANGUAGE = 0x48 MIME_TYPE = 0x49 MEMBER_NAME = 0x4A EXTENSION = 0x7F CUPS_MASK = 0x7FFFFFFF CUPS_CONST = -0x7FFFFFFF - 1 class IppJobState(IntEnum): """Represent the ENUMs of the state of a print job.""" PENDING = 0x03 HELD = 0x04 PROCESSING = 0x05 STOPPED = 0x06 CANCELED = 0x07 ABORTED = 0x08 COMPLETED = 0x09 class IppDocumentState(IntEnum): """Represent the ENUMs of the state of a document.""" PENDING = 0x03 PROCESSING = 0x05 CANCELED = 0x07 ABORTED = 0x08 COMPLETED = 0x08 class IppPrinterState(IntEnum): """Represent the ENUMs of the state of a printer.""" IDLE = 0x0003 PROCESSING = 0x0004 STOPPED = 0x0005 class IppFinishing(IntEnum): """Represent the ENUMs of the finishings attribute.""" NONE = 0x0003 STAPLE = 0x0004 PUNCH = 0x0005 COVER = 0x0006 BIND = 0x0007 SADDLE_STITCH = 0x0008 EDGE_STITCH = 0x0009 STAPLE_TOP_LEFT = 0x0014 STAPLE_BOTTOM_LEFT = 0x0015 STAPLE_TOP_RIGHT = 0x0016 STAPLE_BOTTOM_RIGHT = 0x0017 EDGE_STITCH_LEFT = 0x0018 EDGE_STITCH_TOP = 0x0019 EDGE_STITCH_RIGHT = 0x001A EDGE_STITCH_BOTTOM = 0x001B STAPLE_DUAL_LEFT = 0x001C STAPLE_DUAL_TOP = 0x001D STAPLE_DUAL_RIGHT = 0x001E STAPLE_DUAL_BOTTOM = 0x001F class IppPrintQuality(IntEnum): """Represent the ENUMs of the print-quality attribute.""" DRAFT = 0x0003 NORMAL = 0x0004 HIGH = 0x0005 class IppOrientationRequested(IntEnum): """Represent the ENUMs of the orientation-requested attribute.""" PORTRAIT = 0x0003 LANDSCAPE = 0x0004 REVERSE_LANDSCAPE = 0x0005 REVERSE_PORTRAIT = 0x0006 ATTRIBUTE_ENUM_MAP = { "document-state": IppDocumentState, # PWG5100.5 "finishings": IppFinishing, # RFC8011 "finishings-default": IppFinishing, # RFC8011 "finishings-supported": IppFinishing, # RFC8011 "job-state": IppJobState, # RFC8011 "media-source-feed-orientation": IppOrientationRequested, # PWG5100.7 "operations-supported": IppOperation, # RFC8011 "orientation-requested": IppOrientationRequested, # RFC8011 "orientation-requested-default": IppOrientationRequested, # RFC8011 "orientation-requested-supported": IppOrientationRequested, # RFC8011 "printer-state": IppPrinterState, # RFC8011 "print-quality": IppPrintQuality, # RFC8011 "print-quality-default": IppPrintQuality, # RFC8011 "print-quality-supported": IppPrintQuality, # RFC8011 "status-code": IppStatus, # RFC8011 } python-ipp-0.17.0/src/pyipp/exceptions.py000066400000000000000000000007461470165767400204210ustar00rootroot00000000000000"""Exceptions for IPP.""" class IPPError(Exception): """Generic IPP exception.""" class IPPConnectionError(IPPError): """IPP connection exception.""" class IPPConnectionUpgradeRequired(IPPError): # noqa: N818 """IPP connection upgrade requested.""" class IPPParseError(IPPError): """IPP parse exception.""" class IPPResponseError(IPPError): """IPP response exception.""" class IPPVersionNotSupportedError(IPPError): """IPP version not supported.""" python-ipp-0.17.0/src/pyipp/ipp.py000066400000000000000000000173271470165767400170330ustar00rootroot00000000000000"""Asynchronous Python client for IPP.""" from __future__ import annotations import asyncio import sys from dataclasses import dataclass from importlib import metadata from socket import gaierror from struct import error as structerror from typing import TYPE_CHECKING, Any import aiohttp from deepmerge import always_merger from yarl import URL from .const import ( DEFAULT_CHARSET, DEFAULT_CHARSET_LANGUAGE, DEFAULT_PRINTER_ATTRIBUTES, DEFAULT_PROTO_VERSION, ) from .enums import IppOperation, IppStatus from .exceptions import ( IPPConnectionError, IPPConnectionUpgradeRequired, IPPError, IPPParseError, IPPResponseError, IPPVersionNotSupportedError, ) from .models import Printer from .parser import parse as parse_response from .serializer import encode_dict if TYPE_CHECKING: from collections.abc import Mapping if sys.version_info >= (3, 11): from asyncio import timeout else: from async_timeout import timeout VERSION = metadata.version(__package__) @dataclass class IPP: """Main class for handling connections with IPP servers.""" host: str base_path: str = "/ipp/print" password: str | None = None port: int = 631 request_timeout: int = 8 session: aiohttp.client.ClientSession | None = None tls: bool = False username: str | None = None verify_ssl: bool = False user_agent: str | None = None ipp_version: tuple[int, int] = DEFAULT_PROTO_VERSION _close_session: bool = False _printer_uri: str = "" _printer: Printer | None = None def __post_init__(self) -> None: """Initialize connection parameters.""" if self.host.startswith(("ipp://", "ipps://")): self._printer_uri = self.host printer_uri = URL(self.host) if printer_uri.host is not None: self.host = printer_uri.host if printer_uri.port is not None: self.port = printer_uri.port self.tls = printer_uri.scheme == "ipps" # pylint: disable=W0143 self.base_path = printer_uri.path else: self._printer_uri = self._build_printer_uri() if self.user_agent is None: self.user_agent = f"PythonIPP/{VERSION}" async def _request( self, uri: str = "", data: Any | None = None, params: Mapping[str, str] | None = None, ) -> bytes: """Handle a request to an IPP server.""" scheme = "https" if self.tls else "http" method = "POST" url = URL.build( scheme=scheme, host=self.host, port=self.port, path=self.base_path, ).join(URL(uri)) auth = None if self.username and self.password: auth = aiohttp.BasicAuth(self.username, self.password) headers = { "User-Agent": self.user_agent, "Content-Type": "application/ipp", "Accept": "application/ipp, text/plain, */*", } if self.session is None: self.session = aiohttp.ClientSession() self._close_session = True if isinstance(data, dict): data = encode_dict(data) try: async with timeout(self.request_timeout): response = await self.session.request( method, url, auth=auth, data=data, params=params, headers=headers, ssl=self.verify_ssl, ) except asyncio.TimeoutError as exc: raise IPPConnectionError( "Timeout occurred while connecting to IPP server.", ) from exc except (aiohttp.ClientError, gaierror) as exc: raise IPPConnectionError( "Error occurred while communicating with IPP server.", ) from exc if response.status == 426: raise IPPConnectionUpgradeRequired( "Connection upgrade required while communicating with IPP server.", {"upgrade": response.headers.get("Upgrade")}, ) if (response.status // 100) in [4, 5]: content = await response.read() response.close() raise IPPResponseError( f"HTTP {response.status}", # noqa: EM102 { "content-type": response.headers.get("Content-Type"), "message": content.decode("utf8"), "status-code": response.status, }, ) return await response.read() def _build_printer_uri(self) -> str: scheme = "ipps" if self.tls else "ipp" return URL.build( scheme=scheme, host=self.host, port=self.port, path=self.base_path, ).human_repr() def _message(self, operation: IppOperation, msg: dict[str, Any]) -> dict[str, Any]: """Build a request message to be sent to the server.""" base = { "version": self.ipp_version, "operation": operation, "request-id": None, # will get added by serializer if one isn't given "operation-attributes-tag": { # these are required to be in this order "attributes-charset": DEFAULT_CHARSET, "attributes-natural-language": DEFAULT_CHARSET_LANGUAGE, "printer-uri": self._printer_uri, "requesting-user-name": "PythonIPP", }, } return always_merger.merge(base, msg) # type: ignore # noqa: PGH003 async def execute( self, operation: IppOperation, message: dict[str, Any], ) -> dict[str, Any]: """Send a request message to the server.""" message = self._message(operation, message) response = await self._request(data=message) try: parsed = parse_response(response) except (structerror, Exception) as exc: # disable=broad-except raise IPPParseError from exc if parsed["status-code"] == IppStatus.ERROR_VERSION_NOT_SUPPORTED: raise IPPVersionNotSupportedError("IPP version not supported by server") if parsed["status-code"] not in range(0x200): raise IPPError( "Unexpected printer status code", {"status-code": parsed["status-code"]}, ) return parsed async def raw(self, operation: IppOperation, message: dict[str, Any]) -> bytes: """Send a request message to the server and return raw response.""" message = self._message(operation, message) return await self._request(data=message) async def close(self) -> None: """Close open client session.""" if self.session and self._close_session: await self.session.close() async def printer(self) -> Printer: """Get printer information from server.""" response_data = await self.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) parsed: dict[str, Any] = next(iter(response_data["printers"] or []), {}) try: if self._printer is None: self._printer = Printer.from_dict(parsed) else: self._printer.update_from_dict(parsed) except Exception as exc: raise IPPParseError from exc return self._printer async def __aenter__(self) -> IPP: # noqa: PYI034 """Async enter.""" return self async def __aexit__(self, *_exec_info: object) -> None: """Async exit.""" await self.close() python-ipp-0.17.0/src/pyipp/models.py000066400000000000000000000246111470165767400175200ustar00rootroot00000000000000"""Models for IPP.""" # pylint: disable=R0912,R0915 from __future__ import annotations from dataclasses import asdict, dataclass from datetime import datetime, timedelta, timezone from typing import Any from yarl import URL from .parser import parse_ieee1284_device_id, parse_make_and_model PRINTER_STATES = {3: "idle", 4: "printing", 5: "stopped"} @dataclass class Info: """Object holding information from IPP.""" name: str printer_name: str printer_uri_supported: list[str] uptime: int command_set: str | None = None location: str | None = None manufacturer: str | None = None model: str | None = None printer_info: str | None = None serial: str | None = None uuid: str | None = None version: str | None = None more_info: str | None = None @staticmethod def from_dict(data: dict[str, Any]) -> Info: """Return Info object from IPP response.""" cmd = None name = "IPP Printer" name_parts = [] serial = None _printer_name = printer_name = data.get("printer-name", "") make_model = data.get("printer-make-and-model", "") device_id = data.get("printer-device-id", "") uri_supported = data.get("printer-uri-supported", []) uuid = data.get("printer-uuid") if not isinstance(uri_supported, list): uri_supported = [str(uri_supported)] for uri in uri_supported: if (URL(uri).path.lstrip("/")) == _printer_name.lstrip("/"): _printer_name = "" break make, model = parse_make_and_model(make_model) parsed_device_id = parse_ieee1284_device_id(device_id) if parsed_device_id.get("MFG") is not None and len(parsed_device_id["MFG"]) > 0: make = parsed_device_id["MFG"] name_parts.append(make) if parsed_device_id.get("MDL") is not None and len(parsed_device_id["MDL"]) > 0: model = parsed_device_id["MDL"] name_parts.append(model) if parsed_device_id.get("CMD") is not None and len(parsed_device_id["CMD"]) > 0: cmd = parsed_device_id["CMD"] if parsed_device_id.get("SN") is not None and len(parsed_device_id["SN"]) > 0: serial = parsed_device_id["SN"] if len(make_model) > 0: name = make_model elif len(name_parts) == 2: name = " ".join(name_parts) elif len(_printer_name) > 0: name = _printer_name return Info( command_set=cmd, location=data.get("printer-location", ""), name=name, manufacturer=make, model=model, printer_name=printer_name, printer_info=data.get("printer-info"), printer_uri_supported=uri_supported, serial=serial, uptime=data.get("printer-up-time", 0), uuid=uuid[9:] if uuid else None, # strip urn:uuid: from uuid version=data.get("printer-firmware-string-version"), more_info=data.get("printer-more-info"), ) @dataclass class Marker: """Object holding marker (ink) info from IPP.""" marker_id: int marker_type: str name: str color: str level: int low_level: int high_level: int @dataclass class Uri: """Object holding URI info from IPP.""" uri: str authentication: str | None security: str | None @dataclass class State: """Object holding the IPP printer state.""" printer_state: str reasons: str | None message: str | None @staticmethod def from_dict(data: dict[str, Any]) -> State: """Return State object from IPP response.""" state = data.get("printer-state", 0) if (reasons := data.get("printer-state-reasons")) == "none": reasons = None return State( printer_state=PRINTER_STATES.get(state, state), reasons=reasons, message=data.get("printer-state-message"), ) @dataclass class Printer: """Object holding the IPP printer information.""" info: Info markers: list[Marker] state: State uris: list[Uri] booted_at: datetime def as_dict(self) -> dict[str, Any]: """Return dictionary version of this printer.""" return { "info": asdict(self.info), "state": asdict(self.state), "markers": [asdict(marker) for marker in self.markers], "uris": [asdict(uri) for uri in self.uris], "booted_at": self.booted_at, } def update_from_dict(self, data: dict[str, Any]) -> Printer: """Return updated Printer object from IPP response data.""" last_uptime = self.info.uptime self.info = Info.from_dict(data) self.markers = Printer.merge_marker_data(data) self.state = State.from_dict(data) self.uris = Printer.merge_uri_data(data) if self.info.uptime < last_uptime: self.booted_at = _utcnow() - timedelta(seconds=self.info.uptime) return self @staticmethod def from_dict(data: dict[str, Any]) -> Printer: """Return Printer object from IPP response data.""" info = Info.from_dict(data) return Printer( info=info, markers=Printer.merge_marker_data(data), state=State.from_dict(data), uris=Printer.merge_uri_data(data), booted_at=(_utcnow() - timedelta(seconds=info.uptime)), ) @staticmethod def merge_marker_data( # noqa: PLR0912, C901 data: dict[str, Any], ) -> list[Marker]: """Return Marker data from IPP response.""" marker_names = [] marker_colors = [] marker_levels = [] marker_types = [] marker_highs = [] marker_lows = [] if not data.get("marker-names"): return [] if isinstance(data["marker-names"], list): marker_names = data["marker-names"] elif isinstance(data["marker-names"], str): marker_names = [data["marker-names"]] if not (mlen := len(marker_names)): return [] for _ in range(mlen): marker_colors.append("") marker_levels.append(-2) marker_types.append("unknown") marker_highs.append(100) marker_lows.append(0) if isinstance(data.get("marker-colors"), list): for index, list_value in enumerate(data["marker-colors"]): if index < mlen: marker_colors[index] = list_value elif isinstance(data.get("marker-colors"), str) and mlen == 1: marker_colors[0] = data["marker-colors"] if isinstance(data.get("marker-levels"), list): for index, list_value in enumerate(data["marker-levels"]): if index < mlen: marker_levels[index] = list_value elif isinstance(data.get("marker-levels"), int) and mlen == 1: marker_levels[0] = data["marker-levels"] if isinstance(data.get("marker-high-levels"), list): for index, list_value in enumerate(data["marker-high-levels"]): if index < mlen: marker_highs[index] = list_value elif isinstance(data.get("marker-high-levels"), int) and mlen == 1: marker_highs[0] = data["marker-high-levels"] if isinstance(data.get("marker-low-levels"), list): for index, list_value in enumerate(data["marker-low-levels"]): if index < mlen: marker_lows[index] = list_value elif isinstance(data.get("marker-low-levels"), int) and mlen == 1: marker_lows[0] = data["marker-low-levels"] if isinstance(data.get("marker-types"), list): for index, list_value in enumerate(data["marker-types"]): if index < mlen: marker_types[index] = list_value elif isinstance(data.get("marker-types"), str) and mlen == 1: marker_types[0] = data["marker-types"] markers = [ Marker( marker_id=marker_id, marker_type=marker_types[marker_id], name=marker_names[marker_id], color=marker_colors[marker_id], level=marker_levels[marker_id], high_level=marker_highs[marker_id], low_level=marker_lows[marker_id], ) for marker_id in range(mlen) ] markers.sort(key=lambda x: x.name) return markers @staticmethod def merge_uri_data(data: dict[str, Any]) -> list[Uri]: # noqa: PLR0912 """Return URI data from IPP response.""" _uris: list[str] = [] auth: list[str | None] = [] security: list[str | None] = [] if not data.get("printer-uri-supported"): return [] if isinstance(data["printer-uri-supported"], list): _uris = data["printer-uri-supported"] elif isinstance(data["printer-uri-supported"], str): _uris = [data["printer-uri-supported"]] if not (ulen := len(_uris)): return [] for _ in range(ulen): auth.append(None) security.append(None) if isinstance(data.get("uri-authentication-supported"), list): for k, list_value in enumerate(data["uri-authentication-supported"]): if k < ulen: auth[k] = _str_or_none(list_value) elif isinstance(data.get("uri-authentication-supported"), str) and ulen == 1: auth[0] = _str_or_none(data["uri-authentication-supported"]) if isinstance(data.get("uri-security-supported"), list): for k, list_value in enumerate(data["uri-security-supported"]): if k < ulen: security[k] = _str_or_none(list_value) elif isinstance(data.get("uri-security-supported"), str) and ulen == 1: security[0] = _str_or_none(data["uri-security-supported"]) return [ Uri( uri=_uris[uri_id], authentication=auth[uri_id], security=security[uri_id], ) for uri_id in range(ulen) ] def _utcnow() -> datetime: """Return the current date and time in UTC.""" return datetime.now(tz=timezone.utc) def _str_or_none(value: str) -> str | None: """Return string while handling string representations of None.""" if value == "none": return None return value python-ipp-0.17.0/src/pyipp/parser.py000066400000000000000000000300001470165767400175160ustar00rootroot00000000000000"""Response Parser for IPP.""" from __future__ import annotations import logging import struct from datetime import datetime, timedelta, timezone from typing import Any from .enums import ATTRIBUTE_ENUM_MAP, IppTag from .exceptions import IPPParseError _LOGGER = logging.getLogger(__name__) def parse_ieee1284_device_id(device_id: str) -> dict[str, str]: """Parse IEEE 1284 device id for common device info.""" if not device_id: return {} device_id = device_id.strip(";") device_info: dict[str, str] = {} for pair in device_id.split(";"): key, value = pair.split(":", 2) device_info[key.strip()] = value.strip() if not device_info.get("MANUFACTURER") and device_info.get("MFG"): device_info["MANUFACTURER"] = device_info["MFG"] if not device_info.get("MODEL") and device_info.get("MDL"): device_info["MODEL"] = device_info["MDL"] if not device_info.get("COMMAND SET") and device_info.get("CMD"): device_info["COMMAND SET"] = device_info["CMD"] return device_info def parse_collection(data: bytes, offset: int) -> tuple[dict[str, Any], int]: """Parse member attributes from IPP collection.""" collection_data: dict[str, Any] = {} member_name: str = "" _LOGGER.debug("#BeginCollectionOffset: %s", offset) while struct.unpack_from("b", data, offset)[0] != IppTag.END_COLLECTION.value: attribute, next_attr_offset = parse_attribute(data, offset, member_name) if attribute["tag"] == IppTag.MEMBER_NAME.value: member_name = attribute["value"] elif member_name: collection_data[member_name] = attribute["value"] offset = next_attr_offset _LOGGER.debug("#EndCollectionOffset: %s", offset) # skip over end of collection marker _, next_attr_offset = parse_attribute(data, offset) return collection_data, next_attr_offset # pylint: disable=R0912,R0915 def parse_attribute( # noqa: PLR0912, PLR0915 data: bytes, offset: int, prev_attr_name: str = "", ) -> tuple[dict[str, Any], int]: """Parse attribute from IPP data. 1 byte: Tag - b 2 byte: Name Length - h N bytes: Name - direct access 2 byte: Value Length -h N bytes: Value - direct access """ _LOGGER.debug("Parsing Attribute at offset %s", offset) attribute = {"tag": struct.unpack_from(">b", data, offset)[0]} offset += 1 attribute["name-length"] = struct.unpack_from(">h", data, offset)[0] offset += 2 offset_length = offset + attribute["name-length"] attribute["name"] = data[offset:offset_length].decode("utf-8") offset += attribute["name-length"] resolved_attr_name = attribute["name"] or prev_attr_name if attribute["name"]: _LOGGER.debug( "Attribute Name: %s (%s)", attribute["name"], hex(attribute["tag"]), ) else: _LOGGER.debug("Attribute Tag: %s", hex(attribute["tag"])) attribute["value-length"] = struct.unpack_from(">h", data, offset)[0] offset += 2 _LOGGER.debug("Attribute Value Offset: %s", offset) _LOGGER.debug("Attribute Value Length: %s", attribute["value-length"]) if attribute["tag"] in (IppTag.ENUM.value, IppTag.INTEGER.value): attribute["value"] = struct.unpack_from(">i", data, offset)[0] if ( attribute["tag"] == IppTag.ENUM.value and resolved_attr_name in ATTRIBUTE_ENUM_MAP ): enum_class = ATTRIBUTE_ENUM_MAP[resolved_attr_name] attribute["value"] = enum_class(attribute["value"]) offset += 4 _LOGGER.debug("Attribute Value: %s", attribute["value"]) elif attribute["tag"] == IppTag.BOOLEAN.value: attribute["value"] = struct.unpack_from(">?", data, offset)[0] offset += 1 _LOGGER.debug("Attribute Value: %s", attribute["value"]) elif attribute["tag"] == IppTag.DATE.value: if attribute["value-length"] != 11: raise IPPParseError( f'Invalid DATE size {attribute["value-length"]}', # noqa: EM102 ) raw_date = dict( zip( ( "year", "month", "day", "hour", "minute", "second", "decisecond", "tz_dir", "tz_hour", "tz_minute", ), struct.unpack_from(">hbbbbbbcbb", data, offset), ), ) raw_date["microsecond"] = raw_date.pop("decisecond") * 100_000 raw_date["tzinfo"] = timezone( {b"+": 1, b"-": -1}[raw_date.pop("tz_dir")] * timedelta( hours=raw_date.pop("tz_hour"), minutes=raw_date.pop("tz_minute"), ), ) attribute["value"] = datetime(**raw_date) # noqa: DTZ001 offset += attribute["value-length"] _LOGGER.debug("Attribute Value: %s", attribute["value"]) elif attribute["tag"] == IppTag.RESERVED_STRING.value: if attribute["value-length"] > 0: offset_length = offset + attribute["value-length"] attribute["value"] = data[offset:offset_length].decode("utf-8") offset += attribute["value-length"] else: attribute["value"] = None _LOGGER.debug("Attribute Value: %s", attribute["value"]) elif attribute["tag"] == IppTag.RANGE.value: attribute["value"] = [] for i in range(int(attribute["value-length"] / 4)): attribute["value"].append(struct.unpack_from(">i", data, offset + i * 4)[0]) offset += attribute["value-length"] _LOGGER.debug("Attribute Value: %s", attribute["value"]) elif attribute["tag"] == IppTag.RESOLUTION.value: attribute["value"] = struct.unpack_from(">iib", data, offset) offset += attribute["value-length"] elif attribute["tag"] in (IppTag.TEXT_LANG.value, IppTag.NAME_LANG.value): attribute["language-length"] = struct.unpack_from(">h", data, offset)[0] offset += 2 offset_length = offset + attribute["language-length"] attribute["language"] = data[offset:offset_length].decode("utf-8") offset += attribute["language-length"] _LOGGER.debug("Attribute Language: %s", attribute["language"]) attribute["text-length"] = struct.unpack_from(">h", data, offset)[0] offset += 2 _LOGGER.debug("Attribute Text Length: %s", attribute["text-length"]) offset_length = offset + attribute["text-length"] attribute["value"] = data[offset:offset_length].decode("utf-8") offset += attribute["text-length"] _LOGGER.debug("Attribute Value: %s", attribute["value"]) elif attribute["tag"] == IppTag.BEGIN_COLLECTION.value: offset += attribute["value-length"] collection, new_offset = parse_collection(data, offset) attribute["value"] = collection offset = new_offset _LOGGER.debug("Attribute Value: %s", attribute["value"]) elif attribute["tag"] == IppTag.END_COLLECTION.value: offset += attribute["value-length"] else: offset_length = offset + attribute["value-length"] attribute["value"] = data[offset:offset_length] _LOGGER.debug("Attribute Bytes: %s", attribute["value"]) attribute["value"] = attribute["value"].decode("utf-8", "ignore") offset += attribute["value-length"] _LOGGER.debug("Attribute Value: %s", attribute["value"]) return attribute, offset # pylint: disable=R0912,R0915 def parse( # noqa: PLR0912, PLR0915 raw_data: bytes, contains_data: bool = False, # noqa: FBT001, FBT002 ) -> dict[str, Any]: r"""Parse raw IPP data. 1 byte: Protocol Major Version - b 1 byte: Protocol Minor Version - b 2 byte: Operation ID/Status Code - h 4 byte: Request ID - i 1 byte: Operation Attribute Byte (\0x01) N Mal: Attributes 1 byte: Attribute End Byte (\0x03) """ data: dict[str, Any] = {} offset = 0 _LOGGER.debug("Parsing IPP Data") data["version"] = struct.unpack_from(">bb", raw_data, offset) offset += 2 _LOGGER.debug("IPP Version: %s", data["version"]) data["status-code"] = struct.unpack_from(">h", raw_data, offset)[0] offset += 2 _LOGGER.debug("IPP Status Code: %s", data["status-code"]) data["request-id"] = struct.unpack_from(">i", raw_data, offset)[0] offset += 4 data["operation-attributes"] = [] data["unsupported-attributes"] = [] data["jobs"] = [] data["printers"] = [] data["data"] = b"" attribute_key = "" previous_attribute_name = "" tmp_data: dict[str, Any] = {} while struct.unpack_from("b", raw_data, offset)[0] != IppTag.END.value: # check for operation, job or printer attribute start byte # if tmp data and attribute key is set, another operation was sent # add it and reset tmp data if struct.unpack_from("b", raw_data, offset)[0] == IppTag.OPERATION.value: if tmp_data and attribute_key: data[attribute_key].append(tmp_data) tmp_data = {} attribute_key = "operation-attributes" offset += 1 elif struct.unpack_from("b", raw_data, offset)[0] == IppTag.JOB.value: if tmp_data and attribute_key: data[attribute_key].append(tmp_data) tmp_data = {} attribute_key = "jobs" offset += 1 elif struct.unpack_from("b", raw_data, offset)[0] == IppTag.PRINTER.value: if tmp_data and attribute_key: data[attribute_key].append(tmp_data) tmp_data = {} attribute_key = "printers" offset += 1 elif ( struct.unpack_from("b", raw_data, offset)[0] == IppTag.UNSUPPORTED_GROUP.value ): if tmp_data and attribute_key: data[attribute_key].append(tmp_data) tmp_data = {} attribute_key = "unsupported-attributes" offset += 1 attribute, new_offset = parse_attribute( raw_data, offset, previous_attribute_name, ) # if attribute has a name -> add it # if attribute doesn't have a name -> it is part of an array if attribute["name"]: tmp_data[attribute["name"]] = attribute["value"] previous_attribute_name = attribute["name"] elif previous_attribute_name: # check if attribute is already an array # else convert it to an array if isinstance(tmp_data[previous_attribute_name], list): tmp_data[previous_attribute_name].append(attribute["value"]) else: tmp_value = tmp_data[previous_attribute_name] tmp_data[previous_attribute_name] = [tmp_value, attribute["value"]] offset = new_offset if isinstance(data[attribute_key], list): data[attribute_key].append(tmp_data) if isinstance(data["operation-attributes"], list): data["operation-attributes"] = data["operation-attributes"][0] if contains_data: offset_start = offset + 1 data["data"] = raw_data[offset_start:] return data def parse_make_and_model(make_and_model: str) -> tuple[str, str]: """Parse make and model for separate device make and model.""" if not (make_and_model := make_and_model.strip()): return ("Unknown", "Unknown") make = "Unknown" model = "Unknown" found_make = False known_makes = [ "brother", "canon", "epson", "kyocera", "hp", "xerox", ] test_against = make_and_model.lower() for known_make in known_makes: if test_against.startswith(known_make): found_make = True mlen = len(known_make) make = make_and_model[:mlen] model = make_and_model[mlen:].strip() break if not found_make: split = make_and_model.split(None, 1) make = split[0] if len(split) == 2: model = split[1].strip() return (make, model) python-ipp-0.17.0/src/pyipp/py.typed000066400000000000000000000000001470165767400173440ustar00rootroot00000000000000python-ipp-0.17.0/src/pyipp/serializer.py000066400000000000000000000060541470165767400204070ustar00rootroot00000000000000"""Data Serializer for IPP.""" from __future__ import annotations import logging import random import struct from typing import Any from .const import DEFAULT_PROTO_VERSION from .enums import IppTag from .tags import ATTRIBUTE_TAG_MAP _LOGGER = logging.getLogger(__name__) def construct_attribute_values(tag: IppTag, value: Any) -> bytes: """Serialize the attribute values into IPP format.""" byte_str = b"" if tag in (IppTag.INTEGER, IppTag.ENUM): byte_str += struct.pack(">h", 4) byte_str += struct.pack(">i", value) elif tag == IppTag.BOOLEAN: byte_str += struct.pack(">h", 1) byte_str += struct.pack(">?", value) else: encoded_value = value.encode("utf-8") byte_str += struct.pack(">h", len(encoded_value)) byte_str += encoded_value return byte_str def construct_attribute(name: str, value: Any, tag: IppTag | None = None) -> bytes: """Serialize the attribute into IPP format.""" byte_str = b"" if not tag and not (tag := ATTRIBUTE_TAG_MAP.get(name, None)): _LOGGER.debug("Unknown IppTag for %s", name) return byte_str if isinstance(value, (list, tuple, set)): for index, list_value in enumerate(value): byte_str += struct.pack(">b", tag.value) if index == 0: byte_str += struct.pack(">h", len(name)) byte_str += name.encode("utf-8") else: byte_str += struct.pack(">h", 0) byte_str += construct_attribute_values(tag, list_value) else: byte_str = struct.pack(">b", tag.value) byte_str += struct.pack(">h", len(name)) byte_str += name.encode("utf-8") byte_str += construct_attribute_values(tag, value) return byte_str def encode_dict(data: dict[str, Any]) -> bytes: """Serialize a dictionary of data into IPP format.""" version = data["version"] or DEFAULT_PROTO_VERSION operation = data["operation"] if (request_id := data.get("request-id")) is None: request_id = random.choice(range(10000, 99999)) # nosec # noqa: S311 encoded = struct.pack(">bb", *version) encoded += struct.pack(">h", operation.value) encoded += struct.pack(">i", request_id) encoded += struct.pack(">b", IppTag.OPERATION.value) if isinstance(data.get("operation-attributes-tag"), dict): for attr, value in data["operation-attributes-tag"].items(): encoded += construct_attribute(attr, value) if isinstance(data.get("job-attributes-tag"), dict): encoded += struct.pack(">b", IppTag.JOB.value) for attr, value in data["job-attributes-tag"].items(): encoded += construct_attribute(attr, value) if isinstance(data.get("printer-attributes-tag"), dict): encoded += struct.pack(">b", IppTag.PRINTER.value) for attr, value in data["printer-attributes-tag"].items(): encoded += construct_attribute(attr, value) encoded += struct.pack(">b", IppTag.END.value) if "data" in data: encoded += data["data"] return encoded python-ipp-0.17.0/src/pyipp/tags.py000066400000000000000000000044201470165767400171670ustar00rootroot00000000000000"""Attribute Tags for IPP.""" from .enums import IppTag ATTRIBUTE_TAG_MAP = { "attributes-charset": IppTag.CHARSET, "attributes-natural-language": IppTag.LANGUAGE, "document-number": IppTag.INTEGER, "printer-uri": IppTag.URI, "requesting-user-name": IppTag.NAME, "job-id": IppTag.INTEGER, "document-name": IppTag.NAME, "job-name": IppTag.NAME, "document-format": IppTag.MIME_TYPE, "last-document": IppTag.BOOLEAN, "copies": IppTag.INTEGER, "job-cancel-after": IppTag.INTEGER, "job-hold-until": IppTag.KEYWORD, "job-k-octets": IppTag.INTEGER, "job-impressions-completed": IppTag.INTEGER, "job-media-sheets-completed": IppTag.INTEGER, "job-originating-host-name": IppTag.NAME, "job-originating-user-name": IppTag.NAME, "job-printer-state-message": IppTag.TEXT, "job-printer-state-reasons": IppTag.KEYWORD, "job-priority": IppTag.INTEGER, "number-up": IppTag.INTEGER, "job-sheets": IppTag.NAME, "job-uri": IppTag.URI, "job-state": IppTag.ENUM, "job-state-reasons": IppTag.KEYWORD, "job-uuid": IppTag.URI, "requested-attributes": IppTag.KEYWORD, "member-uris": IppTag.URI, "operations-supported": IppTag.ENUM, "ppd-name": IppTag.NAME, "printer-state-reason": IppTag.KEYWORD, "printer-is-shared": IppTag.BOOLEAN, "printer-error-policy": IppTag.NAME, "printer-geo-location": IppTag.URI, "printer-info": IppTag.TEXT, "printer-organization": IppTag.TEXT, "printer-organizational-unit": IppTag.TEXT, "which-jobs": IppTag.KEYWORD, "my-jobs": IppTag.BOOLEAN, "purge-jobs": IppTag.BOOLEAN, "hold-job-until": IppTag.KEYWORD, "job-printer-uri": IppTag.URI, "printer-location": IppTag.TEXT, "printer-state": IppTag.ENUM, "printer-state-reasons": IppTag.KEYWORD, "printer-up-time": IppTag.INTEGER, "printer-uri-supported": IppTag.URI, "document-state": IppTag.ENUM, "device-uri": IppTag.URI, "ipp-attribute-fidelity": IppTag.BOOLEAN, "finishings": IppTag.ENUM, "orientation-requested": IppTag.ENUM, "print-quality": IppTag.ENUM, "time-at-creation": IppTag.INTEGER, "time-at-processing": IppTag.INTEGER, "time-at-completed": IppTag.INTEGER, "media": IppTag.NAME, "center-of-pixel": IppTag.BOOLEAN, } python-ipp-0.17.0/tests/000077500000000000000000000000001470165767400150715ustar00rootroot00000000000000python-ipp-0.17.0/tests/__init__.py000066400000000000000000000157171470165767400172150ustar00rootroot00000000000000"""Tests for IPP.""" from __future__ import annotations import os from typing import Any DEFAULT_PRINTER_HOST = "epson761251.local" DEFAULT_PRINTER_PORT = 631 DEFAULT_PRINTER_PATH = "/ipp/print" DEFAULT_PRINTER_URI = ( f"ipp://{DEFAULT_PRINTER_HOST}:{DEFAULT_PRINTER_PORT}{DEFAULT_PRINTER_PATH}" ) # COMMON (NOT DOCUMENTED) COMMON_PRINTER_ATTRS: dict[str, Any] = { "marker-colors": "", "marker-high-levels": "", "marker-levels": "", "marker-low-levels": "", "marker-names": "", "marker-types": "", } # RFC 2911 - IPP 1.1 RFC2911_PRINTER_ATTRS: dict[str, Any] = { "attributes-charset": "", "attributes-natural-language": "", "charset-configured": "", "charset-supported": "", "color-supported": "", "compression-supported": "", "copies-default": "", "copies-supported": "", "document-format-default": "", "document-format-supported": "", "finishings-default": "", "finishings-supported": "", "generated-natural-language-supported": "", "ipp-versions-supported": "", "media-default": "", "media-ready": "", "media-supported": "", "operations-supported": "", "orientation-requested-default": "", "orientation-requested-supported": "", "output-bin-default": "", "output-bin-supported": "", "pages-per-minute": "", "pages-per-minute-color": "", "pdl-override-supported": "", "print-quality-default": "", "print-quality-supported": "", "printer-alert": "", "printer-alert-description": "", "printer-device-id": "", "printer-info": "", "printer-is-accepting-jobs": "", "printer-location": "", "printer-make-and-model": "", # optional "printer-more-info": "", "printer-name": "", "printer-resolution-default": "", "printer-state": "", "printer-state-reasons": "", "printer-up-time": 0, "printer-uri": "", "printer-uri-supported": "", "queued-job-count": "", "request-id": "", "requested-attributes": "", "requesting-user-name": "", "sides-default": "", "sides-supported": "", "status-code": "", "status-message": "", "uri-authentication-supported": "", "uri-security-supported": "", "version-number": "", } # RFC 3995 - Notifications RFC3995_PRINTER_ATTRS: dict[str, Any] = { "notify-events-default": "", "notify-events-supported": "", "notify-lease-duration-default": "", "notify-lease-duration-supported": "", "notify-max-events-supported": "", "notify-pull-method-supported": "", "printer-state-change-date-time": "", "printer-state-change-time": "", } # PWG 5100.1 - Finishings PWG51001_PRINTER_ATTRS: dict[str, Any] = { "finishings-col-default": "", "finishings-col-ready": "", } # PWG 5100.2 - Output Bins PWG51002_PRINTER_ATTRS: dict[str, Any] = { "output-bin-default": "", "output-bin-supported": "", } # PWG 5100.3 PWG51003_PRINTER_ATTRS: dict[str, Any] = { "job-account-id-default": "", "job-account-id-supported": "", "job-accounting-user-id-default": "", "job-accounting-user-id-supported": "", "media-col-default": "", "media-col-ready": "", "media-col-supported": "", "media-type-supported": "", } # PWG 5100.4 PWG51004_PRINTER_ATTRS: dict[str, Any] = { "pwg-raster-document-resolution-supported": "", "pwg-raster-document-sheet-back": "", "pwg-raster-document-type-supported": "", } # PWG 5100.6 - Page Overrides PWG51006_PRINTER_ATTRS: dict[str, Any] = { "overrides-supported": "", } # PWG 5100.7 PWG51007_PRINTER_ATTRS: dict[str, Any] = { "print-content-optimize-default": "", "print-content-optimize-supported": "", } # PWG 5100.9 - Alerts PWG51009_PRINTER_ATTRS: dict[str, Any] = { "printer-alert": "", "printer-alert-description": "", } # PWG 5100.11 - Extended Options Set 2 PWG510011_PRINTER_ATTRS: dict[str, Any] = { "feed-orientation-default": "", "feed-orientation-supported": "", "job-creation-attributes-supported": "", "job-ids-supported": "", "job-password-supported": "", "job-password-encryption-supported": "", "media-col-database": "", "which-jobs-supported": "", } # PWG 5100.13 - Extended Options Sst 3 PWG510013_PRINTER_ATTRS: dict[str, Any] = { "document-password-supported": "", "identify-actions-default": "", "identify-actions-supported": "", "ipp-features-supported": "", "job-constraints-supported": "", "job-preferred-attributes-supported": "", "job-resolvers-supported": "", "media-bottom-margin-supported": "", "media-col-database.media-source-properties": "", "media-col-ready.media-source-properties": "", "media-left-margin-supported": "", "media-right-margin-supported": "", "media-source-supported": "", "media-top-margin-supported": "", "multiple-operation-timeout-action": "", "print-color-mode-default": "", "print-color-mode-supported": "", "print-rendering-intent-default": "", "print-rendering-intent-supported": "", "printer-charge-info": "", "printer-charge-info-url": "", "printer-config-change-date-time": "", "printer-config-change-time": "", "printer-geo-location": "", "printer-get-attributes-supported": "", "printer-icc-profiles": "", "printer-icons": "", "printer-mandatory-job-attributes": "", "printer-organization": "", "printer-organizational-unit": "", "printer-supply": "", "printer-supply-description": "", "printer-supply-info-uri": "", "printer-uuid": "", "which-jobs-supported": "", } # PWG 5100.14 - IPP Everywhere v1 IPPE10_PRINTER_ATTRS: dict[str, Any] = { **RFC2911_PRINTER_ATTRS, # required **RFC3995_PRINTER_ATTRS, **PWG51002_PRINTER_ATTRS, **PWG51003_PRINTER_ATTRS, **PWG51004_PRINTER_ATTRS, **PWG51006_PRINTER_ATTRS, **PWG51007_PRINTER_ATTRS, **PWG51009_PRINTER_ATTRS, **PWG510011_PRINTER_ATTRS, **PWG510013_PRINTER_ATTRS, **COMMON_PRINTER_ATTRS, } # PWG 5100.12 - IPP 2.0 IPP20_PRINTER_ATTRS: dict[str, Any] = { **RFC2911_PRINTER_ATTRS, # required **RFC3995_PRINTER_ATTRS, # optional **PWG51001_PRINTER_ATTRS, # required **PWG51002_PRINTER_ATTRS, # required **PWG51003_PRINTER_ATTRS, # optional **PWG51004_PRINTER_ATTRS, # optional **PWG51006_PRINTER_ATTRS, # optional **PWG51007_PRINTER_ATTRS, # optional **PWG51009_PRINTER_ATTRS, # recommended **PWG510011_PRINTER_ATTRS, # optional **COMMON_PRINTER_ATTRS, } def load_fixture(filename: str) -> str: """Load a fixture.""" path = os.path.join( # noqa: PTH118 os.path.dirname(__file__), # noqa: PTH120 "fixtures", filename, ) with open(path, encoding="utf-8") as fptr: # noqa: PTH123 return fptr.read() def load_fixture_binary(filename: str) -> bytes: """Load a binary fixture.""" path = os.path.join( # noqa: PTH118 os.path.dirname(__file__), # noqa: PTH120 "fixtures", filename, ) with open(path, "rb") as fptr: # noqa: PTH123 return fptr.read() python-ipp-0.17.0/tests/__snapshots__/000077500000000000000000000000001470165767400177075ustar00rootroot00000000000000python-ipp-0.17.0/tests/__snapshots__/test_parser.ambr000066400000000000000000000701621470165767400231130ustar00rootroot00000000000000# serializer version: 1 # name: test_parse_brother_mfcj5320dw dict({ 'data': b'', 'jobs': list([ ]), 'operation-attributes': dict({ 'attributes-charset': 'utf-8', 'attributes-natural-language': 'de', }), 'printers': list([ dict({ 'charset-configured': 'utf-8', 'charset-supported': 'utf-8', 'color-supported': True, 'compression-supported': 'none', 'copies-default': 1, 'copies-supported': list([ 1, 99, ]), 'document-format-default': 'application/octet-stream', 'document-format-supported': list([ 'application/octet-stream', 'application/vnd.brother-hbp', 'image/pwg-raster', 'image/urf', 'image/jpeg', ]), 'finishings-default': , 'finishings-supported': , 'generated-natural-language-supported': 'de', 'identify-actions-default': list([ 'flash', 'sound', ]), 'identify-actions-supported': list([ 'flash', 'sound', ]), 'ipp-features-supported': list([ 'airprint-1.3', 'faxout', 'wfds-print-1.0', ]), 'ipp-versions-supported': list([ '1.0', '1.1', '2.0', ]), 'job-creation-attributes-supported': list([ 'copies', 'finishings', 'ipp-attribute-fidelity', 'job-name', 'media', 'media-col', 'orientation-requested', 'output-bin', 'output-mode', 'print-quality', 'printer-resolution', 'requesting-user-name', 'sides', 'print-color-mode', ]), 'job-impressions-supported': list([ 1, 999, ]), 'jpeg-k-octets-supported': list([ 0, 12288, ]), 'jpeg-x-dimension-supported': list([ 0, 8192, ]), 'jpeg-y-dimension-supported': list([ 1, 20000, ]), 'landscape-orientation-requested-preferred': 5, 'marker-colors': list([ '#FF00FF', '#00FFFF', '#FFFF00', '#000000', ]), 'marker-high-levels': list([ 100, 100, 100, 100, ]), 'marker-levels': list([ 11, 9, 45, 11, ]), 'marker-low-levels': list([ 18, 18, 18, 18, ]), 'marker-names': list([ 'M', 'C', 'Y', 'BK', ]), 'marker-types': list([ 'ink-cartridge', 'ink-cartridge', 'ink-cartridge', 'ink-cartridge', ]), 'media-bottom-margin-supported': list([ 300, 0, 2200, 2200, 1200, ]), 'media-col-default': dict({ 'media-bottom-margin': 300, 'media-left-margin': 300, 'media-right-margin': 300, 'media-size': dict({ 'x-dimension': 21000, 'y-dimension': 29700, }), 'media-source': 'main', 'media-source-properties': dict({ 'media-source-feed-direction': 'long-edge-first', 'media-source-feed-orientation': , }), 'media-top-margin': 300, 'media-type': 'stationery', }), 'media-col-ready': list([ dict({ 'media-bottom-margin': 300, 'media-left-margin': 300, 'media-right-margin': 300, 'media-size': dict({ 'x-dimension': 21000, 'y-dimension': 29700, }), 'media-source': 'main', 'media-source-properties': dict({ 'media-source-feed-direction': 'long-edge-first', 'media-source-feed-orientation': , }), 'media-top-margin': 300, 'media-type': 'stationery', }), dict({ 'media-bottom-margin': 0, 'media-left-margin': 0, 'media-right-margin': 0, 'media-size': dict({ 'x-dimension': 21000, 'y-dimension': 29700, }), 'media-source': 'main', 'media-source-properties': dict({ 'media-source-feed-direction': 'long-edge-first', 'media-source-feed-orientation': , }), 'media-top-margin': 0, 'media-type': 'stationery', }), ]), 'media-col-supported': list([ 'media-type', 'media-size', 'media-top-margin', 'media-left-margin', 'media-right-margin', 'media-bottom-margin', 'media-source', ]), 'media-default': 'iso_a4_210x297mm', 'media-left-margin-supported': list([ 300, 0, 300, 300, 300, ]), 'media-ready': 'iso_a4_210x297mm', 'media-right-margin-supported': list([ 300, 0, 300, 300, 300, ]), 'media-size-supported': list([ dict({ 'x-dimension': 21000, 'y-dimension': 29700, }), dict({ 'x-dimension': 21590, 'y-dimension': 27940, }), dict({ 'x-dimension': 18415, 'y-dimension': 26670, }), dict({ 'x-dimension': 14800, 'y-dimension': 21000, }), dict({ 'x-dimension': 10500, 'y-dimension': 14800, }), dict({ 'x-dimension': 10160, 'y-dimension': 15240, }), dict({ 'x-dimension': 12700, 'y-dimension': 20320, }), dict({ 'x-dimension': 8890, 'y-dimension': 12700, }), dict({ 'x-dimension': 12700, 'y-dimension': 17780, }), dict({ 'x-dimension': 10477, 'y-dimension': 24130, }), dict({ 'x-dimension': 11000, 'y-dimension': 22000, }), dict({ 'x-dimension': 9842, 'y-dimension': 19050, }), dict({ 'x-dimension': 21590, 'y-dimension': 35560, }), dict({ 'x-dimension': 16200, 'y-dimension': 22900, }), dict({ 'x-dimension': 21590, 'y-dimension': 33020, }), dict({ 'x-dimension': 29700, 'y-dimension': 42000, }), dict({ 'x-dimension': 27940, 'y-dimension': 43180, }), dict({ 'x-dimension': list([ 8890, 28700, ]), 'y-dimension': list([ 12700, 43180, ]), }), ]), 'media-source-supported': list([ 'auto', 'main', ]), 'media-supported': list([ 'iso_a4_210x297mm', 'na_letter_8.5x11in', 'na_executive_7.25x10.5in', 'iso_a5_148x210mm', 'iso_a6_105x148mm', 'na_index-4x6_4x6in', 'na_index-5x8_5x8in', 'oe_photo-l_3.5x5in', 'na_5x7_5x7in', 'na_number-10_4.125x9.5in', 'iso_dl_110x220mm', 'na_monarch_3.875x7.5in', 'na_legal_8.5x14in', 'iso_c5_162x229mm', 'na_foolscap_8.5x13in', 'iso_a3_297x420mm', 'na_ledger_11x17in', 'custom_min_88.9x127mm', 'custom_max_287x431.8mm', ]), 'media-top-margin-supported': list([ 300, 0, 1200, 2200, 2200, ]), 'media-type-supported': list([ 'stationery', 'stationery-inkjet', 'photographic-glossy', ]), 'multiple-document-jobs-supported': False, 'multiple-operation-time-out': 150, 'natural-language-configured': 'de', 'operations-supported': list([ , , , , , , , , , ]), 'orientation-requested-default': , 'orientation-requested-supported': list([ , , ]), 'output-bin-default': 'face-up', 'output-bin-supported': 'face-up', 'output-mode-default': 'color', 'output-mode-supported': list([ 'color', 'auto', 'monochrome', ]), 'pages-per-minute': 35, 'pages-per-minute-color': 27, 'pdf-versions-supported': 'none', 'pdl-override-supported': 'attempted', 'print-color-mode-default': 'color', 'print-color-mode-supported': list([ 'auto', 'color', 'monochrome', ]), 'print-content-optimize-default': 'auto', 'print-content-optimize-supported': 'auto', 'print-quality-default': , 'print-quality-supported': list([ , , ]), 'print-scaling-default': 'auto', 'print-scaling-supported': list([ 'auto', 'auto-fit', 'fill', 'fit', 'none', ]), 'printer-device-id': 'MFG:Brother;CMD:HBP,BRPJL,URF;MDL:MFC-J5320DW;CLS:PRINTER;CID:Brother Generic Jpeg Type1;URF:SRGB24,W8,CP1,IS1,MT1-8-11,OB9,PQ4-5,RS200-300,OFU0,V1.3,DM4;', 'printer-dns-sd-name': 'Brother MFC-J5320DW', 'printer-geo-location': '', 'printer-icons': list([ 'http://192.168.11.20/ipp/printer-icons-128.png', 'http://192.168.11.20/ipp/printer-icons-512.png', ]), 'printer-info': 'Brother MFC-J5320DW', 'printer-is-accepting-jobs': True, 'printer-kind': list([ 'document', 'envelope', 'photo', ]), 'printer-location': '', 'printer-make-and-model': 'Brother MFC-J5320DW', 'printer-more-info': 'http://192.168.11.20/net/net/airprint.html', 'printer-name': 'brother-printer', 'printer-resolution-default': tuple( 300, 300, 3, ), 'printer-resolution-supported': tuple( 300, 300, 3, ), 'printer-state': , 'printer-state-reasons': 'marker-supply-low-warning', 'printer-supply-info-uri': 'http://192.168.11.20/general/status.html', 'printer-up-time': 1326249, 'printer-uri-supported': 'ipp://192.168.11.20/ipp/print', 'printer-uuid': 'urn:uuid:e3248000-80ce-11db-8000-30055ce13be2', 'pwg-raster-document-resolution-supported': tuple( 300, 300, 3, ), 'pwg-raster-document-sheet-back-supported': 'Rotated', 'pwg-raster-document-type-supported': list([ 'srgb_8', 'sgray_8', ]), 'queued-job-count': 0, 'sides-default': 'one-sided', 'sides-supported': list([ 'one-sided', 'two-sided-long-edge', 'two-sided-short-edge', ]), 'urf-supported': list([ 'SRGB24', 'W8', 'CP1', 'IS1', 'MT1-8-11', 'OB9', 'PQ4-5', 'RS200-300', 'OFU0', 'V1.3', 'DM4', ]), 'uri-authentication-supported': 'none', 'uri-security-supported': 'none', }), ]), 'request-id': 93687, 'status-code': 0, 'unsupported-attributes': list([ ]), 'version': tuple( 2, 0, ), }) # --- # name: test_parse_epson_xp6000 dict({ 'data': b'', 'jobs': list([ ]), 'operation-attributes': dict({ 'attributes-charset': 'utf-8', 'attributes-natural-language': 'en', }), 'printers': list([ dict({ 'charset-configured': 'utf-8', 'charset-supported': 'utf-8', 'color-supported': True, 'compression-supported': list([ 'none', 'gzip', ]), 'copies-default': 1, 'copies-supported': list([ 1, 99, ]), 'document-format-default': 'application/octet-stream', 'document-format-preferred': 'image/urf', 'document-format-supported': list([ 'application/octet-stream', 'image/pwg-raster', 'image/urf', 'image/jpeg', ]), 'document-format-varying-attributes': list([ 'copies', 'sides', ]), 'finishings-default': , 'finishings-supported': , 'generated-natural-language-supported': 'en', 'identify-actions-default': 'flash', 'identify-actions-supported': 'flash', 'ipp-features-supported': list([ 'wfds-print-1.0', 'airprint-1.7', ]), 'ipp-versions-supported': list([ '1.0', '1.1', '2.0', ]), 'job-creation-attributes-supported': list([ 'copies', 'finishings', 'ipp-attribute-fidelity', 'job-name', 'media', 'media-col', 'orientation-requested', 'output-bin', 'print-quality', 'printer-resolution', 'sides', 'print-color-mode', 'print-content-optimize', 'print-scaling', 'job-mandatory-attributes', ]), 'jpeg-features-supported': 'none', 'jpeg-k-octets-supported': list([ 0, 16384, ]), 'jpeg-x-dimension-supported': list([ 0, 15000, ]), 'jpeg-y-dimension-supported': list([ 1, 15000, ]), 'landscape-orientation-requested-preferred': 5, 'marker-colors': list([ '#000000', '#00FFFF', '#FF00FF', '#FFFF00', '#000000', ]), 'marker-high-levels': list([ 100, 100, 100, 100, 100, ]), 'marker-levels': list([ 27, 99, 83, 6, 64, ]), 'marker-low-levels': list([ 15, 15, 15, 15, 15, ]), 'marker-names': list([ 'Photo Black ink', 'Cyan ink', 'Magenta ink', 'Yellow ink', 'Black ink', ]), 'marker-types': list([ 'ink-cartridge', 'ink-cartridge', 'ink-cartridge', 'ink-cartridge', 'ink-cartridge', ]), 'media-bottom-margin-supported': list([ 0, 300, ]), 'media-col-default': dict({ 'media-bottom-margin': 300, 'media-left-margin': 300, 'media-right-margin': 300, 'media-size': dict({ 'x-dimension': 21590, 'y-dimension': 27940, }), 'media-source': 'main', 'media-top-margin': 300, 'media-type': 'stationery', }), 'media-col-ready': list([ dict({ 'media-bottom-margin': 300, 'media-left-margin': 300, 'media-right-margin': 300, 'media-size': dict({ 'x-dimension': 21590, 'y-dimension': 27940, }), 'media-source': 'main', 'media-top-margin': 300, 'media-type': 'stationery', }), dict({ 'media-bottom-margin': 300, 'media-left-margin': 300, 'media-right-margin': 300, 'media-size': dict({ 'x-dimension': 10160, 'y-dimension': 15240, }), 'media-source': 'photo', 'media-top-margin': 300, 'media-type': 'photographic', }), dict({ 'media-bottom-margin': 0, 'media-left-margin': 0, 'media-right-margin': 0, 'media-size': dict({ 'x-dimension': 10160, 'y-dimension': 15240, }), 'media-source': 'photo', 'media-top-margin': 0, 'media-type': 'photographic', }), dict({ 'media-bottom-margin': 0, 'media-left-margin': 0, 'media-right-margin': 0, 'media-size': dict({ 'x-dimension': 12000, 'y-dimension': 12000, }), 'media-source': 'disc', 'media-top-margin': 0, 'media-type': 'disc', }), ]), 'media-col-supported': list([ 'media-size', 'media-top-margin', 'media-left-margin', 'media-right-margin', 'media-bottom-margin', 'media-type', 'media-source', ]), 'media-default': 'na_letter_8.5x11in', 'media-left-margin-supported': list([ 0, 300, ]), 'media-ready': list([ 'na_letter_8.5x11in', 'na_index-4x6_4x6in', 'disc_12cm_18x120mm', ]), 'media-right-margin-supported': list([ 0, 300, ]), 'media-size-supported': list([ dict({ 'x-dimension': 21590, 'y-dimension': 27940, }), dict({ 'x-dimension': 10160, 'y-dimension': 15240, }), dict({ 'x-dimension': 12700, 'y-dimension': 17780, }), dict({ 'x-dimension': 20320, 'y-dimension': 25400, }), dict({ 'x-dimension': 10160, 'y-dimension': 18060, }), dict({ 'x-dimension': 21000, 'y-dimension': 29700, }), dict({ 'x-dimension': 10500, 'y-dimension': 14800, }), dict({ 'x-dimension': 21590, 'y-dimension': 35560, }), dict({ 'x-dimension': 8890, 'y-dimension': 12700, }), dict({ 'x-dimension': 13970, 'y-dimension': 21590, }), dict({ 'x-dimension': 10477, 'y-dimension': 24130, }), dict({ 'x-dimension': 21590, 'y-dimension': 33020, }), dict({ 'x-dimension': 12000, 'y-dimension': 12000, }), dict({ 'x-dimension': list([ 8900, 21590, ]), 'y-dimension': list([ 12700, 111760, ]), }), ]), 'media-source-supported': list([ 'auto', 'main', 'photo', 'disc', ]), 'media-supported': list([ 'na_letter_8.5x11in', 'na_index-4x6_4x6in', 'na_5x7_5x7in', 'na_govt-letter_8x10in', 'om_hivision_101.6x180.6mm', 'iso_a4_210x297mm', 'iso_a6_105x148mm', 'na_legal_8.5x14in', 'oe_photo-l_3.5x5in', 'na_invoice_5.5x8.5in', 'na_number-10_4.125x9.5in', 'na_foolscap_8.5x13in', 'disc_12cm_18x120mm', 'custom_min_89x127mm', 'custom_max_215.9x1117.6mm', ]), 'media-top-margin-supported': list([ 0, 300, ]), 'media-type-supported': list([ 'stationery', 'photographic-high-gloss', 'photographic', 'photographic-semi-gloss', 'photographic-glossy', 'photographic-matte', 'com.epson-luster', 'envelope', 'stationery-coated', 'disc', ]), 'mopria-certified': 'mopria-certified 1.3', 'multiple-document-jobs-supported': False, 'multiple-operation-time-out': 120, 'multiple-operation-time-out-action': 'abort-job', 'natural-language-configured': 'en', 'operations-supported': list([ , , , , , , , , , , ]), 'orientation-requested-default': , 'orientation-requested-supported': , 'output-bin-default': 'face-up', 'output-bin-supported': 'face-up', 'pages-per-minute': 9, 'pages-per-minute-color': 9, 'pdf-versions-supported': 'none', 'pdl-override-supported': 'attempted', 'print-color-mode-default': 'auto', 'print-color-mode-supported': list([ 'color', 'monochrome', 'auto-monochrome', 'process-monochrome', 'auto', ]), 'print-content-optimize-default': 'auto', 'print-content-optimize-supported': 'auto', 'print-quality-default': , 'print-quality-supported': list([ , , ]), 'print-scaling-default': 'auto', 'print-scaling-supported': list([ 'auto', 'auto-fit', 'fill', 'fit', 'none', ]), 'printer-alert': 'code=other', 'printer-alert-description': 'feed roller needed soon', 'printer-config-change-date-time': '', 'printer-config-change-time': 25, 'printer-current-time': datetime.datetime(2022, 10, 4, 2, 21, 58, tzinfo=datetime.timezone.utc), 'printer-device-id': 'MFG:EPSON;CMD:ESCPL2,BDC,D4,D4PX,ESCPR7,END4,GENEP,URF;MDL:XP-6000 Series;CLS:PRINTER;DES:EPSON XP-6000 Series;CID:EpsonRGB;FID:FXN,DPA,WFA,ETN,AFN,DAN,WRA;RID:20;DDS:022500;ELG:1000;SN:583434593035343012;URF:CP1,PQ4-5,OB9,OFU0,RS360,SRGB24,W8,DM3,IS1-7-6,V1.4,MT1-3-7-8-10-11-12;', 'printer-dns-sd-name': 'EPSON XP-6000 Series', 'printer-firmware-name': 'Firmware', 'printer-firmware-string-version': '20.44.NU25M7', 'printer-firmware-version': '000020440000M7250000000000000000', 'printer-geo-location': '', 'printer-get-attributes-supported': 'document-format', 'printer-icons': list([ 'https://192.168.1.92:443/PRESENTATION/AIRPRINT/PRINTER_128.PNG', 'https://192.168.1.92:443/PRESENTATION/AIRPRINT/PRINTER_512.PNG', ]), 'printer-info': 'EPSON XP-6000 Series', 'printer-input-tray': list([ 'type=other;dimunit=micrometers;mediafeed=279400;mediaxfeed=215900;maxcapacity=-2;level=-2;status=0;name=Sheet feeder bin 1;', 'type=sheetFeedAutoNonRemovableTray;dimunit=micrometers;mediafeed=279400;mediaxfeed=215900;maxcapacity=-2;level=-2;status=0;name=Sheet feeder bin 1;', 'type=sheetFeedAutoNonRemovableTray;dimunit=micrometers;mediafeed=152400;mediaxfeed=101600;maxcapacity=-2;level=-2;status=0;name=Sheet feeder bin 2;', 'type=other;dimunit=micrometers;mediafeed=120000;mediaxfeed=120000;maxcapacity=-2;level=-2;status=5;name=Disc;', ]), 'printer-is-accepting-jobs': True, 'printer-kind': list([ 'document', 'envelope', 'photo', 'disc', ]), 'printer-location': '', 'printer-make-and-model': 'EPSON XP-6000 Series', 'printer-more-info': 'http://192.168.1.92:80/PRESENTATION/BONJOUR', 'printer-name': 'ipp/print', 'printer-organization': '', 'printer-organizational-unit': '', 'printer-output-tray': 'type=unRemovableBin;maxcapacity=50;remaining=-3;status=0;name=Face-up Tray;stackingorder=lastToFirst;pagedelivery=faceUp;', 'printer-resolution-default': tuple( 360, 360, 3, ), 'printer-resolution-supported': list([ tuple( 360, 360, 3, ), tuple( 720, 720, 3, ), tuple( 5760, 1440, 3, ), ]), 'printer-state': , 'printer-state-change-date-time': datetime.datetime(2022, 9, 27, 3, 47, 19, tzinfo=datetime.timezone.utc), 'printer-state-change-time': 184119, 'printer-state-reasons': 'marker-supply-low-warning', 'printer-strings-languages-supported': list([ 'en', 'es-mx', 'pt', 'fr', ]), 'printer-strings-uri': 'http://192.168.1.92:80/LANGUAGES/IPP?LANG=en', 'printer-supply-info-uri': 'http://192.168.1.92:80/PRESENTATION/HTML/TOP/PRTINFO.HTML', 'printer-up-time': 783801, 'printer-uri-supported': list([ 'ipps://192.168.1.92:631/ipp/print', 'ipp://192.168.1.92:631/ipp/print', ]), 'printer-uuid': 'urn:uuid:cfe92100-67c4-11d4-a45f-f8d027761251', 'pwg-raster-document-resolution-supported': tuple( 360, 360, 3, ), 'pwg-raster-document-sheet-back': 'rotated', 'pwg-raster-document-type-supported': list([ 'sgray_8', 'srgb_8', ]), 'queued-job-count': 0, 'sides-default': 'one-sided', 'sides-supported': list([ 'one-sided', 'two-sided-short-edge', 'two-sided-long-edge', ]), 'urf-supported': list([ 'CP1', 'PQ4-5', 'OB9', 'OFU0', 'RS360', 'SRGB24', 'W8', 'DM3', 'IS1-7-6', 'V1.4', 'MT1-3-7-8-10-11-12', ]), 'uri-authentication-supported': list([ 'none', 'none', ]), 'uri-security-supported': list([ 'tls', 'none', ]), 'which-jobs-supported': list([ 'completed', 'not-completed', ]), }), ]), 'request-id': 66306, 'status-code': 0, 'unsupported-attributes': list([ ]), 'version': tuple( 2, 0, ), }) # --- # name: test_parse_kyocera_ecosys_m2540dn dict({ 'data': b'', 'jobs': list([ ]), 'operation-attributes': dict({ 'attributes-charset': 'utf-8', 'attributes-natural-language': 'en-us', }), 'printers': list([ dict({ 'printer-info': 'mfu00-0365', 'printer-location': '8409', 'printer-make-and-model': 'ECOSYS M2540dn', 'printer-name': 'mfu00-0365', 'printer-state': , 'printer-state-message': 'Sleeping... ', 'printer-uri-supported': list([ 'ipps://10.104.12.95:443/ipp/print', 'ipp://10.104.12.95:631/ipp/print', ]), }), ]), 'request-id': 47131, 'status-code': 1, 'unsupported-attributes': list([ dict({ 'requested-attributes': list([ 'printer-type', 'printer-state-reason', 'device-uri', 'printer-is-shared', ]), }), ]), 'version': tuple( 2, 0, ), }) # --- python-ipp-0.17.0/tests/fixtures/000077500000000000000000000000001470165767400167425ustar00rootroot00000000000000python-ipp-0.17.0/tests/fixtures/get-jobs-kyocera-ecosys-m2540dn-000.bin000066400000000000000000000023131470165767400254670ustar00rootroot00000000000000h_Gattributes-charsetutf-8Hattributes-natural-languageen-us!job-idEjob-uriipps://mfu00-0365:443/jobs/1000!copies# finishingsDmultiple-document-handling"separate-documents-collated-copies#orientation-requestedD output-bintopDprint-color-mode monochrome# print-quality2printer-resolution XXDsides one-sided! job-priority2Dprint-content-optimizeautoD print-scalingautoDfeed-orientationshort-edge-firstjob-impressionsEjob-printer-uri!ipps://10.104.12.95:443/ipp/print!time-at-creationaRKEjob-uuid-urn:uuid:4509a320-00a2-0079-00c9-00557cc48011Bjob-nameMicrosoft Word - ТСДBjob-originating-user-nameCORP\OFFICE20708$!job-impressions-completed!time-at-processingaRL!time-at-completedaR_Dcompression-suppliednoneIdocument-format-supplied image/urfA document-format-version-supplied1.4!job-printer-up-time# job-state Djob-state-reasonsjob-completed-successfully1date-time-at-creation   %+1date-time-at-processing   %+1date-time-at-completed   %#+Ajob-state-message&completed : job-completed-successfullyBdocument-name-supplieddocpython-ipp-0.17.0/tests/fixtures/get-printer-attributes-brother-mfcj5320dw.bin000066400000000000000000000164111470165767400273100ustar00rootroot00000000000000mGattributes-charsetutf-8Hattributes-natural-languagede!copies-default#finishings-defaultD media-defaultiso_a4_210x297mm4media-col-defaultJ media-typeD stationeryJ media-size4J x-dimension!RJ y-dimension!t7Jmedia-bottom-margin!,Jmedia-left-margin!,Jmedia-right-margin!,Jmedia-top-margin!,J media-sourceDmainJmedia-source-properties4Jmedia-source-feed-directionDlong-edge-firstJmedia-source-feed-orientation#77#orientation-requested-defaultDoutput-bin-defaultface-upDoutput-mode-defaultcolor#print-quality-default2printer-resolution-default ,,D sides-default one-sidedDprint-color-mode-defaultcolorDprint-content-optimize-defaultautoDprint-scaling-defaultauto3copies-supportedc#finishings-supportedDmedia-supportediso_a4_210x297mmDna_letter_8.5x11inDna_executive_7.25x10.5inDiso_a5_148x210mmDiso_a6_105x148mmDna_index-4x6_4x6inDna_index-5x8_5x8inDoe_photo-l_3.5x5inD na_5x7_5x7inDna_number-10_4.125x9.5inDiso_dl_110x220mmDna_monarch_3.875x7.5inDna_legal_8.5x14inDiso_c5_162x229mmDna_foolscap_8.5x13inDiso_a3_297x420mmDna_ledger_11x17inDcustom_min_88.9x127mmDcustom_max_287x431.8mmDmedia-col-supported media-typeD media-sizeDmedia-top-marginDmedia-left-marginDmedia-right-marginDmedia-bottom-marginD media-source#orientation-requested-supported#Doutput-bin-supportedface-upDoutput-mode-supportedcolorDautoD monochrome#print-quality-supported#2printer-resolution-supported ,,Dsides-supported one-sidedDtwo-sided-long-edgeDtwo-sided-short-edgeDprint-color-mode-supportedautoDcolorD monochromeD print-content-optimize-supportedautoDprint-scaling-supportedautoDauto-fitDfillDfitDnoneH$generated-natural-language-supporteddeEprinter-uri-supportedipp://192.168.11.20/ipp/printDuri-security-supportednoneDuri-authentication-supportednone6 printer-nameenbrother-printer5printer-locationenA printer-infoBrother MFC-J5320DW5printer-make-and-modelenBrother MFC-J5320DW# printer-stateDprinter-state-reasonsmarker-supply-low-warningDipp-versions-supported1.0D1.1D2.0#operations-supported##### # # #<" multiple-document-jobs-supported!multiple-operation-time-outHnatural-language-configureddeGcharset-configuredutf-8Gcharset-supportedutf-8Idocument-format-supportedapplication/octet-streamIapplication/vnd.brother-hbpIimage/pwg-rasterI image/urfI image/jpegIdocument-format-defaultapplication/octet-stream"printer-is-accepting-jobs!queued-job-countDpdl-override-supported attempted!printer-up-timehttps://192.168.1.92:443/PRESENTATION/AIRPRINT/PRINTER_128.PNGE>https://192.168.1.92:443/PRESENTATION/AIRPRINT/PRINTER_512.PNG#)landscape-orientation-requested-preferredE printer-uuid-urn:uuid:cfe92100-67c4-11d4-a45f-f8d027761251Bprinter-dns-sd-nameEPSON XP-6000 SeriesEprinter-supply-info-uri9http://192.168.1.92:80/PRESENTATION/HTML/TOP/PRTINFO.HTML" multiple-document-jobs-supported!multiple-operation-time-outxDipp-features-supportedwfds-print-1.0D airprint-1.7D printer-kinddocumentDenvelopeDphotoDdiscD"pwg-raster-document-type-supportedsgray_8Dsrgb_82(pwg-raster-document-resolution-supported hhDpwg-raster-document-sheet-backrotatedAmopria-certifiedmopria-certified 1.3Bprinter-firmware-nameFirmwareAprinter-firmware-string-version 20.44.NU25M70printer-firmware-version 000020440000M72500000000000000000printer-input-tray{type=other;dimunit=micrometers;mediafeed=279400;mediaxfeed=215900;maxcapacity=-2;level=-2;status=0;name=Sheet feeder bin 1;0type=sheetFeedAutoNonRemovableTray;dimunit=micrometers;mediafeed=279400;mediaxfeed=215900;maxcapacity=-2;level=-2;status=0;name=Sheet feeder bin 1;0type=sheetFeedAutoNonRemovableTray;dimunit=micrometers;mediafeed=152400;mediaxfeed=101600;maxcapacity=-2;level=-2;status=0;name=Sheet feeder bin 2;0mtype=other;dimunit=micrometers;mediafeed=120000;mediaxfeed=120000;maxcapacity=-2;level=-2;status=5;name=Disc;0printer-output-trayytype=unRemovableBin;maxcapacity=50;remaining=-3;status=0;name=Face-up Tray;stackingorder=lastToFirst;pagedelivery=faceUp;Dwhich-jobs-supported completedD not-completedIdocument-format-preferred image/urfD"multiple-operation-time-out-action abort-jobD printer-get-attributes-supporteddocument-formatD"document-format-varying-attributescopiesDsidesAprinter-organizationAprinter-organizational-unitH#printer-strings-languages-supportedenHes-mxHptHfrEprinter-strings-uri,http://192.168.1.92:80/LANGUAGES/IPP?LANG=en1printer-current-time  :+printer-config-change-date-time!printer-config-change-time1printer-state-change-date-time  /+!printer-state-change-time7Djpeg-features-supportednonepython-ipp-0.17.0/tests/fixtures/get-printer-attributes-error-0x0503.bin000066400000000000000000000001131470165767400260370ustar00rootroot00000000000000 Gattributes-charsetutf-8Hattributes-natural-languageen-uspython-ipp-0.17.0/tests/fixtures/get-printer-attributes-hp6830.bin000066400000000000000000000333361470165767400250160ustar00rootroot00000000000000Gattributes-charsetutf-8Hattributes-natural-languageenEprinter-uri-supportedipp://hp6830.local/ipp/printDuri-security-supportednoneDuri-authentication-supportedrequesting-user-nameD%printer-settable-attributes-supportednoneBprinter-wifi-ssid TheBigWifi#printer-wifi-stateB printer-nameHPDECCCDAprinter-locationEprinter-more-info$http://hp6830.local./#hId-pgAirPrintA printer-infoHP Officejet Pro 6830 [DECCCD]Bprinter-dns-sd-nameHP Officejet Pro 6830 [DECCCD]Aprinter-make-and-modelHP Officejet Pro 6830# printer-stateDprinter-state-reasonsmarker-supply-low-warningDipp-versions-supported1.0D1.1D2.0#operations-supported###9# # # ######;# None: """Test IPP response is handled correctly.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response( status=200, headers={"Content-Type": "application/ipp"}, body=load_fixture_binary("get-printer-attributes-epsonxp6000.bin"), ), ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session) response = await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) assert response["status-code"] == 0 @pytest.mark.asyncio async def test_internal_session(aresponses: ResponsesMockServer) -> None: """Test IPP response is handled correctly.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response( status=200, headers={"Content-Type": "application/ipp"}, body=load_fixture_binary("get-printer-attributes-epsonxp6000.bin"), ), ) async with IPP(DEFAULT_PRINTER_URI) as ipp: response = await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) assert response["status-code"] == 0 @pytest.mark.asyncio async def test_request_port(aresponses: ResponsesMockServer) -> None: """Test the IPP server running on non-standard port.""" aresponses.add( f"{DEFAULT_PRINTER_HOST}:{NON_STANDARD_PORT}", DEFAULT_PRINTER_PATH, "POST", aresponses.Response( status=200, headers={"Content-Type": "application/ipp"}, body=load_fixture_binary("get-printer-attributes-epsonxp6000.bin"), ), ) async with ClientSession() as session: ipp = IPP( host=DEFAULT_PRINTER_HOST, port=NON_STANDARD_PORT, base_path=DEFAULT_PRINTER_PATH, session=session, ) response = await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) assert response["status-code"] == 0 @pytest.mark.asyncio async def test_request_tls(aresponses: ResponsesMockServer) -> None: """Test the IPP server over TLS.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response( status=200, headers={"Content-Type": "application/ipp"}, body=load_fixture_binary("get-printer-attributes-epsonxp6000.bin"), ), ) async with ClientSession() as session: ipp = IPP( host=DEFAULT_PRINTER_HOST, port=DEFAULT_PRINTER_PORT, tls=True, base_path=DEFAULT_PRINTER_PATH, session=session, ) response = await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) assert response["status-code"] == 0 @pytest.mark.asyncio async def test_timeout(aresponses: ResponsesMockServer) -> None: """Test request timeout from the IPP server.""" # Faking a timeout by sleeping async def response_handler(_: ClientResponse) -> Response: await asyncio.sleep(2) return Response(body="Timeout!") aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", response_handler, ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session, request_timeout=1) with pytest.raises(IPPConnectionError): assert await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) @pytest.mark.asyncio async def test_http_error404(aresponses: ResponsesMockServer) -> None: """Test HTTP 404 response handling.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response(text="Not Found!", status=404), ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session) with pytest.raises(IPPError): assert await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) @pytest.mark.asyncio async def test_http_error426(aresponses: ResponsesMockServer) -> None: """Test HTTP 426 response handling.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response( text="Upgrade Required", headers={"Upgrade": "TLS/1.0, HTTP/1.1"}, status=426, ), ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session) with pytest.raises(IPPConnectionUpgradeRequired): assert await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) @pytest.mark.asyncio async def test_unexpected_response(aresponses: ResponsesMockServer) -> None: """Test unexpected response handling.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response(text="Surprise!", status=200), ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session) with pytest.raises(IPPParseError): assert await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) @pytest.mark.asyncio async def test_ipp_error_0x0503(aresponses: ResponsesMockServer) -> None: """Test IPP Error 0x0503 response handling.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response( status=200, headers={"Content-Type": "application/ipp"}, body=load_fixture_binary("get-printer-attributes-error-0x0503.bin"), ), ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session) with pytest.raises(IPPVersionNotSupportedError): assert await ipp.execute( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) python-ipp-0.17.0/tests/test_interface.py000066400000000000000000000053061470165767400204460ustar00rootroot00000000000000"""Tests for IPP public interface.""" import pytest from aiohttp import ClientSession from aresponses import ResponsesMockServer from pyipp import IPP, Printer from pyipp.const import DEFAULT_PRINTER_ATTRIBUTES from pyipp.enums import IppOperation from . import ( DEFAULT_PRINTER_HOST, DEFAULT_PRINTER_PATH, DEFAULT_PRINTER_PORT, DEFAULT_PRINTER_URI, load_fixture_binary, ) MATCH_DEFAULT_HOST = f"{DEFAULT_PRINTER_HOST}:{DEFAULT_PRINTER_PORT}" @pytest.mark.asyncio async def test_printer(aresponses: ResponsesMockServer) -> None: """Test getting IPP printer information.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response( status=200, headers={"Content-Type": "application/ipp"}, body=load_fixture_binary("get-printer-attributes-epsonxp6000.bin"), ), ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session) printer = await ipp.printer() assert printer assert isinstance(printer, Printer) @pytest.mark.asyncio async def test_printer_update_logic(aresponses: ResponsesMockServer) -> None: """Test getting updated IPP printer information.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response( status=200, headers={"Content-Type": "application/ipp"}, body=load_fixture_binary("get-printer-attributes-epsonxp6000.bin"), ), repeat=2, ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session) printer = await ipp.printer() assert printer assert isinstance(printer, Printer) printer = await ipp.printer() assert printer assert isinstance(printer, Printer) @pytest.mark.asyncio async def test_raw(aresponses: ResponsesMockServer) -> None: """Test raw method is handled correctly.""" aresponses.add( MATCH_DEFAULT_HOST, DEFAULT_PRINTER_PATH, "POST", aresponses.Response( status=200, headers={"Content-Type": "application/ipp"}, body=load_fixture_binary("get-printer-attributes-epsonxp6000.bin"), ), ) async with ClientSession() as session: ipp = IPP(DEFAULT_PRINTER_URI, session=session) response = await ipp.raw( IppOperation.GET_PRINTER_ATTRIBUTES, { "operation-attributes-tag": { "requested-attributes": DEFAULT_PRINTER_ATTRIBUTES, }, }, ) assert response assert isinstance(response, bytes) python-ipp-0.17.0/tests/test_models.py000066400000000000000000000305031470165767400177660ustar00rootroot00000000000000"""Tests for IPP Models.""" # pylint: disable=R0912,R0915 from __future__ import annotations from typing import Any, List import pytest from pyipp import models, parser from . import IPPE10_PRINTER_ATTRS, load_fixture_binary @pytest.mark.asyncio async def test_info() -> None: # noqa: PLR0915 """Test Info model.""" parsed = parser.parse(load_fixture_binary("get-printer-attributes-epsonxp6000.bin")) data = parsed["printers"][0] info = models.Info.from_dict(data) assert info assert info.command_set == "ESCPL2,BDC,D4,D4PX,ESCPR7,END4,GENEP,URF" assert info.location == "" assert info.name == "EPSON XP-6000 Series" assert info.manufacturer == "EPSON" assert info.model == "XP-6000 Series" assert info.printer_name == "ipp/print" assert info.printer_info == "EPSON XP-6000 Series" assert info.printer_uri_supported == [ "ipps://192.168.1.92:631/ipp/print", "ipp://192.168.1.92:631/ipp/print", ] assert info.more_info == "http://192.168.1.92:80/PRESENTATION/BONJOUR" assert info.serial == "583434593035343012" assert info.uuid == "cfe92100-67c4-11d4-a45f-f8d027761251" assert info.version == "20.44.NU25M7" assert info.uptime == 783801 # no make/model, device id data["printer-make-and-model"] = "" info = models.Info.from_dict(data) assert info assert info.name == "EPSON XP-6000 Series" assert info.printer_name == "ipp/print" assert info.manufacturer == "EPSON" assert info.model == "XP-6000 Series" # no make/model, no device id, URI name data["printer-device-id"] = "" data["printer-make-and-model"] = "" data["printer-name"] = "ipp/print" info = models.Info.from_dict(data) assert info assert info.name == "IPP Printer" assert info.printer_name == "ipp/print" assert info.manufacturer == "Unknown" assert info.model == "Unknown" # no make/model, no device id, name data["printer-device-id"] = "" data["printer-make-and-model"] = "" data["printer-name"] = "Printy" info = models.Info.from_dict(data) assert info assert info.name == "Printy" assert info.printer_name == "Printy" assert info.manufacturer == "Unknown" assert info.model == "Unknown" # no make/model, no device id, no name data["printer-device-id"] = "" data["printer-make-and-model"] = "" data["printer-name"] = "" info = models.Info.from_dict(data) assert info assert info.name == "IPP Printer" assert info.printer_name == "" assert info.manufacturer == "Unknown" assert info.model == "Unknown" @pytest.mark.asyncio async def test_state() -> None: """Test State model.""" data: dict[str, Any] = { "printer-state": 4, "printer-state-reasons": "none", } state = models.State.from_dict(data) assert state assert state.printer_state == "printing" assert state.reasons is None assert state.message is None @pytest.mark.asyncio async def test_printer() -> None: # noqa: PLR0915 """Test Printer model.""" parsed = parser.parse(load_fixture_binary("get-printer-attributes-epsonxp6000.bin")) printer = models.Printer.from_dict(parsed["printers"][0]) assert printer assert printer.info assert printer.info.command_set == "ESCPL2,BDC,D4,D4PX,ESCPR7,END4,GENEP,URF" assert printer.info.location == "" assert printer.info.name == "EPSON XP-6000 Series" assert printer.info.manufacturer == "EPSON" assert printer.info.model == "XP-6000 Series" assert printer.info.printer_name == "ipp/print" assert printer.info.printer_info == "EPSON XP-6000 Series" assert printer.info.printer_uri_supported == [ "ipps://192.168.1.92:631/ipp/print", "ipp://192.168.1.92:631/ipp/print", ] assert printer.info.more_info == "http://192.168.1.92:80/PRESENTATION/BONJOUR" assert printer.info.serial == "583434593035343012" assert printer.info.uuid == "cfe92100-67c4-11d4-a45f-f8d027761251" assert printer.info.version == "20.44.NU25M7" assert printer.info.uptime == 783801 assert printer.state assert printer.state.printer_state == "idle" assert printer.state.reasons == "marker-supply-low-warning" assert printer.state.message is None assert printer.markers assert isinstance(printer.markers, list) assert len(printer.markers) == 5 assert printer.markers[0] assert printer.markers[0].marker_id == 4 assert printer.markers[0].marker_type == "ink-cartridge" assert printer.markers[0].name == "Black ink" assert printer.markers[0].color == "#000000" assert printer.markers[0].level == 64 assert printer.markers[0].low_level == 15 assert printer.markers[0].high_level == 100 assert printer.markers[1] assert printer.markers[1].marker_id == 1 assert printer.markers[1].marker_type == "ink-cartridge" assert printer.markers[1].name == "Cyan ink" assert printer.markers[1].color == "#00FFFF" assert printer.markers[1].level == 99 assert printer.markers[1].low_level == 15 assert printer.markers[1].high_level == 100 assert printer.markers[2] assert printer.markers[2].marker_id == 2 assert printer.markers[2].marker_type == "ink-cartridge" assert printer.markers[2].name == "Magenta ink" assert printer.markers[2].color == "#FF00FF" assert printer.markers[2].level == 83 assert printer.markers[2].low_level == 15 assert printer.markers[2].high_level == 100 assert printer.markers[3] assert printer.markers[3].marker_id == 0 assert printer.markers[3].marker_type == "ink-cartridge" assert printer.markers[3].name == "Photo Black ink" assert printer.markers[3].color == "#000000" assert printer.markers[3].level == 27 assert printer.markers[3].low_level == 15 assert printer.markers[3].high_level == 100 assert printer.markers[4] assert printer.markers[4].marker_id == 3 assert printer.markers[4].marker_type == "ink-cartridge" assert printer.markers[4].name == "Yellow ink" assert printer.markers[4].color == "#FFFF00" assert printer.markers[4].level == 6 assert printer.markers[4].low_level == 15 assert printer.markers[4].high_level == 100 assert printer.uris assert isinstance(printer.uris, list) assert len(printer.uris) == 2 assert printer.uris[0] assert printer.uris[0].uri == "ipps://192.168.1.92:631/ipp/print" assert printer.uris[0].authentication is None assert printer.uris[0].security == "tls" assert printer.uris[1] assert printer.uris[1].uri == "ipp://192.168.1.92:631/ipp/print" assert printer.uris[1].authentication is None assert printer.uris[1].security is None def test_printer_as_dict() -> None: """Test the dictionary version of Printer.""" parsed = parser.parse(load_fixture_binary("get-printer-attributes-epsonxp6000.bin")) printer = models.Printer.from_dict(parsed["printers"][0]) assert printer printer_dict = printer.as_dict() assert printer_dict assert isinstance(printer_dict, dict) assert isinstance(printer_dict["info"], dict) assert isinstance(printer_dict["state"], dict) assert isinstance(printer_dict["markers"], List) assert len(printer_dict["markers"]) == 5 assert isinstance(printer_dict["uris"], List) assert len(printer_dict["uris"]) == 2 def test_printer_update_from_dict() -> None: """Test updating data of Printer.""" parsed = parser.parse(load_fixture_binary("get-printer-attributes-epsonxp6000.bin")) printer = models.Printer.from_dict(parsed["printers"][0]) assert printer assert printer.info assert printer.info.uptime == 783801 parsed["printer-up-time"] = 2 printer.update_from_dict(parsed) assert printer assert printer.info assert printer.info.uptime == 2 @pytest.mark.asyncio async def test_printer_with_single_marker() -> None: """Test Printer model with single marker.""" data = IPPE10_PRINTER_ATTRS.copy() data["marker-names"] = "Black" data["marker-types"] = "ink-cartridge" data["marker-colors"] = "#FF0000" data["marker-levels"] = 77 data["marker-high-levels"] = 100 data["marker-low-levels"] = 0 printer = models.Printer.from_dict(data) assert printer assert printer.markers[0] assert printer.markers[0].name == "Black" assert printer.markers[0].color == "#FF0000" assert printer.markers[0].level == 77 assert printer.markers[0].high_level == 100 assert printer.markers[0].low_level == 0 assert printer.markers[0].marker_type == "ink-cartridge" @pytest.mark.asyncio async def test_printer_with_single_marker_empty_strings() -> None: """Test Printer model with single marker with empty string values.""" data = IPPE10_PRINTER_ATTRS.copy() data["marker-names"] = "" data["marker-types"] = "" data["marker-colors"] = "" data["marker-levels"] = "" data["marker-low-levels"] = "" data["marker-high-levels"] = "" printer = models.Printer.from_dict(data) assert printer assert len(printer.markers) == 0 @pytest.mark.asyncio async def test_printer_with_single_marker_invalid() -> None: """Test Printer model with single invalid marker name.""" data = IPPE10_PRINTER_ATTRS.copy() data["marker-names"] = -1 printer = models.Printer.from_dict(data) assert printer assert len(printer.markers) == 0 @pytest.mark.asyncio async def test_printer_with_extra_marker_data() -> None: """Test Printer model with extra marker data.""" data = IPPE10_PRINTER_ATTRS.copy() data["marker-names"] = ["Black"] data["marker-types"] = ["ink-cartridge", "ink"] data["marker-colors"] = ["#FF0000", "#FF1111"] data["marker-levels"] = [99, 33] data["marker-low-levels"] = [0, 10] data["marker-high-levels"] = [99, 100] printer = models.Printer.from_dict(data) assert printer assert len(printer.markers) == 1 assert printer.markers[0] assert printer.markers[0].name == "Black" assert printer.markers[0].color == "#FF0000" assert printer.markers[0].level == 99 assert printer.markers[0].high_level == 99 assert printer.markers[0].low_level == 0 assert printer.markers[0].marker_type == "ink-cartridge" @pytest.mark.asyncio async def test_printer_with_single_supported_uri() -> None: """Test Printer model with single supported uri.""" data = IPPE10_PRINTER_ATTRS.copy() data["printer-uri-supported"] = "ipp://10.104.12.95:631/ipp/print" data["uri-authentication-supported"] = "none" data["uri-security-supported"] = "none" printer = models.Printer.from_dict(data) assert printer assert printer.uris[0] assert printer.uris[0].uri == "ipp://10.104.12.95:631/ipp/print" assert printer.uris[0].authentication is None assert printer.uris[0].security is None @pytest.mark.asyncio async def test_printer_with_single_supported_uri_extra_data() -> None: """Test Printer model with single supported uri with extra data.""" data = IPPE10_PRINTER_ATTRS.copy() data["printer-uri-supported"] = "ipp://10.104.12.95:631/ipp/print" data["uri-authentication-supported"] = ["none", "basic"] data["uri-security-supported"] = ["none", "tls"] printer = models.Printer.from_dict(data) assert printer assert printer.uris[0] assert printer.uris[0].uri == "ipp://10.104.12.95:631/ipp/print" assert printer.uris[0].authentication is None assert printer.uris[0].security is None @pytest.mark.asyncio async def test_printer_with_single_supported_uri_invalid_uri() -> None: """Test Printer model with single invalid supported uri.""" data = IPPE10_PRINTER_ATTRS.copy() data["printer-uri-supported"] = -1 data["uri-authentication-supported"] = "none" data["uri-security-supported"] = "none" printer = models.Printer.from_dict(data) assert printer assert len(printer.uris) == 0 @pytest.mark.asyncio async def test_printer_with_single_supported_uri_with_security() -> None: """Test Printer model with multiple markers.""" data = IPPE10_PRINTER_ATTRS.copy() data["printer-uri-supported"] = "ipps://10.104.12.95:631/ipp/print" data["uri-authentication-supported"] = "basic" data["uri-security-supported"] = "tls" printer = models.Printer.from_dict(data) assert printer assert printer.uris[0] assert printer.uris[0].uri == "ipps://10.104.12.95:631/ipp/print" assert printer.uris[0].authentication == "basic" assert printer.uris[0].security == "tls" python-ipp-0.17.0/tests/test_parser.py000066400000000000000000000124701470165767400200020ustar00rootroot00000000000000"""Tests for Parser.""" import pytest from syrupy.assertion import SnapshotAssertion from pyipp import IPPParseError, parser from pyipp.const import DEFAULT_CHARSET, DEFAULT_CHARSET_LANGUAGE, DEFAULT_PROTO_VERSION from pyipp.enums import IppOperation from . import load_fixture_binary RESPONSE_GET_PRINTER_ATTRIBUTES = load_fixture_binary( "get-printer-attributes-response-000.bin", ) MOCK_IEEE1284_DEVICE_ID = "MFG:EPSON;CMD:ESCPL2,BDC,D4,D4PX,ESCPR7,END4,GENEP,URF;MDL:XP-6000 Series;CLS:PRINTER;DES:EPSON XP-6000 Series;CID:EpsonRGB;FID:FXN,DPA,WFA,ETN,AFN,DAN,WRA;RID:20;DDS:022500;ELG:1000;SN:583434593035343012;URF:CP1,PQ4-5,OB9,OFU0,RS360,SRGB24,W8,DM3,IS1-7-6,V1.4,MT1-3-7-8-10-11-12;" def test_parse() -> None: """Test the parse method.""" result = parser.parse(RESPONSE_GET_PRINTER_ATTRIBUTES) assert result == { "data": b"", "jobs": [], "operation-attributes": { "attributes-charset": DEFAULT_CHARSET, "attributes-natural-language": DEFAULT_CHARSET_LANGUAGE, "printer-uri": "ipp://printer.example.com:361/ipp/print", "requesting-user-name": "PythonIPP", }, "printers": [], "request-id": 1, "status-code": IppOperation.GET_PRINTER_ATTRIBUTES, "unsupported-attributes": [], "version": DEFAULT_PROTO_VERSION, } def test_parse_attribute() -> None: """Test the parse_attribute method.""" result = parser.parse_attribute(RESPONSE_GET_PRINTER_ATTRIBUTES, 9) assert result == ( { "name": "attributes-charset", "name-length": 18, "tag": 71, "value": "utf-8", "value-length": 5, }, 37, ) def test_parse_attribute_reserved_string() -> None: """Test the parse_attribute method when provided a reserved string.""" result = parser.parse_attribute(b"C\x00\x0freserved-string\x00\x04yoda", 0) assert result == ( { "name": "reserved-string", "name-length": 15, "tag": 67, "value": "yoda", "value-length": 4, }, 24, ) result = parser.parse_attribute(b"C\x00\x0freserved-string\x00\x00", 0) assert result == ( { "name": "reserved-string", "name-length": 15, "tag": 67, "value": None, "value-length": 0, }, 20, ) def test_parse_attribute_invalid_date() -> None: """Test the parse_attribute method when provided an invalid date.""" invalid = b"1\x00\x14printer-current-time\x00\x0299" with pytest.raises(IPPParseError): parser.parse_attribute(invalid, 0) def test_parse_ieee1284_device_id() -> None: """Test the parse_ieee1284_device_id method.""" result = parser.parse_ieee1284_device_id(MOCK_IEEE1284_DEVICE_ID) assert result assert result["MFG"] == "EPSON" assert result["MDL"] == "XP-6000 Series" assert result["SN"] == "583434593035343012" assert result["CMD"] == "ESCPL2,BDC,D4,D4PX,ESCPR7,END4,GENEP,URF" assert result["MANUFACTURER"] == result["MFG"] assert result["MODEL"] == result["MDL"] assert result["COMMAND SET"] == result["CMD"] def test_parse_ieee1284_device_id_manufacturer_only() -> None: """Test the parse_ieee1284_device_id method with only a manufacturer.""" result = parser.parse_ieee1284_device_id("MANUFACTURER:EPSON") assert result == { "MANUFACTURER": "EPSON", } def test_parse_ieee1284_device_id_empty() -> None: """Test the parse_ieee1284_device_id method with empty string.""" result = parser.parse_ieee1284_device_id("") assert isinstance(result, dict) def test_parse_make_and_model() -> None: """Test the parse_make_and_model method.""" result = parser.parse_make_and_model("") assert result == ("Unknown", "Unknown") # generic fallback for unknown brands result = parser.parse_make_and_model("IPP") assert result == ("IPP", "Unknown") result = parser.parse_make_and_model("IPP Printer") assert result == ("IPP", "Printer") # known brands result = parser.parse_make_and_model("EPSON XP-6000 Series") assert result == ("EPSON", "XP-6000 Series") result = parser.parse_make_and_model("HP Officejet Pro 6830") assert result == ("HP", "Officejet Pro 6830") result = parser.parse_make_and_model("HP Photosmart D110 Series") assert result == ("HP", "Photosmart D110 Series") def test_parse_brother_mfcj5320dw(snapshot: SnapshotAssertion) -> None: """Test the parse method against response from Brother MFC-J5320DW.""" response = load_fixture_binary("get-printer-attributes-brother-mfcj5320dw.bin") result = parser.parse(response) assert result == snapshot def test_parse_epson_xp6000(snapshot: SnapshotAssertion) -> None: """Test the parse method against response from Epson XP-6000 Series.""" response = load_fixture_binary("get-printer-attributes-epsonxp6000.bin") result = parser.parse(response) assert result == snapshot def test_parse_kyocera_ecosys_m2540dn(snapshot: SnapshotAssertion) -> None: """Test the parse method against response from Kyocera Ecosys M2540DN.""" response = load_fixture_binary( "get-printer-attributes-kyocera-ecosys-m2540dn-001.bin", ) result = parser.parse(response) assert result == snapshot python-ipp-0.17.0/tests/test_serializer.py000066400000000000000000000045151470165767400206600ustar00rootroot00000000000000"""Tests for Serializer.""" from pyipp import serializer from pyipp.const import DEFAULT_CHARSET, DEFAULT_CHARSET_LANGUAGE, DEFAULT_PROTO_VERSION from pyipp.enums import IppOperation, IppTag from . import load_fixture_binary def test_construct_attribute_values() -> None: """Test the construct_attribute_values method.""" result = serializer.construct_attribute_values( IppTag.INTEGER, IppOperation.GET_PRINTER_ATTRIBUTES, ) assert result == b"\x00\x04\x00\x00\x00\x0b" result = serializer.construct_attribute_values( IppTag.ENUM, IppOperation.GET_PRINTER_ATTRIBUTES, ) assert result == b"\x00\x04\x00\x00\x00\x0b" result = serializer.construct_attribute_values( IppTag.BOOLEAN, "0", ) assert result == b"\x00\x01\x01" result = serializer.construct_attribute_values( IppTag.URI, "ipps://localhost:631", ) assert result == b"\x00\x14ipps://localhost:631" def test_construct_attribute() -> None: """Test the construct_attribute method.""" result = serializer.construct_attribute("attributes-charset", DEFAULT_CHARSET) assert result == b"G\x00\x12attributes-charset\x00\x05utf-8" result = serializer.construct_attribute( "operations-supported", [IppOperation.GET_PRINTER_ATTRIBUTES], ) assert result == b"#\x00\x14operations-supported\x00\x04\x00\x00\x00\x0b" def test_construct_attribute_no_tag_unmapped() -> None: """Test the construct_attribute method with no tag and unmapped attribute name.""" result = serializer.construct_attribute( "no-tag-unmapped", None, ) assert result == b"" def test_encode_dict() -> None: """Test the encode_dict method.""" result = serializer.encode_dict( { "version": DEFAULT_PROTO_VERSION, "operation": IppOperation.GET_PRINTER_ATTRIBUTES, "request-id": 1, "operation-attributes-tag": { "attributes-charset": DEFAULT_CHARSET, "attributes-natural-language": DEFAULT_CHARSET_LANGUAGE, "printer-uri": "ipp://printer.example.com:361/ipp/print", "requesting-user-name": "PythonIPP", }, }, ) assert result == load_fixture_binary( "serializer/get-printer-attributes-request-000.bin", )