
This implements PEP 621, obviating the need for `setup.py`, `setup.cfg`, and `MANIFEST.in`. The build backend Hatchling (of which I am a maintainer in the PyPA) is now used as that is the default in the official Python packaging tutorial. Hatchling is available on all the major distribution channels such as Debian, Fedora, and many more. ## Python support The earliest supported Python 3 version of Hatchling is 3.7, therefore I've also set that as the minimum here. Python 3.6 is EOL and other build backends like flit-core and setuptools also dropped support. Python 3.6 accounted for 3-4% of downloads in the last month. ## Plugins Configuration is now completely static with the help of 3 plugins: ### Readme hynek's hatch-fancy-pypi-readme allows for the dynamic construction of the readme which was previously coded up in `setup.py`. Now it's simply: ```toml [tool.hatch.metadata.hooks.fancy-pypi-readme] content-type = "text/markdown" fragments = [ { path = "README.md" }, { path = "CHANGES.md" }, ] ``` ### Versioning hatch-vcs is currently just a wrapper around setuptools-scm (which despite the legacy naming is actually now decoupled from setuptools): ```toml [tool.hatch.version] source = "vcs" [tool.hatch.build.hooks.vcs] version-file = "src/_black_version.py" template = ''' version = "{version}" ''' ``` ### mypyc hatch-mypyc offers many benefits over the existing approach: - No need to manually select files for inclusion - Avoids the need for the current CI workaround for https://github.com/mypyc/mypyc/issues/946 - Intermediate artifacts (like `build/`) from setuptools and mypyc itself no longer clutter the project directory - Runtime dependencies required at build time no longer need to be manually redeclared as this is a built-in option of Hatchling Co-authored-by: Richard Si <63936253+ichard26@users.noreply.github.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
219 lines
6.8 KiB
TOML
219 lines
6.8 KiB
TOML
# Example configuration for Black.
|
|
|
|
# NOTE: you have to use single-quoted strings in TOML for regular expressions.
|
|
# It's the equivalent of r-strings in Python. Multiline strings are treated as
|
|
# verbose regular expressions by Black. Use [ ] to denote a significant space
|
|
# character.
|
|
|
|
[tool.black]
|
|
line-length = 88
|
|
target-version = ['py37', 'py38']
|
|
include = '\.pyi?$'
|
|
extend-exclude = '''
|
|
/(
|
|
# The following are specific to Black, you probably don't want those.
|
|
| blib2to3
|
|
| tests/data
|
|
| profiling
|
|
)/
|
|
'''
|
|
# We use preview style for formatting Black itself. If you
|
|
# want stable formatting across releases, you should keep
|
|
# this off.
|
|
preview = true
|
|
|
|
# Build system information and other project-specific configuration below.
|
|
# NOTE: You don't need this in your own Black configuration.
|
|
|
|
[build-system]
|
|
requires = ["hatchling>=1.8.0", "hatch-vcs", "hatch-fancy-pypi-readme"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[project]
|
|
name = "black"
|
|
description = "The uncompromising code formatter."
|
|
license = "MIT"
|
|
requires-python = ">=3.7"
|
|
authors = [
|
|
{ name = "Łukasz Langa", email = "lukasz@langa.pl" },
|
|
]
|
|
keywords = [
|
|
"automation",
|
|
"autopep8",
|
|
"formatter",
|
|
"gofmt",
|
|
"pyfmt",
|
|
"rustfmt",
|
|
"yapf",
|
|
]
|
|
classifiers = [
|
|
"Development Status :: 5 - Production/Stable",
|
|
"Environment :: Console",
|
|
"Intended Audience :: Developers",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: Python",
|
|
"Programming Language :: Python :: 3 :: Only",
|
|
"Programming Language :: Python :: 3.7",
|
|
"Programming Language :: Python :: 3.8",
|
|
"Programming Language :: Python :: 3.9",
|
|
"Programming Language :: Python :: 3.10",
|
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
"Topic :: Software Development :: Quality Assurance",
|
|
]
|
|
dependencies = [
|
|
"click>=8.0.0",
|
|
"mypy_extensions>=0.4.3",
|
|
"pathspec>=0.9.0",
|
|
"platformdirs>=2",
|
|
"tomli>=1.1.0; python_full_version < '3.11.0a7'",
|
|
"typed-ast>=1.4.2; python_version < '3.8' and implementation_name == 'cpython'",
|
|
"typing_extensions>=3.10.0.0; python_version < '3.10'",
|
|
]
|
|
dynamic = ["readme", "version"]
|
|
|
|
[project.optional-dependencies]
|
|
colorama = ["colorama>=0.4.3"]
|
|
uvloop = ["uvloop>=0.15.2"]
|
|
d = [
|
|
"aiohttp>=3.7.4",
|
|
]
|
|
jupyter = [
|
|
"ipython>=7.8.0",
|
|
"tokenize-rt>=3.2.0",
|
|
]
|
|
|
|
[project.scripts]
|
|
black = "black:patched_main"
|
|
blackd = "blackd:patched_main [d]"
|
|
|
|
[project.urls]
|
|
Changelog = "https://github.com/psf/black/blob/main/CHANGES.md"
|
|
Homepage = "https://github.com/psf/black"
|
|
|
|
[tool.hatch.metadata.hooks.fancy-pypi-readme]
|
|
content-type = "text/markdown"
|
|
fragments = [
|
|
{ path = "README.md" },
|
|
{ path = "CHANGES.md" },
|
|
]
|
|
|
|
[tool.hatch.version]
|
|
source = "vcs"
|
|
|
|
[tool.hatch.build.hooks.vcs]
|
|
version-file = "src/_black_version.py"
|
|
template = '''
|
|
version = "{version}"
|
|
'''
|
|
|
|
[tool.hatch.build.targets.sdist]
|
|
exclude = ["/profiling"]
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
only-include = ["src"]
|
|
sources = ["src"]
|
|
|
|
[tool.hatch.build.targets.wheel.hooks.mypyc]
|
|
enable-by-default = false
|
|
dependencies = [
|
|
"hatch-mypyc>=0.13.0",
|
|
"mypy==0.971",
|
|
# Required stubs to be removed when the packages support PEP 561 themselves
|
|
"types-typed-ast>=1.4.2",
|
|
]
|
|
require-runtime-dependencies = true
|
|
exclude = [
|
|
# There's no good reason for blackd to be compiled.
|
|
"/src/blackd",
|
|
# Not performance sensitive, so save bytes + compilation time:
|
|
"/src/blib2to3/__init__.py",
|
|
"/src/blib2to3/pgen2/__init__.py",
|
|
"/src/black/output.py",
|
|
"/src/black/concurrency.py",
|
|
"/src/black/files.py",
|
|
"/src/black/report.py",
|
|
# Breaks the test suite when compiled (and is also useless):
|
|
"/src/black/debug.py",
|
|
# Compiled modules can't be run directly and that's a problem here:
|
|
"/src/black/__main__.py",
|
|
]
|
|
options = { debug_level = "0" }
|
|
|
|
[tool.cibuildwheel]
|
|
build-verbosity = 1
|
|
# So these are the environments we target:
|
|
# - Python: CPython 3.7+ only
|
|
# - Architecture (64-bit only): amd64 / x86_64, universal2, and arm64
|
|
# - OS: Linux (no musl), Windows, and macOS
|
|
build = "cp3*-*"
|
|
skip = ["*-manylinux_i686", "*-musllinux_*", "*-win32", "pp-*"]
|
|
# This is the bare minimum needed to run the test suite. Pulling in the full
|
|
# test_requirements.txt would download a bunch of other packages not necessary
|
|
# here and would slow down the testing step a fair bit.
|
|
test-requires = ["pytest>=6.1.1"]
|
|
test-command = 'pytest {project} -k "not incompatible_with_mypyc"'
|
|
test-extras = ["d"," jupyter"]
|
|
# Skip trying to test arm64 builds on Intel Macs. (so cross-compilation doesn't
|
|
# straight up crash)
|
|
test-skip = ["*-macosx_arm64", "*-macosx_universal2:arm64"]
|
|
|
|
[tool.cibuildwheel.environment]
|
|
HATCH_BUILD_HOOKS_ENABLE = "1"
|
|
MYPYC_OPT_LEVEL = "3"
|
|
MYPYC_DEBUG_LEVEL = "0"
|
|
# The dependencies required to build wheels with mypyc aren't specified in
|
|
# [build-system].requires so we'll have to manage the build environment ourselves.
|
|
PIP_NO_BUILD_ISOLATION = "no"
|
|
# CPython 3.11 wheels aren't available for aiohttp and building a Cython extension
|
|
# from source also doesn't work.
|
|
AIOHTTP_NO_EXTENSIONS = "1"
|
|
|
|
[tool.cibuildwheel.linux]
|
|
before-build = [
|
|
"yum install -y clang gcc",
|
|
]
|
|
|
|
[tool.cibuildwheel.linux.environment]
|
|
HATCH_BUILD_HOOKS_ENABLE = "1"
|
|
MYPYC_OPT_LEVEL = "3"
|
|
MYPYC_DEBUG_LEVEL = "0"
|
|
# Black needs Clang to compile successfully on Linux.
|
|
CC = "clang"
|
|
AIOHTTP_NO_EXTENSIONS = "1"
|
|
|
|
[tool.isort]
|
|
atomic = true
|
|
profile = "black"
|
|
line_length = 88
|
|
skip_gitignore = true
|
|
skip_glob = ["src/blib2to3", "tests/data", "profiling"]
|
|
known_first_party = ["black", "blib2to3", "blackd", "_black_version"]
|
|
|
|
[tool.pytest.ini_options]
|
|
# Option below requires `tests/optional.py`
|
|
addopts = "--strict-config --strict-markers"
|
|
optional-tests = [
|
|
"no_blackd: run when `d` extra NOT installed",
|
|
"no_jupyter: run when `jupyter` extra NOT installed",
|
|
]
|
|
markers = [
|
|
"incompatible_with_mypyc: run when testing mypyc compiled black"
|
|
]
|
|
xfail_strict = true
|
|
filterwarnings = [
|
|
"error",
|
|
# this is mitigated by a try/catch in https://github.com/psf/black/pull/2974/
|
|
# this ignore can be removed when support for aiohttp 3.7 is dropped.
|
|
'''ignore:Decorator `@unittest_run_loop` is no longer needed in aiohttp 3\.8\+:DeprecationWarning''',
|
|
# this is mitigated by a try/catch in https://github.com/psf/black/pull/3198/
|
|
# this ignore can be removed when support for aiohttp 3.x is dropped.
|
|
'''ignore:Middleware decorator is deprecated since 4\.0 and its behaviour is default, you can simply remove this decorator:DeprecationWarning''',
|
|
# this is mitigated by https://github.com/python/cpython/issues/79071 in python 3.8+
|
|
# this ignore can be removed when support for 3.7 is dropped.
|
|
'''ignore:Bare functions are deprecated, use async ones:DeprecationWarning''',
|
|
# aiohttp is using deprecated cgi modules - Safe to remove when fixed:
|
|
# https://github.com/aio-libs/aiohttp/issues/6905
|
|
'''ignore:'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning''',
|
|
]
|