feat: add --json output flag to auditwheel show#685
Conversation
mayeut
left a comment
There was a problem hiding this comment.
Not reviewed thoroughly yet but left a couple comments inlined in addition to the following more general comment.
Per #676 (comment), as the json output should be an "API", it should be versioned, and, ideally, we might want to have a json schema for this.
|
While this does not cover all functionality requested in #676, it does solve one of them so linking here. |
| ) | ||
| except NonPlatformWheelError as e: | ||
| logger.info("%s", e.message) | ||
| if args.JSON: |
There was a problem hiding this comment.
I'm not sure if handling this special json case is important. Also, the case below where pure wheels are allowed does not emit a json. What's the preference?
There was a problem hiding this comment.
What's the preference?
If adding this, let's try to add it properly.
If pure wheels are allowed then we should not error but output a specific json output for pure wheels, e.g. the schema could have something like:
"oneOf": [
{ "$ref": "#/$defs/result_pure" },
{ "$ref": "#/$defs/result_platform" },
{ "$ref": "#/$defs/error" }
],
adding a "pure" boolean property that's always true for result_pure and always false for result_platform
There was a problem hiding this comment.
Yeah, that's a good idea! Implemented that approach. (I also removed the unnecessary .. import json which already happens earlier in this function.)
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #685 +/- ##
==========================================
+ Coverage 95.73% 95.79% +0.06%
==========================================
Files 23 23
Lines 1923 1952 +29
Branches 362 371 +9
==========================================
+ Hits 1841 1870 +29
Misses 46 46
Partials 36 36 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
@mayeut, please let me know if there's something I can do to help move this work forward (assuming that there is an interest in doing so.) |
|
@lcarva, there's still interest however I'd like to get a couple fixes & the android support so it might take a bit of time before this can be reviewed again. |
Enable scripting by adding a --json flag that outputs structured JSON instead of human-readable text, including wheel tag, compatibility flags, versioned symbols, external libs, and policy upgrade info. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Adds machine-readable output support for auditwheel show via a new --json flag and validates the new output shape with unit tests and a JSON schema.
Changes:
- Adds
--jsonparsing and JSON output paths inmain_show.py. - Adds
show-schema.jsondescribing pure, platform, and error outputs. - Adds unit tests for JSON output variants and updates mypy pre-commit deps for
jsonschematyping.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
src/auditwheel/main_show.py |
Adds JSON output generation and --json CLI flag handling. |
src/auditwheel/show-schema.json |
Defines the structured output schema for auditwheel show --json. |
tests/unit/test_main_show.py |
Adds unit coverage for JSON output, schema validation, and pure/non-platform wheel behavior. |
.pre-commit-config.yaml |
Adds types-jsonschema for mypy support. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| p.add_argument( | ||
| "--json", | ||
| dest="JSON", | ||
| action="store_true", | ||
| default=False, | ||
| help="Output results in JSON format", | ||
| ) |
|
Would love to see this PR get merged :) |
When --json is requested and the specified wheel file does not exist, print a JSON error object (with version, wheel name, and error message) and return exit code 1 instead of invoking parser.error. Update the unit test to capture stdout, assert the return value is 1, and validate the emitted JSON contains the expected fields and message.
Add static type annotations to tests/unit/test_main_show.py: import Callable and annotate fixture and helper signatures (tmp_path: Path, capsys: pytest.CaptureFixture[str], patch_wheel_abi: Callable[..., None], monkeypatch: pytest.MonkeyPatch, etc.), add return types and parameter types for helper functions and the internal _set function. Purely typing refinements with no behavioral changes.
| policies = _FakePolicies() | ||
|
|
||
| external_refs = { | ||
| LINUX.name: SimpleNamespace( | ||
| libs=external_libs or {}, | ||
| blacklist={}, | ||
| ), | ||
| MANYLINUX_2_17.name: SimpleNamespace(libs={}, blacklist={}), | ||
| MANYLINUX_2_28.name: SimpleNamespace( | ||
| libs=policy_upgrades_libs or {}, | ||
| blacklist=policy_upgrades_blacklist or {}, | ||
| ), | ||
| } |
| _SCHEMA_PATH = Path(__file__).resolve().parents[2] / "src" / "auditwheel" / "show-schema.json" | ||
| _SCHEMA = json.loads(_SCHEMA_PATH.read_text()) |
| class _FakePolicies: | ||
| linux = LINUX | ||
| lowest = LINUX | ||
| highest = MANYLINUX_2_28 | ||
|
|
||
| def __iter__(self) -> Iterator[_FakePolicy]: | ||
| return iter(ALL_POLICIES) | ||
|
|
Enable scripting by adding a --json flag that outputs structured JSON instead of human-readable text, including wheel tag, compatibility flags, versioned symbols, external libs, and policy upgrade info.