Django × Pysen × Stubs

39766 ワード

以下に挙げている、様々なものを組み合わせようとするとかなり大変だったので、備忘録としてこちらの記事にさせていただきます。

前提として、Django プロジェクトのセットアップ済みで、Poetry は導入済みであることとして、進めさせていただきます。

1. Django × Pysen

まずは、Django プロジェクトに Pysen を導入します。

$ poetry add -D pysen[lint]
pyproject.toml
[tool.poetry.dev-dependencies]
pysen = {version = "0.9.1", extras = ["lint"]}

[tool.pysen]
version = "0.9"

[tool.pysen.lint]
enable_black = true
enable_flake8 = true
enable_isort = true
enable_mypy = true
mypy_preset = "strict"
line_length = 88
py_version = "py38"
mypy_ignore_packages = ["*.migrations.*"]

[[tool.pysen.lint.mypy_targets]]
  paths = ["."]

[tool.pysen.lint.source]
  includes = ["."]
  exclude_globs = ["**/migrations/*.py"]

2. 1 × django-configurations

Pysen に django-configurations のデフォルト値を設定することで、エラーになることを防ぎます。
以下のファイルを作成してください。

pysen_setup/base_mypy_setup.py
# ref: https://github.com/typeddjango/django-stubs/pull/180#issuecomment-820062352

import os
from typing import Any

from configurations.importer import install


def plugin(main: Any, version: str) -> Any:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapi.settings")
    os.environ.setdefault("DJANGO_CONFIGURATION", "Local")
    install()
    return main.plugin(version)

Pysen に作成したファイルを認識させるために、pyproject.toml を編集します。

pyproject.toml
+[tool.pysen-cli]
+settings_dir = "pysen_setup"
+
[tool.pysen]
version = "0.9"

[tool.pysen.lint]
enable_black = true
enable_flake8 = true
enable_isort = true
enable_mypy = true
mypy_preset = "strict"
line_length = 88
py_version = "py38"
mypy_ignore_packages = ["*.migrations.*"]

+[[tool.pysen.lint.mypy_plugins]]
+  script = "./base_mypy_setup.py"  # relative path from tool.pysen-cli.settings_dir
+
[[tool.pysen.lint.mypy_targets]]
  paths = ["."]

[tool.pysen.lint.source]
  includes = ["."]
  exclude_globs = ["**/migrations/*.py"]

3. 2 × django-stubs

django-stubs を Pysen に読み込ませるには、mypy の設定ファイルを編集する必要があります。