From ba94488196a74e312177ef2621fbd427956836ef Mon Sep 17 00:00:00 2001
From: Carlton Gibson <carlton.gibson@noumenal.es>
Date: Wed, 2 Feb 2022 11:36:57 +0100
Subject: [PATCH] Refs #33476 -- Adjusted docs and config files for Black.

Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
---
 .editorconfig                                 |  2 +-
 .pre-commit-config.yaml                       |  4 ++
 .../writing-code/coding-style.txt             | 42 +++++++------------
 .../writing-code/submitting-patches.txt       |  6 +--
 .../contributing/writing-code/unit-tests.txt  | 12 +++---
 docs/releases/4.0.3.txt                       |  5 ++-
 pyproject.toml                                |  4 ++
 setup.cfg                                     | 14 ++++---
 tox.ini                                       | 10 ++++-
 9 files changed, 54 insertions(+), 45 deletions(-)

diff --git a/.editorconfig b/.editorconfig
index fa6c23c1fc..e43144c4c8 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -12,7 +12,7 @@ charset = utf-8
 
 # Docstrings and comments use max_line_length = 79
 [*.py]
-max_line_length = 119
+max_line_length = 88
 
 # Use 2 spaces for the HTML files
 [*.html]
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0773edbd10..3f6dc9ab4c 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,4 +1,8 @@
 repos:
+  - repo: https://github.com/psf/black
+    rev: 22.1.0
+    hooks:
+    - id: black
   - repo: https://github.com/PyCQA/isort
     rev: 5.9.3
     hooks:
diff --git a/docs/internals/contributing/writing-code/coding-style.txt b/docs/internals/contributing/writing-code/coding-style.txt
index 3c82aa20de..47f5309085 100644
--- a/docs/internals/contributing/writing-code/coding-style.txt
+++ b/docs/internals/contributing/writing-code/coding-style.txt
@@ -35,10 +35,13 @@ them.
 Python style
 ============
 
-* Please conform to the indentation style dictated in the ``.editorconfig``
-  file. We recommend using a text editor with `EditorConfig`_ support to avoid
-  indentation and whitespace issues. The Python files use 4 spaces for
-  indentation and the HTML files use 2 spaces.
+* All files should be formatted using the `black`_ auto-formatter. This will be
+  run by ``pre-commit`` if that is configured.
+
+* The project repository includes an ``.editorconfig`` file. We recommend using
+  a text editor with `EditorConfig`_ support to avoid indentation and
+  whitespace issues. The Python files use 4 spaces for indentation and the HTML
+  files use 2 spaces.
 
 * Unless otherwise specified, follow :pep:`8`.
 
@@ -51,33 +54,11 @@ Python style
 
   An exception to :pep:`8` is our rules on line lengths. Don't limit lines of
   code to 79 characters if it means the code looks significantly uglier or is
-  harder to read. We allow up to 119 characters as this is the width of GitHub
-  code review; anything longer requires horizontal scrolling which makes review
-  more difficult. This check is included when you run ``flake8``. Documentation,
+  harder to read. We allow up to 88 characters as this is the line length used
+  by ``black``. This check is included when you run ``flake8``. Documentation,
   comments, and docstrings should be wrapped at 79 characters, even though
   :pep:`8` suggests 72.
 
-* Use four spaces for indentation.
-
-* Use four space hanging indentation rather than vertical alignment::
-
-    raise AttributeError(
-        'Here is a multiline error message '
-        'shortened for clarity.'
-    )
-
-  Instead of::
-
-      raise AttributeError('Here is a multiline error message '
-                           'shortened for clarity.')
-
-  This makes better use of space and avoids having to realign strings if the
-  length of the first line changes.
-
-* Use single quotes for strings, or a double quote if the string contains a
-  single quote. Don't waste time doing unrelated refactoring of existing code
-  to conform to this style.
-
 * String variable interpolation may use
   :py:ref:`%-formatting <old-string-formatting>`, :py:ref:`f-strings
   <f-strings>`, or :py:meth:`str.format` as appropriate, with the goal of
@@ -146,6 +127,10 @@ Python style
         """
         ...
 
+.. versionchanged:: 4.0.3
+
+    All Python code in Django was reformatted with `black`_.
+
 .. _coding-style-imports:
 
 Imports
@@ -397,5 +382,6 @@ JavaScript style
 For details about the JavaScript code style used by Django, see
 :doc:`javascript`.
 
+.. _black: https://black.readthedocs.io/en/stable/
 .. _editorconfig: https://editorconfig.org/
 .. _flake8: https://pypi.org/project/flake8/
diff --git a/docs/internals/contributing/writing-code/submitting-patches.txt b/docs/internals/contributing/writing-code/submitting-patches.txt
index bf9b1f962b..048261e554 100644
--- a/docs/internals/contributing/writing-code/submitting-patches.txt
+++ b/docs/internals/contributing/writing-code/submitting-patches.txt
@@ -290,9 +290,9 @@ All code changes
 
 * Does the :doc:`coding style
   </internals/contributing/writing-code/coding-style>` conform to our
-  guidelines? Are there any ``flake8`` errors? You can install the
-  :ref:`pre-commit <coding-style-pre-commit>` hooks to automatically catch
-  these errors.
+  guidelines? Are there any  ``black``, ``flake8``, or ``isort`` errors? You
+  can install the :ref:`pre-commit <coding-style-pre-commit>` hooks to
+  automatically catch these errors.
 * If the change is backwards incompatible in any way, is there a note
   in the release notes (``docs/releases/A.B.txt``)?
 * Is Django's test suite passing?
diff --git a/docs/internals/contributing/writing-code/unit-tests.txt b/docs/internals/contributing/writing-code/unit-tests.txt
index c37efc09eb..db0a732d2f 100644
--- a/docs/internals/contributing/writing-code/unit-tests.txt
+++ b/docs/internals/contributing/writing-code/unit-tests.txt
@@ -69,16 +69,18 @@ command from any place in the Django source tree:
     $ tox
 
 By default, ``tox`` runs the test suite with the bundled test settings file for
-SQLite, ``flake8``, ``isort``, and the documentation spelling checker. In
-addition to the system dependencies noted elsewhere in this documentation,
-the command ``python3`` must be on your path and linked to the appropriate
-version of Python. A list of default environments can be seen as follows:
+SQLite, ``black``, ``flake8``, ``isort``, and the documentation spelling
+checker. In addition to the system dependencies noted elsewhere in this
+documentation, the command ``python3`` must be on your path and linked to the
+appropriate version of Python. A list of default environments can be seen as
+follows:
 
 .. console::
 
     $ tox -l
     py3
-    flake8
+    black
+    flake8>=3.7.0
     docs
     isort>=5.1.0
 
diff --git a/docs/releases/4.0.3.txt b/docs/releases/4.0.3.txt
index 24c51c77ee..2ef642fe5e 100644
--- a/docs/releases/4.0.3.txt
+++ b/docs/releases/4.0.3.txt
@@ -4,7 +4,10 @@ Django 4.0.3 release notes
 
 *Expected March 1, 2022*
 
-Django 4.0.3 fixes several bugs in 4.0.2.
+Django 4.0.3 fixes several bugs in 4.0.2. Also, all Python code in Django is
+reformatted with `black`_.
+
+.. _black: https://pypi.org/project/black/
 
 Bugfixes
 ========
diff --git a/pyproject.toml b/pyproject.toml
index 94a5dae582..5fa4b365ed 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,7 @@
 [build-system]
 requires = ['setuptools>=40.8.0', 'wheel']
 build-backend = 'setuptools.build_meta:__legacy__'
+
+[tool.black]
+target-version = ['py38']
+extend-exclude = 'tests/test_runner_apps/tagged/tests_syntax_error.py'
diff --git a/setup.cfg b/setup.cfg
index d20e8dfd1f..d8aaee4ce1 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -57,13 +57,15 @@ install_script = scripts/rpm-install.sh
 
 [flake8]
 exclude = build,.git,.tox,./tests/.env
-ignore = W504,W601
-max-line-length = 119
+extend-ignore = E203
+max-line-length = 88
+per-file-ignores =
+    django/core/cache/backends/filebased.py:W601
+    django/core/cache/backends/base.py:W601
+    django/core/cache/backends/redis.py:W601
+    tests/cache/tests.py:W601
 
 [isort]
-combine_as_imports = true
+profile = black
 default_section = THIRDPARTY
-include_trailing_comma = true
 known_first_party = django
-line_length = 79
-multi_line_output = 5
diff --git a/tox.ini b/tox.ini
index c6887b6ee4..3b9f663385 100644
--- a/tox.ini
+++ b/tox.ini
@@ -8,7 +8,8 @@ minversion = 3.18
 skipsdist = true
 envlist =
     py3
-    flake8
+    black
+    flake8 >= 3.7.0
     docs
     isort >= 5.1.0
 
@@ -31,6 +32,13 @@ changedir = tests
 commands =
     {envpython} runtests.py {posargs}
 
+[testenv:black]
+basepython = python3
+usedevelop = false
+deps = black
+changedir = {toxinidir}
+commands = black --check --diff .
+
 [testenv:flake8]
 basepython = python3
 usedevelop = false