{"record":{"id":"9d2054ec777e2cfd","repo":"PaddlePaddle/PaddleOCR","slug":"destination-is-required","errorCode":null,"errorMessage":"destination is required.","messagePattern":"destination is required\\.","errorType":"exception","errorClass":"InvalidRequestError","httpStatus":null,"severity":"warning","filePath":"paddleocr/_api_client/_resources.py","lineNumber":38,"sourceCode":"\nimport requests\n\nfrom .errors import InvalidRequestError, NetworkError, RequestTimeoutError\nfrom .results import DocParsingResult, OCRResult\n\n\ndef save_resource(\n    resource_url: str,\n    destination: str,\n    *,\n    overwrite: bool = False,\n    filename: Optional[str] = None,\n    timeout: float = 300.0,\n) -> str:\n    if not resource_url:\n        raise InvalidRequestError(\"resource_url is required.\")\n    if not destination:\n        raise InvalidRequestError(\"destination is required.\")\n\n    parsed_url = urlparse(resource_url)\n    if parsed_url.scheme not in (\"http\", \"https\") or not parsed_url.netloc:\n        raise InvalidRequestError(f\"Invalid resource URL: {resource_url}\")\n\n    target = _resolve_destination(parsed_url.path, destination, filename)\n    _require_writable_target(target, overwrite)\n\n    try:\n        response = requests.get(resource_url, timeout=timeout)\n    except requests.Timeout as e:\n        raise RequestTimeoutError(f\"Request timed out: {e}\") from e\n    except requests.ConnectionError as e:\n        raise NetworkError(f\"Connection failed: {e}\") from e\n\n    try:\n        response.raise_for_status()\n    except requests.RequestException as e:","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/PaddlePaddle/PaddleOCR/blob/2661c7c0ef5c613e8f93c6e93b2e052399f0f854/paddleocr/_api_client/_resources.py#L20-L56","documentation":"InvalidRequestError raised by save_resource when destination is empty/None. Pure client-side guard executed before URL validation, path resolution, and download — no filesystem or network access has happened yet.","triggerScenarios":"Calling save_resource(url, '') or save_resource(url, None); passing an unconfigured destination variable (e.g. from os.environ.get('OUT_DIR') that returned None because the env var is unset).","commonSituations":"Destination read from a config/env var that is missing in the current environment; CLI flag with a default of None that the user forgot to supply; refactor dropping the destination argument.","solutions":["Set the destination: pass an explicit directory or file path","If it comes from config/env, fail fast at startup with a clear message when it is unset rather than deep in the download call","Add a default destination (e.g. Path.cwd()) if an empty destination should be legal in your app"],"exampleFix":"# before\nsave_resource(url, os.environ.get('OUT_DIR'))  # OUT_DIR unset -> None\n\n# after\nout_dir = os.environ['OUT_DIR']  # fails early with clear KeyError\nsave_resource(url, out_dir)","handlingStrategy":"validation","validationCode":"destination = destination or str(Path.cwd())\nassert destination, 'destination must be configured'","typeGuard":null,"tryCatchPattern":"try:\n    save_resource(url, destination)\nexcept InvalidRequestError as e:\n    raise RuntimeError(f'output destination misconfigured: {e}') from e","preventionTips":["Validate output paths once at startup, not per download","Fail fast on unset config env vars with explicit messages"],"tags":["validation","arguments","filesystem"],"backgroundTag":null,"analyzedSha":"2661c7c0ef5c613e8f93c6e93b2e052399f0f854","analyzedAt":"2026-08-14T20:17:30.180Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}