| # 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 = ['py310'] |
| include = '\.pyi?$' |
| extend-exclude = ''' |
| /( |
| # The following are specific to Black, you probably don't want those. |
| tests/data/ |
| | profiling/ |
| ) |
| ''' |
| # We use the unstable style for formatting Black itself. If you |
| # want bug-free formatting, you should keep this off. If you want |
| # stable formatting across releases, you should also keep `preview = true` |
| # (which is implied by this flag) off. |
| unstable = 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.27.0", "hatch-vcs", "hatch-fancy-pypi-readme"] |
| build-backend = "hatchling.build" |
| |
| [project] |
| name = "black" |
| description = "The uncompromising code formatter." |
| license = "MIT" |
| license-files = ["LICENSE"] |
| requires-python = ">=3.10" |
| 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", |
| "Operating System :: OS Independent", |
| "Programming Language :: Python", |
| "Programming Language :: Python :: 3 :: Only", |
| "Programming Language :: Python :: 3.10", |
| "Programming Language :: Python :: 3.11", |
| "Programming Language :: Python :: 3.12", |
| "Programming Language :: Python :: 3.13", |
| "Programming Language :: Python :: 3.14", |
| "Topic :: Software Development :: Libraries :: Python Modules", |
| "Topic :: Software Development :: Quality Assurance", |
| ] |
| dependencies = [ |
| "click>=8.0.0", |
| "mypy_extensions>=0.4.3", |
| "packaging>=22.0", |
| "pathspec>=0.9.0", |
| "platformdirs>=2", |
| "pytokens>=0.3.0", |
| "tomli>=1.1.0; python_version < '3.11'", |
| "typing_extensions>=4.0.1; python_version < '3.11'", |
| ] |
| dynamic = ["readme", "version"] |
| |
| [project.optional-dependencies] |
| colorama = ["colorama>=0.4.3"] |
| uvloop = ["uvloop>=0.15.2"] |
| d = ["aiohttp>=3.10"] |
| jupyter = [ |
| "ipython>=7.8.0", |
| "tokenize-rt>=3.2.0", |
| ] |
| |
| [project.scripts] |
| black = "black:patched_main" |
| blackd = "blackd:patched_main [d]" |
| |
| [project.entry-points."validate_pyproject.tool_schema"] |
| black = "black.schema:get_schema" |
| |
| [project.urls] |
| Documentation = "https://black.readthedocs.io/" |
| Changelog = "https://github.com/psf/black/blob/main/CHANGES.md" |
| Repository = "https://github.com/psf/black" |
| Issues = "https://github.com/psf/black/issues" |
| |
| [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"] |
| # Note that we change the behaviour of this flag below |
| macos-max-compat = true |
| |
| [tool.hatch.build.targets.wheel.hooks.mypyc] |
| enable-by-default = false |
| dependencies = [ |
| "hatch-mypyc>=0.16.0", |
| "mypy==1.19.0", |
| "click>=8.1.7", |
| ] |
| 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", |
| ] |
| mypy-args = ["--ignore-missing-imports"] |
| options = { debug_level = "0" } |
| |
| [tool.cibuildwheel] |
| build-verbosity = 1 |
| |
| # So these are the environments we target: |
| # - Python: CPython 3.10+ only |
| # - Architecture (64-bit only): amd64 / x86_64, universal2, and arm64 |
| # - OS: Linux (no musl), Windows, and macOS |
| build = "cp31*" |
| skip = [ |
| "*-manylinux_i686", |
| "*-musllinux_*", |
| "*-win32", |
| "pp*", |
| "cp31?t-*", # mypyc doesn't have great support for free threaded builds |
| ] |
| |
| # 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>=7"] |
| 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" |
| |
| [tool.cibuildwheel.linux] |
| manylinux-x86_64-image = "manylinux_2_28" |
| 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" |
| |
| [tool.isort] |
| atomic = true |
| profile = "black" |
| line_length = 88 |
| skip_gitignore = true |
| skip_glob = ["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"] |
| [tool.coverage.report] |
| omit = [ |
| "src/blib2to3/*", |
| "tests/data/*", |
| "*/site-packages/*", |
| ".tox/*" |
| ] |
| [tool.coverage.run] |
| relative_files = true |
| branch = true |
| |
| [tool.mypy] |
| # Specify the target platform details in config, so your developers are |
| # free to run mypy on Windows, Linux, or macOS and get consistent |
| # results. |
| python_version = "3.10" |
| mypy_path = "src" |
| strict = true |
| strict_bytes = true |
| local_partial_types = true |
| # Unreachable blocks have been an issue when compiling mypyc, let's try to avoid 'em in the first place. |
| warn_unreachable = true |
| implicit_reexport = true |
| show_error_codes = true |
| show_column_numbers = true |
| |
| [[tool.mypy.overrides]] |
| module = ["pathspec.*", "IPython.*", "colorama.*", "tokenize_rt.*", "uvloop.*"] |
| ignore_missing_imports = true |
| |
| # CI only checks src/, but in case users are running LSP or similar we explicitly ignore |
| # errors in test data files. |
| [[tool.mypy.overrides]] |
| module = ["tests.data.*"] |
| ignore_errors = true |