This release is a pre-release and may not be stable for production use.
pants-backend-generate
A Pants backend for code generators whose outputs are committed
because something outside Pants reads them from git. Inside Pants a generator is ordinary
codegen, so consumers get fresh outputs in their sandboxes. pants generate writes the
committed copies and pants lint fails when one is stale. Both use the same cached codegen
rule, so the committed bytes are the bytes Pants consumers see.
This release targets Pants 2.32.x. Install it with pants-backend-generate==0.1.0rc0 in
[GLOBAL].plugins in pants.toml, and enable pants_backend_generate in
[GLOBAL].backend_packages.
Status: alpha.
file_generate
Generated files (FileSourceField), kept as written. Language backends ship their own
specializations with a formatter, for example cpp_generate in pants-backend-cmake. Every
*_generate target has these fields:
runnable(required): the generator, a targetpants runcan run in a sandbox (such as apex_binary), withargs.sources: files the generator reads, relative to the BUILD file. Optional.outputs(required): every file the generator writes, as exact, normalised paths relative to the build root.execution_dependencies: targets whose files are present in the sandbox.runnable_dependencies: runnable targets put onPATH.extra_env_vars,timeout,environment.
The generator runs at the build root with its sources and execution_dependencies at their
repo-relative paths, and the parent directory of every output already exists. The outputs are
exact. Each of these is an error:
- a declared file that is not written
- an undeclared file written next to a declared one
- an input in an output directory that the generator overwrites
- an output that is also an input (exclude the committed copy with a
!glob)
Put outputs in a directory: files at the build root are not checked for extras.
The host environment is not inherited, PATH included. A generator that runs host tools needs
extra_env_vars=["PATH"] or the tools as runnable_dependencies.
The committed outputs belong to no target:
- If another target's
sourcesglob matches a committed output, a consumer of both targets gets two copies. Once the copy is stale, that fails with an opaqueMergeDigestserror. Exclude the output from that glob with!. - File-address specs and
--changed-sincedo not reach the generating target, so run the check aspants lint ::.
pants generate
Runs the generators of the given *_generate targets and writes their outputs into the
workspace. It prints one <address>: wrote <files> line per target. Two targets writing the
same file is an error, and then nothing is written.
pants lint
The generate linter reports each committed output that differs from the generated one
(stale) or does not exist (missing), followed by the pants generate command that
refreshes them. --generate-skip turns it off.
Specializing
Codegen dispatches on the class of the target's sources field, so each output type needs its
own target type. GenerateSpecialization makes one. In the sketch below, MySourceField is the
sources field class your consumers ask for:
from pants.engine.rules import collect_rules, rule
from pants.engine.unions import UnionRule
from pants_backend_generate.specialization import GenerateSpecialization
from pants_backend_generate.util_rules.formatting import FormatOutputsRequest, FormattedOutputs
class MyFormatOutputsRequest(FormatOutputsRequest):
pass
@rule
async def format_my_outputs(request: MyFormatOutputsRequest) -> FormattedOutputs:
... # format request.snapshot; return exactly the same files
my_generate = GenerateSpecialization(
"my_generate",
output=MySourceField,
formatter=MyFormatOutputsRequest, # or None
help="Sources written by a generator.",
)
def target_types():
return my_generate.target_types()
def rules():
return [
*collect_rules(),
*my_generate.rules(),
UnionRule(FormatOutputsRequest, MyFormatOutputsRequest),
]
A specialization's rules() carries everything codegen needs, so another backend can register
it without pants_backend_generate in backend_packages. Codegen then works, and a one-time
warning says that pants generate and the linter need the backend enabled.
A formatter runs inside the codegen rule. It receives snapshot and address with
EnvironmentName in scope, and it must return the same set of files. Aliases must be unique.
Several specializations may share an output.
Metadata
Release files for pants-backend-generate 0.1.0rc0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pants_backend_generate-0.1.0rc0.tar.gz | 12.5 kB | Without provenance | Details for pants_backend_generate-0.1.0rc0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pants_backend_generate-0.1.0rc0-py3-none-any.whl | Python 3 | none | any | Details for pants_backend_generate-0.1.0rc0-py3-none-any.whl |
Total release size: 28.0 kB
Release files / pants_backend_generate-0.1.0rc0.tar.gz
| Download URL | pants_backend_generate-0.1.0rc0.tar.gz |
|---|---|
| Size | 12.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
49206647cb42a201a4b6c6312a3d3b704ccb61fcec9215c4eafb86f5e12e32b9
|
|
BLAKE2b-256 checksum How to use checksums |
d0eeaa3e491e56b1cb8d60b29fbd6aed183a8fa78d0eb2acffdf0aca0e66d825
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Release files / pants_backend_generate-0.1.0rc0-py3-none-any.whl
| Download URL | pants_backend_generate-0.1.0rc0-py3-none-any.whl |
|---|---|
| Size | 15.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
42088a8bc838616f93bf5879936fe84ed048f417c78132c32db124d558038299
|
|
BLAKE2b-256 checksum How to use checksums |
d2a99a3caf3b506f4e33659ce8ffdc284661fc8c0b6fbcdb236b8b8bd2264c32
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Security for pants-backend-generate 0.1.0rc0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.