From a4864e59ac2e0b7d0302f2034d15f7443940448d Mon Sep 17 00:00:00 2001 From: Ofek Lev Date: Fri, 19 Aug 2022 17:25:12 -0400 Subject: [PATCH] Switch build backend to Hatchling --- .github/mypyc-requirements.txt | 14 --- .github/workflows/diff_shades.yml | 13 +- .github/workflows/fuzz.yml | 2 +- .github/workflows/test.yml | 2 +- MANIFEST.in | 1 - docs/usage_and_configuration/the_basics.md | 7 +- pyproject.toml | 136 +++++++++++++++++--- setup.cfg | 3 - setup.py | 140 --------------------- tox.ini | 5 +- 10 files changed, 131 insertions(+), 192 deletions(-) delete mode 100644 .github/mypyc-requirements.txt delete mode 100644 MANIFEST.in delete mode 100644 setup.cfg delete mode 100644 setup.py diff --git a/.github/mypyc-requirements.txt b/.github/mypyc-requirements.txt deleted file mode 100644 index 352d36c0070..00000000000 --- a/.github/mypyc-requirements.txt +++ /dev/null @@ -1,14 +0,0 @@ -mypy == 0.971 - -# A bunch of packages for type information -mypy-extensions >= 0.4.3 -tomli >= 0.10.2 -types-typed-ast >= 1.4.2 -types-dataclasses >= 0.1.3 -typing-extensions > 3.10.0.1 -click >= 8.0.0 -platformdirs >= 2.1.0 - -# And because build isolation is disabled, we'll need to pull this too -setuptools-scm[toml] >= 6.3.1 -wheel diff --git a/.github/workflows/diff_shades.yml b/.github/workflows/diff_shades.yml index 390089eca42..36693aa3ddd 100644 --- a/.github/workflows/diff_shades.yml +++ b/.github/workflows/diff_shades.yml @@ -3,10 +3,10 @@ name: diff-shades on: push: branches: [main] - paths: ["src/**", "setup.*", "pyproject.toml", ".github/workflows/*"] + paths: ["src/**", "pyproject.toml", ".github/workflows/*"] pull_request: - paths: ["src/**", "setup.*", "pyproject.toml", ".github/workflows/*"] + paths: ["src/**", "pyproject.toml", ".github/workflows/*"] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} @@ -64,7 +64,6 @@ jobs: run: | python -m pip install https://github.com/ichard26/diff-shades/archive/stable.zip python -m pip install click packaging urllib3 - python -m pip install -r .github/mypyc-requirements.txt # After checking out old revisions, this might not exist so we'll use a copy. cat scripts/diff_shades_gha_helper.py > helper.py git config user.name "diff-shades-gha" @@ -81,10 +80,10 @@ jobs: if: steps.baseline-cache.outputs.cache-hit != 'true' env: GITHUB_TOKEN: ${{ github.token }} + HATCH_BUILD_HOOKS_ENABLE: "1" run: > ${{ matrix.baseline-setup-cmd }} - && python setup.py --use-mypyc bdist_wheel - && python -m pip install dist/*.whl && rm build dist -r + && python -m pip install . && rm dist -r - name: Analyze baseline revision if: steps.baseline-cache.outputs.cache-hit != 'true' @@ -95,10 +94,10 @@ jobs: - name: Build and install target revision env: GITHUB_TOKEN: ${{ github.token }} + HATCH_BUILD_HOOKS_ENABLE: "1" run: > ${{ matrix.target-setup-cmd }} - && python setup.py --use-mypyc bdist_wheel - && python -m pip install dist/*.whl + && python -m pip install . - name: Analyze target revision run: > diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index a2810e25f77..ebb8a9fda9e 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"] + python-version: ["3.7", "3.8", "3.9", "3.10"] steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7cc55d1bf76..372d1fd5d38 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,7 +31,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "pypy-3.7", "pypy-3.8"] + python-version: ["3.7", "3.8", "3.9", "3.10", "pypy-3.7", "pypy-3.8"] os: [ubuntu-latest, macOS-latest, windows-latest] steps: diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 5e53af336e2..00000000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -prune profiling diff --git a/docs/usage_and_configuration/the_basics.md b/docs/usage_and_configuration/the_basics.md index 4c358742674..58e6c76de76 100644 --- a/docs/usage_and_configuration/the_basics.md +++ b/docs/usage_and_configuration/the_basics.md @@ -204,9 +204,10 @@ code in compliance with many other _Black_ formatted projects. [PEP 518](https://www.python.org/dev/peps/pep-0518/) defines `pyproject.toml` as a configuration file to store build system requirements for Python projects. With the help -of tools like [Poetry](https://python-poetry.org/) or -[Flit](https://flit.readthedocs.io/en/latest/) it can fully replace the need for -`setup.py` and `setup.cfg` files. +of tools like [Poetry](https://python-poetry.org/), +[Flit](https://flit.readthedocs.io/en/latest/), or +[Hatch](https://hatch.pypa.io/latest/) it can fully replace the need for `setup.py` and +`setup.cfg` files. ### Where _Black_ looks for the file diff --git a/pyproject.toml b/pyproject.toml index 813e86b2e93..6211e44469c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ [tool.black] line-length = 88 -target-version = ['py36', 'py37', 'py38'] +target-version = ['py37', 'py38'] include = '\.pyi?$' extend-exclude = ''' /( @@ -26,8 +26,119 @@ 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 = "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", +] +d = [ + "aiohttp>=3.7.4", +] +jupyter = [ + "ipython>=7.8.0", + "tokenize-rt>=3.2.0", +] +uvloop = [ + "uvloop>=0.15.2", +] + +[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" + +[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] +path = "README.md" + +[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] +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.wheel] +only-include = ["src"] +sources = ["src"] + +[tool.hatch.build.targets.wheel.hooks.mypyc] +enable-by-default = false +dependencies = [ + "hatch-mypyc>=0.13.0", + # Required stubs to be removed when the packages support PEP 561 themselves + "types-typed-ast>=1.4.2", +] +require-runtime-dependencies = true +exclude = [ + # 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 @@ -37,7 +148,6 @@ build-verbosity = 1 # - 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,38 +159,24 @@ 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 -# [build-system].requires so we'll have to manage the build environment ourselves. -PIP_NO_BUILD_ISOLATION = "no" [tool.cibuildwheel.linux] before-build = [ - "pip install -r .github/mypyc-requirements.txt", "yum install -y clang", ] # Newer images break the builds, not sure why. We'll need to investigate more later. manylinux-x86_64-image = "quay.io/pypa/manylinux2014_x86_64:2021-11-20-f410d11" [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" -[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" diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 1a0a217eb91..00000000000 --- a/setup.cfg +++ /dev/null @@ -1,3 +0,0 @@ -[options] -setup_requires = - setuptools_scm[toml]>=6.3.1 diff --git a/setup.py b/setup.py deleted file mode 100644 index bc0cc32352e..00000000000 --- a/setup.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright (C) 2020 Łukasz Langa -import os -import sys - -from setuptools import find_packages, setup - -assert sys.version_info >= (3, 6, 2), "black requires Python 3.6.2+" -from pathlib import Path # noqa E402 -from typing import List # noqa: E402 - -CURRENT_DIR = Path(__file__).parent -sys.path.insert(0, str(CURRENT_DIR)) # for setuptools.build_meta - - -def get_long_description() -> str: - return ( - (CURRENT_DIR / "README.md").read_text(encoding="utf8") - + "\n\n" - + (CURRENT_DIR / "CHANGES.md").read_text(encoding="utf8") - ) - - -def find_python_files(base: Path) -> List[Path]: - files = [] - for entry in base.iterdir(): - if entry.is_file() and entry.suffix == ".py": - files.append(entry) - elif entry.is_dir(): - files.extend(find_python_files(entry)) - - return files - - -USE_MYPYC = False -# To compile with mypyc, a mypyc checkout must be present on the PYTHONPATH -if len(sys.argv) > 1 and sys.argv[1] == "--use-mypyc": - sys.argv.pop(1) - USE_MYPYC = True -if os.getenv("BLACK_USE_MYPYC", None) == "1": - USE_MYPYC = True - -if USE_MYPYC: - from mypyc.build import mypycify - - src = CURRENT_DIR / "src" - # TIP: filepaths are normalized to use forward slashes and are relative to ./src/ - # before being checked against. - blocklist = [ - # Not performance sensitive, so save bytes + compilation time: - "blib2to3/__init__.py", - "blib2to3/pgen2/__init__.py", - "black/output.py", - "black/concurrency.py", - "black/files.py", - "black/report.py", - # Breaks the test suite when compiled (and is also useless): - "black/debug.py", - # Compiled modules can't be run directly and that's a problem here: - "black/__main__.py", - ] - discovered = [] - # There's no good reason for blackd to be compiled. - discovered.extend(find_python_files(src / "black")) - discovered.extend(find_python_files(src / "blib2to3")) - mypyc_targets = [ - str(p) for p in discovered if p.relative_to(src).as_posix() not in blocklist - ] - - opt_level = os.getenv("MYPYC_OPT_LEVEL", "3") - debug_level = os.getenv("MYPYC_DEBUG_LEVEL", "3") - ext_modules = mypycify( - mypyc_targets, opt_level=opt_level, debug_level=debug_level, verbose=True - ) -else: - ext_modules = [] - -setup( - name="black", - use_scm_version={ - "write_to": "src/_black_version.py", - "write_to_template": 'version = "{version}"\n', - }, - description="The uncompromising code formatter.", - long_description=get_long_description(), - long_description_content_type="text/markdown", - keywords="automation formatter yapf autopep8 pyfmt gofmt rustfmt", - author="Łukasz Langa", - author_email="lukasz@langa.pl", - url="https://github.com/psf/black", - project_urls={"Changelog": "https://github.com/psf/black/blob/main/CHANGES.md"}, - license="MIT", - py_modules=["_black_version"], - ext_modules=ext_modules, - packages=find_packages(where="src"), - package_dir={"": "src"}, - package_data={ - "blib2to3": ["*.txt"], - "black": ["py.typed"], - }, - python_requires=">=3.6.2", - zip_safe=False, - install_requires=[ - "click>=8.0.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'", - "pathspec>=0.9.0", - "dataclasses>=0.6; python_version < '3.7'", - "typing_extensions>=3.10.0.0; python_version < '3.10'", - "mypy_extensions>=0.4.3", - ], - extras_require={ - "d": ["aiohttp>=3.7.4"], - "colorama": ["colorama>=0.4.3"], - "uvloop": ["uvloop>=0.15.2"], - "jupyter": ["ipython>=7.8.0", "tokenize-rt>=3.2.0"], - }, - 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.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3 :: Only", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Software Development :: Quality Assurance", - ], - entry_points={ - "console_scripts": [ - "black=black:patched_main", - "blackd=blackd:patched_main [d]", - ] - }, -) diff --git a/tox.ini b/tox.ini index 51ff4872db0..7532617a4a6 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,6 @@ [tox] -envlist = {,ci-}py{36,37,38,39,310,py3},fuzz,run_self +isolated_build = true +envlist = {,ci-}py{37,38,39,310,py3},fuzz,run_self [testenv] setenv = PYTHONPATH = {toxinidir}/src @@ -67,4 +68,4 @@ setenv = PYTHONPATH = {toxinidir}/src skip_install = True commands = pip install -e .[d] - black --check {toxinidir}/src {toxinidir}/tests {toxinidir}/setup.py + black --check {toxinidir}/src {toxinidir}/tests