Skip to main content

A Python build backend designed to wrap Python package generators into a PEP 517 compatible source tree

Project description

py-generator-build-backend

A Python build backend designed to wrap Python package generators (such as openapi-python-client) into a PEP 517 compatible source tree.

Demo

Create a new directory with a pyproject.toml:

[project]
name = "tictactoe-client"
dynamic = [
    "version",
    "dependencies",
]

[build-system]
requires = [
    "py-generator-build-backend",
]
build-backend = "py_generator_build_backend"

[tools.py-generator-build-backend]
generator = "openapi-python-client generate --url https://raw.githubusercontent.com/OAI/learn.openapis.org/refs/heads/main/examples/v3.1/tictactoe.json --output-path $GENERATOR_OUT_PATH"

The tools.py-generator-build-backend.generator is the key to making this work: this command must produce a valid PEP 517 source tree in the (not-yet-existent) directory specified by the $GENERATOR_OUT_PATH environment variable. You can interpolate other environment variables in generator if you need to.

Note: you are responsible for making sure the command you want to run is available on the PATH.

Now try to build the package: python -m build .. This should fail to build, with instructions about the build requirements you need to add to your build-system.requires. Add them and confirm that you are now able to build the package.

Congratulations, you've got a Python package! See Packaging Python Projects for possible next steps.

Notes

For performance reasons, the output of the generator is cached in platformdirs.user_cache_dir. We compute the cache entry by hashing together the contents of the entire project directory, along with all environment variables. This does a pretty good job of capturing all the "inputs" that go into generating the package, but it's not perfect: the generator could be non-deterministic, or packages could be updated in the PATH. If you care about things like this, consider adopting a hermetic build tool such as nix.

(Ideally we'd have access to a scratch space that only lives as long as the build frontend is invoking this build backend, but as far as I can tell, there's no standardized mechanism for that.)

Development

Releasing

  • Edit version in pyproject.toml, and commit.
  • uv build
  • git tag v...
  • uv publish
  • git push --tags

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

py_generator_build_backend-1.1.0.tar.gz (8.0 kB view details)

Uploaded Source

Built Distribution

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

py_generator_build_backend-1.1.0-py3-none-any.whl (5.4 kB view details)

Uploaded Python 3

File details

Details for the file py_generator_build_backend-1.1.0.tar.gz.

File metadata

File hashes

Hashes for py_generator_build_backend-1.1.0.tar.gz
Algorithm Hash digest
SHA256 2bdc1bb3aa633f92a27d39e7bfe8abc029975d1a937bac8284daa1ee11bcde6c
MD5 18d8687e6ca924466db412566619df6f
BLAKE2b-256 602ef317679652206b7fecf464d89b4f0f3c7f7546cb6793dc4fb2b83d32a44b

See more details on using hashes here.

File details

Details for the file py_generator_build_backend-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for py_generator_build_backend-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b9da2cd867271837ba22b4e3fe719743b4f8e0ba832f75427079bdfdba8ebe1a
MD5 f157c9f4969f568077ad388996d4f8b7
BLAKE2b-256 ac45ecf0bb133d2d9edca9feefe0f3bcd647c88608fe97a6c134e33dcbe79672

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