pax_global_header00006660000000000000000000000064145122263670014522gustar00rootroot0000000000000052 comment=409da9d242e35f17e325669c055277c2d2976177 python-openapi-openapi-spec-validator-1f3ff43/000077500000000000000000000000001451222636700214565ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/.bumpversion.cfg000066400000000000000000000006311451222636700245660ustar00rootroot00000000000000[bumpversion] current_version = 0.7.1 commit = True tag = True parse = (?P\d+)\.(?P\d+)\.(?P\d+) serialize = {major}.{minor}.{patch} tag_name = {new_version} message = Version {new_version} [bumpversion:file:openapi_spec_validator/__init__.py] [bumpversion:file:Dockerfile] [bumpversion:file:pyproject.toml] search = version = "{current_version}" replace = version = "{new_version}" python-openapi-openapi-spec-validator-1f3ff43/.github/000077500000000000000000000000001451222636700230165ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/.github/FUNDING.yml000066400000000000000000000000201451222636700246230ustar00rootroot00000000000000github: [p1c2u] python-openapi-openapi-spec-validator-1f3ff43/.github/dependabot.yml000066400000000000000000000004471451222636700256530ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "docker" directory: "/" schedule: interval: "weekly" - package-ecosystem: "pip" directory: "/" schedule: interval: "weekly" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" python-openapi-openapi-spec-validator-1f3ff43/.github/workflows/000077500000000000000000000000001451222636700250535ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/.github/workflows/build-docs.yml000066400000000000000000000026431451222636700276300ustar00rootroot00000000000000name: Build documentation on: push: pull_request: types: [opened, synchronize] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python 3.9 uses: actions/setup-python@v4 with: python-version: 3.9 - name: Get full Python version id: full-python-version run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") - name: Set up poetry uses: Gr1N/setup-poetry@v8 - name: Configure poetry run: poetry config virtualenvs.in-project true - name: Set up cache uses: actions/cache@v3 id: cache with: path: .venv key: venv-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} - name: Ensure cache is healthy if: steps.cache.outputs.cache-hit == 'true' run: timeout 10s poetry run pip --version || rm -rf .venv - name: Install dependencies run: poetry install --with docs - name: Build documentation run: | poetry run python -m sphinx -T -b html -d docs/_build/doctrees -D language=en docs docs/_build/html -n -W - uses: actions/upload-artifact@v3 name: Upload docs as artifact with: name: docs-html path: './docs/_build/html' if-no-files-found: error python-openapi-openapi-spec-validator-1f3ff43/.github/workflows/docker-publish-manual.yml000066400000000000000000000026111451222636700317640ustar00rootroot00000000000000# This workflow will upload Docker image when a release is created # For more information see: https://github.com/marketplace/actions/docker-build-push-action name: Publish docker image (manual) on: workflow_dispatch: inputs: version: required: true description: Version to build push: type: boolean description: Push to docker hub jobs: docker: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Docker meta id: meta uses: docker/metadata-action@v4 with: images: | pythonopenapi/openapi-spec-validator tags: | type=semver,pattern={{version}},value=${{ github.event.inputs.version }} - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to DockerHub if: github.event.inputs.push uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v4 with: context: . platforms: linux/amd64,linux/arm64 push: ${{ github.event.inputs.push }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} python-openapi-openapi-spec-validator-1f3ff43/.github/workflows/docker-publish.yml000066400000000000000000000023611451222636700305130ustar00rootroot00000000000000# This workflow will upload Docker image when a release is created # For more information see: https://github.com/marketplace/actions/docker-build-push-action name: Publish docker image on: workflow_dispatch: release: types: - published jobs: docker: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Docker meta id: meta uses: docker/metadata-action@v4 with: images: | pythonopenapi/openapi-spec-validator tags: | type=semver,pattern={{version}} - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to DockerHub if: github.event_name != 'pull_request' uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v4 with: context: . platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} python-openapi-openapi-spec-validator-1f3ff43/.github/workflows/python-publish.yml000066400000000000000000000015351451222636700305670ustar00rootroot00000000000000# This workflow will upload a Python Package using Twine when a release is created # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries name: Publish python packages on: workflow_dispatch: release: types: - published jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Set up poetry uses: Gr1N/setup-poetry@v8 - name: Build run: poetry build - name: Publish env: POETRY_HTTP_BASIC_PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }} POETRY_HTTP_BASIC_PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: poetry publish python-openapi-openapi-spec-validator-1f3ff43/.github/workflows/python-test.yml000066400000000000000000000035611451222636700301010ustar00rootroot00000000000000# This workflow will install Python dependencies, run tests and lint with a variety of Python versions # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions name: Test python code on: push: pull_request: types: [opened, synchronize] jobs: test: name: "Tests" runs-on: ${{ matrix.os }} strategy: matrix: python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [windows-latest, ubuntu-latest] fail-fast: false steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Get full Python version id: full-python-version run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") - name: Set up poetry uses: Gr1N/setup-poetry@v8 - name: Configure poetry run: poetry config virtualenvs.in-project true - name: Set up cache uses: actions/cache@v3 id: cache with: path: .venv key: venv-${{ github.event_name }}-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} - name: Ensure cache is healthy if: steps.cache.outputs.cache-hit == 'true' shell: bash run: timeout 10s poetry run pip --version || rm -rf .venv - name: Install dependencies run: poetry install --all-extras - name: Test env: PYTEST_ADDOPTS: "--color=yes" run: poetry run pytest - name: Static type check run: poetry run mypy - name: Check dependencies run: poetry run deptry . - name: Upload coverage uses: codecov/codecov-action@v3 python-openapi-openapi-spec-validator-1f3ff43/.gitignore000066400000000000000000000023271451222636700234520ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # dotenv .env # virtualenv .venv venv/ ENV/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # asdf versions .tool-versions .default-python-packages # mypy .mypy_cache/ # pytest .pytest_cache/ python-openapi-openapi-spec-validator-1f3ff43/.pre-commit-config.yaml000066400000000000000000000017551451222636700257470ustar00rootroot00000000000000--- default_stages: [commit, push] default_language_version: # force all unspecified python hooks to run python3 python: python3 minimum_pre_commit_version: "1.20.0" repos: - repo: meta hooks: - id: check-hooks-apply - repo: https://github.com/asottile/pyupgrade rev: v2.19.0 hooks: - id: pyupgrade args: ["--py36-plus"] - repo: local hooks: - id: flynt name: Convert to f-strings with flynt entry: flynt language: python additional_dependencies: ['flynt==0.76'] - id: black name: black entry: black language: system require_serial: true types: [python] - id: isort name: isort entry: isort args: ['--filter-files'] language: system require_serial: true types: [python] - id: pyflakes name: pyflakes entry: pyflakes language: system require_serial: true types: [python] python-openapi-openapi-spec-validator-1f3ff43/.pre-commit-hooks.yaml000066400000000000000000000003041451222636700256120ustar00rootroot00000000000000- id: openapi-spec-validator name: openapi-spec-validator entry: openapi-spec-validator description: Hook to validate Open API specs. language: python files: .*openapi.*\.(json|yaml|yml)python-openapi-openapi-spec-validator-1f3ff43/.readthedocs.yaml000066400000000000000000000004321451222636700247040ustar00rootroot00000000000000version: 2 sphinx: configuration: docs/conf.py formats: all build: os: ubuntu-20.04 tools: python: "3.9" jobs: post_create_environment: - pip install poetry - poetry config virtualenvs.create false post_install: - poetry install --with docs python-openapi-openapi-spec-validator-1f3ff43/.travis.yml000066400000000000000000000005351451222636700235720ustar00rootroot00000000000000language: python sudo: false matrix: include: - python: '3.8' - python: '3.9' - python: '3.10-dev' - python: 'nightly' - python: 'pypy3' allow_failures: - python: 'nightly' before_install: - python -m pip install --upgrade pip - pip install "poetry<1.2" install: - poetry install script: - poetry run pytest after_success: - codecov python-openapi-openapi-spec-validator-1f3ff43/CONTRIBUTING.rst000066400000000000000000000002231451222636700241140ustar00rootroot00000000000000Please read the `Contributing `__ guidelines in the documentation site. python-openapi-openapi-spec-validator-1f3ff43/Dockerfile000066400000000000000000000011331451222636700234460ustar00rootroot00000000000000ARG OPENAPI_SPEC_VALIDATOR_VERSION=0.7.1 FROM python:3.12.0-alpine as builder ARG OPENAPI_SPEC_VALIDATOR_VERSION ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse RUN apk add --no-cache cargo RUN python -m pip wheel --wheel-dir /wheels openapi-spec-validator==${OPENAPI_SPEC_VALIDATOR_VERSION} FROM python:3.12.0-alpine ARG OPENAPI_SPEC_VALIDATOR_VERSION COPY --from=builder /wheels /wheels RUN apk add --no-cache libgcc RUN pip install --no-cache-dir --pre --find-links /wheels openapi-spec-validator==${OPENAPI_SPEC_VALIDATOR_VERSION} && \ rm -r /wheels ENTRYPOINT ["openapi-spec-validator"] python-openapi-openapi-spec-validator-1f3ff43/LICENSE000066400000000000000000000261351451222636700224720ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. python-openapi-openapi-spec-validator-1f3ff43/MANIFEST.in000066400000000000000000000002651451222636700232170ustar00rootroot00000000000000include README.md include requirements.txt include requirements_dev.txt include openapi_spec_validator/py.typed include openapi_spec_validator/resources/schemas/*/* include LICENSE python-openapi-openapi-spec-validator-1f3ff43/Makefile000066400000000000000000000016731451222636700231250ustar00rootroot00000000000000.EXPORT_ALL_VARIABLES: PROJECT_NAME=openapi-spec-validator PACKAGE_NAME=$(subst -,_,${PROJECT_NAME}) VERSION=`git describe --abbrev=0` DOCKER_REGISTRY=pythonopenapi PYTHONDONTWRITEBYTECODE=1 params: @echo "Project name: ${PROJECT_NAME}" @echo "Package name: ${PACKAGE_NAME}" @echo "Version: ${VERSION}" dist-build: @python setup.py bdist_wheel dist-cleanup: @rm -rf build dist ${PACKAGE_NAME}.egg-info dist-upload: @twine upload dist/*.whl test-python: @python setup.py test test-cache-cleanup: @rm -rf .pytest_cache reports-cleanup: @rm -rf reports test-cleanup: test-cache-cleanup reports-cleanup cleanup: dist-cleanup test-cleanup docker-build: @docker build --no-cache --build-arg OPENAPI_SPEC_VALIDATOR_VERSION=${VERSION} -t ${PROJECT_NAME}:${VERSION} . docker-tag: @docker tag ${PROJECT_NAME}:${VERSION} ${DOCKER_REGISTRY}/${PROJECT_NAME}:${VERSION} docker-push: @docker push ${DOCKER_REGISTRY}/${PROJECT_NAME}:${VERSION} python-openapi-openapi-spec-validator-1f3ff43/NOTICE000066400000000000000000000011051451222636700223570ustar00rootroot00000000000000openapi-spec-validator Copyright 2017-2021 Artur Maciag Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. python-openapi-openapi-spec-validator-1f3ff43/README.rst000066400000000000000000000103561451222636700231520ustar00rootroot00000000000000********************** OpenAPI Spec validator ********************** .. image:: https://img.shields.io/docker/v/pythonopenapi/openapi-spec-validator.svg?color=%23086DD7&label=docker%20hub&sort=semver :target: https://hub.docker.com/r/pythonopenapi/openapi-spec-validator .. image:: https://img.shields.io/pypi/v/openapi-spec-validator.svg :target: https://pypi.python.org/pypi/openapi-spec-validator .. image:: https://travis-ci.org/python-openapi/openapi-spec-validator.svg?branch=master :target: https://travis-ci.org/python-openapi/openapi-spec-validator .. image:: https://img.shields.io/codecov/c/github/python-openapi/openapi-spec-validator/master.svg?style=flat :target: https://codecov.io/github/python-openapi/openapi-spec-validator?branch=master .. image:: https://img.shields.io/pypi/pyversions/openapi-spec-validator.svg :target: https://pypi.python.org/pypi/openapi-spec-validator .. image:: https://img.shields.io/pypi/format/openapi-spec-validator.svg :target: https://pypi.python.org/pypi/openapi-spec-validator .. image:: https://img.shields.io/pypi/status/openapi-spec-validator.svg :target: https://pypi.python.org/pypi/openapi-spec-validator About ##### OpenAPI Spec Validator is a CLI, pre-commit hook and python package that validates OpenAPI Specs against the `OpenAPI 2.0 (aka Swagger) `__, `OpenAPI 3.0 `__ and `OpenAPI 3.1 `__ specification. The validator aims to check for full compliance with the Specification. Documentation ############# Check documentation to see more details about the features. All documentation is in the "docs" directory and online at `openapi-spec-validator.readthedocs.io `__ Installation ############ .. code-block:: console pip install openapi-spec-validator Alternatively you can download the code and install from the repository: .. code-block:: bash pip install -e git+https://github.com/python-openapi/openapi-spec-validator.git#egg=openapi_spec_validator Usage ##### CLI (Command Line Interface) **************************** Straight forward way: .. code-block:: bash openapi-spec-validator openapi.yaml pipes way: .. code-block:: bash cat openapi.yaml | openapi-spec-validator - docker way: .. code-block:: bash docker run -v path/to/openapi.yaml:/openapi.yaml --rm pythonopenapi/openapi-spec-validator /openapi.yaml or more pythonic way: .. code-block:: bash python -m openapi_spec_validator openapi.yaml For more details, read about `CLI (Command Line Interface) `__. pre-commit hook *************** .. code-block:: yaml repos: - repo: https://github.com/python-openapi/openapi-spec-validator rev: 0.5.5 # The version to use or 'master' for latest hooks: - id: openapi-spec-validator For more details, read about `pre-commit hook `__. Python package ************** .. code:: python from openapi_spec_validator import validate from openapi_spec_validator.readers import read_from_filename spec_dict, base_uri = read_from_filename('openapi.yaml') # If no exception is raised by validate(), the spec is valid. validate(spec_dict) validate({'openapi': '3.1.0'}) Traceback (most recent call last): ... OpenAPIValidationError: 'info' is a required property For more details, read about `Python package `__. Related projects ################ * `openapi-core `__ Python library that adds client-side and server-side support for the OpenAPI v3.0 and OpenAPI v3.1 specification. * `openapi-schema-validator `__ Python library that validates schema against the OpenAPI Schema Specification v3.0 and OpenAPI Schema Specification v3.1. License ####### Copyright (c) 2017-2023, Artur Maciag, All rights reserved. Apache v2 python-openapi-openapi-spec-validator-1f3ff43/docs/000077500000000000000000000000001451222636700224065ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/docs/cli.rst000066400000000000000000000023711451222636700237120ustar00rootroot00000000000000CLI (Command Line Interface) ============================ .. md-tab-set:: .. md-tab-item:: Executable Straight forward way: .. code-block:: bash openapi-spec-validator openapi.yaml pipes way: .. code-block:: bash cat openapi.yaml | openapi-spec-validator - .. md-tab-item:: Docker .. code-block:: bash docker run -v path/to/openapi.yaml:/openapi.yaml --rm pythonopenapi/openapi-spec-validator /openapi.yaml .. md-tab-item:: Python interpreter .. code-block:: bash python -m openapi_spec_validator openapi.yaml .. code-block:: bash usage: openapi-spec-validator [-h] [--errors {best-match,all}] [--schema {2.0,3.0.0,3.1.0,detect}] filename positional arguments: filename Absolute or relative path to file options: -h, --help show this help message and exit --errors {best-match,all} Control error reporting. Defaults to "best- match", use "all" to get all subschema errors. --schema {2.0,3.0.0,3.1.0,detect} OpenAPI schema (default: detect) python-openapi-openapi-spec-validator-1f3ff43/docs/conf.py000066400000000000000000000030761451222636700237130ustar00rootroot00000000000000import openapi_spec_validator project = "openapi-spec-validator" copyright = "2023, Artur Maciag" author = "Artur Maciag" release = openapi_spec_validator.__version__ extensions = [ "sphinx.ext.autodoc", "sphinx.ext.doctest", "sphinx.ext.intersphinx", "sphinx.ext.coverage", "sphinx.ext.viewcode", "sphinx_immaterial", ] templates_path = ["_templates"] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] html_theme = "sphinx_immaterial" html_static_path = [] html_title = "openapi-spec-validator" html_theme_options = { "analytics": { "provider": "google", "property": "G-SWHTV603PN", }, "repo_url": "https://github.com/python-openapi/openapi-spec-validator/", "repo_name": "openapi-spec-validator", "icon": { "repo": "fontawesome/brands/github-alt", "edit": "material/file-edit-outline", }, "palette": [ { "media": "(prefers-color-scheme: dark)", "scheme": "slate", "primary": "lime", "accent": "amber", "scheme": "slate", "toggle": { "icon": "material/toggle-switch", "name": "Switch to light mode", }, }, { "media": "(prefers-color-scheme: light)", "scheme": "default", "primary": "lime", "accent": "amber", "toggle": { "icon": "material/toggle-switch-off-outline", "name": "Switch to dark mode", }, }, ], "globaltoc_collapse": False, } python-openapi-openapi-spec-validator-1f3ff43/docs/contributing.rst000066400000000000000000000044311451222636700256510ustar00rootroot00000000000000Contributing ============ Firstly, thank you all for taking the time to contribute. The following section describes how you can contribute to the openapi-spec-validator project on GitHub. Reporting bugs -------------- Before you report ^^^^^^^^^^^^^^^^^ * Check whether your issue does not already exist in the `Issue tracker `__. * Make sure it is not a support request or question better suited for `Discussion board `__. How to submit a report ^^^^^^^^^^^^^^^^^^^^^^ * Include clear title. * Describe your runtime environment with exact versions you use. * Describe the exact steps which reproduce the problem, including minimal code snippets. * Describe the behavior you observed after following the steps, pasting console outputs. * Describe expected behavior to see and why, including links to documentations. Code contribution ----------------- Prerequisites ^^^^^^^^^^^^^ Install `Poetry `__ by following the `official installation instructions `__. Optionally (but recommended), configure Poetry to create a virtual environment in a folder named ``.venv`` within the root directory of the project: .. code-block:: console poetry config virtualenvs.in-project true Setup ^^^^^ To create a development environment and install the runtime and development dependencies, run: .. code-block:: console poetry install Then enter the virtual environment created by Poetry: .. code-block:: console poetry shell Static checks ^^^^^^^^^^^^^ The project uses static checks using fantastic `pre-commit `__. Every change is checked on CI and if it does not pass the tests it cannot be accepted. If you want to check locally then run following command to install pre-commit. To turn on pre-commit checks for commit operations in git, enter: .. code-block:: console pre-commit install To run all checks on your staged files, enter: .. code-block:: console pre-commit run To run all checks on all files, enter: .. code-block:: console pre-commit run --all-files Pre-commit check results are also attached to your PR through integration with Github Action. python-openapi-openapi-spec-validator-1f3ff43/docs/hook.rst000066400000000000000000000015631451222636700241050ustar00rootroot00000000000000pre-commit hook =============== `pre-commit `__ is a framework for building and running `git hooks `__. This document describes available pre-commit hook provided by openapi-spec-validator. Usage ----- The ``openapi-spec-validator`` hook calls the openapi-spec-validator command to make sure the specification does not get committed in a broken state. For more information see the :doc:`cli`. A full .pre-commit-config.yaml example you can use in your repository: .. code-block:: yaml repos: - repo: https://github.com/python-openapi/openapi-spec-validator rev: 0.5.5 # The version to use or 'master' for latest hooks: - id: openapi-spec-validator For more information on how to use pre-commit please see the official `documentation `__. python-openapi-openapi-spec-validator-1f3ff43/docs/index.rst000066400000000000000000000061511451222636700242520ustar00rootroot00000000000000openapi-spec-validator ====================== .. toctree:: :hidden: :maxdepth: 2 cli python hook contributing OpenAPI Spec Validator is a CLI, pre-commit hook and python package that validates OpenAPI Specs against the `OpenAPI 2.0 (aka Swagger) `__, `OpenAPI 3.0 `__ and `OpenAPI 3.1 `__ specification. The validator aims to check for full compliance with the Specification. Installation ------------ .. md-tab-set:: .. md-tab-item:: Pip + PyPI (recommented) .. code-block:: console pip install openapi-spec-validator .. md-tab-item:: Pip + the source .. code-block:: console pip install -e git+https://github.com/python-openapi/openapi-spec-validator.git#egg=openapi_spec_validator Usage ----- .. md-tab-set:: .. md-tab-item:: CLI (Command Line Interface) .. md-tab-set:: .. md-tab-item:: Executable Straight forward way: .. code-block:: bash openapi-spec-validator openapi.yaml pipes way: .. code-block:: bash cat openapi.yaml | openapi-spec-validator - .. md-tab-item:: Docker .. code-block:: bash docker run -v path/to/openapi.yaml:/openapi.yaml --rm pythonopenapi/openapi-spec-validator /openapi.yaml .. md-tab-item:: Python interpreter .. code-block:: bash python -m openapi_spec_validator openapi.yaml Read more about the :doc:`cli`. .. md-tab-item:: pre-commit hook .. code-block:: yaml repos: - repo: https://github.com/python-openapi/openapi-spec-validator rev: 0.5.5 # The version to use or 'master' for latest hooks: - id: openapi-spec-validator Read more about the :doc:`hook`. .. md-tab-item:: Python package .. code-block:: python from openapi_spec_validator import validate_spec from openapi_spec_validator.readers import read_from_filename spec_dict, base_uri = read_from_filename('openapi.yaml') # If no exception is raised by validate_spec(), the spec is valid. validate_spec(spec_dict) validate_spec({'openapi': '3.1.0'}) Traceback (most recent call last): ... OpenAPIValidationError: 'info' is a required property Read more about the :doc:`python`. Related projects ---------------- * `openapi-core `__ Python library that adds client-side and server-side support for the OpenAPI v3.0 and OpenAPI v3.1 specification. * `openapi-schema-validator `__ Python library that validates schema against the OpenAPI Schema Specification v3.0 and OpenAPI Schema Specification v3.1. License ------- Copyright (c) 2017-2023, Artur Maciag, All rights reserved. Apache v2 python-openapi-openapi-spec-validator-1f3ff43/docs/make.bat000066400000000000000000000014331451222636700240140ustar00rootroot00000000000000@ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=. set BUILDDIR=_build if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% :end popd python-openapi-openapi-spec-validator-1f3ff43/docs/python.rst000066400000000000000000000030471451222636700244650ustar00rootroot00000000000000Python package ============== By default, OpenAPI spec version is detected. To validate spec: .. code:: python from openapi_spec_validator import validate from openapi_spec_validator.readers import read_from_filename spec_dict, base_uri = read_from_filename('openapi.yaml') # If no exception is raised by validate(), the spec is valid. validate(spec_dict) validate({'openapi': '3.1.0'}) Traceback (most recent call last): ... OpenAPIValidationError: 'info' is a required property Add ``base_uri`` to validate spec with relative files: .. code:: python validate(spec_dict, base_uri='file:///path/to/spec/openapi.yaml') You can also validate spec from url: .. code:: python from openapi_spec_validator import validate_url # If no exception is raised by validate_url(), the spec is valid. validate_url('http://example.com/openapi.json') In order to explicitly validate a: * Swagger / OpenAPI 2.0 spec, import ``OpenAPIV2SpecValidator`` * OpenAPI 3.0 spec, import ``OpenAPIV30SpecValidator`` * OpenAPI 3.1 spec, import ``OpenAPIV31SpecValidator`` and pass the validator class to ``validate`` or ``validate_url`` function: .. code:: python validate(spec_dict, cls=OpenAPIV31SpecValidator) You can also explicitly import ``OpenAPIV3SpecValidator`` which is a shortcut to the latest v3 release. If you want to iterate through validation errors: .. code:: python from openapi_spec_validator import OpenAPIV31SpecValidator errors_iterator = OpenAPIV31SpecValidator(spec).iter_errors() python-openapi-openapi-spec-validator-1f3ff43/hooks.yaml000066400000000000000000000003041451222636700234620ustar00rootroot00000000000000- id: openapi-spec-validator name: openapi-spec-validator entry: openapi-spec-validator description: Hook to validate Open API specs. language: python files: .*openapi.*\.(json|yaml|yml)python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/000077500000000000000000000000001451222636700261705ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/__init__.py000066400000000000000000000025611451222636700303050ustar00rootroot00000000000000"""OpenAPI spec validator module.""" from openapi_spec_validator.shortcuts import validate from openapi_spec_validator.shortcuts import validate_spec from openapi_spec_validator.shortcuts import validate_spec_url from openapi_spec_validator.shortcuts import validate_url from openapi_spec_validator.validation import OpenAPIV2SpecValidator from openapi_spec_validator.validation import OpenAPIV3SpecValidator from openapi_spec_validator.validation import OpenAPIV30SpecValidator from openapi_spec_validator.validation import OpenAPIV31SpecValidator from openapi_spec_validator.validation import openapi_v2_spec_validator from openapi_spec_validator.validation import openapi_v3_spec_validator from openapi_spec_validator.validation import openapi_v30_spec_validator from openapi_spec_validator.validation import openapi_v31_spec_validator __author__ = "Artur Maciag" __email__ = "maciag.artur@gmail.com" __version__ = "0.7.1" __url__ = "https://github.com/python-openapi/openapi-spec-validator" __license__ = "Apache License, Version 2.0" __all__ = [ "openapi_v2_spec_validator", "openapi_v3_spec_validator", "openapi_v30_spec_validator", "openapi_v31_spec_validator", "OpenAPIV2SpecValidator", "OpenAPIV3SpecValidator", "OpenAPIV30SpecValidator", "OpenAPIV31SpecValidator", "validate", "validate_url", "validate_spec", "validate_spec_url", ] python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/__main__.py000066400000000000000000000070021451222636700302610ustar00rootroot00000000000000import logging import sys from argparse import ArgumentParser from typing import Optional from typing import Sequence from jsonschema.exceptions import ValidationError from jsonschema.exceptions import best_match from openapi_spec_validator.readers import read_from_filename from openapi_spec_validator.readers import read_from_stdin from openapi_spec_validator.shortcuts import validate from openapi_spec_validator.validation import OpenAPIV2SpecValidator from openapi_spec_validator.validation import OpenAPIV30SpecValidator from openapi_spec_validator.validation import OpenAPIV31SpecValidator logger = logging.getLogger(__name__) logging.basicConfig( format="%(asctime)s %(levelname)s %(name)s %(message)s", level=logging.WARNING, ) def print_ok(filename: str) -> None: print(f"{filename}: OK") def print_error(filename: str, exc: Exception) -> None: print(f"{filename}: Error: {exc}") def print_validationerror( filename: str, exc: ValidationError, errors: str = "best-match" ) -> None: print(f"{filename}: Validation Error: {exc}") if exc.cause: print("\n# Cause\n") print(exc.cause) if not exc.context: return if errors == "all": print("\n\n# Due to one of those errors\n") print("\n\n\n".join("## " + str(e) for e in exc.context)) elif errors == "best-match": print("\n\n# Probably due to this subschema error\n") print("## " + str(best_match(exc.context))) if len(exc.context) > 1: print( f"\n({len(exc.context) - 1} more subschemas errors,", "use --errors=all to see them.)", ) def main(args: Optional[Sequence[str]] = None) -> None: parser = ArgumentParser() parser.add_argument( "file", nargs="+", help="Validate specified file(s).", ) parser.add_argument( "--errors", choices=("best-match", "all"), default="best-match", help="""Control error reporting. Defaults to "best-match", """ """use "all" to get all subschema errors.""", ) parser.add_argument( "--schema", type=str, choices=["detect", "2.0", "3.0", "3.1", "3.0.0", "3.1.0"], default="detect", metavar="{detect,2.0,3.0,3.1}", help="OpenAPI schema version (default: detect).", ) args_parsed = parser.parse_args(args) for filename in args_parsed.file: # choose source reader = read_from_filename if filename in ["-", "/-"]: filename = "stdin" reader = read_from_stdin # read source try: spec, base_uri = reader(filename) except Exception as exc: print(exc) sys.exit(1) # choose the validator validators = { "detect": None, "2.0": OpenAPIV2SpecValidator, "3.0": OpenAPIV30SpecValidator, "3.1": OpenAPIV31SpecValidator, # backward compatibility "3.0.0": OpenAPIV30SpecValidator, "3.1.0": OpenAPIV31SpecValidator, } validator_cls = validators[args_parsed.schema] # validate try: validate(spec, base_uri=base_uri, cls=validator_cls) except ValidationError as exc: print_validationerror(filename, exc, args_parsed.errors) sys.exit(1) except Exception as exc: print_error(filename, exc) sys.exit(2) else: print_ok(filename) if __name__ == "__main__": main() python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/exceptions.py000066400000000000000000000001421451222636700307200ustar00rootroot00000000000000class OpenAPIError(Exception): pass class OpenAPISpecValidatorError(OpenAPIError): pass python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/py.typed000066400000000000000000000000001451222636700276550ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/readers.py000066400000000000000000000012361451222636700301710ustar00rootroot00000000000000import sys from os import path from pathlib import Path from typing import Any from typing import Hashable from typing import Mapping from typing import Tuple from jsonschema_path.handlers import all_urls_handler from jsonschema_path.handlers import file_handler def read_from_stdin(filename: str) -> Tuple[Mapping[Hashable, Any], str]: return file_handler(sys.stdin), "" # type: ignore def read_from_filename(filename: str) -> Tuple[Mapping[Hashable, Any], str]: if not path.isfile(filename): raise OSError(f"No such file: {filename}") filename = path.abspath(filename) uri = Path(filename).as_uri() return all_urls_handler(uri), uri python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/000077500000000000000000000000001451222636700302025ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/000077500000000000000000000000001451222636700316255ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/v2.0/000077500000000000000000000000001451222636700323125ustar00rootroot00000000000000schema.json000066400000000000000000001164131451222636700343740ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/v2.0{ "title": "A JSON Schema for Swagger 2.0 API.", "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "required": [ "swagger", "info", "paths" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "swagger": { "type": "string", "enum": [ "2.0" ], "description": "The Swagger version of this document." }, "info": { "$ref": "#/definitions/info" }, "host": { "type": "string", "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$", "description": "The host (name or ip) of the API. Example: 'swagger.io'" }, "basePath": { "type": "string", "pattern": "^/", "description": "The base path to the API. Example: '/api'." }, "schemes": { "$ref": "#/definitions/schemesList" }, "consumes": { "description": "A list of MIME types accepted by the API.", "allOf": [ { "$ref": "#/definitions/mediaTypeList" } ] }, "produces": { "description": "A list of MIME types the API can produce.", "allOf": [ { "$ref": "#/definitions/mediaTypeList" } ] }, "paths": { "$ref": "#/definitions/paths" }, "definitions": { "$ref": "#/definitions/definitions" }, "parameters": { "$ref": "#/definitions/parameterDefinitions" }, "responses": { "$ref": "#/definitions/responseDefinitions" }, "security": { "$ref": "#/definitions/security" }, "securityDefinitions": { "$ref": "#/definitions/securityDefinitions" }, "tags": { "type": "array", "items": { "$ref": "#/definitions/tag" }, "uniqueItems": true }, "externalDocs": { "$ref": "#/definitions/externalDocs" } }, "definitions": { "info": { "type": "object", "description": "General information about the API.", "required": [ "version", "title" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "title": { "type": "string", "description": "A unique and precise title of the API." }, "version": { "type": "string", "description": "A semantic version number of the API." }, "description": { "type": "string", "description": "A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed." }, "termsOfService": { "type": "string", "description": "The terms of service for the API." }, "contact": { "$ref": "#/definitions/contact" }, "license": { "$ref": "#/definitions/license" } } }, "contact": { "type": "object", "description": "Contact information for the owners of the API.", "additionalProperties": false, "properties": { "name": { "type": "string", "description": "The identifying name of the contact person/organization." }, "url": { "type": "string", "description": "The URL pointing to the contact information.", "format": "uri" }, "email": { "type": "string", "description": "The email address of the contact person/organization.", "format": "email" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "license": { "type": "object", "required": [ "name" ], "additionalProperties": false, "properties": { "name": { "type": "string", "description": "The name of the license type. It's encouraged to use an OSI compatible license." }, "url": { "type": "string", "description": "The URL pointing to the license.", "format": "uri" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "paths": { "type": "object", "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.", "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" }, "^/": { "$ref": "#/definitions/pathItem" } }, "additionalProperties": false }, "definitions": { "type": "object", "additionalProperties": { "$ref": "#/definitions/schema" }, "description": "One or more JSON objects describing the schemas being consumed and produced by the API." }, "parameterDefinitions": { "type": "object", "additionalProperties": { "$ref": "#/definitions/parameter" }, "description": "One or more JSON representations for parameters" }, "responseDefinitions": { "type": "object", "additionalProperties": { "$ref": "#/definitions/response" }, "description": "One or more JSON representations for responses" }, "externalDocs": { "type": "object", "additionalProperties": false, "description": "information about external documentation", "required": [ "url" ], "properties": { "description": { "type": "string" }, "url": { "type": "string", "format": "uri" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "examples": { "type": "object", "additionalProperties": true }, "mimeType": { "type": "string", "description": "The MIME type of the HTTP message." }, "operation": { "type": "object", "required": [ "responses" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "tags": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }, "summary": { "type": "string", "description": "A brief summary of the operation." }, "description": { "type": "string", "description": "A longer description of the operation, GitHub Flavored Markdown is allowed." }, "externalDocs": { "$ref": "#/definitions/externalDocs" }, "operationId": { "type": "string", "description": "A unique identifier of the operation." }, "produces": { "description": "A list of MIME types the API can produce.", "allOf": [ { "$ref": "#/definitions/mediaTypeList" } ] }, "consumes": { "description": "A list of MIME types the API can consume.", "allOf": [ { "$ref": "#/definitions/mediaTypeList" } ] }, "parameters": { "$ref": "#/definitions/parametersList" }, "responses": { "$ref": "#/definitions/responses" }, "schemes": { "$ref": "#/definitions/schemesList" }, "deprecated": { "type": "boolean", "default": false }, "security": { "$ref": "#/definitions/security" } } }, "pathItem": { "type": "object", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "$ref": { "type": "string" }, "get": { "$ref": "#/definitions/operation" }, "put": { "$ref": "#/definitions/operation" }, "post": { "$ref": "#/definitions/operation" }, "delete": { "$ref": "#/definitions/operation" }, "options": { "$ref": "#/definitions/operation" }, "head": { "$ref": "#/definitions/operation" }, "patch": { "$ref": "#/definitions/operation" }, "parameters": { "$ref": "#/definitions/parametersList" } } }, "responses": { "type": "object", "description": "Response objects names can either be any valid HTTP status code or 'default'.", "minProperties": 1, "additionalProperties": false, "patternProperties": { "^([0-9]{3})$|^(default)$": { "$ref": "#/definitions/responseValue" }, "^x-": { "$ref": "#/definitions/vendorExtension" } }, "not": { "type": "object", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } } }, "responseValue": { "oneOf": [ { "$ref": "#/definitions/response" }, { "$ref": "#/definitions/jsonReference" } ] }, "response": { "type": "object", "required": [ "description" ], "properties": { "description": { "type": "string" }, "schema": { "oneOf": [ { "$ref": "#/definitions/schema" }, { "$ref": "#/definitions/fileSchema" } ] }, "headers": { "$ref": "#/definitions/headers" }, "examples": { "$ref": "#/definitions/examples" } }, "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "headers": { "type": "object", "additionalProperties": { "$ref": "#/definitions/header" } }, "header": { "type": "object", "additionalProperties": false, "required": [ "type" ], "properties": { "type": { "type": "string", "enum": [ "string", "number", "integer", "boolean", "array" ] }, "format": { "type": "string" }, "items": { "$ref": "#/definitions/primitivesItems" }, "collectionFormat": { "$ref": "#/definitions/collectionFormat" }, "default": { "$ref": "#/definitions/default" }, "maximum": { "$ref": "#/definitions/maximum" }, "exclusiveMaximum": { "$ref": "#/definitions/exclusiveMaximum" }, "minimum": { "$ref": "#/definitions/minimum" }, "exclusiveMinimum": { "$ref": "#/definitions/exclusiveMinimum" }, "maxLength": { "$ref": "#/definitions/maxLength" }, "minLength": { "$ref": "#/definitions/minLength" }, "pattern": { "$ref": "#/definitions/pattern" }, "maxItems": { "$ref": "#/definitions/maxItems" }, "minItems": { "$ref": "#/definitions/minItems" }, "uniqueItems": { "$ref": "#/definitions/uniqueItems" }, "enum": { "$ref": "#/definitions/enum" }, "multipleOf": { "$ref": "#/definitions/multipleOf" }, "description": { "type": "string" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "vendorExtension": { "description": "Any property starting with x- is valid.", "additionalProperties": true, "additionalItems": true }, "bodyParameter": { "type": "object", "required": [ "name", "in", "schema" ], "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "description": { "type": "string", "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." }, "name": { "type": "string", "description": "The name of the parameter." }, "in": { "type": "string", "description": "Determines the location of the parameter.", "enum": [ "body" ] }, "required": { "type": "boolean", "description": "Determines whether or not this parameter is required or optional.", "default": false }, "schema": { "$ref": "#/definitions/schema" } }, "additionalProperties": false }, "headerParameterSubSchema": { "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "required": { "type": "boolean", "description": "Determines whether or not this parameter is required or optional.", "default": false }, "in": { "type": "string", "description": "Determines the location of the parameter.", "enum": [ "header" ] }, "description": { "type": "string", "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." }, "name": { "type": "string", "description": "The name of the parameter." }, "type": { "type": "string", "enum": [ "string", "number", "boolean", "integer", "array" ] }, "format": { "type": "string" }, "items": { "$ref": "#/definitions/primitivesItems" }, "collectionFormat": { "$ref": "#/definitions/collectionFormat" }, "default": { "$ref": "#/definitions/default" }, "maximum": { "$ref": "#/definitions/maximum" }, "exclusiveMaximum": { "$ref": "#/definitions/exclusiveMaximum" }, "minimum": { "$ref": "#/definitions/minimum" }, "exclusiveMinimum": { "$ref": "#/definitions/exclusiveMinimum" }, "maxLength": { "$ref": "#/definitions/maxLength" }, "minLength": { "$ref": "#/definitions/minLength" }, "pattern": { "$ref": "#/definitions/pattern" }, "maxItems": { "$ref": "#/definitions/maxItems" }, "minItems": { "$ref": "#/definitions/minItems" }, "uniqueItems": { "$ref": "#/definitions/uniqueItems" }, "enum": { "$ref": "#/definitions/enum" }, "multipleOf": { "$ref": "#/definitions/multipleOf" } } }, "queryParameterSubSchema": { "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "required": { "type": "boolean", "description": "Determines whether or not this parameter is required or optional.", "default": false }, "in": { "type": "string", "description": "Determines the location of the parameter.", "enum": [ "query" ] }, "description": { "type": "string", "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." }, "name": { "type": "string", "description": "The name of the parameter." }, "allowEmptyValue": { "type": "boolean", "default": false, "description": "allows sending a parameter by name only or with an empty value." }, "type": { "type": "string", "enum": [ "string", "number", "boolean", "integer", "array" ] }, "format": { "type": "string" }, "items": { "$ref": "#/definitions/primitivesItems" }, "collectionFormat": { "$ref": "#/definitions/collectionFormatWithMulti" }, "default": { "$ref": "#/definitions/default" }, "maximum": { "$ref": "#/definitions/maximum" }, "exclusiveMaximum": { "$ref": "#/definitions/exclusiveMaximum" }, "minimum": { "$ref": "#/definitions/minimum" }, "exclusiveMinimum": { "$ref": "#/definitions/exclusiveMinimum" }, "maxLength": { "$ref": "#/definitions/maxLength" }, "minLength": { "$ref": "#/definitions/minLength" }, "pattern": { "$ref": "#/definitions/pattern" }, "maxItems": { "$ref": "#/definitions/maxItems" }, "minItems": { "$ref": "#/definitions/minItems" }, "uniqueItems": { "$ref": "#/definitions/uniqueItems" }, "enum": { "$ref": "#/definitions/enum" }, "multipleOf": { "$ref": "#/definitions/multipleOf" } } }, "formDataParameterSubSchema": { "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "required": { "type": "boolean", "description": "Determines whether or not this parameter is required or optional.", "default": false }, "in": { "type": "string", "description": "Determines the location of the parameter.", "enum": [ "formData" ] }, "description": { "type": "string", "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." }, "name": { "type": "string", "description": "The name of the parameter." }, "allowEmptyValue": { "type": "boolean", "default": false, "description": "allows sending a parameter by name only or with an empty value." }, "type": { "type": "string", "enum": [ "string", "number", "boolean", "integer", "array", "file" ] }, "format": { "type": "string" }, "items": { "$ref": "#/definitions/primitivesItems" }, "collectionFormat": { "$ref": "#/definitions/collectionFormatWithMulti" }, "default": { "$ref": "#/definitions/default" }, "maximum": { "$ref": "#/definitions/maximum" }, "exclusiveMaximum": { "$ref": "#/definitions/exclusiveMaximum" }, "minimum": { "$ref": "#/definitions/minimum" }, "exclusiveMinimum": { "$ref": "#/definitions/exclusiveMinimum" }, "maxLength": { "$ref": "#/definitions/maxLength" }, "minLength": { "$ref": "#/definitions/minLength" }, "pattern": { "$ref": "#/definitions/pattern" }, "maxItems": { "$ref": "#/definitions/maxItems" }, "minItems": { "$ref": "#/definitions/minItems" }, "uniqueItems": { "$ref": "#/definitions/uniqueItems" }, "enum": { "$ref": "#/definitions/enum" }, "multipleOf": { "$ref": "#/definitions/multipleOf" } } }, "pathParameterSubSchema": { "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "required": [ "required" ], "properties": { "required": { "type": "boolean", "enum": [ true ], "description": "Determines whether or not this parameter is required or optional." }, "in": { "type": "string", "description": "Determines the location of the parameter.", "enum": [ "path" ] }, "description": { "type": "string", "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." }, "name": { "type": "string", "description": "The name of the parameter." }, "type": { "type": "string", "enum": [ "string", "number", "boolean", "integer", "array" ] }, "format": { "type": "string" }, "items": { "$ref": "#/definitions/primitivesItems" }, "collectionFormat": { "$ref": "#/definitions/collectionFormat" }, "default": { "$ref": "#/definitions/default" }, "maximum": { "$ref": "#/definitions/maximum" }, "exclusiveMaximum": { "$ref": "#/definitions/exclusiveMaximum" }, "minimum": { "$ref": "#/definitions/minimum" }, "exclusiveMinimum": { "$ref": "#/definitions/exclusiveMinimum" }, "maxLength": { "$ref": "#/definitions/maxLength" }, "minLength": { "$ref": "#/definitions/minLength" }, "pattern": { "$ref": "#/definitions/pattern" }, "maxItems": { "$ref": "#/definitions/maxItems" }, "minItems": { "$ref": "#/definitions/minItems" }, "uniqueItems": { "$ref": "#/definitions/uniqueItems" }, "enum": { "$ref": "#/definitions/enum" }, "multipleOf": { "$ref": "#/definitions/multipleOf" } } }, "nonBodyParameter": { "type": "object", "required": [ "name", "in", "type" ], "oneOf": [ { "$ref": "#/definitions/headerParameterSubSchema" }, { "$ref": "#/definitions/formDataParameterSubSchema" }, { "$ref": "#/definitions/queryParameterSubSchema" }, { "$ref": "#/definitions/pathParameterSubSchema" } ] }, "parameter": { "oneOf": [ { "$ref": "#/definitions/bodyParameter" }, { "$ref": "#/definitions/nonBodyParameter" } ] }, "schema": { "type": "object", "description": "A deterministic version of a JSON Schema object.", "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "properties": { "$ref": { "type": "string" }, "format": { "type": "string" }, "title": { "$ref": "http://json-schema.org/draft-04/schema#/properties/title" }, "description": { "$ref": "http://json-schema.org/draft-04/schema#/properties/description" }, "default": { "$ref": "http://json-schema.org/draft-04/schema#/properties/default" }, "multipleOf": { "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" }, "maximum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" }, "exclusiveMaximum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" }, "minimum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" }, "exclusiveMinimum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" }, "maxLength": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, "minLength": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" }, "pattern": { "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" }, "maxItems": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, "minItems": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" }, "uniqueItems": { "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" }, "maxProperties": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, "minProperties": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" }, "required": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" }, "enum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" }, "additionalProperties": { "anyOf": [ { "$ref": "#/definitions/schema" }, { "type": "boolean" } ], "default": {} }, "type": { "$ref": "http://json-schema.org/draft-04/schema#/properties/type" }, "items": { "anyOf": [ { "$ref": "#/definitions/schema" }, { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/schema" } } ], "default": {} }, "allOf": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/schema" } }, "properties": { "type": "object", "additionalProperties": { "$ref": "#/definitions/schema" }, "default": {} }, "discriminator": { "type": "string" }, "readOnly": { "type": "boolean", "default": false }, "xml": { "$ref": "#/definitions/xml" }, "externalDocs": { "$ref": "#/definitions/externalDocs" }, "example": {} }, "additionalProperties": false }, "fileSchema": { "type": "object", "description": "A deterministic version of a JSON Schema object.", "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } }, "required": [ "type" ], "properties": { "format": { "type": "string" }, "title": { "$ref": "http://json-schema.org/draft-04/schema#/properties/title" }, "description": { "$ref": "http://json-schema.org/draft-04/schema#/properties/description" }, "default": { "$ref": "http://json-schema.org/draft-04/schema#/properties/default" }, "required": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" }, "type": { "type": "string", "enum": [ "file" ] }, "readOnly": { "type": "boolean", "default": false }, "externalDocs": { "$ref": "#/definitions/externalDocs" }, "example": {} }, "additionalProperties": false }, "primitivesItems": { "type": "object", "additionalProperties": false, "properties": { "type": { "type": "string", "enum": [ "string", "number", "integer", "boolean", "array" ] }, "format": { "type": "string" }, "items": { "$ref": "#/definitions/primitivesItems" }, "collectionFormat": { "$ref": "#/definitions/collectionFormat" }, "default": { "$ref": "#/definitions/default" }, "maximum": { "$ref": "#/definitions/maximum" }, "exclusiveMaximum": { "$ref": "#/definitions/exclusiveMaximum" }, "minimum": { "$ref": "#/definitions/minimum" }, "exclusiveMinimum": { "$ref": "#/definitions/exclusiveMinimum" }, "maxLength": { "$ref": "#/definitions/maxLength" }, "minLength": { "$ref": "#/definitions/minLength" }, "pattern": { "$ref": "#/definitions/pattern" }, "maxItems": { "$ref": "#/definitions/maxItems" }, "minItems": { "$ref": "#/definitions/minItems" }, "uniqueItems": { "$ref": "#/definitions/uniqueItems" }, "enum": { "$ref": "#/definitions/enum" }, "multipleOf": { "$ref": "#/definitions/multipleOf" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "security": { "type": "array", "items": { "$ref": "#/definitions/securityRequirement" }, "uniqueItems": true }, "securityRequirement": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" }, "uniqueItems": true } }, "xml": { "type": "object", "additionalProperties": false, "properties": { "name": { "type": "string" }, "namespace": { "type": "string" }, "prefix": { "type": "string" }, "attribute": { "type": "boolean", "default": false }, "wrapped": { "type": "boolean", "default": false } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "tag": { "type": "object", "additionalProperties": false, "required": [ "name" ], "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "externalDocs": { "$ref": "#/definitions/externalDocs" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "securityDefinitions": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/basicAuthenticationSecurity" }, { "$ref": "#/definitions/apiKeySecurity" }, { "$ref": "#/definitions/oauth2ImplicitSecurity" }, { "$ref": "#/definitions/oauth2PasswordSecurity" }, { "$ref": "#/definitions/oauth2ApplicationSecurity" }, { "$ref": "#/definitions/oauth2AccessCodeSecurity" } ] } }, "basicAuthenticationSecurity": { "type": "object", "additionalProperties": false, "required": [ "type" ], "properties": { "type": { "type": "string", "enum": [ "basic" ] }, "description": { "type": "string" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "apiKeySecurity": { "type": "object", "additionalProperties": false, "required": [ "type", "name", "in" ], "properties": { "type": { "type": "string", "enum": [ "apiKey" ] }, "name": { "type": "string" }, "in": { "type": "string", "enum": [ "header", "query" ] }, "description": { "type": "string" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "oauth2ImplicitSecurity": { "type": "object", "additionalProperties": false, "required": [ "type", "flow", "authorizationUrl" ], "properties": { "type": { "type": "string", "enum": [ "oauth2" ] }, "flow": { "type": "string", "enum": [ "implicit" ] }, "scopes": { "$ref": "#/definitions/oauth2Scopes" }, "authorizationUrl": { "type": "string", "format": "uri" }, "description": { "type": "string" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "oauth2PasswordSecurity": { "type": "object", "additionalProperties": false, "required": [ "type", "flow", "tokenUrl" ], "properties": { "type": { "type": "string", "enum": [ "oauth2" ] }, "flow": { "type": "string", "enum": [ "password" ] }, "scopes": { "$ref": "#/definitions/oauth2Scopes" }, "tokenUrl": { "type": "string", "format": "uri" }, "description": { "type": "string" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "oauth2ApplicationSecurity": { "type": "object", "additionalProperties": false, "required": [ "type", "flow", "tokenUrl" ], "properties": { "type": { "type": "string", "enum": [ "oauth2" ] }, "flow": { "type": "string", "enum": [ "application" ] }, "scopes": { "$ref": "#/definitions/oauth2Scopes" }, "tokenUrl": { "type": "string", "format": "uri" }, "description": { "type": "string" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "oauth2AccessCodeSecurity": { "type": "object", "additionalProperties": false, "required": [ "type", "flow", "authorizationUrl", "tokenUrl" ], "properties": { "type": { "type": "string", "enum": [ "oauth2" ] }, "flow": { "type": "string", "enum": [ "accessCode" ] }, "scopes": { "$ref": "#/definitions/oauth2Scopes" }, "authorizationUrl": { "type": "string", "format": "uri" }, "tokenUrl": { "type": "string", "format": "uri" }, "description": { "type": "string" } }, "patternProperties": { "^x-": { "$ref": "#/definitions/vendorExtension" } } }, "oauth2Scopes": { "type": "object", "additionalProperties": { "type": "string" } }, "mediaTypeList": { "type": "array", "items": { "$ref": "#/definitions/mimeType" }, "uniqueItems": true }, "parametersList": { "type": "array", "description": "The parameters needed to send a valid API call.", "additionalItems": false, "items": { "oneOf": [ { "$ref": "#/definitions/parameter" }, { "$ref": "#/definitions/jsonReference" } ] }, "uniqueItems": true }, "schemesList": { "type": "array", "description": "The transfer protocol of the API.", "items": { "type": "string", "enum": [ "http", "https", "ws", "wss" ] }, "uniqueItems": true }, "collectionFormat": { "type": "string", "enum": [ "csv", "ssv", "tsv", "pipes" ], "default": "csv" }, "collectionFormatWithMulti": { "type": "string", "enum": [ "csv", "ssv", "tsv", "pipes", "multi" ], "default": "csv" }, "title": { "$ref": "http://json-schema.org/draft-04/schema#/properties/title" }, "description": { "$ref": "http://json-schema.org/draft-04/schema#/properties/description" }, "default": { "$ref": "http://json-schema.org/draft-04/schema#/properties/default" }, "multipleOf": { "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" }, "maximum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" }, "exclusiveMaximum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" }, "minimum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" }, "exclusiveMinimum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" }, "maxLength": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, "minLength": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" }, "pattern": { "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" }, "maxItems": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, "minItems": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" }, "uniqueItems": { "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" }, "enum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" }, "jsonReference": { "type": "object", "required": [ "$ref" ], "additionalProperties": false, "properties": { "$ref": { "type": "string" } } } } } python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/v3.0.0/000077500000000000000000000000001451222636700324515ustar00rootroot00000000000000schema.json000066400000000000000000001105331451222636700345300ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/v3.0.0{ "title": "A JSON Schema for OpenAPI 3.0.", "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "description": "This is the root document object of the OpenAPI definition file.", "required": [ "openapi", "info", "paths" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "openapi": { "type": "string" }, "info": { "$ref": "#/definitions/info" }, "servers": { "type": "array", "items": { "$ref": "#/definitions/server" }, "uniqueItems": true }, "paths": { "$ref": "#/definitions/paths" }, "components": { "$ref": "#/definitions/components" }, "security": { "type": "array", "items": { "$ref": "#/definitions/securityRequirement" }, "uniqueItems": true }, "tags": { "type": "array", "items": { "$ref": "#/definitions/tag" }, "uniqueItems": true }, "externalDocs": { "$ref": "#/definitions/externalDocs" } }, "definitions": { "info": { "type": "object", "description": "The object provides metadata about the API. The metadata can be used by the clients if needed, and can be presented in editing or documentation generation tools for convenience.", "required": [ "title", "version" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "termsOfService": { "type": "string" }, "contact": { "$ref": "#/definitions/contact" }, "license": { "$ref": "#/definitions/license" }, "version": { "type": "string" } } }, "contact": { "type": "object", "description": "Contact information for the exposed API.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "name": { "type": "string" }, "url": { "type": "string" }, "email": { "type": "string" } } }, "license": { "type": "object", "description": "License information for the exposed API.", "required": [ "name" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "name": { "type": "string" }, "url": { "type": "string" } } }, "server": { "type": "object", "description": "An object representing a Server.", "required": [ "url" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "url": { "type": "string" }, "description": { "type": "string" }, "variables": { "$ref": "#/definitions/serverVariables" } } }, "serverVariable": { "type": "object", "description": "An object representing a Server Variable for server URL template substitution.", "required": [ "default" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "enum": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }, "default": { "type": "string" }, "description": { "type": "string" } } }, "components": { "type": "object", "description": "Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "schemas": { "$ref": "#/definitions/schemasOrReferences" }, "responses": { "$ref": "#/definitions/responsesOrReferences" }, "parameters": { "$ref": "#/definitions/parametersOrReferences" }, "examples": { "$ref": "#/definitions/examplesOrReferences" }, "requestBodies": { "$ref": "#/definitions/requestBodiesOrReferences" }, "headers": { "$ref": "#/definitions/headersOrReferences" }, "securitySchemes": { "$ref": "#/definitions/securitySchemesOrReferences" }, "links": { "$ref": "#/definitions/linksOrReferences" }, "callbacks": { "$ref": "#/definitions/callbacksOrReferences" } } }, "paths": { "type": "object", "description": "Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL. The Paths MAY be empty, due to ACL constraints.", "additionalProperties": false, "patternProperties": { "^/": { "$ref": "#/definitions/pathItem" }, "^x-": { "$ref": "#/definitions/specificationExtension" } } }, "pathItem": { "type": "object", "description": "Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "$ref": { "type": "string" }, "summary": { "type": "string" }, "description": { "type": "string" }, "get": { "$ref": "#/definitions/operation" }, "put": { "$ref": "#/definitions/operation" }, "post": { "$ref": "#/definitions/operation" }, "delete": { "$ref": "#/definitions/operation" }, "options": { "$ref": "#/definitions/operation" }, "head": { "$ref": "#/definitions/operation" }, "patch": { "$ref": "#/definitions/operation" }, "trace": { "$ref": "#/definitions/operation" }, "servers": { "type": "array", "items": { "$ref": "#/definitions/server" }, "uniqueItems": true }, "parameters": { "type": "array", "items": { "$ref": "#/definitions/parameterOrReference" }, "uniqueItems": true } } }, "operation": { "type": "object", "description": "Describes a single API operation on a path.", "required": [ "responses" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "tags": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }, "summary": { "type": "string" }, "description": { "type": "string" }, "externalDocs": { "$ref": "#/definitions/externalDocs" }, "operationId": { "type": "string" }, "parameters": { "type": "array", "items": { "$ref": "#/definitions/parameterOrReference" }, "uniqueItems": true }, "requestBody": { "$ref": "#/definitions/requestBodyOrReference" }, "responses": { "$ref": "#/definitions/responses" }, "callbacks": { "$ref": "#/definitions/callbacksOrReferences" }, "deprecated": { "type": "boolean" }, "security": { "type": "array", "items": { "$ref": "#/definitions/securityRequirement" }, "uniqueItems": true }, "servers": { "type": "array", "items": { "$ref": "#/definitions/server" }, "uniqueItems": true } } }, "externalDocs": { "type": "object", "description": "Allows referencing an external resource for extended documentation.", "required": [ "url" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "description": { "type": "string" }, "url": { "type": "string" } } }, "parameter": { "type": "object", "description": "Describes a single operation parameter. A unique parameter is defined by a combination of a name and location.", "required": [ "name", "in" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "name": { "type": "string" }, "in": { "type": "string" }, "description": { "type": "string" }, "required": { "type": "boolean" }, "deprecated": { "type": "boolean" }, "allowEmptyValue": { "type": "boolean" }, "style": { "type": "string" }, "explode": { "type": "boolean" }, "allowReserved": { "type": "boolean" }, "schema": { "$ref": "#/definitions/schemaOrReference" }, "example": { "$ref": "#/definitions/any" }, "examples": { "$ref": "#/definitions/examplesOrReferences" }, "content": { "$ref": "#/definitions/mediaTypes" } }, "oneOf": [ { "required": [ "schema" ] }, { "required": [ "content" ] } ] }, "requestBody": { "type": "object", "description": "Describes a single request body.", "required": [ "content" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "description": { "type": "string" }, "content": { "$ref": "#/definitions/mediaTypes" }, "required": { "type": "boolean" } } }, "mediaType": { "type": "object", "description": "Each Media Type Object provides schema and examples for the media type identified by its key.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "schema": { "$ref": "#/definitions/schemaOrReference" }, "example": { "$ref": "#/definitions/any" }, "examples": { "$ref": "#/definitions/examplesOrReferences" }, "encoding": { "$ref": "#/definitions/encodings" } } }, "encoding": { "type": "object", "description": "A single encoding definition applied to a single schema property.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "contentType": { "type": "string" }, "headers": { "$ref": "#/definitions/headers" }, "style": { "type": "string" }, "explode": { "type": "boolean" }, "allowReserved": { "type": "boolean" } } }, "responses": { "type": "object", "description": "A container for the expected responses of an operation. The container maps a HTTP response code to the expected response. The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors. The `default` MAY be used as a default response object for all HTTP codes that are not covered individually by the specification. The `Responses Object` MUST contain at least one response code, and it SHOULD be the response for a successful operation call.", "additionalProperties": false, "patternProperties": { "^([0-9X]{3})$": { "$ref": "#/definitions/responseOrReference" }, "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "default": { "$ref": "#/definitions/responseOrReference" } } }, "response": { "type": "object", "description": "Describes a single response from an API Operation, including design-time, static `links` to operations based on the response.", "required": [ "description" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "description": { "type": "string" }, "headers": { "$ref": "#/definitions/headersOrReferences" }, "content": { "$ref": "#/definitions/mediaTypes" }, "links": { "$ref": "#/definitions/linksOrReferences" } } }, "callback": { "type": "object", "description": "A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.", "additionalProperties": false, "patternProperties": { "^": { "$ref": "#/definitions/pathItem" }, "^x-": { "$ref": "#/definitions/specificationExtension" } } }, "example": { "type": "object", "description": "", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "summary": { "type": "string" }, "description": { "type": "string" }, "value": { "$ref": "#/definitions/any" }, "externalValue": { "type": "string" } } }, "link": { "type": "object", "description": "The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations. Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response. For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "operationRef": { "type": "string" }, "operationId": { "type": "string" }, "parameters": { "$ref": "#/definitions/anysOrExpressions" }, "requestBody": { "$ref": "#/definitions/anyOrExpression" }, "description": { "type": "string" }, "server": { "$ref": "#/definitions/server" } } }, "header": { "type": "object", "description": "The Header Object follows the structure of the Parameter Object with the following changes: 1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "description": { "type": "string" }, "required": { "type": "boolean" }, "deprecated": { "type": "boolean" }, "allowEmptyValue": { "type": "boolean" }, "style": { "type": "string" }, "explode": { "type": "boolean" }, "allowReserved": { "type": "boolean" }, "schema": { "$ref": "#/definitions/schemaOrReference" }, "example": { "$ref": "#/definitions/any" }, "examples": { "$ref": "#/definitions/examplesOrReferences" }, "content": { "$ref": "#/definitions/mediaTypes" } }, "oneOf": [ { "required": [ "schema" ] }, { "required": [ "content" ] } ] }, "tag": { "type": "object", "description": "Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.", "required": [ "name" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "externalDocs": { "$ref": "#/definitions/externalDocs" } } }, "examples": { "type": "object", "description": "", "additionalProperties": false }, "reference": { "type": "object", "description": "A simple object to allow referencing other components in the specification, internally and externally. The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules. For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.", "required": [ "$ref" ], "additionalProperties": false, "properties": { "$ref": { "type": "string" } } }, "schema": { "type": "object", "description": "The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00. For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "nullable": { "type": "boolean" }, "discriminator": { "$ref": "#/definitions/discriminator" }, "readOnly": { "type": "boolean" }, "writeOnly": { "type": "boolean" }, "xml": { "$ref": "#/definitions/xml" }, "externalDocs": { "$ref": "#/definitions/externalDocs" }, "example": { "$ref": "#/definitions/any" }, "deprecated": { "type": "boolean" }, "title": { "$ref": "http://json-schema.org/draft-04/schema#/properties/title" }, "multipleOf": { "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" }, "maximum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" }, "exclusiveMaximum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" }, "minimum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" }, "exclusiveMinimum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" }, "maxLength": { "$ref": "http://json-schema.org/draft-04/schema#/properties/maxLength" }, "minLength": { "$ref": "http://json-schema.org/draft-04/schema#/properties/minLength" }, "pattern": { "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" }, "maxItems": { "$ref": "http://json-schema.org/draft-04/schema#/properties/maxItems" }, "minItems": { "$ref": "http://json-schema.org/draft-04/schema#/properties/minItems" }, "uniqueItems": { "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" }, "maxProperties": { "$ref": "http://json-schema.org/draft-04/schema#/properties/maxProperties" }, "minProperties": { "$ref": "http://json-schema.org/draft-04/schema#/properties/minProperties" }, "required": { "$ref": "http://json-schema.org/draft-04/schema#/properties/required" }, "enum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" }, "type": { "type": "string" }, "allOf": { "type": "array", "items": { "$ref": "#/definitions/schemaOrReference" }, "minItems": 1 }, "oneOf": { "type": "array", "items": { "$ref": "#/definitions/schemaOrReference" }, "minItems": 1 }, "anyOf": { "type": "array", "items": { "$ref": "#/definitions/schemaOrReference" }, "minItems": 1 }, "not": { "$ref": "#/definitions/schema" }, "items": { "anyOf": [ { "$ref": "#/definitions/schemaOrReference" }, { "type": "array", "items": { "$ref": "#/definitions/schemaOrReference" }, "minItems": 1 } ] }, "properties": { "type": "object", "additionalProperties": { "$ref": "#/definitions/schemaOrReference" } }, "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/schemaOrReference" }, { "type": "boolean" } ] }, "default": { "$ref": "#/definitions/defaultType" }, "description": { "type": "string" }, "format": { "type": "string" } } }, "discriminator": { "type": "object", "description": "When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it. When using the discriminator, _inline_ schemas will not be considered.", "required": [ "propertyName" ], "additionalProperties": false, "properties": { "propertyName": { "type": "string" }, "mapping": { "$ref": "#/definitions/strings" } } }, "xml": { "type": "object", "description": "A metadata object that allows for more fine-tuned XML model definitions. When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "name": { "type": "string" }, "namespace": { "type": "string" }, "prefix": { "type": "string" }, "attribute": { "type": "boolean" }, "wrapped": { "type": "boolean" } } }, "securityScheme": { "type": "object", "description": "Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header or as a query parameter) and OAuth2's common flows (implicit, password, application and access code).", "required": [ "type" ], "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "type": { "type": "string" }, "description": { "type": "string" }, "name": { "type": "string" }, "in": { "type": "string" }, "scheme": { "type": "string" }, "bearerFormat": { "type": "string" }, "flows": { "$ref": "#/definitions/oauthFlows" }, "openIdConnectUrl": { "type": "string" } } }, "oauthFlows": { "type": "object", "description": "Allows configuration of the supported OAuth Flows.", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "implicit": { "$ref": "#/definitions/oauthFlow" }, "password": { "$ref": "#/definitions/oauthFlow" }, "clientCredentials": { "$ref": "#/definitions/oauthFlow" }, "authorizationCode": { "$ref": "#/definitions/oauthFlow" } } }, "oauthFlow": { "type": "object", "description": "Configuration details for a supported OAuth Flow", "additionalProperties": false, "patternProperties": { "^x-": { "$ref": "#/definitions/specificationExtension" } }, "properties": { "authorizationUrl": { "type": "string" }, "tokenUrl": { "type": "string" }, "refreshUrl": { "type": "string" }, "scopes": { "$ref": "#/definitions/strings" } } }, "securityRequirement": { "type": "object", "description": "Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object. Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information. When a list of Security Requirement Objects is defined on the Open API object or Operation Object, only one of Security Requirement Objects in the list needs to be satisfied to authorize the request.", "additionalProperties": false, "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "type": "array", "items": { "type": "string" }, "uniqueItems": true } } }, "anyOrExpression": { "oneOf": [ { "$ref": "#/definitions/any" }, { "$ref": "#/definitions/expression" } ] }, "callbackOrReference": { "oneOf": [ { "$ref": "#/definitions/callback" }, { "$ref": "#/definitions/reference" } ] }, "exampleOrReference": { "oneOf": [ { "$ref": "#/definitions/example" }, { "$ref": "#/definitions/reference" } ] }, "headerOrReference": { "oneOf": [ { "$ref": "#/definitions/header" }, { "$ref": "#/definitions/reference" } ] }, "linkOrReference": { "oneOf": [ { "$ref": "#/definitions/link" }, { "$ref": "#/definitions/reference" } ] }, "parameterOrReference": { "oneOf": [ { "$ref": "#/definitions/parameter" }, { "$ref": "#/definitions/reference" } ] }, "requestBodyOrReference": { "oneOf": [ { "$ref": "#/definitions/requestBody" }, { "$ref": "#/definitions/reference" } ] }, "responseOrReference": { "oneOf": [ { "$ref": "#/definitions/response" }, { "$ref": "#/definitions/reference" } ] }, "schemaOrReference": { "oneOf": [ { "$ref": "#/definitions/schema" }, { "$ref": "#/definitions/reference" } ] }, "securitySchemeOrReference": { "oneOf": [ { "$ref": "#/definitions/securityScheme" }, { "$ref": "#/definitions/reference" } ] }, "anysOrExpressions": { "type": "object", "additionalProperties": { "$ref": "#/definitions/anyOrExpression" } }, "callbacksOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/callbackOrReference" } }, "encodings": { "type": "object", "additionalProperties": { "$ref": "#/definitions/encoding" } }, "examplesOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/exampleOrReference" } }, "headers": { "type": "object", "additionalProperties": { "$ref": "#/definitions/header" } }, "headersOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/headerOrReference" } }, "linksOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/linkOrReference" } }, "mediaTypes": { "type": "object", "additionalProperties": { "$ref": "#/definitions/mediaType" } }, "parametersOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/parameterOrReference" } }, "requestBodiesOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/requestBodyOrReference" } }, "responsesOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/responseOrReference" } }, "schemasOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/schemaOrReference" } }, "securitySchemesOrReferences": { "type": "object", "additionalProperties": { "$ref": "#/definitions/securitySchemeOrReference" } }, "serverVariables": { "type": "object", "additionalProperties": { "$ref": "#/definitions/serverVariable" } }, "strings": { "type": "object", "additionalProperties": { "type": "string" } }, "object": { "type": "object", "additionalProperties": true }, "any": { "additionalProperties": true }, "expression": { "type": "object", "additionalProperties": true }, "specificationExtension": { "description": "Any property starting with x- is valid.", "oneOf": [ { "type": "null" }, { "type": "number" }, { "type": "boolean" }, { "type": "string" }, { "type": "object" }, { "type": "array" } ] }, "defaultType": { "oneOf": [ { "type": "null" }, { "type": "array" }, { "type": "object" }, { "type": "number" }, { "type": "boolean" }, { "type": "string" } ] } } } python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/v3.0/000077500000000000000000000000001451222636700323135ustar00rootroot00000000000000schema.json000066400000000000000000001057501451222636700343770ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/v3.0{ "id": "https://spec.openapis.org/oas/3.0/schema/2021-09-28", "$schema": "http://json-schema.org/draft-04/schema#", "description": "The description of OpenAPI v3.0.x documents, as defined by https://spec.openapis.org/oas/v3.0.3", "type": "object", "required": [ "openapi", "info", "paths" ], "properties": { "openapi": { "type": "string", "pattern": "^3\\.0\\.\\d(-.+)?$" }, "info": { "$ref": "#/definitions/Info" }, "externalDocs": { "$ref": "#/definitions/ExternalDocumentation" }, "servers": { "type": "array", "items": { "$ref": "#/definitions/Server" } }, "security": { "type": "array", "items": { "$ref": "#/definitions/SecurityRequirement" } }, "tags": { "type": "array", "items": { "$ref": "#/definitions/Tag" }, "uniqueItems": true }, "paths": { "$ref": "#/definitions/Paths" }, "components": { "$ref": "#/definitions/Components" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false, "definitions": { "Reference": { "type": "object", "required": [ "$ref" ], "patternProperties": { "^\\$ref$": { "type": "string", "format": "uri-reference" } } }, "Info": { "type": "object", "required": [ "title", "version" ], "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "termsOfService": { "type": "string", "format": "uri-reference" }, "contact": { "$ref": "#/definitions/Contact" }, "license": { "$ref": "#/definitions/License" }, "version": { "type": "string" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Contact": { "type": "object", "properties": { "name": { "type": "string" }, "url": { "type": "string", "format": "uri-reference" }, "email": { "type": "string", "format": "email" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "License": { "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string" }, "url": { "type": "string", "format": "uri-reference" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Server": { "type": "object", "required": [ "url" ], "properties": { "url": { "type": "string" }, "description": { "type": "string" }, "variables": { "type": "object", "additionalProperties": { "$ref": "#/definitions/ServerVariable" } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "ServerVariable": { "type": "object", "required": [ "default" ], "properties": { "enum": { "type": "array", "items": { "type": "string" } }, "default": { "type": "string" }, "description": { "type": "string" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Components": { "type": "object", "properties": { "schemas": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] } } }, "responses": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Reference" }, { "$ref": "#/definitions/Response" } ] } } }, "parameters": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Reference" }, { "$ref": "#/definitions/Parameter" } ] } } }, "examples": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Reference" }, { "$ref": "#/definitions/Example" } ] } } }, "requestBodies": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Reference" }, { "$ref": "#/definitions/RequestBody" } ] } } }, "headers": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Reference" }, { "$ref": "#/definitions/Header" } ] } } }, "securitySchemes": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Reference" }, { "$ref": "#/definitions/SecurityScheme" } ] } } }, "links": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Reference" }, { "$ref": "#/definitions/Link" } ] } } }, "callbacks": { "type": "object", "patternProperties": { "^[a-zA-Z0-9\\.\\-_]+$": { "oneOf": [ { "$ref": "#/definitions/Reference" }, { "$ref": "#/definitions/Callback" } ] } } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Schema": { "type": "object", "properties": { "title": { "type": "string" }, "multipleOf": { "type": "number", "minimum": 0, "exclusiveMinimum": true }, "maximum": { "type": "number" }, "exclusiveMaximum": { "type": "boolean", "default": false }, "minimum": { "type": "number" }, "exclusiveMinimum": { "type": "boolean", "default": false }, "maxLength": { "type": "integer", "minimum": 0 }, "minLength": { "type": "integer", "minimum": 0, "default": 0 }, "pattern": { "type": "string", "format": "regex" }, "maxItems": { "type": "integer", "minimum": 0 }, "minItems": { "type": "integer", "minimum": 0, "default": 0 }, "uniqueItems": { "type": "boolean", "default": false }, "maxProperties": { "type": "integer", "minimum": 0 }, "minProperties": { "type": "integer", "minimum": 0, "default": 0 }, "required": { "type": "array", "items": { "type": "string" }, "minItems": 1, "uniqueItems": true }, "enum": { "type": "array", "items": { }, "minItems": 1, "uniqueItems": false }, "type": { "type": "string", "enum": [ "array", "boolean", "integer", "number", "object", "string" ] }, "not": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] }, "allOf": { "type": "array", "items": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] } }, "oneOf": { "type": "array", "items": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] } }, "anyOf": { "type": "array", "items": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] } }, "items": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] }, "properties": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] } }, "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" }, { "type": "boolean" } ], "default": true }, "description": { "type": "string" }, "format": { "type": "string" }, "default": { }, "nullable": { "type": "boolean", "default": false }, "discriminator": { "$ref": "#/definitions/Discriminator" }, "readOnly": { "type": "boolean", "default": false }, "writeOnly": { "type": "boolean", "default": false }, "example": { }, "externalDocs": { "$ref": "#/definitions/ExternalDocumentation" }, "deprecated": { "type": "boolean", "default": false }, "xml": { "$ref": "#/definitions/XML" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Discriminator": { "type": "object", "required": [ "propertyName" ], "properties": { "propertyName": { "type": "string" }, "mapping": { "type": "object", "additionalProperties": { "type": "string" } } } }, "XML": { "type": "object", "properties": { "name": { "type": "string" }, "namespace": { "type": "string", "format": "uri" }, "prefix": { "type": "string" }, "attribute": { "type": "boolean", "default": false }, "wrapped": { "type": "boolean", "default": false } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Response": { "type": "object", "required": [ "description" ], "properties": { "description": { "type": "string" }, "headers": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Header" }, { "$ref": "#/definitions/Reference" } ] } }, "content": { "type": "object", "additionalProperties": { "$ref": "#/definitions/MediaType" } }, "links": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Link" }, { "$ref": "#/definitions/Reference" } ] } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "MediaType": { "type": "object", "properties": { "schema": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] }, "example": { }, "examples": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Example" }, { "$ref": "#/definitions/Reference" } ] } }, "encoding": { "type": "object", "additionalProperties": { "$ref": "#/definitions/Encoding" } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false, "allOf": [ { "$ref": "#/definitions/ExampleXORExamples" } ] }, "Example": { "type": "object", "properties": { "summary": { "type": "string" }, "description": { "type": "string" }, "value": { }, "externalValue": { "type": "string", "format": "uri-reference" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Header": { "type": "object", "properties": { "description": { "type": "string" }, "required": { "type": "boolean", "default": false }, "deprecated": { "type": "boolean", "default": false }, "allowEmptyValue": { "type": "boolean", "default": false }, "style": { "type": "string", "enum": [ "simple" ], "default": "simple" }, "explode": { "type": "boolean" }, "allowReserved": { "type": "boolean", "default": false }, "schema": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] }, "content": { "type": "object", "additionalProperties": { "$ref": "#/definitions/MediaType" }, "minProperties": 1, "maxProperties": 1 }, "example": { }, "examples": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Example" }, { "$ref": "#/definitions/Reference" } ] } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false, "allOf": [ { "$ref": "#/definitions/ExampleXORExamples" }, { "$ref": "#/definitions/SchemaXORContent" } ] }, "Paths": { "type": "object", "patternProperties": { "^\\/": { "$ref": "#/definitions/PathItem" }, "^x-": { } }, "additionalProperties": false }, "PathItem": { "type": "object", "properties": { "$ref": { "type": "string" }, "summary": { "type": "string" }, "description": { "type": "string" }, "servers": { "type": "array", "items": { "$ref": "#/definitions/Server" } }, "parameters": { "type": "array", "items": { "oneOf": [ { "$ref": "#/definitions/Parameter" }, { "$ref": "#/definitions/Reference" } ] }, "uniqueItems": true } }, "patternProperties": { "^(get|put|post|delete|options|head|patch|trace)$": { "$ref": "#/definitions/Operation" }, "^x-": { } }, "additionalProperties": false }, "Operation": { "type": "object", "required": [ "responses" ], "properties": { "tags": { "type": "array", "items": { "type": "string" } }, "summary": { "type": "string" }, "description": { "type": "string" }, "externalDocs": { "$ref": "#/definitions/ExternalDocumentation" }, "operationId": { "type": "string" }, "parameters": { "type": "array", "items": { "oneOf": [ { "$ref": "#/definitions/Parameter" }, { "$ref": "#/definitions/Reference" } ] }, "uniqueItems": true }, "requestBody": { "oneOf": [ { "$ref": "#/definitions/RequestBody" }, { "$ref": "#/definitions/Reference" } ] }, "responses": { "$ref": "#/definitions/Responses" }, "callbacks": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Callback" }, { "$ref": "#/definitions/Reference" } ] } }, "deprecated": { "type": "boolean", "default": false }, "security": { "type": "array", "items": { "$ref": "#/definitions/SecurityRequirement" } }, "servers": { "type": "array", "items": { "$ref": "#/definitions/Server" } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Responses": { "type": "object", "properties": { "default": { "oneOf": [ { "$ref": "#/definitions/Response" }, { "$ref": "#/definitions/Reference" } ] } }, "patternProperties": { "^[1-5](?:\\d{2}|XX)$": { "oneOf": [ { "$ref": "#/definitions/Response" }, { "$ref": "#/definitions/Reference" } ] }, "^x-": { } }, "minProperties": 1, "additionalProperties": false }, "SecurityRequirement": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } } }, "Tag": { "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "externalDocs": { "$ref": "#/definitions/ExternalDocumentation" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "ExternalDocumentation": { "type": "object", "required": [ "url" ], "properties": { "description": { "type": "string" }, "url": { "type": "string", "format": "uri-reference" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "ExampleXORExamples": { "description": "Example and examples are mutually exclusive", "not": { "required": [ "example", "examples" ] } }, "SchemaXORContent": { "description": "Schema and content are mutually exclusive, at least one is required", "not": { "required": [ "schema", "content" ] }, "oneOf": [ { "required": [ "schema" ] }, { "required": [ "content" ], "description": "Some properties are not allowed if content is present", "allOf": [ { "not": { "required": [ "style" ] } }, { "not": { "required": [ "explode" ] } }, { "not": { "required": [ "allowReserved" ] } }, { "not": { "required": [ "example" ] } }, { "not": { "required": [ "examples" ] } } ] } ] }, "Parameter": { "type": "object", "properties": { "name": { "type": "string" }, "in": { "type": "string" }, "description": { "type": "string" }, "required": { "type": "boolean", "default": false }, "deprecated": { "type": "boolean", "default": false }, "allowEmptyValue": { "type": "boolean", "default": false }, "style": { "type": "string" }, "explode": { "type": "boolean" }, "allowReserved": { "type": "boolean", "default": false }, "schema": { "oneOf": [ { "$ref": "#/definitions/Schema" }, { "$ref": "#/definitions/Reference" } ] }, "content": { "type": "object", "additionalProperties": { "$ref": "#/definitions/MediaType" }, "minProperties": 1, "maxProperties": 1 }, "example": { }, "examples": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Example" }, { "$ref": "#/definitions/Reference" } ] } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false, "required": [ "name", "in" ], "allOf": [ { "$ref": "#/definitions/ExampleXORExamples" }, { "$ref": "#/definitions/SchemaXORContent" }, { "$ref": "#/definitions/ParameterLocation" } ] }, "ParameterLocation": { "description": "Parameter location", "oneOf": [ { "description": "Parameter in path", "required": [ "required" ], "properties": { "in": { "enum": [ "path" ] }, "style": { "enum": [ "matrix", "label", "simple" ], "default": "simple" }, "required": { "enum": [ true ] } } }, { "description": "Parameter in query", "properties": { "in": { "enum": [ "query" ] }, "style": { "enum": [ "form", "spaceDelimited", "pipeDelimited", "deepObject" ], "default": "form" } } }, { "description": "Parameter in header", "properties": { "in": { "enum": [ "header" ] }, "style": { "enum": [ "simple" ], "default": "simple" } } }, { "description": "Parameter in cookie", "properties": { "in": { "enum": [ "cookie" ] }, "style": { "enum": [ "form" ], "default": "form" } } } ] }, "RequestBody": { "type": "object", "required": [ "content" ], "properties": { "description": { "type": "string" }, "content": { "type": "object", "additionalProperties": { "$ref": "#/definitions/MediaType" } }, "required": { "type": "boolean", "default": false } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "SecurityScheme": { "oneOf": [ { "$ref": "#/definitions/APIKeySecurityScheme" }, { "$ref": "#/definitions/HTTPSecurityScheme" }, { "$ref": "#/definitions/OAuth2SecurityScheme" }, { "$ref": "#/definitions/OpenIdConnectSecurityScheme" } ] }, "APIKeySecurityScheme": { "type": "object", "required": [ "type", "name", "in" ], "properties": { "type": { "type": "string", "enum": [ "apiKey" ] }, "name": { "type": "string" }, "in": { "type": "string", "enum": [ "header", "query", "cookie" ] }, "description": { "type": "string" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "HTTPSecurityScheme": { "type": "object", "required": [ "scheme", "type" ], "properties": { "scheme": { "type": "string" }, "bearerFormat": { "type": "string" }, "description": { "type": "string" }, "type": { "type": "string", "enum": [ "http" ] } }, "patternProperties": { "^x-": { } }, "additionalProperties": false, "oneOf": [ { "description": "Bearer", "properties": { "scheme": { "type": "string", "pattern": "^[Bb][Ee][Aa][Rr][Ee][Rr]$" } } }, { "description": "Non Bearer", "not": { "required": [ "bearerFormat" ] }, "properties": { "scheme": { "not": { "type": "string", "pattern": "^[Bb][Ee][Aa][Rr][Ee][Rr]$" } } } } ] }, "OAuth2SecurityScheme": { "type": "object", "required": [ "type", "flows" ], "properties": { "type": { "type": "string", "enum": [ "oauth2" ] }, "flows": { "$ref": "#/definitions/OAuthFlows" }, "description": { "type": "string" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "OpenIdConnectSecurityScheme": { "type": "object", "required": [ "type", "openIdConnectUrl" ], "properties": { "type": { "type": "string", "enum": [ "openIdConnect" ] }, "openIdConnectUrl": { "type": "string", "format": "uri-reference" }, "description": { "type": "string" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "OAuthFlows": { "type": "object", "properties": { "implicit": { "$ref": "#/definitions/ImplicitOAuthFlow" }, "password": { "$ref": "#/definitions/PasswordOAuthFlow" }, "clientCredentials": { "$ref": "#/definitions/ClientCredentialsFlow" }, "authorizationCode": { "$ref": "#/definitions/AuthorizationCodeOAuthFlow" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "ImplicitOAuthFlow": { "type": "object", "required": [ "authorizationUrl", "scopes" ], "properties": { "authorizationUrl": { "type": "string", "format": "uri-reference" }, "refreshUrl": { "type": "string", "format": "uri-reference" }, "scopes": { "type": "object", "additionalProperties": { "type": "string" } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "PasswordOAuthFlow": { "type": "object", "required": [ "tokenUrl", "scopes" ], "properties": { "tokenUrl": { "type": "string", "format": "uri-reference" }, "refreshUrl": { "type": "string", "format": "uri-reference" }, "scopes": { "type": "object", "additionalProperties": { "type": "string" } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "ClientCredentialsFlow": { "type": "object", "required": [ "tokenUrl", "scopes" ], "properties": { "tokenUrl": { "type": "string", "format": "uri-reference" }, "refreshUrl": { "type": "string", "format": "uri-reference" }, "scopes": { "type": "object", "additionalProperties": { "type": "string" } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "AuthorizationCodeOAuthFlow": { "type": "object", "required": [ "authorizationUrl", "tokenUrl", "scopes" ], "properties": { "authorizationUrl": { "type": "string", "format": "uri-reference" }, "tokenUrl": { "type": "string", "format": "uri-reference" }, "refreshUrl": { "type": "string", "format": "uri-reference" }, "scopes": { "type": "object", "additionalProperties": { "type": "string" } } }, "patternProperties": { "^x-": { } }, "additionalProperties": false }, "Link": { "type": "object", "properties": { "operationId": { "type": "string" }, "operationRef": { "type": "string", "format": "uri-reference" }, "parameters": { "type": "object", "additionalProperties": { } }, "requestBody": { }, "description": { "type": "string" }, "server": { "$ref": "#/definitions/Server" } }, "patternProperties": { "^x-": { } }, "additionalProperties": false, "not": { "description": "Operation Id and Operation Ref are mutually exclusive", "required": [ "operationId", "operationRef" ] } }, "Callback": { "type": "object", "additionalProperties": { "$ref": "#/definitions/PathItem" }, "patternProperties": { "^x-": { } } }, "Encoding": { "type": "object", "properties": { "contentType": { "type": "string" }, "headers": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/Header" }, { "$ref": "#/definitions/Reference" } ] } }, "style": { "type": "string", "enum": [ "form", "spaceDelimited", "pipeDelimited", "deepObject" ] }, "explode": { "type": "boolean" }, "allowReserved": { "type": "boolean", "default": false } }, "patternProperties": { "^x-": { } }, "additionalProperties": false } } }python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/v3.1/000077500000000000000000000000001451222636700323145ustar00rootroot00000000000000schema.json000066400000000000000000001027241451222636700343760ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/resources/schemas/v3.1{ "$id": "https://spec.openapis.org/oas/3.1/schema/2022-10-07", "$schema": "https://json-schema.org/draft/2020-12/schema", "description": "The description of OpenAPI v3.1.x documents without schema validation, as defined by https://spec.openapis.org/oas/v3.1.0", "type": "object", "properties": { "openapi": { "type": "string", "pattern": "^3\\.1\\.\\d+(-.+)?$" }, "info": { "$ref": "#/$defs/info" }, "jsonSchemaDialect": { "type": "string", "format": "uri", "default": "https://spec.openapis.org/oas/3.1/dialect/base" }, "servers": { "type": "array", "items": { "$ref": "#/$defs/server" }, "default": [ { "url": "/" } ] }, "paths": { "$ref": "#/$defs/paths" }, "webhooks": { "type": "object", "additionalProperties": { "$ref": "#/$defs/path-item-or-reference" } }, "components": { "$ref": "#/$defs/components" }, "security": { "type": "array", "items": { "$ref": "#/$defs/security-requirement" } }, "tags": { "type": "array", "items": { "$ref": "#/$defs/tag" } }, "externalDocs": { "$ref": "#/$defs/external-documentation" } }, "required": [ "openapi", "info" ], "anyOf": [ { "required": [ "paths" ] }, { "required": [ "components" ] }, { "required": [ "webhooks" ] } ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false, "$defs": { "info": { "$comment": "https://spec.openapis.org/oas/v3.1.0#info-object", "type": "object", "properties": { "title": { "type": "string" }, "summary": { "type": "string" }, "description": { "type": "string" }, "termsOfService": { "type": "string", "format": "uri" }, "contact": { "$ref": "#/$defs/contact" }, "license": { "$ref": "#/$defs/license" }, "version": { "type": "string" } }, "required": [ "title", "version" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "contact": { "$comment": "https://spec.openapis.org/oas/v3.1.0#contact-object", "type": "object", "properties": { "name": { "type": "string" }, "url": { "type": "string", "format": "uri" }, "email": { "type": "string", "format": "email" } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "license": { "$comment": "https://spec.openapis.org/oas/v3.1.0#license-object", "type": "object", "properties": { "name": { "type": "string" }, "identifier": { "type": "string" }, "url": { "type": "string", "format": "uri" } }, "required": [ "name" ], "dependentSchemas": { "identifier": { "not": { "required": [ "url" ] } } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "server": { "$comment": "https://spec.openapis.org/oas/v3.1.0#server-object", "type": "object", "properties": { "url": { "type": "string", "format": "uri-reference" }, "description": { "type": "string" }, "variables": { "type": "object", "additionalProperties": { "$ref": "#/$defs/server-variable" } } }, "required": [ "url" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "server-variable": { "$comment": "https://spec.openapis.org/oas/v3.1.0#server-variable-object", "type": "object", "properties": { "enum": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "default": { "type": "string" }, "description": { "type": "string" } }, "required": [ "default" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "components": { "$comment": "https://spec.openapis.org/oas/v3.1.0#components-object", "type": "object", "properties": { "schemas": { "type": "object", "additionalProperties": { "$dynamicRef": "#meta" } }, "responses": { "type": "object", "additionalProperties": { "$ref": "#/$defs/response-or-reference" } }, "parameters": { "type": "object", "additionalProperties": { "$ref": "#/$defs/parameter-or-reference" } }, "examples": { "type": "object", "additionalProperties": { "$ref": "#/$defs/example-or-reference" } }, "requestBodies": { "type": "object", "additionalProperties": { "$ref": "#/$defs/request-body-or-reference" } }, "headers": { "type": "object", "additionalProperties": { "$ref": "#/$defs/header-or-reference" } }, "securitySchemes": { "type": "object", "additionalProperties": { "$ref": "#/$defs/security-scheme-or-reference" } }, "links": { "type": "object", "additionalProperties": { "$ref": "#/$defs/link-or-reference" } }, "callbacks": { "type": "object", "additionalProperties": { "$ref": "#/$defs/callbacks-or-reference" } }, "pathItems": { "type": "object", "additionalProperties": { "$ref": "#/$defs/path-item-or-reference" } } }, "patternProperties": { "^(schemas|responses|parameters|examples|requestBodies|headers|securitySchemes|links|callbacks|pathItems)$": { "$comment": "Enumerating all of the property names in the regex above is necessary for unevaluatedProperties to work as expected", "propertyNames": { "pattern": "^[a-zA-Z0-9._-]+$" } } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "paths": { "$comment": "https://spec.openapis.org/oas/v3.1.0#paths-object", "type": "object", "patternProperties": { "^/": { "$ref": "#/$defs/path-item-or-reference" } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "path-item": { "$comment": "https://spec.openapis.org/oas/v3.1.0#path-item-object", "type": "object", "properties": { "summary": { "type": "string" }, "description": { "type": "string" }, "servers": { "type": "array", "items": { "$ref": "#/$defs/server" } }, "parameters": { "type": "array", "items": { "$ref": "#/$defs/parameter-or-reference" } }, "get": { "$ref": "#/$defs/operation" }, "put": { "$ref": "#/$defs/operation" }, "post": { "$ref": "#/$defs/operation" }, "delete": { "$ref": "#/$defs/operation" }, "options": { "$ref": "#/$defs/operation" }, "head": { "$ref": "#/$defs/operation" }, "patch": { "$ref": "#/$defs/operation" }, "trace": { "$ref": "#/$defs/operation" } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "path-item-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/path-item" } }, "operation": { "$comment": "https://spec.openapis.org/oas/v3.1.0#operation-object", "type": "object", "properties": { "tags": { "type": "array", "items": { "type": "string" } }, "summary": { "type": "string" }, "description": { "type": "string" }, "externalDocs": { "$ref": "#/$defs/external-documentation" }, "operationId": { "type": "string" }, "parameters": { "type": "array", "items": { "$ref": "#/$defs/parameter-or-reference" } }, "requestBody": { "$ref": "#/$defs/request-body-or-reference" }, "responses": { "$ref": "#/$defs/responses" }, "callbacks": { "type": "object", "additionalProperties": { "$ref": "#/$defs/callbacks-or-reference" } }, "deprecated": { "default": false, "type": "boolean" }, "security": { "type": "array", "items": { "$ref": "#/$defs/security-requirement" } }, "servers": { "type": "array", "items": { "$ref": "#/$defs/server" } } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "external-documentation": { "$comment": "https://spec.openapis.org/oas/v3.1.0#external-documentation-object", "type": "object", "properties": { "description": { "type": "string" }, "url": { "type": "string", "format": "uri" } }, "required": [ "url" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "parameter": { "$comment": "https://spec.openapis.org/oas/v3.1.0#parameter-object", "type": "object", "properties": { "name": { "type": "string" }, "in": { "enum": [ "query", "header", "path", "cookie" ] }, "description": { "type": "string" }, "required": { "default": false, "type": "boolean" }, "deprecated": { "default": false, "type": "boolean" }, "schema": { "$dynamicRef": "#meta" }, "content": { "$ref": "#/$defs/content", "minProperties": 1, "maxProperties": 1 } }, "required": [ "name", "in" ], "oneOf": [ { "required": [ "schema" ] }, { "required": [ "content" ] } ], "if": { "properties": { "in": { "const": "query" } }, "required": [ "in" ] }, "then": { "properties": { "allowEmptyValue": { "default": false, "type": "boolean" } } }, "dependentSchemas": { "schema": { "properties": { "style": { "type": "string" }, "explode": { "type": "boolean" } }, "allOf": [ { "$ref": "#/$defs/examples" }, { "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-path" }, { "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-header" }, { "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-query" }, { "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-cookie" }, { "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-form" } ], "$defs": { "styles-for-path": { "if": { "properties": { "in": { "const": "path" } }, "required": [ "in" ] }, "then": { "properties": { "name": { "pattern": "[^/#?]+$" }, "style": { "default": "simple", "enum": [ "matrix", "label", "simple" ] }, "required": { "const": true } }, "required": [ "required" ] } }, "styles-for-header": { "if": { "properties": { "in": { "const": "header" } }, "required": [ "in" ] }, "then": { "properties": { "style": { "default": "simple", "const": "simple" } } } }, "styles-for-query": { "if": { "properties": { "in": { "const": "query" } }, "required": [ "in" ] }, "then": { "properties": { "style": { "default": "form", "enum": [ "form", "spaceDelimited", "pipeDelimited", "deepObject" ] }, "allowReserved": { "default": false, "type": "boolean" } } } }, "styles-for-cookie": { "if": { "properties": { "in": { "const": "cookie" } }, "required": [ "in" ] }, "then": { "properties": { "style": { "default": "form", "const": "form" } } } }, "styles-for-form": { "if": { "properties": { "style": { "const": "form" } }, "required": [ "style" ] }, "then": { "properties": { "explode": { "default": true } } }, "else": { "properties": { "explode": { "default": false } } } } } } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "parameter-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/parameter" } }, "request-body": { "$comment": "https://spec.openapis.org/oas/v3.1.0#request-body-object", "type": "object", "properties": { "description": { "type": "string" }, "content": { "$ref": "#/$defs/content" }, "required": { "default": false, "type": "boolean" } }, "required": [ "content" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "request-body-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/request-body" } }, "content": { "$comment": "https://spec.openapis.org/oas/v3.1.0#fixed-fields-10", "type": "object", "additionalProperties": { "$ref": "#/$defs/media-type" }, "propertyNames": { "format": "media-range" } }, "media-type": { "$comment": "https://spec.openapis.org/oas/v3.1.0#media-type-object", "type": "object", "properties": { "schema": { "$dynamicRef": "#meta" }, "encoding": { "type": "object", "additionalProperties": { "$ref": "#/$defs/encoding" } } }, "allOf": [ { "$ref": "#/$defs/specification-extensions" }, { "$ref": "#/$defs/examples" } ], "unevaluatedProperties": false }, "encoding": { "$comment": "https://spec.openapis.org/oas/v3.1.0#encoding-object", "type": "object", "properties": { "contentType": { "type": "string", "format": "media-range" }, "headers": { "type": "object", "additionalProperties": { "$ref": "#/$defs/header-or-reference" } }, "style": { "default": "form", "enum": [ "form", "spaceDelimited", "pipeDelimited", "deepObject" ] }, "explode": { "type": "boolean" }, "allowReserved": { "default": false, "type": "boolean" } }, "allOf": [ { "$ref": "#/$defs/specification-extensions" }, { "$ref": "#/$defs/encoding/$defs/explode-default" } ], "unevaluatedProperties": false, "$defs": { "explode-default": { "if": { "properties": { "style": { "const": "form" } }, "required": [ "style" ] }, "then": { "properties": { "explode": { "default": true } } }, "else": { "properties": { "explode": { "default": false } } } } } }, "responses": { "$comment": "https://spec.openapis.org/oas/v3.1.0#responses-object", "type": "object", "properties": { "default": { "$ref": "#/$defs/response-or-reference" } }, "patternProperties": { "^[1-5](?:[0-9]{2}|XX)$": { "$ref": "#/$defs/response-or-reference" } }, "minProperties": 1, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false, "if": { "$comment": "either default, or at least one response code property must exist", "patternProperties": { "^[1-5](?:[0-9]{2}|XX)$": false } }, "then" : { "required": [ "default" ] } }, "response": { "$comment": "https://spec.openapis.org/oas/v3.1.0#response-object", "type": "object", "properties": { "description": { "type": "string" }, "headers": { "type": "object", "additionalProperties": { "$ref": "#/$defs/header-or-reference" } }, "content": { "$ref": "#/$defs/content" }, "links": { "type": "object", "additionalProperties": { "$ref": "#/$defs/link-or-reference" } } }, "required": [ "description" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "response-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/response" } }, "callbacks": { "$comment": "https://spec.openapis.org/oas/v3.1.0#callback-object", "type": "object", "$ref": "#/$defs/specification-extensions", "additionalProperties": { "$ref": "#/$defs/path-item-or-reference" } }, "callbacks-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/callbacks" } }, "example": { "$comment": "https://spec.openapis.org/oas/v3.1.0#example-object", "type": "object", "properties": { "summary": { "type": "string" }, "description": { "type": "string" }, "value": true, "externalValue": { "type": "string", "format": "uri" } }, "not": { "required": [ "value", "externalValue" ] }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "example-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/example" } }, "link": { "$comment": "https://spec.openapis.org/oas/v3.1.0#link-object", "type": "object", "properties": { "operationRef": { "type": "string", "format": "uri-reference" }, "operationId": { "type": "string" }, "parameters": { "$ref": "#/$defs/map-of-strings" }, "requestBody": true, "description": { "type": "string" }, "body": { "$ref": "#/$defs/server" } }, "oneOf": [ { "required": [ "operationRef" ] }, { "required": [ "operationId" ] } ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "link-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/link" } }, "header": { "$comment": "https://spec.openapis.org/oas/v3.1.0#header-object", "type": "object", "properties": { "description": { "type": "string" }, "required": { "default": false, "type": "boolean" }, "deprecated": { "default": false, "type": "boolean" }, "schema": { "$dynamicRef": "#meta" }, "content": { "$ref": "#/$defs/content", "minProperties": 1, "maxProperties": 1 } }, "oneOf": [ { "required": [ "schema" ] }, { "required": [ "content" ] } ], "dependentSchemas": { "schema": { "properties": { "style": { "default": "simple", "const": "simple" }, "explode": { "default": false, "type": "boolean" } }, "$ref": "#/$defs/examples" } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "header-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/header" } }, "tag": { "$comment": "https://spec.openapis.org/oas/v3.1.0#tag-object", "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "externalDocs": { "$ref": "#/$defs/external-documentation" } }, "required": [ "name" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "reference": { "$comment": "https://spec.openapis.org/oas/v3.1.0#reference-object", "type": "object", "properties": { "$ref": { "type": "string", "format": "uri-reference" }, "summary": { "type": "string" }, "description": { "type": "string" } }, "unevaluatedProperties": false }, "schema": { "$comment": "https://spec.openapis.org/oas/v3.1.0#schema-object", "$dynamicAnchor": "meta", "type": [ "object", "boolean" ] }, "security-scheme": { "$comment": "https://spec.openapis.org/oas/v3.1.0#security-scheme-object", "type": "object", "properties": { "type": { "enum": [ "apiKey", "http", "mutualTLS", "oauth2", "openIdConnect" ] }, "description": { "type": "string" } }, "required": [ "type" ], "allOf": [ { "$ref": "#/$defs/specification-extensions" }, { "$ref": "#/$defs/security-scheme/$defs/type-apikey" }, { "$ref": "#/$defs/security-scheme/$defs/type-http" }, { "$ref": "#/$defs/security-scheme/$defs/type-http-bearer" }, { "$ref": "#/$defs/security-scheme/$defs/type-oauth2" }, { "$ref": "#/$defs/security-scheme/$defs/type-oidc" } ], "unevaluatedProperties": false, "$defs": { "type-apikey": { "if": { "properties": { "type": { "const": "apiKey" } }, "required": [ "type" ] }, "then": { "properties": { "name": { "type": "string" }, "in": { "enum": [ "query", "header", "cookie" ] } }, "required": [ "name", "in" ] } }, "type-http": { "if": { "properties": { "type": { "const": "http" } }, "required": [ "type" ] }, "then": { "properties": { "scheme": { "type": "string" } }, "required": [ "scheme" ] } }, "type-http-bearer": { "if": { "properties": { "type": { "const": "http" }, "scheme": { "type": "string", "pattern": "^[Bb][Ee][Aa][Rr][Ee][Rr]$" } }, "required": [ "type", "scheme" ] }, "then": { "properties": { "bearerFormat": { "type": "string" } } } }, "type-oauth2": { "if": { "properties": { "type": { "const": "oauth2" } }, "required": [ "type" ] }, "then": { "properties": { "flows": { "$ref": "#/$defs/oauth-flows" } }, "required": [ "flows" ] } }, "type-oidc": { "if": { "properties": { "type": { "const": "openIdConnect" } }, "required": [ "type" ] }, "then": { "properties": { "openIdConnectUrl": { "type": "string", "format": "uri" } }, "required": [ "openIdConnectUrl" ] } } } }, "security-scheme-or-reference": { "if": { "type": "object", "required": [ "$ref" ] }, "then": { "$ref": "#/$defs/reference" }, "else": { "$ref": "#/$defs/security-scheme" } }, "oauth-flows": { "type": "object", "properties": { "implicit": { "$ref": "#/$defs/oauth-flows/$defs/implicit" }, "password": { "$ref": "#/$defs/oauth-flows/$defs/password" }, "clientCredentials": { "$ref": "#/$defs/oauth-flows/$defs/client-credentials" }, "authorizationCode": { "$ref": "#/$defs/oauth-flows/$defs/authorization-code" } }, "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false, "$defs": { "implicit": { "type": "object", "properties": { "authorizationUrl": { "type": "string", "format": "uri" }, "refreshUrl": { "type": "string", "format": "uri" }, "scopes": { "$ref": "#/$defs/map-of-strings" } }, "required": [ "authorizationUrl", "scopes" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "password": { "type": "object", "properties": { "tokenUrl": { "type": "string", "format": "uri" }, "refreshUrl": { "type": "string", "format": "uri" }, "scopes": { "$ref": "#/$defs/map-of-strings" } }, "required": [ "tokenUrl", "scopes" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "client-credentials": { "type": "object", "properties": { "tokenUrl": { "type": "string", "format": "uri" }, "refreshUrl": { "type": "string", "format": "uri" }, "scopes": { "$ref": "#/$defs/map-of-strings" } }, "required": [ "tokenUrl", "scopes" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false }, "authorization-code": { "type": "object", "properties": { "authorizationUrl": { "type": "string", "format": "uri" }, "tokenUrl": { "type": "string", "format": "uri" }, "refreshUrl": { "type": "string", "format": "uri" }, "scopes": { "$ref": "#/$defs/map-of-strings" } }, "required": [ "authorizationUrl", "tokenUrl", "scopes" ], "$ref": "#/$defs/specification-extensions", "unevaluatedProperties": false } } }, "security-requirement": { "$comment": "https://spec.openapis.org/oas/v3.1.0#security-requirement-object", "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } } }, "specification-extensions": { "$comment": "https://spec.openapis.org/oas/v3.1.0#specification-extensions", "patternProperties": { "^x-": true } }, "examples": { "properties": { "example": true, "examples": { "type": "object", "additionalProperties": { "$ref": "#/$defs/example-or-reference" } } } }, "map-of-strings": { "type": "object", "additionalProperties": { "type": "string" } } } } python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/schemas/000077500000000000000000000000001451222636700276135ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/schemas/__init__.py000066400000000000000000000021751451222636700317310ustar00rootroot00000000000000"""OpenAIP spec validator schemas module.""" from functools import partial from jsonschema.validators import Draft4Validator from jsonschema.validators import Draft202012Validator from lazy_object_proxy import Proxy from openapi_spec_validator.schemas.utils import get_schema_content __all__ = ["schema_v2", "schema_v3", "schema_v30", "schema_v31"] get_schema_content_v2 = partial(get_schema_content, "2.0") get_schema_content_v30 = partial(get_schema_content, "3.0") get_schema_content_v31 = partial(get_schema_content, "3.1") schema_v2 = Proxy(get_schema_content_v2) schema_v30 = Proxy(get_schema_content_v30) schema_v31 = Proxy(get_schema_content_v31) # alias to the latest v3 version schema_v3 = schema_v31 get_openapi_v2_schema_validator = partial(Draft4Validator, schema_v2) get_openapi_v30_schema_validator = partial(Draft4Validator, schema_v30) get_openapi_v31_schema_validator = partial(Draft202012Validator, schema_v31) openapi_v2_schema_validator = Proxy(get_openapi_v2_schema_validator) openapi_v30_schema_validator = Proxy(get_openapi_v30_schema_validator) openapi_v31_schema_validator = Proxy(get_openapi_v31_schema_validator) python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/schemas/types.py000066400000000000000000000002301451222636700313240ustar00rootroot00000000000000from typing import Union from jsonschema_path.paths import SchemaPath from jsonschema_path.typing import Schema AnySchema = Union[Schema, SchemaPath] python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/schemas/utils.py000066400000000000000000000016341451222636700313310ustar00rootroot00000000000000"""OpenAIP spec validator schemas utils module.""" import sys from os import path from typing import Any from typing import Hashable from typing import Mapping from typing import Tuple if sys.version_info >= (3, 9): from importlib.resources import as_file from importlib.resources import files else: from importlib_resources import as_file from importlib_resources import files from jsonschema_path.readers import FilePathReader def get_schema(version: str) -> Tuple[Mapping[Hashable, Any], str]: schema_path = f"resources/schemas/v{version}/schema.json" ref = files("openapi_spec_validator") / schema_path with as_file(ref) as resource_path: schema_path_full = path.join(path.dirname(__file__), resource_path) return FilePathReader(schema_path_full).read() def get_schema_content(version: str) -> Mapping[Hashable, Any]: content, _ = get_schema(version) return content python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/shortcuts.py000066400000000000000000000062541451222636700306070ustar00rootroot00000000000000"""OpenAPI spec validator shortcuts module.""" import warnings from typing import Mapping from typing import Optional from typing import Type from jsonschema_path import SchemaPath from jsonschema_path.handlers import all_urls_handler from jsonschema_path.typing import Schema from openapi_spec_validator.validation import OpenAPIV2SpecValidator from openapi_spec_validator.validation import OpenAPIV30SpecValidator from openapi_spec_validator.validation import OpenAPIV31SpecValidator from openapi_spec_validator.validation.exceptions import ValidatorDetectError from openapi_spec_validator.validation.protocols import SupportsValidation from openapi_spec_validator.validation.types import SpecValidatorType from openapi_spec_validator.validation.validators import SpecValidator from openapi_spec_validator.versions import consts as versions from openapi_spec_validator.versions.datatypes import SpecVersion from openapi_spec_validator.versions.exceptions import OpenAPIVersionNotFound from openapi_spec_validator.versions.shortcuts import get_spec_version SPEC2VALIDATOR: Mapping[SpecVersion, SpecValidatorType] = { versions.OPENAPIV2: OpenAPIV2SpecValidator, versions.OPENAPIV30: OpenAPIV30SpecValidator, versions.OPENAPIV31: OpenAPIV31SpecValidator, } def get_validator_cls(spec: Schema) -> SpecValidatorType: try: spec_version = get_spec_version(spec) # backward compatibility except OpenAPIVersionNotFound: raise ValidatorDetectError return SPEC2VALIDATOR[spec_version] def validate( spec: Schema, base_uri: str = "", cls: Optional[SpecValidatorType] = None, ) -> None: if cls is None: cls = get_validator_cls(spec) sp = SchemaPath.from_dict(spec, base_uri=base_uri) v = cls(sp) return v.validate() def validate_url( spec_url: str, cls: Optional[Type[SpecValidator]] = None, ) -> None: spec = all_urls_handler(spec_url) return validate(spec, base_uri=spec_url, cls=cls) def validate_spec( spec: Schema, base_uri: str = "", validator: Optional[SupportsValidation] = None, cls: Optional[SpecValidatorType] = None, spec_url: Optional[str] = None, ) -> None: warnings.warn( "validate_spec shortcut is deprecated. Use validate instead.", DeprecationWarning, ) if validator is not None: warnings.warn( "validator parameter is deprecated. Use cls instead.", DeprecationWarning, ) return validator.validate(spec, base_uri=base_uri, spec_url=spec_url) if cls is None: cls = get_validator_cls(spec) v = cls(spec) return v.validate() def validate_spec_url( spec_url: str, validator: Optional[SupportsValidation] = None, cls: Optional[Type[SpecValidator]] = None, ) -> None: warnings.warn( "validate_spec_url shortcut is deprecated. Use validate_url instead.", DeprecationWarning, ) if validator is not None: warnings.warn( "validator parameter is deprecated. Use cls instead.", DeprecationWarning, ) spec = all_urls_handler(spec_url) return validator.validate(spec, base_uri=spec_url) return validate_url(spec_url, cls=cls) python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/000077500000000000000000000000001451222636700303225ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/__init__.py000066400000000000000000000031321451222636700324320ustar00rootroot00000000000000from openapi_spec_validator.validation.proxies import DetectValidatorProxy from openapi_spec_validator.validation.proxies import SpecValidatorProxy from openapi_spec_validator.validation.validators import OpenAPIV2SpecValidator from openapi_spec_validator.validation.validators import ( OpenAPIV30SpecValidator, ) from openapi_spec_validator.validation.validators import ( OpenAPIV31SpecValidator, ) __all__ = [ "openapi_v2_spec_validator", "openapi_v3_spec_validator", "openapi_v30_spec_validator", "openapi_v31_spec_validator", "openapi_spec_validator_proxy", "OpenAPIV2SpecValidator", "OpenAPIV3SpecValidator", "OpenAPIV30SpecValidator", "OpenAPIV31SpecValidator", ] # v2.0 spec openapi_v2_spec_validator = SpecValidatorProxy( OpenAPIV2SpecValidator, deprecated="openapi_v2_spec_validator", use="OpenAPIV2SpecValidator", ) # v3.0 spec openapi_v30_spec_validator = SpecValidatorProxy( OpenAPIV30SpecValidator, deprecated="openapi_v30_spec_validator", use="OpenAPIV30SpecValidator", ) # v3.1 spec openapi_v31_spec_validator = SpecValidatorProxy( OpenAPIV31SpecValidator, deprecated="openapi_v31_spec_validator", use="OpenAPIV31SpecValidator", ) # alias to the latest v3 version openapi_v3_spec_validator = openapi_v31_spec_validator OpenAPIV3SpecValidator = OpenAPIV31SpecValidator # detect version spec openapi_spec_validator_proxy = DetectValidatorProxy( { ("swagger", "2.0"): openapi_v2_spec_validator, ("openapi", "3.0"): openapi_v30_spec_validator, ("openapi", "3.1"): openapi_v31_spec_validator, }, ) python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/caches.py000066400000000000000000000030641451222636700321250ustar00rootroot00000000000000from typing import Generic from typing import Iterable from typing import Iterator from typing import List from typing import TypeVar T = TypeVar("T") class CachedIterable(Iterable[T], Generic[T]): """ A cache-implementing wrapper for an iterator. Note that this is class is `Iterable[T]` rather than `Iterator[T]`. It should not be iterated by his own. """ cache: List[T] iter: Iterator[T] completed: bool def __init__(self, it: Iterator[T]): self.iter = iter(it) self.cache = list() self.completed = False def __iter__(self) -> Iterator[T]: return CachedIterator(self) def __next__(self) -> T: try: item = next(self.iter) except StopIteration: self.completed = True raise else: self.cache.append(item) return item def __del__(self) -> None: del self.cache class CachedIterator(Iterator[T], Generic[T]): """ A cache-using wrapper for an iterator. This class is only constructed by `CachedIterable` and cannot be used without it. """ parent: CachedIterable[T] position: int def __init__(self, parent: CachedIterable[T]): self.parent = parent self.position = 0 def __next__(self) -> T: if self.position < len(self.parent.cache): item = self.parent.cache[self.position] elif self.parent.completed: raise StopIteration else: item = next(self.parent) self.position += 1 return item python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/decorators.py000066400000000000000000000030311451222636700330360ustar00rootroot00000000000000"""OpenAPI spec validator validation decorators module.""" import logging from functools import wraps from typing import Any from typing import Callable from typing import Iterable from typing import Iterator from typing import TypeVar from jsonschema.exceptions import ValidationError from openapi_spec_validator.validation.caches import CachedIterable from openapi_spec_validator.validation.exceptions import OpenAPIValidationError Args = TypeVar("Args") T = TypeVar("T") log = logging.getLogger(__name__) def wraps_errors( func: Callable[..., Any] ) -> Callable[..., Iterator[ValidationError]]: @wraps(func) def wrapper(*args: Any, **kwds: Any) -> Iterator[ValidationError]: errors = func(*args, **kwds) for err in errors: if not isinstance(err, OpenAPIValidationError): # wrap other exceptions with library specific version yield OpenAPIValidationError.create_from(err) else: yield err return wrapper def wraps_cached_iter( func: Callable[[Args], Iterator[T]] ) -> Callable[[Args], CachedIterable[T]]: @wraps(func) def wrapper(*args: Any, **kwargs: Any) -> CachedIterable[T]: result = func(*args, **kwargs) return CachedIterable(result) return wrapper def unwraps_iter( func: Callable[[Args], Iterable[T]] ) -> Callable[[Args], Iterator[T]]: @wraps(func) def wrapper(*args: Any, **kwargs: Any) -> Iterator[T]: result = func(*args, **kwargs) return iter(result) return wrapper python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/exceptions.py000066400000000000000000000010211451222636700330470ustar00rootroot00000000000000from jsonschema.exceptions import ValidationError from openapi_spec_validator.exceptions import OpenAPISpecValidatorError class ValidatorDetectError(OpenAPISpecValidatorError): pass class OpenAPIValidationError(ValidationError): # type: ignore pass class ExtraParametersError(OpenAPIValidationError): pass class ParameterDuplicateError(OpenAPIValidationError): pass class UnresolvableParameterError(OpenAPIValidationError): pass class DuplicateOperationIDError(OpenAPIValidationError): pass python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/keywords.py000066400000000000000000000334351451222636700325530ustar00rootroot00000000000000import string from typing import TYPE_CHECKING from typing import Any from typing import Iterator from typing import List from typing import Optional from typing import cast from jsonschema._format import FormatChecker from jsonschema.exceptions import ValidationError from jsonschema.protocols import Validator from jsonschema_path.paths import SchemaPath from openapi_schema_validator import oas30_format_checker from openapi_schema_validator import oas31_format_checker from openapi_schema_validator.validators import OAS30Validator from openapi_schema_validator.validators import OAS31Validator from openapi_spec_validator.validation.exceptions import ( DuplicateOperationIDError, ) from openapi_spec_validator.validation.exceptions import ExtraParametersError from openapi_spec_validator.validation.exceptions import ( ParameterDuplicateError, ) from openapi_spec_validator.validation.exceptions import ( UnresolvableParameterError, ) if TYPE_CHECKING: from openapi_spec_validator.validation.registries import ( KeywordValidatorRegistry, ) class KeywordValidator: def __init__(self, registry: "KeywordValidatorRegistry"): self.registry = registry class ValueValidator(KeywordValidator): value_validator_cls: Validator = NotImplemented value_validator_format_checker: FormatChecker = NotImplemented def __call__( self, schema: SchemaPath, value: Any ) -> Iterator[ValidationError]: with schema.resolve() as resolved: value_validator = self.value_validator_cls( resolved.contents, _resolver=resolved.resolver, format_checker=self.value_validator_format_checker, ) yield from value_validator.iter_errors(value) class OpenAPIV30ValueValidator(ValueValidator): value_validator_cls = OAS30Validator value_validator_format_checker = oas30_format_checker class OpenAPIV31ValueValidator(ValueValidator): value_validator_cls = OAS31Validator value_validator_format_checker = oas31_format_checker class SchemaValidator(KeywordValidator): def __init__(self, registry: "KeywordValidatorRegistry"): super().__init__(registry) self.schema_ids_registry: Optional[List[int]] = [] @property def default_validator(self) -> ValueValidator: return cast(ValueValidator, self.registry["default"]) def __call__( self, schema: SchemaPath, require_properties: bool = True ) -> Iterator[ValidationError]: if not hasattr(schema.content(), "__getitem__"): return assert self.schema_ids_registry is not None schema_id = id(schema.content()) if schema_id in self.schema_ids_registry: return self.schema_ids_registry.append(schema_id) nested_properties = [] if "allOf" in schema: all_of = schema / "allOf" for inner_schema in all_of: yield from self( inner_schema, require_properties=False, ) if "properties" not in inner_schema: continue inner_schema_props = inner_schema / "properties" inner_schema_props_keys = inner_schema_props.keys() nested_properties += list(inner_schema_props_keys) if "anyOf" in schema: any_of = schema / "anyOf" for inner_schema in any_of: yield from self( inner_schema, require_properties=False, ) if "oneOf" in schema: one_of = schema / "oneOf" for inner_schema in one_of: yield from self( inner_schema, require_properties=False, ) if "not" in schema: not_schema = schema / "not" yield from self( not_schema, require_properties=False, ) if "items" in schema: array_schema = schema / "items" yield from self( array_schema, require_properties=False, ) if "properties" in schema: props = schema / "properties" for _, prop_schema in props.items(): yield from self( prop_schema, require_properties=False, ) required = schema.getkey("required", []) properties = schema.get("properties", {}).keys() if "allOf" in schema: extra_properties = list( set(required) - set(properties) - set(nested_properties) ) else: extra_properties = list(set(required) - set(properties)) if extra_properties and require_properties: yield ExtraParametersError( f"Required list has not defined properties: {extra_properties}" ) if "default" in schema: default = schema["default"] nullable = schema.get("nullable", False) if default is not None or nullable is not True: yield from self.default_validator(schema, default) class SchemasValidator(KeywordValidator): @property def schema_validator(self) -> SchemaValidator: return cast(SchemaValidator, self.registry["schema"]) def __call__(self, schemas: SchemaPath) -> Iterator[ValidationError]: for _, schema in schemas.items(): yield from self.schema_validator(schema) class ParameterValidator(KeywordValidator): @property def schema_validator(self) -> SchemaValidator: return cast(SchemaValidator, self.registry["schema"]) def __call__(self, parameter: SchemaPath) -> Iterator[ValidationError]: if "schema" in parameter: schema = parameter / "schema" yield from self.schema_validator(schema) class OpenAPIV2ParameterValidator(ParameterValidator): @property def default_validator(self) -> ValueValidator: return cast(ValueValidator, self.registry["default"]) def __call__(self, parameter: SchemaPath) -> Iterator[ValidationError]: yield from super().__call__(parameter) if "default" in parameter: # only possible in swagger 2.0 default = parameter.getkey("default") if default is not None: yield from self.default_validator(parameter, default) class ParametersValidator(KeywordValidator): @property def parameter_validator(self) -> ParameterValidator: return cast(ParameterValidator, self.registry["parameter"]) def __call__(self, parameters: SchemaPath) -> Iterator[ValidationError]: seen = set() for parameter in parameters: yield from self.parameter_validator(parameter) key = (parameter["name"], parameter["in"]) if key in seen: yield ParameterDuplicateError( f"Duplicate parameter `{parameter['name']}`" ) seen.add(key) class MediaTypeValidator(KeywordValidator): @property def schema_validator(self) -> SchemaValidator: return cast(SchemaValidator, self.registry["schema"]) def __call__( self, mimetype: str, media_type: SchemaPath ) -> Iterator[ValidationError]: if "schema" in media_type: schema = media_type / "schema" yield from self.schema_validator(schema) class ContentValidator(KeywordValidator): @property def media_type_validator(self) -> MediaTypeValidator: return cast(MediaTypeValidator, self.registry["mediaType"]) def __call__(self, content: SchemaPath) -> Iterator[ValidationError]: for mimetype, media_type in content.items(): yield from self.media_type_validator(mimetype, media_type) class ResponseValidator(KeywordValidator): def __call__( self, response_code: str, response: SchemaPath ) -> Iterator[ValidationError]: raise NotImplementedError class OpenAPIV2ResponseValidator(ResponseValidator): @property def schema_validator(self) -> SchemaValidator: return cast(SchemaValidator, self.registry["schema"]) def __call__( self, response_code: str, response: SchemaPath ) -> Iterator[ValidationError]: # openapi 2 if "schema" in response: schema = response / "schema" yield from self.schema_validator(schema) class OpenAPIV3ResponseValidator(ResponseValidator): @property def content_validator(self) -> ContentValidator: return cast(ContentValidator, self.registry["content"]) def __call__( self, response_code: str, response: SchemaPath ) -> Iterator[ValidationError]: # openapi 3 if "content" in response: content = response / "content" yield from self.content_validator(content) class ResponsesValidator(KeywordValidator): @property def response_validator(self) -> ResponseValidator: return cast(ResponseValidator, self.registry["response"]) def __call__(self, responses: SchemaPath) -> Iterator[ValidationError]: for response_code, response in responses.items(): yield from self.response_validator(response_code, response) class OperationValidator(KeywordValidator): def __init__(self, registry: "KeywordValidatorRegistry"): super().__init__(registry) self.operation_ids_registry: Optional[List[str]] = [] @property def responses_validator(self) -> ResponsesValidator: return cast(ResponsesValidator, self.registry["responses"]) @property def parameters_validator(self) -> ParametersValidator: return cast(ParametersValidator, self.registry["parameters"]) def __call__( self, url: str, name: str, operation: SchemaPath, path_parameters: Optional[SchemaPath], ) -> Iterator[ValidationError]: assert self.operation_ids_registry is not None operation_id = operation.getkey("operationId") if ( operation_id is not None and operation_id in self.operation_ids_registry ): yield DuplicateOperationIDError( f"Operation ID '{operation_id}' for '{name}' in '{url}' is not unique" ) self.operation_ids_registry.append(operation_id) if "responses" in operation: responses = operation / "responses" yield from self.responses_validator(responses) names = [] parameters = None if "parameters" in operation: parameters = operation / "parameters" yield from self.parameters_validator(parameters) names += list(self._get_path_param_names(parameters)) if path_parameters is not None: names += list(self._get_path_param_names(path_parameters)) all_params = list(set(names)) for path in self._get_path_params_from_url(url): if path not in all_params: yield UnresolvableParameterError( "Path parameter '{}' for '{}' operation in '{}' " "was not resolved".format(path, name, url) ) return def _get_path_param_names(self, params: SchemaPath) -> Iterator[str]: for param in params: if param["in"] == "path": yield param["name"] def _get_path_params_from_url(self, url: str) -> Iterator[str]: formatter = string.Formatter() path_params = [item[1] for item in formatter.parse(url)] return filter(None, path_params) class PathValidator(KeywordValidator): OPERATIONS = [ "get", "put", "post", "delete", "options", "head", "patch", "trace", ] @property def parameters_validator(self) -> ParametersValidator: return cast(ParametersValidator, self.registry["parameters"]) @property def operation_validator(self) -> OperationValidator: return cast(OperationValidator, self.registry["operation"]) def __call__( self, url: str, path_item: SchemaPath ) -> Iterator[ValidationError]: parameters = None if "parameters" in path_item: parameters = path_item / "parameters" yield from self.parameters_validator(parameters) for field_name, operation in path_item.items(): if field_name not in self.OPERATIONS: continue yield from self.operation_validator( url, field_name, operation, parameters ) class PathsValidator(KeywordValidator): @property def path_validator(self) -> PathValidator: return cast(PathValidator, self.registry["path"]) def __call__(self, paths: SchemaPath) -> Iterator[ValidationError]: for url, path_item in paths.items(): yield from self.path_validator(url, path_item) class ComponentsValidator(KeywordValidator): @property def schemas_validator(self) -> SchemasValidator: return cast(SchemasValidator, self.registry["schemas"]) def __call__(self, components: SchemaPath) -> Iterator[ValidationError]: schemas = components.get("schemas", {}) yield from self.schemas_validator(schemas) class RootValidator(KeywordValidator): @property def paths_validator(self) -> PathsValidator: return cast(PathsValidator, self.registry["paths"]) @property def components_validator(self) -> ComponentsValidator: return cast(ComponentsValidator, self.registry["components"]) def __call__(self, spec: SchemaPath) -> Iterator[ValidationError]: if "paths" in spec: paths = spec / "paths" yield from self.paths_validator(paths) if "components" in spec: components = spec / "components" yield from self.components_validator(components) python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/protocols.py000066400000000000000000000014221451222636700327170ustar00rootroot00000000000000from typing import Any from typing import Hashable from typing import Iterator from typing import Mapping from typing import Optional from typing import Protocol from typing import runtime_checkable from openapi_spec_validator.validation.exceptions import OpenAPIValidationError @runtime_checkable class SupportsValidation(Protocol): def is_valid(self, instance: Mapping[Hashable, Any]) -> bool: ... def iter_errors( self, instance: Mapping[Hashable, Any], base_uri: str = "", spec_url: Optional[str] = None, ) -> Iterator[OpenAPIValidationError]: ... def validate( self, instance: Mapping[Hashable, Any], base_uri: str = "", spec_url: Optional[str] = None, ) -> None: ... python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/proxies.py000066400000000000000000000060641451222636700323730ustar00rootroot00000000000000"""OpenAPI spec validator validation proxies module.""" import warnings from typing import Any from typing import Hashable from typing import Iterator from typing import Mapping from typing import Optional from typing import Tuple from jsonschema.exceptions import ValidationError from jsonschema_path.typing import Schema from openapi_spec_validator.validation.exceptions import OpenAPIValidationError from openapi_spec_validator.validation.exceptions import ValidatorDetectError from openapi_spec_validator.validation.types import SpecValidatorType class SpecValidatorProxy: def __init__( self, cls: SpecValidatorType, deprecated: str = "SpecValidator", use: Optional[str] = None, ): self.cls = cls self.deprecated = deprecated self.use = use or self.cls.__name__ def validate( self, schema: Schema, base_uri: str = "", spec_url: Optional[str] = None, ) -> None: for err in self.iter_errors( schema, base_uri=base_uri, spec_url=spec_url, ): raise err def is_valid(self, schema: Schema) -> bool: error = next(self.iter_errors(schema), None) return error is None def iter_errors( self, schema: Schema, base_uri: str = "", spec_url: Optional[str] = None, ) -> Iterator[ValidationError]: warnings.warn( f"{self.deprecated} is deprecated. Use {self.use} instead.", DeprecationWarning, ) validator = self.cls(schema, base_uri=base_uri, spec_url=spec_url) return validator.iter_errors() class DetectValidatorProxy: def __init__(self, choices: Mapping[Tuple[str, str], SpecValidatorProxy]): self.choices = choices def detect(self, instance: Mapping[Hashable, Any]) -> SpecValidatorProxy: for (key, value), validator in self.choices.items(): if key in instance and instance[key].startswith(value): return validator raise ValidatorDetectError("Spec schema version not detected") def validate( self, instance: Mapping[Hashable, Any], base_uri: str = "", spec_url: Optional[str] = None, ) -> None: validator = self.detect(instance) for err in validator.iter_errors( instance, base_uri=base_uri, spec_url=spec_url ): raise err def is_valid(self, instance: Mapping[Hashable, Any]) -> bool: validator = self.detect(instance) error = next(validator.iter_errors(instance), None) return error is None def iter_errors( self, instance: Mapping[Hashable, Any], base_uri: str = "", spec_url: Optional[str] = None, ) -> Iterator[OpenAPIValidationError]: warnings.warn( "openapi_spec_validator_proxy is deprecated.", DeprecationWarning, ) validator = self.detect(instance) yield from validator.iter_errors( instance, base_uri=base_uri, spec_url=spec_url ) python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/registries.py000066400000000000000000000012701451222636700330540ustar00rootroot00000000000000from __future__ import annotations from typing import DefaultDict from typing import Mapping from typing import Type from openapi_spec_validator.validation.keywords import KeywordValidator class KeywordValidatorRegistry(DefaultDict[str, KeywordValidator]): def __init__( self, keyword_validators: Mapping[str, Type[KeywordValidator]] ): super().__init__() self.keyword_validators = keyword_validators def __missing__(self, keyword: str) -> KeywordValidator: if keyword not in self.keyword_validators: raise KeyError(keyword) cls = self.keyword_validators[keyword] self[keyword] = cls(self) return self[keyword] python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/types.py000066400000000000000000000002111451222636700320320ustar00rootroot00000000000000from typing import Type from openapi_spec_validator.validation.validators import SpecValidator SpecValidatorType = Type[SpecValidator] python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/validation/validators.py000066400000000000000000000124571451222636700330550ustar00rootroot00000000000000"""OpenAPI spec validator validation validators module.""" import logging import warnings from functools import lru_cache from typing import Iterator from typing import List from typing import Mapping from typing import Optional from typing import Type from typing import cast from jsonschema.exceptions import ValidationError from jsonschema.protocols import Validator from jsonschema_path.handlers import default_handlers from jsonschema_path.paths import SchemaPath from openapi_spec_validator.schemas import openapi_v2_schema_validator from openapi_spec_validator.schemas import openapi_v30_schema_validator from openapi_spec_validator.schemas import openapi_v31_schema_validator from openapi_spec_validator.schemas.types import AnySchema from openapi_spec_validator.validation import keywords from openapi_spec_validator.validation.decorators import unwraps_iter from openapi_spec_validator.validation.decorators import wraps_cached_iter from openapi_spec_validator.validation.decorators import wraps_errors from openapi_spec_validator.validation.registries import ( KeywordValidatorRegistry, ) log = logging.getLogger(__name__) class SpecValidator: resolver_handlers = default_handlers keyword_validators: Mapping[str, Type[keywords.KeywordValidator]] = { "__root__": keywords.RootValidator, } root_keywords: List[str] = [] schema_validator: Validator = NotImplemented def __init__( self, schema: AnySchema, base_uri: str = "", spec_url: Optional[str] = None, ) -> None: if spec_url is not None: warnings.warn( "spec_url parameter is deprecated. " "Use base_uri instead.", DeprecationWarning, ) base_uri = spec_url self.base_uri = base_uri if isinstance(schema, SchemaPath): self.schema_path = schema self.schema = schema.contents() else: self.schema = schema self.schema_path = SchemaPath.from_dict( self.schema, base_uri=self.base_uri, handlers=self.resolver_handlers, ) self.keyword_validators_registry = KeywordValidatorRegistry( self.keyword_validators ) def validate(self) -> None: for err in self.iter_errors(): raise err def is_valid(self) -> bool: error = next(self.iter_errors(), None) return error is None @property def root_validator(self) -> keywords.RootValidator: return cast( keywords.RootValidator, self.keyword_validators_registry["__root__"], ) @unwraps_iter @lru_cache(maxsize=None) @wraps_cached_iter @wraps_errors def iter_errors(self) -> Iterator[ValidationError]: yield from self.schema_validator.iter_errors(self.schema) yield from self.root_validator(self.schema_path) class OpenAPIV2SpecValidator(SpecValidator): schema_validator = openapi_v2_schema_validator keyword_validators = { "__root__": keywords.RootValidator, "components": keywords.ComponentsValidator, "default": keywords.OpenAPIV30ValueValidator, "operation": keywords.OperationValidator, "parameter": keywords.OpenAPIV2ParameterValidator, "parameters": keywords.ParametersValidator, "paths": keywords.PathsValidator, "path": keywords.PathValidator, "response": keywords.OpenAPIV2ResponseValidator, "responses": keywords.ResponsesValidator, "schema": keywords.SchemaValidator, "schemas": keywords.SchemasValidator, } root_keywords = ["paths", "components"] class OpenAPIV30SpecValidator(SpecValidator): schema_validator = openapi_v30_schema_validator keyword_validators = { "__root__": keywords.RootValidator, "components": keywords.ComponentsValidator, "content": keywords.ContentValidator, "default": keywords.OpenAPIV30ValueValidator, "mediaType": keywords.MediaTypeValidator, "operation": keywords.OperationValidator, "parameter": keywords.ParameterValidator, "parameters": keywords.ParametersValidator, "paths": keywords.PathsValidator, "path": keywords.PathValidator, "response": keywords.OpenAPIV3ResponseValidator, "responses": keywords.ResponsesValidator, "schema": keywords.SchemaValidator, "schemas": keywords.SchemasValidator, } root_keywords = ["paths", "components"] class OpenAPIV31SpecValidator(SpecValidator): schema_validator = openapi_v31_schema_validator keyword_validators = { "__root__": keywords.RootValidator, "components": keywords.ComponentsValidator, "content": keywords.ContentValidator, "default": keywords.OpenAPIV31ValueValidator, "mediaType": keywords.MediaTypeValidator, "operation": keywords.OperationValidator, "parameter": keywords.ParameterValidator, "parameters": keywords.ParametersValidator, "paths": keywords.PathsValidator, "path": keywords.PathValidator, "response": keywords.OpenAPIV3ResponseValidator, "responses": keywords.ResponsesValidator, "schema": keywords.SchemaValidator, "schemas": keywords.SchemasValidator, } root_keywords = ["paths", "components"] python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/versions/000077500000000000000000000000001451222636700300405ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/versions/__init__.py000066400000000000000000000006611451222636700321540ustar00rootroot00000000000000from openapi_spec_validator.versions.consts import OPENAPIV2 from openapi_spec_validator.versions.consts import OPENAPIV30 from openapi_spec_validator.versions.consts import OPENAPIV31 from openapi_spec_validator.versions.datatypes import SpecVersion from openapi_spec_validator.versions.shortcuts import get_spec_version __all__ = [ "OPENAPIV2", "OPENAPIV30", "OPENAPIV31", "SpecVersion", "get_spec_version", ] python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/versions/consts.py000066400000000000000000000006231451222636700317240ustar00rootroot00000000000000from typing import List from openapi_spec_validator.versions.datatypes import SpecVersion OPENAPIV2 = SpecVersion( keyword="swagger", major="2", minor="0", ) OPENAPIV30 = SpecVersion( keyword="openapi", major="3", minor="0", ) OPENAPIV31 = SpecVersion( keyword="openapi", major="3", minor="1", ) VERSIONS: List[SpecVersion] = [OPENAPIV2, OPENAPIV30, OPENAPIV31] python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/versions/datatypes.py000066400000000000000000000004231451222636700324070ustar00rootroot00000000000000from dataclasses import dataclass @dataclass(frozen=True) class SpecVersion: """ Spec version designates the OAS feature set. """ keyword: str major: str minor: str def __str__(self) -> str: return f"OpenAPIV{self.major}.{self.minor}" python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/versions/exceptions.py000066400000000000000000000002701451222636700325720ustar00rootroot00000000000000from openapi_spec_validator.exceptions import OpenAPIError class OpenAPIVersionNotFound(OpenAPIError): def __str__(self) -> str: return "Specification version not found" python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/versions/finders.py000066400000000000000000000015131451222636700320440ustar00rootroot00000000000000from re import compile from typing import List from jsonschema_path.typing import Schema from openapi_spec_validator.versions.datatypes import SpecVersion from openapi_spec_validator.versions.exceptions import OpenAPIVersionNotFound class SpecVersionFinder: pattern = compile(r"(?P\d+)\.(?P\d+)(\..*)?") def __init__(self, versions: List[SpecVersion]) -> None: self.versions = versions def find(self, spec: Schema) -> SpecVersion: for v in self.versions: if v.keyword in spec: version_str = spec[v.keyword] m = self.pattern.match(version_str) if m: version = SpecVersion(**m.groupdict(), keyword=v.keyword) if v == version: return v raise OpenAPIVersionNotFound python-openapi-openapi-spec-validator-1f3ff43/openapi_spec_validator/versions/shortcuts.py000066400000000000000000000005521451222636700324520ustar00rootroot00000000000000from jsonschema_path.typing import Schema from openapi_spec_validator.versions.consts import VERSIONS from openapi_spec_validator.versions.datatypes import SpecVersion from openapi_spec_validator.versions.finders import SpecVersionFinder def get_spec_version(spec: Schema) -> SpecVersion: finder = SpecVersionFinder(VERSIONS) return finder.find(spec) python-openapi-openapi-spec-validator-1f3ff43/poetry.lock000066400000000000000000003730661451222636700236710ustar00rootroot00000000000000# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" optional = false python-versions = ">=3.6" files = [ {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] [[package]] name = "annotated-types" version = "0.5.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.7" files = [ {file = "annotated_types-0.5.0-py3-none-any.whl", hash = "sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd"}, {file = "annotated_types-0.5.0.tar.gz", hash = "sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802"}, ] [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} [[package]] name = "appdirs" version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = "*" files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] [[package]] name = "astor" version = "0.8.1" description = "Read/rewrite/write Python ASTs" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, ] [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[docs,tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" version = "2.12.1" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "black" version = "23.9.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bump2version" version = "1.0.1" description = "Version-bump your software with a single command!" optional = false python-versions = ">=3.5" files = [ {file = "bump2version-1.0.1-py2.py3-none-any.whl", hash = "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410"}, {file = "bump2version-1.0.1.tar.gz", hash = "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6"}, ] [[package]] name = "cachetools" version = "5.3.1" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, ] [[package]] name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "cfgv" version = "3.3.1" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.6.1" files = [ {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, ] [[package]] name = "chardet" version = "5.2.0" description = "Universal encoding detector for Python 3" optional = false python-versions = ">=3.7" files = [ {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, ] [[package]] name = "charset-normalizer" version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] [[package]] name = "click" version = "8.1.4" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ {file = "click-8.1.4-py3-none-any.whl", hash = "sha256:2739815aaa5d2c986a88f1e9230c55e17f0caad3d958a5e13ad0797c166db9e3"}, {file = "click-8.1.4.tar.gz", hash = "sha256:b97d0c74955da062a7d4ef92fadb583806a585b2ea81958a81bd72726cbb8e37"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] name = "coverage" version = "7.2.7" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.7" files = [ {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, ] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] toml = ["tomli"] [[package]] name = "deptry" version = "0.12.0" description = "A command line utility to check for unused, missing and transitive dependencies in a Python project." optional = false python-versions = ">=3.8,<4.0" files = [ {file = "deptry-0.12.0-py3-none-any.whl", hash = "sha256:69c801a6ae1b39c7b8e0daf40dbe8b75f1f161277d206dd8f921f32cd22dad91"}, {file = "deptry-0.12.0.tar.gz", hash = "sha256:ac3cd32d149c92a9af12f63cd9486ddd1760f0277ed0cf306c6ef0388f57ff0a"}, ] [package.dependencies] chardet = ">=4.0.0" click = ">=8.0.0,<9.0.0" colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} pathspec = ">=0.9.0" tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} [[package]] name = "distlib" version = "0.3.7" description = "Distribution utilities" optional = false python-versions = "*" files = [ {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, ] [[package]] name = "docutils" version = "0.20.1" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.7" files = [ {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] [[package]] name = "exceptiongroup" version = "1.1.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, ] [package.extras] test = ["pytest (>=6)"] [[package]] name = "filelock" version = "3.12.3" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, ] [package.dependencies] typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} [package.extras] docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] [[package]] name = "flake8" version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.6.1" files = [ {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.9.0,<2.10.0" pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "flynt" version = "1.0.1" description = "CLI tool to convert a python project's %-formatted strings to f-strings." optional = false python-versions = ">=3.7" files = [ {file = "flynt-1.0.1-py3-none-any.whl", hash = "sha256:65d1c546434827275123222a98408e9561bcd67db832dd58f530ff17b8329ec1"}, {file = "flynt-1.0.1.tar.gz", hash = "sha256:988aac00672a5469726cc0a17cef7d1178c284a9fe8563458db2475d0aaed965"}, ] [package.dependencies] astor = "*" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] dev = ["build", "pre-commit", "pytest", "pytest-cov", "twine"] [[package]] name = "identify" version = "2.5.24" description = "File identification library for Python" optional = false python-versions = ">=3.7" files = [ {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, ] [package.extras] license = ["ukkonen"] [[package]] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] [[package]] name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] [[package]] name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] 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"] [[package]] name = "importlib-resources" version = "6.1.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] 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)"] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, ] [package.extras] colors = ["colorama (>=0.4.3)"] pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] [package.dependencies] MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" version = "4.19.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ {file = "jsonschema-4.19.1-py3-none-any.whl", hash = "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e"}, {file = "jsonschema-4.19.1.tar.gz", hash = "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf"}, ] [package.dependencies] attrs = ">=22.2.0" importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} jsonschema-specifications = ">=2023.03.6" pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} referencing = ">=0.28.4" rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] [[package]] name = "jsonschema-path" version = "0.3.1" description = "JSONSchema Spec with object-oriented paths" optional = false python-versions = ">=3.8.0,<4.0.0" files = [ {file = "jsonschema_path-0.3.1-py3-none-any.whl", hash = "sha256:06f01b1848a28963f49a17730e11204d252aa6ff5db4ef84ec77e5ac93cfa831"}, {file = "jsonschema_path-0.3.1.tar.gz", hash = "sha256:07ea584b5c9b41a614b4d011c5575955676f48d0abbfd93d9ea8e933018d716d"}, ] [package.dependencies] pathable = ">=0.4.1,<0.5.0" PyYAML = ">=5.1" referencing = ">=0.28.0,<0.31.0" requests = ">=2.31.0,<3.0.0" [[package]] name = "jsonschema-specifications" version = "2023.6.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" files = [ {file = "jsonschema_specifications-2023.6.1-py3-none-any.whl", hash = "sha256:3d2b82663aff01815f744bb5c7887e2121a63399b49b104a3c96145474d091d7"}, {file = "jsonschema_specifications-2023.6.1.tar.gz", hash = "sha256:ca1c4dd059a9e7b34101cf5b3ab7ff1d18b139f35950d598d629837ef66e8f28"}, ] [package.dependencies] importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} referencing = ">=0.28.0" [[package]] name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.7" files = [ {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, ] [[package]] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] name = "mypy" version = "1.5.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] reports = ["lxml"] [[package]] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, ] [package.dependencies] setuptools = "*" [[package]] name = "openapi-schema-validator" version = "0.6.2" description = "OpenAPI schema validation for Python" optional = false python-versions = ">=3.8.0,<4.0.0" files = [ {file = "openapi_schema_validator-0.6.2-py3-none-any.whl", hash = "sha256:c4887c1347c669eb7cded9090f4438b710845cd0f90d1fb9e1b3303fb37339f8"}, {file = "openapi_schema_validator-0.6.2.tar.gz", hash = "sha256:11a95c9c9017912964e3e5f2545a5b11c3814880681fcacfb73b1759bb4f2804"}, ] [package.dependencies] jsonschema = ">=4.19.1,<5.0.0" jsonschema-specifications = ">=2023.5.2,<2024.0.0" rfc3339-validator = "*" [[package]] name = "packaging" version = "23.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] name = "pathable" version = "0.4.3" description = "Object-oriented paths" optional = false python-versions = ">=3.7.0,<4.0.0" files = [ {file = "pathable-0.4.3-py3-none-any.whl", hash = "sha256:cdd7b1f9d7d5c8b8d3315dbf5a86b2596053ae845f056f57d97c0eefff84da14"}, {file = "pathable-0.4.3.tar.gz", hash = "sha256:5c869d315be50776cc8a993f3af43e0c60dc01506b399643f919034ebf4cdcab"}, ] [[package]] name = "pathspec" version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" files = [ {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] [[package]] name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." optional = false python-versions = ">=3.6" files = [ {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, ] [[package]] name = "platformdirs" version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" version = "3.4.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.8" files = [ {file = "pre_commit-3.4.0-py2.py3-none-any.whl", hash = "sha256:96d529a951f8b677f730a7212442027e8ba53f9b04d217c4c67dc56c393ad945"}, {file = "pre_commit-3.4.0.tar.gz", hash = "sha256:6bbd5129a64cad4c0dfaeeb12cd8f7ea7e15b77028d985341478c8af3c759522"}, ] [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" [[package]] name = "pycodestyle" version = "2.9.1" description = "Python style guide checker" optional = false python-versions = ">=3.6" files = [ {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, ] [[package]] name = "pydantic" version = "2.0.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.7" files = [ {file = "pydantic-2.0.2-py3-none-any.whl", hash = "sha256:f5581e0c79b2ec2fa25a9d30d766629811cdda022107fa73d022ab5578873ae3"}, {file = "pydantic-2.0.2.tar.gz", hash = "sha256:b802f5245b8576315fe619e5989fd083448fa1258638ef9dac301ca60878396d"}, ] [package.dependencies] annotated-types = ">=0.4.0" pydantic-core = "2.1.2" typing-extensions = ">=4.6.1" [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" version = "2.1.2" description = "" optional = false python-versions = ">=3.7" files = [ {file = "pydantic_core-2.1.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:b4815720c266e832b20e27a7a5f3772bb09fdedb31a9a34bab7b49d98967ef5a"}, {file = "pydantic_core-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8884a1dbfc5cb8c54b48446ca916d4577c1f4d901126091e4ab25d00194e065f"}, {file = "pydantic_core-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74a33aa69d476773230396396afb8e11908f8dafdcfd422e746770599a3f889d"}, {file = "pydantic_core-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af832edd384755826e494ffdcf1fdda86e4babc42a0b18d342943fb18181040e"}, {file = "pydantic_core-2.1.2-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:017700236ea2e7afbef5d3803559c80bd8720306778ebd49268de7ce9972e83e"}, {file = "pydantic_core-2.1.2-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:c2d00a96fdf26295c6f25eaf9e4a233f353146a73713cd97a5f5dc6090c3aef2"}, {file = "pydantic_core-2.1.2-cp310-cp310-manylinux_2_24_s390x.whl", hash = "sha256:2575664f0a559a7b951a518f6f34c23cab7190f34f8220b8c8218c4f403147ee"}, {file = "pydantic_core-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24c3c9180a2d19d640bacc2d00f497a9a1f2abadb2a9ee201b56bb03bc5343bd"}, {file = "pydantic_core-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:88a56f0f6d020b4d17641f4b4d1f9540a536d4146768d059c430e97bdb485fc1"}, {file = "pydantic_core-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fa38a76e832743866aed6b715869757074b06357d1a260163ec26d84974245fe"}, {file = "pydantic_core-2.1.2-cp310-none-win32.whl", hash = "sha256:a772c652603855d7180015849d483a1f539351a263bb9b81bfe85193a33ce124"}, {file = "pydantic_core-2.1.2-cp310-none-win_amd64.whl", hash = "sha256:b4673d1f29487608d613ebcc5caa99ba15eb58450a7449fb6d800f29d90bebc1"}, {file = "pydantic_core-2.1.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:76c9c55462740d728b344e3a087775846516c3fee31ec56e2075faa7cfcafcbf"}, {file = "pydantic_core-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb854ec52e6e2e05b83d647695f4d913452fdd45a3dfa8233d7dab5967b3908f"}, {file = "pydantic_core-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ac140d54da366672f6b91f9a1e8e2d4e7e72720143353501ae886d3fca03272"}, {file = "pydantic_core-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:818f5cb1b209ab1295087c45717178f4bbbd2bd7eda421f7a119e7b9b736a3cb"}, {file = "pydantic_core-2.1.2-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:db4564aea8b3cb6cf1e5f3fd80f1ced73a255d492396d1bd8abd688795b34d63"}, {file = "pydantic_core-2.1.2-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:2ca2d2d5ab65fb40dd05259965006edcc62a9d9b30102737c0a6f45bcbd254e8"}, {file = "pydantic_core-2.1.2-cp311-cp311-manylinux_2_24_s390x.whl", hash = "sha256:7c7ad8958aadfbcd664078002246796ecd5566b64b22f6af4fd1bbcec6bf8f60"}, {file = "pydantic_core-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:080a7af828388284a68ad7d3d3eac3bcfff6a580292849aff087e7d556ec42d4"}, {file = "pydantic_core-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bad7029fb2251c1ac7d3acdd607e540d40d137a7d43a5e5acdcfdbd38db3fc0a"}, {file = "pydantic_core-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1635a37137fafbc6ee0a8c879857e05b30b1aabaa927e653872b71f1501b1502"}, {file = "pydantic_core-2.1.2-cp311-none-win32.whl", hash = "sha256:eb4301f009a44bb5db5edfe4e51a8175a4112b566baec07f4af8b1f8cb4649a2"}, {file = "pydantic_core-2.1.2-cp311-none-win_amd64.whl", hash = "sha256:ebf583f4d9b52abd15cc59e5f6eeca7e3e9741c6ea62d8711c00ac3acb067875"}, {file = "pydantic_core-2.1.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:90b06bb47e60173d24c7cb79670aa8dd6081797290353b9d3c66d3a23e88eb34"}, {file = "pydantic_core-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e5761ce986ec709897b1b965fad9743f301500434bea3cbab2b6e662571580f"}, {file = "pydantic_core-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b9f8bf1d7008a58fbb6eb334dc6e2f2905400cced8dadb46c4ca28f005a8562"}, {file = "pydantic_core-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a014ee88980013d192a718cbb88e8cea20acd3afad69bc6d15672d05a49cdb6"}, {file = "pydantic_core-2.1.2-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:8125152b03dd91deca5afe5b933a1994b39405adf6be2fe8dce3632319283f85"}, {file = "pydantic_core-2.1.2-cp312-cp312-manylinux_2_24_ppc64le.whl", hash = "sha256:dc737506b4a0ba2922a2626fc6d620ce50a46aebd0fe2fbcad1b93bbdd8c7e78"}, {file = "pydantic_core-2.1.2-cp312-cp312-manylinux_2_24_s390x.whl", hash = "sha256:bb471ea8650796060afc99909d9b75da583d317e52f660faf64c45f70b3bf1e2"}, {file = "pydantic_core-2.1.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1fad38db1744d27061df516e59c5025b09b0a50a337c04e6eebdbddc18951bc"}, {file = "pydantic_core-2.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:94d368af9e6563de6e7170a74710a2cbace7a1e9c8e507d9e3ac34c7065d7ae3"}, {file = "pydantic_core-2.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bd95d223de5162811a7b36c73d48eac4fee03b075132f3a1b73c132ce157a60c"}, {file = "pydantic_core-2.1.2-cp312-none-win32.whl", hash = "sha256:cd62f73830d4715bc643ae39de0bd4fb9c81d6d743530074da91e77a2cccfe67"}, {file = "pydantic_core-2.1.2-cp312-none-win_amd64.whl", hash = "sha256:51968887d6bd1eaa7fc7759701ea8ccb470c04654beaa8ede6835b0533f206a9"}, {file = "pydantic_core-2.1.2-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:7ff6bfe63f447a509ed4d368a7f4ba6a7abc03bc4744fc3fb30f2ffab73f3821"}, {file = "pydantic_core-2.1.2-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:4e67f9b9dfda2e42b39459cbf99d319ccb90da151e35cead3521975b2afbf673"}, {file = "pydantic_core-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b815a769b019dd96be6571096f246b74f63330547e9b30244c51b4a2eb0277fc"}, {file = "pydantic_core-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4aff436c23c68449601b3fba7075b4f37ef8fbb893c8c1ed3ef898f090332b1e"}, {file = "pydantic_core-2.1.2-cp37-cp37m-manylinux_2_24_armv7l.whl", hash = "sha256:2ee3ae58f271851362f6c9b33e4c9f9e866557ec7d8c03dc091e9b5aa5566cec"}, {file = "pydantic_core-2.1.2-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:cf92dccca8f66e987f6c4378700447f82b79e86407912ab1ee06b16b82f05120"}, {file = "pydantic_core-2.1.2-cp37-cp37m-manylinux_2_24_s390x.whl", hash = "sha256:4663293a36a851a860b1299c50837914269fca127434911297dd39fea9667a01"}, {file = "pydantic_core-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c917f7a41d9d09b8b024a5d65cf37e5588ccdb6e610d2df565fb7186b1f3b1c"}, {file = "pydantic_core-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:06ae67547251135a1b3f8dd465797b13146295a3866bc12ddd73f7512787bb7c"}, {file = "pydantic_core-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4938b32c09dbcecbeb652327cb4a449b1ef1a1bf6c8fc2c8241aa6b8f6d63b54"}, {file = "pydantic_core-2.1.2-cp37-none-win32.whl", hash = "sha256:682ff9228c838018c47dfa89b3d84cca45f88cacde28807ab8296ec221862af4"}, {file = "pydantic_core-2.1.2-cp37-none-win_amd64.whl", hash = "sha256:6e3bcb4a9bc209a61ea2aceb7433ce2ece32c7e670b0c06848bf870c9b3e7d87"}, {file = "pydantic_core-2.1.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:2278ca0b0dfbcfb1e12fa58570916dc260dc72bee5e6e342debf5329d8204688"}, {file = "pydantic_core-2.1.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87cff210af3258ca0c829e3ebc849d7981bfde23a99d6cb7a3c17a163b3dbad2"}, {file = "pydantic_core-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7684b5fb906b37e940c5df3f57118f32e033af5e4770e5ae2ae56fbd2fe1a30a"}, {file = "pydantic_core-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3747a4178139ebf3f19541285b2eb7c886890ca4eb7eec851578c02a13cc1385"}, {file = "pydantic_core-2.1.2-cp38-cp38-manylinux_2_24_armv7l.whl", hash = "sha256:e17056390068afd4583d88dcf4d4495764e4e2c7d756464468e0d21abcb8931e"}, {file = "pydantic_core-2.1.2-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:c720e55cef609d50418bdfdfb5c44a76efc020ae7455505788d0113c54c7df55"}, {file = "pydantic_core-2.1.2-cp38-cp38-manylinux_2_24_s390x.whl", hash = "sha256:b59a64c367f350873c40a126ffe9184d903d2126c701380b4b55753484df5948"}, {file = "pydantic_core-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68a2a767953c707d9575dcf14d8edee7930527ee0141a8bb612c22d1f1059f9a"}, {file = "pydantic_core-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae46769d9a7138d58cd190441cac14ce954010a0081f28462ed916c8e55a4f"}, {file = "pydantic_core-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc909f62325a631e1401dd07dfc386986dbcac15f98c9ff2145d930678a9d25a"}, {file = "pydantic_core-2.1.2-cp38-none-win32.whl", hash = "sha256:b4038869ba1d8fa33863b4b1286ab07e6075a641ae269b865f94d7e10b3e800e"}, {file = "pydantic_core-2.1.2-cp38-none-win_amd64.whl", hash = "sha256:5948af62f323252d56acaec8ebfca5f15933f6b72f8dbe3bf21ee97b2d10e3f0"}, {file = "pydantic_core-2.1.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:8e6ce261ccb9a986953c4dce070327e4954f9dd4cd214746dfc70efbc713b6a1"}, {file = "pydantic_core-2.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d35d634d9d1ed280c87bc2a7a6217b8787eedc86f368fc2fa1c0c8c78f7d3c93"}, {file = "pydantic_core-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be2e2812a43205728a06c9d0fd090432cd76a9bb5bff2bfcfdf8b0e27d51851"}, {file = "pydantic_core-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0eb54b11cd4fe0c6404611eef77086ade03eb1457e92910bbb4f3479efa3f79"}, {file = "pydantic_core-2.1.2-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:087ddbb754575618a8832ee4ab52fe7eb332f502e2a56088b53dbeb5c4efdf9f"}, {file = "pydantic_core-2.1.2-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:b74906e01c7fc938ac889588ef438de812989817095c3c4904721f647d64a4d1"}, {file = "pydantic_core-2.1.2-cp39-cp39-manylinux_2_24_s390x.whl", hash = "sha256:60b7239206a2f61ad89c7518adfacb3ccd6662eaa07c5e437317aea2615a1f18"}, {file = "pydantic_core-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:be3419204952bbe9b72b90008977379c52f99ae1c6e640488de4be783c345d71"}, {file = "pydantic_core-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:804cf8f6a859620f8eb754c02f7770f61c3e9c519f8338c331d555b3d6976e3c"}, {file = "pydantic_core-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cbba32fb14e199d0493c6b9c44870dab0a9c37af9f0f729068459d1849279ffd"}, {file = "pydantic_core-2.1.2-cp39-none-win32.whl", hash = "sha256:6bf00f56a4468f5b03dadb672a5f1d24aea303d4ccffe8a0f548c9e36017edd3"}, {file = "pydantic_core-2.1.2-cp39-none-win_amd64.whl", hash = "sha256:ac462a28218ea7d592c7ad51b517558f4ac6565a4e53db7a4811eeaf9c9660b0"}, {file = "pydantic_core-2.1.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:047e782b9918f35ef534ced36f1fd2064f5581229b7a15e4d3177387a6b53134"}, {file = "pydantic_core-2.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c0213891898fa5b404cf3edf4797e3ac7819a0708ea5473fc6432a2aa27c189"}, {file = "pydantic_core-2.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0f481aaf0119f77b200e5a5e2799b3e14c015a317eaa948f42263908735cc9f"}, {file = "pydantic_core-2.1.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15eb4cb543ed36f6a4f16e3bee7aa7ed1c3757be95a3f3bbb2b82b9887131e0f"}, {file = "pydantic_core-2.1.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ef71e73a81a4cd7e87c93e8ff0170140fd93ba33b0f61e83da3f55f6e0a84fb4"}, {file = "pydantic_core-2.1.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:840238c845b0f80777151fef0003088ab91c6f7b3467edaff4932b425c4e3c3f"}, {file = "pydantic_core-2.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7648e48ba263ca0a8a2dc55a60a219c9133fb101ba52c89a14a29fb3d4322ca3"}, {file = "pydantic_core-2.1.2-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:8eb4e2b71562375609c66a79f89acd4fe95c5cba23473d04952c8b14b6f908f5"}, {file = "pydantic_core-2.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056afea59651c4e47ec6dadbb77ccae4742c059a3d12bc1c0e393d189d2970d"}, {file = "pydantic_core-2.1.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46cd323371aa7e4053010ccdb94063a4273aa9e5dbe97f8a1147faa769de8d8d"}, {file = "pydantic_core-2.1.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa39499625239da4ec960cf4fc66b023929b24cc77fb8520289cfdb3c1986428"}, {file = "pydantic_core-2.1.2-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f5de2d4167fd4bc5ad205fb7297e25867b8e335ca08d64ed7a561d2955a2c32d"}, {file = "pydantic_core-2.1.2-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:9a5fba9168fc27805553760fa8198db46eef83bf52b4e87ebbe1333b823d0e70"}, {file = "pydantic_core-2.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e68a404fad8493989d6f07b7b9e066f1d2524d7cb64db2d4e9a84c920032c67f"}, {file = "pydantic_core-2.1.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:1a5c4475510d1a9cc1458a26cfc21442223e52ce9adb640775c38739315d03c7"}, {file = "pydantic_core-2.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0681472245ef182554208a25d16884c84f1c5a69f14e6169b88932e5da739a1c"}, {file = "pydantic_core-2.1.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7fd334b40c5e13a97becfcaba314de0dcc6f7fe21ec8f992139bcc64700e9dc"}, {file = "pydantic_core-2.1.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7345b1741bf66a9d8ed0ec291c3eabd534444e139e1ea6db5742ac9fd3be2530"}, {file = "pydantic_core-2.1.2-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0855cf8b760fb40f97f0226cb527c8a94a2ab9d8179628beae20d6939aaeacb0"}, {file = "pydantic_core-2.1.2-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d281a10837d98db997c0247f45d138522c91ce30cf3ae7a6afdb5e709707d360"}, {file = "pydantic_core-2.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:82e09f27edab289187dd924d4d93f2a35f21aa969699b2504aa643da7fbfeff9"}, {file = "pydantic_core-2.1.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:aa54902fa51f7d921ba80923cf1c7ff3dce796a7903300bd8824deb90e357744"}, {file = "pydantic_core-2.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b9a5fc4058d64c9c826684dcdb43891c1b474a4a88dcf8dfc3e1fb5889496f8"}, {file = "pydantic_core-2.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:817681d111cb65f07d46496eafec815f48e1aff37713b73135a0a9eb4d3610ab"}, {file = "pydantic_core-2.1.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b5d37aedea5963f2097bddbcdb255483191646a52d40d8bb66d61c190fcac91"}, {file = "pydantic_core-2.1.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f2de65752fff248319bcd3b29da24e205fa505607539fcd4acc4037355175b63"}, {file = "pydantic_core-2.1.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:a8b9c2cc4c5f8169b943d24be4bd1548fe81c016d704126e3a3124a2fc164885"}, {file = "pydantic_core-2.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f7bcdf70c8b6e70be11c78d3c00b80a24cccfb408128f23e91ec3019bed1ecc1"}, {file = "pydantic_core-2.1.2.tar.gz", hash = "sha256:d2c790f0d928b672484eac4f5696dd0b78f3d6d148a641ea196eb49c0875e30a"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-extra-types" version = "2.0.0" description = "Extra Pydantic types." optional = false python-versions = ">=3.7" files = [ {file = "pydantic_extra_types-2.0.0-py3-none-any.whl", hash = "sha256:63e5109f00815e71fff2b82090ff0523baef6b8a51889356fd984ef50c184e64"}, {file = "pydantic_extra_types-2.0.0.tar.gz", hash = "sha256:137ddacb168d95ea77591dbb3739ec4da5eeac0fc4df7f797371d9904451a178"}, ] [package.dependencies] pydantic = ">=2.0b3" [package.extras] all = ["phonenumbers (>=8,<9)", "pycountry (>=22,<23)"] [[package]] name = "pyflakes" version = "2.5.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.6" files = [ {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, ] [[package]] name = "pygments" version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] plugins = ["importlib-metadata"] [[package]] name = "pyproject-api" version = "1.6.1" description = "API to interact with the python pyproject.toml based projects" optional = false python-versions = ">=3.8" files = [ {file = "pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"}, {file = "pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"}, ] [package.dependencies] packaging = ">=23.1" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [package.extras] docs = ["furo (>=2023.8.19)", "sphinx (<7.2)", "sphinx-autodoc-typehints (>=1.24)"] testing = ["covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "setuptools (>=68.1.2)", "wheel (>=0.41.2)"] [[package]] name = "pytest" version = "7.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.7" files = [ {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, ] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "pytest-flake8" version = "1.1.1" description = "pytest plugin to check FLAKE8 requirements" optional = false python-versions = "*" files = [ {file = "pytest-flake8-1.1.1.tar.gz", hash = "sha256:ba4f243de3cb4c2486ed9e70752c80dd4b636f7ccb27d4eba763c35ed0cd316e"}, {file = "pytest_flake8-1.1.1-py2.py3-none-any.whl", hash = "sha256:e0661a786f8cbf976c185f706fdaf5d6df0b1667c3bcff8e823ba263618627e7"}, ] [package.dependencies] flake8 = ">=4.0" pytest = ">=7.0" [[package]] name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] [[package]] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "referencing" version = "0.29.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ {file = "referencing-0.29.1-py3-none-any.whl", hash = "sha256:d3c8f323ee1480095da44d55917cfb8278d73d6b4d5f677e3e40eb21314ac67f"}, {file = "referencing-0.29.1.tar.gz", hash = "sha256:90cb53782d550ba28d2166ef3f55731f38397def8832baac5d45235f1995e35e"}, ] [package.dependencies] attrs = ">=22.2.0" rpds-py = ">=0.7.0" [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." optional = false python-versions = ">=3.7" files = [ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rfc3339-validator" version = "0.1.4" description = "A pure python RFC3339 validator" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, ] [package.dependencies] six = "*" [[package]] name = "rpds-py" version = "0.8.10" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ {file = "rpds_py-0.8.10-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93d06cccae15b3836247319eee7b6f1fdcd6c10dabb4e6d350d27bd0bdca2711"}, {file = "rpds_py-0.8.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3816a890a6a9e9f1de250afa12ca71c9a7a62f2b715a29af6aaee3aea112c181"}, {file = "rpds_py-0.8.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7c6304b894546b5a6bdc0fe15761fa53fe87d28527a7142dae8de3c663853e1"}, {file = "rpds_py-0.8.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad3bfb44c8840fb4be719dc58e229f435e227fbfbe133dc33f34981ff622a8f8"}, {file = "rpds_py-0.8.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14f1c356712f66653b777ecd8819804781b23dbbac4eade4366b94944c9e78ad"}, {file = "rpds_py-0.8.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82bb361cae4d0a627006dadd69dc2f36b7ad5dc1367af9d02e296ec565248b5b"}, {file = "rpds_py-0.8.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2e3c4f2a8e3da47f850d7ea0d7d56720f0f091d66add889056098c4b2fd576c"}, {file = "rpds_py-0.8.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15a90d0ac11b4499171067ae40a220d1ca3cb685ec0acc356d8f3800e07e4cb8"}, {file = "rpds_py-0.8.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:70bb9c8004b97b4ef7ae56a2aa56dfaa74734a0987c78e7e85f00004ab9bf2d0"}, {file = "rpds_py-0.8.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d64f9f88d5203274a002b54442cafc9c7a1abff2a238f3e767b70aadf919b451"}, {file = "rpds_py-0.8.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ccbbd276642788c4376fbe8d4e6c50f0fb4972ce09ecb051509062915891cbf0"}, {file = "rpds_py-0.8.10-cp310-none-win32.whl", hash = "sha256:fafc0049add8043ad07ab5382ee80d80ed7e3699847f26c9a5cf4d3714d96a84"}, {file = "rpds_py-0.8.10-cp310-none-win_amd64.whl", hash = "sha256:915031002c86a5add7c6fd4beb601b2415e8a1c956590a5f91d825858e92fe6e"}, {file = "rpds_py-0.8.10-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:84eb541a44f7a18f07a6bfc48b95240739e93defe1fdfb4f2a295f37837945d7"}, {file = "rpds_py-0.8.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f59996d0550894affaad8743e97b9b9c98f638b221fac12909210ec3d9294786"}, {file = "rpds_py-0.8.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9adb5664b78fcfcd830000416c8cc69853ef43cb084d645b3f1f0296edd9bae"}, {file = "rpds_py-0.8.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f96f3f98fbff7af29e9edf9a6584f3c1382e7788783d07ba3721790625caa43e"}, {file = "rpds_py-0.8.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:376b8de737401050bd12810003d207e824380be58810c031f10ec563ff6aef3d"}, {file = "rpds_py-0.8.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d1c2bc319428d50b3e0fa6b673ab8cc7fa2755a92898db3a594cbc4eeb6d1f7"}, {file = "rpds_py-0.8.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73a1e48430f418f0ac3dfd87860e4cc0d33ad6c0f589099a298cb53724db1169"}, {file = "rpds_py-0.8.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134ec8f14ca7dbc6d9ae34dac632cdd60939fe3734b5d287a69683c037c51acb"}, {file = "rpds_py-0.8.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4b519bac7c09444dd85280fd60f28c6dde4389c88dddf4279ba9b630aca3bbbe"}, {file = "rpds_py-0.8.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9cd57981d9fab04fc74438d82460f057a2419974d69a96b06a440822d693b3c0"}, {file = "rpds_py-0.8.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69d089c026f6a8b9d64a06ff67dc3be196707b699d7f6ca930c25f00cf5e30d8"}, {file = "rpds_py-0.8.10-cp311-none-win32.whl", hash = "sha256:220bdcad2d2936f674650d304e20ac480a3ce88a40fe56cd084b5780f1d104d9"}, {file = "rpds_py-0.8.10-cp311-none-win_amd64.whl", hash = "sha256:6c6a0225b8501d881b32ebf3f5807a08ad3685b5eb5f0a6bfffd3a6e039b2055"}, {file = "rpds_py-0.8.10-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:e3d0cd3dff0e7638a7b5390f3a53057c4e347f4ef122ee84ed93fc2fb7ea4aa2"}, {file = "rpds_py-0.8.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d77dff3a5aa5eedcc3da0ebd10ff8e4969bc9541aa3333a8d41715b429e99f47"}, {file = "rpds_py-0.8.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41c89a366eae49ad9e65ed443a8f94aee762931a1e3723749d72aeac80f5ef2f"}, {file = "rpds_py-0.8.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3793c21494bad1373da517001d0849eea322e9a049a0e4789e50d8d1329df8e7"}, {file = "rpds_py-0.8.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:805a5f3f05d186c5d50de2e26f765ba7896d0cc1ac5b14ffc36fae36df5d2f10"}, {file = "rpds_py-0.8.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b01b39ad5411563031ea3977bbbc7324d82b088e802339e6296f082f78f6115c"}, {file = "rpds_py-0.8.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f1e860be21f3e83011116a65e7310486300e08d9a3028e73e8d13bb6c77292"}, {file = "rpds_py-0.8.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a13c8e56c46474cd5958d525ce6a9996727a83d9335684e41f5192c83deb6c58"}, {file = "rpds_py-0.8.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:93d99f957a300d7a4ced41615c45aeb0343bb8f067c42b770b505de67a132346"}, {file = "rpds_py-0.8.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:148b0b38d719c0760e31ce9285a9872972bdd7774969a4154f40c980e5beaca7"}, {file = "rpds_py-0.8.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3cc5e5b5514796f45f03a568981971b12a3570f3de2e76114f7dc18d4b60a3c4"}, {file = "rpds_py-0.8.10-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:e8e24b210a4deb5a7744971f8f77393005bae7f873568e37dfd9effe808be7f7"}, {file = "rpds_py-0.8.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b41941583adce4242af003d2a8337b066ba6148ca435f295f31ac6d9e4ea2722"}, {file = "rpds_py-0.8.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c490204e16bca4f835dba8467869fe7295cdeaa096e4c5a7af97f3454a97991"}, {file = "rpds_py-0.8.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ee45cd1d84beed6cbebc839fd85c2e70a3a1325c8cfd16b62c96e2ffb565eca"}, {file = "rpds_py-0.8.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a8ca409f1252e1220bf09c57290b76cae2f14723746215a1e0506472ebd7bdf"}, {file = "rpds_py-0.8.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96b293c0498c70162effb13100624c5863797d99df75f2f647438bd10cbf73e4"}, {file = "rpds_py-0.8.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4627520a02fccbd324b33c7a83e5d7906ec746e1083a9ac93c41ac7d15548c7"}, {file = "rpds_py-0.8.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e39d7ab0c18ac99955b36cd19f43926450baba21e3250f053e0704d6ffd76873"}, {file = "rpds_py-0.8.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ba9f1d1ebe4b63801977cec7401f2d41e888128ae40b5441270d43140efcad52"}, {file = "rpds_py-0.8.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:802f42200d8caf7f25bbb2a6464cbd83e69d600151b7e3b49f49a47fa56b0a38"}, {file = "rpds_py-0.8.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d19db6ba816e7f59fc806c690918da80a7d186f00247048cd833acdab9b4847b"}, {file = "rpds_py-0.8.10-cp38-none-win32.whl", hash = "sha256:7947e6e2c2ad68b1c12ee797d15e5f8d0db36331200b0346871492784083b0c6"}, {file = "rpds_py-0.8.10-cp38-none-win_amd64.whl", hash = "sha256:fa326b3505d5784436d9433b7980171ab2375535d93dd63fbcd20af2b5ca1bb6"}, {file = "rpds_py-0.8.10-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7b38a9ac96eeb6613e7f312cd0014de64c3f07000e8bf0004ad6ec153bac46f8"}, {file = "rpds_py-0.8.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4d42e83ddbf3445e6514f0aff96dca511421ed0392d9977d3990d9f1ba6753c"}, {file = "rpds_py-0.8.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b21575031478609db6dbd1f0465e739fe0e7f424a8e7e87610a6c7f68b4eb16"}, {file = "rpds_py-0.8.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:574868858a7ff6011192c023a5289158ed20e3f3b94b54f97210a773f2f22921"}, {file = "rpds_py-0.8.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae40f4a70a1f40939d66ecbaf8e7edc144fded190c4a45898a8cfe19d8fc85ea"}, {file = "rpds_py-0.8.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37f7ee4dc86db7af3bac6d2a2cedbecb8e57ce4ed081f6464510e537589f8b1e"}, {file = "rpds_py-0.8.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:695f642a3a5dbd4ad2ffbbacf784716ecd87f1b7a460843b9ddf965ccaeafff4"}, {file = "rpds_py-0.8.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f43ab4cb04bde6109eb2555528a64dfd8a265cc6a9920a67dcbde13ef53a46c8"}, {file = "rpds_py-0.8.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a11ab0d97be374efd04f640c04fe5c2d3dabc6dfb998954ea946ee3aec97056d"}, {file = "rpds_py-0.8.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:92cf5b3ee60eef41f41e1a2cabca466846fb22f37fc580ffbcb934d1bcab225a"}, {file = "rpds_py-0.8.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ceaac0c603bf5ac2f505a78b2dcab78d3e6b706be6596c8364b64cc613d208d2"}, {file = "rpds_py-0.8.10-cp39-none-win32.whl", hash = "sha256:dd4f16e57c12c0ae17606c53d1b57d8d1c8792efe3f065a37cb3341340599d49"}, {file = "rpds_py-0.8.10-cp39-none-win_amd64.whl", hash = "sha256:c03a435d26c3999c2a8642cecad5d1c4d10c961817536af52035f6f4ee2f5dd0"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0da53292edafecba5e1d8c1218f99babf2ed0bf1c791d83c0ab5c29b57223068"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d20a8ed227683401cc508e7be58cba90cc97f784ea8b039c8cd01111e6043e0"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97cab733d303252f7c2f7052bf021a3469d764fc2b65e6dbef5af3cbf89d4892"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c398fda6df361a30935ab4c4bccb7f7a3daef2964ca237f607c90e9f3fdf66f"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2eb4b08c45f8f8d8254cdbfacd3fc5d6b415d64487fb30d7380b0d0569837bf1"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7dfb1cbb895810fa2b892b68153c17716c6abaa22c7dc2b2f6dcf3364932a1c"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c92b74e8bf6f53a6f4995fd52f4bd510c12f103ee62c99e22bc9e05d45583c"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e9c0683cb35a9b5881b41bc01d5568ffc667910d9dbc632a1fba4e7d59e98773"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:0eeb2731708207d0fe2619afe6c4dc8cb9798f7de052da891de5f19c0006c315"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:7495010b658ec5b52835f21d8c8b1a7e52e194c50f095d4223c0b96c3da704b1"}, {file = "rpds_py-0.8.10-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c72ebc22e70e04126158c46ba56b85372bc4d54d00d296be060b0db1671638a4"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:2cd3045e7f6375dda64ed7db1c5136826facb0159ea982f77d9cf6125025bd34"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:2418cf17d653d24ffb8b75e81f9f60b7ba1b009a23298a433a4720b2a0a17017"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a2edf8173ac0c7a19da21bc68818be1321998528b5e3f748d6ee90c0ba2a1fd"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f29b8c55fd3a2bc48e485e37c4e2df3317f43b5cc6c4b6631c33726f52ffbb3"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a7d20c1cf8d7b3960c5072c265ec47b3f72a0c608a9a6ee0103189b4f28d531"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:521fc8861a86ae54359edf53a15a05fabc10593cea7b3357574132f8427a5e5a"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5c191713e98e7c28800233f039a32a42c1a4f9a001a8a0f2448b07391881036"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:083df0fafe199371206111583c686c985dddaf95ab3ee8e7b24f1fda54515d09"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ed41f3f49507936a6fe7003985ea2574daccfef999775525d79eb67344e23767"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:2614c2732bf45de5c7f9e9e54e18bc78693fa2f635ae58d2895b7965e470378c"}, {file = "rpds_py-0.8.10-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c60528671d9d467009a6ec284582179f6b88651e83367d0ab54cb739021cd7de"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ee744fca8d1ea822480a2a4e7c5f2e1950745477143668f0b523769426060f29"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a38b9f526d0d6cbdaa37808c400e3d9f9473ac4ff64d33d9163fd05d243dbd9b"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60e0e86e870350e03b3e25f9b1dd2c6cc72d2b5f24e070249418320a6f9097b7"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f53f55a8852f0e49b0fc76f2412045d6ad9d5772251dea8f55ea45021616e7d5"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c493365d3fad241d52f096e4995475a60a80f4eba4d3ff89b713bc65c2ca9615"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:300eb606e6b94a7a26f11c8cc8ee59e295c6649bd927f91e1dbd37a4c89430b6"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a665f6f1a87614d1c3039baf44109094926dedf785e346d8b0a728e9cabd27a"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:927d784648211447201d4c6f1babddb7971abad922b32257ab74de2f2750fad0"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c200b30dd573afa83847bed7e3041aa36a8145221bf0cfdfaa62d974d720805c"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:08166467258fd0240a1256fce272f689f2360227ee41c72aeea103e9e4f63d2b"}, {file = "rpds_py-0.8.10-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:996cc95830de9bc22b183661d95559ec6b3cd900ad7bc9154c4cbf5be0c9b734"}, {file = "rpds_py-0.8.10.tar.gz", hash = "sha256:13e643ce8ad502a0263397362fb887594b49cf84bf518d6038c16f235f2bcea4"}, ] [[package]] name = "setuptools" version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.7" files = [ {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] [[package]] name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." optional = false python-versions = "*" files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] [[package]] name = "sphinx" version = "7.1.2" description = "Python documentation generator" optional = false python-versions = ">=3.8" files = [ {file = "sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe"}, {file = "sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} docutils = ">=0.18.1,<0.21" imagesize = ">=1.3" importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" packaging = ">=21.0" Pygments = ">=2.13" requests = ">=2.25.0" snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] [[package]] name = "sphinx-immaterial" version = "0.11.7" description = "Adaptation of mkdocs-material theme for the Sphinx documentation system" optional = false python-versions = ">=3.8" files = [ {file = "sphinx_immaterial-0.11.7-py3-none-any.whl", hash = "sha256:2166b8272e1dbf2c2fd93c801c6db24e1d7168c5c7283159bf0e8ee713166c02"}, {file = "sphinx_immaterial-0.11.7.tar.gz", hash = "sha256:619075d7d5edd03bc92a1bbf9bab68675cf52cf43965b1d6607222881a15d88c"}, ] [package.dependencies] appdirs = "*" markupsafe = "*" pydantic = ">=2.0" pydantic-extra-types = "*" requests = "*" sphinx = ">=4.5" typing-extensions = "*" [package.extras] clang-format = ["clang-format"] cpp = ["libclang"] json = ["pyyaml"] jsonschema-validation = ["jsonschema"] keys = ["pymdown-extensions"] [[package]] name = "sphinxcontrib-applehelp" version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.8" files = [ {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.8" files = [ {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] [package.extras] test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] [[package]] name = "tox" version = "4.11.3" description = "tox is a generic virtualenv management and test command line tool" optional = false python-versions = ">=3.8" files = [ {file = "tox-4.11.3-py3-none-any.whl", hash = "sha256:599af5e5bb0cad0148ac1558a0b66f8fff219ef88363483b8d92a81e4246f28f"}, {file = "tox-4.11.3.tar.gz", hash = "sha256:5039f68276461fae6a9452a3b2c7295798f00a0e92edcd9a3b78ba1a73577951"}, ] [package.dependencies] cachetools = ">=5.3.1" chardet = ">=5.2" colorama = ">=0.4.6" filelock = ">=3.12.3" packaging = ">=23.1" platformdirs = ">=3.10" pluggy = ">=1.3" pyproject-api = ">=1.6.1" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} virtualenv = ">=20.24.3" [package.extras] docs = ["furo (>=2023.8.19)", "sphinx (>=7.2.4)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.24)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] testing = ["build[virtualenv] (>=0.10)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.1.1)", "devpi-process (>=1)", "diff-cover (>=7.7)", "distlib (>=0.3.7)", "flaky (>=3.7)", "hatch-vcs (>=0.3)", "hatchling (>=1.18)", "psutil (>=5.9.5)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-xdist (>=3.3.1)", "re-assert (>=1.1)", "time-machine (>=2.12)", "wheel (>=0.41.2)"] [[package]] name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" optional = false python-versions = ">=3.7" files = [ {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "urllib3" version = "2.0.6" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.7" files = [ {file = "urllib3-2.0.6-py3-none-any.whl", hash = "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2"}, {file = "urllib3-2.0.6.tar.gz", hash = "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" version = "20.24.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "zipp" version = "3.16.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ {file = "zipp-3.16.0-py3-none-any.whl", hash = "sha256:5dadc3ad0a1f825fe42ce1bce0f2fc5a13af2e6b2d386af5b0ff295bc0a287d3"}, {file = "zipp-3.16.0.tar.gz", hash = "sha256:1876cb065531855bbe83b6c489dcf69ecc28f1068d8e95959fe8bbc77774c941"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] docs = [] [metadata] lock-version = "2.0" python-versions = "^3.8.0" content-hash = "a438d6b1d1eba8ef9369a1a8808825ae640f0920b93aafec2406b710bf01bd03" python-openapi-openapi-spec-validator-1f3ff43/pyproject.toml000066400000000000000000000050061451222636700243730ustar00rootroot00000000000000[build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.coverage.run] branch = true source =["openapi_spec_validator"] [tool.coverage.xml] output = "reports/coverage.xml" [tool.mypy] files = "openapi_spec_validator" strict = true [[tool.mypy.overrides]] module = "jsonschema.*" ignore_missing_imports = true [[tool.mypy.overrides]] module = "jsonschema_specifications" ignore_missing_imports = true [[tool.mypy.overrides]] module = "lazy_object_proxy.*" ignore_missing_imports = true [tool.poetry] name = "openapi-spec-validator" version = "0.7.1" description = "OpenAPI 2.0 (aka Swagger) and OpenAPI 3 spec validator" authors = ["Artur Maciag "] license = "Apache-2.0" readme = "README.rst" repository = "https://github.com/python-openapi/openapi-spec-validator" keywords = ["openapi", "swagger", "schema"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Topic :: Software Development :: Libraries :: Python Modules", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Software Development :: Libraries" ] include = [ {path = "tests", format = "sdist"}, ] [tool.poetry.dependencies] jsonschema = "^4.18.0" openapi-schema-validator = "^0.6.0" python = "^3.8.0" importlib-resources = {version = ">=5.8,<7.0", python = "<3.9" } jsonschema-path = "^0.3.1" lazy-object-proxy = "^1.7.1" [tool.poetry.extras] docs = ["sphinx", "sphinx-immaterial"] [tool.poetry.dev-dependencies] pre-commit = "*" pytest = "^7.4.2" pytest-flake8 = "=1.1.1" pytest-cov = "^4.1.0" tox = "*" mypy = "^1.5" isort = "^5.11.5" black = "^23.9.1" flynt = "^1.0" deptry = "^0.12.0" flake8 = "^5.0.4" pyflakes = "^2.5.0" bump2version = "^1.0.1" [tool.poetry.scripts] openapi-spec-validator = "openapi_spec_validator.__main__:main" [tool.poetry.group.docs.dependencies] sphinx = ">=5.3,<8.0" sphinx-immaterial = "^0.11.0" [tool.pytest.ini_options] addopts = """ --capture=no --verbose --showlocals --junitxml=reports/junit.xml --cov=openapi_spec_validator --cov-report=term-missing --cov-report=xml """ markers = [ "network: marks tests which do need network-enabled environment", ] [tool.black] line-length = 79 [tool.isort] profile = "black" line_length = 79 force_single_line = true python-openapi-openapi-spec-validator-1f3ff43/tests/000077500000000000000000000000001451222636700226205ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/000077500000000000000000000000001451222636700251435ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/conftest.py000066400000000000000000000017321451222636700273450ustar00rootroot00000000000000from os import path from pathlib import PurePath from urllib.parse import urlunparse import pytest from jsonschema_path.handlers.file import FilePathHandler from jsonschema_path.handlers.urllib import UrllibHandler def spec_file_url(spec_file, schema="file"): directory = path.abspath(path.dirname(__file__)) full_path = path.join(directory, spec_file) return urlunparse((schema, None, full_path, None, None, None)) def spec_from_file(spec_file): directory = path.abspath(path.dirname(__file__)) path_full = path.join(directory, spec_file) uri = PurePath(path_full).as_uri() return FilePathHandler()(uri) def spec_from_url(spec_url): return UrllibHandler("http", "https")(spec_url) class Factory(dict): __getattr__ = dict.__getitem__ __setattr__ = dict.__setitem__ @pytest.fixture def factory(): return Factory( spec_file_url=spec_file_url, spec_from_file=spec_from_file, spec_from_url=spec_from_url, ) python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/000077500000000000000000000000001451222636700260545ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/empty.yaml000066400000000000000000000000021451222636700300660ustar00rootroot00000000000000{}python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v2.0/000077500000000000000000000000001451222636700265415ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v2.0/empty.yaml000066400000000000000000000000161451222636700305600ustar00rootroot00000000000000swagger: "2.0"python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v2.0/missing-reference.yaml000066400000000000000000000041311451222636700330310ustar00rootroot00000000000000swagger: "2.0" info: version: 1.0.0 title: Swagger Petstore license: name: MIT host: petstore.swagger.io basePath: /v1 schemes: - http consumes: - application/json produces: - application/json paths: /pets: get: summary: List all pets operationId: listPets tags: - pets parameters: - name: limit in: query description: How many items to return at one time (max 100) required: false type: integer format: int32 responses: 200: description: A paged array of pets headers: x-next: type: string description: A link to the next page of responses schema: $ref: 'definitions/Pets' default: description: unexpected error schema: $ref: '#/definitions/' post: summary: Create a pet operationId: createPets tags: - pets responses: '201': description: Null response default: description: unexpected error schema: $ref: '#/definitions/Error' /pets/{petId}: get: summary: Info for a specific pet operationId: showPetById tags: - pets parameters: - name: petId in: path required: true description: The id of the pet to retrieve type: string responses: '200': description: Expected response to a valid request schema: $ref: '#/definitions/Pets' default: description: unexpected error schema: $ref: '#/definitions/Error' definitions: Pet: required: - id - name properties: id: type: integer format: int64 name: type: string tag: type: string Pets: type: array items: $ref: '#/definitions/Pet' Error: required: - code - message properties: code: type: integer format: int32 message: type: stringpython-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v2.0/petstore.yaml000066400000000000000000000041411451222636700312720ustar00rootroot00000000000000swagger: "2.0" info: version: 1.0.0 title: Swagger Petstore license: name: MIT host: petstore.swagger.io basePath: /v1 schemes: - http consumes: - application/json produces: - application/json paths: /pets: get: summary: List all pets operationId: listPets tags: - pets parameters: - name: limit in: query description: How many items to return at one time (max 100) required: false type: integer format: int32 responses: 200: description: A paged array of pets headers: x-next: type: string description: A link to the next page of responses schema: $ref: '#/definitions/Pets' default: description: unexpected error schema: $ref: '#/definitions/Error' post: summary: Create a pet operationId: createPets tags: - pets responses: '201': description: Null response default: description: unexpected error schema: $ref: '#/definitions/Error' /pets/{petId}: get: summary: Info for a specific pet operationId: showPetById tags: - pets parameters: - name: petId in: path required: true description: The id of the pet to retrieve type: string responses: '200': description: Expected response to a valid request schema: $ref: '#/definitions/Pets' default: description: unexpected error schema: $ref: '#/definitions/Error' definitions: Pet: required: - id - name properties: id: type: integer format: int64 name: type: string tag: type: string Pets: type: array items: $ref: '#/definitions/Pet' Error: required: - code - message properties: code: type: integer format: int32 message: type: string python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/000077500000000000000000000000001451222636700265425ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/empty.yaml000066400000000000000000000000201451222636700305540ustar00rootroot00000000000000openapi: "3.0.0"python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/missing-description.yaml000066400000000000000000000004131451222636700334160ustar00rootroot00000000000000--- openapi: 3.0.0 info: title: test description: test version: 0.0.1 paths: "/": get: description: Get the API root responses: 200: content: application/json: schema: type: string python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/parent-reference/000077500000000000000000000000001451222636700317675ustar00rootroot00000000000000common.yaml000066400000000000000000000004621451222636700340660ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/parent-referenceschemas: Model: type: object required: - id properties: id: type: integer format: int32 Error: type: object required: - code - message properties: code: type: integer format: int32 message: type: stringopenapi.yaml000066400000000000000000000016521451222636700342330ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/parent-referenceopenapi: "3.0.0" info: version: 1.0.0 title: OpenAPI Petstore license: name: MIT servers: - url: http://petstore.swagger.io/v1 paths: /pets: get: summary: List all pets operationId: listPets tags: - pets parameters: - $ref: "recursive.yaml#/parameters/RecursiveReference" - name: limit in: query description: How many items to return at one time (max 100) required: false schema: type: integer format: int32 responses: '200': description: Expected response to a valid request content: application/json: schema: $ref: "spec/components.yaml#/schemas/Pet" default: description: unexpected error content: application/json: schema: $ref: "common.yaml#/schemas/Error" recursive.yaml000066400000000000000000000001361451222636700346030ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/parent-referenceparameters: RecursiveReference: $ref : "recursive2.yaml#/parameters/RecursiveReference" recursive2.yaml000066400000000000000000000002371451222636700346670ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/parent-referenceparameters: RecursiveReference: name: sampleParameter in: query description: Tests recursion required: false schema: type: boolean python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/parent-reference/spec/000077500000000000000000000000001451222636700327215ustar00rootroot00000000000000components.yaml000066400000000000000000000003061451222636700357120ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/parent-reference/specschemas: Pet: type: object allOf: - $ref: "../common.yaml#/schemas/Model" required: - name properties: name: type: string tag: type: string python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/000077500000000000000000000000001451222636700322115ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/common/000077500000000000000000000000001451222636700335015ustar00rootroot00000000000000schemas/000077500000000000000000000000001451222636700350455ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/commonError.yaml000066400000000000000000000001771451222636700370270ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/common/schemastype: object required: - code - message properties: code: type: integer format: int32 message: type: stringpython-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/spec/000077500000000000000000000000001451222636700331435ustar00rootroot00000000000000openapi.yaml000066400000000000000000000037651451222636700354160ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/specopenapi: "3.0.0" info: version: 1.0.0 title: Swagger Petstore license: name: MIT servers: - url: http://petstore.swagger.io/v1 paths: /pets: get: summary: List all pets operationId: listPets tags: - pets parameters: - name: limit in: query description: How many items to return at one time (max 100) required: false schema: type: integer format: int32 responses: '200': description: An paged array of pets headers: x-next: description: A link to the next page of responses schema: type: string content: application/json: schema: $ref: "schemas/Pets.yaml" default: description: unexpected error content: application/json: schema: $ref: "../common/schemas/Error.yaml" post: summary: Create a pet operationId: createPets tags: - pets responses: '201': description: Null response default: description: unexpected error content: application/json: schema: $ref: "../common/schemas/Error.yaml" /pets/{petId}: get: summary: Info for a specific pet operationId: showPetById tags: - pets parameters: - name: petId in: path required: true description: The id of the pet to retrieve schema: type: string responses: '200': description: Expected response to a valid request content: application/json: schema: $ref: "schemas/Pets.yaml" default: description: unexpected error content: application/json: schema: $ref: "../common/schemas/Error.yaml"schemas/000077500000000000000000000000001451222636700345075ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/specPet.yaml000066400000000000000000000002001451222636700361130ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/spec/schemasrequired: - id - name properties: id: type: integer format: int64 name: type: string tag: type: stringPets.yaml000066400000000000000000000000451451222636700363050ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore-separate/spec/schemastype: array items: $ref: "Pet.yaml"python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/petstore.yaml000066400000000000000000000050131451222636700312720ustar00rootroot00000000000000openapi: "3.0.0" info: version: 1.0.0 title: Swagger Petstore license: name: MIT servers: - url: http://petstore.swagger.io/v1 paths: /pets: get: summary: List all pets operationId: listPets tags: - pets parameters: - name: limit in: query description: How many items to return at one time (max 100) required: false schema: type: integer format: int32 responses: 200: description: An paged array of pets headers: x-next: description: A link to the next page of responses schema: type: string content: application/json: schema: $ref: "#/components/schemas/Pets" default: description: unexpected error content: application/json: schema: $ref: "#/components/schemas/Error" post: summary: Create a pet operationId: createPets tags: - pets responses: '201': description: Null response default: description: unexpected error content: application/json: schema: $ref: "#/components/schemas/Error" /pets/{petId}: get: summary: Info for a specific pet operationId: showPetById tags: - pets parameters: - name: petId in: path required: true description: The id of the pet to retrieve schema: type: string responses: '200': description: Expected response to a valid request content: application/json: schema: $ref: "#/components/schemas/Pets" default: description: unexpected error content: application/json: schema: $ref: "#/components/schemas/Error" components: schemas: Pet: required: - id - name properties: id: type: integer format: int64 name: type: string tag: type: string $ref: type: string Pets: type: array items: $ref: "#/components/schemas/Pet" Error: required: - code - message properties: code: type: integer format: int32 message: type: stringproperty-missing-reference.yaml000066400000000000000000000004271451222636700346410ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0openapi: 3.0.0 info: version: '1.0.0' title: 'Some Schema' paths: {} components: schemas: SomeDataType: type: object properties: id: type: integer prop1: $ref: '' prop2: type: stringpython-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/property-recursive.yaml000066400000000000000000000004471451222636700333240ustar00rootroot00000000000000openapi: 3.0.0 info: version: '1.0.0' title: 'Some Schema' paths: {} components: schemas: SomeDataType: type: object properties: id: type: integer prop1: $ref: '#/components/schemas/SomeDataType' prop2: type: stringpython-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.0/read-only-write-only.yaml000066400000000000000000000016461451222636700334360ustar00rootroot00000000000000openapi: "3.0.0" info: title: Specification Containing readOnly version: "0.1" paths: /users: post: operationId: createUser requestBody: description: Post data for creating a user required: true content: application/json: schema: $ref: '#/components/schemas/User' responses: default: description: Create a user content: application/json: schema: $ref: '#/components/schemas/User' components: schemas: User: x-model: User type: object required: - id - name properties: id: type: integer format: int32 readOnly: true default: 1 name: type: string hidden: type: boolean writeOnly: true default: truepython-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.1/000077500000000000000000000000001451222636700265435ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/data/v3.1/petstore.yaml000066400000000000000000000052361451222636700313020ustar00rootroot00000000000000openapi: "3.1.0" info: version: 1.0.0 title: Swagger Petstore license: name: MIT License identifier: MIT servers: - url: http://petstore.swagger.io/v1 paths: /pets: get: summary: List all pets operationId: listPets tags: - pets parameters: - name: limit in: query description: How many items to return at one time (max 100) required: false schema: type: integer format: int32 responses: 200: description: An paged array of pets headers: x-next: description: A link to the next page of responses schema: type: string content: application/json: schema: $ref: "#/components/schemas/Pets" default: description: unexpected error content: application/json: schema: $ref: "#/components/schemas/Error" post: summary: Create a pet operationId: createPets tags: - pets responses: '201': description: Null response default: description: unexpected error content: application/json: schema: $ref: "#/components/schemas/Error" /pets/{petId}: $ref: "#/components/pathItems/PetPath" components: schemas: Pet: required: - id - name properties: id: type: integer format: int64 name: type: string tag: type: string $ref: type: string Pets: type: array items: $ref: "#/components/schemas/Pet" Error: required: - code - message properties: code: type: integer format: int32 message: type: string pathItems: PetPath: get: summary: Info for a specific pet operationId: showPetById tags: - pets parameters: - name: petId in: path required: true description: The id of the pet to retrieve schema: type: string responses: '200': description: Expected response to a valid request content: application/json: schema: $ref: "#/components/schemas/Pets" default: description: unexpected error content: application/json: schema: $ref: "#/components/schemas/Error"python-openapi-openapi-spec-validator-1f3ff43/tests/integration/test_main.py000066400000000000000000000127711451222636700275100ustar00rootroot00000000000000from io import StringIO from unittest import mock import pytest from openapi_spec_validator.__main__ import main def test_schema_v2_detect(capsys): """Test schema v2 is detected""" testargs = ["./tests/integration/data/v2.0/petstore.yaml"] main(testargs) out, err = capsys.readouterr() assert not err assert "./tests/integration/data/v2.0/petstore.yaml: OK\n" in out def test_schema_v31_detect(capsys): """Test schema v3.1 is detected""" testargs = ["./tests/integration/data/v3.1/petstore.yaml"] main(testargs) out, err = capsys.readouterr() assert not err assert "./tests/integration/data/v3.1/petstore.yaml: OK\n" in out def test_schema_v31(capsys): """No errors when calling proper v3.1 file.""" testargs = [ "--schema", "3.1.0", "./tests/integration/data/v3.1/petstore.yaml", ] main(testargs) out, err = capsys.readouterr() assert not err assert "./tests/integration/data/v3.1/petstore.yaml: OK\n" in out def test_schema_v30(capsys): """No errors when calling proper v3.0 file.""" testargs = [ "--schema", "3.0.0", "./tests/integration/data/v3.0/petstore.yaml", ] main(testargs) out, err = capsys.readouterr() assert not err assert "./tests/integration/data/v3.0/petstore.yaml: OK\n" in out def test_schema_v2(capsys): """No errors when calling with proper v2 file.""" testargs = [ "--schema", "2.0", "./tests/integration/data/v2.0/petstore.yaml", ] main(testargs) out, err = capsys.readouterr() assert not err assert "./tests/integration/data/v2.0/petstore.yaml: OK\n" in out def test_many(capsys): """No errors when calling with proper v2 and v3 files.""" testargs = [ "./tests/integration/data/v2.0/petstore.yaml", "./tests/integration/data/v3.0/petstore.yaml", ] main(testargs) out, err = capsys.readouterr() assert not err assert "./tests/integration/data/v2.0/petstore.yaml: OK\n" in out assert "./tests/integration/data/v3.0/petstore.yaml: OK\n" in out def test_errors_on_missing_description_best(capsys): """An error is obviously printed given an empty schema.""" testargs = [ "./tests/integration/data/v3.0/missing-description.yaml", "--schema=3.0.0", ] with pytest.raises(SystemExit): main(testargs) out, err = capsys.readouterr() assert not err assert ( "./tests/integration/data/v3.0/missing-description.yaml: Validation Error:" in out ) assert "Failed validating" in out assert "'description' is a required property" in out assert "'$ref' is a required property" not in out assert "1 more subschemas errors" in out def test_errors_on_missing_description_full(capsys): """An error is obviously printed given an empty schema.""" testargs = [ "./tests/integration/data/v3.0/missing-description.yaml", "--errors=all", "--schema=3.0.0", ] with pytest.raises(SystemExit): main(testargs) out, err = capsys.readouterr() assert not err assert ( "./tests/integration/data/v3.0/missing-description.yaml: Validation Error:" in out ) assert "Failed validating" in out assert "'description' is a required property" in out assert "'$ref' is a required property" in out assert "1 more subschema error" not in out def test_schema_unknown(capsys): """Errors on running with unknown schema.""" testargs = [ "--schema", "x.x", "./tests/integration/data/v2.0/petstore.yaml", ] with pytest.raises(SystemExit): main(testargs) out, err = capsys.readouterr() assert "error: argument --schema" in err assert not out def test_validation_error(capsys): """SystemExit on running with ValidationError.""" testargs = [ "--schema", "3.0.0", "./tests/integration/data/v2.0/petstore.yaml", ] with pytest.raises(SystemExit): main(testargs) out, err = capsys.readouterr() assert not err assert ( "./tests/integration/data/v2.0/petstore.yaml: Validation Error:" in out ) assert "Failed validating" in out assert "'openapi' is a required property" in out @mock.patch( "openapi_spec_validator.__main__.OpenAPIV30SpecValidator.validate", side_effect=Exception, ) def test_unknown_error(m_validate, capsys): """SystemExit on running with unknown error.""" testargs = [ "--schema", "3.0.0", "./tests/integration/data/v2.0/petstore.yaml", ] with pytest.raises(SystemExit): main(testargs) out, err = capsys.readouterr() assert not err assert "./tests/integration/data/v2.0/petstore.yaml: Error:" in out def test_nonexisting_file(capsys): """Calling with non-existing file should sys.exit.""" testargs = ["i_dont_exist.yaml"] with pytest.raises(SystemExit): main(testargs) out, err = capsys.readouterr() assert not err assert "No such file: i_dont_exist.yaml\n" in out def test_schema_stdin(capsys): """Test schema from STDIN""" spes_path = "./tests/integration/data/v3.0/petstore.yaml" with open(spes_path) as spec_file: spec_lines = spec_file.readlines() spec_io = StringIO("".join(spec_lines)) testargs = ["--schema", "3.0.0", "-"] with mock.patch("openapi_spec_validator.__main__.sys.stdin", spec_io): main(testargs) out, err = capsys.readouterr() assert not err assert "stdin: OK\n" in out python-openapi-openapi-spec-validator-1f3ff43/tests/integration/test_shortcuts.py000066400000000000000000000127541451222636700306230ustar00rootroot00000000000000import pytest from openapi_spec_validator import OpenAPIV2SpecValidator from openapi_spec_validator import OpenAPIV30SpecValidator from openapi_spec_validator import openapi_v2_spec_validator from openapi_spec_validator import openapi_v30_spec_validator from openapi_spec_validator import validate from openapi_spec_validator import validate_spec from openapi_spec_validator import validate_spec_url from openapi_spec_validator import validate_url from openapi_spec_validator.validation.exceptions import OpenAPIValidationError from openapi_spec_validator.validation.exceptions import ValidatorDetectError class TestValidateSpec: def test_spec_schema_version_not_detected(self): spec = {} with pytest.raises(ValidatorDetectError): validate(spec) class TestLocalValidateSpecUrl: def test_spec_schema_version_not_detected(self, factory): spec_path = "data/empty.yaml" spec_url = factory.spec_file_url(spec_path) with pytest.raises(ValidatorDetectError): validate_url(spec_url) class TestLiocalValidatev2Spec: LOCAL_SOURCE_DIRECTORY = "data/v2.0/" def local_test_suite_file_path(self, test_file): return f"{self.LOCAL_SOURCE_DIRECTORY}{test_file}" @pytest.mark.parametrize( "spec_file", [ "petstore.yaml", ], ) def test_valid(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) validate(spec) validate(spec, cls=OpenAPIV2SpecValidator) with pytest.warns(DeprecationWarning): validate_spec(spec, validator=openapi_v2_spec_validator) @pytest.mark.parametrize( "spec_file", [ "empty.yaml", ], ) def test_falied(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) with pytest.raises(OpenAPIValidationError): validate(spec, cls=OpenAPIV2SpecValidator) with pytest.warns(DeprecationWarning): with pytest.raises(OpenAPIValidationError): validate_spec(spec, validator=openapi_v2_spec_validator) class TestLocalValidatev30Spec: LOCAL_SOURCE_DIRECTORY = "data/v3.0/" def local_test_suite_file_path(self, test_file): return f"{self.LOCAL_SOURCE_DIRECTORY}{test_file}" @pytest.mark.parametrize( "spec_file", [ "petstore.yaml", ], ) def test_valid(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) spec_url = factory.spec_file_url(spec_path) validate(spec) with pytest.warns(DeprecationWarning): validate_spec(spec, spec_url=spec_url) validate(spec, cls=OpenAPIV30SpecValidator) with pytest.warns(DeprecationWarning): validate_spec(spec, validator=openapi_v30_spec_validator) @pytest.mark.parametrize( "spec_file", [ "empty.yaml", ], ) def test_falied(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) with pytest.raises(OpenAPIValidationError): validate(spec, cls=OpenAPIV30SpecValidator) with pytest.warns(DeprecationWarning): with pytest.raises(OpenAPIValidationError): validate_spec(spec, validator=openapi_v30_spec_validator) @pytest.mark.network class TestRemoteValidatev2SpecUrl: REMOTE_SOURCE_URL = ( "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/" ) def remote_test_suite_file_path(self, test_file): return f"{self.REMOTE_SOURCE_URL}{test_file}" @pytest.mark.parametrize( "spec_file", [ "f25a1d44cff9669703257173e562376cc5bd0ec6/examples/v2.0/" "yaml/petstore.yaml", "f25a1d44cff9669703257173e562376cc5bd0ec6/examples/v2.0/" "yaml/api-with-examples.yaml", "f25a1d44cff9669703257173e562376cc5bd0ec6/examples/v2.0/" "yaml/petstore-expanded.yaml", ], ) def test_valid(self, spec_file): spec_url = self.remote_test_suite_file_path(spec_file) validate_url(spec_url) validate_url(spec_url, cls=OpenAPIV2SpecValidator) with pytest.warns(DeprecationWarning): validate_spec_url(spec_url) validate_spec_url(spec_url, validator=openapi_v2_spec_validator) @pytest.mark.network class TestRemoteValidatev30SpecUrl: REMOTE_SOURCE_URL = ( "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/" ) def remote_test_suite_file_path(self, test_file): return f"{self.REMOTE_SOURCE_URL}{test_file}" @pytest.mark.parametrize( "spec_file", [ "f75f8486a1aae1a7ceef92fbc63692cb2556c0cd/examples/v3.0/" "petstore.yaml", "f75f8486a1aae1a7ceef92fbc63692cb2556c0cd/examples/v3.0/" "api-with-examples.yaml", "970566d5ca236a5ce1a02fb7d617fdbd07df88db/examples/v3.0/" "api-with-examples.yaml", ], ) def test_valid(self, spec_file): spec_url = self.remote_test_suite_file_path(spec_file) validate_url(spec_url) validate_url(spec_url, cls=OpenAPIV30SpecValidator) with pytest.warns(DeprecationWarning): validate_spec_url(spec_url, validator=openapi_v30_spec_validator) python-openapi-openapi-spec-validator-1f3ff43/tests/integration/test_versions.py000066400000000000000000000024631451222636700304310ustar00rootroot00000000000000import pytest from openapi_spec_validator.versions import consts as versions from openapi_spec_validator.versions.exceptions import OpenAPIVersionNotFound from openapi_spec_validator.versions.shortcuts import get_spec_version class TestGetSpecVersion: def test_no_keyword(self): spec = {} with pytest.raises(OpenAPIVersionNotFound): get_spec_version(spec) @pytest.mark.parametrize("keyword", ["swagger", "openapi"]) @pytest.mark.parametrize("version", ["x.y.z", "xyz2.0.0", "2.xyz0.0"]) def test_invalid(self, keyword, version): spec = { keyword: version, } with pytest.raises(OpenAPIVersionNotFound): get_spec_version(spec) @pytest.mark.parametrize( "keyword,version,expected", [ ("swagger", "2.0", versions.OPENAPIV2), ("openapi", "3.0.0", versions.OPENAPIV30), ("openapi", "3.0.1", versions.OPENAPIV30), ("openapi", "3.0.2", versions.OPENAPIV30), ("openapi", "3.0.3", versions.OPENAPIV30), ("openapi", "3.1.0", versions.OPENAPIV31), ], ) def test_valid(self, keyword, version, expected): spec = { keyword: version, } result = get_spec_version(spec) assert result == expected python-openapi-openapi-spec-validator-1f3ff43/tests/integration/validation/000077500000000000000000000000001451222636700272755ustar00rootroot00000000000000python-openapi-openapi-spec-validator-1f3ff43/tests/integration/validation/test_exceptions.py000066400000000000000000000400251451222636700330700ustar00rootroot00000000000000from openapi_spec_validator import OpenAPIV2SpecValidator from openapi_spec_validator import OpenAPIV30SpecValidator from openapi_spec_validator.validation.exceptions import ( DuplicateOperationIDError, ) from openapi_spec_validator.validation.exceptions import ExtraParametersError from openapi_spec_validator.validation.exceptions import OpenAPIValidationError from openapi_spec_validator.validation.exceptions import ( UnresolvableParameterError, ) class TestSpecValidatorIterErrors: def test_empty(self): spec = {} errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list[0].__class__ == OpenAPIValidationError assert errors_list[0].message == "'openapi' is a required property" assert errors_list[1].__class__ == OpenAPIValidationError assert errors_list[1].message == "'info' is a required property" assert errors_list[2].__class__ == OpenAPIValidationError assert errors_list[2].message == "'paths' is a required property" def test_info_empty(self): spec = { "openapi": "3.0.0", "info": {}, "paths": {}, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list[0].__class__ == OpenAPIValidationError assert errors_list[0].message == "'title' is a required property" def test_minimalistic(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": {}, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list == [] def test_same_parameters_names(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": { "/test/{param1}": { "parameters": [ { "name": "param1", "in": "query", "schema": { "type": "integer", }, }, { "name": "param1", "in": "path", "schema": { "type": "integer", }, "required": True, }, ], }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list == [] def test_same_operation_ids(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": { "/test": { "get": { "operationId": "operation1", "responses": { "default": { "description": "default response", }, }, }, "post": { "operationId": "operation1", "responses": { "default": { "description": "default response", }, }, }, }, "/test2": { "get": { "operationId": "operation1", "responses": { "default": { "description": "default response", }, }, }, }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert len(errors_list) == 2 assert errors_list[0].__class__ == DuplicateOperationIDError assert errors_list[1].__class__ == DuplicateOperationIDError def test_allow_allof_required_no_properties(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": {}, "components": { "schemas": { "Credit": { "type": "object", "properties": { "clientId": {"type": "string"}, }, }, "CreditCreate": { "allOf": [ {"$ref": "#/components/schemas/Credit"}, {"required": ["clientId"]}, ] }, }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list == [] def test_allow_allof_when_required_is_linked_to_the_parent_object(self): spec = { "openapi": "3.0.1", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": {}, "components": { "schemas": { "Address": { "type": "object", "properties": { "SubdivisionCode": { "type": "string", "description": "State or region", }, "Town": { "type": "string", "description": "Town or city", }, "CountryCode": { "type": "string", }, }, }, "AddressCreation": { "required": ["CountryCode", "Town"], "type": "object", "allOf": [{"$ref": "#/components/schemas/Address"}], }, } }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list == [] def test_extra_parameters_in_required(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": {}, "components": { "schemas": { "testSchema": { "type": "object", "required": [ "testparam1", ], } }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list[0].__class__ == ExtraParametersError assert errors_list[0].message == ( "Required list has not defined properties: ['testparam1']" ) def test_undocumented_parameter(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": { "/test/{param1}/{param2}": { "get": { "responses": { "default": { "description": "default response", }, }, }, "parameters": [ { "name": "param1", "in": "path", "schema": { "type": "integer", }, "required": True, }, ], }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list[0].__class__ == UnresolvableParameterError assert errors_list[0].message == ( "Path parameter 'param2' for 'get' operation in " "'/test/{param1}/{param2}' was not resolved" ) def test_default_value_wrong_type(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": {}, "components": { "schemas": { "test": { "type": "integer", "default": "invaldtype", }, }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert len(errors_list) == 1 assert errors_list[0].__class__ == OpenAPIValidationError assert errors_list[0].message == ( "'invaldtype' is not of type 'integer'" ) def test_parameter_default_value_wrong_type(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": { "/test/{param1}": { "get": { "responses": { "default": { "description": "default response", }, }, }, "parameters": [ { "name": "param1", "in": "path", "schema": { "type": "integer", "default": "invaldtype", }, "required": True, }, ], }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert len(errors_list) == 1 assert errors_list[0].__class__ == OpenAPIValidationError assert errors_list[0].message == ( "'invaldtype' is not of type 'integer'" ) def test_parameter_default_value_wrong_type_swagger(self): spec = { "swagger": "2.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": { "/test/": { "get": { "responses": { "200": { "description": "OK", "schema": {"type": "object"}, }, }, "parameters": [ { "name": "param1", "in": "query", "type": "integer", "default": "invaldtype", }, ], }, }, }, } errors = OpenAPIV2SpecValidator(spec).iter_errors() errors_list = list(errors) assert len(errors_list) == 1 assert errors_list[0].__class__ == OpenAPIValidationError assert errors_list[0].message == ( "'invaldtype' is not of type 'integer'" ) def test_parameter_default_value_with_reference(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": { "/test/": { "get": { "responses": { "default": { "description": "default response", }, }, "parameters": [ { "name": "param1", "in": "query", "schema": { "allOf": [ { "$ref": "#/components/schemas/type", } ], "default": 1, }, }, ], }, }, }, "components": { "schemas": { "type": { "type": "integer", } }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list == [] def test_parameter_custom_format_checker_not_found(self): spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": { "/test/": { "get": { "responses": { "default": { "description": "default response", }, }, "parameters": [ { "name": "param1", "in": "query", "schema": { "type": "string", "format": "custom", "default": "customvalue", }, }, ], }, }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert errors_list == [] def test_parameter_default_value_custom_format_invalid(self): from openapi_schema_validator import oas30_format_checker @oas30_format_checker.checks("custom") def validate(to_validate) -> bool: return to_validate == "valid" spec = { "openapi": "3.0.0", "info": { "title": "Test Api", "version": "0.0.1", }, "paths": { "/test/": { "get": { "responses": { "default": { "description": "default response", }, }, "parameters": [ { "name": "param1", "in": "query", "schema": { "type": "string", "format": "custom", "default": "invalid", }, }, ], }, }, }, } errors = OpenAPIV30SpecValidator(spec).iter_errors() errors_list = list(errors) assert len(errors_list) == 1 assert errors_list[0].__class__ == OpenAPIValidationError assert errors_list[0].message == ("'invalid' is not a 'custom'") python-openapi-openapi-spec-validator-1f3ff43/tests/integration/validation/test_validators.py000066400000000000000000000144531451222636700330650ustar00rootroot00000000000000import pytest from jsonschema_path import SchemaPath from referencing.exceptions import Unresolvable from openapi_spec_validator import OpenAPIV2SpecValidator from openapi_spec_validator import OpenAPIV30SpecValidator from openapi_spec_validator import OpenAPIV31SpecValidator from openapi_spec_validator.validation.exceptions import OpenAPIValidationError class TestLocalOpenAPIv2Validator: LOCAL_SOURCE_DIRECTORY = "data/v2.0/" def local_test_suite_file_path(self, test_file): return f"{self.LOCAL_SOURCE_DIRECTORY}{test_file}" @pytest.mark.parametrize( "spec_file", [ "petstore.yaml", ], ) def test_valid(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) spec_url = factory.spec_file_url(spec_path) schema_path = SchemaPath.from_dict( spec, base_uri=spec_url, ) validator = OpenAPIV2SpecValidator(schema_path) validator.validate() assert validator.is_valid() == True @pytest.mark.parametrize( "spec_file", [ "empty.yaml", ], ) def test_validation_failed(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) spec_url = factory.spec_file_url(spec_path) validator = OpenAPIV2SpecValidator(spec, base_uri=spec_url) with pytest.raises(OpenAPIValidationError): validator.validate() assert validator.is_valid() == False @pytest.mark.parametrize( "spec_file", [ "missing-reference.yaml", ], ) def test_ref_failed(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) spec_url = factory.spec_file_url(spec_path) with pytest.raises(Unresolvable): OpenAPIV2SpecValidator(spec, base_uri=spec_url).validate() class TestLocalOpenAPIv30Validator: LOCAL_SOURCE_DIRECTORY = "data/v3.0/" def local_test_suite_file_path(self, test_file): return f"{self.LOCAL_SOURCE_DIRECTORY}{test_file}" @pytest.mark.parametrize( "spec_file", [ "petstore.yaml", "petstore-separate/spec/openapi.yaml", "parent-reference/openapi.yaml", "property-recursive.yaml", "read-only-write-only.yaml", ], ) def test_valid(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) spec_url = factory.spec_file_url(spec_path) validator = OpenAPIV30SpecValidator(spec, base_uri=spec_url) validator.validate() assert validator.is_valid() == True @pytest.mark.parametrize( "spec_file", [ "empty.yaml", ], ) def test_failed(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) spec_url = factory.spec_file_url(spec_path) validator = OpenAPIV30SpecValidator(spec, base_uri=spec_url) with pytest.raises(OpenAPIValidationError): validator.validate() assert validator.is_valid() == False @pytest.mark.parametrize( "spec_file", [ "property-missing-reference.yaml", ], ) def test_ref_failed(self, factory, spec_file): spec_path = self.local_test_suite_file_path(spec_file) spec = factory.spec_from_file(spec_path) spec_url = factory.spec_file_url(spec_path) with pytest.raises(Unresolvable): OpenAPIV30SpecValidator(spec, base_uri=spec_url).validate() @pytest.mark.network class TestRemoteOpenAPIv30Validator: REMOTE_SOURCE_URL = ( "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/" ) def remote_test_suite_file_path(self, test_file): return f"{self.REMOTE_SOURCE_URL}{test_file}" @pytest.mark.parametrize( "spec_file", [ "f75f8486a1aae1a7ceef92fbc63692cb2556c0cd/examples/v3.0/" "petstore.yaml", "f75f8486a1aae1a7ceef92fbc63692cb2556c0cd/examples/v3.0/" "api-with-examples.yaml", "970566d5ca236a5ce1a02fb7d617fdbd07df88db/examples/v3.0/" "api-with-examples.yaml", ], ) def test_valid(self, factory, spec_file): spec_url = self.remote_test_suite_file_path(spec_file) spec = factory.spec_from_url(spec_url) OpenAPIV30SpecValidator(spec, base_uri=spec_url).validate() @pytest.mark.network class TestRemoteOpenAPIv31Validator: REMOTE_SOURCE_URL = ( "https://raw.githubusercontent.com/" "OAI/OpenAPI-Specification/" "d9ac75b00c8bf405c2c90cfa9f20370564371dec/" ) def remote_test_suite_file_path(self, test_file): return f"{self.REMOTE_SOURCE_URL}{test_file}" @pytest.mark.parametrize( "spec_file", [ "comp_pathitems.yaml", "info_summary.yaml", "license_identifier.yaml", "mega.yaml", "minimal_comp.yaml", "minimal_hooks.yaml", "minimal_paths.yaml", "path_no_response.yaml", "path_var_empty_pathitem.yaml", "schema.yaml", "servers.yaml", "valid_schema_types.yaml", ], ) def test_valid(self, factory, spec_file): spec_url = self.remote_test_suite_file_path( f"tests/v3.1/pass/{spec_file}" ) spec = factory.spec_from_url(spec_url) OpenAPIV31SpecValidator(spec, base_uri=spec_url).validate() @pytest.mark.parametrize( "spec_file", [ "invalid_schema_types.yaml", "no_containers.yaml", "server_enum_empty.yaml", "servers.yaml", "unknown_container.yaml", ], ) def test_failed(self, factory, spec_file): spec_url = self.remote_test_suite_file_path( f"tests/v3.1/fail/{spec_file}" ) spec = factory.spec_from_url(spec_url) with pytest.raises(OpenAPIValidationError): OpenAPIV31SpecValidator(spec, base_uri=spec_url).validate() python-openapi-openapi-spec-validator-1f3ff43/tox.ini000066400000000000000000000002441451222636700227710ustar00rootroot00000000000000[tox] envlist = {py37,py38,py39,py310}-{default,simplejson} [testenv] deps = -rrequirements.txt -rrequirements_dev.txt commands = python setup.py test