From fb2b1e1be3fb18eafe10d2106ab8e0db3c9b005e Mon Sep 17 00:00:00 2001
From: Tim Schilling <tim@aspiredu.com>
Date: Mon, 6 Mar 2023 15:51:42 -0600
Subject: [PATCH] Utilize pre-commit to manage lint and styles.

---
 .flake8                                       |  4 ++
 .gitignore                                    |  1 -
 .pre-commit-config.yaml                       | 54 +++++++++++++++++++
 pyproject.toml                                | 31 ++++++-----
 .../management/commands/safemigrate.py        |  4 +-
 tests/safemigrate_test.py                     |  3 ++
 6 files changed, 81 insertions(+), 16 deletions(-)
 create mode 100644 .flake8
 create mode 100644 .pre-commit-config.yaml

diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000..7d44b7e
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,4 @@
+# TODO: move this to pyproject.toml when supported, see https://github.com/PyCQA/flake8/issues/234
+
+[flake8]
+extend-ignore = E203, E501
diff --git a/.gitignore b/.gitignore
index c4b0eb9..7a06605 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,4 +10,3 @@ db.sqlite3
 htmlcov/
 dist/
 .tox/
-
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..b07dcec
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,54 @@
+repos:
+-   repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.4.0
+    hooks:
+    -   id: check-toml
+    -   id: check-yaml
+    -   id: end-of-file-fixer
+    -   id: trailing-whitespace
+    -   id: mixed-line-ending
+-   repo: https://github.com/pycqa/flake8
+    rev: 6.0.0
+    hooks:
+    -   id: flake8
+-   repo: https://github.com/pycqa/doc8
+    rev: v1.1.1
+    hooks:
+    -   id: doc8
+-   repo: https://github.com/asottile/pyupgrade
+    rev: v3.3.1
+    hooks:
+    -   id: pyupgrade
+        args: [--py38-plus]
+-   repo: https://github.com/adamchainz/django-upgrade
+    rev: 1.13.0
+    hooks:
+    -   id: django-upgrade
+        args: [--target-version, "3.2"]
+-   repo: https://github.com/pycqa/isort
+    rev: 5.12.0
+    hooks:
+    -   id: isort
+-   repo: https://github.com/pre-commit/pygrep-hooks
+    rev: v1.10.0
+    hooks:
+    -   id: python-check-blanket-noqa
+    -   id: python-check-mock-methods
+    -   id: python-no-eval
+    -   id: python-no-log-warn
+    -   id: rst-backticks
+    -   id: rst-directive-colons
+-   repo: https://github.com/psf/black
+    rev: 23.1.0
+    hooks:
+    -   id: black
+        language_version: python3
+        entry: black --target-version=py38
+-   repo: https://github.com/tox-dev/pyproject-fmt
+    rev: 0.9.2
+    hooks:
+      - id: pyproject-fmt
+-   repo: https://github.com/abravalheri/validate-pyproject
+    rev: v0.12.1
+    hooks:
+      - id: validate-pyproject
diff --git a/pyproject.toml b/pyproject.toml
index a3a9a6f..f6d36c7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,23 @@
 [build-system]
-requires = ["poetry>=0.12"]
 build-backend = "poetry.masonry.api"
+requires = [
+  "poetry>=0.12",
+]
+
+[tool.isort]
+combine_as_imports = true
+profile = "black"
+
+[tool.coverage.run]
+branch = true
+parallel = true
+source = ["django_safemigrate"]
+
+[tool.coverage.paths]
+source = ["src", ".tox/*/site-packages"]
+
+[tool.coverage.report]
+show_missing = true
 
 [tool.poetry]
 name = "django-safemigrate"
@@ -16,15 +33,3 @@ django = ">=3.2,<5.0"
 
 [tool.poetry.dev-dependencies]
 tox = "*"
-black = "*"
-
-[tool.coverage.run]
-branch = true
-parallel = true
-source = ["django_safemigrate"]
-
-[tool.coverage.paths]
-source = ["src", ".tox/*/site-packages"]
-
-[tool.coverage.report]
-show_missing = true
diff --git a/src/django_safemigrate/management/commands/safemigrate.py b/src/django_safemigrate/management/commands/safemigrate.py
index 8ca530d..53b5c1a 100644
--- a/src/django_safemigrate/management/commands/safemigrate.py
+++ b/src/django_safemigrate/management/commands/safemigrate.py
@@ -3,11 +3,11 @@
 Migration safety is enforced by a pre_migrate signal receiver.
 """
 from django.conf import settings
-from django.db.models.signals import pre_migrate
 from django.core.management.base import CommandError
 from django.core.management.commands import migrate
+from django.db.models.signals import pre_migrate
+
 from django_safemigrate import Safe
-from django_safemigrate.apps import SafeMigrateConfig
 
 
 def safety(migration):
diff --git a/tests/safemigrate_test.py b/tests/safemigrate_test.py
index 1cd4539..36702ff 100644
--- a/tests/safemigrate_test.py
+++ b/tests/safemigrate_test.py
@@ -1,6 +1,7 @@
 """Unit tests for the safemigrate command."""
 import pytest
 from django.core.management.base import CommandError
+
 from django_safemigrate import Safe
 from django_safemigrate.management.commands.safemigrate import Command
 
@@ -156,6 +157,8 @@ def test_blocked_by_after_run_before(self, receiver):
             ),
             (Migration("eggs", "0001_safety", safe=Safe.before_deploy), False),
         ]
+        with pytest.raises(CommandError):
+            receiver(plan=plan)
 
     def test_consecutive_after(self, receiver):
         """Consecutive after migrations are ok."""