-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch build backend to Hatchling (#3233)
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 mypyc/mypyc#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 <[email protected]> Co-authored-by: Jelle Zijlstra <[email protected]>
- Loading branch information
1 parent
4b4680a
commit 468ceaf
Showing
13 changed files
with
140 additions
and
195 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -61,8 +61,6 @@ jobs: | |
uses: pypa/[email protected] | ||
env: | ||
CIBW_ARCHS_MACOS: "${{ matrix.macos_arch }}" | ||
# This isn't supported in pyproject.toml which makes sense (but is annoying). | ||
CIBW_PROJECT_REQUIRES_PYTHON: ">=3.6.2" | ||
|
||
- name: Upload wheels as workflow artifacts | ||
uses: actions/upload-artifact@v2 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,7 +7,7 @@ | |
|
||
[tool.black] | ||
line-length = 88 | ||
target-version = ['py36', 'py37', 'py38'] | ||
target-version = ['py37', 'py38'] | ||
include = '\.pyi?$' | ||
extend-exclude = ''' | ||
/( | ||
|
@@ -26,18 +26,128 @@ preview = true | |
# NOTE: You don't need this in your own Black configuration. | ||
|
||
[build-system] | ||
requires = ["setuptools>=45.0", "setuptools_scm[toml]>=6.3.1", "wheel"] | ||
build-backend = "setuptools.build_meta" | ||
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 = "[email protected]" }, | ||
] | ||
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.6+ only | ||
# - 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-*"] | ||
before-build = ["pip install -r .github/mypyc-requirements.txt"] | ||
# 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. | ||
|
@@ -49,7 +159,7 @@ test-extras = ["d"," jupyter"] | |
test-skip = ["*-macosx_arm64", "*-macosx_universal2:arm64"] | ||
|
||
[tool.cibuildwheel.environment] | ||
BLACK_USE_MYPYC = "1" | ||
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 | ||
|
@@ -61,28 +171,17 @@ AIOHTTP_NO_EXTENSIONS = "1" | |
|
||
[tool.cibuildwheel.linux] | ||
before-build = [ | ||
"pip install -r .github/mypyc-requirements.txt", | ||
"yum install -y clang gcc", | ||
] | ||
|
||
[tool.cibuildwheel.linux.environment] | ||
BLACK_USE_MYPYC = "1" | ||
HATCH_BUILD_HOOKS_ENABLE = "1" | ||
MYPYC_OPT_LEVEL = "3" | ||
MYPYC_DEBUG_LEVEL = "0" | ||
PIP_NO_BUILD_ISOLATION = "no" | ||
# Black needs Clang to compile successfully on Linux. | ||
CC = "clang" | ||
AIOHTTP_NO_EXTENSIONS = "1" | ||
|
||
[tool.cibuildwheel.windows] | ||
# For some reason, (compiled) mypyc is failing to start up with "ImportError: DLL load | ||
# failed: A dynamic link library (DLL) initialization routine failed." on Windows for | ||
# at least 3.6. Let's just use interpreted mypy[c]. | ||
# See also: https://github.com/mypyc/mypyc/issues/819. | ||
before-build = [ | ||
"pip install -r .github/mypyc-requirements.txt --no-binary mypy" | ||
] | ||
|
||
[tool.isort] | ||
atomic = true | ||
profile = "black" | ||
|
Oops, something went wrong.