Skip to main content

PEP 621 metadata parsing

Project description

pyproject-metadata

pre-commit.ci status checks tests codecov Documentation Status PyPI version

Dataclass for PEP 621 metadata with support for core metadata generation

This project does not implement the parsing of pyproject.toml containing PEP 621 metadata.

Instead, given a Python data structure representing PEP 621 metadata (already parsed), it will validate this input and generate a PEP 643-compliant metadata file (e.g. PKG-INFO).

Usage

After installing pyproject-metadata, you can use it as a library in your scripts and programs:

from pyproject_metadata import StandardMetadata

parsed_pyproject = {...}  # you can use parsers like `tomli` to obtain this dict
metadata = StandardMetadata.from_pyproject(parsed_pyproject, allow_extra_keys=False)
print(metadata.entrypoints)  # same fields as defined in PEP 621

pkg_info = metadata.as_rfc822()
print(str(pkg_info))  # core metadata

SPDX licenses (METADATA 2.4+)

If project.license is a string or project.license-files is present, then METADATA 2.4+ will be used. A user is expected to validate and normalize metadata.license with an SPDX validation tool, such as the one being added to packaging. Add something like this:

if isinstance(metadata.license, str):
    metadata.license = packaging.licenses.normalize_license_expression(metadata.license)

A backend is also expected to copy entries from project.licence_files, which are paths relative to the project directory, into the dist-info/licenses folder, preserving the original source structure.

Modifying metadata

By default, StandardMetadata metadata fields are immutable unless a field is listed in dynaimc (not to be confused with dynamic_metadata). If you want to modify fields that are not dynamic, you can use the dataclasses.replace / copy.replace (Python 3.13+) function.

Dynamic Metadata (METADATA 2.2+)

Pyproject-metadata supports dynamic metadata. To use it, specify your METADATA fields in dynamic_metadata. If you want to convert pyproject.toml field names to METADATA field(s), use pyproject_metadata.pyproject_to_metadata("field-name"), which will return a frozenset of metadata names that are touched by that field.

Adding extra fields

You can add extra fields to the Message returned by to_rfc822(), as long as they are valid metadata entries.

Collecting multiple errors

You can use the all_errors argument to from_pyproject to show all errors in the metadata parse at once, instead of raising an exception on the first one. The exception type will be pyproject_metadata.errors.ExceptionGroup (which is just ExceptionGroup on Python 3.11+).

Validating extra fields

By default, a warning (pyproject_metadata.errors.ExtraKeyWarning) will be issued for extra fields at the project table. You can pass allow_extra_keys= to either avoid the check (True) or hard error (False). If you want to detect extra keys, you can get them with pyproject_metadata.extra_top_level and pyproject_metadata.extra_build_sytem.

Validating classifiers

If you want to validate classifiers, then install the trove_classifiers library (the canonical source for classifiers), and run:

import trove_classifiers

metadata_classifieres = {
    c for c in metadata.classifiers if not c.startswith("Private ::")
}
invalid_classifiers = set(metadata.classifiers) - trove_classifiers.classifiers

# Also the deprecated dict if you want it
dep_names = set(metadata.classifiers) & set(trove_classifiers.deprecated_classifiers)
deprecated_classifiers = {
    k: trove_classifiers.deprecated_classifiers[k] for k in dep_names
}

If you are writing a build backend, you should not validate classifiers with a Private :: prefix; these are only restricted for upload to PyPI (such as Private :: Do Not Upload).

Since classifiers are a moving target, it is probably best for build backends (which may be shipped by third party distributors like Debian or Fedora) to either ignore or have optional classifier validation.

Project details


Download files

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

Source Distribution

pyproject_metadata-0.9.0b7.tar.gz (31.0 kB view details)

Uploaded Source

Built Distribution

pyproject_metadata-0.9.0b7-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

Details for the file pyproject_metadata-0.9.0b7.tar.gz.

File metadata

  • Download URL: pyproject_metadata-0.9.0b7.tar.gz
  • Upload date:
  • Size: 31.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for pyproject_metadata-0.9.0b7.tar.gz
Algorithm Hash digest
SHA256 977ec6f54fff3b9ac38c1bdf6c9aaca822cea76916ca2b95669df024f83af1c3
MD5 cff98d3aad60565c4ad53181b2861923
BLAKE2b-256 99c16c72be791f82befa2abfc0bde5fbd5a9a4ea6bbb8d774d8031f8fb36f6cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_metadata-0.9.0b7.tar.gz:

Publisher: GitHub
  • Repository: pypa/pyproject-metadata
  • Workflow: release.yml
Attestations:
  • Statement type: https://in-toto.io/Statement/v1
    • Predicate type: https://docs.pypi.org/attestations/publish/v1
    • Subject name: pyproject_metadata-0.9.0b7.tar.gz
    • Subject digest: 977ec6f54fff3b9ac38c1bdf6c9aaca822cea76916ca2b95669df024f83af1c3
    • Transparency log index: 137011709
    • Transparency log integration time:

File details

Details for the file pyproject_metadata-0.9.0b7-py3-none-any.whl.

File metadata

File hashes

Hashes for pyproject_metadata-0.9.0b7-py3-none-any.whl
Algorithm Hash digest
SHA256 a54f1a445a93c30f0d73b2f0edd61790f974354edca288fd69d091aa33408512
MD5 1cb9165206ac65e805df7363cf41d3a7
BLAKE2b-256 0ae038bbeac26ed6e405b33ddd95708ec784de093bcce9c8fcf287ca33c12c31

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyproject_metadata-0.9.0b7-py3-none-any.whl:

Publisher: GitHub
  • Repository: pypa/pyproject-metadata
  • Workflow: release.yml
Attestations:
  • Statement type: https://in-toto.io/Statement/v1
    • Predicate type: https://docs.pypi.org/attestations/publish/v1
    • Subject name: pyproject_metadata-0.9.0b7-py3-none-any.whl
    • Subject digest: a54f1a445a93c30f0d73b2f0edd61790f974354edca288fd69d091aa33408512
    • Transparency log index: 137011710
    • Transparency log integration time:

Supported by

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