Deterministic corpus emitter for the independent PyPA packaging oracle
implemented in tools/diff_packaging.py.
Records are tab separated, one per line, and always start with the corpus
source (curated, generated, mutated or pypi):
- <source>\tparse\t<raw>\t<ok|bad>\t<normalized form or ->
- <source>\tspec\t<raw>\t<ok|bad>
- <source>\tcmp\t<left>\t<right>\t<-1|0|1>
- <source>\tcontains\t<mode>\t<spec>\t<version>\t<true|false>
- <source>\tfilter\t<mode>\t<spec>\t<candidates as a|b>\t<accepted as c|d>
- <source>\torder\t<input as a|b>\t<ascending as b|a>
- <source>\treq\t<raw>\t<ok|bad>\t<name>\t<extras as a|b or ->\t<normalized specifier>\t<url or ->\t<marker text or ->
- <source>\tmarker\t<raw>\t<ok|bad>\t<canonical rendering or ->
- <source>\tmarker_env\t<name>\t<key=value;...> (input, not a check)
- <source>\tmarker_eval\t<env name>\t<raw>\t<ok|bad|err>\t<true|false or error kind>
- <source>\ttoml\t<case name>\t<document>\t<ok|bad|lenient|lenient-drift>\t<re-serialization or ->
- <source>\tlicense\t<raw>\t<ok|bad>\t<canonical expression or ->
- <source>\tmeta\t<case name>\t<document>\t<ok|bad>\t<error code or ->\t<canonical re-rendering or ->
- <source>\tmeta_values\t<case name>\t<field>\t<index>\t<value>
- <source>\tmeta_divergence\t<case name>\t<accept|reject> (input, not a check)
- <source>\tindex\t<case name>\t<document>\t<ok|bad>\t<projection or error code>
- <source>\tindex_divergence\t<case name>\t<accept|reject> (input, not a check)
- <source>\tresolve\t<requirement>\t<files as f@rp;...>\t<tags as a|b>\t<python or ->\t<mode>\t<kept as a|b>\t<rejected as f=reason|...>
- <source>\tindex_dir\t<directory>\t<entries as a|b>\t<ok|bad>\t<projection or error code>
- <source>\tpylock\t<case name>\t<document>\t<ok|bad>\t<projection or error code>
- <source>\tpylock_divergence\t<case name>\t<accept|reject> (input, not a check)
- <source>\ttag\t<case name>\t<payload>\t<ok|bad>\t<tag list or error code>
- <source>\ttag_divergence\t<case name>\t<accept|reject> (input, not a check)
- <source>\tupgrade\t<case name>\t<payload>\t<ok|bad>\t<shortlist|rejections>
- <source>\tresolve\t<requirement>\t<tags as a|b>\t<python or ->\t<mode>\t<kept as a|b>\t<rejected as f=reason|...>
mode is auto (the library default policy), any (prereleases forced
on) or none (prereleases forced off); the oracle maps them onto
None, True and False.
The corpus has four sources: a curated list, versions and specifiers
sampled from the PEP 440 grammar, mutated strings that are usually
illegal, and the real-world PyPI fixture in the fixtures package
(fixtures/pypi_corpus.mbt). Nothing here reads the clock, the
environment or the network, and the generator is a wrapping 64-bit LCG
with a constant seed, so the output is byte identical on wasm,
wasm-gc, js and native; tools/target_parity.py checks that claim.