change: Implement 3: Complete the native-process CLI, JSON request handling, status vocabulary and exit codes
Repository Validate / repository-checks (pull_request) Successful in 3s
Repository Validate / repository-checks (pull_request) Successful in 3s
Review fix for issue #5: aligned the public CLI's size/resize semantics with the active product obligations instead of the previous exact-match behaviour. - `tools/example.py`: the requested width/height are now a target (minimum) size, never an exact-match filter: any image at least that large is selected regardless of `--resize`, and smaller images still produce `no_size`. `--resize` no longer widens selection; it now performs real downscaling of downloaded images to a shrink-to-fit box (aspect ratio preserved, never upscaled), implemented with a dependency-free stdlib PNG codec plus ICO container support (PNG-compressed ICO entries), and each item records `from`/`to`/`applied` dimensions. Undecodable payloads raise the new typed `ImageResizeError` and are reported as failed downloads, so the status vocabulary and exit codes stay unchanged (`ok`/`dry_run` 0, `invalid_request` 2, `no_format` 3, `no_size` 4, `access_error` 5, `partial_download` 6). Help text and the `no_size` error details were updated to describe the minimum-size contract. - `tools/errors.py`: added `ImageResizeError` (code `resize_failed`) to the typed hierarchy and `__all__`. - `tests/test_cli.py`: replaced the old "exact size unless --resize" test with minimum-size tests (larger image accepted without `--resize`, exact size accepted, `--resize` without `--download` keeps the reported source size) and added offline fixtures/tests for real downscaling: PNG stored at 100x50 for a 100x100 box, original bytes preserved without `--resize`, no upscaling (`already_fits`), PNG-in-ICO downscaling, and `resize_failed` surfacing as `access_error`. - `examples/input.json` remains the canonical offline `dry_run` request, so the smoke command stays green and network-free. No protected facade/control paths were touched and no dependency declarations changed. Tests: Ran the facade commands on the final revision through the prepared environment (`.venv` on PATH): `python -m compileall tools tests` → exit 0 (tools.validate); `pytest` → 83 passed (tools.test); `python -m tools.example examples/input.json` → exit 0 with one JSON document, status `dry_run` (tools.smoke); `python -m tools.example --help` → exit 0 (help-command acceptance). `tools/envelope.py` is unchanged and still exports the fixed status/exit-code table checked by tests. Target branch `task/1-task` is already an ancestor of the work branch head, so no integration was needed. Progress: Addressed the changes-requested review on PR #13: requested width/height are now a minimum target size (selection no longer depends on --resize), and --resize now actually downscales downloaded images (stdlib PNG codec + ICO/PNG container support, shrink-to-fit, never upscaling) with per-item resize metadata and typed ImageResizeError for undecodable payloads. Updated tests/test_cli.py with minimum-size and offline resize/download contract tests (83 passed). Facade validate/test/smoke/help all green; examples/input.json stays the canonical dry_run request. Published by developer-agent through Tool Backend. Closes #5
This commit was merged in pull request #13.
This commit is contained in:
@@ -252,8 +252,20 @@ class UnsupportedFormatError(RequestError):
|
||||
)
|
||||
|
||||
|
||||
class ImageResizeError(ToolkitError):
|
||||
"""Raised when a downloaded image cannot be downscaled to the target size."""
|
||||
|
||||
code = "resize_failed"
|
||||
|
||||
def __init__(self, reason: str, *, details: Mapping[str, Any] | None = None) -> None:
|
||||
merged: dict[str, Any] = dict(details or {})
|
||||
merged["reason"] = reason
|
||||
super().__init__(f"cannot resize image: {reason}", details=merged)
|
||||
|
||||
|
||||
__all__ += [
|
||||
"ACCEPTED_FORMATS",
|
||||
"ImageResizeError",
|
||||
"RequestDocumentError",
|
||||
"RequestError",
|
||||
"RequestFieldError",
|
||||
|
||||
Reference in New Issue
Block a user