Repository: KundaPanda/strawberry-django-jwt (language: python)

Issue:
Update depandancies, Fix strawberry deprecation warnings.
@KundaPanda 
I have changed some workflows sorry if this bothers you...
This PR will update some discrepancies as well as fix to new Strawberry  
way to discover directives and info (by annotation)


Discussion / hints:
Hi, thank you very much for the PR.

There are some things which I like and some which I don't:
1) I do not want to rename the library
2) I don't see the reason for completely changing Actions config
3) I like using nox for multi-version testing even outside GitHub
4) In my opinion, the minimum line wrap should be at 120 characters minimum given the size of modern monitors.
5) There should be no reason for using a makefile
6) Please create multiple smaller PRs in the future, it is quite hard to review intertwined changes which are not related. (Although I understand this is pretty much all commits from your fork).

What I like though:
1) Changes to the pre-commit hooks. I usually just let Pycharm do all the work but I try to include some basic checks even for people who use more basic editors.
2) Fixes to the new strawberry warnings.
3) The use of flake8 plugins.

Thank you for putting the effort into this, I have cherry-picked some changes and will create a separate PR with credits to you if that's OK. 

Fix patch:
diff --git a/.coveragerc b/.coveragerc
deleted file mode 100644
index 436da937..00000000
--- a/.coveragerc
+++ /dev/null
@@ -1,3 +0,0 @@
-[run]
-source = strawberry_django_jwt
-branch = True
diff --git a/.flake8 b/.flake8
index 1fd48933..890bb9bb 100644
--- a/.flake8
+++ b/.flake8
@@ -1,2 +1,4 @@
 [flake8]
 max-line-length = 160
+exclude = .eggs,.git,.hg,.mypy_cache,.tox,.venv,venv,__pycached__,_build,buck-out,build,dist
+ban-relative-imports = true
diff --git a/.github/workflows/constraints.txt b/.github/workflows/constraints.txt
deleted file mode 100644
index e40832df..00000000
--- a/.github/workflows/constraints.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-pip==22.0.4
-nox==2022.1.7
-poetry==1.1.13
-virtualenv==20.14.1
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index f39cfa6c..61a7422a 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -11,9 +11,9 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Check out the repository
-        uses: actions/checkout@v3.0.2
+        uses: actions/checkout@v3
 
       - name: Run Labeler
-        uses: crazy-max/ghaction-github-labeler@v3.1.1
+        uses: crazy-max/ghaction-github-labeler@v4
         with:
           skip-delete: true
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index ef4abd5e..d4bce53c 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,10 +1,10 @@
 name: Release
 
 on:
-  push:
-    branches:
-      - main
-      - master
+  workflow_run:
+    workflows: ["Tests"]
+    branches: ["master", "main"]
+    types: ["completed"]
 
 jobs:
   release:
@@ -12,23 +12,21 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Check out the repository
-        uses: actions/checkout@v3.0.2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 2
 
       - name: Set up Python
-        uses: actions/setup-python@v3.1.2
+        uses: actions/setup-python@v4
         with:
           python-version: "3.9"
 
-      - name: Upgrade pip
-        run: |
-          pip install --constraint=.github/workflows/constraints.txt pip
-          pip --version
-      - name: Install Poetry
-        run: |
-          pip install --constraint=.github/workflows/constraints.txt poetry
-          poetry --version
+      - name: Install poetry
+        uses: snok/install-poetry@v1
+        with:
+          virtualenvs-create: true
+          virtualenvs-in-project: true
+
       - name: Check if there is a parent commit
         id: check-parent-commit
         run: |
@@ -50,12 +48,12 @@ jobs:
         run: |
           poetry build --ansi
       - name: Build and publish to PyPi
-        uses: JRubics/poetry-publish@v1.10
+        uses: JRubics/poetry-publish@v1.11
         with:
           pypi_token: ${{ secrets.PYPI_TOKEN }}
 
       - name: Publish the release notes
-        uses: release-drafter/release-drafter@v5.19.0
+        uses: release-drafter/release-drafter@v5.20.0
         with:
           publish: ${{ steps.check-version.outputs.tag != '' }}
           tag: ${{ steps.check-version.outputs.tag }}
diff --git a/.idea/strawberry-django-jwt.iml b/.idea/strawberry-django-jwt.iml
index 8b5a169d..12f7dc87 100644
--- a/.idea/strawberry-django-jwt.iml
+++ b/.idea/strawberry-django-jwt.iml
@@ -21,6 +21,8 @@
       <excludeFolder url="file://$MODULE_DIR$/dist" />
       <excludeFolder url="file://$MODULE_DIR$/.idea" />
       <excludeFolder url="file://$MODULE_DIR$/htmlcov" />
+      <excludeFolder url="file://$MODULE_DIR$/.venv" />
+      <excludeFolder url="file://$MODULE_DIR$/strawberry_django_jwt.egg-info" />
     </content>
     <orderEntry type="jdk" jdkName="Poetry (strawberry-django-jwt)" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index b81b8d6a..23771a83 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,41 +1,40 @@
 repos:
   - repo: https://github.com/ambv/black
-    rev: "22.3.0"
+    rev: 22.6.0
     hooks:
       - id: black
         language_version: python3.9
   - repo: https://github.com/pycqa/flake8
-    rev: "4.0.1"
+    rev: 4.0.1
     hooks:
       - id: flake8
-  - repo: local
+        additional_dependencies:
+          [
+            "dlint~=0.12.0",
+            "flake8-bugbear~=22.7.1",
+            "flake8-simplify~=0.19.2",
+            "flake8-comprehensions~=3.10.0",
+            "flake8-return~=1.1.3",
+            "flake8-tidy-imports~=4.8.0",
+          ]
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.3.0
     hooks:
       - id: check-added-large-files
-        name: Check for added large files
-        entry: check-added-large-files
-        language: system
       - id: check-toml
-        name: Check Toml
-        entry: check-toml
-        language: system
-        types: [toml]
       - id: check-yaml
-        name: Check Yaml
-        entry: check-yaml
-        language: system
-        types: [yaml]
       - id: end-of-file-fixer
-        name: Fix End of Files
-        entry: end-of-file-fixer
-        language: system
-        types: [text]
-        stages: [commit, push, manual]
       - id: trailing-whitespace
-        name: Trim Trailing Whitespace
-        entry: trailing-whitespace-fixer
-        language: system
-        types: [text]
-        stages: [commit, push, manual]
+  - repo: https://github.com/asottile/pyupgrade
+    rev: v2.34.0
+    hooks:
+      - id: pyupgrade
+        args: ["--py37-plus", "--keep-mock"]
+  - repo: https://github.com/pycqa/isort
+    rev: 5.10.1
+    hooks:
+      - id: isort
+        name: isort (python)
   - repo: https://github.com/pre-commit/mirrors-prettier
     rev: v2.6.2
     hooks:
diff --git a/mypy.ini b/mypy.ini
index 567189cf..89cf1ff0 100644
--- a/mypy.ini
+++ b/mypy.ini
@@ -2,7 +2,11 @@
 plugins =
     mypy_django_plugin.main,
     strawberry.ext.mypy_plugin
-exclude = tests/migrations
+exclude =
+    (?x)(
+        ^tests/migrations
+        | ^noxfile.py$
+    )
 
 [mypy.plugins.django-stubs]
 django_settings_module = "tests.example_app.settings"
diff --git a/noxfile.py b/noxfile.py
index 81a3c2ce..79c2e317 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -1,10 +1,9 @@
-import sys
 from pathlib import Path
+import sys
 from textwrap import dedent
 
 import nox
 from nox_poetry import Session, session
-from nox_poetry.core import Session_install
 
 package = "strawberry_django_jwt"
 python_versions = ["3.10", "3.9", "3.8", "3.7"]
@@ -14,7 +13,7 @@
     ("3.10", "3.1"),
 ]
 pyjwt_versions = ["1.7.1", "latest"]
-strawberry_graphql_versions = ["0.69.0", "latest"]
+strawberry_graphql_versions = ["latest"]
 nox.needs_version = ">= 2021.6.6"
 nox.options.sessions = ("tests",)
 nox.options.reuse_existing_virtualenvs = True
@@ -45,9 +44,7 @@ def activate_virtualenv_in_precommit_hooks(session_: Session) -> None:
 
         text = hook.read_text()
         bindir = repr(session_.bin)[1:-1]  # strip quotes
-        if not (
-            Path("A") == Path("a") and bindir.lower() in text.lower() or bindir in text
-        ):
+        if not (Path("A") == Path("a") and bindir.lower() in text.lower() or bindir in text):
             continue
 
         lines = text.splitlines()
@@ -69,11 +66,11 @@ def activate_virtualenv_in_precommit_hooks(session_: Session) -> None:
         hook.write_text("\n".join(lines))
 
 
-def install(session_, package_, version):
+def install(session_: Session, package_, version):
     if version == "latest":
-        Session_install(session_, package, "-U")
+        nox.Session.install(session_, package, "-U")
     else:
-        Session_install(session_, f"{package_}=={version}")
+        nox.Session.install(session_, f"{package_}=={version}")
 
 
 # noinspection PyUnresolvedReferences,PyProtectedMember
@@ -83,7 +80,7 @@ def export_requirements_without_extras(session_: Session) -> Path:
     session_.poetry.poetry.config._config["extras"] = {}  # type: ignore
     requirements = session_.poetry.export_requirements()
     session_.poetry.poetry.config._config["extras"] = extras  # type: ignore
-    return requirements
+    return requirements  # noqa: R504
 
 
 @session(name="pre-commit", python="3.9")
@@ -92,7 +89,7 @@ def pre_commit(session_: Session) -> None:
     args = session_.posargs or ["run", "--all-files", "--show-diff-on-failure"]
     session_.install(
         "darglint",
-        "autopep8",
+        "black",
         "pep8-naming",
         "pre-commit",
         "pre-commit-hooks",
diff --git a/poetry.lock b/poetry.lock
index 1d66744f..6abe3eee 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,8 +1,8 @@
 [[package]]
 name = "anyio"
-version = "3.5.0"
+version = "3.6.1"
 description = "High level compatibility layer for multiple asynchronous event loop implementations"
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.6.2"
 
@@ -13,7 +13,7 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
 
 [package.extras]
 doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"]
-test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"]
+test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"]
 trio = ["trio (>=0.16)"]
 
 [[package]]
@@ -21,7 +21,7 @@ name = "argcomplete"
 version = "1.12.3"
 description = "Bash tab completion for argparse"
 category = "dev"
-optional = true
+optional = false
 python-versions = "*"
 
 [package.dependencies]
@@ -32,7 +32,7 @@ test = ["coverage", "flake8", "pexpect", "wheel"]
 
 [[package]]
 name = "asgiref"
-version = "3.5.1"
+version = "3.5.2"
 description = "ASGI specs, helper code, and adapters"
 category = "main"
 optional = false
@@ -44,23 +44,9 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
 [package.extras]
 tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
 
-[[package]]
-name = "astroid"
-version = "2.11.4"
-description = "An abstract syntax tree for Python with inference support."
-category = "dev"
-optional = true
-python-versions = ">=3.6.2"
-
-[package.dependencies]
-lazy-object-proxy = ">=1.4.0"
-typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""}
-typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""}
-wrapt = ">=1.11,<2"
-
 [[package]]
 name = "atomicwrites"
-version = "1.4.0"
+version = "1.4.1"
 description = "Atomic file writes."
 category = "dev"
 optional = false
@@ -80,37 +66,36 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
 tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
 tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
 
-[[package]]
-name = "autopep8"
-version = "1.6.0"
-description = "A tool that automatically formats Python code to conform to the PEP 8 style guide"
-category = "dev"
-optional = true
-python-versions = "*"
-
-[package.dependencies]
-pycodestyle = ">=2.8.0"
-toml = "*"
-
 [[package]]
 name = "backports.cached-property"
-version = "1.0.1"
+version = "1.0.2"
 description = "cached_property() - computed once per instance, cached as attribute"
 category = "main"
 optional = false
 python-versions = ">=3.6.0"
 
+[[package]]
+name = "backports.zoneinfo"
+version = "0.2.1"
+description = "Backport of the standard library zoneinfo module"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+tzdata = ["tzdata"]
+
 [[package]]
 name = "certifi"
-version = "2021.10.8"
+version = "2022.6.15"
 description = "Python package for providing Mozilla's CA Bundle."
 category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
 
 [[package]]
 name = "cffi"
-version = "1.15.0"
+version = "1.15.1"
 description = "Foreign Function Interface for Python calling C code."
 category = "dev"
 optional = false
@@ -119,21 +104,13 @@ python-versions = "*"
 [package.dependencies]
 pycparser = "*"
 
-[[package]]
-name = "cfgv"
-version = "3.3.1"
-description = "Validate configuration and produce human readable error messages."
-category = "dev"
-optional = true
-python-versions = ">=3.6.1"
-
 [[package]]
 name = "charset-normalizer"
-version = "2.0.12"
+version = "2.1.0"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
 category = "dev"
 optional = false
-python-versions = ">=3.5.0"
+python-versions = ">=3.6.0"
 
 [package.extras]
 unicode_backport = ["unicodedata2"]
@@ -152,7 +129,7 @@ importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
 
 [[package]]
 name = "colorama"
-version = "0.4.4"
+version = "0.4.5"
 description = "Cross-platform colored terminal text."
 category = "main"
 optional = false
@@ -163,7 +140,7 @@ name = "colorlog"
 version = "6.6.0"
 description = "Add colours to the output of Python's logging module."
 category = "dev"
-optional = true
+optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
@@ -199,21 +176,21 @@ jinja2 = "*"
 
 [[package]]
 name = "coverage"
-version = "6.3.2"
+version = "6.4.1"
 description = "Code coverage measurement for Python"
 category = "dev"
 optional = false
 python-versions = ">=3.7"
 
 [package.dependencies]
-tomli = {version = "*", optional = true, markers = "extra == \"toml\""}
+tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
 
 [package.extras]
 toml = ["tomli"]
 
 [[package]]
 name = "cryptography"
-version = "37.0.2"
+version = "37.0.4"
 description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
 category = "dev"
 optional = false
@@ -230,36 +207,17 @@ sdist = ["setuptools_rust (>=0.11.4)"]
 ssh = ["bcrypt (>=3.1.5)"]
 test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
 
-[[package]]
-name = "darglint"
-version = "1.8.1"
-description = "A utility for ensuring Google-style docstrings stay up to date with the source code."
-category = "dev"
-optional = true
-python-versions = ">=3.6,<4.0"
-
-[[package]]
-name = "dill"
-version = "0.3.4"
-description = "serialize all of python"
-category = "dev"
-optional = true
-python-versions = ">=2.7, !=3.0.*"
-
-[package.extras]
-graph = ["objgraph (>=1.7.2)"]
-
 [[package]]
 name = "distlib"
 version = "0.3.4"
 description = "Distribution utilities"
 category = "dev"
-optional = true
+optional = false
 python-versions = "*"
 
 [[package]]
 name = "django"
-version = "3.2.13"
+version = "3.2.14"
 description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
 category = "main"
 optional = false
@@ -274,6 +232,24 @@ sqlparse = ">=0.2.2"
 argon2 = ["argon2-cffi (>=19.1.0)"]
 bcrypt = ["bcrypt"]
 
+[[package]]
+name = "django"
+version = "4.0.6"
+description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
+category = "main"
+optional = false
+python-versions = ">=3.8"
+
+[package.dependencies]
+asgiref = ">=3.4.1,<4"
+"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""}
+sqlparse = ">=0.2.2"
+tzdata = {version = "*", markers = "sys_platform == \"win32\""}
+
+[package.extras]
+argon2 = ["argon2-cffi (>=19.1.0)"]
+bcrypt = ["bcrypt"]
+
 [[package]]
 name = "django-admin-display"
 version = "1.3.0"
@@ -301,24 +277,24 @@ model-bakery = {version = ">=1.0.0,<2.0.0", markers = "python_version >= \"3\""}
 
 [[package]]
 name = "django-stubs"
-version = "1.9.0"
+version = "1.11.0"
 description = "Mypy stubs for Django"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.dependencies]
 django = "*"
-django-stubs-ext = ">=0.3.0"
-mypy = ">=0.910"
-toml = "*"
+django-stubs-ext = ">=0.4.0"
+mypy = ">=0.930,<0.960"
+tomli = "*"
 types-pytz = "*"
 types-PyYAML = "*"
 typing-extensions = "*"
 
 [[package]]
 name = "django-stubs-ext"
-version = "0.4.0"
+version = "0.5.0"
 description = "Monkey-patching and extensions for django-stubs"
 category = "dev"
 optional = false
@@ -342,41 +318,31 @@ pytz = "*"
 
 [[package]]
 name = "djangorestframework-stubs"
-version = "1.4.0"
+version = "1.7.0"
 description = "PEP-484 stubs for django-rest-framework"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.dependencies]
 coreapi = ">=2.0.0"
-django-stubs = ">=1.7.0"
-mypy = ">=0.790"
+django-stubs = ">=1.11.0"
+mypy = ">=0.950"
 requests = ">=2.0.0"
-typing-extensions = ">=3.7.2"
-
-[[package]]
-name = "dparse"
-version = "0.5.1"
-description = "A parser for Python dependency files"
-category = "dev"
-optional = true
-python-versions = ">=3.5"
-
-[package.dependencies]
-packaging = "*"
-pyyaml = "*"
-toml = "*"
+types-Markdown = ">=0.1.5"
+types-PyYAML = ">=5.4.3"
+types-requests = ">=0.1.12"
+typing-extensions = ">=3.10.0"
 
 [package.extras]
-pipenv = ["pipenv"]
+compatible-mypy = ["mypy (>=0.950,<0.970)"]
 
 [[package]]
 name = "filelock"
-version = "3.6.0"
+version = "3.7.1"
 description = "A platform independent file lock."
 category = "dev"
-optional = true
+optional = false
 python-versions = ">=3.7"
 
 [package.extras]
@@ -395,7 +361,7 @@ python-versions = ">=3.6,<4"
 name = "h11"
 version = "0.13.0"
 description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.6"
 
@@ -406,35 +372,24 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
 name = "httptools"
 version = "0.4.0"
 description = "A collection of framework independent HTTP protocol utils."
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.5.0"
 
 [package.extras]
 test = ["Cython (>=0.29.24,<0.30.0)"]
 
-[[package]]
-name = "identify"
-version = "2.5.0"
-description = "File identification library for Python"
-category = "dev"
-optional = true
-python-versions = ">=3.7"
-
-[package.extras]
-license = ["ukkonen"]
-
 [[package]]
 name = "idna"
 version = "3.3"
 description = "Internationalized Domain Names in Applications (IDNA)"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
 [[package]]
 name = "importlib-metadata"
-version = "4.11.3"
+version = "4.12.0"
 description = "Read metadata from Python packages"
 category = "main"
 optional = false
@@ -447,7 +402,7 @@ zipp = ">=0.5"
 [package.extras]
 docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
 perf = ["ipython"]
-testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"]
 
 [[package]]
 name = "iniconfig"
@@ -457,20 +412,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[[package]]
-name = "isort"
-version = "5.10.1"
-description = "A Python utility / library to sort Python imports."
-category = "dev"
-optional = true
-python-versions = ">=3.6.1,<4.0"
-
-[package.extras]
-pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
-requirements_deprecated_finder = ["pipreqs", "pip-api"]
-colors = ["colorama (>=0.4.3,<0.5.0)"]
-plugins = ["setuptools"]
-
 [[package]]
 name = "itypes"
 version = "1.2.0"
@@ -493,14 +434,6 @@ MarkupSafe = ">=2.0"
 [package.extras]
 i18n = ["Babel (>=2.7)"]
 
-[[package]]
-name = "lazy-object-proxy"
-version = "1.7.1"
-description = "A fast and thorough lazy object proxy."
-category = "dev"
-optional = true
-python-versions = ">=3.6"
-
 [[package]]
 name = "markupsafe"
 version = "2.1.1"
@@ -509,14 +442,6 @@ category = "dev"
 optional = false
 python-versions = ">=3.7"
 
-[[package]]
-name = "mccabe"
-version = "0.7.0"
-description = "McCabe checker, plugin for flake8"
-category = "dev"
-optional = true
-python-versions = ">=3.6"
-
 [[package]]
 name = "mock"
 version = "4.0.3"
@@ -532,14 +457,14 @@ test = ["pytest (<5.4)", "pytest-cov"]
 
 [[package]]
 name = "model-bakery"
-version = "1.5.0"
+version = "1.6.0"
 description = "Smart object creation facility for Django."
 category = "dev"
 optional = false
 python-versions = "*"
 
 [package.dependencies]
-django = ">=2.2"
+django = ">=3.2"
 
 [[package]]
 name = "mypy"
@@ -568,20 +493,12 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[[package]]
-name = "nodeenv"
-version = "1.6.0"
-description = "Node.js virtual environment builder"
-category = "dev"
-optional = true
-python-versions = "*"
-
 [[package]]
 name = "nox"
 version = "2022.1.7"
 description = "Flexible test automation."
 category = "dev"
-optional = true
+optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
@@ -598,16 +515,16 @@ tox_to_nox = ["jinja2", "tox"]
 
 [[package]]
 name = "nox-poetry"
-version = "0.9.0"
+version = "1.0.1"
 description = "nox-poetry"
 category = "dev"
-optional = true
+optional = false
 python-versions = ">=3.7,<4.0"
 
 [package.dependencies]
 nox = ">=2020.8.22"
 packaging = ">=20.9"
-tomlkit = ">=0.7.0,<0.8.0"
+tomlkit = ">=0.7"
 
 [[package]]
 name = "packaging"
@@ -625,7 +542,7 @@ name = "platformdirs"
 version = "2.5.2"
 description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
 category = "dev"
-optional = true
+optional = false
 python-versions = ">=3.7"
 
 [package.extras]
@@ -647,35 +564,6 @@ importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
 dev = ["pre-commit", "tox"]
 testing = ["pytest", "pytest-benchmark"]
 
-[[package]]
-name = "pre-commit"
-version = "2.18.1"
-description = "A framework for managing and maintaining multi-language pre-commit hooks."
-category = "dev"
-optional = true
-python-versions = ">=3.7"
-
-[package.dependencies]
-cfgv = ">=2.0.0"
-identify = ">=1.0.0"
-importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
-nodeenv = ">=0.11.1"
-pyyaml = ">=5.1"
-toml = "*"
-virtualenv = ">=20.0.8"
-
-[[package]]
-name = "pre-commit-hooks"
-version = "4.2.0"
-description = "Some out-of-the-box hooks for pre-commit."
-category = "dev"
-optional = true
-python-versions = ">=3.7"
-
-[package.dependencies]
-"ruamel.yaml" = ">=0.15"
-toml = "*"
-
 [[package]]
 name = "py"
 version = "1.11.0"
@@ -684,14 +572,6 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
-[[package]]
-name = "pycodestyle"
-version = "2.8.0"
-description = "Python style guide checker"
-category = "dev"
-optional = true
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
 [[package]]
 name = "pycparser"
 version = "2.21"
@@ -710,7 +590,7 @@ python-versions = ">=3.6"
 
 [[package]]
 name = "pyjwt"
-version = "2.3.0"
+version = "2.4.0"
 description = "JSON Web Token implementation in Python"
 category = "main"
 optional = false
@@ -722,30 +602,9 @@ dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)",
 docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
 tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"]
 
-[[package]]
-name = "pylint"
-version = "2.13.8"
-description = "python code static checker"
-category = "dev"
-optional = true
-python-versions = ">=3.6.2"
-
-[package.dependencies]
-astroid = ">=2.11.3,<=2.12.0-dev0"
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-dill = ">=0.2"
-isort = ">=4.2.5,<6"
-mccabe = ">=0.6,<0.8"
-platformdirs = ">=2.2.0"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""}
-
-[package.extras]
-testutil = ["gitpython (>3)"]
-
 [[package]]
 name = "pyparsing"
-version = "3.0.8"
+version = "3.0.9"
 description = "pyparsing module - Classes and methods to define and execute parsing grammars"
 category = "main"
 optional = false
@@ -821,7 +680,7 @@ six = ">=1.5"
 name = "python-dotenv"
 version = "0.20.0"
 description = "Read key-value pairs from a .env file and set them as environment variables"
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.5"
 
@@ -851,64 +710,27 @@ python-versions = "*"
 name = "pyyaml"
 version = "6.0"
 description = "YAML parser and emitter for Python"
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.6"
 
 [[package]]
 name = "requests"
-version = "2.27.1"
+version = "2.28.1"
 description = "Python HTTP for Humans."
 category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+python-versions = ">=3.7, <4"
 
 [package.dependencies]
 certifi = ">=2017.4.17"
-charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
-idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
+charset-normalizer = ">=2,<3"
+idna = ">=2.5,<4"
 urllib3 = ">=1.21.1,<1.27"
 
 [package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
-use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
-
-[[package]]
-name = "ruamel.yaml"
-version = "0.17.21"
-description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
-category = "dev"
-optional = true
-python-versions = ">=3"
-
-[package.dependencies]
-"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""}
-
-[package.extras]
-docs = ["ryd"]
-jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"]
-
-[[package]]
-name = "ruamel.yaml.clib"
-version = "0.2.6"
-description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml"
-category = "dev"
-optional = true
-python-versions = ">=3.5"
-
-[[package]]
-name = "safety"
-version = "1.10.3"
-description = "Checks installed dependencies for known vulnerabilities."
-category = "dev"
-optional = true
-python-versions = ">=3.5"
-
-[package.dependencies]
-Click = ">=6.0"
-dparse = ">=0.5.1"
-packaging = "*"
-requests = "*"
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
+use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
 
 [[package]]
 name = "six"
@@ -922,7 +744,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 name = "sniffio"
 version = "1.2.0"
 description = "Sniff out which async library your code is running under"
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.5"
 
@@ -936,7 +758,7 @@ python-versions = ">=3.5"
 
 [[package]]
 name = "strawberry-graphql"
-version = "0.111.1"
+version = "0.117.1"
 description = "A library for creating GraphQL APIs"
 category = "main"
 optional = false
@@ -952,8 +774,8 @@ python-multipart = ">=0.0.5,<0.0.6"
 typing_extensions = ">=3.7.4,<5.0.0"
 
 [package.extras]
-asgi = ["starlette (>=0.13.6,<0.17.0)"]
-debug-server = ["starlette (>=0.13.6,<0.17.0)", "uvicorn (>=0.11.6,<0.18.0)"]
+asgi = ["starlette (>=0.13.6)"]
+debug-server = ["starlette (>=0.13.6)", "uvicorn (>=0.11.6,<0.19.0)"]
 django = ["Django (>=3.2)", "asgiref (>=3.2,<4.0)"]
 flask = ["flask (>=1.1)"]
 opentelemetry = ["opentelemetry-api (<2)", "opentelemetry-sdk (<2)"]
@@ -965,7 +787,7 @@ fastapi = ["fastapi (>=0.65.2)"]
 
 [[package]]
 name = "strawberry-graphql-django"
-version = "0.3rc1"
+version = "0.3.1"
 description = "Strawberry GraphQL Django extension"
 category = "main"
 optional = false
@@ -973,15 +795,7 @@ python-versions = ">=3.7,<4.0"
 
 [package.dependencies]
 Django = ">=3.0"
-strawberry-graphql = ">=0.69.0"
-
-[[package]]
-name = "toml"
-version = "0.10.2"
-description = "Python Library for Tom's Obvious, Minimal Language"
-category = "dev"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+strawberry-graphql = ">=0.109.0"
 
 [[package]]
 name = "tomli"
@@ -993,15 +807,15 @@ python-versions = ">=3.7"
 
 [[package]]
 name = "tomlkit"
-version = "0.7.2"
+version = "0.11.1"
 description = "Style preserving TOML library"
 category = "dev"
-optional = true
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+optional = false
+python-versions = ">=3.6,<4.0"
 
 [[package]]
 name = "typed-ast"
-version = "1.5.3"
+version = "1.5.4"
 description = "a fork of Python 2 and 3 ast modules with type comment support"
 category = "dev"
 optional = false
@@ -1026,9 +840,17 @@ python-versions = "*"
 [package.dependencies]
 types-cryptography = "*"
 
+[[package]]
+name = "types-markdown"
+version = "3.3.29"
+description = "Typing stubs for Markdown"
+category = "dev"
+optional = false
+python-versions = "*"
+
 [[package]]
 name = "types-mock"
-version = "4.0.13"
+version = "4.0.15"
 description = "Typing stubs for mock"
 category = "dev"
 optional = false
@@ -1044,7 +866,7 @@ python-versions = "*"
 
 [[package]]
 name = "types-pytz"
-version = "2021.3.7"
+version = "2022.1.1"
 description = "Typing stubs for pytz"
 category = "dev"
 optional = false
@@ -1052,20 +874,47 @@ python-versions = "*"
 
 [[package]]
 name = "types-pyyaml"
-version = "6.0.7"
+version = "6.0.9"
 description = "Typing stubs for PyYAML"
 category = "dev"
 optional = false
 python-versions = "*"
 
+[[package]]
+name = "types-requests"
+version = "2.28.0"
+description = "Typing stubs for requests"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+types-urllib3 = "<1.27"
+
+[[package]]
+name = "types-urllib3"
+version = "1.26.16"
+description = "Typing stubs for urllib3"
+category = "dev"
+optional = false
+python-versions = "*"
+
 [[package]]
 name = "typing-extensions"
-version = "4.2.0"
+version = "4.3.0"
 description = "Backported and Experimental Type Hints for Python 3.7+"
 category = "main"
 optional = false
 python-versions = ">=3.7"
 
+[[package]]
+name = "tzdata"
+version = "2022.1"
+description = "Provider of IANA time zone data"
+category = "main"
+optional = false
+python-versions = ">=2"
+
 [[package]]
 name = "uritemplate"
 version = "4.1.1"
@@ -1076,11 +925,11 @@ python-versions = ">=3.6"
 
 [[package]]
 name = "urllib3"
-version = "1.26.9"
+version = "1.26.10"
 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.*, <4"
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4"
 
 [package.extras]
 brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"]
@@ -1089,14 +938,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 
 [[package]]
 name = "uvicorn"
-version = "0.17.6"
+version = "0.18.2"
 description = "The lightning-fast ASGI server."
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.7"
 
 [package.dependencies]
-asgiref = ">=3.4.0"
 click = ">=7.0"
 colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""}
 h11 = ">=0.8"
@@ -1105,17 +953,17 @@ python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"stan
 PyYAML = {version = ">=5.1", optional = true, markers = "extra == \"standard\""}
 typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
 uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""}
-watchgod = {version = ">=0.6", optional = true, markers = "extra == \"standard\""}
+watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""}
 websockets = {version = ">=10.0", optional = true, markers = "extra == \"standard\""}
 
 [package.extras]
-standard = ["websockets (>=10.0)", "httptools (>=0.4.0)", "watchgod (>=0.6)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "colorama (>=0.4)"]
+standard = ["websockets (>=10.0)", "httptools (>=0.4.0)", "watchfiles (>=0.13)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "colorama (>=0.4)"]
 
 [[package]]
 name = "uvloop"
 version = "0.16.0"
 description = "Fast implementation of asyncio event loop on top of libuv"
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.7"
 
@@ -1126,10 +974,10 @@ test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<
 
 [[package]]
 name = "virtualenv"
-version = "20.14.1"
+version = "20.15.1"
 description = "Virtual Python Environment builder"
 category = "dev"
-optional = true
+optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 
 [package.dependencies]
@@ -1144,10 +992,10 @@ docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sp
 testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"]
 
 [[package]]
-name = "watchgod"
-version = "0.8.2"
-description = "Simple, modern file watching and code reload in python."
-category = "dev"
+name = "watchfiles"
+version = "0.15.0"
+description = "Simple, modern and high performance file watching and code reload in python."
+category = "main"
 optional = true
 python-versions = ">=3.7"
 
@@ -1158,18 +1006,10 @@ anyio = ">=3.0.0,<4"
 name = "websockets"
 version = "10.3"
 description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
-category = "dev"
+category = "main"
 optional = true
 python-versions = ">=3.7"
 
-[[package]]
-name = "wrapt"
-version = "1.14.1"
-description = "Module for decorators, wrappers and monkey patching."
-category = "dev"
-optional = true
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
-
 [[package]]
 name = "zipp"
 version = "3.8.0"
@@ -1183,117 +1023,66 @@ docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
 testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"]
 
 [extras]
-dev = []
+dev = ["uvicorn"]
 
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.7"
-content-hash = "8af972ff2b1da1de529403ec40685be834523b09602f161c99beeab32be5f69d"
+content-hash = "0ef9884d968f19978f3cdc175de4a64588571b670b0193d4c38995e22eaf2d23"
 
 [metadata.files]
 anyio = [
-    {file = "anyio-3.5.0-py3-none-any.whl", hash = "sha256:b5fa16c5ff93fa1046f2eeb5bbff2dad4d3514d6cda61d02816dba34fa8c3c2e"},
-    {file = "anyio-3.5.0.tar.gz", hash = "sha256:a0aeffe2fb1fdf374a8e4b471444f0f3ac4fb9f5a5b542b48824475e0042a5a6"},
+    {file = "anyio-3.6.1-py3-none-any.whl", hash = "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be"},
+    {file = "anyio-3.6.1.tar.gz", hash = "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b"},
 ]
 argcomplete = [
     {file = "argcomplete-1.12.3-py2.py3-none-any.whl", hash = "sha256:291f0beca7fd49ce285d2f10e4c1c77e9460cf823eef2de54df0c0fec88b0d81"},
     {file = "argcomplete-1.12.3.tar.gz", hash = "sha256:2c7dbffd8c045ea534921e63b0be6fe65e88599990d8dc408ac8c542b72a5445"},
 ]
 asgiref = [
-    {file = "asgiref-3.5.1-py3-none-any.whl", hash = "sha256:45a429524fba18aba9d512498b19d220c4d628e75b40cf5c627524dbaebc5cc1"},
-    {file = "asgiref-3.5.1.tar.gz", hash = "sha256:fddeea3c53fa99d0cdb613c3941cc6e52d822491fc2753fba25768fb5bf4e865"},
-]
-astroid = [
-    {file = "astroid-2.11.4-py3-none-any.whl", hash = "sha256:da0632b7c046d8361dfe1b1abb2e085a38624961fabe2997565a9c06c1be9d9a"},
-    {file = "astroid-2.11.4.tar.gz", hash = "sha256:561dc6015eecce7e696ff7e3b40434bc56831afeff783f0ea853e19c4f635c06"},
-]
-atomicwrites = [
-    {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
-    {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
+    {file = "asgiref-3.5.2-py3-none-any.whl", hash = "sha256:1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4"},
+    {file = "asgiref-3.5.2.tar.gz", hash = "sha256:4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424"},
 ]
+atomicwrites = []
 attrs = [
     {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
     {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
 ]
-autopep8 = [
-    {file = "autopep8-1.6.0-py2.py3-none-any.whl", hash = "sha256:ed77137193bbac52d029a52c59bec1b0629b5a186c495f1eb21b126ac466083f"},
-    {file = "autopep8-1.6.0.tar.gz", hash = "sha256:44f0932855039d2c15c4510d6df665e4730f2b8582704fa48f9c55bd3e17d979"},
-]
 "backports.cached-property" = [
-    {file = "backports.cached-property-1.0.1.tar.gz", hash = "sha256:1a5ef1e750f8bc7d0204c807aae8e0f450c655be0cf4b30407a35fd4bb27186c"},
-    {file = "backports.cached_property-1.0.1-py3-none-any.whl", hash = "sha256:687b5fe14be40aadcf547cae91337a1fdb84026046a39370274e54d3fe4fb4f9"},
+    {file = "backports.cached-property-1.0.2.tar.gz", hash = "sha256:9306f9eed6ec55fd156ace6bc1094e2c86fae5fb2bf07b6a9c00745c656e75dd"},
+    {file = "backports.cached_property-1.0.2-py3-none-any.whl", hash = "sha256:baeb28e1cd619a3c9ab8941431fe34e8490861fb998c6c4590693d50171db0cc"},
+]
+"backports.zoneinfo" = [
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"},
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"},
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"},
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"},
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"},
+    {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"},
 ]
 certifi = [
-    {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
-    {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
-]
-cffi = [
-    {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"},
-    {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"},
-    {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"},
-    {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"},
-    {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"},
-    {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"},
-    {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"},
-    {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"},
-    {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"},
-    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"},
-    {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"},
-    {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"},
-    {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"},
-    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"},
-    {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"},
-    {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"},
-    {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"},
-    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"},
-    {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"},
-    {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"},
-    {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"},
-    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"},
-    {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"},
-    {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"},
-    {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"},
-    {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"},
-    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"},
-    {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"},
-    {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"},
-    {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
-]
-cfgv = [
-    {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"},
-    {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"},
-]
-charset-normalizer = [
-    {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"},
-    {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"},
+    {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"},
+    {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"},
 ]
+cffi = []
+charset-normalizer = []
 click = [
     {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
     {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
 ]
 colorama = [
-    {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
-    {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+    {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
+    {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
 ]
 colorlog = [
     {file = "colorlog-6.6.0-py2.py3-none-any.whl", hash = "sha256:351c51e866c86c3217f08e4b067a7974a678be78f07f85fc2d55b8babde6d94e"},
@@ -1308,88 +1097,54 @@ coreschema = [
     {file = "coreschema-0.0.4.tar.gz", hash = "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607"},
 ]
 coverage = [
-    {file = "coverage-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf"},
-    {file = "coverage-6.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac"},
-    {file = "coverage-6.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1"},
-    {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4"},
-    {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903"},
-    {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c"},
-    {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f"},
-    {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05"},
-    {file = "coverage-6.3.2-cp310-cp310-win32.whl", hash = "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39"},
-    {file = "coverage-6.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1"},
-    {file = "coverage-6.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa"},
-    {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518"},
-    {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7"},
-    {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6"},
-    {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad"},
-    {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359"},
-    {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4"},
-    {file = "coverage-6.3.2-cp37-cp37m-win32.whl", hash = "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca"},
-    {file = "coverage-6.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3"},
-    {file = "coverage-6.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d"},
-    {file = "coverage-6.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059"},
-    {file = "coverage-6.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512"},
-    {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca"},
-    {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d"},
-    {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0"},
-    {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6"},
-    {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2"},
-    {file = "coverage-6.3.2-cp38-cp38-win32.whl", hash = "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e"},
-    {file = "coverage-6.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1"},
-    {file = "coverage-6.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620"},
-    {file = "coverage-6.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d"},
-    {file = "coverage-6.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536"},
-    {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7"},
-    {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2"},
-    {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4"},
-    {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69"},
-    {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684"},
-    {file = "coverage-6.3.2-cp39-cp39-win32.whl", hash = "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4"},
-    {file = "coverage-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92"},
-    {file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"},
-    {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"},
-]
-cryptography = [
-    {file = "cryptography-37.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:ef15c2df7656763b4ff20a9bc4381d8352e6640cfeb95c2972c38ef508e75181"},
-    {file = "cryptography-37.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3c81599befb4d4f3d7648ed3217e00d21a9341a9a688ecdd615ff72ffbed7336"},
-    {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2bd1096476aaac820426239ab534b636c77d71af66c547b9ddcd76eb9c79e004"},
-    {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:31fe38d14d2e5f787e0aecef831457da6cec68e0bb09a35835b0b44ae8b988fe"},
-    {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:093cb351031656d3ee2f4fa1be579a8c69c754cf874206be1d4cf3b542042804"},
-    {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59b281eab51e1b6b6afa525af2bd93c16d49358404f814fe2c2410058623928c"},
-    {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:0cc20f655157d4cfc7bada909dc5cc228211b075ba8407c46467f63597c78178"},
-    {file = "cryptography-37.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f8ec91983e638a9bcd75b39f1396e5c0dc2330cbd9ce4accefe68717e6779e0a"},
-    {file = "cryptography-37.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:46f4c544f6557a2fefa7ac8ac7d1b17bf9b647bd20b16decc8fbcab7117fbc15"},
-    {file = "cryptography-37.0.2-cp36-abi3-win32.whl", hash = "sha256:731c8abd27693323b348518ed0e0705713a36d79fdbd969ad968fbef0979a7e0"},
-    {file = "cryptography-37.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:471e0d70201c069f74c837983189949aa0d24bb2d751b57e26e3761f2f782b8d"},
-    {file = "cryptography-37.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a68254dd88021f24a68b613d8c51d5c5e74d735878b9e32cc0adf19d1f10aaf9"},
-    {file = "cryptography-37.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:a7d5137e556cc0ea418dca6186deabe9129cee318618eb1ffecbd35bee55ddc1"},
-    {file = "cryptography-37.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aeaba7b5e756ea52c8861c133c596afe93dd716cbcacae23b80bc238202dc023"},
-    {file = "cryptography-37.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95e590dd70642eb2079d280420a888190aa040ad20f19ec8c6e097e38aa29e06"},
-    {file = "cryptography-37.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1b9362d34363f2c71b7853f6251219298124aa4cc2075ae2932e64c91a3e2717"},
-    {file = "cryptography-37.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e53258e69874a306fcecb88b7534d61820db8a98655662a3dd2ec7f1afd9132f"},
-    {file = "cryptography-37.0.2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:1f3bfbd611db5cb58ca82f3deb35e83af34bb8cf06043fa61500157d50a70982"},
-    {file = "cryptography-37.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:419c57d7b63f5ec38b1199a9521d77d7d1754eb97827bbb773162073ccd8c8d4"},
-    {file = "cryptography-37.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:dc26bb134452081859aa21d4990474ddb7e863aa39e60d1592800a8865a702de"},
-    {file = "cryptography-37.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b8398b3d0efc420e777c40c16764d6870bcef2eb383df9c6dbb9ffe12c64452"},
-    {file = "cryptography-37.0.2.tar.gz", hash = "sha256:f224ad253cc9cea7568f49077007d2263efa57396a2f2f78114066fd54b5c68e"},
-]
-darglint = [
-    {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"},
-    {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"},
-]
-dill = [
-    {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"},
-    {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"},
-]
+    {file = "coverage-6.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1d5aa2703e1dab4ae6cf416eb0095304f49d004c39e9db1d86f57924f43006b"},
+    {file = "coverage-6.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ce1b258493cbf8aec43e9b50d89982346b98e9ffdfaae8ae5793bc112fb0068"},
+    {file = "coverage-6.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c4e737f60c6936460c5be330d296dd5b48b3963f48634c53b3f7deb0f34ec4"},
+    {file = "coverage-6.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84e65ef149028516c6d64461b95a8dbcfce95cfd5b9eb634320596173332ea84"},
+    {file = "coverage-6.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f69718750eaae75efe506406c490d6fc5a6161d047206cc63ce25527e8a3adad"},
+    {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e57816f8ffe46b1df8f12e1b348f06d164fd5219beba7d9433ba79608ef011cc"},
+    {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:01c5615d13f3dd3aa8543afc069e5319cfa0c7d712f6e04b920431e5c564a749"},
+    {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75ab269400706fab15981fd4bd5080c56bd5cc07c3bccb86aab5e1d5a88dc8f4"},
+    {file = "coverage-6.4.1-cp310-cp310-win32.whl", hash = "sha256:a7f3049243783df2e6cc6deafc49ea123522b59f464831476d3d1448e30d72df"},
+    {file = "coverage-6.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ee2ddcac99b2d2aec413e36d7a429ae9ebcadf912946b13ffa88e7d4c9b712d6"},
+    {file = "coverage-6.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb73e0011b8793c053bfa85e53129ba5f0250fdc0392c1591fd35d915ec75c46"},
+    {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106c16dfe494de3193ec55cac9640dd039b66e196e4641fa8ac396181578b982"},
+    {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f4f3df85aa39da00fd3ec4b5abeb7407e82b68c7c5ad181308b0e2526da5d4"},
+    {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:961e2fb0680b4f5ad63234e0bf55dfb90d302740ae9c7ed0120677a94a1590cb"},
+    {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cec3a0f75c8f1031825e19cd86ee787e87cf03e4fd2865c79c057092e69e3a3b"},
+    {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:129cd05ba6f0d08a766d942a9ed4b29283aff7b2cccf5b7ce279d50796860bb3"},
+    {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bf5601c33213d3cb19d17a796f8a14a9eaa5e87629a53979a5981e3e3ae166f6"},
+    {file = "coverage-6.4.1-cp37-cp37m-win32.whl", hash = "sha256:269eaa2c20a13a5bf17558d4dc91a8d078c4fa1872f25303dddcbba3a813085e"},
+    {file = "coverage-6.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f02cbbf8119db68455b9d763f2f8737bb7db7e43720afa07d8eb1604e5c5ae28"},
+    {file = "coverage-6.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ffa9297c3a453fba4717d06df579af42ab9a28022444cae7fa605af4df612d54"},
+    {file = "coverage-6.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:145f296d00441ca703a659e8f3eb48ae39fb083baba2d7ce4482fb2723e050d9"},
+    {file = "coverage-6.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d44996140af8b84284e5e7d398e589574b376fb4de8ccd28d82ad8e3bea13"},
+    {file = "coverage-6.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2bd9a6fc18aab8d2e18f89b7ff91c0f34ff4d5e0ba0b33e989b3cd4194c81fd9"},
+    {file = "coverage-6.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3384f2a3652cef289e38100f2d037956194a837221edd520a7ee5b42d00cc605"},
+    {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b3e07152b4563722be523e8cd0b209e0d1a373022cfbde395ebb6575bf6790d"},
+    {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1480ff858b4113db2718848d7b2d1b75bc79895a9c22e76a221b9d8d62496428"},
+    {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:865d69ae811a392f4d06bde506d531f6a28a00af36f5c8649684a9e5e4a85c83"},
+    {file = "coverage-6.4.1-cp38-cp38-win32.whl", hash = "sha256:664a47ce62fe4bef9e2d2c430306e1428ecea207ffd68649e3b942fa8ea83b0b"},
+    {file = "coverage-6.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:26dff09fb0d82693ba9e6231248641d60ba606150d02ed45110f9ec26404ed1c"},
+    {file = "coverage-6.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9c80df769f5ec05ad21ea34be7458d1dc51ff1fb4b2219e77fe24edf462d6df"},
+    {file = "coverage-6.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39ee53946bf009788108b4dd2894bf1349b4e0ca18c2016ffa7d26ce46b8f10d"},
+    {file = "coverage-6.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5b66caa62922531059bc5ac04f836860412f7f88d38a476eda0a6f11d4724f4"},
+    {file = "coverage-6.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd180ed867e289964404051a958f7cccabdeed423f91a899829264bb7974d3d3"},
+    {file = "coverage-6.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84631e81dd053e8a0d4967cedab6db94345f1c36107c71698f746cb2636c63e3"},
+    {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8c08da0bd238f2970230c2a0d28ff0e99961598cb2e810245d7fc5afcf1254e8"},
+    {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d42c549a8f41dc103a8004b9f0c433e2086add8a719da00e246e17cbe4056f72"},
+    {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:309ce4a522ed5fca432af4ebe0f32b21d6d7ccbb0f5fcc99290e71feba67c264"},
+    {file = "coverage-6.4.1-cp39-cp39-win32.whl", hash = "sha256:fdb6f7bd51c2d1714cea40718f6149ad9be6a2ee7d93b19e9f00934c0f2a74d9"},
+    {file = "coverage-6.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:342d4aefd1c3e7f620a13f4fe563154d808b69cccef415415aece4c786665397"},
+    {file = "coverage-6.4.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:4803e7ccf93230accb928f3a68f00ffa80a88213af98ed338a57ad021ef06815"},
+    {file = "coverage-6.4.1.tar.gz", hash = "sha256:4321f075095a096e70aff1d002030ee612b65a205a0a0f5b815280d5dc58100c"},
+]
+cryptography = []
 distlib = [
     {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"},
     {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"},
 ]
-django = [
-    {file = "Django-3.2.13-py3-none-any.whl", hash = "sha256:b896ca61edc079eb6bbaa15cf6071eb69d6aac08cce5211583cfb41515644fdf"},
-    {file = "Django-3.2.13.tar.gz", hash = "sha256:6d93497a0a9bf6ba0e0b1a29cccdc40efbfc76297255b1309b3a884a688ec4b6"},
-]
+django = []
 django-admin-display = [
     {file = "django-admin-display-1.3.0.tar.gz", hash = "sha256:8ee2a0c8d360099919072e18af5f93c67a4fbf6c272acb16f9558bc9935a21ee"},
     {file = "django_admin_display-1.3.0-py3-none-any.whl", hash = "sha256:d7491cd817d4dbf36f020a69f99db7687e3d1470207dc3f2cf649e53ead307d0"},
@@ -1397,29 +1152,19 @@ django-admin-display = [
 django-mock-queries = [
     {file = "django_mock_queries-2.1.7.tar.gz", hash = "sha256:7ee3f34752e8131479924ea6952fe37c4106cc18e6fc3e5e9b28b333eeda10b3"},
 ]
-django-stubs = [
-    {file = "django-stubs-1.9.0.tar.gz", hash = "sha256:664843091636a917faf5256d028476559dc360fdef9050b6df87ab61b21607bf"},
-    {file = "django_stubs-1.9.0-py3-none-any.whl", hash = "sha256:59c9f81af64d214b1954eaf90f037778c8d2b9c2de946a3cda177fefcf588fbd"},
-]
-django-stubs-ext = [
-    {file = "django-stubs-ext-0.4.0.tar.gz", hash = "sha256:3104c4748c34bd741c310a3e6af90dffba46e41bccbe243896e38a708262876b"},
-    {file = "django_stubs_ext-0.4.0-py3-none-any.whl", hash = "sha256:901fc77b6338ea29fa381300ff598dd57d461a4882b756404e2aa7724f76fd7d"},
-]
+django-stubs = []
+django-stubs-ext = []
 djangorestframework = [
     {file = "djangorestframework-3.13.1-py3-none-any.whl", hash = "sha256:24c4bf58ed7e85d1fe4ba250ab2da926d263cd57d64b03e8dcef0ac683f8b1aa"},
     {file = "djangorestframework-3.13.1.tar.gz", hash = "sha256:0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee"},
 ]
 djangorestframework-stubs = [
-    {file = "djangorestframework-stubs-1.4.0.tar.gz", hash = "sha256:037f0582b1e6c79366b6a839da861474d59210c4bfa1d36291545cb6ede6a0da"},
-    {file = "djangorestframework_stubs-1.4.0-py3-none-any.whl", hash = "sha256:f6ed5fb19c12aa752288ddc6ad28d4ca7c81681ca7f28a19aba9064b2a69489c"},
-]
-dparse = [
-    {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"},
-    {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
+    {file = "djangorestframework-stubs-1.7.0.tar.gz", hash = "sha256:6e8a80a0716d8af02aa387dae47f8ef97b6c0efdf159d83a5918d582f8b1ea07"},
+    {file = "djangorestframework_stubs-1.7.0-py3-none-any.whl", hash = "sha256:3ac1447fc87f68fe7d8622d4725b5cef820bcc17918f36c7da3f667363fb7a43"},
 ]
 filelock = [
-    {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"},
-    {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"},
+    {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"},
+    {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"},
 ]
 graphql-core = [
     {file = "graphql-core-3.2.1.tar.gz", hash = "sha256:9d1bf141427b7d54be944587c8349df791ce60ade2e3cccaf9c56368c133c201"},
@@ -1465,26 +1210,15 @@ httptools = [
     {file = "httptools-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:34d2903dd2a3dd85d33705b6fde40bf91fc44411661283763fd0746723963c83"},
     {file = "httptools-0.4.0.tar.gz", hash = "sha256:2c9a930c378b3d15d6b695fb95ebcff81a7395b4f9775c4f10a076beb0b2c1ff"},
 ]
-identify = [
-    {file = "identify-2.5.0-py2.py3-none-any.whl", hash = "sha256:3acfe15a96e4272b4ec5662ee3e231ceba976ef63fd9980ed2ce9cc415df393f"},
-    {file = "identify-2.5.0.tar.gz", hash = "sha256:c83af514ea50bf2be2c4a3f2fb349442b59dc87284558ae9ff54191bff3541d2"},
-]
 idna = [
     {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
     {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
 ]
-importlib-metadata = [
-    {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"},
-    {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"},
-]
+importlib-metadata = []
 iniconfig = [
     {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
     {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
 ]
-isort = [
-    {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"},
-    {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"},
-]
 itypes = [
     {file = "itypes-1.2.0-py2.py3-none-any.whl", hash = "sha256:03da6872ca89d29aef62773672b2d408f490f80db48b23079a4b194c86dd04c6"},
     {file = "itypes-1.2.0.tar.gz", hash = "sha256:af886f129dea4a2a1e3d36595a2d139589e4dd287f5cab0b40e799ee81570ff1"},
@@ -1493,45 +1227,6 @@ jinja2 = [
     {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
     {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
 ]
-lazy-object-proxy = [
-    {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"},
-    {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"},
-    {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"},
-    {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"},
-    {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"},
-    {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"},
-    {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"},
-    {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"},
-    {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"},
-    {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"},
-    {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"},
-    {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"},
-    {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"},
-    {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"},
-    {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"},
-    {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"},
-    {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"},
-    {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"},
-    {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"},
-    {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"},
-    {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"},
-    {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"},
-    {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"},
-    {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"},
-    {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"},
-    {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"},
-    {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"},
-    {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"},
-    {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"},
-    {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"},
-    {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"},
-    {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"},
-    {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"},
-    {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"},
-    {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"},
-    {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"},
-    {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"},
-]
 markupsafe = [
     {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"},
     {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"},
@@ -1574,18 +1269,11 @@ markupsafe = [
     {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"},
     {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"},
 ]
-mccabe = [
-    {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
-    {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
-]
 mock = [
     {file = "mock-4.0.3-py3-none-any.whl", hash = "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62"},
     {file = "mock-4.0.3.tar.gz", hash = "sha256:7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc"},
 ]
-model-bakery = [
-    {file = "model_bakery-1.5.0-py2.py3-none-any.whl", hash = "sha256:e4e09e1c536e3b7d5e7a827d4d1ccd4540dea56062d766b506d86067d3a94dea"},
-    {file = "model_bakery-1.5.0.tar.gz", hash = "sha256:ed533de56df7af4f08f786f82532802f994e2ef01d8366ec4fe6d588585d8ac7"},
-]
+model-bakery = []
 mypy = [
     {file = "mypy-0.950-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b"},
     {file = "mypy-0.950-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0"},
@@ -1615,18 +1303,11 @@ mypy-extensions = [
     {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
     {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
 ]
-nodeenv = [
-    {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"},
-    {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"},
-]
 nox = [
     {file = "nox-2022.1.7-py3-none-any.whl", hash = "sha256:efee12f02d39405b16d68f60e7a06fe1fc450ae58669d6cdda8c7f48e3bae9e3"},
     {file = "nox-2022.1.7.tar.gz", hash = "sha256:b375238cebb0b9df2fab74b8d0ce1a50cd80df60ca2e13f38f539454fcd97d7e"},
 ]
-nox-poetry = [
-    {file = "nox-poetry-0.9.0.tar.gz", hash = "sha256:ea48fa535cd048854da35af7c6c3e92046fbed9b9023bb81193fb4d2d3a47c92"},
-    {file = "nox_poetry-0.9.0-py3-none-any.whl", hash = "sha256:33423c855fb47e2901faf9e15937326bc20c6e356eef825903eed4f8bbda69d3"},
-]
+nox-poetry = []
 packaging = [
     {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
     {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
@@ -1639,22 +1320,10 @@ pluggy = [
     {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
     {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
 ]
-pre-commit = [
-    {file = "pre_commit-2.18.1-py2.py3-none-any.whl", hash = "sha256:02226e69564ebca1a070bd1f046af866aa1c318dbc430027c50ab832ed2b73f2"},
-    {file = "pre_commit-2.18.1.tar.gz", hash = "sha256:5d445ee1fa8738d506881c5d84f83c62bb5be6b2838e32207433647e8e5ebe10"},
-]
-pre-commit-hooks = [
-    {file = "pre_commit_hooks-4.2.0-py2.py3-none-any.whl", hash = "sha256:b3a3066c5ecd5fdda9abdc932bd064bd21785ea041659676403e6fc5d964afed"},
-    {file = "pre_commit_hooks-4.2.0.tar.gz", hash = "sha256:9726420c7a071e8cb233a066d36bc074b593a40f0b1b491d1b75aafa55390703"},
-]
 py = [
     {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
     {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
 ]
-pycodestyle = [
-    {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
-    {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
-]
 pycparser = [
     {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
     {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
@@ -1663,17 +1332,10 @@ pygments = [
     {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"},
     {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"},
 ]
-pyjwt = [
-    {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"},
-    {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"},
-]
-pylint = [
-    {file = "pylint-2.13.8-py3-none-any.whl", hash = "sha256:f87e863a0b08f64b5230e7e779bcb75276346995737b2c0dc2793070487b1ff6"},
-    {file = "pylint-2.13.8.tar.gz", hash = "sha256:ced8968c3b699df0615e2a709554dec3ddac2f5cd06efadb69554a69eeca364a"},
-]
+pyjwt = []
 pyparsing = [
-    {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"},
-    {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"},
+    {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
+    {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
 ]
 pytest = [
     {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"},
@@ -1737,45 +1399,7 @@ pyyaml = [
     {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
     {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
 ]
-requests = [
-    {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"},
-    {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"},
-]
-"ruamel.yaml" = [
-    {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"},
-    {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"},
-]
-"ruamel.yaml.clib" = [
-    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"},
-    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"},
-    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"},
-    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"},
-    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"},
-    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"},
-    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"},
-    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"},
-    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"},
-    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"},
-    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"},
-    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"},
-    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"},
-    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"},
-    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"},
-    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"},
-    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"},
-    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"},
-    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"},
-    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"},
-    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"},
-    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"},
-    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"},
-    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"},
-    {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"},
-]
-safety = [
-    {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"},
-    {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"},
-]
+requests = []
 six = [
     {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
     {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
@@ -1788,52 +1412,14 @@ sqlparse = [
     {file = "sqlparse-0.4.2-py3-none-any.whl", hash = "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"},
     {file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"},
 ]
-strawberry-graphql = [
-    {file = "strawberry-graphql-0.111.1.tar.gz", hash = "sha256:a4b91fb393e8385263bdba8b3ba9ce274207182a5d268b44253d0c79e326d217"},
-    {file = "strawberry_graphql-0.111.1-py3-none-any.whl", hash = "sha256:42bce8eda4b146fc466f52c8705f8cbad4ffa5723c6c6f69b0c154980a418cb2"},
-]
-strawberry-graphql-django = [
-    {file = "strawberry-graphql-django-0.3rc1.tar.gz", hash = "sha256:02b23746cc890710fed9c9f1dbc0c08594011ebc193a5044501e7cd0a12a4ab4"},
-    {file = "strawberry_graphql_django-0.3rc1-py3-none-any.whl", hash = "sha256:4a51b0c9cc3e7a452a445bc72fcf5bd286e2858577d4457d7a98b79b2dab098f"},
-]
-toml = [
-    {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
-    {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
-]
+strawberry-graphql = []
+strawberry-graphql-django = []
 tomli = [
     {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
     {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
 ]
-tomlkit = [
-    {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"},
-    {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"},
-]
-typed-ast = [
-    {file = "typed_ast-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ad3b48cf2b487be140072fb86feff36801487d4abb7382bb1929aaac80638ea"},
-    {file = "typed_ast-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:542cd732351ba8235f20faa0fc7398946fe1a57f2cdb289e5497e1e7f48cfedb"},
-    {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc2c11ae59003d4a26dda637222d9ae924387f96acae9492df663843aefad55"},
-    {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd5df1313915dbd70eaaa88c19030b441742e8b05e6103c631c83b75e0435ccc"},
-    {file = "typed_ast-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:e34f9b9e61333ecb0f7d79c21c28aa5cd63bec15cb7e1310d7d3da6ce886bc9b"},
-    {file = "typed_ast-1.5.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f818c5b81966d4728fec14caa338e30a70dfc3da577984d38f97816c4b3071ec"},
-    {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3042bfc9ca118712c9809201f55355479cfcdc17449f9f8db5e744e9625c6805"},
-    {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fff9fdcce59dc61ec1b317bdb319f8f4e6b69ebbe61193ae0a60c5f9333dc49"},
-    {file = "typed_ast-1.5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8e0b8528838ffd426fea8d18bde4c73bcb4167218998cc8b9ee0a0f2bfe678a6"},
-    {file = "typed_ast-1.5.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ef1d96ad05a291f5c36895d86d1375c0ee70595b90f6bb5f5fdbee749b146db"},
-    {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed44e81517364cb5ba367e4f68fca01fba42a7a4690d40c07886586ac267d9b9"},
-    {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f60d9de0d087454c91b3999a296d0c4558c1666771e3460621875021bf899af9"},
-    {file = "typed_ast-1.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9e237e74fd321a55c90eee9bc5d44be976979ad38a29bbd734148295c1ce7617"},
-    {file = "typed_ast-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee852185964744987609b40aee1d2eb81502ae63ee8eef614558f96a56c1902d"},
-    {file = "typed_ast-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27e46cdd01d6c3a0dd8f728b6a938a6751f7bd324817501c15fb056307f918c6"},
-    {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d64dabc6336ddc10373922a146fa2256043b3b43e61f28961caec2a5207c56d5"},
-    {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8cdf91b0c466a6c43f36c1964772918a2c04cfa83df8001ff32a89e357f8eb06"},
-    {file = "typed_ast-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:9cc9e1457e1feb06b075c8ef8aeb046a28ec351b1958b42c7c31c989c841403a"},
-    {file = "typed_ast-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e20d196815eeffb3d76b75223e8ffed124e65ee62097e4e73afb5fec6b993e7a"},
-    {file = "typed_ast-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:37e5349d1d5de2f4763d534ccb26809d1c24b180a477659a12c4bde9dd677d74"},
-    {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f1a27592fac87daa4e3f16538713d705599b0a27dfe25518b80b6b017f0a6d"},
-    {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8831479695eadc8b5ffed06fdfb3e424adc37962a75925668deeb503f446c0a3"},
-    {file = "typed_ast-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:20d5118e494478ef2d3a2702d964dae830aedd7b4d3b626d003eea526be18718"},
-    {file = "typed_ast-1.5.3.tar.gz", hash = "sha256:27f25232e2dd0edfe1f019d6bfaaf11e86e657d9bdb7b0956db95f560cceb2b3"},
-]
+tomlkit = []
+typed-ast = []
 types-cryptography = [
     {file = "types-cryptography-3.3.21.tar.gz", hash = "sha256:ad1b9c63159c009f8676c7e41a4d595dfb96e8c03affa2e693e1617908bb409e"},
     {file = "types_cryptography-3.3.21-py3-none-any.whl", hash = "sha256:bdeb6dd07280ac724e05f02e0d8ef01fdef729b18bb07d635d64de83171a4e70"},
@@ -1841,38 +1427,33 @@ types-cryptography = [
 types-jwt = [
     {file = "types_jwt-0.1.3-py2.py3-none-any.whl", hash = "sha256:36a1d5f99b349428f9ca5695e5caf3378398ae31d7aaed1c668c81451ba79b08"},
 ]
-types-mock = [
-    {file = "types-mock-4.0.13.tar.gz", hash = "sha256:82c819a5ba384c47a65c148df062138f38790b61d7e6b40eaeb8f2179f28f842"},
-    {file = "types_mock-4.0.13-py3-none-any.whl", hash = "sha256:7c1db9f937109d96da14e5ed95c89920c3e4913eeff44a4adfea38eb335d0c99"},
-]
+types-markdown = []
+types-mock = []
 types-pkg-resources = [
     {file = "types-pkg_resources-0.1.3.tar.gz", hash = "sha256:834a9b8d3dbea343562fd99d5d3359a726f6bf9d3733bccd2b4f3096fbab9dae"},
     {file = "types_pkg_resources-0.1.3-py2.py3-none-any.whl", hash = "sha256:0cb9972cee992249f93fff1a491bf2dc3ce674e5a1926e27d4f0866f7d9b6d9c"},
 ]
-types-pytz = [
-    {file = "types-pytz-2021.3.7.tar.gz", hash = "sha256:11d5ba06268167953ccc4a3eee192c24b42d00d2aef456c160a8798893cb2081"},
-    {file = "types_pytz-2021.3.7-py3-none-any.whl", hash = "sha256:0f67528c1df2017b61a45f2f9cfa2d45b16ce1dc135f09c7d2fd258998aade58"},
-]
+types-pytz = []
 types-pyyaml = [
-    {file = "types-PyYAML-6.0.7.tar.gz", hash = "sha256:59480cf44595d836aaae050f35e3c39f197f3a833679ef3978d97aa9f2fb7def"},
-    {file = "types_PyYAML-6.0.7-py3-none-any.whl", hash = "sha256:7b273a34f32af9910cf9405728c9d2ad3afc4be63e4048091a1a73d76681fe67"},
+    {file = "types-PyYAML-6.0.9.tar.gz", hash = "sha256:33ae75c84b8f61fddf0c63e9c7e557db9db1694ad3c2ee8628ec5efebb5a5e9b"},
+    {file = "types_PyYAML-6.0.9-py3-none-any.whl", hash = "sha256:b738e9ef120da0af8c235ba49d3b72510f56ef9bcc308fc8e7357100ff122284"},
 ]
+types-requests = []
+types-urllib3 = []
 typing-extensions = [
-    {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"},
-    {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"},
+    {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"},
+    {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"},
+]
+tzdata = [
+    {file = "tzdata-2022.1-py2.py3-none-any.whl", hash = "sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9"},
+    {file = "tzdata-2022.1.tar.gz", hash = "sha256:8b536a8ec63dc0751342b3984193a3118f8fca2afe25752bb9b7fffd398552d3"},
 ]
 uritemplate = [
     {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"},
     {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"},
 ]
-urllib3 = [
-    {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"},
-    {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"},
-]
-uvicorn = [
-    {file = "uvicorn-0.17.6-py3-none-any.whl", hash = "sha256:19e2a0e96c9ac5581c01eb1a79a7d2f72bb479691acd2b8921fce48ed5b961a6"},
-    {file = "uvicorn-0.17.6.tar.gz", hash = "sha256:5180f9d059611747d841a4a4c4ab675edf54c8489e97f96d0583ee90ac3bfc23"},
-]
+urllib3 = []
+uvicorn = []
 uvloop = [
     {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"},
     {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30ba9dcbd0965f5c812b7c2112a1ddf60cf904c1c160f398e7eed3a6b82dcd9c"},
@@ -1891,14 +1472,8 @@ uvloop = [
     {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"},
     {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"},
 ]
-virtualenv = [
-    {file = "virtualenv-20.14.1-py2.py3-none-any.whl", hash = "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a"},
-    {file = "virtualenv-20.14.1.tar.gz", hash = "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"},
-]
-watchgod = [
-    {file = "watchgod-0.8.2-py3-none-any.whl", hash = "sha256:2f3e8137d98f493ff58af54ea00f4d1433a6afe2ed08ab331a657df468c6bfce"},
-    {file = "watchgod-0.8.2.tar.gz", hash = "sha256:cb11ff66657befba94d828e3b622d5fb76f22fbda1376f355f3e6e51e97d9450"},
-]
+virtualenv = []
+watchfiles = []
 websockets = [
     {file = "websockets-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:661f641b44ed315556a2fa630239adfd77bd1b11cb0b9d96ed8ad90b0b1e4978"},
     {file = "websockets-10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b529fdfa881b69fe563dbd98acce84f3e5a67df13de415e143ef053ff006d500"},
@@ -1949,72 +1524,6 @@ websockets = [
     {file = "websockets-10.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3eda1cb7e9da1b22588cefff09f0951771d6ee9fa8dbe66f5ae04cc5f26b2b55"},
     {file = "websockets-10.3.tar.gz", hash = "sha256:fc06cc8073c8e87072138ba1e431300e2d408f054b27047d047b549455066ff4"},
 ]
-wrapt = [
-    {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"},
-    {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"},
-    {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"},
-    {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"},
-    {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"},
-    {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"},
-    {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"},
-    {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"},
-    {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"},
-    {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"},
-    {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"},
-    {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"},
-    {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"},
-    {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"},
-    {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"},
-    {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"},
-    {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"},
-    {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"},
-    {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"},
-    {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"},
-    {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"},
-    {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"},
-    {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"},
-    {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"},
-    {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"},
-    {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"},
-    {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"},
-    {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"},
-    {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"},
-    {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"},
-    {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"},
-    {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"},
-    {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"},
-    {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"},
-    {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"},
-    {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"},
-    {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"},
-    {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"},
-    {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"},
-    {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"},
-    {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"},
-    {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"},
-    {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"},
-    {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"},
-    {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"},
-    {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"},
-    {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"},
-    {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"},
-    {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"},
-    {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"},
-    {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"},
-    {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"},
-    {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"},
-    {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"},
-    {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"},
-    {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"},
-    {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"},
-    {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"},
-    {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"},
-    {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"},
-    {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"},
-    {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"},
-    {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"},
-    {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"},
-]
 zipp = [
     {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"},
     {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"},
diff --git a/pyproject.toml b/pyproject.toml
index f73b1146..745d9eda 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -27,43 +27,34 @@ Django = [
     { version = ">=3.2,<5", markers = "python_version >= '3.8'", optional = true }
 ]
 PyJWT = ">=1.7.1,<3.0"
-strawberry-graphql = ">=0.69.0,<1.0.0"
-strawberry-graphql-django = { version = ">=0.2.5,<4.0", allow-prereleases = true }
+strawberry-graphql = ">=0.109.0,<1.0.0"
+strawberry-graphql-django = { version = ">=0.3,<4.0", allow-prereleases = true }
 django-admin-display = "^1.3.0"
 packaging = ">=20.0,<30.0"
 importlib-metadata = { version = ">=1.7,<5.0", python = "<=3.7" }
+# For use in local tests and development, in future poetry release replace with dev-dependencies group.
+uvicorn = { extras = ["standard"], version = "^0.18.2", optional = true }
 
 [tool.poetry.dev-dependencies]
 cryptography = "^37.0"
-coverage = "^6.3"
+coverage = { extras = ["toml"], version = "^6.4.1" }
 pytest = "^7.0"
 pytest-cov = "^3.0"
 pytest-django = "^4.0.0"
 types-cryptography = "^3.3.15"
-django-stubs = "^1.9.0"
+django-stubs = { extras = ["compatible-mypy"], version = "<1.12.0" }
 django-mock-queries = "^2.1.7"
 types-mock = "^4.0.0"
 types-jwt = "^0.1.0"
 types-pkg-resources = "^0.1.0"
 djangorestframework-stubs = "^1.4.0"
 djangorestframework = "^3.12.4"
-
-# For use in local tests and development
-uvicorn = { extras = ["standard"], version = "^0.17.0", optional = true }
-nox-poetry = { version = "^0.9.0", optional = true }
-nox = { version = "^2022.1.7", optional = true }
-pylint = { version = "^2.12.2", optional = true }
-
-# For use in CI and local development
-autopep8 = { version = "^1.1", optional = true }
-darglint = { version = "^1.5.0", optional = true }
-mypy = { version = "^0.950", optional = true }
-safety = { version = "^1.0", optional = true }
-pre-commit = { version = "^2.15.0", optional = true }
-pre-commit-hooks = { version = "^4.0.0", optional = true }
+nox-poetry = "^1.0.1"
+nox = "^2022.1.7"
+mock = { version = "^4.0", python = "<3.8" }
 
 [tool.poetry.extras]
-dev = ["uvicorn", "nox-poetry", "nox", "pre-commit", "pre-commit-hooks", "autopep8", "darglint", "mypy", "safety", "pylint"]
+dev = ["uvicorn"]
 
 [tool.pytest.ini_options]
 minversion = "6.0"
@@ -73,9 +64,50 @@ testpaths = [
 ]
 DJANGO_SETTINGS_MODULE = "tests.example_app.settings"
 python_files = "tests.py test_*.py *_tests.py"
-filterwarnings = [
-    "ignore:`is_unset` is deprecated use `value is UNSET` instead:DeprecationWarning",
-    "ignore:importing `UNSET` from `strawberry.arguments` is deprecated, import instead from `strawberry` or from `strawberry.unset`:DeprecationWarning",
+filterwarnings = []
+
+[tool.black]
+line-length = 160
+target-version = ['py38', 'py39', 'py310']
+exclude = '''
+/(
+    \.eggs
+  | \.git
+  | \.hg
+  | \.mypy_cache
+  | \.tox
+  | \.venv
+  | __pycached__
+  | _build
+  | buck-out
+  | build
+  | dist
+)/
+'''
+
+[tool.isort]
+profile = "black"
+multi_line_output = 3
+force_sort_within_sections = true
+
+[tool.django-stubs]
+django_settings_module = "strawberry_django_jwt.settings"
+
+[tool.coverage.run]
+source = ["strawberry_django_jwt"]
+branch = true
+omit = [".venv/**", "tests/migrations/**", "manage.py"]
+
+[tool.coverage.report]
+precision = 2
+exclude_lines = [
+    "pragma: nocover",
+    "pragma:nocover",
+    "if TYPE_CHECKING:",
+    "@overload",
+    "@abstractmethod",
+    "@abc.abstractmethod",
+    "assert_never",
 ]
 
 [tool.poetry.urls]
diff --git a/strawberry_django_jwt/auth.py b/strawberry_django_jwt/auth.py
index 196f3970..d02284c2 100644
--- a/strawberry_django_jwt/auth.py
+++ b/strawberry_django_jwt/auth.py
@@ -3,8 +3,7 @@
 import re
 
 from asgiref.sync import sync_to_async
-from django.contrib.auth import get_backends
-from django.contrib.auth import user_login_failed
+from django.contrib.auth import get_backends, user_login_failed
 from django.core.exceptions import PermissionDenied
 from django.core.handlers.asgi import ASGIRequest
 from django.views.decorators.debug import sensitive_variables
@@ -46,9 +45,7 @@ async def authenticate(request=None, **credentials):
                 user = await backend.authenticate(request, **credentials)
             else:
                 if isinstance(request, ASGIRequest):
-                    user = await sync_to_async(backend.authenticate)(
-                        request, **credentials
-                    )
+                    user = await sync_to_async(backend.authenticate)(request, **credentials)
                 else:
                     user = backend.authenticate(request, **credentials)
         except PermissionDenied:
@@ -61,6 +58,6 @@ async def authenticate(request=None, **credentials):
         return user
 
     # The credentials supplied are invalid to all backends, fire signal
-    user_login_failed.send(
-        sender=__name__, credentials=_clean_credentials(credentials), request=request
-    )
+    user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)
+
+    return None
diff --git a/strawberry_django_jwt/backends.py b/strawberry_django_jwt/backends.py
index 594471d8..b395fded 100644
--- a/strawberry_django_jwt/backends.py
+++ b/strawberry_django_jwt/backends.py
@@ -1,5 +1,5 @@
-from .shortcuts import get_user_by_token, get_user_by_token_async
-from .utils import get_credentials
+from strawberry_django_jwt.shortcuts import get_user_by_token, get_user_by_token_async
+from strawberry_django_jwt.utils import get_credentials
 
 
 class JSONWebTokenBackend:
diff --git a/strawberry_django_jwt/decorators.py b/strawberry_django_jwt/decorators.py
index ec22938e..89b0ed83 100644
--- a/strawberry_django_jwt/decorators.py
+++ b/strawberry_django_jwt/decorators.py
@@ -1,28 +1,32 @@
-import inspect
 from calendar import timegm
 from datetime import datetime
 from functools import wraps
+import inspect
 
-import django.contrib.auth.base_user
-import strawberry
 from asgiref.sync import sync_to_async
 from django.contrib.auth import get_user_model
+import django.contrib.auth.base_user
 from django.core.handlers.asgi import ASGIRequest
 from django.middleware.csrf import rotate_token
 from django.utils.translation import gettext as _
+import strawberry
 from strawberry.types import Info
 from strawberry_django.utils import is_async
 
-from . import exceptions
-from . import signals
-from .auth import authenticate
-from .refresh_token.shortcuts import create_refresh_token, refresh_token_lazy_async
-from .refresh_token.shortcuts import refresh_token_lazy
-from .settings import jwt_settings
-from .utils import delete_cookie
-from .utils import get_context
-from .utils import maybe_thenable
-from .utils import set_cookie
+from strawberry_django_jwt import exceptions, signals
+from strawberry_django_jwt.auth import authenticate
+from strawberry_django_jwt.refresh_token.shortcuts import (
+    create_refresh_token,
+    refresh_token_lazy,
+    refresh_token_lazy_async,
+)
+from strawberry_django_jwt.settings import jwt_settings
+from strawberry_django_jwt.utils import (
+    delete_cookie,
+    get_context,
+    maybe_thenable,
+    set_cookie,
+)
 
 __all__ = [
     "user_passes_test",
@@ -48,19 +52,18 @@ def signature_add_fn(self, info: Info, *args, **kwargs):
 
     # Create a fake target function with info argument
     target_inspection = inspect.signature(target)
-    target_clean = target
     if "info" not in target_inspection.parameters.keys():
         signature_add_fn.__signature__ = inspect.Signature(
             [
                 *target_inspection.parameters.values(),
-                inspect.Parameter("info", inspect.Parameter.POSITIONAL_OR_KEYWORD),
+                inspect.Parameter("info", inspect.Parameter.POSITIONAL_OR_KEYWORD, annotation=Info),
             ],
             return_annotation=target_inspection.return_annotation,
         )
         # Copy annotations as well
         signature_add_fn.__annotations__ = target.__annotations__
-        target_clean = signature_add_fn
-    return target_clean
+        return signature_add_fn
+    return target
 
 
 def context(func):
@@ -148,7 +151,7 @@ async def on_token_auth_resolve_async(values):
 
 
 def token_auth(f):
-    async def wrapper_async(cls, info, password, **kwargs):
+    async def wrapper_async(cls, info: Info, password, **kwargs):
         context = get_context(info)
         context._jwt_token_auth = True
         username = kwargs.get(get_user_model().USERNAME_FIELD)
@@ -172,7 +175,7 @@ async def wrapper_async(cls, info, password, **kwargs):
     @setup_jwt_cookie
     @csrf_rotation
     @refresh_expiration
-    def wrapper(cls, info, password, **kwargs):
+    def wrapper(cls, info: Info, password, **kwargs):
         context = get_context(info)
         if inspect.isawaitable(f) or (isinstance(context, ASGIRequest) and is_async()):
             return wrapper_async(cls, info, password, **kwargs)
@@ -201,10 +204,7 @@ def refresh_expiration(f):
     @wraps(f)
     def wrapper(cls, *args, **kwargs):
         def on_resolve(payload):
-            payload.refresh_expires_in = (
-                timegm(datetime.utcnow().utctimetuple())
-                + jwt_settings.JWT_REFRESH_EXPIRATION_DELTA.total_seconds()
-            )
+            payload.refresh_expires_in = timegm(datetime.utcnow().utctimetuple()) + jwt_settings.JWT_REFRESH_EXPIRATION_DELTA.total_seconds()
             return payload
 
         result = f(cls, *args, **kwargs)
@@ -215,12 +215,10 @@ def on_resolve(payload):
 
 def csrf_rotation(f):
     @wraps(f)
-    def wrapper(cls, info, *args, **kwargs):
-        result = f(cls, info, **kwargs)
-
+    def wrapper(cls, info: Info, *args, **kwargs):
         if jwt_settings.JWT_CSRF_ROTATION:
             rotate_token(info.context)
-        return result
+        return f(cls, info, **kwargs)
 
     return wrapper
 
@@ -228,11 +226,11 @@ def wrapper(cls, info, *args, **kwargs):
 def setup_jwt_cookie(f):
     async def set_token(ctx, result):
         res = await result
-        setattr(ctx, "jwt_token", res.token)
+        ctx.jwt_token = res.token
         return res
 
     @wraps(f)
-    def wrapper(cls, info, *args, **kwargs):
+    def wrapper(cls, info: Info, *args, **kwargs):
         result = f(cls, info, **kwargs)
         ctx = get_context(info)
         if getattr(ctx, "jwt_cookie", False):
@@ -262,9 +260,7 @@ def finish_response_sync(request, response):
             )
             if hasattr(request, "jwt_refresh_token"):
                 refresh_token = request.jwt_refresh_token
-                expires = (
-                    refresh_token.created + jwt_settings.JWT_REFRESH_EXPIRATION_DELTA
-                )
+                expires = refresh_token.created + jwt_settings.JWT_REFRESH_EXPIRATION_DELTA
 
                 set_cookie(
                     response,
@@ -296,7 +292,7 @@ def wrapped_view(request, *args, **kwargs):
 
 def ensure_token(f):
     @wraps(f)
-    def wrapper(cls, info, token=None, *args, **kwargs):
+    def wrapper(cls, info: Info, token=None, *args, **kwargs):
         if token is None:
             cookies = get_context(info).COOKIES
             token = cookies.get(jwt_settings.JWT_COOKIE_NAME)
diff --git a/strawberry_django_jwt/middleware.py b/strawberry_django_jwt/middleware.py
index 932c59ca..1379cd61 100644
--- a/strawberry_django_jwt/middleware.py
+++ b/strawberry_django_jwt/middleware.py
@@ -7,7 +7,7 @@
 from django.utils.translation import gettext as _
 from graphql import GraphQLResolveInfo, GraphQLType
 from strawberry.extensions import Extension
-from strawberry.types import ExecutionContext, Info
+from strawberry.types import ExecutionContext
 
 from strawberry_django_jwt import exceptions
 from strawberry_django_jwt.auth import authenticate as authenticate_async
@@ -35,10 +35,7 @@ def allow_any(info, **kwargs):
     field_type = getattr(field.type, "of_type", None)
 
     return field_type is not None and any(
-        [
-            issubclass(class_type, GraphQLType) and isinstance(field_type, class_type)
-            for class_type in tuple(jwt_settings.JWT_ALLOW_ANY_CLASSES)
-        ]
+        [issubclass(class_type, GraphQLType) and isinstance(field_type, class_type) for class_type in tuple(jwt_settings.JWT_ALLOW_ANY_CLASSES)]
     )
 
 
@@ -55,7 +52,7 @@ def __init__(self, *, execution_context: ExecutionContext):
         if jwt_settings.JWT_ALLOW_ARGUMENT:
             self.cached_authentication = PathDict()
 
-    def authenticate_context(self, info, **kwargs):
+    def authenticate_context(self, info: GraphQLResolveInfo, **kwargs):
         root_path = info.path[0]
 
         if root_path not in self.cached_allow_any:
@@ -65,7 +62,7 @@ def authenticate_context(self, info, **kwargs):
                 return True
         return False
 
-    def resolve_base(self, info: Info, **kwargs):
+    def resolve_base(self, info: GraphQLResolveInfo, **kwargs):
         context = get_context(info)
         token_argument = get_token_argument(context, **kwargs)
 
@@ -82,9 +79,7 @@ def resolve_base(self, info: Info, **kwargs):
                 else:
                     context.user = AnonymousUser()
 
-        if (
-            _authenticate(context) or token_argument is not None
-        ) and self.authenticate_context(info, **kwargs):
+        if (_authenticate(context) or token_argument is not None) and self.authenticate_context(info, **kwargs):
             return context, token_argument
         elif (
             info.field_name == "__schema"
@@ -93,20 +88,16 @@ def resolve_base(self, info: Info, **kwargs):
             and self.authenticate_context(info, **kwargs)
         ):
 
-            raise exceptions.PermissionDenied(
-                _("The introspection query requires authentication.")
-            )
+            raise exceptions.PermissionDenied(_("The introspection query requires authentication."))
 
         return context, token_argument
 
 
 class JSONWebTokenMiddleware(BaseJSONWebTokenMiddleware):
-    def resolve(self, _next, root, info: Info, *args, **kwargs):
+    def resolve(self, _next, root, info: GraphQLResolveInfo, *args, **kwargs):
         context, token_argument = self.resolve_base(info, **kwargs)
 
-        if (
-            _authenticate(context) or token_argument is not None
-        ) and self.authenticate_context(info, **kwargs):
+        if (_authenticate(context) or token_argument is not None) and self.authenticate_context(info, **kwargs):
 
             user = authenticate(request=context, **kwargs)
 
@@ -120,12 +111,10 @@ def resolve(self, _next, root, info: Info, *args, **kwargs):
 
 
 class AsyncJSONWebTokenMiddleware(BaseJSONWebTokenMiddleware):
-    async def resolve(self, _next, root, info: Info, *args, **kwargs):
+    async def resolve(self, _next, root, info: GraphQLResolveInfo, *args, **kwargs):
         context, token_argument = self.resolve_base(info, **kwargs)
 
-        if (
-            _authenticate(context) or token_argument is not None
-        ) and self.authenticate_context(info, **kwargs):
+        if (_authenticate(context) or token_argument is not None) and self.authenticate_context(info, **kwargs):
 
             user = await authenticate_async(request=context, **kwargs)
 
diff --git a/strawberry_django_jwt/mixins.py b/strawberry_django_jwt/mixins.py
index 12e316da..b868bb63 100644
--- a/strawberry_django_jwt/mixins.py
+++ b/strawberry_django_jwt/mixins.py
@@ -1,44 +1,48 @@
 import inspect
-from typing import Any
-from typing import Dict
-from typing import Optional
+from typing import Any, Dict, Optional
 
-import strawberry
 from django.utils.translation import gettext as _
+import strawberry
 from strawberry.field import StrawberryField
+from strawberry.types import Info
 from strawberry_django.fields.field import StrawberryDjangoField
 
-from . import exceptions
-from . import settings
-from .decorators import csrf_rotation
-from .decorators import ensure_token
-from .decorators import refresh_expiration
-from .decorators import setup_jwt_cookie
-from .fields import StrawberryDjangoTokenField, StrawberryDjangoRefreshTokenField
-from .object_types import TokenDataType
-from .refresh_token import signals as refresh_signals
-from .refresh_token.decorators import ensure_refresh_token
-from .refresh_token.object_types import RefreshedTokenType
-from .refresh_token.shortcuts import create_refresh_token
-from .refresh_token.shortcuts import get_refresh_token
-from .refresh_token.shortcuts import refresh_token_lazy
-from .signals import token_refreshed
-from .utils import create_strawberry_argument
-from .utils import get_payload, get_context
-from .utils import get_user_by_payload
-from .utils import maybe_thenable
+from strawberry_django_jwt import exceptions, settings
+from strawberry_django_jwt.decorators import (
+    csrf_rotation,
+    ensure_token,
+    refresh_expiration,
+    setup_jwt_cookie,
+)
+from strawberry_django_jwt.fields import (
+    StrawberryDjangoRefreshTokenField,
+    StrawberryDjangoTokenField,
+)
+from strawberry_django_jwt.object_types import TokenDataType
+from strawberry_django_jwt.refresh_token import signals as refresh_signals
+from strawberry_django_jwt.refresh_token.decorators import ensure_refresh_token
+from strawberry_django_jwt.refresh_token.object_types import RefreshedTokenType
+from strawberry_django_jwt.refresh_token.shortcuts import (
+    create_refresh_token,
+    get_refresh_token,
+    refresh_token_lazy,
+)
+from strawberry_django_jwt.signals import token_refreshed
+from strawberry_django_jwt.utils import (
+    create_strawberry_argument,
+    get_context,
+    get_payload,
+    get_user_by_payload,
+    maybe_thenable,
+)
 
 
 class BaseJSONWebTokenMixin:
     @staticmethod
     def init_fields(cls, field_options: Dict[str, Dict[str, Any]]):
         if not settings.jwt_settings.JWT_HIDE_TOKEN_FIELDS:
-            for (__, field) in inspect.getmembers(
-                cls, lambda f: isinstance(f, StrawberryField)
-            ):
-                if field.type_annotation is None and isinstance(
-                    field, StrawberryDjangoField
-                ):
+            for (__, field) in inspect.getmembers(cls, lambda f: isinstance(f, StrawberryField)):
+                if field.type_annotation is None and isinstance(field, StrawberryDjangoField):
                     # StrawberryDjangoFields resolve their arguments after strawberry decorator is applied.
                     # It is necessary to add subclasses to the field class which provide required arguments when
                     #   fields are collected.
@@ -56,20 +60,9 @@ def init_fields(cls, field_options: Dict[str, Dict[str, Any]]):
                         new_type = type("StrawberryDjangoJWTField", base_types, {})
                     field.__class__ = new_type
                     continue
-                field.arguments.append(
-                    create_strawberry_argument(
-                        "token", "token", str, **field_options.get("token", {})
-                    )
-                )
+                field.arguments.append(create_strawberry_argument("token", "token", str, **field_options.get("token", {})))
                 if settings.jwt_settings.JWT_LONG_RUNNING_REFRESH_TOKEN:
-                    field.arguments.append(
-                        create_strawberry_argument(
-                            "refresh_token",
-                            "refresh_token",
-                            str,
-                            **field_options.get("refresh_token", {})
-                        )
-                    )
+                    field.arguments.append(create_strawberry_argument("refresh_token", "refresh_token", str, **field_options.get("refresh_token", {})))
 
 
 class JSONWebTokenMixin(BaseJSONWebTokenMixin):
@@ -85,7 +78,7 @@ class KeepAliveRefreshMixin(JSONWebTokenMixin):
     @setup_jwt_cookie
     @csrf_rotation
     @ensure_token
-    def refresh(self, info, token: Optional[str]) -> TokenDataType:
+    def refresh(self, info: Info, token: Optional[str]) -> TokenDataType:
         def on_resolve(values):
             payload, token = values
             payload.token = token
@@ -104,10 +97,7 @@ def on_resolve(values):
 
         payload = settings.jwt_settings.JWT_PAYLOAD_HANDLER(user, context)
         payload.origIat = orig_iat
-        refresh_expires_in = (
-            orig_iat
-            + settings.jwt_settings.JWT_REFRESH_EXPIRATION_DELTA.total_seconds()
-        )
+        refresh_expires_in = orig_iat + settings.jwt_settings.JWT_REFRESH_EXPIRATION_DELTA.total_seconds()
 
         token = settings.jwt_settings.JWT_ENCODE_HANDLER(payload, context) or ""
         token_refreshed.send(sender=RefreshMixin, request=context, user=user)
@@ -122,7 +112,7 @@ class RefreshTokenMixin(JSONWebTokenMixin):
     @csrf_rotation
     @refresh_expiration
     @ensure_refresh_token
-    def refresh(self, info, refresh_token: Optional[str]) -> RefreshedTokenType:
+    def refresh(self, info: Info, refresh_token: Optional[str]) -> RefreshedTokenType:
         context = get_context(info)
         old_refresh_token = get_refresh_token(refresh_token, context)
 
@@ -135,16 +125,12 @@ def refresh(self, info, refresh_token: Optional[str]) -> RefreshedTokenType:
         )
         token = settings.jwt_settings.JWT_ENCODE_HANDLER(payload, context)
 
-        if getattr(context, "jwt_cookie", False):
-            setattr(
-                context,
-                "jwt_refresh_token",
-                create_refresh_token(
-                    old_refresh_token.user,
-                    old_refresh_token,
-                ),
+        if hasattr(context, "jwt_cookie"):
+            context.jwt_refresh_token = create_refresh_token(
+                old_refresh_token.user,
+                old_refresh_token,
             )
-            new_refresh_token = getattr(context, "jwt_refresh_token").get_token()
+            new_refresh_token = context.jwt_refresh_token.get_token()
         else:
             new_refresh_token = refresh_token_lazy(
                 old_refresh_token.user,
@@ -157,16 +143,10 @@ def refresh(self, info, refresh_token: Optional[str]) -> RefreshedTokenType:
             refresh_token=old_refresh_token,
             refresh_token_issued=new_refresh_token,
         )
-        return RefreshedTokenType(
-            payload, token, new_refresh_token, refresh_expires_in=0
-        )
+        return RefreshedTokenType(payload, token, new_refresh_token, refresh_expires_in=0)
 
 
-base_class = (
-    RefreshTokenMixin
-    if settings.jwt_settings.JWT_LONG_RUNNING_REFRESH_TOKEN
-    else KeepAliveRefreshMixin
-)
+base_class = RefreshTokenMixin if settings.jwt_settings.JWT_LONG_RUNNING_REFRESH_TOKEN else KeepAliveRefreshMixin
 
 
 class RefreshMixin(base_class, JSONWebTokenMixin):  # type: ignore
diff --git a/strawberry_django_jwt/model_object_types.py b/strawberry_django_jwt/model_object_types.py
index fb22bb1d..de869483 100644
--- a/strawberry_django_jwt/model_object_types.py
+++ b/strawberry_django_jwt/model_object_types.py
@@ -1,11 +1,8 @@
 import inspect
-from typing import List
-from typing import Optional
+from typing import List, Optional
 
+from django.contrib.auth.models import AbstractUser, Group, Permission
 import strawberry.django
-from django.contrib.auth.models import AbstractUser
-from django.contrib.auth.models import Group
-from django.contrib.auth.models import Permission
 
 BORING = dir(type("dummy", (object,), {}))
 
diff --git a/strawberry_django_jwt/mutations.py b/strawberry_django_jwt/mutations.py
index 289de5d2..a1e95677 100644
--- a/strawberry_django_jwt/mutations.py
+++ b/strawberry_django_jwt/mutations.py
@@ -1,19 +1,26 @@
 import inspect
 
-import strawberry
 from django.contrib.auth import get_user_model
+import strawberry
 from strawberry.field import StrawberryField
-
-from . import mixins
-from .decorators import dispose_extra_kwargs
-from .decorators import ensure_token
-from .decorators import token_auth
-from .object_types import DeleteType
-from .object_types import PayloadType
-from .object_types import TokenDataType
-from .object_types import TokenPayloadType
-from .refresh_token.mutations import DeleteRefreshTokenCookie
-from .refresh_token.mutations import Revoke
+from strawberry.types import Info
+
+from strawberry_django_jwt import mixins
+from strawberry_django_jwt.decorators import (
+    dispose_extra_kwargs,
+    ensure_token,
+    token_auth,
+)
+from strawberry_django_jwt.object_types import (
+    DeleteType,
+    PayloadType,
+    TokenDataType,
+    TokenPayloadType,
+)
+from strawberry_django_jwt.refresh_token.mutations import (
+    DeleteRefreshTokenCookie,
+    Revoke,
+)
 
 __all__ = [
     "JSONWebTokenMutation",
@@ -25,9 +32,12 @@
     "DeleteJSONWebTokenCookie",
 ]
 
-from .settings import jwt_settings
-
-from .utils import get_payload, get_context, create_strawberry_argument
+from strawberry_django_jwt.settings import jwt_settings
+from strawberry_django_jwt.utils import (
+    create_strawberry_argument,
+    get_context,
+    get_payload,
+)
 
 
 class JSONWebTokenMutation(mixins.JSONWebTokenMixin):
@@ -35,9 +45,7 @@ def __init_subclass__(cls):
         super().__init_subclass__()
         user = get_user_model().USERNAME_FIELD
         field: StrawberryField
-        for (name, field) in inspect.getmembers(
-            cls, lambda f: isinstance(f, StrawberryField)
-        ):
+        for (_name, field) in inspect.getmembers(cls, lambda f: isinstance(f, StrawberryField)):
             field.arguments.extend(
                 [
                     create_strawberry_argument(user, user, str),
@@ -52,14 +60,14 @@ class ObtainJSONWebToken(JSONWebTokenMutation):
     @strawberry.mutation
     @token_auth
     @dispose_extra_kwargs
-    def obtain(self, info) -> TokenDataType:
+    def obtain(self, info: Info) -> TokenDataType:
         return TokenDataType(payload=TokenPayloadType())
 
 
 class Verify:
     @strawberry.mutation
     @ensure_token
-    def verify(self, info, token: str) -> PayloadType:
+    def verify(self, info: Info, token: str) -> PayloadType:
         return PayloadType(payload=get_payload(token, info.context))
 
 
@@ -69,12 +77,7 @@ class Refresh(mixins.RefreshMixin):
 
 class DeleteJSONWebTokenCookie:
     @strawberry.mutation
-    def delete_cookie(self, info) -> DeleteType:
+    def delete_cookie(self, info: Info) -> DeleteType:
         ctx = get_context(info)
-        setattr(
-            ctx,
-            "delete_jwt_cookie",
-            jwt_settings.JWT_COOKIE_NAME in ctx.COOKIES
-            and getattr(ctx, "jwt_cookie", False),
-        )
-        return DeleteType(deleted=getattr(ctx, "delete_jwt_cookie"))
+        ctx.delete_jwt_cookie = jwt_settings.JWT_COOKIE_NAME in ctx.COOKIES and getattr(ctx, "jwt_cookie", False)
+        return DeleteType(deleted=ctx.delete_jwt_cookie)
diff --git a/strawberry_django_jwt/object_types.py b/strawberry_django_jwt/object_types.py
index 571685d5..44d2456b 100644
--- a/strawberry_django_jwt/object_types.py
+++ b/strawberry_django_jwt/object_types.py
@@ -1,11 +1,8 @@
-from typing import Any
-from typing import Dict
-from typing import Tuple
-from typing import Type
-from typing import TypeVar
+from typing import Any, Dict, Tuple, Type, TypeVar
 
-import strawberry.django
 from django.contrib.auth import get_user_model
+import strawberry.django
+
 from strawberry_django_jwt.settings import jwt_settings
 
 X = TypeVar("X", Any, Any)
diff --git a/strawberry_django_jwt/refresh_token/admin/__init__.py b/strawberry_django_jwt/refresh_token/admin/__init__.py
index 7fd75f76..c2cd8a16 100644
--- a/strawberry_django_jwt/refresh_token/admin/__init__.py
+++ b/strawberry_django_jwt/refresh_token/admin/__init__.py
@@ -3,8 +3,8 @@
 from django.utils.translation import gettext_lazy as _
 from django_admin_display import admin_display
 
-from . import filters
-from .. import models
+from strawberry_django_jwt.refresh_token import models
+from strawberry_django_jwt.refresh_token.admin import filters
 
 
 @admin.register(models.RefreshToken)
diff --git a/strawberry_django_jwt/refresh_token/admin/filters.py b/strawberry_django_jwt/refresh_token/admin/filters.py
index 417c79d9..04a21829 100644
--- a/strawberry_django_jwt/refresh_token/admin/filters.py
+++ b/strawberry_django_jwt/refresh_token/admin/filters.py
@@ -26,6 +26,8 @@ def queryset(self, request, queryset):
         if self.value() == "no":
             return queryset.expired().filter(expired=False)
 
+        return None
+
 
 class RevokedFilter(BooleanListFilter):
     title = _("Revoked")
@@ -37,3 +39,5 @@ def queryset(self, request, queryset):
 
         if self.value() == "no":
             return queryset.filter(revoked__isnull=True)
+
+        return None
diff --git a/strawberry_django_jwt/refresh_token/decorators.py b/strawberry_django_jwt/refresh_token/decorators.py
index 4a487ece..06541387 100644
--- a/strawberry_django_jwt/refresh_token/decorators.py
+++ b/strawberry_django_jwt/refresh_token/decorators.py
@@ -1,15 +1,16 @@
 from functools import wraps
 
 from django.utils.translation import gettext as _
+from strawberry.types import Info
 
-from .. import exceptions
-from ..settings import jwt_settings
-from ..utils import get_context
+from strawberry_django_jwt import exceptions
+from strawberry_django_jwt.settings import jwt_settings
+from strawberry_django_jwt.utils import get_context
 
 
 def ensure_refresh_token(f):
     @wraps(f)
-    def wrapper(cls, info, refresh_token=None, *args, **kwargs):
+    def wrapper(cls, info: Info, refresh_token=None, *args, **kwargs):
         if refresh_token is None:
             cookies = get_context(info).COOKIES
             refresh_token = cookies.get(
diff --git a/strawberry_django_jwt/refresh_token/management/commands/cleartokens.py b/strawberry_django_jwt/refresh_token/management/commands/cleartokens.py
index 5f897daa..bd8229b3 100644
--- a/strawberry_django_jwt/refresh_token/management/commands/cleartokens.py
+++ b/strawberry_django_jwt/refresh_token/management/commands/cleartokens.py
@@ -2,7 +2,7 @@
 from django.db.models import Q
 from django.template.defaultfilters import pluralize
 
-from ...utils import get_refresh_token_model
+from strawberry_django_jwt.refresh_token.utils import get_refresh_token_model
 
 
 class Command(BaseCommand):
diff --git a/strawberry_django_jwt/refresh_token/managers.py b/strawberry_django_jwt/refresh_token/managers.py
index d87ad96b..3aecd200 100644
--- a/strawberry_django_jwt/refresh_token/managers.py
+++ b/strawberry_django_jwt/refresh_token/managers.py
@@ -4,7 +4,7 @@
 from django.db.models import When
 from django.utils import timezone
 
-from ..settings import jwt_settings
+from strawberry_django_jwt.settings import jwt_settings
 
 
 class RefreshTokenQuerySet(models.QuerySet):
diff --git a/strawberry_django_jwt/refresh_token/migrations/0001_initial.py b/strawberry_django_jwt/refresh_token/migrations/0001_initial.py
index 59be7a0f..e48d5ee3 100644
--- a/strawberry_django_jwt/refresh_token/migrations/0001_initial.py
+++ b/strawberry_django_jwt/refresh_token/migrations/0001_initial.py
@@ -1,8 +1,7 @@
 # Generated by Django 2.1.2 on 2018-10-16 20:08
-import django.db.models.deletion
 from django.conf import settings
-from django.db import migrations
-from django.db import models
+from django.db import migrations, models
+import django.db.models.deletion
 
 
 class Migration(migrations.Migration):
@@ -20,9 +19,7 @@ class Migration(migrations.Migration):
                 ("id", models.BigAutoField(primary_key=True, serialize=False)),
                 (
                     "token",
-                    models.CharField(
-                        editable=False, max_length=255, verbose_name="token"
-                    ),
+                    models.CharField(editable=False, max_length=255, verbose_name="token"),
                 ),
                 (
                     "created",
diff --git a/strawberry_django_jwt/refresh_token/models.py b/strawberry_django_jwt/refresh_token/models.py
index be98641a..fa5f03da 100644
--- a/strawberry_django_jwt/refresh_token/models.py
+++ b/strawberry_django_jwt/refresh_token/models.py
@@ -1,15 +1,14 @@
 import binascii
-import os
 from calendar import timegm
+import os
 
 from django.conf import settings
 from django.db import models
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
-from . import managers
-from . import signals
-from ..settings import jwt_settings
+from strawberry_django_jwt.refresh_token import managers, signals
+from strawberry_django_jwt.settings import jwt_settings
 
 
 class AbstractRefreshToken(models.Model):
diff --git a/strawberry_django_jwt/refresh_token/mutations.py b/strawberry_django_jwt/refresh_token/mutations.py
index e5c6dd19..f4ce3155 100644
--- a/strawberry_django_jwt/refresh_token/mutations.py
+++ b/strawberry_django_jwt/refresh_token/mutations.py
@@ -1,12 +1,12 @@
 import strawberry
 from strawberry.types import Info
 
-from .decorators import ensure_refresh_token
-from .object_types import RevokeType
-from .shortcuts import get_refresh_token
-from ..object_types import DeleteType
-from ..settings import jwt_settings
-from ..utils import get_context
+from strawberry_django_jwt.object_types import DeleteType
+from strawberry_django_jwt.refresh_token.decorators import ensure_refresh_token
+from strawberry_django_jwt.refresh_token.object_types import RevokeType
+from strawberry_django_jwt.refresh_token.shortcuts import get_refresh_token
+from strawberry_django_jwt.settings import jwt_settings
+from strawberry_django_jwt.utils import get_context
 
 
 class Revoke:
@@ -23,10 +23,5 @@ class DeleteRefreshTokenCookie:
     @strawberry.mutation
     def delete_cookie(self, info: Info) -> DeleteType:
         ctx = get_context(info)
-        setattr(
-            ctx,
-            "delete_refresh_token_cookie",
-            jwt_settings.JWT_REFRESH_TOKEN_COOKIE_NAME in ctx.COOKIES
-            and getattr(ctx, "jwt_cookie", False),
-        )
-        return DeleteType(deleted=getattr(ctx, "delete_refresh_token_cookie"))
+        ctx.delete_refresh_token_cookie = jwt_settings.JWT_REFRESH_TOKEN_COOKIE_NAME in ctx.COOKIES and getattr(ctx, "jwt_cookie", False)
+        return DeleteType(deleted=ctx.delete_refresh_token_cookie)
diff --git a/strawberry_django_jwt/refresh_token/object_types.py b/strawberry_django_jwt/refresh_token/object_types.py
index a945c42a..f7ea818d 100644
--- a/strawberry_django_jwt/refresh_token/object_types.py
+++ b/strawberry_django_jwt/refresh_token/object_types.py
@@ -1,6 +1,7 @@
 from datetime import datetime
 
 import strawberry
+
 from strawberry_django_jwt.object_types import TokenPayloadType
 
 
diff --git a/strawberry_django_jwt/refresh_token/shortcuts.py b/strawberry_django_jwt/refresh_token/shortcuts.py
index 9dc90b9b..9b6d3ea9 100644
--- a/strawberry_django_jwt/refresh_token/shortcuts.py
+++ b/strawberry_django_jwt/refresh_token/shortcuts.py
@@ -2,9 +2,9 @@
 from django.utils.functional import lazy
 from django.utils.translation import gettext as _
 
-from .utils import get_refresh_token_model
-from ..exceptions import JSONWebTokenError
-from ..settings import jwt_settings
+from strawberry_django_jwt.exceptions import JSONWebTokenError
+from strawberry_django_jwt.refresh_token.utils import get_refresh_token_model
+from strawberry_django_jwt.settings import jwt_settings
 
 
 def get_refresh_token(token, context=None):
@@ -29,9 +29,7 @@ def create_refresh_token(user, refresh_token=None):
 
 
 refresh_token_lazy = lazy(
-    lambda user, refresh_token=None: create_refresh_token(
-        user, refresh_token
-    ).get_token(),
+    lambda user, refresh_token=None: create_refresh_token(user, refresh_token).get_token(),
     str,
 )
 
diff --git a/strawberry_django_jwt/refresh_token/utils.py b/strawberry_django_jwt/refresh_token/utils.py
index a4ffeec3..ebcb4f1b 100644
--- a/strawberry_django_jwt/refresh_token/utils.py
+++ b/strawberry_django_jwt/refresh_token/utils.py
@@ -1,6 +1,6 @@
 from django.apps import apps
 
-from ..settings import jwt_settings
+from strawberry_django_jwt.settings import jwt_settings
 
 
 def get_refresh_token_model():
diff --git a/strawberry_django_jwt/settings.py b/strawberry_django_jwt/settings.py
index 0d84c945..a6e6f532 100644
--- a/strawberry_django_jwt/settings.py
+++ b/strawberry_django_jwt/settings.py
@@ -29,9 +29,7 @@
     "JWT_ENCODE_HANDLER": "strawberry_django_jwt.utils.jwt_encode",
     "JWT_DECODE_HANDLER": "strawberry_django_jwt.utils.jwt_decode",
     "JWT_PAYLOAD_HANDLER": "strawberry_django_jwt.utils.jwt_payload",
-    "JWT_PAYLOAD_GET_USERNAME_HANDLER": (
-        lambda payload: getattr(payload, get_user_model().USERNAME_FIELD)
-    ),
+    "JWT_PAYLOAD_GET_USERNAME_HANDLER": (lambda payload: getattr(payload, get_user_model().USERNAME_FIELD)),
     "JWT_GET_USER_BY_NATURAL_KEY_HANDLER": "strawberry_django_jwt.utils.get_user_by_natural_key",
     "JWT_ASYNC_GET_USER_BY_NATURAL_KEY_HANDLER": "strawberry_django_jwt.utils.get_user_by_natural_key_async",
     "JWT_REFRESH_EXPIRED_HANDLER": "strawberry_django_jwt.utils.refresh_has_expired",
@@ -76,10 +74,7 @@ def import_from_string(value, setting_name):
     try:
         return import_string(value)
     except ImportError as e:
-        msg = (
-            f"Could not import `{value}` for JWT setting `{setting_name}`."
-            f"{e.__class__.__name__}: {e}."
-        )
+        msg = f"Could not import `{value}` for JWT setting `{setting_name}`." f"{e.__class__.__name__}: {e}."
         raise ImportError(msg)
 
 
diff --git a/strawberry_django_jwt/shortcuts.py b/strawberry_django_jwt/shortcuts.py
index 271ed144..c8432809 100644
--- a/strawberry_django_jwt/shortcuts.py
+++ b/strawberry_django_jwt/shortcuts.py
@@ -1,9 +1,13 @@
-from .refresh_token.shortcuts import create_refresh_token
-from .refresh_token.shortcuts import get_refresh_token
-from .settings import jwt_settings
-from .utils import get_payload
-from .utils import get_user_by_payload
-from .utils import get_user_by_payload_async
+from strawberry_django_jwt.refresh_token.shortcuts import (
+    create_refresh_token,
+    get_refresh_token,
+)
+from strawberry_django_jwt.settings import jwt_settings
+from strawberry_django_jwt.utils import (
+    get_payload,
+    get_user_by_payload,
+    get_user_by_payload_async,
+)
 
 __all__ = [
     "get_token",
diff --git a/strawberry_django_jwt/utils.py b/strawberry_django_jwt/utils.py
index cece7f7a..a0577287 100644
--- a/strawberry_django_jwt/utils.py
+++ b/strawberry_django_jwt/utils.py
@@ -1,16 +1,17 @@
 from __future__ import annotations
 
 from calendar import timegm
+from contextlib import suppress
 from datetime import datetime
 from inspect import isawaitable
-from typing import Any, Optional, TYPE_CHECKING, Type, Union, cast
+from typing import TYPE_CHECKING, Any, Optional, cast
 
-import jwt
 from asgiref.sync import sync_to_async
 from django.contrib.auth import get_user_model
 from django.http import HttpRequest
 from django.utils.translation import gettext as _
 from graphql import GraphQLResolveInfo
+import jwt
 from packaging.version import parse as parse_ver
 from strawberry.annotation import StrawberryAnnotation  # type: ignore
 from strawberry.arguments import StrawberryArgument
@@ -21,15 +22,13 @@
 from strawberry_django_jwt.settings import jwt_settings
 
 if TYPE_CHECKING:  # pragma: no cover
-    try:
-        from rest_framework.request import Request
-    except ImportError:
-        pass  # Only used for type hinting when DRF is installed
+    with suppress(ImportError):
+        from rest_framework.request import (
+            Request,  # Only used for type hinting when DRF is installed
+        )
 
 
-def create_strawberry_argument(
-    python_name: str, graphql_name: str, type_: Type[Any], **options
-):
+def create_strawberry_argument(python_name: str, graphql_name: str, type_: type[Any], **options):
     return StrawberryArgument(
         python_name,
         graphql_name,
@@ -37,9 +36,9 @@ def create_strawberry_argument(
     )
 
 
-def create_argument_type(type_: Type[Any], **options):
+def create_argument_type(type_: type[Any], **options):
     if options.get("is_optional"):
-        type_ = Optional[type_]  # type: ignore
+        return Optional[type_]  # type: ignore
     return type_
 
 
@@ -74,10 +73,9 @@ def jwt_encode(payload: object_types.TokenPayloadType, _=None) -> str:
         jwt_settings.JWT_PRIVATE_KEY or jwt_settings.JWT_SECRET_KEY,
         jwt_settings.JWT_ALGORITHM,
     )
-    _token = cast(str, token)
     if parse_ver(jwt.__version__) < parse_ver("2.0.0"):  # type: ignore
-        _token = cast(bytes, _token).decode("utf8")
-    return _token
+        return cast(bytes, token).decode("utf8")
+    return cast(str, token)
 
 
 def jwt_decode(token: str, _=None) -> object_types.TokenPayloadType:
@@ -137,14 +135,13 @@ def get_credentials(request, **kwargs):
 
 def get_payload(token, context=None):
     try:
-        payload = jwt_settings.JWT_DECODE_HANDLER(token, context)
+        return jwt_settings.JWT_DECODE_HANDLER(token, context)
     except jwt.ExpiredSignatureError:
         raise exceptions.JSONWebTokenExpired()
     except jwt.DecodeError:
         raise exceptions.JSONWebTokenError(_("Error decoding signature"))
     except jwt.InvalidTokenError:
         raise exceptions.JSONWebTokenError(_("Invalid token"))
-    return payload
 
 
 def get_user_by_natural_key(username):
@@ -234,11 +231,9 @@ def maybe_thenable(obj, on_resolve):
     return on_resolve(obj)
 
 
-def get_context(
-    info: Union[HttpRequest, Request, Info[Any, Any], GraphQLResolveInfo]
-) -> Any:
+def get_context(info: HttpRequest | Request | Info[Any, Any] | GraphQLResolveInfo) -> Any:
     if hasattr(info, "context"):
-        ctx = getattr(info, "context")
+        ctx = getattr(info, "context")  # noqa: B009
         if isinstance(ctx, StrawberryDjangoContext):
             return ctx.request
         return ctx
diff --git a/strawberry_django_jwt/views.py b/strawberry_django_jwt/views.py
index fdcd6228..741119a1 100644
--- a/strawberry_django_jwt/views.py
+++ b/strawberry_django_jwt/views.py
@@ -19,9 +19,7 @@ def make_status_response(response: GraphQLHTTPResponse) -> StatusGraphQLHTTPResp
 
 
 class BaseStatusHandlingGraphQLView(BaseView):
-    def _create_response(
-        self, response_data: GraphQLHTTPResponse, sub_response: HttpResponse
-    ) -> JsonResponse:
+    def _create_response(self, response_data: GraphQLHTTPResponse, sub_response: HttpResponse) -> JsonResponse:
         data = cast(StatusGraphQLHTTPResponse, response_data)
         response = JsonResponse(data, status=data.get("status", None))
 
@@ -32,28 +30,16 @@ def _create_response(
 
 
 class StatusHandlingGraphQLView(BaseStatusHandlingGraphQLView, GraphQLView):
-    def process_result(
-        self, request: HttpRequest, result: ExecutionResult
-    ) -> StatusGraphQLHTTPResponse:
+    def process_result(self, request: HttpRequest, result: ExecutionResult) -> StatusGraphQLHTTPResponse:
         res = make_status_response(process_result(result))
-        if result.errors:
-            if any(
-                isinstance(err, JSONWebTokenError)
-                for err in [e.original_error for e in result.errors]
-            ):
-                res["status"] = 401
+        if result.errors and any(isinstance(err, JSONWebTokenError) for err in [e.original_error for e in result.errors]):
+            res["status"] = 401
         return res
 
 
 class AsyncStatusHandlingGraphQLView(BaseStatusHandlingGraphQLView, AsyncGraphQLView):
-    async def process_result(
-        self, request: HttpRequest, result: ExecutionResult
-    ) -> StatusGraphQLHTTPResponse:
+    async def process_result(self, request: HttpRequest, result: ExecutionResult) -> StatusGraphQLHTTPResponse:
         res = make_status_response(process_result(result))
-        if result.errors:
-            if any(
-                isinstance(err, JSONWebTokenError)
-                for err in [e.original_error for e in result.errors]
-            ):
-                res["status"] = 401
+        if result.errors and any(isinstance(err, JSONWebTokenError) for err in [e.original_error for e in result.errors]):
+            res["status"] = 401
         return res


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index ad1d46eb..8d651d9d 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -1,8 +1,9 @@
 name: Tests
 
 on:
-  - push
-  - pull_request
+  push: {}
+  pull_request:
+    types: [opened, reopened]
 
 jobs:
   tests:
@@ -40,27 +41,24 @@ jobs:
           restore-keys: |
             ${{ runner.os }}-nox-
       - name: Check out the repository
-        uses: actions/checkout@v3.0.2
+        uses: actions/checkout@v3
 
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v3.1.2
+        uses: actions/setup-python@v4
         with:
           python-version: ${{ matrix.python-version }}
 
-      - name: Upgrade pip
-        run: |
-          pip install --constraint=.github/workflows/constraints.txt pip
-          pip --version
       - name: Install Wheel
         run: |
-          pip install --constraint=.github/workflows/constraints.txt wheel
-      - name: Install Poetry
-        run: |
-          pip install --constraint=.github/workflows/constraints.txt poetry
-          poetry --version
+          pip install wheel
+      - name: Install poetry
+        uses: snok/install-poetry@v1
+        with:
+          virtualenvs-create: true
+          virtualenvs-in-project: true
       - name: Install Nox and nox-poetry
         run: |
-          pip install --constraint=.github/workflows/constraints.txt nox nox-poetry
+          pip install nox nox-poetry
           nox --version
       - name: Install strawberry-django-jwt
         run: |
@@ -90,7 +88,7 @@ jobs:
           nox --force-color --python=${{ matrix.python-version }}
       - name: Upload coverage data
         if: always() && startsWith(matrix.session, 'tests')
-        uses: actions/upload-artifact@v3.0.0
+        uses: actions/upload-artifact@v3.1.0
         with:
           name: coverage-data
           path: ".coverage.*"
@@ -100,27 +98,24 @@ jobs:
     needs: tests
     steps:
       - name: Check out the repository
-        uses: actions/checkout@v3.0.2
+        uses: actions/checkout@v3
 
       - name: Set up Python 3.9
-        uses: actions/setup-python@v2.3.2
+        uses: actions/setup-python@v4
         with:
           python-version: 3.9
 
-      - name: Upgrade pip
-        run: |
-          pip install --constraint=.github/workflows/constraints.txt pip
-          pip --version
       - name: Install Wheel
         run: |
-          pip install --constraint=.github/workflows/constraints.txt wheel
-      - name: Install Poetry
-        run: |
-          pip install --constraint=.github/workflows/constraints.txt poetry
-          poetry --version
+          pip install wheel
+      - name: Install poetry
+        uses: snok/install-poetry@v1
+        with:
+          virtualenvs-create: true
+          virtualenvs-in-project: true
       - name: Install Nox and nox-poetry
         run: |
-          pip install --constraint=.github/workflows/constraints.txt nox nox-poetry
+          pip install nox nox-poetry
           nox --version
       - name: Install strawberry-django-jwt
         run: |
diff --git a/strawberry_django_jwt/testcases.py b/strawberry_django_jwt/testcases.py
index d785f5ed..15a72988 100644
--- a/strawberry_django_jwt/testcases.py
+++ b/strawberry_django_jwt/testcases.py
@@ -1,8 +1,14 @@
-import strawberry
 from django.contrib.auth.models import AnonymousUser
 from django.core.handlers.asgi import ASGIRequest
 from django.core.handlers.wsgi import WSGIRequest
-from django.test import AsyncClient, AsyncRequestFactory, Client, RequestFactory, testcases  # type: ignore
+from django.test import (  # type: ignore
+    AsyncClient,
+    AsyncRequestFactory,
+    Client,
+    RequestFactory,
+    testcases,
+)
+import strawberry
 
 from strawberry_django_jwt.middleware import (
     AsyncJSONWebTokenMiddleware,
@@ -24,7 +30,7 @@ def middleware(self, middleware):
         self._middleware = middleware
 
     def _setup_middleware(self):
-        self._schema.extensions = [m for m in self._middleware]
+        self._schema.extensions = list(self._middleware)
 
     def execute(self, query, **options):
         self._setup_middleware()
@@ -81,7 +87,7 @@ def middleware(self, middleware):
         self._middleware = middleware
 
     def _setup_middleware(self):
-        self._schema.extensions = [m for m in self._middleware]
+        self._schema.extensions = list(self._middleware)
 
     def execute(self, query, **options):
         self._setup_middleware()
@@ -98,9 +104,7 @@ def request(self, **request):
             if header[0] == b"content-length":
                 del request["headers"][idx]
         body_file = request.pop("_body_file")
-        request["headers"].append(
-            (b"content-length", bytes(f"{len(body_file)}", "latin1"))
-        )
+        request["headers"].append((b"content-length", bytes(f"{len(body_file)}", "latin1")))
         request = ASGIRequest(self._base_environ(**request), body_file)
         request.user = AnonymousUser()
         return request
@@ -120,16 +124,12 @@ def execute(self, query, variables=None, **extra):
     def authenticate(self, token):
         self.credentials(
             **{
-                jwt_settings.JWT_AUTH_HEADER_NAME.replace(
-                    "HTTP_", ""
-                ): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {token}",
+                jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {token}",
             }
         )
 
     def logout(self):
-        self._credentials.pop(
-            jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""), None
-        )
+        self._credentials.pop(jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""), None)
 
 
 class AsyncJSONWebTokenTestCase(testcases.TransactionTestCase):
diff --git a/tests/context_managers.py b/tests/context_managers.py
index 2ee6b152..de78c69f 100644
--- a/tests/context_managers.py
+++ b/tests/context_managers.py
@@ -1,6 +1,5 @@
 from contextlib import contextmanager
-from datetime import datetime
-from datetime import timedelta
+from datetime import datetime, timedelta
 from unittest import mock
 
 from strawberry_django_jwt.settings import jwt_settings
diff --git a/tests/example_app/schema.py b/tests/example_app/schema.py
index c097b778..676d2b1c 100644
--- a/tests/example_app/schema.py
+++ b/tests/example_app/schema.py
@@ -3,12 +3,12 @@
 import strawberry
 from strawberry import Schema
 
-import strawberry_django_jwt.mutations as jwt_mutations
 from strawberry_django_jwt.decorators import login_required
 from strawberry_django_jwt.middleware import (
     AsyncJSONWebTokenMiddleware,
     JSONWebTokenMiddleware,
 )
+import strawberry_django_jwt.mutations as jwt_mutations
 
 
 @strawberry.type
@@ -39,9 +39,5 @@ class Mutation:
     delete_cookie = jwt_mutations.DeleteJSONWebTokenCookie.delete_cookie
 
 
-schema = Schema(
-    query=Query, mutation=Mutation, extensions=[AsyncJSONWebTokenMiddleware]
-)
-sync_schema = Schema(
-    query=Query, mutation=Mutation, extensions=[JSONWebTokenMiddleware]
-)
+schema = Schema(query=Query, mutation=Mutation, extensions=[AsyncJSONWebTokenMiddleware])
+sync_schema = Schema(query=Query, mutation=Mutation, extensions=[JSONWebTokenMiddleware])
diff --git a/tests/example_app/settings.py b/tests/example_app/settings.py
index 1f74af4f..a128ec65 100644
--- a/tests/example_app/settings.py
+++ b/tests/example_app/settings.py
@@ -51,9 +51,7 @@
 REST_FRAMEWORK = {
     # Use Django's standard `django.contrib.auth` permissions,
     # or allow read-only access for unauthenticated users.
-    "DEFAULT_PERMISSION_CLASSES": [
-        "rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly"
-    ],
+    "DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly"],
     "DEFAULT_AUTHENTICATION_CLASSES": [
         "rest_framework.authentication.BasicAuthentication",
         "rest_framework.authentication.SessionAuthentication",
diff --git a/tests/example_app/urls.py b/tests/example_app/urls.py
index bd2dbb8e..b67ce1a2 100644
--- a/tests/example_app/urls.py
+++ b/tests/example_app/urls.py
@@ -7,11 +7,9 @@
 from rest_framework.routers import DefaultRouter
 
 from strawberry_django_jwt.decorators import jwt_cookie
+from strawberry_django_jwt.views import AsyncStatusHandlingGraphQLView as AGQLView
+from strawberry_django_jwt.views import StatusHandlingGraphQLView as GQLView
 from tests.example_app.schema import schema, sync_schema
-from strawberry_django_jwt.views import (
-    AsyncStatusHandlingGraphQLView as AGQLView,
-    StatusHandlingGraphQLView as GQLView,
-)
 
 
 class UserSerializer(serializers.HyperlinkedModelSerializer):
@@ -33,9 +31,7 @@ class UserViewSet(viewsets.ModelViewSet):
 # Wire up our API using automatic URL routing.
 # Additionally, we include login URLs for the browsable API.
 urlpatterns = [
-    re_path(
-        r"^graphql/?$", jwt_cookie(AGQLView.as_view(schema=schema)), name="graphql"
-    ),
+    re_path(r"^graphql/?$", jwt_cookie(AGQLView.as_view(schema=schema)), name="graphql"),
     re_path(
         r"^sync-graphql/?$",
         jwt_cookie(GQLView.as_view(schema=sync_schema)),
diff --git a/tests/mixins.py b/tests/mixins.py
index ae6b2820..96ac278c 100644
--- a/tests/mixins.py
+++ b/tests/mixins.py
@@ -3,13 +3,9 @@
 import strawberry_django_jwt
 from strawberry_django_jwt.settings import jwt_settings
 from strawberry_django_jwt.shortcuts import get_token
-from strawberry_django_jwt.signals import token_issued
-from strawberry_django_jwt.signals import token_refreshed
-
-from .context_managers import back_to_the_future
-from .context_managers import catch_signal
-from .context_managers import refresh_expired
-from .decorators import OverrideJwtSettings
+from strawberry_django_jwt.signals import token_issued, token_refreshed
+from tests.context_managers import back_to_the_future, catch_signal, refresh_expired
+from tests.decorators import OverrideJwtSettings
 
 
 class TokenAuthMixin:
@@ -65,9 +61,7 @@ def test_verify_invalid_token(self):
 
 class RefreshMixin:
     def test_refresh(self):
-        with catch_signal(
-            token_refreshed
-        ) as token_refreshed_handler, back_to_the_future(seconds=1):
+        with catch_signal(token_refreshed) as token_refreshed_handler, back_to_the_future(seconds=1):
 
             response = self.execute(
                 {
diff --git a/tests/refresh_token/mixins.py b/tests/refresh_token/mixins.py
index 0cafe300..aa83c3eb 100644
--- a/tests/refresh_token/mixins.py
+++ b/tests/refresh_token/mixins.py
@@ -1,20 +1,19 @@
 from importlib import reload
 from typing import Any
 
-import strawberry
 from asgiref.sync import sync_to_async
+import strawberry
 
 import strawberry_django_jwt
-from strawberry_django_jwt.refresh_token.signals import refresh_token_revoked
-from strawberry_django_jwt.refresh_token.signals import refresh_token_rotated
+from strawberry_django_jwt.refresh_token.signals import (
+    refresh_token_revoked,
+    refresh_token_rotated,
+)
 from strawberry_django_jwt.settings import jwt_settings
-from strawberry_django_jwt.shortcuts import create_refresh_token
-from strawberry_django_jwt.shortcuts import get_refresh_token
+from strawberry_django_jwt.shortcuts import create_refresh_token, get_refresh_token
 from strawberry_django_jwt.signals import token_issued
-from ..context_managers import back_to_the_future
-from ..context_managers import catch_signal
-from ..context_managers import refresh_expired
-from ..decorators import OverrideJwtSettings
+from tests.context_managers import back_to_the_future, catch_signal, refresh_expired
+from tests.decorators import OverrideJwtSettings
 
 
 class RefreshTokenMutationMixin:
@@ -27,12 +26,7 @@ def setUp(self):
         m = type(
             "jwt",
             (object,),
-            {
-                **{
-                    name: mutation
-                    for name, mutation in self.refresh_token_mutations.items()
-                }
-            },
+            {**{name: mutation for name, mutation in self.refresh_token_mutations.items()}},
         )
         self.Mutation = strawberry.type(m)
 
@@ -93,9 +87,7 @@ def setUp(self):
 
 class RefreshMixin(RefreshTokenMutationMixin, RefreshTokenMixin):
     def test_refresh_token(self):
-        with catch_signal(
-            refresh_token_rotated
-        ) as refresh_token_rotated_handler, back_to_the_future(seconds=1):
+        with catch_signal(refresh_token_rotated) as refresh_token_rotated_handler, back_to_the_future(seconds=1):
             response = self.execute(
                 {
                     "refreshToken": self.refresh_token.token,
@@ -120,9 +112,7 @@ def test_refresh_token(self):
 
     @OverrideJwtSettings(JWT_REUSE_REFRESH_TOKENS=True)
     def test_reuse_refresh_token(self):
-        with catch_signal(
-            refresh_token_rotated
-        ) as refresh_token_rotated_handler, back_to_the_future(seconds=1):
+        with catch_signal(refresh_token_rotated) as refresh_token_rotated_handler, back_to_the_future(seconds=1):
             response = self.execute(
                 {
                     "refreshToken": self.refresh_token.token,
@@ -224,9 +214,7 @@ class CookieRefreshMixin(RefreshTokenMutationMixin):
     def test_refresh_token(self):
         self.set_refresh_token_cookie()
 
-        with catch_signal(
-            refresh_token_rotated
-        ) as refresh_token_rotated_handler, back_to_the_future(seconds=1):
+        with catch_signal(refresh_token_rotated) as refresh_token_rotated_handler, back_to_the_future(seconds=1):
             response = self.execute()
 
         data = response.data["refreshToken"]
diff --git a/tests/refresh_token/mutations.py b/tests/refresh_token/mutations.py
index 632e6298..42e83363 100644
--- a/tests/refresh_token/mutations.py
+++ b/tests/refresh_token/mutations.py
@@ -1,5 +1,4 @@
-from strawberry_django_jwt.mixins import JSONWebTokenMixin
-from strawberry_django_jwt.mixins import RefreshTokenMixin
+from strawberry_django_jwt.mixins import JSONWebTokenMixin, RefreshTokenMixin
 
 
 class Refresh(RefreshTokenMixin, JSONWebTokenMixin):
diff --git a/tests/refresh_token/test_admin.py b/tests/refresh_token/test_admin.py
index 840052b0..dcc04849 100644
--- a/tests/refresh_token/test_admin.py
+++ b/tests/refresh_token/test_admin.py
@@ -1,9 +1,9 @@
 from django.contrib.admin import site
+
 from strawberry_django_jwt.refresh_token import admin
 from strawberry_django_jwt.refresh_token.utils import get_refresh_token_model
 from strawberry_django_jwt.shortcuts import create_refresh_token
-
-from ..testcases import TestCase
+from tests.testcases import TestCase
 
 
 class AdminTestCase(TestCase):
diff --git a/tests/refresh_token/test_commands.py b/tests/refresh_token/test_commands.py
index d44af13d..59e5b730 100644
--- a/tests/refresh_token/test_commands.py
+++ b/tests/refresh_token/test_commands.py
@@ -1,9 +1,9 @@
 import io
 
 from django.core.management import call_command
-from strawberry_django_jwt.shortcuts import create_refresh_token
 
-from ..testcases import UserTestCase
+from strawberry_django_jwt.shortcuts import create_refresh_token
+from tests.testcases import UserTestCase
 
 
 class ClearTokensTests(UserTestCase):
diff --git a/tests/refresh_token/test_models.py b/tests/refresh_token/test_models.py
index 2bc8e134..7de4d788 100644
--- a/tests/refresh_token/test_models.py
+++ b/tests/refresh_token/test_models.py
@@ -4,10 +4,8 @@
 from strawberry_django_jwt.refresh_token.signals import refresh_token_revoked
 from strawberry_django_jwt.settings import jwt_settings
 from strawberry_django_jwt.shortcuts import create_refresh_token
-
-from ..context_managers import catch_signal
-from ..context_managers import refresh_expired
-from ..testcases import UserTestCase
+from tests.context_managers import catch_signal, refresh_expired
+from tests.testcases import UserTestCase
 
 
 class AbstractRefreshTokenTests(UserTestCase):
diff --git a/tests/refresh_token/test_mutations.py b/tests/refresh_token/test_mutations.py
index 69a64610..227d4f81 100644
--- a/tests/refresh_token/test_mutations.py
+++ b/tests/refresh_token/test_mutations.py
@@ -105,9 +105,7 @@ class DeleteCookieTests(mixins.DeleteCookieMixin, CookieTestCase):
 
     @strawberry.type
     class Mutation:
-        delete_cookie = (
-            strawberry_django_jwt.mutations.DeleteRefreshTokenCookie.delete_cookie
-        )
+        delete_cookie = strawberry_django_jwt.mutations.DeleteRefreshTokenCookie.delete_cookie
 
 
 class AsyncCookieTokenAuthTests(mixins.AsyncCookieTokenAuthMixin, AsyncCookieTestCase):
diff --git a/tests/refresh_token/test_queries.py b/tests/refresh_token/test_queries.py
index 5f328b68..ce930f25 100644
--- a/tests/refresh_token/test_queries.py
+++ b/tests/refresh_token/test_queries.py
@@ -8,8 +8,8 @@
 from strawberry_django_jwt.mixins import JSONWebTokenMixin
 from strawberry_django_jwt.settings import jwt_settings
 from tests.decorators import OverrideJwtSettings
-from tests.testcases import SchemaTestCase
 from tests.strawberry_types import MyTestModel
+from tests.testcases import SchemaTestCase
 
 
 class QueriesTests(SchemaTestCase):
diff --git a/tests/refresh_token/test_shortcuts.py b/tests/refresh_token/test_shortcuts.py
index bc912bd3..7283d7ef 100644
--- a/tests/refresh_token/test_shortcuts.py
+++ b/tests/refresh_token/test_shortcuts.py
@@ -1,7 +1,6 @@
 from strawberry_django_jwt import shortcuts
 from strawberry_django_jwt.exceptions import JSONWebTokenError
-
-from ..testcases import UserTestCase
+from tests.testcases import UserTestCase
 
 
 class ShortcutsTests(UserTestCase):
diff --git a/tests/refresh_token/testcases.py b/tests/refresh_token/testcases.py
index 208a6282..40c9ccc2 100644
--- a/tests/refresh_token/testcases.py
+++ b/tests/refresh_token/testcases.py
@@ -1,6 +1,5 @@
 from strawberry_django_jwt.settings import jwt_settings
 from strawberry_django_jwt.shortcuts import create_refresh_token
-
 from tests import testcases
 
 
diff --git a/tests/strawberry_types.py b/tests/strawberry_types.py
index b0ee96d8..01ff44ce 100644
--- a/tests/strawberry_types.py
+++ b/tests/strawberry_types.py
@@ -1,5 +1,5 @@
+from strawberry import auto
 import strawberry_django
-from strawberry_django import auto
 
 from tests import models
 
diff --git a/tests/test_auth.py b/tests/test_auth.py
index 613250ef..eb155dd9 100644
--- a/tests/test_auth.py
+++ b/tests/test_auth.py
@@ -1,8 +1,15 @@
+from sys import version_info
+from unittest.mock import patch
+
+if version_info < (3, 8):
+    from mock import AsyncMock
+else:
+    from unittest.mock import AsyncMock
+
 from django.conf import settings
 from django.contrib.auth import get_user_model
 from django.core.exceptions import PermissionDenied
 from django.test import RequestFactory
-from mock import patch
 
 from strawberry_django_jwt.auth import authenticate
 from strawberry_django_jwt.backends import JSONWebTokenBackend
@@ -77,10 +84,7 @@ async def test_async_authenticate_signature(self):
         async def _authenticate(_=None, **__):
             return self.user
 
-        with patch(
-            "tests.test_auth.AsyncDefaultAuth.authenticate",
-            side_effect=_authenticate,
-        ):
+        with patch("tests.test_auth.AsyncDefaultAuth.authenticate", side_effect=_authenticate, new_callable=AsyncMock):
             result = await authenticate(request)
 
         self.assertEqual(result, self.user)
diff --git a/tests/test_backends.py b/tests/test_backends.py
index 0f14bf6b..955c0cb0 100644
--- a/tests/test_backends.py
+++ b/tests/test_backends.py
@@ -1,14 +1,15 @@
 import base64
 
-import pytest
 from django.contrib.auth.models import User
-from django.test import Client, TestCase as DjangoTestCase
+from django.test import Client
+from django.test import TestCase as DjangoTestCase
+import pytest
 from rest_framework.test import APIClient
 
 from strawberry_django_jwt.backends import JSONWebTokenBackend
 from strawberry_django_jwt.exceptions import JSONWebTokenError
 from strawberry_django_jwt.settings import jwt_settings
-from .testcases import AsyncTestCase, TestCase
+from tests.testcases import AsyncTestCase, TestCase
 
 
 @pytest.mark.django_db
@@ -27,12 +28,8 @@ def test_djrf_backend(self):
         assert response.status_code == 401
 
     def test_djrf_backend_authenticated(self):
-        User.objects.create_user(
-            username="test", password="test_pass", email="test@test.test"
-        )
-        self.djrf_client.credentials(
-            HTTP_AUTHORIZATION=f'Basic {base64.b64encode(b"test:test_pass").decode()}'
-        )
+        User.objects.create_user(username="test", password="test_pass", email="test@test.test")
+        self.djrf_client.credentials(HTTP_AUTHORIZATION=f'Basic {base64.b64encode(b"test:test_pass").decode()}')
         response = self.djrf_client.get("/users")
         assert response.status_code == 200
 
@@ -84,9 +81,7 @@ def setUp(self):
 
     async def test_authenticate_async(self):
         headers = {
-            jwt_settings.JWT_AUTH_HEADER_NAME.replace(
-                "HTTP_", ""
-            ): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {self.token}",
+            jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {self.token}",
         }
 
         request = self.request_factory.get("/", **headers)
@@ -96,9 +91,7 @@ async def test_authenticate_async(self):
 
     async def test_authenticate_fail_async(self):
         headers = {
-            jwt_settings.JWT_AUTH_HEADER_NAME.replace(
-                "HTTP_", ""
-            ): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} invalid",
+            jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} invalid",
         }
 
         request = self.request_factory.get("/", **headers)
diff --git a/tests/test_decorators.py b/tests/test_decorators.py
index 5e16a9fb..c029a736 100644
--- a/tests/test_decorators.py
+++ b/tests/test_decorators.py
@@ -1,11 +1,9 @@
 import django
-from django.contrib.auth.models import AnonymousUser
-from django.contrib.auth.models import Permission
-from strawberry_django_jwt import decorators
-from strawberry_django_jwt import exceptions
+from django.contrib.auth.models import AnonymousUser, Permission
 
-from .decorators import OverrideJwtSettings
-from .testcases import TestCase
+from strawberry_django_jwt import decorators, exceptions
+from tests.decorators import OverrideJwtSettings
+from tests.testcases import TestCase
 
 
 class UserPassesTests(TestCase):
diff --git a/tests/test_integration.py b/tests/test_integration.py
index c2d780a1..09c88195 100644
--- a/tests/test_integration.py
+++ b/tests/test_integration.py
@@ -36,9 +36,7 @@ def test_login(self):
                 "password": "dolphins",
             },
         }
-        response = self.client.post(
-            reverse("sync_graphql"), data=data, content_type="application/json"
-        )
+        response = self.client.post(reverse("sync_graphql"), data=data, content_type="application/json")
         result = response.json()
         self.assertEqual(result["status"], 200)
         self.assertEqual(result["data"]["tokenAuth"]["payload"], {"username": "test"})
@@ -46,9 +44,7 @@ def test_login(self):
 
     def test_read(self):
         data = {"query": self.read_query}
-        response = self.client.post(
-            reverse("sync_graphql"), data=data, content_type="application/json"
-        )
+        response = self.client.post(reverse("sync_graphql"), data=data, content_type="application/json")
         result = response.json()
         self.assertEqual(result["status"], 200)
         self.assertEqual(result["data"]["value"], 1)
@@ -62,9 +58,7 @@ async def test_login_asgi_request(self):
                 "password": "dolphins",
             },
         }
-        response = await self.async_client.post(
-            reverse("sync_graphql"), data=data, content_type="application/json"
-        )
+        response = await self.async_client.post(reverse("sync_graphql"), data=data, content_type="application/json")
         result = response.json()
         self.assertEqual(result["status"], 200)
         self.assertEqual(result["data"]["tokenAuth"]["payload"], {"username": "test"})
@@ -77,9 +71,7 @@ async def test_read_asgi_request(self):
         Tests https://github.com/KundaPanda/strawberry-django-jwt/issues/194
         """
         data = {"query": self.read_query}
-        response = await self.async_client.post(
-            reverse("sync_graphql"), data=data, content_type="application/json"
-        )
+        response = await self.async_client.post(reverse("sync_graphql"), data=data, content_type="application/json")
         result = response.json()
         self.assertEqual(result["status"], 200)
         self.assertEqual(result["data"]["value"], 1)
@@ -94,9 +86,7 @@ async def test_async_login(self):
                 "password": "dolphins",
             },
         }
-        response = await self.async_client.post(
-            reverse("graphql"), data=data, content_type="application/json"
-        )
+        response = await self.async_client.post(reverse("graphql"), data=data, content_type="application/json")
         result = response.json()
         self.assertEqual(result["status"], 200)
         self.assertEqual(result["data"]["tokenAuth"]["payload"], {"username": "test"})
@@ -104,9 +94,7 @@ async def test_async_login(self):
 
     async def test_async_read(self):
         data = {"query": self.read_query}
-        response = await self.async_client.post(
-            reverse("sync_graphql"), data=data, content_type="application/json"
-        )
+        response = await self.async_client.post(reverse("sync_graphql"), data=data, content_type="application/json")
         result = response.json()
         self.assertEqual(result["status"], 200)
         self.assertEqual(result["data"]["value"], 1)
diff --git a/tests/test_middleware.py b/tests/test_middleware.py
index 70b1f0f5..7831d9ca 100644
--- a/tests/test_middleware.py
+++ b/tests/test_middleware.py
@@ -11,7 +11,7 @@
 )
 from strawberry_django_jwt.settings import jwt_settings
 from tests.decorators import OverrideJwtSettings
-from .testcases import AsyncTestCase, TestCase
+from tests.testcases import AsyncTestCase, TestCase
 
 
 class AuthenticateByHeaderTests(TestCase):
@@ -112,9 +112,7 @@ def setUp(self):
         super().setUp()
         self.middleware = JSONWebTokenMiddleware
 
-    @OverrideJwtSettings(
-        JWT_ALLOW_ARGUMENT=True, JWT_ALLOW_ANY_HANDLER=lambda *args, **kwargs: False
-    )
+    @OverrideJwtSettings(JWT_ALLOW_ARGUMENT=True, JWT_ALLOW_ANY_HANDLER=lambda *args, **kwargs: False)
     def test_authenticate(self):
         kwargs = {
             jwt_settings.JWT_ARGUMENT_NAME: self.token,
@@ -235,9 +233,7 @@ def setUp(self):
     @OverrideJwtSettings(JWT_ALLOW_ANY_HANDLER=lambda *args: False)
     async def test_authenticate_async(self):
         headers = {
-            jwt_settings.JWT_AUTH_HEADER_NAME.replace(
-                "HTTP_", ""
-            ): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {self.token}",
+            jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {self.token}",
         }
 
         next_mock = mock.Mock()
@@ -255,18 +251,14 @@ async def auth(*args, **kwargs):
             return None
 
         headers = {
-            jwt_settings.JWT_AUTH_HEADER_NAME.replace(
-                "HTTP_", ""
-            ): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {self.token}",
+            jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {self.token}",
         }
 
         next_mock = mock.Mock()
         info_mock = self.info(AnonymousUser(), **headers)
 
         middleware = self.middleware(execution_context=info_mock.context)
-        with mock.patch(
-            "strawberry_django_jwt.middleware.authenticate_async", side_effect=auth
-        ) as authenticate_mock:
+        with mock.patch("strawberry_django_jwt.middleware.authenticate_async", side_effect=auth) as authenticate_mock:
             await middleware.resolve(next_mock, None, info_mock)
 
         next_mock.assert_called_once_with(None, info_mock)
@@ -276,9 +268,7 @@ async def auth(*args, **kwargs):
     @OverrideJwtSettings(JWT_ALLOW_ANY_HANDLER=lambda *args: False)
     async def test_invalid_token_async(self):
         headers = {
-            jwt_settings.JWT_AUTH_HEADER_NAME.replace(
-                "HTTP_", ""
-            ): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} invalid",
+            jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} invalid",
         }
 
         next_mock = mock.Mock()
@@ -299,9 +289,7 @@ async def test_already_authenticated_async(self):
         info_mock = self.info(self.user, **headers)
 
         middleware = self.middleware(execution_context=info_mock.context)
-        with mock.patch(
-            "strawberry_django_jwt.middleware.authenticate_async"
-        ) as authenticate_mock:
+        with mock.patch("strawberry_django_jwt.middleware.authenticate_async") as authenticate_mock:
             await middleware.resolve(next_mock, None, info_mock)
 
         next_mock.assert_called_once_with(None, info_mock)
@@ -329,9 +317,7 @@ def setUp(self):
         super().setUp()
         self.middleware = AsyncJSONWebTokenMiddleware
 
-    @OverrideJwtSettings(
-        JWT_ALLOW_ARGUMENT=True, JWT_ALLOW_ANY_HANDLER=lambda *args, **kwargs: False
-    )
+    @OverrideJwtSettings(JWT_ALLOW_ARGUMENT=True, JWT_ALLOW_ANY_HANDLER=lambda *args, **kwargs: False)
     async def test_authenticate_async(self):
         kwargs = {
             jwt_settings.JWT_ARGUMENT_NAME: self.token,
@@ -377,9 +363,7 @@ async def test_clear_authentication_async(self):
     async def test_clear_session_authentication_async(self):
         next_mock = mock.Mock()
         info_mock = self.info(self.user)
-        info_mock.context.session = await sync_to_async(self.client.__getattribute__)(
-            "session"
-        )
+        info_mock.context.session = await sync_to_async(self.client.__getattribute__)("session")
 
         middleware = self.middleware(execution_context=info_mock.context)
         await middleware.resolve(next_mock, None, info_mock)
diff --git a/tests/test_mutations.py b/tests/test_mutations.py
index 85f8f0be..964528a4 100644
--- a/tests/test_mutations.py
+++ b/tests/test_mutations.py
@@ -1,27 +1,27 @@
-import json
 from importlib import reload
+import json
+from unittest import mock
 
-import mock
-import strawberry.django
 from django.contrib.auth import get_user_model
 from django_mock_queries.query import MockModel, MockSet  # type: ignore
-from strawberry.django import auto, mutations
+from strawberry import auto
+import strawberry.django
+from strawberry.django import mutations
 from strawberry.types import Info
 
-import strawberry_django_jwt.mutations
 from strawberry_django_jwt.decorators import (
     dispose_extra_kwargs,
     login_field,
     login_required,
 )
 from strawberry_django_jwt.mixins import JSONWebTokenMixin
+import strawberry_django_jwt.mutations
 from strawberry_django_jwt.settings import jwt_settings
 from strawberry_django_jwt.shortcuts import get_token
-from tests.testcases import AsyncSchemaTestCase
-from . import mixins
-from .decorators import OverrideJwtSettings
-from .models import MyTestModel
-from .testcases import CookieTestCase, SchemaTestCase
+from tests import mixins
+from tests.decorators import OverrideJwtSettings
+from tests.models import MyTestModel
+from tests.testcases import AsyncSchemaTestCase, CookieTestCase, SchemaTestCase
 
 
 class TokenAuthTests(mixins.TokenAuthMixin, SchemaTestCase):
@@ -147,7 +147,7 @@ class Mutation:
         token_auth = strawberry_django_jwt.mutations.ObtainJSONWebToken.obtain
 
     def test_token_auth(self):
-        return super(CookieTokenAuthTests, self).test_token_auth()
+        return super().test_token_auth()
 
     def test_extended_field(self):
         @strawberry.type
@@ -192,9 +192,7 @@ class DeleteCookieTests(mixins.DeleteCookieMixin, CookieTestCase):
 
     @strawberry.type
     class Mutation:
-        delete_cookie = (
-            strawberry_django_jwt.mutations.DeleteJSONWebTokenCookie.delete_cookie
-        )
+        delete_cookie = strawberry_django_jwt.mutations.DeleteJSONWebTokenCookie.delete_cookie
 
 
 class LoginLogoutTest(SchemaTestCase):
@@ -253,9 +251,7 @@ def test_login_logout(self):
         )
 
         self.assertIsNone(response.errors)
-        self.assertEqual(
-            response.data["tokenAuth"]["payload"]["username"], self.user.get_username()
-        )
+        self.assertEqual(response.data["tokenAuth"]["payload"]["username"], self.user.get_username())
         token = response.data["tokenAuth"]["token"]
 
         # Verify with headers
diff --git a/tests/test_path.py b/tests/test_path.py
index 1889d2e1..fc13be30 100644
--- a/tests/test_path.py
+++ b/tests/test_path.py
@@ -1,6 +1,6 @@
 from django.test import TestCase
-from strawberry_django_jwt.path import filter_strings
-from strawberry_django_jwt.path import PathDict
+
+from strawberry_django_jwt.path import PathDict, filter_strings
 
 
 class FilterStringsTests(TestCase):
diff --git a/tests/test_queries.py b/tests/test_queries.py
index a9c232a1..8eb93d78 100644
--- a/tests/test_queries.py
+++ b/tests/test_queries.py
@@ -1,12 +1,12 @@
 from typing import List
 
-import pytest
-import strawberry
-import strawberry_django
 from django.contrib.auth import get_user_model
 from django.contrib.auth.models import AnonymousUser
 from graphql import get_introspection_query
+import pytest
+import strawberry
 from strawberry.types import Info
+import strawberry_django
 
 from strawberry_django_jwt.decorators import (
     dispose_extra_kwargs,
@@ -17,8 +17,8 @@
 from strawberry_django_jwt.model_object_types import UserType
 from strawberry_django_jwt.settings import jwt_settings
 from strawberry_django_jwt.shortcuts import get_token
-from tests.strawberry_types import MyTestModel
 from tests.decorators import OverrideJwtSettings
+from tests.strawberry_types import MyTestModel
 from tests.testcases import AsyncSchemaTestCase, SchemaTestCase
 
 
@@ -27,9 +27,8 @@ class QueriesTests(SchemaTestCase):
     class Query(JSONWebTokenMixin):
         @strawberry.field
         @dispose_extra_kwargs
-        def test(self, info) -> UserType:
-            ret = UserType(**info.context.user.__dict__)
-            return ret
+        def test(self, info: Info) -> UserType:
+            return UserType(**info.context.user.__dict__)
 
     def setUp(self):
         super().setUp()
@@ -104,9 +103,7 @@ def test_multiple_credentials(self):
         self.assertEqual(data["testBegin"].get("username"), self.user.username)
         self.assertEqual(data["testEnd"].get("username"), self.user.username)
         self.assertEqual(data["testToken"].get("username"), self.user.username)
-        self.assertEqual(
-            data["testOtherToken"].get("username"), self.other_user.username
-        )
+        self.assertEqual(data["testOtherToken"].get("username"), self.other_user.username)
 
         self.assertIsNone(response.errors)
 
@@ -289,9 +286,8 @@ class AsyncQueriesTests(AsyncSchemaTestCase):
     class Query(JSONWebTokenMixin):
         @strawberry.field
         @dispose_extra_kwargs
-        async def test(self, info) -> UserType:
-            ret = UserType(**info.context.user.__dict__)
-            return ret
+        async def test(self, info: Info) -> UserType:
+            return UserType(**info.context.user.__dict__)
 
     def setUp(self):
         super().setUp()
@@ -362,9 +358,7 @@ async def test_multiple_credentials(self):
         self.assertEqual(data["testBegin"].get("username"), self.user.username)
         self.assertEqual(data["testEnd"].get("username"), self.user.username)
         self.assertEqual(data["testToken"].get("username"), self.user.username)
-        self.assertEqual(
-            data["testOtherToken"].get("username"), self.other_user.username
-        )
+        self.assertEqual(data["testOtherToken"].get("username"), self.other_user.username)
 
         self.assertIsNone(response.errors)
 
diff --git a/tests/test_settings.py b/tests/test_settings.py
index c21d3793..e2bcba31 100644
--- a/tests/test_settings.py
+++ b/tests/test_settings.py
@@ -1,6 +1,7 @@
 from datetime import timedelta
 
 from django.test import TestCase
+
 from strawberry_django_jwt import settings
 
 
@@ -17,7 +18,7 @@ def test_import_from_string_error(self):
             settings.import_from_string("import.error", "")
 
     def test_reload_settings(self):
-        getattr(settings.jwt_settings, "JWT_ALGORITHM")
+        _ = settings.jwt_settings.JWT_ALGORITHM
         settings.reload_settings(setting="TEST")
 
         self.assertTrue(settings.jwt_settings._cached_attrs)
diff --git a/tests/test_shortcuts.py b/tests/test_shortcuts.py
index 90391ecf..cba94e88 100644
--- a/tests/test_shortcuts.py
+++ b/tests/test_shortcuts.py
@@ -1,6 +1,5 @@
 from strawberry_django_jwt import shortcuts
-
-from .testcases import UserTestCase
+from tests.testcases import UserTestCase
 
 
 class ShortcutsTests(UserTestCase):
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 7a06010d..6a2af239 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -1,14 +1,14 @@
-import importlib
 from datetime import timedelta
 from functools import wraps
+import importlib
 from types import ModuleType
 from unittest import mock
 
 from cryptography.hazmat.backends import default_backend
 from cryptography.hazmat.primitives.asymmetric import rsa
 
-import strawberry_django_jwt.object_types
 from strawberry_django_jwt import exceptions, utils
+import strawberry_django_jwt.object_types
 from strawberry_django_jwt.object_types import TokenPayloadType
 from strawberry_django_jwt.settings import jwt_settings
 from tests.decorators import OverrideJwtSettings
@@ -139,9 +139,7 @@ def test_missing_argument(self):
 
 
 class GetPayloadTests(TestCase):
-    @OverrideJwtSettings(
-        JWT_VERIFY_EXPIRATION=True, JWT_EXPIRATION_DELTA=timedelta(seconds=-1)
-    )
+    @OverrideJwtSettings(JWT_VERIFY_EXPIRATION=True, JWT_EXPIRATION_DELTA=timedelta(seconds=-1))
     def test_expired_signature(self):
         payload = utils.jwt_payload(self.user)
         token = utils.jwt_encode(payload)
@@ -153,9 +151,8 @@ def test_decode_audience_missing(self):
         payload = utils.jwt_payload(self.user)
         token = utils.jwt_encode(payload)
 
-        with OverrideJwtSettings(JWT_AUDIENCE="test"):
-            with self.assertRaises(exceptions.JSONWebTokenError):
-                utils.get_payload(token)
+        with OverrideJwtSettings(JWT_AUDIENCE="test"), self.assertRaises(exceptions.JSONWebTokenError):
+            utils.get_payload(token)
 
     def test_decode_error(self):
         with self.assertRaises(exceptions.JSONWebTokenError):
@@ -203,6 +200,5 @@ async def test_user_disabled_by_payload_async(self):
             "django.contrib.auth.models.User.is_active",
             new_callable=mock.PropertyMock,
             return_value=False,
-        ):
-            with self.assertRaises(exceptions.JSONWebTokenError):
-                await utils.get_user_by_payload_async(payload)
+        ), self.assertRaises(exceptions.JSONWebTokenError):
+            await utils.get_user_by_payload_async(payload)
diff --git a/tests/test_views.py b/tests/test_views.py
index f0c2c6b9..df15dbb9 100644
--- a/tests/test_views.py
+++ b/tests/test_views.py
@@ -1,7 +1,8 @@
 import json
 
-import strawberry
 from django.contrib.auth import get_user_model
+import strawberry
+from strawberry.types import Info
 
 from strawberry_django_jwt.decorators import login_required
 from strawberry_django_jwt.middleware import (
@@ -47,7 +48,7 @@ class ViewsTests(SchemaTestCase):
     class Query(JSONWebTokenMixin):
         @strawberry.field
         @login_required
-        def test(self, info) -> str:
+        def test(self, info: Info) -> str:
             return "TEST"
 
     def setUp(self):
@@ -132,7 +133,7 @@ class AsyncViewsTests(AsyncSchemaTestCase):
     class Query(JSONWebTokenMixin):
         @strawberry.field
         @login_required
-        async def test(self, info) -> str:
+        async def test(self, info: Info) -> str:
             return "TEST"
 
     def setUp(self):
@@ -151,9 +152,7 @@ async def test_login_async(self):
         """
 
         headers = {
-            jwt_settings.JWT_AUTH_HEADER_NAME.replace(
-                "HTTP_", ""
-            ): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {self.token}",
+            jwt_settings.JWT_AUTH_HEADER_NAME.replace("HTTP_", ""): f"{jwt_settings.JWT_AUTH_HEADER_PREFIX} {self.token}",
         }
 
         response = await self.client.execute(query, **headers)
diff --git a/tests/testcases.py b/tests/testcases.py
index 7e065f79..d50dfd4f 100644
--- a/tests/testcases.py
+++ b/tests/testcases.py
@@ -1,12 +1,12 @@
 import json
 from unittest import mock
 
-import strawberry
 from django.contrib.auth import get_user_model
 from django.contrib.auth.models import Permission, User
 from django.contrib.contenttypes.models import ContentType
 from django.test import AsyncRequestFactory, RequestFactory, testcases  # type: ignore
 from graphql.execution.execute import GraphQLResolveInfo
+import strawberry
 from strawberry.django.views import AsyncGraphQLView, GraphQLView
 
 from strawberry_django_jwt.decorators import jwt_cookie