Skip to main content

PEP 621 metadata parsing

Project description

pyproject-metadata

pre-commit.ci status checks tests codecov Documentation Status

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.

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.

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.0b4.tar.gz (22.0 kB view details)

Uploaded Source

Built Distribution

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

pyproject_metadata-0.9.0b4-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pyproject_metadata-0.9.0b4.tar.gz
  • Upload date:
  • Size: 22.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for pyproject_metadata-0.9.0b4.tar.gz
Algorithm Hash digest
SHA256 0e234300424f5968b627ff6435d1f4a1b083bc0e23ce8e060b81d26f7bbd0a80
MD5 431a6bc737f53f85bbca27d9e2927385
BLAKE2b-256 80eea9b222a76f5424d5186243472acbdb044f721bc346f6db1c6dda1bf7a559

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyproject_metadata-0.9.0b4-py3-none-any.whl
Algorithm Hash digest
SHA256 ce9de86bfac05cfb1df48fe36682afa7c741b4b7acb8881919a5cfea4cee9cdd
MD5 899ed9f8921cb3c977e78871f341d37b
BLAKE2b-256 31543e34da61db31748397ee0e0dae415d49b7a90ca4a738cc9bfb7219cf2f13

See more details on using hashes here.

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