diff --git a/.editorconfig b/.editorconfig index fa6c23c1fc2..e43144c4c81 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 0773edbd106..3f6dc9ab4cd 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 3c82aa20deb..47f5309085b 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 `, :py:ref:`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 bf9b1f962b3..048261e554d 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 ` conform to our - guidelines? Are there any ``flake8`` errors? You can install the - :ref:`pre-commit ` hooks to automatically catch - these errors. + guidelines? Are there any ``black``, ``flake8``, or ``isort`` errors? You + can install the :ref:`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 c37efc09eb0..db0a732d2f8 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 24c51c77ee9..2ef642fe5eb 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 94a5dae5823..5fa4b365eda 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 d20e8dfd1f4..d8aaee4ce16 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 c6887b6ee41..3b9f663385f 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