Skip to main content

Format your pyproject.toml file

Project description

Apply a consistent format to your pyproject.toml file with comment support. See changelog here.

Recent Changes

  • ✨ feat(pyproject-fmt): add pixi support by @gaborbernat in #283 <a id=”2.20.0”></a>

Philosophy

This tool aims to be an opinionated formatter, with similar objectives to black. This means it deliberately does not support a wide variety of configuration settings. In return, you get consistency, predictability, and smaller diffs.

Use

Via CLI

pyproject-fmt is a CLI tool that needs a Python interpreter (version 3.10 or higher) to run. We recommend either pipx or uv to install pyproject-fmt into an isolated environment. This has the added benefit that later you will be able to upgrade pyproject-fmt without affecting other parts of the system. We provide a method for pip too here, but we discourage that path if you can:

# install uv per https://docs.astral.sh/uv/#getting-started
uv tool install pyproject-fmt
pyproject-fmt --help

Via pre-commit hook

See pre-commit/pre-commit for instructions, sample .pre-commit-config.yaml:

- repo: https://github.com/tox-dev/pyproject-fmt
  # Use the sha / tag you want to point at
  # or use `pre-commit autoupdate` to get the latest version
  rev: ""
  hooks:
    - id: pyproject-fmt

Via Python

You can use pyproject-fmt as a Python module to format TOML content programmatically.

from pyproject_fmt import run

# Format a pyproject.toml file and return the exit code
exit_code = run(["path/to/pyproject.toml"])

The run function accepts command-line arguments as a list and returns an exit code (0 for success, non-zero for failure).

The tool.pyproject-fmt table is used when present in the pyproject.toml file:

[tool.pyproject-fmt]

# After how many columns split arrays/dicts into multiple lines and wrap long strings;
# use a trailing comma in arrays to force multiline format instead of lowering this value
column_width = 120

# Number of spaces for indentation
indent = 2

# Keep full version numbers (e.g., 1.0.0 instead of 1.0) in dependency specifiers
keep_full_version = false

# Automatically generate Python version classifiers based on requires-python
# Set to false to disable automatic classifier generation
generate_python_version_classifiers = true

# Maximum Python version for generating version classifiers
max_supported_python = "3.14"

# Table format: "short" collapses sub-tables to dotted keys, "long" expands to [table.subtable] headers
table_format = "short"

# List of tables to force expand regardless of table_format setting
expand_tables = []

# List of tables to force collapse regardless of table_format or expand_tables settings
collapse_tables = []

# List of key patterns to skip string wrapping (supports wildcards like *.parse or tool.bumpversion.*)
skip_wrap_for_keys = []

If not set they will default to values from the CLI.

Shared configuration file

You can place formatting settings in a standalone pyproject-fmt.toml file instead of (or in addition to) the [tool.pyproject-fmt] table. This is useful for monorepos or when you want to share the same configuration across multiple projects without duplicating it in each pyproject.toml.

The formatter searches for pyproject-fmt.toml starting from the directory of the file being formatted and walking up to the filesystem root. The first match wins. You can also pass an explicit path via --config:

pyproject-fmt --config /path/to/pyproject-fmt.toml pyproject.toml

The shared config file uses the same keys as the [tool.pyproject-fmt] table, but without the table header:

column_width = 120
indent = 2
table_format = "short"
max_supported_python = "3.14"

When both a shared config file and a [tool.pyproject-fmt] table exist, per-file settings from the [tool.pyproject-fmt] table take precedence over the shared config file.

Python version classifiers

This tool will automatically generate the Programming Language :: Python :: 3.X classifiers for you. To do so it needs to know the range of Python interpreter versions you support:

  • The lower bound can be set via the requires-python key in the pyproject.toml configuration file (defaults to the oldest non end of line CPython at the time of the release).

  • The upper bound, by default, will assume the latest stable release of CPython at the time of the release, but can be changed via CLI flag or the config file.

Table formatting

You can control how sub-tables are formatted in your pyproject.toml file. There are two formatting styles:

Short format (collapsed) - The default behavior where sub-tables are collapsed into dotted keys. Use this for a compact representation:

[project]
name = "myproject"
urls.homepage = "https://example.com"
urls.repository = "https://github.com/example/myproject"
scripts.mycli = "mypackage:main"

Long format (expanded) - Sub-tables are expanded into separate [table.subtable] sections. Use this for readability when tables have many keys or complex values:

[project]
name = "myproject"

[project.urls]
homepage = "https://example.com"
repository = "https://github.com/example/myproject"

[project.scripts]
mycli = "mypackage:main"

Configuration priority

The formatting behavior is determined by a priority system that allows you to set a global default while overriding specific tables:

  1. collapse_tables - Highest priority, forces specific tables to be collapsed regardless of other settings

  2. expand_tables - Medium priority, forces specific tables to be expanded

  3. table_format - Lowest priority, sets the default behavior for all tables not explicitly configured

This three-tier approach lets you fine-tune formatting for specific tables while maintaining a consistent default. For example:

[tool.pyproject-fmt]
table_format = "short"  # Collapse most tables
expand_tables = ["project.entry-points"]  # But expand entry-points

Specificity rules

Table selectors follow CSS-like specificity rules: more specific selectors win over less specific ones. When determining whether to collapse or expand a table, the formatter checks from most specific to least specific until it finds a match.

For example, with this configuration:

[tool.pyproject-fmt]
table_format = "long"  # Expand all tables by default
collapse_tables = ["project"]  # Collapse project sub-tables
expand_tables = ["project.optional-dependencies"]  # But expand this specific one

The behavior will be:

  • project.urls → collapsed (matches project in collapse_tables)

  • project.scripts → collapsed (matches project in collapse_tables)

  • project.optional-dependencies → expanded (matches exactly in expand_tables, more specific than project)

  • tool.ruff.lint → expanded (no match in collapse/expand, uses table_format default)

This allows you to set broad rules for parent tables while making exceptions for specific sub-tables. The specificity check walks up the table hierarchy: for project.optional-dependencies, it first checks if project.optional-dependencies is in collapse_tables or expand_tables, then checks project, then falls back to the table_format default.

Supported tables

The following sub-tables can be formatted with this configuration:

Project tables:

  • project.urls - Project URLs (homepage, repository, documentation, changelog)

  • project.scripts - Console script entry points

  • project.gui-scripts - GUI script entry points

  • project.entry-points - Custom entry point groups

  • project.optional-dependencies - Optional dependency groups

Tool tables:

  • tool.ruff.format - Ruff formatter settings

  • tool.ruff.lint - Ruff linter settings

  • Any other tool sub-tables

Array of tables:

  • project.authors - Can be inline tables or [[project.authors]]

  • project.maintainers - Can be inline tables or [[project.maintainers]]

  • Any [[table]] entries throughout the file

Array of tables ([[table]]) are automatically collapsed to inline arrays when each inline table fits within the configured column_width. For example:

# Before
[[tool.commitizen.customize.questions]]
type = "list"

[[tool.commitizen.customize.questions]]
type = "input"

# After (with table_format = "short")
[tool.commitizen]
customize.questions = [{ type = "list" }, { type = "input" }]

If any inline table exceeds column_width, the array of tables remains in [[...]] format to maintain readability and TOML 1.0.0 compatibility (inline tables cannot span multiple lines).

String wrapping

By default, the formatter wraps long strings that exceed the column width using line continuations. However, some strings such as regex patterns should not be wrapped because wrapping can break their functionality.

You can configure which keys should skip string wrapping using the skip_wrap_for_keys option:

[tool.pyproject-fmt]
skip_wrap_for_keys = ["*.parse", "*.regex", "tool.bumpversion.*"]

Pattern matching

The skip_wrap_for_keys option supports glob-like patterns:

  • Exact match: tool.bumpversion.parse matches only that specific key

  • Wildcard suffix: *.parse matches any key ending with .parse (e.g., tool.bumpversion.parse, project.parse)

  • Wildcard prefix: tool.bumpversion.* matches any key under tool.bumpversion (e.g., tool.bumpversion.parse, tool.bumpversion.serialize)

  • Global wildcard: * skips wrapping for all strings

Examples: ["*.parse", "*.regex"] to preserve regex fields, ["tool.bumpversion.*"] for a specific tool section, or ["*"] to skip all string wrapping.

pyproject-fmt is an opinionated formatter, much like black is for Python code. The tool intentionally provides minimal configuration options because the goal is to establish a single standard format that all pyproject.toml files follow.

Benefits of this approach:

  • Less time configuring tools

  • Smaller diffs when committing changes

  • Easier code reviews since formatting is never a question

While a few key options exist (column_width, indent, table_format), the tool does not expose dozens of toggles. You get what the maintainers have chosen to be the right balance of readability, consistency, and usability. The column_width setting controls when arrays are split into multiple lines and when string values are wrapped using line continuations.

General Formatting

These rules apply uniformly across the entire pyproject.toml file.

Table Ordering

Tables are reordered into a consistent structure:

  1. [build-system]

  2. [project]

  3. [dependency-groups]

  4. [tool.*] sections in the order:

    1. Build backends: poetry, poetry-dynamic-versioning, pdm, setuptools, distutils, setuptools_scm, hatch, flit, scikit-build, meson-python, maturin, pixi, whey, py-build-cmake, sphinx-theme-builder, uv

    2. Builders: cibuildwheel, nuitka

    3. Linters/formatters: autopep8, black, ruff, isort, flake8, pycln, nbqa, pylint, repo-review, codespell, docformatter, pydoclint, tomlsort, check-manifest, check-sdist, check-wheel-contents, deptry, pyproject-fmt, typos, bandit

    4. Type checkers: mypy, pyrefly, pyright, ty, django-stubs

    5. Testing: pytest, pytest_env, pytest-enabler, coverage

    6. Task runners: doit, spin, tox

    7. Release tools: bumpversion, jupyter-releaser, tbump, towncrier, vendoring

    8. Any other tool.* in alphabetical order

  5. Any other tables (alphabetically)

String Quotes

All strings use double quotes by default. Single quotes are only used when the value contains double quotes:

# Before
name = 'my-package'
description = "He said \"hello\""

# After
name = "my-package"
description = 'He said "hello"'

Key Quotes

TOML keys are normalized to the simplest valid form. Keys that are valid bare keys (containing only A-Za-z0-9_-) have redundant quotes stripped. Single-quoted (literal) keys that require quoting are converted to double-quoted (basic) strings with proper escaping. This applies to all keys: table headers, key-value pairs, and inline table keys:

# Before
[tool."ruff"]
"line-length" = 120
lint.per-file-ignores.'tests/*' = ["S101"]

# After
[tool.ruff]
line-length = 120
lint.per-file-ignores."tests/*" = ["S101"]

Backslashes and double quotes within literal keys are escaped during conversion:

# Before
lint.per-file-ignores.'path\to\file' = ["E501"]

# After
lint.per-file-ignores."path\\to\\file" = ["E501"]

Array Formatting

Arrays are formatted based on line length, trailing comma presence, and comments:

# Short arrays stay on one line
keywords = ["python", "toml"]

# Long arrays that exceed column_width are expanded and get a trailing comma
dependencies = [
    "requests>=2.28",
    "click>=8.0",
]

# Trailing commas signal intent to keep multiline format
classifiers = [
    "Development Status :: 4 - Beta",
]

# Arrays with comments are always multiline
lint.ignore = [
    "E501",  # Line too long
    "E701",
]

Multiline formatting rules:

An array becomes multiline when any of these conditions are met:

  1. Trailing comma present - A trailing comma signals intent to keep multiline format

  2. Exceeds column width - Arrays longer than column_width are expanded (and get a trailing comma added)

  3. Contains comments - Arrays with inline or leading comments are always multiline

String Wrapping

Strings that exceed column_width (including the key name and " = " prefix) are wrapped into multi-line triple-quoted strings using line continuations:

# Before (exceeds column_width)
description = "A very long description that goes beyond the configured column width limit"

# After
description = """\
  A very long description that goes beyond the \
  configured column width limit\
  """

Wrapping prefers breaking at spaces and at " :: " separators (common in Python classifiers). Strings inside inline tables are never wrapped. Strings that contain actual newlines are preserved as multi-line strings without adding line continuations. Use skip_wrap_for_keys to prevent wrapping for specific keys.

Table Formatting

Sub-tables can be formatted in two styles controlled by table_format:

Short format (collapsed to dotted keys):

[project]
urls.homepage = "https://example.com"
urls.repository = "https://github.com/example/project"

Long format (expanded to table headers):

[project.urls]
homepage = "https://example.com"
repository = "https://github.com/example/project"

Comment Preservation

All comments are preserved during formatting:

  • Inline comments - Comments after a value on the same line stay with that value

  • Leading comments - Comments on the line before an entry stay with the entry below

  • Block comments - Multi-line comment blocks are preserved

Inline comment alignment:

Inline comments within arrays are aligned independently per array, based on that array’s longest value:

# Before - comments at inconsistent positions
lint.ignore = [
  "COM812", # Conflict with formatter
  "CPY", # No copyright statements
  "ISC001",   # Another rule
]

# After - comments align to longest value in this array
lint.ignore = [
  "COM812",  # Conflict with formatter
  "CPY",     # No copyright statements
  "ISC001",  # Another rule
]

Table-Specific Handling

Beyond general formatting, each table has specific key ordering and value normalization rules.

[build-system]

Key ordering: build-backendrequiresbackend-path

Value normalization:

  • requires: Dependencies normalized per PEP 508 and sorted alphabetically by package name

  • backend-path: Entries sorted alphabetically

# Before
[build-system]
requires = ["setuptools >= 45", "wheel"]
build-backend = "setuptools.build_meta"

# After
[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools>=45", "wheel"]

[project]

Key ordering:

Keys are reordered in this sequence: nameversionimport-namesimport-namespacesdescriptionreadmekeywordslicenselicense-filesmaintainersauthorsrequires-pythonclassifiersdynamicdependenciesoptional-dependenciesurlsscriptsgui-scriptsentry-points

Field normalizations:

name

Converted to canonical format (lowercase with hyphens): My_Packagemy-package

description

Whitespace normalized: multiple spaces collapsed, consistent spacing after periods.

license

License expression operators (and, or, with) uppercased: MIT or Apache-2.0MIT OR Apache-2.0

requires-python

Whitespace removed: >= 3.9>=3.9

keywords

Deduplicated (case-insensitive) and sorted alphabetically.

dynamic

Sorted alphabetically.

import-names / import-namespaces

Semicolon spacing normalized (foo;barfoo; bar), entries sorted alphabetically.

classifiers

Deduplicated and sorted alphabetically.

authors / maintainers

Sorted by name, then email. Keys within each entry ordered: nameemail.

Dependency normalization:

All dependency arrays (dependencies, optional-dependencies.*) are:

  • Normalized per PEP 508: spaces removed, redundant .0 suffixes stripped (unless keep_full_version = true)

  • Sorted alphabetically by canonical package name

# Before
dependencies = ["requests >= 2.0.0", "click~=8.0"]

# After
dependencies = ["click>=8", "requests>=2"]

Optional dependencies extra names:

Extra names are normalized to lowercase with hyphens:

# Before
[project.optional-dependencies]
Dev_Tools = ["pytest"]

# After
[project.optional-dependencies]
dev-tools = ["pytest"]

Python version classifiers:

Classifiers for Python versions are automatically generated based on requires-python and max_supported_python. Disable with generate_python_version_classifiers = false.

# With requires-python = ">=3.10" and max_supported_python = "3.14"
classifiers = [
    "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",
]

Entry points:

Inline tables within entry-points are expanded to dotted keys:

# Before
entry-points.console_scripts = { mycli = "mypackage:main" }

# After
entry-points.console_scripts.mycli = "mypackage:main"

Authors/maintainers formatting:

Contact information can be formatted as inline tables or expanded array of tables:

# Short format (inline)
authors = [{ name = "Alice", email = "alice@example.com" }]

# Long format (array of tables)
[[project.authors]]
name = "Alice"
email = "alice@example.com"

Controlled by table_format, expand_tables, and collapse_tables.

[dependency-groups]

Key ordering: devtesttypedocs → others alphabetically

Value normalization:

  • All dependencies normalized per PEP 508

  • Sorted: regular dependencies first, then include-group entries

# Before
[dependency-groups]
dev = [{ include-group = "test" }, "ruff>=0.4", "mypy>=1"]

# After
[dependency-groups]
dev = ["mypy>=1", "ruff>=0.4", { include-group = "test" }]

[tool.ruff]

Key ordering:

Keys are reordered in a logical sequence:

  1. Global settings: required-versionextendtarget-versionline-lengthindent-widthtab-size

  2. Path settings: builtinsnamespace-packagessrcincludeextend-includeexcludeextend-excludeforce-excluderespect-gitignore

  3. Behavior flags: previewfixunsafe-fixesfix-onlyshow-fixesshow-source

  4. Output settings: output-formatcache-dir

  5. format.* keys

  6. lint.* keys: selectextend-selectignoreextend-ignoreper-file-ignoresfixableunfixable → plugin configurations

Sorted arrays:

Arrays are sorted alphabetically using natural ordering (RUF1 < RUF9 < RUF10):

# These arrays are sorted:
lint.select = ["E", "F", "I", "RUF"]
lint.ignore = ["E501", "E701"]

# Per-file-ignores values are also sorted:
lint.per-file-ignores."tests/*.py" = ["D103", "S101"]

Sorted array keys:

Top-level:

exclude, extend-exclude, include, extend-include, builtins, namespace-packages, src

Format:

format.exclude

Lint:

select, extend-select, ignore, extend-ignore, fixable, extend-fixable, unfixable, extend-safe-fixes, extend-unsafe-fixes, external, task-tags, exclude, typing-modules, allowed-confusables, logger-objects

Per-file patterns:

lint.per-file-ignores.*, lint.extend-per-file-ignores.*

Plugin arrays:

lint.flake8-bandit.hardcoded-tmp-directory, lint.flake8-bandit.hardcoded-tmp-directory-extend, lint.flake8-boolean-trap.extend-allowed-calls, lint.flake8-bugbear.extend-immutable-calls, lint.flake8-builtins.builtins-ignorelist, lint.flake8-gettext.extend-function-names, lint.flake8-gettext.function-names, lint.flake8-import-conventions.banned-from, lint.flake8-pytest-style.raises-extend-require-match-for, lint.flake8-pytest-style.raises-require-match-for, lint.flake8-self.extend-ignore-names, lint.flake8-self.ignore-names, lint.flake8-tidy-imports.banned-module-level-imports, lint.flake8-type-checking.exempt-modules, lint.flake8-type-checking.runtime-evaluated-base-classes, lint.flake8-type-checking.runtime-evaluated-decorators, lint.isort.constants, lint.isort.default-section, lint.isort.extra-standard-library, lint.isort.forced-separate, lint.isort.no-lines-before, lint.isort.required-imports, lint.isort.single-line-exclusions, lint.isort.variables, lint.pep8-naming.classmethod-decorators, lint.pep8-naming.extend-ignore-names, lint.pep8-naming.ignore-names, lint.pep8-naming.staticmethod-decorators, lint.pydocstyle.ignore-decorators, lint.pydocstyle.property-decorators, lint.pyflakes.extend-generics, lint.pylint.allow-dunder-method-names, lint.pylint.allow-magic-value-types

[tool.pixi]

Key ordering:

Keys are grouped by functionality:

  1. Workspace metadata: workspace.nameworkspace.versionworkspace.descriptionworkspace.authorsworkspace.licenseworkspace.license-fileworkspace.readmeworkspace.homepageworkspace.repositoryworkspace.documentation

  2. Workspace configuration: workspace.channelsworkspace.platformsworkspace.channel-priorityworkspace.solve-strategyworkspace.conda-pypi-mapworkspace.requires-pixiworkspace.exclude-newerworkspace.previewworkspace.build-variantsworkspace.build-variants-files

  3. Dependencies: dependencieshost-dependenciesbuild-dependenciesrun-dependenciesconstraintspypi-dependenciespypi-options

  4. Development: dev

  5. Environment setup: system-requirementsactivationtasks

  6. Targeting: targetfeatureenvironments

  7. Package build: package

Sorted arrays:

workspace.channels, workspace.platforms, workspace.preview, workspace.build-variants-files

[tool.uv]

Key ordering:

Keys are grouped by functionality:

  1. Version & Python: required-versionpython-preferencepython-downloads

  2. Dependencies: dev-dependenciesdefault-groupsdependency-groupsconstraint-dependenciesoverride-dependenciesexclude-dependenciesdependency-metadata

  3. Sources & indexes: sourcesindexindex-urlextra-index-urlfind-linksno-indexindex-strategykeyring-provider

  4. Package handling: no-binary*no-build*no-sources*reinstall*upgrade*

  5. Resolution: resolutionprereleasefork-strategyenvironmentsrequired-environmentsexclude-newer*

  6. Build & Install: compile-bytecodelink-modeconfig-settings*extra-build-*concurrent-buildsconcurrent-downloadsconcurrent-installs

  7. Network & Security: allow-insecure-hostnative-tlsofflineno-cachecache-dirhttp-proxyhttps-proxyno-proxy

  8. Publishing: publish-urlcheck-urltrusted-publishing

  9. Python management: python-install-mirrorpypy-install-mirrorpython-downloads-json-url

  10. Workspace & Project: managedpackageworkspaceconflictscache-keysbuild-backend

  11. Other: pippreviewtorch-backend

Sorted arrays:

Package name arrays (sorted alphabetically):

constraint-dependencies, override-dependencies, dev-dependencies, exclude-dependencies, no-binary-package, no-build-package, no-build-isolation-package, no-sources-package, reinstall-package, upgrade-package

Other arrays:

environments, required-environments, allow-insecure-host, no-proxy, workspace.members, workspace.exclude

Sources table:

The sources table entries are sorted alphabetically by package name:

# Before
[tool.uv.sources]
zebra = { git = "..." }
alpha = { path = "..." }

# After
[tool.uv.sources]
alpha = { path = "..." }
zebra = { git = "..." }

pip subsection:

The [tool.uv.pip] subsection follows similar formatting rules, with arrays like extra, no-binary-package, no-build-package, reinstall-package, and upgrade-package sorted alphabetically.

[tool.coverage]

Key ordering:

Keys are reordered to follow coverage.py’s workflow phases:

  1. Run phase (run.*): Data collection settings

    • Source selection: sourcesource_pkgssource_dirs

    • File filtering: includeomit

    • Measurement: branchcover_pylibtimid

    • Execution context: command_lineconcurrencycontextdynamic_context

    • Data management: data_fileparallelrelative_files

    • Extensions: plugins

    • Debugging: debugdebug_filedisable_warnings

    • Other: corepatchsigterm

  2. Paths (paths.*): Path mapping between source locations

  3. Report phase (report.*): General reporting

    • Thresholds: fail_underprecision

    • File filtering: includeomitinclude_namespace_packages

    • Line exclusion: exclude_linesexclude_also

    • Partial branches: partial_branchespartial_also

    • Output control: skip_coveredskip_emptyshow_missing

    • Formatting: formatsort

    • Error handling: ignore_errors

  4. Output formats (after report):

    • html.*: directorytitleextra_cssshow_contextsskip_coveredskip_empty

    • json.*: outputpretty_printshow_contexts

    • lcov.*: outputline_checksums

    • xml.*: outputpackage_depth

Grouping principle:

Related options are grouped together:

  • File selection: include/omit are adjacent

  • Exclusion patterns: exclude_lines/exclude_also are adjacent

  • Partial branches: partial_branches/partial_also are adjacent

  • Skip options: skip_covered/skip_empty are adjacent

Sorted arrays:

Run phase:

source, source_pkgs, source_dirs, include, omit, concurrency, plugins, debug, disable_warnings

Report phase:

include, omit, exclude_lines, exclude_also, partial_branches, partial_also

# Before (alphabetical)
[tool.coverage]
report.exclude_also = ["if TYPE_CHECKING:"]
report.omit = ["tests/*"]
run.branch = true
run.omit = ["tests/*"]

# After (workflow order with groupings)
[tool.coverage]
run.branch = true
run.omit = ["tests/*"]
report.omit = ["tests/*"]
report.exclude_also = ["if TYPE_CHECKING:"]

Other Tables

Any unrecognized tables are preserved and reordered according to standard table ordering rules. Keys within unknown tables are not reordered or normalized.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyproject_fmt-2.21.0.tar.gz (151.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pyproject_fmt-2.21.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl (5.3 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ x86-64

pyproject_fmt-2.21.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl (4.8 MB view details)

Uploaded PyPymacOS 11.0+ ARM64

pyproject_fmt-2.21.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl (5.0 MB view details)

Uploaded PyPymacOS 10.12+ x86-64

pyproject_fmt-2.21.0-cp39-abi3-win_amd64.whl (5.3 MB view details)

Uploaded CPython 3.9+Windows x86-64

pyproject_fmt-2.21.0-cp39-abi3-musllinux_1_2_x86_64.whl (5.5 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_31_riscv64.whl (5.0 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.31+ riscv64

pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_28_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_28_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

pyproject_fmt-2.21.0-cp39-abi3-macosx_11_0_arm64.whl (4.8 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

pyproject_fmt-2.21.0-cp39-abi3-macosx_10_12_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file pyproject_fmt-2.21.0.tar.gz.

File metadata

  • Download URL: pyproject_fmt-2.21.0.tar.gz
  • Upload date:
  • Size: 151.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyproject_fmt-2.21.0.tar.gz
Algorithm Hash digest
SHA256 c3f88e6781377cba1ee6400095b5c05fb997238487ed498a7f9f3b479a6ee825
MD5 2a9651aceeb94f1b2bce968b7b16a77e
BLAKE2b-256 c81517f11dd11a3bb62736501878e1fbbbf6b1c3f3cf715e9acf0c0d4c704435

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0.tar.gz:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 da875824123d7fec20ed36143877d9e44c5ba271880735aff1bd2be3cb00fbda
MD5 3525ccd686de7dafec2292b6cfe105fa
BLAKE2b-256 e77603a4f829c280cd3efc305b57b7eca86dedefd6503a7016ab7a8dddd8c714

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e165c8f3e2a3e1e74e166cf425ab372ffab35a741fdea312b760884313f71a3
MD5 850d6ef98f268cc2916bca6d4f9231e9
BLAKE2b-256 b6c9918f4e715454809648e0c0508c3742ea5d76c880f36d05cf032c9dd57ccd

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 879f0f55703a75bd0888f7b0076835c075df6f60c72f53e08efd72f255222ec2
MD5 49d5068b85fcfb10c85126810c8143e0
BLAKE2b-256 76bbaf1c49e05ca1d04a0f6b6ce62d1b58eba487d18c7b1152cc2235b9619b9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5d5707a4a2f6fb3e54127fd0d78c5f5bc97d02844ea9e8f12142b825cff59340
MD5 a9232d5f1f8d36ffc632dde58342330a
BLAKE2b-256 8747b600844147d198cd71783550685751ed8b3a735e86bb60b0920f36e6dd6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-cp39-abi3-win_amd64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2a4470d8efaa5318dc36653a1666c23b4da7aabe90c31572d6ec45ecdb06e0f4
MD5 12ea99145d035b6696056f61ac8b0f35
BLAKE2b-256 0c974355bf7630e0c230f17fd82798d15567e197395a0940f1ecbef448ca5207

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-cp39-abi3-musllinux_1_2_x86_64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_31_riscv64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_31_riscv64.whl
Algorithm Hash digest
SHA256 52e34180e8ec76d2cdb970e5489bfd3be1a8f427eb0e1d65ae825cfe5ccde4c9
MD5 22e045cb87ffc5b788ee3fd37b788195
BLAKE2b-256 9b76762dec2cb85a4a396d9805b8c7307ce796e7ab28b8fb3bb8225e5e3f61a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_31_riscv64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 96af80bd8e47b63a6ab04812fd1d6b77d4f6c6581baacdb79c942bb504955171
MD5 e87b960ddce30203b24bd7de6753d92e
BLAKE2b-256 cbc8ecc0c7be699229aed627bded1cc5b80921a37acbc3535df7082e21d47392

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_28_x86_64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 db63e62f9448d2011866741a37c2941e643c8ba5c08b9f77eb5a27001ec7e4f5
MD5 7a4c9e30b646d86b3510d4f02acd15db
BLAKE2b-256 038c5a3c299afa6cd500fec98a64013ca8eb9d2e9e81b8196bd60d0454d45a08

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-cp39-abi3-manylinux_2_28_aarch64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 873545beaac80f1c264025499bcab3afaa7c41e244c7d6d0a8a9338dd0f94a72
MD5 92ace9931f0601d6c7d3f06724564772
BLAKE2b-256 8816f32e12f0ea8835336afae82080e05e407b7c1459d9b2138ed2ffa0eb0e85

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyproject_fmt-2.21.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0b254ca1c3e8fdbca40d8e4c2e39739f1320f536e4fecad0f89efceb414395b8
MD5 41857e20eba5cadc301ea7f6d31ebe85
BLAKE2b-256 94ef947bd1f90434cd3e8cb6f259d5c661b3b69f5163f962b4b66a56cfc57cd2

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.0-cp39-abi3-macosx_10_12_x86_64.whl:

Publisher: pyproject_fmt_build.yaml on tox-dev/toml-fmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page