Cordon reference emitter for Python — project an argparse parser to a Cordon v4 command-surface contract.
Project description
cordon-emit (Python)
The Python reference emitter for Cordon. Where the bash toolchain declares
a surface in a DSL, a Python CLI already has an argparse parser — so you don't
declare anything twice: this introspects that parser and projects it to the
one Cordon v4 contract. --describe becomes a
machine-readable view of the exact parser that produces --help, so the two
can't drift.
Pure stdlib, zero dependencies. Reference it from a cordon checkout
($CORDON_HOME); don't vendor it — a copy drifts from the schema in the same
repo.
So easy — one line
Add the parser you already build, then one line. That's the whole integration:
import argparse
from cordon_emit import describe_main, set_effect
def build_parser():
p = argparse.ArgumentParser(prog="hq", description="Operate the deploy.")
sub = p.add_subparsers(dest="command")
logs = sub.add_parser("logs", help="Show app container logs")
logs.add_argument("-f", "--follow", action="store_true", help="Stream live output")
set_effect(logs, "read", network=True)
set_effect(sub.add_parser("restart", help="Restart the app"), "deploy", network=True)
return p
def main():
parser = build_parser()
describe_main(parser, group="Integrations", order=130) # ← handles --describe / --pretty, exits
args = parser.parse_args()
...
Now hq --describe emits a valid contract and hq --help reads from the same
parser. The only thing you add by hand is the one fact a parser can't tell you:
each command's blast radius, via set_effect() on the
effect ladder
(read < local_write < vault_write < remote_write < deploy, plus network /
interactive). Unannotated commands default to read, and the emitter warns
on stderr for each one so a forgotten blast radius isn't a silent fail-open. Pass
--effect-required (or effect_required=True) to make an undeclared command a
hard error instead — the strict, multi-tenant posture.
So powerful — zero-touch on any parser
Don't even need to edit the tool. Point the module at any importable factory that
returns an ArgumentParser (module:attribute) and pipe it straight into
cordon's validator:
python -m cordon_emit myapp.cli:build_parser -g Integrations -o 130
python -m cordon_emit myapp.cli:build_parser -g X -o 1 \
| node "$CORDON_HOME/conformance/validate.mjs" - # exit 0 = conformant
That's a contract — and a conformance check — for an existing Python CLI with no code change.
API
| symbol | does |
|---|---|
describe_main(parser, *, group, order, **kw) |
drop-in --describe handler: emit + SystemExit(0) when requested, else return. Honors --effect-required in argv. The one-liner. |
describe_parser(parser, *, group, order, effect=None, paras=None, examples=None) -> dict |
the pure projection — returns the full {ok, schema_version, …} document. |
set_effect(parser, effect, *, network=False, interactive=False) |
annotate a (sub)parser's blast radius; returns it so it nests in add_parser(...). |
undeclared_effects(parser, *, tool_effect_override=None) -> list[str] |
the surfaces whose blast radius defaulted instead of being declared (command names, or the tool itself for a leaf). Empty means every effect was an explicit choice. |
emit(parser, *, pretty=False, effect_required=False, **kw) |
print(json.dumps(describe_parser(...))); compact by default, --pretty indents. Warns on any command whose effect defaulted; effect_required=True makes that a hard error. |
describe_parser returns the canonical, byte-deterministic document (no
timestamps, stable order) — a guard can diff it.
Install
Reference in place (preferred):
import sys; sys.path.insert(0, f"{os.environ['CORDON_HOME']}/emitters/python")
or install it:
pip install "$CORDON_HOME/emitters/python"
Verify
python3 emitters/python/selftest.py # structural + byte-parity with the bash leaf fixture
python3 emitters/python/selftest.py --emit | node ../../conformance/validate.mjs -
The selftest also proves convergence: introspecting an encrypt-shaped parser
yields a contract byte-identical to the bash-DSL-emitted
fixtures/valid/leaf-tool.json — same
schema, two emitters, one output.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cordon_emit-0.1.0.tar.gz.
File metadata
- Download URL: cordon_emit-0.1.0.tar.gz
- Upload date:
- Size: 11.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4620687aeea68140386b060d9022cede096ed8205bb20c970da3848356ff372
|
|
| MD5 |
645731439f1a749e6157434513726560
|
|
| BLAKE2b-256 |
9a6a0257ca4e3f3e85ff3d056a9d156c9d19a11859e6e8faf3dfba30f3c952a1
|
Provenance
The following attestation bundles were made for cordon_emit-0.1.0.tar.gz:
Publisher:
publish.yml on joeseverino/cordon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cordon_emit-0.1.0.tar.gz -
Subject digest:
c4620687aeea68140386b060d9022cede096ed8205bb20c970da3848356ff372 - Sigstore transparency entry: 2087620883
- Sigstore integration time:
-
Permalink:
joeseverino/cordon@8413e83b3a4faae7ba3b7b0682a34028ff52900e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/joeseverino
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8413e83b3a4faae7ba3b7b0682a34028ff52900e -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file cordon_emit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: cordon_emit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a13904937be912f0ba4377dc8a6c21d327bee6fd523939d0d79dbedc37faa71a
|
|
| MD5 |
e00c122c754cfdc381df69ae62615d1f
|
|
| BLAKE2b-256 |
1ceed1524929d6487370b674ce799070f3d006c11bce857d8528b83040ef25d5
|
Provenance
The following attestation bundles were made for cordon_emit-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on joeseverino/cordon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cordon_emit-0.1.0-py3-none-any.whl -
Subject digest:
a13904937be912f0ba4377dc8a6c21d327bee6fd523939d0d79dbedc37faa71a - Sigstore transparency entry: 2087620979
- Sigstore integration time:
-
Permalink:
joeseverino/cordon@8413e83b3a4faae7ba3b7b0682a34028ff52900e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/joeseverino
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8413e83b3a4faae7ba3b7b0682a34028ff52900e -
Trigger Event:
workflow_dispatch
-
Statement type: