diff --git a/.editorconfig b/.editorconfig index 30e6922..5163372 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,7 +10,7 @@ trim_trailing_whitespace = true [{.babelrc,.compressrc,.eslintrc,.linguirc}] indent_size = 2 -[*.{css,cfg,html,ini,j2,js,json,md,service,toml,yaml,yml,xml}] +[*.{css,cfg,gql,html,ini,j2,js,json,jsx,md,service,toml,ts,tsx,yaml,yml,xml}] indent_size = 2 [*.{nginx,nginx.j2,py,rst,sh}] diff --git a/.flake8 b/.flake8 index be72b6e..e53ba58 100644 --- a/.flake8 +++ b/.flake8 @@ -3,12 +3,9 @@ ban-relative-imports = true classmethod-decorators = classmethod validator -extend-ignore = E501, PIE786 -extend-select = TC, TC1 +extend-ignore = + E501 + PIE786 inline-quotes = double max-complexity = 15 multiline-quotes = double -per-file-ignores = - */models.py: TC - */models/*.py: TC -type-checking-strict = true diff --git a/.github/actions/install_badabump/action.yml b/.github/actions/install_badabump/action.yml index d3d0998..8a7b0bc 100644 --- a/.github/actions/install_badabump/action.yml +++ b/.github/actions/install_badabump/action.yml @@ -12,7 +12,7 @@ runs: steps: - id: "python" name: "Install Python" - uses: "actions/setup-python@v4.6.1" + uses: "actions/setup-python@v5.1.1" with: python-version-file: ".python-version" diff --git a/.github/actions/install_python_and_poetry/action.yml b/.github/actions/install_python_and_poetry/action.yml index 418635d..016c1ac 100644 --- a/.github/actions/install_python_and_poetry/action.yml +++ b/.github/actions/install_python_and_poetry/action.yml @@ -18,7 +18,7 @@ inputs: poetry-version: description: "Poetry version to use" required: false - default: "1.5.0" + default: "1.8.3" outputs: python-path: @@ -39,7 +39,7 @@ runs: steps: - id: "python" name: "Install Python" - uses: "actions/setup-python@v4.6.1" + uses: "actions/setup-python@v5.1.1" with: python-version: "${{ inputs.python-version }}" python-version-file: "${{ inputs.python-version-file }}" @@ -49,7 +49,7 @@ runs: run: "pipx install --python='${{ steps.python.outputs.python-path }}' poetry==${{ inputs.poetry-version }}" - name: "Cache venv" - uses: "actions/cache@v3.3.1" + uses: "actions/cache@v4.0.2" with: path: "./.venv/" key: "venv-${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ hashFiles('poetry.lock') }}${{ inputs.cache-key-suffix }}" diff --git a/.github/actions/run_pre_commit/action.yml b/.github/actions/run_pre_commit/action.yml index 3091a75..50180f1 100644 --- a/.github/actions/run_pre_commit/action.yml +++ b/.github/actions/run_pre_commit/action.yml @@ -14,10 +14,10 @@ runs: shell: "bash" - name: "Cache mypy" - uses: "actions/cache@v3.3.1" + uses: "actions/cache@v4.0.2" with: path: "./.mypy_cache/" key: "mypy-${{ runner.os }}-${{ inputs.python-version }}" - name: "Run pre-commit" - uses: "pre-commit/action@v3.0.0" + uses: "pre-commit/action@v3.0.1" diff --git a/.github/actions/run_tox/action.yml b/.github/actions/run_tox/action.yml index 46016d2..833b81e 100644 --- a/.github/actions/run_tox/action.yml +++ b/.github/actions/run_tox/action.yml @@ -13,12 +13,12 @@ inputs: tox-version: description: "Tox version to use" required: false - default: "4.5.2" + default: "4.18.0" tox-gh-actions-version: description: "Tox GitHub Actions plugin version to use" required: false - default: "3.1.1" + default: "3.2.0" use-coveralls: description: "Send coverage to Coveralls" @@ -41,7 +41,7 @@ runs: shell: "bash" - name: "Cache tox" - uses: "actions/cache@v3.3.1" + uses: "actions/cache@v4.0.2" with: path: ".tox/" key: "tox-${{ inputs.python-version }}" diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e34d820..6aec5aa 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,6 +15,9 @@ updates: - "dependencies" allow: - dependency-type: "direct" + groups: + dev-dependencies: + dependency-type: "development" - package-ecosystem: "github-actions" directory: "/" @@ -30,3 +33,6 @@ updates: - "build" - "ci" - "dependencies" + groups: + ci-dependencies: + patterns: ["*"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 489176a..6b5a466 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: runs-on: "${{ matrix.os }}" steps: - - uses: "actions/checkout@v3.5.2" + - uses: "actions/checkout@v4.1.7" - id: "python_and_poetry" uses: "./.github/actions/install_python_and_poetry" @@ -53,7 +53,7 @@ jobs: test: strategy: matrix: - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.9", "3.10", "3.11"] include: - cache-key-suffix: "-main-dev" @@ -73,7 +73,7 @@ jobs: options: "--entrypoint redis-server" steps: - - uses: "actions/checkout@v3.5.2" + - uses: "actions/checkout@v4.1.7" - name: "Install system packages" run: "sudo apt-get update -yqq && sudo apt-get install -yq locales-all" @@ -115,10 +115,10 @@ jobs: package: needs: ["test"] + permissions: + id-token: "write" + uses: "./.github/workflows/ci_package.yml" - secrets: - pypi-user: "${{ secrets.PYPI_USERNAME }}" - pypi-password: "${{ secrets.PYPI_PASSWORD }}" release: needs: ["package"] diff --git a/.github/workflows/ci_package.yml b/.github/workflows/ci_package.yml index 150a764..9dc7a69 100644 --- a/.github/workflows/ci_package.yml +++ b/.github/workflows/ci_package.yml @@ -7,16 +7,7 @@ on: description: "Twine version to use." type: "string" required: false - default: "4.0.2" - - secrets: - pypi-user: - description: "PyPI username to use." - required: true - - pypi-password: - description: "PyPI password (token) to use." - required: true + default: "5.1.1" jobs: package: @@ -25,7 +16,7 @@ jobs: runs-on: "ubuntu-latest" steps: - - uses: "actions/checkout@v3.5.2" + - uses: "actions/checkout@v4.1.7" - id: "python_and_poetry" uses: "./.github/actions/install_python_and_poetry" @@ -43,7 +34,4 @@ jobs: - name: "Publish package" if: "${{ startsWith(github.ref, 'refs/tags/') }}" - uses: "pypa/gh-action-pypi-publish@v1.8.6" - with: - user: "${{ secrets.pypi-user }}" - password: "${{ secrets.pypi-password }}" + uses: "pypa/gh-action-pypi-publish@v1.9.0" diff --git a/.github/workflows/ci_release.yml b/.github/workflows/ci_release.yml index 5c95ed8..e86b05c 100644 --- a/.github/workflows/ci_release.yml +++ b/.github/workflows/ci_release.yml @@ -14,7 +14,7 @@ jobs: runs-on: "ubuntu-latest" steps: - - uses: "actions/checkout@v3.5.2" + - uses: "actions/checkout@v4.1.7" - name: "Fetch git data" run: | diff --git a/.github/workflows/ci_verify_docs_build.yml b/.github/workflows/ci_verify_docs_build.yml index 0543f38..7d01b27 100644 --- a/.github/workflows/ci_verify_docs_build.yml +++ b/.github/workflows/ci_verify_docs_build.yml @@ -14,7 +14,7 @@ jobs: runs-on: "ubuntu-latest" steps: - - uses: "actions/checkout@v3.5.2" + - uses: "actions/checkout@v4.1.7" - id: "python_and_poetry" uses: "./.github/actions/install_python_and_poetry" diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index 7b14887..3806464 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -23,7 +23,7 @@ jobs: runs-on: "ubuntu-latest" steps: - - uses: "actions/checkout@v3.5.2" + - uses: "actions/checkout@v4.1.7" with: ref: "main" @@ -41,13 +41,13 @@ jobs: run: "badabump --ci ${{ github.event.inputs.args }}" - id: "token" - uses: "tibdex/github-app-token@v1.8.0" + uses: "tibdex/github-app-token@v2.1.0" with: app_id: "${{ secrets.BADABUMP_APP_ID }}" private_key: "${{ secrets.BADABUMP_APP_PRIVATE_KEY }}" - name: "Create pull request with changed files" - uses: "peter-evans/create-pull-request@v5.0.1" + uses: "peter-evans/create-pull-request@v6.1.0" with: token: "${{ steps.token.outputs.token }}" commit-message: | diff --git a/.github/workflows/release_tag.yml b/.github/workflows/release_tag.yml index 747d1a5..043c47d 100644 --- a/.github/workflows/release_tag.yml +++ b/.github/workflows/release_tag.yml @@ -20,12 +20,12 @@ jobs: steps: - id: "token" - uses: "tibdex/github-app-token@v1.8.0" + uses: "tibdex/github-app-token@v2.1.0" with: app_id: "${{ secrets.BADABUMP_APP_ID }}" private_key: "${{ secrets.BADABUMP_APP_PRIVATE_KEY }}" - - uses: "actions/checkout@v3.5.2" + - uses: "actions/checkout@v4.1.7" with: ref: "main" token: "${{ steps.token.outputs.token }}" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bb77e40..1fe095d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,15 +1,16 @@ +default_install_hook_types: + - "commit-msg" + - "pre-commit" default_language_version: python: &python_version "python3.11" exclude: ^(archive|assets|migrations)/.*|.*/(migrations|test-data|vendor)/.*|.*\.svg$ minimum_pre_commit_version: "1.17.0" + repos: - repo: "https://github.com/commitizen-tools/commitizen" - rev: "3.2.2" + rev: "v3.29.0" hooks: - id: "commitizen" - # By default commitizen using `python3` language version, so - # needed to provide concrete version here as well - language_version: *python_version stages: ["commit-msg"] - repo: "https://github.com/Kludex/no-optional" @@ -19,30 +20,30 @@ repos: name: "Format code (no-optional)" - repo: "https://github.com/PyCQA/isort" - rev: "5.12.0" + rev: "5.13.2" hooks: - id: "isort" name: "Format code (isort)" exclude: ^docs/.*$ - - repo: "https://github.com/psf/black" - rev: "23.3.0" + - repo: "https://github.com/psf/black-pre-commit-mirror" + rev: "24.8.0" hooks: - id: "black" name: "Format code (black)" exclude: ^docs/.*$ - repo: "https://github.com/asottile/blacken-docs" - rev: "1.13.0" + rev: "1.18.0" hooks: - id: "blacken-docs" name: "Format docs (blacken-docs)" args: ["-l", "64"] additional_dependencies: - - "black==23.3.0" + - "black==24.8.0" - repo: "https://github.com/pre-commit/pre-commit-hooks" - rev: "v4.4.0" + rev: "v4.6.0" hooks: - id: "end-of-file-fixer" - id: "trailing-whitespace" @@ -60,28 +61,29 @@ repos: - id: "rst-inline-touching-normal" - repo: "https://github.com/PyCQA/flake8" - rev: "6.0.0" + rev: "7.1.1" hooks: - id: "flake8" name: "Lint code (flake8)" additional_dependencies: &flake8_additional_dependencies - - "flake8-bugbear==23.5.9" - - "flake8-builtins==2.1.0" - - "flake8-comprehensions==3.12.0" + - "flake8-bugbear==24.4.26" + - "flake8-builtins==2.5.0" + - "flake8-comprehensions==3.15.0" - "flake8-implicit-str-concat==0.4.0" - - "flake8-isort==6.0.0" + - "flake8-isort==6.1.1" + - "flake8-logging==1.6.0" - "flake8-mutable==1.2.0" - "flake8-pie==0.16.0" - - "flake8-quotes==3.3.2" + - "flake8-quotes==3.4.0" - "flake8-string-format==0.3.0" - - "flake8-tidy-imports==4.8.0" - - "flake8-variables-names==0.0.5" - - "flake8==6.0.0" - - "pep8-naming==0.13.3" + - "flake8-tidy-imports==4.10.0" + - "flake8-variables-names==0.0.6" + - "flake8==7.1.1" + - "pep8-naming==0.14.1" exclude: ^docs/.*$ - repo: "https://github.com/asottile/yesqa" - rev: "v1.4.0" + rev: "v1.5.0" hooks: - id: "yesqa" name: "Lint code (yesqa)" @@ -99,7 +101,7 @@ repos: exclude: ^(.*/)?(docs|migrations|tests)/.*$ - repo: "https://github.com/shellcheck-py/shellcheck-py" - rev: "v0.9.0.2" + rev: "v0.10.0.1" hooks: - id: "shellcheck" name: "Lint scripts (shellcheck)" diff --git a/.python-version b/.python-version index d2c96c0..2419ad5 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.11.3 +3.11.9 diff --git a/README.rst b/README.rst index 177134c..251bf38 100644 --- a/README.rst +++ b/README.rst @@ -40,7 +40,7 @@ approach. As well as bunch other utilities to build effective server applications with `Python`_ 3 & `aiohttp.web`_. -* Works on `Python`_ 3.7+ +* Works on `Python`_ 3.8+ * Works with `aiohttp.web`_ 3.8.1+ * BSD licensed * Source, issues, and pull requests `on GitHub @@ -62,7 +62,6 @@ Example below, illustrates on how to handle operation ``hello_world`` from .. code-block:: python from pathlib import Path - from typing import List from aiohttp import web from rororo import ( @@ -87,7 +86,7 @@ Example below, illustrates on how to handle operation ``hello_world`` from ) - def create_app(argv: List[str] = None) -> web.Application: + def create_app(argv: list[str] = None) -> web.Application: return setup_openapi( web.Application(), Path(__file__).parent / "openapi.yaml", @@ -126,8 +125,7 @@ In snippet below, *rororo* expects that OpenAPI 3 schema contains operation ID @operations.register class UserView(web.View): - async def get(self) -> web.Response: - ... + async def get(self) -> web.Response: ... .. _`class based views`: https://docs.aiohttp.org/en/stable/web_quickstart.html#aiohttp-web-class-based-views diff --git a/docs/openapi.rst b/docs/openapi.rst index 430142e..6933e4e 100644 --- a/docs/openapi.rst +++ b/docs/openapi.rst @@ -135,11 +135,9 @@ OpenAPI schema to declare ``UsersView.get`` & ``UsersView.post`` operation IDs, @operations.register class UsersView(web.View): - async def get(self) -> web.Response: - ... + async def get(self) -> web.Response: ... - async def post(self) -> web.Response: - ... + async def post(self) -> web.Response: ... Next, it might be useful to provide different prefix instead of ``UsersView``. In example below, *rororo* expects OpenAPI schema to provide ``users.get`` & @@ -149,11 +147,9 @@ In example below, *rororo* expects OpenAPI schema to provide ``users.get`` & @operations.register("users") class UsersView(web.View): - async def get(self) -> web.Response: - ... + async def get(self) -> web.Response: ... - async def post(self) -> web.Response: - ... + async def post(self) -> web.Response: ... Finally, it might be useful to provide custom *operationId* instead of guessing it from view or view method name. Example below, illustrates the case, when @@ -164,12 +160,10 @@ OpenAPI schema contains ``list_users`` & ``create_user`` operation IDs, @operations.register class UsersView(web.View): @operations.register("list_users") - async def get(self) -> web.Response: - ... + async def get(self) -> web.Response: ... @operations.register("create_user") - async def post(self) -> web.Response: - ... + async def post(self) -> web.Response: ... To access :class:`rororo.openapi.data.OpenAPIContext` in class based views you need to pass ``self.request`` into :func:`rororo.openapi.openapi_context` or @@ -238,7 +232,6 @@ follows, .. code-block:: python from pathlib import Path - from typing import List from aiohttp import web from rororo import setup_openapi @@ -249,7 +242,7 @@ follows, OPENAPI_YAML_PATH = Path(__file__).parent / "openapi.yaml" - def create_app(argv: List[str] = None) -> web.Application: + def create_app(argv: list[str] = None) -> web.Application: app = web.Application() setup_openapi(app, OPENAPI_YAML_PATH, operations) return app diff --git a/poetry.lock b/poetry.lock index 4643ad5..80155a6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohttp" version = "3.8.4" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -100,12 +99,10 @@ files = [ [package.dependencies] aiosignal = ">=1.1.2" async-timeout = ">=4.0.0a3,<5.0" -asynctest = {version = "0.13.0", markers = "python_version < \"3.8\""} attrs = ">=17.3.0" charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} yarl = ">=1.0,<2.0" [package.extras] @@ -115,7 +112,6 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiohttp-middlewares" version = "2.2.0" description = "Collection of useful middlewares for aiohttp applications." -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -132,7 +128,6 @@ yarl = ">=1.5.1,<2.0.0" name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -147,7 +142,6 @@ frozenlist = ">=1.1.0" name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -159,7 +153,6 @@ files = [ name = "async-timeout" version = "4.0.2" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -167,26 +160,10 @@ files = [ {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] -[package.dependencies] -typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} - -[[package]] -name = "asynctest" -version = "0.13.0" -description = "Enhance the standard unittest package with features for testing asyncio libraries" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"}, - {file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"}, -] - [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -194,9 +171,6 @@ files = [ {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[docs,tests]", "pre-commit"] @@ -208,7 +182,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "babel" version = "2.11.0" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -223,7 +196,6 @@ pytz = ">=2015.7" name = "beautifulsoup4" version = "4.11.2" description = "Screen-scraping library" -category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -242,7 +214,6 @@ lxml = ["lxml"] name = "certifi" version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -254,7 +225,6 @@ files = [ name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "dev" optional = false python-versions = "*" files = [ @@ -331,7 +301,6 @@ pycparser = "*" name = "charset-normalizer" version = "3.0.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = "*" files = [ @@ -429,7 +398,6 @@ files = [ name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -441,7 +409,6 @@ files = [ name = "coverage" version = "6.5.0" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -507,7 +474,6 @@ toml = ["tomli"] name = "coveralls" version = "3.3.1" description = "Show coverage stats online via coveralls.io" -category = "dev" optional = false python-versions = ">= 3.5" files = [ @@ -516,7 +482,7 @@ files = [ ] [package.dependencies] -coverage = ">=4.1,<6.0.0 || >6.1,<6.1.1 || >6.1.1,<7.0" +coverage = ">=4.1,<6.0.dev0 || >6.1,<6.1.1 || >6.1.1,<7.0" docopt = ">=0.6.1" requests = ">=1.0.0" @@ -527,7 +493,6 @@ yaml = ["PyYAML (>=3.10)"] name = "cryptography" version = "41.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -569,7 +534,6 @@ test-randomorder = ["pytest-randomly"] name = "dnspython" version = "2.3.0" description = "DNS toolkit" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -590,7 +554,6 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"] name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" -category = "dev" optional = false python-versions = "*" files = [ @@ -601,7 +564,6 @@ files = [ name = "docutils" version = "0.19" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -613,7 +575,6 @@ files = [ name = "email-validator" version = "2.0.0.post2" description = "A robust email address syntax and deliverability validation library." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -629,7 +590,6 @@ idna = ">=2.0.0" name = "environ-config" version = "23.2.0" description = "Boilerplate-free configuration with env variables." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -639,7 +599,6 @@ files = [ [package.dependencies] attrs = ">=17.4.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [package.extras] aws = ["boto3"] @@ -651,7 +610,6 @@ tests = ["coverage[toml]", "moto", "pytest"] name = "exceptiongroup" version = "1.1.0" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -666,7 +624,6 @@ test = ["pytest (>=6)"] name = "frozenlist" version = "1.3.3" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -750,7 +707,6 @@ files = [ name = "furo" version = "2023.3.27" description = "A clean customisable Sphinx documentation theme." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -768,7 +724,6 @@ sphinx-basic-ng = "*" name = "hiredis" version = "2.2.3" description = "Python wrapper for hiredis" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -867,7 +822,6 @@ files = [ name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -879,7 +833,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -891,7 +844,6 @@ files = [ name = "importlib-metadata" version = "6.0.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -900,7 +852,6 @@ files = [ ] [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] @@ -912,7 +863,6 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag name = "importlib-resources" version = "5.12.0" description = "Read resources from Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -931,7 +881,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -943,7 +892,6 @@ files = [ name = "isodate" version = "0.6.1" description = "An ISO 8601 date/time/duration parser and formatter" -category = "main" optional = false python-versions = "*" files = [ @@ -958,7 +906,6 @@ six = "*" name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -976,7 +923,6 @@ i18n = ["Babel (>=2.7)"] name = "jsonschema" version = "4.17.3" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -986,11 +932,9 @@ files = [ [package.dependencies] attrs = ">=17.4.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] @@ -1000,7 +944,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1046,7 +989,6 @@ files = [ name = "livereload" version = "2.6.3" description = "Python LiveReload is an awesome tool for web developers" -category = "dev" optional = false python-versions = "*" files = [ @@ -1062,7 +1004,6 @@ tornado = {version = "*", markers = "python_version > \"2.7\""} name = "markupsafe" version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1122,7 +1063,6 @@ files = [ name = "more-itertools" version = "9.0.0" description = "More routines for operating on iterables, beyond itertools" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1134,7 +1074,6 @@ files = [ name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1218,7 +1157,6 @@ files = [ name = "mypy" version = "1.3.0" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1253,7 +1191,6 @@ files = [ [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} typing-extensions = ">=3.10" [package.extras] @@ -1266,7 +1203,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1278,7 +1214,6 @@ files = [ name = "openapi-core" version = "0.13.6" description = "" -category = "main" optional = false python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*, != 3.4.*" files = [ @@ -1307,7 +1242,6 @@ requests = ["requests"] name = "openapi-schema-validator" version = "0.2.3" description = "OpenAPI schema validation for Python" -category = "main" optional = false python-versions = ">=3.7.0,<4.0.0" files = [ @@ -1327,7 +1261,6 @@ strict-rfc3339 = ["strict-rfc3339"] name = "openapi-spec-validator" version = "0.4.0" description = "OpenAPI 2.0 (aka Swagger) and OpenAPI 3.0 spec validator" -category = "main" optional = false python-versions = ">=3.7.0,<4.0.0" files = [ @@ -1348,7 +1281,6 @@ requests = ["requests"] name = "packaging" version = "23.0" description = "Core utilities for Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1360,7 +1292,6 @@ files = [ name = "parse" version = "1.19.0" description = "parse() is the opposite of format()" -category = "main" optional = false python-versions = "*" files = [ @@ -1371,7 +1302,6 @@ files = [ name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1383,7 +1313,6 @@ files = [ name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1391,9 +1320,6 @@ files = [ {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] @@ -1402,7 +1328,6 @@ testing = ["pytest", "pytest-benchmark"] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1414,7 +1339,6 @@ files = [ name = "pygments" version = "2.14.0" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1429,7 +1353,6 @@ plugins = ["importlib-metadata"] name = "pyrsistent" version = "0.19.3" description = "Persistent/Functional/Immutable data structures" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1466,7 +1389,6 @@ files = [ name = "pytest" version = "7.3.1" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1477,7 +1399,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -1490,7 +1411,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-aiohttp" version = "1.0.4" description = "Pytest plugin for aiohttp support" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1510,7 +1430,6 @@ testing = ["coverage (==6.2)", "mypy (==0.931)"] name = "pytest-asyncio" version = "0.21.0" description = "Pytest support for asyncio" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1520,7 +1439,6 @@ files = [ [package.dependencies] pytest = ">=7.0.0" -typing-extensions = {version = ">=3.7.2", markers = "python_version < \"3.8\""} [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] @@ -1530,7 +1448,6 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1549,7 +1466,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytz" version = "2022.7.1" description = "World timezone definitions, modern and historical" -category = "dev" optional = false python-versions = "*" files = [ @@ -1561,7 +1477,6 @@ files = [ name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1611,7 +1526,6 @@ files = [ name = "redis" version = "4.5.5" description = "Python client for Redis database and key-value store" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1621,8 +1535,6 @@ files = [ [package.dependencies] async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} -importlib-metadata = {version = ">=1.0", markers = "python_version < \"3.8\""} -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -1632,7 +1544,6 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1654,7 +1565,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "setuptools" version = "67.4.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1671,7 +1581,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1683,7 +1592,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -1695,7 +1603,6 @@ files = [ name = "soupsieve" version = "2.4" description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1707,7 +1614,6 @@ files = [ name = "sphinx" version = "5.3.0" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1743,7 +1649,6 @@ test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] name = "sphinx-autobuild" version = "2021.3.14" description = "Rebuild Sphinx documentation on changes, with live-reload in the browser." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1763,7 +1668,6 @@ test = ["pytest", "pytest-cov"] name = "sphinx-autodoc-typehints" version = "1.23.0" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1783,7 +1687,6 @@ type-comment = ["typed-ast (>=1.5.4)"] name = "sphinx-basic-ng" version = "1.0.0b1" description = "A modern skeleton for Sphinx themes." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1801,7 +1704,6 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta name = "sphinx-copybutton" version = "0.5.2" description = "Add a copy button to each of your code cells." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1820,7 +1722,6 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] name = "sphinxcontrib-applehelp" version = "1.0.2" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1836,7 +1737,6 @@ test = ["pytest"] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1852,7 +1752,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1868,7 +1767,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1883,7 +1781,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1899,7 +1796,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1915,7 +1811,6 @@ test = ["pytest"] name = "sphinxext-opengraph" version = "0.7.5" description = "Sphinx Extension to enable OGP support" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1930,7 +1825,6 @@ sphinx = ">=4.0" name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1942,7 +1836,6 @@ files = [ name = "tornado" version = "6.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" optional = false python-versions = ">= 3.7" files = [ @@ -1959,45 +1852,10 @@ files = [ {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, ] -[[package]] -name = "typed-ast" -version = "1.5.4" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, -] - [[package]] name = "types-pyopenssl" version = "23.0.0.4" description = "Typing stubs for pyOpenSSL" -category = "dev" optional = false python-versions = "*" files = [ @@ -2012,7 +1870,6 @@ cryptography = ">=35.0.0" name = "types-pyyaml" version = "6.0.12.10" description = "Typing stubs for PyYAML" -category = "dev" optional = false python-versions = "*" files = [ @@ -2024,7 +1881,6 @@ files = [ name = "types-redis" version = "4.5.5.2" description = "Typing stubs for redis" -category = "dev" optional = false python-versions = "*" files = [ @@ -2040,7 +1896,6 @@ types-pyOpenSSL = "*" name = "typing-extensions" version = "4.6.2" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2052,7 +1907,6 @@ files = [ name = "urllib3" version = "1.26.14" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -2069,7 +1923,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "werkzeug" version = "2.2.3" description = "The comprehensive WSGI web application library." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2087,7 +1940,6 @@ watchdog = ["watchdog"] name = "yarl" version = "1.8.2" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2170,13 +2022,11 @@ files = [ [package.dependencies] idna = ">=2.0" multidict = ">=4.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [[package]] name = "zipp" version = "3.14.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2190,5 +2040,5 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" -python-versions = "^3.7" -content-hash = "420edede691076f1d917b815b991e6bca16e81e4a51ea59b2fe480a3a2e2480a" +python-versions = "^3.8" +content-hash = "23b206002dca4bde341fe2844e0125125356c0d74fdf18c886adc954f26b4287" diff --git a/pyproject.toml b/pyproject.toml index 6f00bf3..04afdf0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -121,7 +121,7 @@ classifiers = [ ] [tool.poetry.dependencies] -python = "^3.7" +python = "^3.8" aiohttp = "^3.8.1" aiohttp-middlewares = ">=1.2.0,<3" attrs = ">=19.2.0,<24" @@ -174,12 +174,11 @@ filterwarnings = [ [tool.tox] legacy_tox_ini = """ [tox] -envlist = py37,py38,py39,py310,py310-minimum-requirements,py311 +envlist = py38,py39,py310,py310-minimum-requirements,py311 skipsdist = True [gh-actions] python = - 3.7: py37 3.8: py38 3.9: py39 3.10: py310 diff --git a/src/rororo/aio.py b/src/rororo/aio.py index bb35026..d4cafec 100644 --- a/src/rororo/aio.py +++ b/src/rororo/aio.py @@ -32,8 +32,7 @@ def __call__( *, name: Union[str, None] = None, **kwargs: Handler, - ) -> web.Resource: - ... + ) -> web.Resource: ... @contextmanager diff --git a/src/rororo/annotations.py b/src/rororo/annotations.py index 8e0be74..767643b 100644 --- a/src/rororo/annotations.py +++ b/src/rororo/annotations.py @@ -39,4 +39,4 @@ Settings = Union[types.ModuleType, DictStrAny] -(Handler, Protocol, TypedDict) # Make flake8 happy +(Handler, Protocol, TypedDict) # Make flake8 happy # noqa: B018 diff --git a/src/rororo/openapi/openapi.py b/src/rororo/openapi/openapi.py index 4eb907e..6beeabf 100644 --- a/src/rororo/openapi/openapi.py +++ b/src/rororo/openapi/openapi.py @@ -96,14 +96,12 @@ class OperationTableDef: # Expect OpenAPI 3 schema to contain operationId: hello_world @operations.register - async def hello_world(request: web.Request) -> web.Response: - ... + async def hello_world(request: web.Request) -> web.Response: ... # Explicitly use `operationId: "helloWorld"` @operations.register("helloWorld") - async def hello_world(request: web.Request) -> web.Response: - ... + async def hello_world(request: web.Request) -> web.Response: ... Class based views supported as well. In most generic way you just need to decorate your view with ``@operations.register`` decorator and ensure @@ -116,8 +114,7 @@ async def hello_world(request: web.Request) -> web.Response: @operations.register class UserView(web.View): - async def get(self) -> web.Response: - ... + async def get(self) -> web.Response: ... expects for operation ID ``UserView.get`` to be declared in OpenAPI schema. @@ -127,8 +124,7 @@ async def get(self) -> web.Response: @operations.register("users") class UserView(web.View): - async def get(self) -> web.Response: - ... + async def get(self) -> web.Response: ... expects for operation ID ``users.get`` to be declared in OpenAPI schema. @@ -139,8 +135,7 @@ async def get(self) -> web.Response: @operations.register class UserView(web.View): @operations.register("me") - async def get(self) -> web.Response: - ... + async def get(self) -> web.Response: ... expects for operation ID ``me`` to be declared in OpenAPI schema. @@ -167,12 +162,10 @@ def __iadd__(self, other: "OperationTableDef") -> "OperationTableDef": return self @overload - def register(self, handler: F) -> F: - ... + def register(self, handler: F) -> F: ... @overload - def register(self, operation_id: str) -> Callable[[F], F]: - ... + def register(self, operation_id: str) -> Callable[[F], F]: ... def register(self, mixed): # type: ignore[no-untyped-def] operation_id = mixed if isinstance(mixed, str) else mixed.__qualname__ @@ -431,8 +424,7 @@ def setup_openapi( schema_loader: Union[SchemaLoader, None] = None, cache_create_schema_and_spec: bool = False, validate_email_kwargs: Union[ValidateEmailKwargsDict, None] = None, -) -> web.Application: - ... +) -> web.Application: ... @overload @@ -449,8 +441,7 @@ def setup_openapi( use_cors_middleware: bool = True, cors_middleware_kwargs: Union[CorsMiddlewareKwargsDict, None] = None, validate_email_kwargs: Union[ValidateEmailKwargsDict, None] = None, -) -> web.Application: - ... +) -> web.Application: ... def setup_openapi( # type: ignore[misc] diff --git a/src/rororo/openapi/views.py b/src/rororo/openapi/views.py index 7dcf4d7..e782024 100644 --- a/src/rororo/openapi/views.py +++ b/src/rororo/openapi/views.py @@ -21,7 +21,7 @@ async def default_error_handler(request: web.Request) -> web.Response: if isinstance(err, OpenAPIError): headers = err.headers else: - logger.error(context.message, exc_info=True) + logger.error(context.message, exc_info=True) # noqa: LOG014 return web.json_response( context.data, diff --git a/src/rororo/settings.py b/src/rororo/settings.py index 9ed916e..7d79161 100644 --- a/src/rororo/settings.py +++ b/src/rororo/settings.py @@ -399,4 +399,4 @@ def setup_timezone(timezone: str) -> None: # Make flake8 happy -(setup_logging, to_bool) +(setup_logging, to_bool) # noqa: B018