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

  • 🐛 fix(pyproject-fmt): produce valid TOML when sorting arrays with value on bracket line by @gaborbernat in #293

  • Update Rust dependencies by @gaborbernat in #287

  • Update Python dependencies by @gaborbernat in #286 <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.1.tar.gz (152.4 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.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl (5.4 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ x86-64

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

Uploaded PyPymacOS 11.0+ ARM64

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

Uploaded PyPymacOS 10.12+ x86-64

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

Uploaded CPython 3.9+Windows x86-64

pyproject_fmt-2.21.1-cp39-abi3-musllinux_1_2_x86_64.whl (5.6 MB view details)

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

pyproject_fmt-2.21.1-cp39-abi3-manylinux_2_31_riscv64.whl (5.1 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.31+ riscv64

pyproject_fmt-2.21.1-cp39-abi3-manylinux_2_28_x86_64.whl (5.4 MB view details)

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

pyproject_fmt-2.21.1-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.1-cp39-abi3-macosx_11_0_arm64.whl (4.8 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

pyproject_fmt-2.21.1-cp39-abi3-macosx_10_12_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: pyproject_fmt-2.21.1.tar.gz
  • Upload date:
  • Size: 152.4 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.1.tar.gz
Algorithm Hash digest
SHA256 28221e42c4eca81a73ceacef519f3bcc0eec390d632f2fd1c14ba71d4f6362b7
MD5 ca673bdb9fb6e47d902e85a477ce16af
BLAKE2b-256 e28ae7bc1bf2cf53a4ce24f10c2514193080f0d8d88876161602d33152dce9cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1.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.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ece81933e20059d4c7b3f1d8345e08f11aa1687ceb494f1835b4a8daf21c25a8
MD5 09303109a765a4c39a256b9b0e6e84b7
BLAKE2b-256 1c6a5a49c7b8556c5426edc25375afae954f6f9d70ba46234cf8f3aa6b43c408

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 29bf5eddd1b3d166487d4a1b660143a2da79e7701b5e483af64cfd4677402d83
MD5 1b791c8568cf2812b595a5aa071b3321
BLAKE2b-256 bb51f0cdbc1799867e17f8c431ce5c0d8bece72665eee3e3bc4fb27fbe7b296e

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e5a3d409d122fc431713d6fd287f118aff748d0fcb08d8fae9ed5aadfac67710
MD5 c99640de6202209f8308ef6e8f5482b7
BLAKE2b-256 dfe16736632e4554406b9da1992db0c50aceecff3ab405e2da999e73eacf783c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d8adf52702ddb8d0f8b92656aa44aea5519516a8340b46921a0af86ded4e285d
MD5 098c1980c258bb3bf76e515bba63059a
BLAKE2b-256 9e256e2567f6d637408ace630762d8f6c558f046f3fb35cad6d480a818b325c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f6a55372be2d44ed2345a03163e9b75d7202cd898f3dff4574ac26d39f211458
MD5 4cef392f3783f6d321eb485bfa1b992c
BLAKE2b-256 0538e20aece5a422c3de5b79d8d35f21dcd3e56f2db3ad2076f6093cb8ce19d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-cp39-abi3-manylinux_2_31_riscv64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-cp39-abi3-manylinux_2_31_riscv64.whl
Algorithm Hash digest
SHA256 d8027fa0b0ba402a37289ea4a8e3651d74c7f932e09dbe97188b1cefde80c3d0
MD5 969b780533f3579e7f4926641ad25e68
BLAKE2b-256 16e9c0f1db7f453be63a2395189bc826e74f4b7dad8409f1c8919a9c3a8033c8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3960d501049bb21656ff2da87341fd1f8ba9e77a1dd0af25444f712a44be7cb7
MD5 a61ab1744e217ee5a6f04f602af2a326
BLAKE2b-256 dd54f8c13b4489dbd2b40b49a5af2736826319c41e911dce3df38b20c9c9e36d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 75ceb6b81df5f4e9185566593b25bce460478af3361f17d4012f8045aa4f11ab
MD5 a0561d81cf57016ed04ef34575e06187
BLAKE2b-256 08fbb636556c22fb277bf1530b147116dcb4ab74bb0cc83c060a7270eaa2ef83

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 537c644804d4bd9940fd6a00d7bf299e5bbe5121aa07e16fb1d4124f9ce83e53
MD5 e6f755f9ff08f81279b2b8b2e386b7de
BLAKE2b-256 434ef493594631dc5e0a72a515cf9d3fd97abf7e3a05a407c32d90a0ad36c54a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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.1-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyproject_fmt-2.21.1-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 208aaef634ed52d12c7c12f974c583c0ac22658d28dd8a93bec7e8e2760e2196
MD5 65f39328cdfa35ceff9e8c323093704e
BLAKE2b-256 c5c9c1c6f0110924a817a186581cbda7d1a88095ee2e7969ae8e1c89240fdb05

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_fmt-2.21.1-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