├── tests ├── __init__.py ├── unit │ ├── __init__.py │ └── replit │ │ ├── __init__.py │ │ └── object_storage │ │ ├── __init__.py │ │ ├── mocks.py │ │ └── test_client.py └── integration │ ├── __init__.py │ └── replit │ ├── __init__.py │ └── object_storage │ ├── __init__.py │ └── test_client.py ├── docs ├── replit │ ├── __init__.md │ └── object_storage │ │ ├── __init__.md │ │ ├── _config.md │ │ ├── object.md │ │ ├── errors.md │ │ └── client.md └── sidebar.json ├── .github ├── CODEOWNERS ├── pull_request_template.md ├── release-drafter.yml └── workflows │ ├── release-drafter.yml │ └── python-publish.yml ├── replit.nix ├── .gitignore ├── tox.ini ├── .replit ├── src └── replit │ └── object_storage │ ├── __init__.py │ ├── object.py │ ├── _config.py │ ├── errors.py │ └── client.py ├── README.md ├── development.md ├── Makefile ├── .semaphore └── semaphore.yml ├── pyproject.toml └── poetry.lock /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/unit/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/unit/replit/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/replit/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/replit/__init__.md: -------------------------------------------------------------------------------- 1 | # replit 2 | 3 | -------------------------------------------------------------------------------- /tests/unit/replit/object_storage/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/replit/object_storage/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @replit/deployments-reviewers 2 | -------------------------------------------------------------------------------- /docs/replit/object_storage/__init__.md: -------------------------------------------------------------------------------- 1 | # replit.object\_storage 2 | 3 | Public interface for the replit.object_storage library. 4 | 5 | -------------------------------------------------------------------------------- /docs/replit/object_storage/_config.md: -------------------------------------------------------------------------------- 1 | # replit.object\_storage.\_config 2 | 3 | Configurations for external interactions managed by the library. 4 | 5 | -------------------------------------------------------------------------------- /replit.nix: -------------------------------------------------------------------------------- 1 | { pkgs }: { 2 | deps = [ 3 | pkgs.poetry 4 | pkgs.python38 5 | pkgs.python39 6 | pkgs.python310 7 | pkgs.python311 8 | pkgs.python312 9 | ]; 10 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Packager 2 | .pythonlibs 3 | .pytest_cache 4 | .ruff_cache 5 | .tox 6 | .upm 7 | 8 | # Python 9 | .local 10 | __pycache__ 11 | 12 | # Builds and Testing 13 | .coverage 14 | dist -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | isolated_build = True 3 | envlist = py{38,39,310,311,312} 4 | 5 | [testenv] 6 | allowlist_externals = poetry 7 | commands = 8 | poetry install -v 9 | poetry run pytest --cov-report term-missing --cov=src tests/integration -------------------------------------------------------------------------------- /.replit: -------------------------------------------------------------------------------- 1 | entrypoint = "main.py" 2 | 3 | hidden = [".pythonlibs"] 4 | 5 | [nix] 6 | channel = "stable-23_05" 7 | 8 | [unitTest] 9 | language = "python3" 10 | 11 | [deployment] 12 | run = ["python3", "main.py"] 13 | deploymentTarget = "cloudrun" 14 | -------------------------------------------------------------------------------- /src/replit/object_storage/__init__.py: -------------------------------------------------------------------------------- 1 | """Public interface for the replit.object_storage library.""" 2 | 3 | from replit.object_storage.client import Client 4 | from replit.object_storage.errors import DefaultBucketError 5 | from replit.object_storage.object import Object 6 | -------------------------------------------------------------------------------- /src/replit/object_storage/object.py: -------------------------------------------------------------------------------- 1 | """Pythonic representation of an object in Object Storage.""" 2 | 3 | from dataclasses import dataclass 4 | 5 | 6 | @dataclass 7 | class Object: 8 | """Object contains metadata about an object. 9 | 10 | Attributes: 11 | name: The name of the object. 12 | """ 13 | name: str 14 | -------------------------------------------------------------------------------- /docs/replit/object_storage/object.md: -------------------------------------------------------------------------------- 1 | # replit.object\_storage.object 2 | 3 | Pythonic representation of an object in Object Storage. 4 | 5 | ## Class Object 6 | 7 | ```python 8 | @dataclass 9 | class Object() 10 | ``` 11 | 12 | Object contains metadata about an object. 13 | 14 | **Attributes**: 15 | 16 | - `name` - The name of the object. 17 | 18 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Why 2 | === 3 | 4 | _Describe what prompted you to make this change, link relevant resources_ 5 | 6 | What changed 7 | ============ 8 | 9 | _Describe what changed to a level of detail that someone with no context with your PR could be able to review it_ 10 | 11 | Test plan 12 | ========= 13 | 14 | _Describe what you did to test this change to a level of detail that allows your reviewer to test it_ 15 | 16 | Rollout 17 | ======= 18 | 19 | _Describe any procedures or requirements needed to roll this out safely (or check the box below)_ 20 | 21 | - [ ] This is fully backward and forward compatible 22 | -------------------------------------------------------------------------------- /docs/sidebar.json: -------------------------------------------------------------------------------- 1 | { 2 | "items": [ 3 | { 4 | "items": [ 5 | { 6 | "items": [ 7 | "replit/object_storage/__init__", 8 | "replit/object_storage/_config", 9 | "replit/object_storage/client", 10 | "replit/object_storage/errors", 11 | "replit/object_storage/object" 12 | ], 13 | "label": "replit.object_storage", 14 | "type": "category" 15 | }, 16 | "replit/__init__" 17 | ], 18 | "label": "replit", 19 | "type": "category" 20 | } 21 | ], 22 | "label": "Reference", 23 | "type": "category" 24 | } -------------------------------------------------------------------------------- /src/replit/object_storage/_config.py: -------------------------------------------------------------------------------- 1 | """Configurations for external interactions managed by the library.""" 2 | 3 | REPLIT_SIDECAR_ENDPOINT = "http://127.0.0.1:1106" 4 | REPLIT_CREDENTIAL_URL = REPLIT_SIDECAR_ENDPOINT + "/credential" 5 | REPLIT_DEFAULT_BUCKET_URL = REPLIT_SIDECAR_ENDPOINT + "/object-storage/default-bucket" 6 | REPLIT_TOKEN_URL = REPLIT_SIDECAR_ENDPOINT + "/token" 7 | 8 | REPLIT_ADC = { 9 | "audience": "replit", 10 | "subject_token_type": "access_token", 11 | "token_url": REPLIT_TOKEN_URL, 12 | "credential_source": { 13 | "url": REPLIT_CREDENTIAL_URL, 14 | "format": { 15 | "type": "json", 16 | "subject_token_field_name": "access_token", 17 | }, 18 | }, 19 | } 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # replit-object-storage-python 2 | The library for interacting with Replit's Object Storage service, on Replit. 3 | 4 | ## Usage 5 | 6 | ### Setup 7 | 8 | Start by importing the Object Storage Client: 9 | ```python 10 | from replit.object_storage import Client 11 | ``` 12 | 13 | Then to use the Client: 14 | ```python 15 | client = Client() 16 | ``` 17 | 18 | ### Downloading an Object 19 | 20 | ```python 21 | contents = client.download_as_text("file.json") 22 | ``` 23 | 24 | ### Uploading an Object 25 | 26 | ```python 27 | client.upload_from_text("file.json", data) 28 | ``` 29 | 30 | ### List Objects 31 | 32 | ```python 33 | client.list() 34 | ``` 35 | 36 | ### Delete an Object 37 | 38 | ```python 39 | contents = client.delete("file.json") 40 | ``` 41 | -------------------------------------------------------------------------------- /development.md: -------------------------------------------------------------------------------- 1 | # replit-object-storage-python 2 | The library for Replit Object Storage. Development should "just work" on Replit! 3 | 4 | ## Development 5 | 6 | To get setup, run: 7 | ```bash 8 | make install 9 | ``` 10 | 11 | To run the linter, run: 12 | ```bash 13 | make lint 14 | ``` 15 | 16 | or to fix (fixable) lint issues, run: 17 | ```bash 18 | make lint-fix 19 | ``` 20 | 21 | To run tests, run: 22 | ```bash 23 | make test 24 | ``` 25 | 26 | ## Docs 27 | 28 | To generate the markdown docs, run: 29 | ```bash 30 | make docs 31 | ``` 32 | 33 | ## Release 34 | 35 | To check that the package builds, you can run: 36 | ```bash 37 | make prerelease 38 | ``` 39 | 40 | To perform a release, first bump the version in `pyproject.toml`. Then run: 41 | ```bash 42 | make release 43 | ``` -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name-template: 'v$RESOLVED_VERSION' 2 | tag-template: 'v$RESOLVED_VERSION' 3 | categories: 4 | - title: '🚀 Features' 5 | labels: 6 | - 'feature' 7 | - 'enhancement' 8 | - title: '🐛 Bug Fixes' 9 | labels: 10 | - 'fix' 11 | - 'bugfix' 12 | - 'bug' 13 | - title: '🧰 Maintenance' 14 | label: 'chore' 15 | - title: '🤖 Dependencies' 16 | label: 'dependencies' 17 | change-template: '- $TITLE @$AUTHOR (#$NUMBER)' 18 | change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. 19 | version-resolver: 20 | major: 21 | labels: 22 | - 'major' 23 | minor: 24 | labels: 25 | - 'minor' 26 | patch: 27 | labels: 28 | - 'patch' 29 | default: patch 30 | template: | 31 | ## Changes 32 | 33 | $CHANGES 34 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: docs 2 | docs: 3 | @poetry run pydoc-markdown 4 | 5 | .PHONY: install 6 | install: 7 | @poetry install 8 | 9 | .PHONY: install-dev 10 | install-dev: 11 | @poetry install --with=dev 12 | 13 | .PHONY: lint 14 | lint: 15 | @poetry run ruff check src tests 16 | 17 | .PHONY: lint-fix 18 | lint-fix: 19 | @poetry run ruff check src tests --fix 20 | 21 | .PHONY: test-integration 22 | test-integration: install-dev 23 | @poetry run pytest --cov-report term-missing --cov=./src ./tests/integration 24 | 25 | .PHONY: install-dev test-integration-multi-language 26 | test-integration-multi-language: 27 | @poetry run tox 28 | 29 | .PHONY: test-unit 30 | test-unit: install-dev 31 | @poetry run pytest --cov-report term-missing --cov=./src ./tests/unit 32 | 33 | .PHONY: prerelease 34 | prerelease: test-unit test-integration-multi-language 35 | @rm -rf dist 36 | @poetry build 37 | 38 | .PHONY: release 39 | release: prerelease 40 | @poetry run twine upload dist/* 41 | -------------------------------------------------------------------------------- /.github/workflows/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name: Release Drafter 2 | 3 | on: 4 | workflow_dispatch: {} 5 | push: 6 | # branches to consider in the event; optional, defaults to all 7 | branches: 8 | - main 9 | # pull_request event is required only for autolabeler 10 | pull_request: 11 | # Only following types are handled by the action, but one can default to all as well 12 | types: [opened, reopened, synchronize] 13 | # pull_request_target event is required for autolabeler to support PRs from forks 14 | pull_request_target: 15 | types: [opened, reopened, synchronize] 16 | 17 | permissions: 18 | contents: read 19 | 20 | jobs: 21 | update_release_draft: 22 | permissions: 23 | # write permission is required to create a github release 24 | contents: write 25 | # write permission is required for autolabeler 26 | # otherwise, read permission is required at least 27 | pull-requests: write 28 | runs-on: ubuntu-latest 29 | steps: 30 | # Drafts your next Release notes as Pull Requests are merged into "master" 31 | - uses: release-drafter/release-drafter@v5 32 | env: 33 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 34 | -------------------------------------------------------------------------------- /docs/replit/object_storage/errors.md: -------------------------------------------------------------------------------- 1 | # replit.object\_storage.errors 2 | 3 | Errors that may be returned by the storage library. 4 | 5 | ## Class BucketNotFoundError 6 | 7 | ```python 8 | class BucketNotFoundError(Exception) 9 | ``` 10 | 11 | BucketNotFoundError may occur if the specified bucket could not be found. 12 | 13 | ## Class DefaultBucketError 14 | 15 | ```python 16 | class DefaultBucketError(Exception) 17 | ``` 18 | 19 | DefaultBucketError may occur if the default bucket could not be resolved. 20 | 21 | ## Class ForbiddenError 22 | 23 | ```python 24 | class ForbiddenError(Exception) 25 | ``` 26 | 27 | ForbiddenError may occur if access to the requested resource is not allowed. 28 | 29 | ## Class ObjectNotFoundError 30 | 31 | ```python 32 | class ObjectNotFoundError(Exception) 33 | ``` 34 | 35 | ObjectNotFoundError may occur if the requested object could not be found. 36 | 37 | ## Class TooManyRequestsError 38 | 39 | ```python 40 | class TooManyRequestsError(Exception) 41 | ``` 42 | 43 | TooManyRequestsError may occur if the rate of requests exceeds the rate limit. 44 | 45 | ## Class UnauthorizedError 46 | 47 | ```python 48 | class UnauthorizedError(Exception) 49 | ``` 50 | 51 | UnauthorizedError may occur if the requested operation is not allowed. 52 | 53 | -------------------------------------------------------------------------------- /tests/unit/replit/object_storage/mocks.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import MagicMock 2 | 3 | 4 | def build_mock_default_bucket_response() -> MagicMock: 5 | mock_response = MagicMock() 6 | mock_response.json.return_value = {"bucketId": "bucket-id"} 7 | return mock_response 8 | 9 | 10 | def build_mock_gcs_client() -> MagicMock: 11 | mock_blob_handle = MagicMock() 12 | mock_blob_handle.delete.return_value = None 13 | mock_blob_handle.download_as_bytes.return_value = str.encode("test-bytes") 14 | mock_blob_handle.download_as_text.return_value = "test-text" 15 | mock_blob_handle.download_to_file.return_value = None 16 | mock_blob_handle.download_to_filename.return_value = None 17 | mock_blob_handle.exists.return_value = True 18 | mock_blob_handle.upload_from_file.return_value = None 19 | mock_blob_handle.upload_from_filename.return_value = None 20 | mock_blob_handle.upload_from_text.return_value = None 21 | 22 | mock_bucket_handle = MagicMock() 23 | mock_bucket_handle.blob.return_value = mock_blob_handle 24 | 25 | mock_gcs_client = MagicMock() 26 | mock_gcs_client.bucket.return_value = mock_bucket_handle 27 | 28 | mock_gcs_client_constructor = MagicMock(return_value=mock_gcs_client) 29 | return mock_gcs_client_constructor 30 | -------------------------------------------------------------------------------- /.semaphore/semaphore.yml: -------------------------------------------------------------------------------- 1 | version: v1.0 2 | name: replit-storage-python 3 | agent: 4 | machine: 5 | type: e1-standard-4 6 | os_image: ubuntu2004 7 | blocks: 8 | - name: install deps 9 | task: 10 | jobs: 11 | - name: cache deps 12 | commands: 13 | - sem-version python 3.10 14 | - checkout --use-cache 15 | - pip install poetry==1.5.1 16 | - make install 17 | - cache store 18 | dependencies: [] 19 | - name: lint 20 | task: 21 | prologue: 22 | commands: 23 | - sem-version python 3.10 24 | - checkout --use-cache 25 | - git switch -c pr 26 | - cache restore 27 | - pip install poetry==1.5.1 28 | - make install 29 | jobs: 30 | - name: make lint 31 | commands: 32 | - make lint 33 | dependencies: 34 | - install deps 35 | - name: test-unit 36 | task: 37 | prologue: 38 | commands: 39 | - sem-version python 3.10 40 | - checkout --use-cache 41 | - git switch -c pr 42 | - cache restore 43 | - pip install poetry==1.5.1 44 | - make install 45 | jobs: 46 | - name: make test-unit 47 | commands: 48 | - make test-unit 49 | dependencies: 50 | - install deps -------------------------------------------------------------------------------- /.github/workflows/python-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will upload a Python Package using Twine when a release is created 2 | # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries 3 | 4 | name: Upload Python Package 5 | 6 | on: 7 | release: 8 | types: [published] 9 | workflow_dispatch: 10 | inputs: 11 | version: 12 | description: 'What version to use for the release' 13 | required: true 14 | 15 | jobs: 16 | deploy: 17 | 18 | runs-on: ubuntu-latest 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | 23 | - name: Set up Python 24 | uses: actions/setup-python@v2 25 | with: 26 | python-version: '3.x' 27 | 28 | - name: Install dependencies 29 | run: | 30 | python -m pip install --upgrade pip 31 | pip install --upgrade poetry 32 | 33 | - name: Set release version 34 | run: | 35 | tag="${{ github.event.inputs.version }}" 36 | if [ -z "$tag" ]; then 37 | tag="${GITHUB_REF_NAME}" 38 | fi 39 | version="${tag#v}" # Strip leading v 40 | 41 | # Bump poetry tag 42 | poetry version "$version" 43 | 44 | - name: Build and publish 45 | run: | 46 | poetry install 47 | poetry build 48 | TWINE_USERNAME=__token__ \ 49 | TWINE_PASSWORD="${{ secrets.PYPI_TOKEN }}" \ 50 | poetry run twine upload dist/* 51 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "replit.object_storage" 3 | version = "1.0.0" 4 | description = "A library for interacting with Object Storage on Replit" 5 | authors = ["Repl.it "] 6 | license = "ISC" 7 | readme = "README.md" 8 | repository = "https://github.com/replit/replit-object-storage-python" 9 | homepage = "https://github.com/replit/replit-object-storage-python" 10 | classifiers = [ 11 | "Programming Language :: Python :: 3", 12 | "License :: OSI Approved :: ISC License (ISCL)", 13 | "Operating System :: OS Independent", 14 | ] 15 | packages = [ 16 | { include = "replit", from = "src" }, 17 | ] 18 | exclude = ["tests"] 19 | 20 | [tool.poetry.dependencies] 21 | python = ">=3.8.0,<3.13" 22 | google-cloud-storage = "^2.14.0" 23 | requests = "^2.31.0" 24 | 25 | [tool.poetry.group.dev.dependencies] 26 | ruff = "^0.1.15" 27 | pytest = "^8.0.0" 28 | twine = "*" 29 | pytest-cov = "^4.1.0" 30 | tox = "^4.13.0" 31 | pydoc-markdown = "^4.8.2" 32 | 33 | [[tool.pydoc-markdown.loaders]] 34 | type = "python" 35 | search_path = [ "src" ] 36 | 37 | [tool.pydoc-markdown.renderer] 38 | docs_base_path = "docs" 39 | relative_output_path = "." 40 | 41 | type = "docusaurus" 42 | 43 | [tool.pydoc-markdown.renderer.markdown] 44 | data_code_block = true 45 | descriptive_class_title = "Class " 46 | insert_header_anchors = false 47 | render_page_title = false 48 | render_module_header_template = "" 49 | signature_with_decorators = false 50 | 51 | [tool.pyright] 52 | # https://github.com/microsoft/pyright/blob/main/docs/configuration.md 53 | useLibraryCodeForTypes = true 54 | exclude = [".cache"] 55 | 56 | [tool.ruff] 57 | # https://beta.ruff.rs/docs/configuration/ 58 | indent-width = 4 59 | line-length = 88 60 | select = ['E', 'W', 'F', 'I', 'B', 'D', 'C4', 'ARG', 'SIM'] 61 | ignore = ['W291', 'W292', 'W293'] 62 | 63 | [tool.ruff.per-file-ignores] 64 | "__init__.py" = ["F401"] 65 | "tests/**/*" = ["D"] 66 | 67 | [tool.ruff.lint.pydocstyle] 68 | convention = "google" 69 | 70 | [build-system] 71 | requires = ["poetry-core>=1.0.0"] 72 | build-backend = "poetry.core.masonry.api" -------------------------------------------------------------------------------- /src/replit/object_storage/errors.py: -------------------------------------------------------------------------------- 1 | """Errors that may be returned by the storage library.""" 2 | from functools import wraps 3 | 4 | from google.cloud.exceptions import ( 5 | Forbidden, 6 | NotFound, 7 | TooManyRequests, 8 | Unauthorized, 9 | ) 10 | 11 | 12 | class BucketNotFoundError(Exception): 13 | """BucketNotFoundError may occur if the specified bucket could not be found.""" 14 | pass 15 | 16 | 17 | class DefaultBucketError(Exception): 18 | """DefaultBucketError may occur if the default bucket could not be resolved.""" 19 | pass 20 | 21 | 22 | class ForbiddenError(Exception): 23 | """ForbiddenError may occur if access to the requested resource is not allowed.""" 24 | pass 25 | 26 | 27 | class ObjectNotFoundError(Exception): 28 | """ObjectNotFoundError may occur if the requested object could not be found.""" 29 | pass 30 | 31 | 32 | class TooManyRequestsError(Exception): 33 | """TooManyRequestsError may occur if the rate of requests exceeds the rate limit.""" 34 | pass 35 | 36 | 37 | class UnauthorizedError(Exception): 38 | """UnauthorizedError may occur if the requested operation is not allowed.""" 39 | pass 40 | 41 | 42 | def _google_error_handler(func): 43 | """Wraps functions that call GCP APIs and handles common errors. 44 | 45 | Common errors are re-raised in more digestable formats, less common errors are passed 46 | through. 47 | """ 48 | @wraps(func) 49 | def wrapper(*args, **kwargs): 50 | try: 51 | return func(*args, **kwargs) 52 | except Forbidden as err: 53 | raise ForbiddenError("Access to the requested resource is not allowed.") from err 54 | except NotFound as err: 55 | if "The specified bucket does not exist." in err.message: 56 | raise BucketNotFoundError("The requested bucket could not be found.") from err 57 | raise ObjectNotFoundError( 58 | "The requested object could not be found.") from err 59 | except TooManyRequests as err: 60 | raise TooManyRequestsError("Rate limit exceeded.") from err 61 | except Unauthorized as err: 62 | raise UnauthorizedError("The requested operation is not allowed.") from err 63 | # Other exceptions we'll bubble up for now 64 | 65 | return wrapper 66 | -------------------------------------------------------------------------------- /tests/unit/replit/object_storage/test_client.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import MagicMock, patch 2 | 3 | import pytest 4 | import requests 5 | from google.cloud import storage 6 | from replit.object_storage import Client, DefaultBucketError 7 | 8 | from tests.unit.replit.object_storage.mocks import ( 9 | build_mock_default_bucket_response, 10 | build_mock_gcs_client, 11 | ) 12 | 13 | 14 | @pytest.fixture(autouse=True) 15 | def gcs_client(): 16 | with patch.object(storage, "Client", build_mock_gcs_client()): 17 | yield 18 | 19 | 20 | @pytest.fixture(autouse=True) 21 | def requests_get(): 22 | with patch.object(requests, 23 | "get", 24 | return_value=build_mock_default_bucket_response()): 25 | yield 26 | 27 | 28 | def test_get_default_bucket_success(): 29 | result = Client().exists("object-name") 30 | assert result 31 | 32 | 33 | @patch.object(requests, "get") 34 | def test_get_default_bucket_http_eror(mock_get): 35 | mock_response = MagicMock() 36 | mock_response.raise_for_status.side_effect = requests.HTTPError 37 | mock_get.return_value = mock_response 38 | 39 | with pytest.raises(DefaultBucketError): 40 | Client().exists("object-name") 41 | 42 | 43 | @patch.object(requests, "get") 44 | def test_get_default_bucket_malformed_response(mock_get): 45 | mock_response = MagicMock() 46 | mock_response.json.return_value = {} 47 | mock_get.return_value = mock_response 48 | 49 | with pytest.raises(DefaultBucketError): 50 | Client().exists("object-name") 51 | 52 | 53 | def test_copy(): 54 | result = Client("bucket-id").copy("object-name", "dest-object-name") 55 | assert result is None 56 | 57 | 58 | def test_delete(): 59 | result = Client("bucket-id").delete("object-name") 60 | assert result is None 61 | 62 | 63 | def test_download_as_bytes(): 64 | result = Client("bucket-id").download_as_bytes("object-name") 65 | assert result == str.encode("test-bytes") 66 | 67 | 68 | def test_download_as_text(): 69 | result = Client("bucket-id").download_as_text("object-name") 70 | assert result == "test-text" 71 | 72 | 73 | def test_download_to_filename(): 74 | result = Client("bucket-id").download_to_filename("object-name", 75 | "dest-filename") 76 | assert result is None 77 | 78 | 79 | def test_exists(): 80 | result = Client("bucket-id").exists("object-name") 81 | assert isinstance(result, bool) 82 | assert result 83 | 84 | 85 | def test_list(): 86 | result = Client("bucket-id").list("object-name") 87 | assert isinstance(result, list) 88 | 89 | 90 | def test_upload_from_filename(): 91 | result = Client("bucket-id").upload_from_filename("object-name", 92 | "src-filename") 93 | assert result is None 94 | 95 | 96 | def test_upload_from_bytes(): 97 | result = Client("bucket-id").upload_from_bytes("object-name", 98 | bytes("src-text", "utf-8")) 99 | assert result is None 100 | 101 | 102 | def test_upload_from_text(): 103 | result = Client("bucket-id").upload_from_text("object-name", "src-text") 104 | assert result is None 105 | -------------------------------------------------------------------------------- /docs/replit/object_storage/client.md: -------------------------------------------------------------------------------- 1 | # replit.object\_storage.client 2 | 3 | Client for interacting with Object Storage. This is the top-level interface. 4 | 5 | Note: this Client is a thin wrapper over the GCS Python Library. As a result, 6 | many docstrings are borrowed from the underlying library. 7 | 8 | ## Class Client 9 | 10 | ```python 11 | class Client() 12 | ``` 13 | 14 | Client manages interactions with Replit Object Storage. 15 | 16 | If multiple buckets are used within an application, one Client should be used 17 | per bucket 18 | 19 | Any method may return one of the following errors: 20 | - `BucketNotFoundError`: If the bucket configured for the client could not be found. 21 | - `DefaultBucketError`: If no bucket was explicitly configured and an error occurred 22 | when resolving the default bucket. 23 | - `ForbiddenError`: If access to the requested resource is not allowed. 24 | - `TooManyRequestsError`: If rate limiting occurs. 25 | - `UnauthorizedError`: If the requested operation is not allowed. 26 | 27 | #### \_\_init\_\_ 28 | 29 | ```python 30 | def __init__(bucket_id: Optional[str] = None) 31 | ``` 32 | 33 | Creates a new Client. 34 | 35 | **Arguments**: 36 | 37 | - `bucket_id` - The ID of the bucket this Client should interface with. 38 | If no ID is defined, the Repl / Deployment's default bucket will be 39 | used. 40 | 41 | #### copy 42 | 43 | ```python 44 | def copy(object_name: str, dest_object_name: str) -> None 45 | ``` 46 | 47 | Copies the specified object within the same bucket. 48 | 49 | If an object exists in the same location, it will be overwritten. 50 | 51 | **Arguments**: 52 | 53 | - `object_name` - The full path of the object to be copied. 54 | - `dest_object_name` - The full path to copy the object to. 55 | 56 | 57 | **Raises**: 58 | 59 | - `ObjectNotFoundError` - If the source object could not be found. 60 | 61 | #### delete 62 | 63 | ```python 64 | def delete(object_name: str, ignore_not_found: bool = False) -> None 65 | ``` 66 | 67 | Deletes an object from Object Storage. 68 | 69 | **Arguments**: 70 | 71 | - `object_name` - The name of the object to be deleted. 72 | - `ignore_not_found` - Whether an error should be raised if the object does not 73 | exist. 74 | 75 | 76 | **Raises**: 77 | 78 | - `ObjectNotFoundError` - If the object could not be found. 79 | 80 | #### download\_as\_bytes 81 | 82 | ```python 83 | def download_as_bytes(object_name: str) -> bytes 84 | ``` 85 | 86 | Download the contents an object as a bytes object. 87 | 88 | **Arguments**: 89 | 90 | - `object_name` - The name of the object to be downloaded. 91 | 92 | 93 | **Returns**: 94 | 95 | The raw byte representation of the object's contents. 96 | 97 | 98 | **Raises**: 99 | 100 | - `ObjectNotFoundError` - If the object could not be found. 101 | 102 | #### download\_as\_text 103 | 104 | ```python 105 | def download_as_text(object_name: str) -> str 106 | ``` 107 | 108 | Download the contents an object as a string. 109 | 110 | **Arguments**: 111 | 112 | - `object_name` - The name of the object to be downloaded. 113 | 114 | 115 | **Returns**: 116 | 117 | The object's contents as a UTF-8 encoded string. 118 | 119 | 120 | **Raises**: 121 | 122 | - `ObjectNotFoundError` - If the object could not be found. 123 | 124 | #### download\_to\_filename 125 | 126 | ```python 127 | def download_to_filename(object_name: str, dest_filename: str) -> None 128 | ``` 129 | 130 | Download the contents an object into a file on the local disk. 131 | 132 | **Arguments**: 133 | 134 | - `object_name` - The name of the object to be downloaded. 135 | - `dest_filename` - The filename of the file on the local disk to be written. 136 | 137 | 138 | **Raises**: 139 | 140 | - `ObjectNotFoundError` - If the object could not be found. 141 | 142 | #### exists 143 | 144 | ```python 145 | def exists(object_name: str) -> bool 146 | ``` 147 | 148 | Checks if an object exist. 149 | 150 | **Arguments**: 151 | 152 | - `object_name` - The name of the object to be checked. 153 | 154 | 155 | **Returns**: 156 | 157 | Whether or not the object exists. 158 | 159 | #### list 160 | 161 | ```python 162 | def list(end_offset: Optional[str] = None, 163 | match_glob: Optional[str] = None, 164 | max_results: Optional[int] = None, 165 | prefix: Optional[str] = None, 166 | start_offset: Optional[str] = None) -> List[Object] 167 | ``` 168 | 169 | Lists objects in the bucket. 170 | 171 | **Arguments**: 172 | 173 | - `end_offset` - Filter results to objects whose names are lexicographically 174 | before end_offset. If start_offset is also set, the objects listed 175 | have names between start_offset (inclusive) and end_offset 176 | (exclusive). 177 | - `match_glob` - Glob pattern used to filter results, for example foo*bar. 178 | - `max_results` - The maximum number of results that can be returned in the 179 | response. 180 | - `prefix` - Filter results to objects who names have the specified prefix. 181 | - `start_offset` - Filter results to objects whose names are 182 | lexicographically equal to or after start_offset. If endOffset is 183 | also set, the objects listed have names between start_offset 184 | (inclusive) and end_offset (exclusive). 185 | 186 | 187 | **Returns**: 188 | 189 | A list of objects matching the given query parameters. 190 | 191 | #### upload\_from\_filename 192 | 193 | ```python 194 | def upload_from_filename(dest_object_name: str, src_filename: str) -> None 195 | ``` 196 | 197 | Upload an object from a file on the local disk. 198 | 199 | **Arguments**: 200 | 201 | - `dest_object_name` - The name of the object to be uploaded. 202 | - `src_filename` - The filename of a file on the local disk 203 | 204 | #### upload\_from\_bytes 205 | 206 | ```python 207 | def upload_from_bytes(dest_object_name: str, src_data: bytes) -> None 208 | ``` 209 | 210 | Upload an object from bytes. 211 | 212 | **Arguments**: 213 | 214 | - `dest_object_name` - The name of the object to be uploaded. 215 | - `src_data` - The bytes to be uploaded. 216 | 217 | #### upload\_from\_text 218 | 219 | ```python 220 | def upload_from_text(dest_object_name: str, src_data: Union[bytes, 221 | str]) -> None 222 | ``` 223 | 224 | Upload an object from a string. 225 | 226 | **Arguments**: 227 | 228 | - `dest_object_name` - The name of the object to be uploaded. 229 | - `src_data` - The text to be uploaded. 230 | 231 | -------------------------------------------------------------------------------- /tests/integration/replit/object_storage/test_client.py: -------------------------------------------------------------------------------- 1 | from tempfile import TemporaryDirectory 2 | from uuid import uuid4 3 | 4 | import pytest 5 | from replit.object_storage import Client, Object 6 | from replit.object_storage.errors import ObjectNotFoundError 7 | 8 | TEST_FILE_CONTENTS = "Hello World!" 9 | 10 | 11 | @pytest.fixture(scope='session', autouse=True) 12 | def testdir(): 13 | dir = str(uuid4()) 14 | yield dir 15 | client = Client() 16 | for object in client.list(prefix=dir): 17 | client.delete(object.name) 18 | 19 | 20 | class TestCopy: 21 | 22 | @staticmethod 23 | def test_upload_then_copy(testdir): 24 | client = Client() 25 | client.upload_from_text(f"{testdir}/copy-1-1.txt", TEST_FILE_CONTENTS) 26 | 27 | client.copy(f"{testdir}/copy-1-1.txt", f"{testdir}/copy-1-2.txt") 28 | exists = client.exists(f"{testdir}/copy-1-2.txt") 29 | assert exists 30 | 31 | 32 | @staticmethod 33 | def test_not_found(testdir): 34 | client = Client() 35 | with pytest.raises(ObjectNotFoundError): 36 | client.copy(f"{testdir}/copy-2-1.txt", f"{testdir}/copy-2-2.txt") 37 | 38 | 39 | class TestDelete: 40 | 41 | @staticmethod 42 | def test_upload_then_delete(testdir): 43 | client = Client() 44 | client.upload_from_text(f"{testdir}/delete-1.txt", TEST_FILE_CONTENTS) 45 | exists = client.exists(f"{testdir}/delete-1.txt") 46 | assert exists 47 | 48 | client.delete(f"{testdir}/delete-1.txt") 49 | exists = client.exists(f"{testdir}/delete-1.txt") 50 | assert not exists 51 | 52 | @staticmethod 53 | def test_not_exists(testdir): 54 | client = Client() 55 | 56 | with pytest.raises(ObjectNotFoundError): 57 | client.delete(f"{testdir}/delete-2.txt") 58 | 59 | 60 | @staticmethod 61 | def test_not_exists_ignore_not_found(testdir): 62 | client = Client() 63 | 64 | result = client.delete(f"{testdir}/delete-3.txt", ignore_not_found=True) 65 | assert result is None 66 | 67 | 68 | class TestDownloadAsBytes: 69 | 70 | @staticmethod 71 | def test_upload_then_download(testdir): 72 | client = Client() 73 | client.upload_from_text(f"{testdir}/download-as-bytes-1.txt", 74 | TEST_FILE_CONTENTS) 75 | 76 | result = client.download_as_bytes(f"{testdir}/download-as-bytes-1.txt") 77 | assert result == bytes(TEST_FILE_CONTENTS, 'utf-8') 78 | 79 | @staticmethod 80 | def test_not_found(testdir): 81 | client = Client() 82 | with pytest.raises(ObjectNotFoundError): 83 | client.download_as_bytes(f"{testdir}/download-as-bytes-2.txt") 84 | 85 | 86 | class TestDownloadAsText: 87 | 88 | @staticmethod 89 | def test_upload_then_download(testdir): 90 | client = Client() 91 | client.upload_from_text(f"{testdir}/download-as-string-1.txt", 92 | TEST_FILE_CONTENTS) 93 | 94 | result = client.download_as_text(f"{testdir}/download-as-string-1.txt") 95 | assert result == TEST_FILE_CONTENTS 96 | 97 | @staticmethod 98 | def test_not_found(testdir): 99 | client = Client() 100 | with pytest.raises(ObjectNotFoundError): 101 | client.download_as_bytes(f"{testdir}/download-as-string-2.txt") 102 | 103 | 104 | class TestDownloadToFilename: 105 | 106 | @staticmethod 107 | def test_upload_then_download(testdir): 108 | client = Client() 109 | client.upload_from_text(f"{testdir}/download-to-filename-1.txt", 110 | TEST_FILE_CONTENTS) 111 | 112 | tmpdir = TemporaryDirectory() 113 | with tmpdir: 114 | client.download_to_filename(f"{testdir}/download-to-filename-1.txt", 115 | f"{tmpdir.name}/download-to-filename-1.txt") 116 | with open(f"{tmpdir.name}/download-to-filename-1.txt", 'r') as file: 117 | contents = file.read() 118 | assert contents == TEST_FILE_CONTENTS 119 | 120 | @staticmethod 121 | def test_not_found(testdir): 122 | client = Client() 123 | 124 | tmpdir = TemporaryDirectory() 125 | with tmpdir, pytest.raises(ObjectNotFoundError): 126 | client.download_to_filename( 127 | f"{testdir}/download-to-filename-2.txt", 128 | f"{tmpdir.name}/download-to-filename-2.txt" 129 | ) 130 | 131 | 132 | class TestExists: 133 | 134 | @staticmethod 135 | def test_exists(testdir): 136 | client = Client() 137 | client.upload_from_text(f"{testdir}/exists-1.txt", TEST_FILE_CONTENTS) 138 | 139 | exists = client.exists(f"{testdir}/exists-1.txt") 140 | assert exists 141 | 142 | @staticmethod 143 | def test_does_not_exist(): 144 | client = Client() 145 | exists = client.exists("bad-object") 146 | assert not exists 147 | 148 | 149 | class TestList: 150 | 151 | @staticmethod 152 | def test_upload_multiple_then_list(testdir): 153 | client = Client() 154 | client.upload_from_text(f"{testdir}/list/list-1-1.txt", 155 | TEST_FILE_CONTENTS) 156 | client.upload_from_text(f"{testdir}/list/list-1-2.txt", 157 | TEST_FILE_CONTENTS) 158 | objects = client.list(prefix=f"{testdir}/list") 159 | assert objects == [ 160 | Object(name=f"{testdir}/list/list-1-1.txt"), 161 | Object(name=f"{testdir}/list/list-1-2.txt") 162 | ] 163 | 164 | 165 | class TestUploadfromFilename: 166 | 167 | @staticmethod 168 | def test_upload_then_download(testdir): 169 | client = Client() 170 | 171 | tmpdir = TemporaryDirectory() 172 | with tmpdir: 173 | with open(f"{tmpdir.name}/upload-from-filename-1.txt", 'w') as file: 174 | file.write(TEST_FILE_CONTENTS) 175 | 176 | client.upload_from_filename(f"{testdir}/upload-from-filename-1.txt", 177 | f"{tmpdir.name}/upload-from-filename-1.txt") 178 | 179 | result = client.download_as_text(f"{testdir}/upload-from-filename-1.txt") 180 | assert result == TEST_FILE_CONTENTS 181 | 182 | 183 | class TestUploadFromBytes: 184 | 185 | @staticmethod 186 | def test_upload_then_download(testdir): 187 | client = Client() 188 | contents = bytes(TEST_FILE_CONTENTS, 'utf-8') 189 | client.upload_from_bytes(f"{testdir}/upload-from-bytes-1.txt", contents) 190 | 191 | result = client.download_as_bytes(f"{testdir}/upload-from-bytes-1.txt") 192 | assert result == contents 193 | 194 | 195 | 196 | class TestUploadFromText: 197 | 198 | @staticmethod 199 | def test_upload_then_download(testdir): 200 | client = Client() 201 | client.upload_from_text(f"{testdir}/upload-from-string-1.txt", 202 | TEST_FILE_CONTENTS) 203 | 204 | result = client.download_as_text(f"{testdir}/upload-from-string-1.txt") 205 | assert result == TEST_FILE_CONTENTS 206 | -------------------------------------------------------------------------------- /src/replit/object_storage/client.py: -------------------------------------------------------------------------------- 1 | """Client for interacting with Object Storage. This is the top-level interface. 2 | 3 | Note: this Client is a thin wrapper over the GCS Python Library. As a result, 4 | many docstrings are borrowed from the underlying library. 5 | """ 6 | 7 | from typing import List, Optional, Union 8 | 9 | import requests 10 | from google.auth import identity_pool 11 | from google.cloud import storage 12 | from google.cloud.exceptions import NotFound 13 | from replit.object_storage._config import REPLIT_ADC, REPLIT_DEFAULT_BUCKET_URL 14 | from replit.object_storage.errors import ( 15 | DefaultBucketError, 16 | ObjectNotFoundError, 17 | _google_error_handler, 18 | ) 19 | from replit.object_storage.object import Object 20 | 21 | 22 | class Client: 23 | """Client manages interactions with Replit Object Storage. 24 | 25 | If multiple buckets are used within an application, one Client should be used 26 | per bucket 27 | 28 | Any method may return one of the following errors: 29 | - `BucketNotFoundError`: If the bucket configured for the client could not be found. 30 | - `DefaultBucketError`: If no bucket was explicitly configured and an error occurred 31 | when resolving the default bucket. 32 | - `ForbiddenError`: If access to the requested resource is not allowed. 33 | - `TooManyRequestsError`: If rate limiting occurs. 34 | - `UnauthorizedError`: If the requested operation is not allowed. 35 | """ 36 | 37 | __gcs_client: storage.Client 38 | 39 | __bucket_id: Optional[str] = None 40 | __gcs_bucket_handle: Optional[storage.Bucket] = None 41 | 42 | def __init__(self, bucket_id: Optional[str] = None): 43 | """Creates a new Client. 44 | 45 | Args: 46 | bucket_id: The ID of the bucket this Client should interface with. 47 | If no ID is defined, the Repl / Deployment's default bucket will be 48 | used. 49 | """ 50 | creds = identity_pool.Credentials(**REPLIT_ADC) 51 | if bucket_id: 52 | self.__bucket_id = bucket_id 53 | self.__gcs_client = storage.Client(credentials=creds, project="") 54 | self.__gcs_bucket_handle = None 55 | 56 | @_google_error_handler 57 | def copy(self, object_name: str, dest_object_name: str) -> None: 58 | """Copies the specified object within the same bucket. 59 | 60 | If an object exists in the same location, it will be overwritten. 61 | 62 | Args: 63 | object_name: The full path of the object to be copied. 64 | dest_object_name: The full path to copy the object to. 65 | 66 | Raises: 67 | ObjectNotFoundError: If the source object could not be found. 68 | """ 69 | source_object = self.__object(object_name) 70 | bucket = self.__bucket() 71 | bucket.copy_blob( 72 | source_object, 73 | bucket, 74 | dest_object_name, 75 | ) 76 | 77 | @_google_error_handler 78 | def delete(self, object_name: str, ignore_not_found: bool = False) -> None: 79 | """Deletes an object from Object Storage. 80 | 81 | Args: 82 | object_name: The name of the object to be deleted. 83 | ignore_not_found: Whether an error should be raised if the object does not 84 | exist. 85 | 86 | Raises: 87 | ObjectNotFoundError: If the object could not be found. 88 | """ 89 | try: 90 | return self.__object(object_name).delete() 91 | except NotFound as err: 92 | if ignore_not_found: 93 | return 94 | raise ObjectNotFoundError("The requested object could not be found.") from err 95 | 96 | @_google_error_handler 97 | def download_as_bytes(self, object_name: str) -> bytes: 98 | """Download the contents an object as a bytes object. 99 | 100 | Args: 101 | object_name: The name of the object to be downloaded. 102 | 103 | Returns: 104 | The raw byte representation of the object's contents. 105 | 106 | Raises: 107 | ObjectNotFoundError: If the object could not be found. 108 | """ 109 | return self.__object(object_name).download_as_bytes() 110 | 111 | @_google_error_handler 112 | def download_as_text(self, object_name: str) -> str: 113 | """Download the contents an object as a string. 114 | 115 | Args: 116 | object_name: The name of the object to be downloaded. 117 | 118 | Returns: 119 | The object's contents as a UTF-8 encoded string. 120 | 121 | Raises: 122 | ObjectNotFoundError: If the object could not be found. 123 | """ 124 | return self.__object(object_name).download_as_text() 125 | 126 | @_google_error_handler 127 | def download_to_filename(self, object_name: str, dest_filename: str) -> None: 128 | """Download the contents an object into a file on the local disk. 129 | 130 | Args: 131 | object_name: The name of the object to be downloaded. 132 | dest_filename: The filename of the file on the local disk to be written. 133 | 134 | Raises: 135 | ObjectNotFoundError: If the object could not be found. 136 | """ 137 | return self.__object(object_name).download_to_filename(dest_filename) 138 | 139 | @_google_error_handler 140 | def exists(self, object_name: str) -> bool: 141 | """Checks if an object exist. 142 | 143 | Args: 144 | object_name: The name of the object to be checked. 145 | 146 | Returns: 147 | Whether or not the object exists. 148 | """ 149 | return self.__object(object_name).exists() 150 | 151 | @_google_error_handler 152 | def list( 153 | self, 154 | end_offset: Optional[str] = None, 155 | match_glob: Optional[str] = None, 156 | max_results: Optional[int] = None, 157 | prefix: Optional[str] = None, 158 | start_offset: Optional[str] = None, 159 | ) -> List[Object]: 160 | """Lists objects in the bucket. 161 | 162 | Args: 163 | end_offset: Filter results to objects whose names are lexicographically 164 | before end_offset. If start_offset is also set, the objects listed 165 | have names between start_offset (inclusive) and end_offset 166 | (exclusive). 167 | match_glob: Glob pattern used to filter results, for example foo*bar. 168 | max_results: The maximum number of results that can be returned in the 169 | response. 170 | prefix: Filter results to objects who names have the specified prefix. 171 | start_offset: Filter results to objects whose names are 172 | lexicographically equal to or after start_offset. If endOffset is 173 | also set, the objects listed have names between start_offset 174 | (inclusive) and end_offset (exclusive). 175 | 176 | Returns: 177 | A list of objects matching the given query parameters. 178 | """ 179 | iter = self.__bucket().list_blobs( 180 | end_offset=end_offset, 181 | match_glob=match_glob, 182 | max_results=max_results, 183 | prefix=prefix, 184 | start_offset=start_offset, 185 | ) 186 | return [Object(name=object.name) for object in iter] 187 | 188 | @_google_error_handler 189 | def upload_from_filename(self, dest_object_name: str, 190 | src_filename: str) -> None: 191 | """Upload an object from a file on the local disk. 192 | 193 | Args: 194 | dest_object_name: The name of the object to be uploaded. 195 | src_filename: The filename of a file on the local disk 196 | """ 197 | self.__object(dest_object_name).upload_from_filename(src_filename) 198 | 199 | @_google_error_handler 200 | def upload_from_bytes(self, dest_object_name: str, src_data: bytes) -> None: 201 | """Upload an object from bytes. 202 | 203 | Args: 204 | dest_object_name: The name of the object to be uploaded. 205 | src_data: The bytes to be uploaded. 206 | """ 207 | self.__object(dest_object_name).upload_from_string(src_data) 208 | 209 | @_google_error_handler 210 | def upload_from_text( 211 | self, 212 | dest_object_name: str, 213 | src_data: Union[bytes, str] 214 | ) -> None: 215 | """Upload an object from a string. 216 | 217 | Args: 218 | dest_object_name: The name of the object to be uploaded. 219 | src_data: The text to be uploaded. 220 | """ 221 | self.__object(dest_object_name).upload_from_string(src_data) 222 | 223 | def __bucket(self) -> storage.Bucket: 224 | if self.__gcs_bucket_handle is None: 225 | self.__gcs_bucket_handle = self.__get_bucket_handle() 226 | return self.__gcs_bucket_handle 227 | 228 | def __object(self, object_name: str) -> storage.Blob: 229 | return self.__bucket().blob(object_name) 230 | 231 | def __get_bucket_handle(self) -> storage.Bucket: 232 | if self.__bucket_id is None: 233 | self.__bucket_id = self.__get_default_bucket_id() 234 | return self.__gcs_client.bucket(self.__bucket_id) 235 | 236 | @staticmethod 237 | def __get_default_bucket_id() -> str: 238 | response = requests.get(REPLIT_DEFAULT_BUCKET_URL) 239 | try: 240 | response.raise_for_status() 241 | except requests.HTTPError as exc: 242 | raise DefaultBucketError("failed to request default bucket") from exc 243 | 244 | bucket_id = response.json().get("bucketId", "") 245 | if bucket_id == "": 246 | raise DefaultBucketError("no default bucket was specified, it may need " 247 | "to be configured in .replit") 248 | 249 | return bucket_id 250 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "black" 5 | version = "23.12.1" 6 | description = "The uncompromising code formatter." 7 | optional = false 8 | python-versions = ">=3.8" 9 | files = [ 10 | {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, 11 | {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, 12 | {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, 13 | {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, 14 | {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, 15 | {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, 16 | {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, 17 | {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, 18 | {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, 19 | {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, 20 | {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, 21 | {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, 22 | {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, 23 | {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, 24 | {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, 25 | {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, 26 | {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, 27 | {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, 28 | {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, 29 | {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, 30 | {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, 31 | {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, 32 | ] 33 | 34 | [package.dependencies] 35 | click = ">=8.0.0" 36 | mypy-extensions = ">=0.4.3" 37 | packaging = ">=22.0" 38 | pathspec = ">=0.9.0" 39 | platformdirs = ">=2" 40 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 41 | typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} 42 | 43 | [package.extras] 44 | colorama = ["colorama (>=0.4.3)"] 45 | d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] 46 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 47 | uvloop = ["uvloop (>=0.15.2)"] 48 | 49 | [[package]] 50 | name = "cachetools" 51 | version = "5.3.2" 52 | description = "Extensible memoizing collections and decorators" 53 | optional = false 54 | python-versions = ">=3.7" 55 | files = [ 56 | {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, 57 | {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, 58 | ] 59 | 60 | [[package]] 61 | name = "certifi" 62 | version = "2024.7.4" 63 | description = "Python package for providing Mozilla's CA Bundle." 64 | optional = false 65 | python-versions = ">=3.6" 66 | files = [ 67 | {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, 68 | {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, 69 | ] 70 | 71 | [[package]] 72 | name = "cffi" 73 | version = "1.16.0" 74 | description = "Foreign Function Interface for Python calling C code." 75 | optional = false 76 | python-versions = ">=3.8" 77 | files = [ 78 | {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, 79 | {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, 80 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, 81 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, 82 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, 83 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, 84 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, 85 | {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, 86 | {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, 87 | {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, 88 | {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, 89 | {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, 90 | {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, 91 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, 92 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, 93 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, 94 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, 95 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, 96 | {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, 97 | {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, 98 | {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, 99 | {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, 100 | {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, 101 | {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, 102 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, 103 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, 104 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, 105 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, 106 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, 107 | {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, 108 | {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, 109 | {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, 110 | {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, 111 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, 112 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, 113 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, 114 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, 115 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, 116 | {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, 117 | {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, 118 | {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, 119 | {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, 120 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, 121 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, 122 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, 123 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, 124 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, 125 | {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, 126 | {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, 127 | {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, 128 | {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, 129 | {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, 130 | ] 131 | 132 | [package.dependencies] 133 | pycparser = "*" 134 | 135 | [[package]] 136 | name = "chardet" 137 | version = "5.2.0" 138 | description = "Universal encoding detector for Python 3" 139 | optional = false 140 | python-versions = ">=3.7" 141 | files = [ 142 | {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, 143 | {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, 144 | ] 145 | 146 | [[package]] 147 | name = "charset-normalizer" 148 | version = "3.3.2" 149 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 150 | optional = false 151 | python-versions = ">=3.7.0" 152 | files = [ 153 | {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, 154 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, 155 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, 156 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, 157 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, 158 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, 159 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, 160 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, 161 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, 162 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, 163 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, 164 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, 165 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, 166 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, 167 | {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, 168 | {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, 169 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, 170 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, 171 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, 172 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, 173 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, 174 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, 175 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, 176 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, 177 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, 178 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, 179 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, 180 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, 181 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, 182 | {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, 183 | {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, 184 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, 185 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, 186 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, 187 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, 188 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, 189 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, 190 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, 191 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, 192 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, 193 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, 194 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, 195 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, 196 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, 197 | {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, 198 | {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, 199 | {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, 200 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, 201 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, 202 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, 203 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, 204 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, 205 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, 206 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, 207 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, 208 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, 209 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, 210 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, 211 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, 212 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, 213 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, 214 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, 215 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, 216 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, 217 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, 218 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, 219 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, 220 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, 221 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, 222 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, 223 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, 224 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, 225 | {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, 226 | {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, 227 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, 228 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, 229 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, 230 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, 231 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, 232 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, 233 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, 234 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, 235 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, 236 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, 237 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, 238 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, 239 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, 240 | {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, 241 | {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, 242 | {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, 243 | ] 244 | 245 | [[package]] 246 | name = "click" 247 | version = "8.1.7" 248 | description = "Composable command line interface toolkit" 249 | optional = false 250 | python-versions = ">=3.7" 251 | files = [ 252 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 253 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 254 | ] 255 | 256 | [package.dependencies] 257 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 258 | 259 | [[package]] 260 | name = "colorama" 261 | version = "0.4.6" 262 | description = "Cross-platform colored terminal text." 263 | optional = false 264 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 265 | files = [ 266 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 267 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 268 | ] 269 | 270 | [[package]] 271 | name = "coverage" 272 | version = "7.4.2" 273 | description = "Code coverage measurement for Python" 274 | optional = false 275 | python-versions = ">=3.8" 276 | files = [ 277 | {file = "coverage-7.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf54c3e089179d9d23900e3efc86d46e4431188d9a657f345410eecdd0151f50"}, 278 | {file = "coverage-7.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe6e43c8b510719b48af7db9631b5fbac910ade4bd90e6378c85ac5ac706382c"}, 279 | {file = "coverage-7.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b98c89db1b150d851a7840142d60d01d07677a18f0f46836e691c38134ed18b"}, 280 | {file = "coverage-7.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f9683be6a5b19cd776ee4e2f2ffb411424819c69afab6b2db3a0a364ec6642"}, 281 | {file = "coverage-7.4.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cdcbf7b9cb83fe047ee09298e25b1cd1636824067166dc97ad0543b079d22f"}, 282 | {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2599972b21911111114100d362aea9e70a88b258400672626efa2b9e2179609c"}, 283 | {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ef00d31b7569ed3cb2036f26565f1984b9fc08541731ce01012b02a4c238bf03"}, 284 | {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:20a875bfd8c282985c4720c32aa05056f77a68e6d8bbc5fe8632c5860ee0b49b"}, 285 | {file = "coverage-7.4.2-cp310-cp310-win32.whl", hash = "sha256:b3f2b1eb229f23c82898eedfc3296137cf1f16bb145ceab3edfd17cbde273fb7"}, 286 | {file = "coverage-7.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7df95fdd1432a5d2675ce630fef5f239939e2b3610fe2f2b5bf21fa505256fa3"}, 287 | {file = "coverage-7.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8ddbd158e069dded57738ea69b9744525181e99974c899b39f75b2b29a624e2"}, 288 | {file = "coverage-7.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81a5fb41b0d24447a47543b749adc34d45a2cf77b48ca74e5bf3de60a7bd9edc"}, 289 | {file = "coverage-7.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2412e98e70f16243be41d20836abd5f3f32edef07cbf8f407f1b6e1ceae783ac"}, 290 | {file = "coverage-7.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb79414c15c6f03f56cc68fa06994f047cf20207c31b5dad3f6bab54a0f66ef"}, 291 | {file = "coverage-7.4.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf89ab85027427d351f1de918aff4b43f4eb5f33aff6835ed30322a86ac29c9e"}, 292 | {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a178b7b1ac0f1530bb28d2e51f88c0bab3e5949835851a60dda80bff6052510c"}, 293 | {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:06fe398145a2e91edaf1ab4eee66149c6776c6b25b136f4a86fcbbb09512fd10"}, 294 | {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:18cac867950943fe93d6cd56a67eb7dcd2d4a781a40f4c1e25d6f1ed98721a55"}, 295 | {file = "coverage-7.4.2-cp311-cp311-win32.whl", hash = "sha256:f72cdd2586f9a769570d4b5714a3837b3a59a53b096bb954f1811f6a0afad305"}, 296 | {file = "coverage-7.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:d779a48fac416387dd5673fc5b2d6bd903ed903faaa3247dc1865c65eaa5a93e"}, 297 | {file = "coverage-7.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adbdfcda2469d188d79771d5696dc54fab98a16d2ef7e0875013b5f56a251047"}, 298 | {file = "coverage-7.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ac4bab32f396b03ebecfcf2971668da9275b3bb5f81b3b6ba96622f4ef3f6e17"}, 299 | {file = "coverage-7.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:006d220ba2e1a45f1de083d5022d4955abb0aedd78904cd5a779b955b019ec73"}, 300 | {file = "coverage-7.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3733545eb294e5ad274abe131d1e7e7de4ba17a144505c12feca48803fea5f64"}, 301 | {file = "coverage-7.4.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42a9e754aa250fe61f0f99986399cec086d7e7a01dd82fd863a20af34cbce962"}, 302 | {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2ed37e16cf35c8d6e0b430254574b8edd242a367a1b1531bd1adc99c6a5e00fe"}, 303 | {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b953275d4edfab6cc0ed7139fa773dfb89e81fee1569a932f6020ce7c6da0e8f"}, 304 | {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32b4ab7e6c924f945cbae5392832e93e4ceb81483fd6dc4aa8fb1a97b9d3e0e1"}, 305 | {file = "coverage-7.4.2-cp312-cp312-win32.whl", hash = "sha256:f5df76c58977bc35a49515b2fbba84a1d952ff0ec784a4070334dfbec28a2def"}, 306 | {file = "coverage-7.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:34423abbaad70fea9d0164add189eabaea679068ebdf693baa5c02d03e7db244"}, 307 | {file = "coverage-7.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b11f9c6587668e495cc7365f85c93bed34c3a81f9f08b0920b87a89acc13469"}, 308 | {file = "coverage-7.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:51593a1f05c39332f623d64d910445fdec3d2ac2d96b37ce7f331882d5678ddf"}, 309 | {file = "coverage-7.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69f1665165ba2fe7614e2f0c1aed71e14d83510bf67e2ee13df467d1c08bf1e8"}, 310 | {file = "coverage-7.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3c8bbb95a699c80a167478478efe5e09ad31680931ec280bf2087905e3b95ec"}, 311 | {file = "coverage-7.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:175f56572f25e1e1201d2b3e07b71ca4d201bf0b9cb8fad3f1dfae6a4188de86"}, 312 | {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8562ca91e8c40864942615b1d0b12289d3e745e6b2da901d133f52f2d510a1e3"}, 313 | {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9a1ef0f173e1a19738f154fb3644f90d0ada56fe6c9b422f992b04266c55d5a"}, 314 | {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f40ac873045db4fd98a6f40387d242bde2708a3f8167bd967ccd43ad46394ba2"}, 315 | {file = "coverage-7.4.2-cp38-cp38-win32.whl", hash = "sha256:d1b750a8409bec61caa7824bfd64a8074b6d2d420433f64c161a8335796c7c6b"}, 316 | {file = "coverage-7.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b4ae777bebaed89e3a7e80c4a03fac434a98a8abb5251b2a957d38fe3fd30088"}, 317 | {file = "coverage-7.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ff7f92ae5a456101ca8f48387fd3c56eb96353588e686286f50633a611afc95"}, 318 | {file = "coverage-7.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:861d75402269ffda0b33af94694b8e0703563116b04c681b1832903fac8fd647"}, 319 | {file = "coverage-7.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3507427d83fa961cbd73f11140f4a5ce84208d31756f7238d6257b2d3d868405"}, 320 | {file = "coverage-7.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf711d517e21fb5bc429f5c4308fbc430a8585ff2a43e88540264ae87871e36a"}, 321 | {file = "coverage-7.4.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c00e54f0bd258ab25e7f731ca1d5144b0bf7bec0051abccd2bdcff65fa3262c9"}, 322 | {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f8e845d894e39fb53834da826078f6dc1a933b32b1478cf437007367efaf6f6a"}, 323 | {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:840456cb1067dc350af9080298c7c2cfdddcedc1cb1e0b30dceecdaf7be1a2d3"}, 324 | {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c11ca2df2206a4e3e4c4567f52594637392ed05d7c7fb73b4ea1c658ba560265"}, 325 | {file = "coverage-7.4.2-cp39-cp39-win32.whl", hash = "sha256:3ff5bdb08d8938d336ce4088ca1a1e4b6c8cd3bef8bb3a4c0eb2f37406e49643"}, 326 | {file = "coverage-7.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:ac9e95cefcf044c98d4e2c829cd0669918585755dd9a92e28a1a7012322d0a95"}, 327 | {file = "coverage-7.4.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:f593a4a90118d99014517c2679e04a4ef5aee2d81aa05c26c734d271065efcb6"}, 328 | {file = "coverage-7.4.2.tar.gz", hash = "sha256:1a5ee18e3a8d766075ce9314ed1cb695414bae67df6a4b0805f5137d93d6f1cb"}, 329 | ] 330 | 331 | [package.dependencies] 332 | tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} 333 | 334 | [package.extras] 335 | toml = ["tomli"] 336 | 337 | [[package]] 338 | name = "cryptography" 339 | version = "43.0.1" 340 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 341 | optional = false 342 | python-versions = ">=3.7" 343 | files = [ 344 | {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, 345 | {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, 346 | {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, 347 | {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, 348 | {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, 349 | {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, 350 | {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, 351 | {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, 352 | {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, 353 | {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, 354 | {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, 355 | {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, 356 | {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, 357 | {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, 358 | {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, 359 | {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, 360 | {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, 361 | {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, 362 | {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, 363 | {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, 364 | {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, 365 | {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, 366 | {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, 367 | {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, 368 | {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, 369 | {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, 370 | {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, 371 | ] 372 | 373 | [package.dependencies] 374 | cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} 375 | 376 | [package.extras] 377 | docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] 378 | docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] 379 | nox = ["nox"] 380 | pep8test = ["check-sdist", "click", "mypy", "ruff"] 381 | sdist = ["build"] 382 | ssh = ["bcrypt (>=3.1.5)"] 383 | test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] 384 | test-randomorder = ["pytest-randomly"] 385 | 386 | [[package]] 387 | name = "databind" 388 | version = "4.5.1" 389 | description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. The `databind` package will install the full suite of databind packages. Compatible with Python 3.8 and newer." 390 | optional = false 391 | python-versions = "<4.0.0,>=3.8.0" 392 | files = [ 393 | {file = "databind-4.5.1-py3-none-any.whl", hash = "sha256:e8eae14d2bbf41dfbe598883deda5c8088dfcb3ce55344b216925ea4ad48d5cf"}, 394 | {file = "databind-4.5.1.tar.gz", hash = "sha256:66f912f100d81acbbe8b9b2c5280a04341bca5d3925669371a551cc354350962"}, 395 | ] 396 | 397 | [package.dependencies] 398 | Deprecated = ">=1.2.12,<2.0.0" 399 | nr-date = ">=2.0.0,<3.0.0" 400 | nr-stream = ">=1.0.0,<2.0.0" 401 | setuptools = {version = ">=40.8.0", markers = "python_version < \"3.10\""} 402 | typeapi = ">=2.0.1,<3" 403 | typing-extensions = ">=3.10.0,<5" 404 | 405 | [[package]] 406 | name = "databind-core" 407 | version = "4.5.1" 408 | description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. Compatible with Python 3.8 and newer. Deprecated, use `databind` package." 409 | optional = false 410 | python-versions = "<4.0.0,>=3.8.0" 411 | files = [ 412 | {file = "databind.core-4.5.1-py3-none-any.whl", hash = "sha256:df782c1bd2e416e268796918c4bdcdc2b9e948e2c263423ae9af1f5c50087973"}, 413 | {file = "databind.core-4.5.1.tar.gz", hash = "sha256:d938777ab612188bef2070f12150e1cf07d0659459dd858a12edce80bdad64fa"}, 414 | ] 415 | 416 | [package.dependencies] 417 | databind = ">=4.5.1,<5.0.0" 418 | 419 | [[package]] 420 | name = "databind-json" 421 | version = "4.5.1" 422 | description = "De-/serialize Python dataclasses to or from JSON payloads. Compatible with Python 3.8 and newer. Deprecated, use `databind` module instead." 423 | optional = false 424 | python-versions = "<4.0.0,>=3.8.0" 425 | files = [ 426 | {file = "databind.json-4.5.1-py3-none-any.whl", hash = "sha256:d05854afbc0e398f427b6bd6172560eee41ab36ca4953c3b92fd8aa4c81f7502"}, 427 | {file = "databind.json-4.5.1.tar.gz", hash = "sha256:40363b1ae4322e877a02e4b7b5dc2c9ca8be4176e2b567a3f9718ee52543c1d1"}, 428 | ] 429 | 430 | [package.dependencies] 431 | databind = ">=4.5.1,<5.0.0" 432 | 433 | [[package]] 434 | name = "deprecated" 435 | version = "1.2.14" 436 | description = "Python @deprecated decorator to deprecate old python classes, functions or methods." 437 | optional = false 438 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 439 | files = [ 440 | {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, 441 | {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, 442 | ] 443 | 444 | [package.dependencies] 445 | wrapt = ">=1.10,<2" 446 | 447 | [package.extras] 448 | dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] 449 | 450 | [[package]] 451 | name = "distlib" 452 | version = "0.3.8" 453 | description = "Distribution utilities" 454 | optional = false 455 | python-versions = "*" 456 | files = [ 457 | {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, 458 | {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, 459 | ] 460 | 461 | [[package]] 462 | name = "docspec" 463 | version = "2.2.1" 464 | description = "Docspec is a JSON object specification for representing API documentation of programming languages." 465 | optional = false 466 | python-versions = ">=3.7,<4.0" 467 | files = [ 468 | {file = "docspec-2.2.1-py3-none-any.whl", hash = "sha256:7538f750095a9688c6980ff9a4e029a823a500f64bd00b6b4bdb27951feb31cb"}, 469 | {file = "docspec-2.2.1.tar.gz", hash = "sha256:4854e77edc0e2de40e785e57e95880f7095a05fe978f8b54cef7a269586e15ff"}, 470 | ] 471 | 472 | [package.dependencies] 473 | "databind.core" = ">=4.2.6,<5.0.0" 474 | "databind.json" = ">=4.2.6,<5.0.0" 475 | Deprecated = ">=1.2.12,<2.0.0" 476 | 477 | [[package]] 478 | name = "docspec-python" 479 | version = "2.2.1" 480 | description = "A parser based on lib2to3 producing docspec data from Python source code." 481 | optional = false 482 | python-versions = ">=3.7,<4.0" 483 | files = [ 484 | {file = "docspec_python-2.2.1-py3-none-any.whl", hash = "sha256:76ac41d35a8face35b2d766c2e8a416fb8832359785d396f0d53bcb00f178e54"}, 485 | {file = "docspec_python-2.2.1.tar.gz", hash = "sha256:c41b850b4d6f4de30999ea6f82c9cdb9183d9bcba45559ee9173d3dab7281559"}, 486 | ] 487 | 488 | [package.dependencies] 489 | black = ">=23.1.0,<24.0.0" 490 | docspec = ">=2.2.1,<3.0.0" 491 | "nr.util" = ">=0.7.0" 492 | 493 | [[package]] 494 | name = "docstring-parser" 495 | version = "0.11" 496 | description = "\"Parse Python docstrings in reST, Google and Numpydoc format\"" 497 | optional = false 498 | python-versions = ">=3.6" 499 | files = [ 500 | {file = "docstring_parser-0.11.tar.gz", hash = "sha256:93b3f8f481c7d24e37c5d9f30293c89e2933fa209421c8abd731dd3ef0715ecb"}, 501 | ] 502 | 503 | [package.extras] 504 | test = ["black", "pytest"] 505 | 506 | [[package]] 507 | name = "docutils" 508 | version = "0.20.1" 509 | description = "Docutils -- Python Documentation Utilities" 510 | optional = false 511 | python-versions = ">=3.7" 512 | files = [ 513 | {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, 514 | {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, 515 | ] 516 | 517 | [[package]] 518 | name = "exceptiongroup" 519 | version = "1.2.0" 520 | description = "Backport of PEP 654 (exception groups)" 521 | optional = false 522 | python-versions = ">=3.7" 523 | files = [ 524 | {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, 525 | {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, 526 | ] 527 | 528 | [package.extras] 529 | test = ["pytest (>=6)"] 530 | 531 | [[package]] 532 | name = "filelock" 533 | version = "3.13.1" 534 | description = "A platform independent file lock." 535 | optional = false 536 | python-versions = ">=3.8" 537 | files = [ 538 | {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, 539 | {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, 540 | ] 541 | 542 | [package.extras] 543 | docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] 544 | testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] 545 | typing = ["typing-extensions (>=4.8)"] 546 | 547 | [[package]] 548 | name = "google-api-core" 549 | version = "2.17.1" 550 | description = "Google API client core library" 551 | optional = false 552 | python-versions = ">=3.7" 553 | files = [ 554 | {file = "google-api-core-2.17.1.tar.gz", hash = "sha256:9df18a1f87ee0df0bc4eea2770ebc4228392d8cc4066655b320e2cfccb15db95"}, 555 | {file = "google_api_core-2.17.1-py3-none-any.whl", hash = "sha256:610c5b90092c360736baccf17bd3efbcb30dd380e7a6dc28a71059edb8bd0d8e"}, 556 | ] 557 | 558 | [package.dependencies] 559 | google-auth = ">=2.14.1,<3.0.dev0" 560 | googleapis-common-protos = ">=1.56.2,<2.0.dev0" 561 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" 562 | requests = ">=2.18.0,<3.0.0.dev0" 563 | 564 | [package.extras] 565 | grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] 566 | grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] 567 | grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] 568 | 569 | [[package]] 570 | name = "google-auth" 571 | version = "2.28.1" 572 | description = "Google Authentication Library" 573 | optional = false 574 | python-versions = ">=3.7" 575 | files = [ 576 | {file = "google-auth-2.28.1.tar.gz", hash = "sha256:34fc3046c257cedcf1622fc4b31fc2be7923d9b4d44973d481125ecc50d83885"}, 577 | {file = "google_auth-2.28.1-py2.py3-none-any.whl", hash = "sha256:25141e2d7a14bfcba945f5e9827f98092716e99482562f15306e5b026e21aa72"}, 578 | ] 579 | 580 | [package.dependencies] 581 | cachetools = ">=2.0.0,<6.0" 582 | pyasn1-modules = ">=0.2.1" 583 | rsa = ">=3.1.4,<5" 584 | 585 | [package.extras] 586 | aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] 587 | enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] 588 | pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] 589 | reauth = ["pyu2f (>=0.1.5)"] 590 | requests = ["requests (>=2.20.0,<3.0.0.dev0)"] 591 | 592 | [[package]] 593 | name = "google-cloud-core" 594 | version = "2.4.1" 595 | description = "Google Cloud API client core library" 596 | optional = false 597 | python-versions = ">=3.7" 598 | files = [ 599 | {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, 600 | {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, 601 | ] 602 | 603 | [package.dependencies] 604 | google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" 605 | google-auth = ">=1.25.0,<3.0dev" 606 | 607 | [package.extras] 608 | grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] 609 | 610 | [[package]] 611 | name = "google-cloud-storage" 612 | version = "2.14.0" 613 | description = "Google Cloud Storage API client library" 614 | optional = false 615 | python-versions = ">=3.7" 616 | files = [ 617 | {file = "google-cloud-storage-2.14.0.tar.gz", hash = "sha256:2d23fcf59b55e7b45336729c148bb1c464468c69d5efbaee30f7201dd90eb97e"}, 618 | {file = "google_cloud_storage-2.14.0-py2.py3-none-any.whl", hash = "sha256:8641243bbf2a2042c16a6399551fbb13f062cbc9a2de38d6c0bb5426962e9dbd"}, 619 | ] 620 | 621 | [package.dependencies] 622 | google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" 623 | google-auth = ">=2.23.3,<3.0dev" 624 | google-cloud-core = ">=2.3.0,<3.0dev" 625 | google-crc32c = ">=1.0,<2.0dev" 626 | google-resumable-media = ">=2.6.0" 627 | requests = ">=2.18.0,<3.0.0dev" 628 | 629 | [package.extras] 630 | protobuf = ["protobuf (<5.0.0dev)"] 631 | 632 | [[package]] 633 | name = "google-crc32c" 634 | version = "1.5.0" 635 | description = "A python wrapper of the C library 'Google CRC32C'" 636 | optional = false 637 | python-versions = ">=3.7" 638 | files = [ 639 | {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, 640 | {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, 641 | {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, 642 | {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, 643 | {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, 644 | {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, 645 | {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, 646 | {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, 647 | {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, 648 | {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, 649 | {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, 650 | {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, 651 | {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, 652 | {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, 653 | {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, 654 | {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, 655 | {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, 656 | {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, 657 | {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, 658 | {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, 659 | {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, 660 | {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, 661 | {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, 662 | {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, 663 | {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, 664 | {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, 665 | {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, 666 | {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, 667 | {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, 668 | {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, 669 | {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, 670 | {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, 671 | {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, 672 | {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, 673 | {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, 674 | {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, 675 | {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, 676 | {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, 677 | {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, 678 | {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, 679 | {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, 680 | {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, 681 | {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, 682 | {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, 683 | {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, 684 | {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, 685 | {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, 686 | {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, 687 | {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, 688 | {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, 689 | {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, 690 | {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, 691 | {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, 692 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, 693 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, 694 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, 695 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, 696 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, 697 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, 698 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, 699 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, 700 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, 701 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, 702 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, 703 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, 704 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, 705 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, 706 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, 707 | ] 708 | 709 | [package.extras] 710 | testing = ["pytest"] 711 | 712 | [[package]] 713 | name = "google-resumable-media" 714 | version = "2.7.0" 715 | description = "Utilities for Google Media Downloads and Resumable Uploads" 716 | optional = false 717 | python-versions = ">= 3.7" 718 | files = [ 719 | {file = "google-resumable-media-2.7.0.tar.gz", hash = "sha256:5f18f5fa9836f4b083162064a1c2c98c17239bfda9ca50ad970ccf905f3e625b"}, 720 | {file = "google_resumable_media-2.7.0-py2.py3-none-any.whl", hash = "sha256:79543cfe433b63fd81c0844b7803aba1bb8950b47bedf7d980c38fa123937e08"}, 721 | ] 722 | 723 | [package.dependencies] 724 | google-crc32c = ">=1.0,<2.0dev" 725 | 726 | [package.extras] 727 | aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] 728 | requests = ["requests (>=2.18.0,<3.0.0dev)"] 729 | 730 | [[package]] 731 | name = "googleapis-common-protos" 732 | version = "1.62.0" 733 | description = "Common protobufs used in Google APIs" 734 | optional = false 735 | python-versions = ">=3.7" 736 | files = [ 737 | {file = "googleapis-common-protos-1.62.0.tar.gz", hash = "sha256:83f0ece9f94e5672cced82f592d2a5edf527a96ed1794f0bab36d5735c996277"}, 738 | {file = "googleapis_common_protos-1.62.0-py2.py3-none-any.whl", hash = "sha256:4750113612205514f9f6aa4cb00d523a94f3e8c06c5ad2fee466387dc4875f07"}, 739 | ] 740 | 741 | [package.dependencies] 742 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" 743 | 744 | [package.extras] 745 | grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] 746 | 747 | [[package]] 748 | name = "idna" 749 | version = "3.7" 750 | description = "Internationalized Domain Names in Applications (IDNA)" 751 | optional = false 752 | python-versions = ">=3.5" 753 | files = [ 754 | {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, 755 | {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, 756 | ] 757 | 758 | [[package]] 759 | name = "importlib-metadata" 760 | version = "7.0.1" 761 | description = "Read metadata from Python packages" 762 | optional = false 763 | python-versions = ">=3.8" 764 | files = [ 765 | {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, 766 | {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, 767 | ] 768 | 769 | [package.dependencies] 770 | zipp = ">=0.5" 771 | 772 | [package.extras] 773 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] 774 | perf = ["ipython"] 775 | testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] 776 | 777 | [[package]] 778 | name = "importlib-resources" 779 | version = "6.1.1" 780 | description = "Read resources from Python packages" 781 | optional = false 782 | python-versions = ">=3.8" 783 | files = [ 784 | {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, 785 | {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, 786 | ] 787 | 788 | [package.dependencies] 789 | zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} 790 | 791 | [package.extras] 792 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] 793 | testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] 794 | 795 | [[package]] 796 | name = "iniconfig" 797 | version = "2.0.0" 798 | description = "brain-dead simple config-ini parsing" 799 | optional = false 800 | python-versions = ">=3.7" 801 | files = [ 802 | {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, 803 | {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, 804 | ] 805 | 806 | [[package]] 807 | name = "jaraco-classes" 808 | version = "3.3.1" 809 | description = "Utility functions for Python class constructs" 810 | optional = false 811 | python-versions = ">=3.8" 812 | files = [ 813 | {file = "jaraco.classes-3.3.1-py3-none-any.whl", hash = "sha256:86b534de565381f6b3c1c830d13f931d7be1a75f0081c57dff615578676e2206"}, 814 | {file = "jaraco.classes-3.3.1.tar.gz", hash = "sha256:cb28a5ebda8bc47d8c8015307d93163464f9f2b91ab4006e09ff0ce07e8bfb30"}, 815 | ] 816 | 817 | [package.dependencies] 818 | more-itertools = "*" 819 | 820 | [package.extras] 821 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] 822 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] 823 | 824 | [[package]] 825 | name = "jeepney" 826 | version = "0.8.0" 827 | description = "Low-level, pure Python DBus protocol wrapper." 828 | optional = false 829 | python-versions = ">=3.7" 830 | files = [ 831 | {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, 832 | {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, 833 | ] 834 | 835 | [package.extras] 836 | test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] 837 | trio = ["async_generator", "trio"] 838 | 839 | [[package]] 840 | name = "jinja2" 841 | version = "3.1.4" 842 | description = "A very fast and expressive template engine." 843 | optional = false 844 | python-versions = ">=3.7" 845 | files = [ 846 | {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, 847 | {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, 848 | ] 849 | 850 | [package.dependencies] 851 | MarkupSafe = ">=2.0" 852 | 853 | [package.extras] 854 | i18n = ["Babel (>=2.7)"] 855 | 856 | [[package]] 857 | name = "keyring" 858 | version = "24.3.0" 859 | description = "Store and access your passwords safely." 860 | optional = false 861 | python-versions = ">=3.8" 862 | files = [ 863 | {file = "keyring-24.3.0-py3-none-any.whl", hash = "sha256:4446d35d636e6a10b8bce7caa66913dd9eca5fd222ca03a3d42c38608ac30836"}, 864 | {file = "keyring-24.3.0.tar.gz", hash = "sha256:e730ecffd309658a08ee82535a3b5ec4b4c8669a9be11efb66249d8e0aeb9a25"}, 865 | ] 866 | 867 | [package.dependencies] 868 | importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} 869 | importlib-resources = {version = "*", markers = "python_version < \"3.9\""} 870 | "jaraco.classes" = "*" 871 | jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} 872 | pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} 873 | SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} 874 | 875 | [package.extras] 876 | completion = ["shtab (>=1.1.0)"] 877 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] 878 | testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] 879 | 880 | [[package]] 881 | name = "markdown-it-py" 882 | version = "3.0.0" 883 | description = "Python port of markdown-it. Markdown parsing, done right!" 884 | optional = false 885 | python-versions = ">=3.8" 886 | files = [ 887 | {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, 888 | {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, 889 | ] 890 | 891 | [package.dependencies] 892 | mdurl = ">=0.1,<1.0" 893 | 894 | [package.extras] 895 | benchmarking = ["psutil", "pytest", "pytest-benchmark"] 896 | code-style = ["pre-commit (>=3.0,<4.0)"] 897 | 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)"] 898 | linkify = ["linkify-it-py (>=1,<3)"] 899 | plugins = ["mdit-py-plugins"] 900 | profiling = ["gprof2dot"] 901 | rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] 902 | testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] 903 | 904 | [[package]] 905 | name = "markupsafe" 906 | version = "2.1.5" 907 | description = "Safely add untrusted strings to HTML/XML markup." 908 | optional = false 909 | python-versions = ">=3.7" 910 | files = [ 911 | {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, 912 | {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, 913 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, 914 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, 915 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, 916 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, 917 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, 918 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, 919 | {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, 920 | {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, 921 | {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, 922 | {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, 923 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, 924 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, 925 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, 926 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, 927 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, 928 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, 929 | {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, 930 | {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, 931 | {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, 932 | {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, 933 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, 934 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, 935 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, 936 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, 937 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, 938 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, 939 | {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, 940 | {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, 941 | {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, 942 | {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, 943 | {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, 944 | {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, 945 | {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, 946 | {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, 947 | {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, 948 | {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, 949 | {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, 950 | {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, 951 | {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, 952 | {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, 953 | {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, 954 | {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, 955 | {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, 956 | {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, 957 | {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, 958 | {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, 959 | {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, 960 | {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, 961 | {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, 962 | {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, 963 | {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, 964 | {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, 965 | {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, 966 | {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, 967 | {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, 968 | {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, 969 | {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, 970 | {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, 971 | ] 972 | 973 | [[package]] 974 | name = "mdurl" 975 | version = "0.1.2" 976 | description = "Markdown URL utilities" 977 | optional = false 978 | python-versions = ">=3.7" 979 | files = [ 980 | {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, 981 | {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, 982 | ] 983 | 984 | [[package]] 985 | name = "more-itertools" 986 | version = "10.2.0" 987 | description = "More routines for operating on iterables, beyond itertools" 988 | optional = false 989 | python-versions = ">=3.8" 990 | files = [ 991 | {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, 992 | {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, 993 | ] 994 | 995 | [[package]] 996 | name = "mypy-extensions" 997 | version = "1.0.0" 998 | description = "Type system extensions for programs checked with the mypy type checker." 999 | optional = false 1000 | python-versions = ">=3.5" 1001 | files = [ 1002 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 1003 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "nh3" 1008 | version = "0.2.15" 1009 | description = "Python bindings to the ammonia HTML sanitization library." 1010 | optional = false 1011 | python-versions = "*" 1012 | files = [ 1013 | {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9c0d415f6b7f2338f93035bba5c0d8c1b464e538bfbb1d598acd47d7969284f0"}, 1014 | {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f42f99f0cf6312e470b6c09e04da31f9abaadcd3eb591d7d1a88ea931dca7f3"}, 1015 | {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac19c0d68cd42ecd7ead91a3a032fdfff23d29302dbb1311e641a130dfefba97"}, 1016 | {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0d77272ce6d34db6c87b4f894f037d55183d9518f948bba236fe81e2bb4e28"}, 1017 | {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8d595df02413aa38586c24811237e95937ef18304e108b7e92c890a06793e3bf"}, 1018 | {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86e447a63ca0b16318deb62498db4f76fc60699ce0a1231262880b38b6cff911"}, 1019 | {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3277481293b868b2715907310c7be0f1b9d10491d5adf9fce11756a97e97eddf"}, 1020 | {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60684857cfa8fdbb74daa867e5cad3f0c9789415aba660614fe16cd66cbb9ec7"}, 1021 | {file = "nh3-0.2.15-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3b803a5875e7234907f7d64777dfde2b93db992376f3d6d7af7f3bc347deb305"}, 1022 | {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0d02d0ff79dfd8208ed25a39c12cbda092388fff7f1662466e27d97ad011b770"}, 1023 | {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6"}, 1024 | {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1e97221cedaf15a54f5243f2c5894bb12ca951ae4ddfd02a9d4ea9df9e1a29d"}, 1025 | {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5167a6403d19c515217b6bcaaa9be420974a6ac30e0da9e84d4fc67a5d474c5"}, 1026 | {file = "nh3-0.2.15-cp37-abi3-win32.whl", hash = "sha256:427fecbb1031db085eaac9931362adf4a796428ef0163070c484b5a768e71601"}, 1027 | {file = "nh3-0.2.15-cp37-abi3-win_amd64.whl", hash = "sha256:bc2d086fb540d0fa52ce35afaded4ea526b8fc4d3339f783db55c95de40ef02e"}, 1028 | {file = "nh3-0.2.15.tar.gz", hash = "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3"}, 1029 | ] 1030 | 1031 | [[package]] 1032 | name = "nr-date" 1033 | version = "2.1.0" 1034 | description = "" 1035 | optional = false 1036 | python-versions = ">=3.6,<4.0" 1037 | files = [ 1038 | {file = "nr_date-2.1.0-py3-none-any.whl", hash = "sha256:bd672a9dfbdcf7c4b9289fea6750c42490eaee08036a72059dcc78cb236ed568"}, 1039 | {file = "nr_date-2.1.0.tar.gz", hash = "sha256:0643aea13bcdc2a8bc56af9d5e6a89ef244c9744a1ef00cdc735902ba7f7d2e6"}, 1040 | ] 1041 | 1042 | [[package]] 1043 | name = "nr-stream" 1044 | version = "1.1.5" 1045 | description = "" 1046 | optional = false 1047 | python-versions = ">=3.6,<4.0" 1048 | files = [ 1049 | {file = "nr_stream-1.1.5-py3-none-any.whl", hash = "sha256:47e12150b331ad2cb729cfd9d2abd281c9949809729ba461c6aa87dd9927b2d4"}, 1050 | {file = "nr_stream-1.1.5.tar.gz", hash = "sha256:eb0216c6bfc61a46d4568dba3b588502c610ec8ddef4ac98f3932a2bd7264f65"}, 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "nr-util" 1055 | version = "0.8.12" 1056 | description = "General purpose Python utility library." 1057 | optional = false 1058 | python-versions = ">=3.7,<4.0" 1059 | files = [ 1060 | {file = "nr.util-0.8.12-py3-none-any.whl", hash = "sha256:91da02ac9795eb8e015372275c1efe54bac9051231ee9b0e7e6f96b0b4e7d2bb"}, 1061 | {file = "nr.util-0.8.12.tar.gz", hash = "sha256:a4549c2033d99d2f0379b3f3d233fd2a8ade286bbf0b3ad0cc7cea16022214f4"}, 1062 | ] 1063 | 1064 | [package.dependencies] 1065 | deprecated = ">=1.2.0,<2.0.0" 1066 | typing-extensions = ">=3.0.0" 1067 | 1068 | [[package]] 1069 | name = "packaging" 1070 | version = "23.2" 1071 | description = "Core utilities for Python packages" 1072 | optional = false 1073 | python-versions = ">=3.7" 1074 | files = [ 1075 | {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, 1076 | {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, 1077 | ] 1078 | 1079 | [[package]] 1080 | name = "pathspec" 1081 | version = "0.12.1" 1082 | description = "Utility library for gitignore style pattern matching of file paths." 1083 | optional = false 1084 | python-versions = ">=3.8" 1085 | files = [ 1086 | {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, 1087 | {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "pkginfo" 1092 | version = "1.9.6" 1093 | description = "Query metadata from sdists / bdists / installed packages." 1094 | optional = false 1095 | python-versions = ">=3.6" 1096 | files = [ 1097 | {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, 1098 | {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, 1099 | ] 1100 | 1101 | [package.extras] 1102 | testing = ["pytest", "pytest-cov"] 1103 | 1104 | [[package]] 1105 | name = "platformdirs" 1106 | version = "4.2.0" 1107 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 1108 | optional = false 1109 | python-versions = ">=3.8" 1110 | files = [ 1111 | {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, 1112 | {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, 1113 | ] 1114 | 1115 | [package.extras] 1116 | docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] 1117 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] 1118 | 1119 | [[package]] 1120 | name = "pluggy" 1121 | version = "1.4.0" 1122 | description = "plugin and hook calling mechanisms for python" 1123 | optional = false 1124 | python-versions = ">=3.8" 1125 | files = [ 1126 | {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, 1127 | {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, 1128 | ] 1129 | 1130 | [package.extras] 1131 | dev = ["pre-commit", "tox"] 1132 | testing = ["pytest", "pytest-benchmark"] 1133 | 1134 | [[package]] 1135 | name = "protobuf" 1136 | version = "4.25.3" 1137 | description = "" 1138 | optional = false 1139 | python-versions = ">=3.8" 1140 | files = [ 1141 | {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, 1142 | {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, 1143 | {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, 1144 | {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, 1145 | {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, 1146 | {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, 1147 | {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, 1148 | {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, 1149 | {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, 1150 | {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, 1151 | {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "pyasn1" 1156 | version = "0.5.1" 1157 | description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" 1158 | optional = false 1159 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" 1160 | files = [ 1161 | {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, 1162 | {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, 1163 | ] 1164 | 1165 | [[package]] 1166 | name = "pyasn1-modules" 1167 | version = "0.3.0" 1168 | description = "A collection of ASN.1-based protocols modules" 1169 | optional = false 1170 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" 1171 | files = [ 1172 | {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, 1173 | {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, 1174 | ] 1175 | 1176 | [package.dependencies] 1177 | pyasn1 = ">=0.4.6,<0.6.0" 1178 | 1179 | [[package]] 1180 | name = "pycparser" 1181 | version = "2.21" 1182 | description = "C parser in Python" 1183 | optional = false 1184 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1185 | files = [ 1186 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 1187 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "pydoc-markdown" 1192 | version = "4.8.2" 1193 | description = "Create Python API documentation in Markdown format." 1194 | optional = false 1195 | python-versions = ">=3.7,<4.0" 1196 | files = [ 1197 | {file = "pydoc_markdown-4.8.2-py3-none-any.whl", hash = "sha256:203f74119e6bb2f9deba43d452422de7c8ec31955b61e0620fa4dd8c2611715f"}, 1198 | {file = "pydoc_markdown-4.8.2.tar.gz", hash = "sha256:fb6c927e31386de17472d42f9bd3d3be2905977d026f6216881c65145aa67f0b"}, 1199 | ] 1200 | 1201 | [package.dependencies] 1202 | click = ">=7.1,<9.0" 1203 | "databind.core" = ">=4.4.0,<5.0.0" 1204 | "databind.json" = ">=4.4.0,<5.0.0" 1205 | docspec = ">=2.2.1,<3.0.0" 1206 | docspec-python = ">=2.2.1,<3.0.0" 1207 | docstring-parser = ">=0.11,<0.12" 1208 | jinja2 = ">=3.0.0,<4.0.0" 1209 | "nr.util" = ">=0.7.5,<1.0.0" 1210 | PyYAML = ">=5.0,<7.0" 1211 | requests = ">=2.23.0,<3.0.0" 1212 | tomli = ">=2.0.0,<3.0.0" 1213 | tomli_w = ">=1.0.0,<2.0.0" 1214 | watchdog = "*" 1215 | yapf = ">=0.30.0" 1216 | 1217 | [[package]] 1218 | name = "pygments" 1219 | version = "2.17.2" 1220 | description = "Pygments is a syntax highlighting package written in Python." 1221 | optional = false 1222 | python-versions = ">=3.7" 1223 | files = [ 1224 | {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, 1225 | {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, 1226 | ] 1227 | 1228 | [package.extras] 1229 | plugins = ["importlib-metadata"] 1230 | windows-terminal = ["colorama (>=0.4.6)"] 1231 | 1232 | [[package]] 1233 | name = "pyproject-api" 1234 | version = "1.6.1" 1235 | description = "API to interact with the python pyproject.toml based projects" 1236 | optional = false 1237 | python-versions = ">=3.8" 1238 | files = [ 1239 | {file = "pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"}, 1240 | {file = "pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"}, 1241 | ] 1242 | 1243 | [package.dependencies] 1244 | packaging = ">=23.1" 1245 | tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} 1246 | 1247 | [package.extras] 1248 | docs = ["furo (>=2023.8.19)", "sphinx (<7.2)", "sphinx-autodoc-typehints (>=1.24)"] 1249 | testing = ["covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "setuptools (>=68.1.2)", "wheel (>=0.41.2)"] 1250 | 1251 | [[package]] 1252 | name = "pytest" 1253 | version = "8.0.1" 1254 | description = "pytest: simple powerful testing with Python" 1255 | optional = false 1256 | python-versions = ">=3.8" 1257 | files = [ 1258 | {file = "pytest-8.0.1-py3-none-any.whl", hash = "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca"}, 1259 | {file = "pytest-8.0.1.tar.gz", hash = "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae"}, 1260 | ] 1261 | 1262 | [package.dependencies] 1263 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 1264 | exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} 1265 | iniconfig = "*" 1266 | packaging = "*" 1267 | pluggy = ">=1.3.0,<2.0" 1268 | tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} 1269 | 1270 | [package.extras] 1271 | testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] 1272 | 1273 | [[package]] 1274 | name = "pytest-cov" 1275 | version = "4.1.0" 1276 | description = "Pytest plugin for measuring coverage." 1277 | optional = false 1278 | python-versions = ">=3.7" 1279 | files = [ 1280 | {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, 1281 | {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, 1282 | ] 1283 | 1284 | [package.dependencies] 1285 | coverage = {version = ">=5.2.1", extras = ["toml"]} 1286 | pytest = ">=4.6" 1287 | 1288 | [package.extras] 1289 | testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] 1290 | 1291 | [[package]] 1292 | name = "pywin32-ctypes" 1293 | version = "0.2.2" 1294 | description = "A (partial) reimplementation of pywin32 using ctypes/cffi" 1295 | optional = false 1296 | python-versions = ">=3.6" 1297 | files = [ 1298 | {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, 1299 | {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, 1300 | ] 1301 | 1302 | [[package]] 1303 | name = "pyyaml" 1304 | version = "6.0.1" 1305 | description = "YAML parser and emitter for Python" 1306 | optional = false 1307 | python-versions = ">=3.6" 1308 | files = [ 1309 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, 1310 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, 1311 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, 1312 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, 1313 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, 1314 | {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, 1315 | {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, 1316 | {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, 1317 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, 1318 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, 1319 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, 1320 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, 1321 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, 1322 | {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, 1323 | {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, 1324 | {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, 1325 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, 1326 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, 1327 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, 1328 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, 1329 | {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, 1330 | {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, 1331 | {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, 1332 | {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, 1333 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, 1334 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, 1335 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, 1336 | {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, 1337 | {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, 1338 | {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, 1339 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, 1340 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, 1341 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, 1342 | {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, 1343 | {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, 1344 | {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, 1345 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, 1346 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, 1347 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, 1348 | {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, 1349 | {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, 1350 | {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, 1351 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, 1352 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, 1353 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, 1354 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, 1355 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, 1356 | {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, 1357 | {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, 1358 | {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, 1359 | {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "readme-renderer" 1364 | version = "42.0" 1365 | description = "readme_renderer is a library for rendering readme descriptions for Warehouse" 1366 | optional = false 1367 | python-versions = ">=3.8" 1368 | files = [ 1369 | {file = "readme_renderer-42.0-py3-none-any.whl", hash = "sha256:13d039515c1f24de668e2c93f2e877b9dbe6c6c32328b90a40a49d8b2b85f36d"}, 1370 | {file = "readme_renderer-42.0.tar.gz", hash = "sha256:2d55489f83be4992fe4454939d1a051c33edbab778e82761d060c9fc6b308cd1"}, 1371 | ] 1372 | 1373 | [package.dependencies] 1374 | docutils = ">=0.13.1" 1375 | nh3 = ">=0.2.14" 1376 | Pygments = ">=2.5.1" 1377 | 1378 | [package.extras] 1379 | md = ["cmarkgfm (>=0.8.0)"] 1380 | 1381 | [[package]] 1382 | name = "requests" 1383 | version = "2.32.0" 1384 | description = "Python HTTP for Humans." 1385 | optional = false 1386 | python-versions = ">=3.8" 1387 | files = [ 1388 | {file = "requests-2.32.0-py3-none-any.whl", hash = "sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5"}, 1389 | {file = "requests-2.32.0.tar.gz", hash = "sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8"}, 1390 | ] 1391 | 1392 | [package.dependencies] 1393 | certifi = ">=2017.4.17" 1394 | charset-normalizer = ">=2,<4" 1395 | idna = ">=2.5,<4" 1396 | urllib3 = ">=1.21.1,<3" 1397 | 1398 | [package.extras] 1399 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 1400 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 1401 | 1402 | [[package]] 1403 | name = "requests-toolbelt" 1404 | version = "1.0.0" 1405 | description = "A utility belt for advanced users of python-requests" 1406 | optional = false 1407 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1408 | files = [ 1409 | {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, 1410 | {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, 1411 | ] 1412 | 1413 | [package.dependencies] 1414 | requests = ">=2.0.1,<3.0.0" 1415 | 1416 | [[package]] 1417 | name = "rfc3986" 1418 | version = "2.0.0" 1419 | description = "Validating URI References per RFC 3986" 1420 | optional = false 1421 | python-versions = ">=3.7" 1422 | files = [ 1423 | {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, 1424 | {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, 1425 | ] 1426 | 1427 | [package.extras] 1428 | idna2008 = ["idna"] 1429 | 1430 | [[package]] 1431 | name = "rich" 1432 | version = "13.7.0" 1433 | description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 1434 | optional = false 1435 | python-versions = ">=3.7.0" 1436 | files = [ 1437 | {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, 1438 | {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, 1439 | ] 1440 | 1441 | [package.dependencies] 1442 | markdown-it-py = ">=2.2.0" 1443 | pygments = ">=2.13.0,<3.0.0" 1444 | typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} 1445 | 1446 | [package.extras] 1447 | jupyter = ["ipywidgets (>=7.5.1,<9)"] 1448 | 1449 | [[package]] 1450 | name = "rsa" 1451 | version = "4.9" 1452 | description = "Pure-Python RSA implementation" 1453 | optional = false 1454 | python-versions = ">=3.6,<4" 1455 | files = [ 1456 | {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, 1457 | {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, 1458 | ] 1459 | 1460 | [package.dependencies] 1461 | pyasn1 = ">=0.1.3" 1462 | 1463 | [[package]] 1464 | name = "ruff" 1465 | version = "0.1.15" 1466 | description = "An extremely fast Python linter and code formatter, written in Rust." 1467 | optional = false 1468 | python-versions = ">=3.7" 1469 | files = [ 1470 | {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, 1471 | {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, 1472 | {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, 1473 | {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, 1474 | {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, 1475 | {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, 1476 | {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, 1477 | {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, 1478 | {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, 1479 | {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, 1480 | {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, 1481 | {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, 1482 | {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, 1483 | {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, 1484 | {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, 1485 | {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, 1486 | {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, 1487 | ] 1488 | 1489 | [[package]] 1490 | name = "secretstorage" 1491 | version = "3.3.3" 1492 | description = "Python bindings to FreeDesktop.org Secret Service API" 1493 | optional = false 1494 | python-versions = ">=3.6" 1495 | files = [ 1496 | {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, 1497 | {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, 1498 | ] 1499 | 1500 | [package.dependencies] 1501 | cryptography = ">=2.0" 1502 | jeepney = ">=0.6" 1503 | 1504 | [[package]] 1505 | name = "setuptools" 1506 | version = "70.0.0" 1507 | description = "Easily download, build, install, upgrade, and uninstall Python packages" 1508 | optional = false 1509 | python-versions = ">=3.8" 1510 | files = [ 1511 | {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, 1512 | {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, 1513 | ] 1514 | 1515 | [package.extras] 1516 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] 1517 | testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.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-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] 1518 | 1519 | [[package]] 1520 | name = "tomli" 1521 | version = "2.0.1" 1522 | description = "A lil' TOML parser" 1523 | optional = false 1524 | python-versions = ">=3.7" 1525 | files = [ 1526 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 1527 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 1528 | ] 1529 | 1530 | [[package]] 1531 | name = "tomli-w" 1532 | version = "1.0.0" 1533 | description = "A lil' TOML writer" 1534 | optional = false 1535 | python-versions = ">=3.7" 1536 | files = [ 1537 | {file = "tomli_w-1.0.0-py3-none-any.whl", hash = "sha256:9f2a07e8be30a0729e533ec968016807069991ae2fd921a78d42f429ae5f4463"}, 1538 | {file = "tomli_w-1.0.0.tar.gz", hash = "sha256:f463434305e0336248cac9c2dc8076b707d8a12d019dd349f5c1e382dd1ae1b9"}, 1539 | ] 1540 | 1541 | [[package]] 1542 | name = "tox" 1543 | version = "4.13.0" 1544 | description = "tox is a generic virtualenv management and test command line tool" 1545 | optional = false 1546 | python-versions = ">=3.8" 1547 | files = [ 1548 | {file = "tox-4.13.0-py3-none-any.whl", hash = "sha256:1143c7e2489c68026a55d3d4ae84c02c449f073b28e62f80e3e440a3b72a4afa"}, 1549 | {file = "tox-4.13.0.tar.gz", hash = "sha256:dd789a554c16c4b532924ba393c92fc8991323c4b3d466712bfecc8c9b9f24f7"}, 1550 | ] 1551 | 1552 | [package.dependencies] 1553 | cachetools = ">=5.3.2" 1554 | chardet = ">=5.2" 1555 | colorama = ">=0.4.6" 1556 | filelock = ">=3.13.1" 1557 | packaging = ">=23.2" 1558 | platformdirs = ">=4.1" 1559 | pluggy = ">=1.3" 1560 | pyproject-api = ">=1.6.1" 1561 | tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} 1562 | virtualenv = ">=20.25" 1563 | 1564 | [package.extras] 1565 | docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.25.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"] 1566 | testing = ["build[virtualenv] (>=1.0.3)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=8.0.2)", "distlib (>=0.3.8)", "flaky (>=3.7)", "hatch-vcs (>=0.4)", "hatchling (>=1.21)", "psutil (>=5.9.7)", "pytest (>=7.4.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-xdist (>=3.5)", "re-assert (>=1.1)", "time-machine (>=2.13)", "wheel (>=0.42)"] 1567 | 1568 | [[package]] 1569 | name = "twine" 1570 | version = "5.0.0" 1571 | description = "Collection of utilities for publishing packages on PyPI" 1572 | optional = false 1573 | python-versions = ">=3.8" 1574 | files = [ 1575 | {file = "twine-5.0.0-py3-none-any.whl", hash = "sha256:a262933de0b484c53408f9edae2e7821c1c45a3314ff2df9bdd343aa7ab8edc0"}, 1576 | {file = "twine-5.0.0.tar.gz", hash = "sha256:89b0cc7d370a4b66421cc6102f269aa910fe0f1861c124f573cf2ddedbc10cf4"}, 1577 | ] 1578 | 1579 | [package.dependencies] 1580 | importlib-metadata = ">=3.6" 1581 | keyring = ">=15.1" 1582 | pkginfo = ">=1.8.1" 1583 | readme-renderer = ">=35.0" 1584 | requests = ">=2.20" 1585 | requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" 1586 | rfc3986 = ">=1.4.0" 1587 | rich = ">=12.0.0" 1588 | urllib3 = ">=1.26.0" 1589 | 1590 | [[package]] 1591 | name = "typeapi" 1592 | version = "2.2.1" 1593 | description = "" 1594 | optional = false 1595 | python-versions = ">=3.8,<4.0" 1596 | files = [ 1597 | {file = "typeapi-2.2.1-py3-none-any.whl", hash = "sha256:e5ef719e7e6f5c7b1ae566f8751d094dbd93422203ef43263468a6e69a6ae33c"}, 1598 | {file = "typeapi-2.2.1.tar.gz", hash = "sha256:181a30c6dd79c2ed70bba8c50e56a889cbba0f479b187698513c985fbadec47f"}, 1599 | ] 1600 | 1601 | [package.dependencies] 1602 | typing-extensions = ">=3.0.0" 1603 | 1604 | [[package]] 1605 | name = "typing-extensions" 1606 | version = "4.9.0" 1607 | description = "Backported and Experimental Type Hints for Python 3.8+" 1608 | optional = false 1609 | python-versions = ">=3.8" 1610 | files = [ 1611 | {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, 1612 | {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, 1613 | ] 1614 | 1615 | [[package]] 1616 | name = "urllib3" 1617 | version = "2.2.2" 1618 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1619 | optional = false 1620 | python-versions = ">=3.8" 1621 | files = [ 1622 | {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, 1623 | {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, 1624 | ] 1625 | 1626 | [package.extras] 1627 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 1628 | h2 = ["h2 (>=4,<5)"] 1629 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 1630 | zstd = ["zstandard (>=0.18.0)"] 1631 | 1632 | [[package]] 1633 | name = "virtualenv" 1634 | version = "20.26.6" 1635 | description = "Virtual Python Environment builder" 1636 | optional = false 1637 | python-versions = ">=3.7" 1638 | files = [ 1639 | {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, 1640 | {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, 1641 | ] 1642 | 1643 | [package.dependencies] 1644 | distlib = ">=0.3.7,<1" 1645 | filelock = ">=3.12.2,<4" 1646 | platformdirs = ">=3.9.1,<5" 1647 | 1648 | [package.extras] 1649 | 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)"] 1650 | 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)"] 1651 | 1652 | [[package]] 1653 | name = "watchdog" 1654 | version = "4.0.0" 1655 | description = "Filesystem events monitoring" 1656 | optional = false 1657 | python-versions = ">=3.8" 1658 | files = [ 1659 | {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, 1660 | {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, 1661 | {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, 1662 | {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, 1663 | {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, 1664 | {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, 1665 | {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, 1666 | {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, 1667 | {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, 1668 | {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, 1669 | {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, 1670 | {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, 1671 | {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, 1672 | {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, 1673 | {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, 1674 | {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, 1675 | {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, 1676 | {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, 1677 | {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, 1678 | {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, 1679 | {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, 1680 | {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, 1681 | {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, 1682 | {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, 1683 | {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, 1684 | {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, 1685 | {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, 1686 | {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, 1687 | {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, 1688 | ] 1689 | 1690 | [package.extras] 1691 | watchmedo = ["PyYAML (>=3.10)"] 1692 | 1693 | [[package]] 1694 | name = "wrapt" 1695 | version = "1.16.0" 1696 | description = "Module for decorators, wrappers and monkey patching." 1697 | optional = false 1698 | python-versions = ">=3.6" 1699 | files = [ 1700 | {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, 1701 | {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, 1702 | {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, 1703 | {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, 1704 | {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, 1705 | {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, 1706 | {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, 1707 | {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, 1708 | {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, 1709 | {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, 1710 | {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, 1711 | {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, 1712 | {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, 1713 | {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, 1714 | {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, 1715 | {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, 1716 | {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, 1717 | {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, 1718 | {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, 1719 | {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, 1720 | {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, 1721 | {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, 1722 | {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, 1723 | {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, 1724 | {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, 1725 | {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, 1726 | {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, 1727 | {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, 1728 | {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, 1729 | {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, 1730 | {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, 1731 | {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, 1732 | {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, 1733 | {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, 1734 | {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, 1735 | {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, 1736 | {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, 1737 | {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, 1738 | {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, 1739 | {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, 1740 | {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, 1741 | {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, 1742 | {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, 1743 | {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, 1744 | {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, 1745 | {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, 1746 | {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, 1747 | {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, 1748 | {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, 1749 | {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, 1750 | {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, 1751 | {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, 1752 | {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, 1753 | {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, 1754 | {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, 1755 | {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, 1756 | {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, 1757 | {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, 1758 | {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, 1759 | {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, 1760 | {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, 1761 | {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, 1762 | {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, 1763 | {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, 1764 | {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, 1765 | {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, 1766 | {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, 1767 | {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, 1768 | {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, 1769 | {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, 1770 | ] 1771 | 1772 | [[package]] 1773 | name = "yapf" 1774 | version = "0.40.2" 1775 | description = "A formatter for Python code" 1776 | optional = false 1777 | python-versions = ">=3.7" 1778 | files = [ 1779 | {file = "yapf-0.40.2-py3-none-any.whl", hash = "sha256:adc8b5dd02c0143108878c499284205adb258aad6db6634e5b869e7ee2bd548b"}, 1780 | {file = "yapf-0.40.2.tar.gz", hash = "sha256:4dab8a5ed7134e26d57c1647c7483afb3f136878b579062b786c9ba16b94637b"}, 1781 | ] 1782 | 1783 | [package.dependencies] 1784 | importlib-metadata = ">=6.6.0" 1785 | platformdirs = ">=3.5.1" 1786 | tomli = ">=2.0.1" 1787 | 1788 | [[package]] 1789 | name = "zipp" 1790 | version = "3.19.1" 1791 | description = "Backport of pathlib-compatible object wrapper for zip files" 1792 | optional = false 1793 | python-versions = ">=3.8" 1794 | files = [ 1795 | {file = "zipp-3.19.1-py3-none-any.whl", hash = "sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091"}, 1796 | {file = "zipp-3.19.1.tar.gz", hash = "sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f"}, 1797 | ] 1798 | 1799 | [package.extras] 1800 | doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 1801 | test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] 1802 | 1803 | [metadata] 1804 | lock-version = "2.0" 1805 | python-versions = ">=3.8.0,<3.13" 1806 | content-hash = "1938c2dc1d03f53dcb127e2d7908fa8431add0da621320debf83c2eb008ab37c" 1807 | --------------------------------------------------------------------------------