{"record":{"id":"60ef46e1d29e429f","repo":"roboflow/supervision","slug":"expected-one-metadata-file-in-wheel-found-meta","errorCode":null,"errorMessage":"expected one METADATA file in {wheel}, found {metadata_paths}","messagePattern":"expected one METADATA file in (.+?), found (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":".github/scripts/verify_clean_wheel.py","lineNumber":30,"sourceCode":"\n_MANIFEST_CHECKS = {\n    \"import-supervision\",\n    \"no-cv2-module\",\n    \"fallback-backend\",\n    \"bgr-to-gray\",\n    \"draw-rectangle\",\n    \"required-pyav\",\n}\n\n\ndef _wheel_metadata(wheel: Path) -> Message:\n    \"\"\"Read the core metadata embedded in a wheel archive.\"\"\"\n    with zipfile.ZipFile(wheel) as archive:\n        metadata_paths = [\n            name for name in archive.namelist() if name.endswith(\"/METADATA\")\n        ]\n        if len(metadata_paths) != 1:\n            raise ValueError(\n                f\"expected one METADATA file in {wheel}, found {metadata_paths}\"\n            )\n        return message_from_bytes(archive.read(metadata_paths[0]))\n\n\ndef _validate_metadata(wheel: Path) -> None:\n    \"\"\"Reject wheels that retain an OpenCV runtime requirement or extra.\"\"\"\n    metadata = _wheel_metadata(wheel)\n    requirements = metadata.get_all(\"Requires-Dist\", [])\n    extras = metadata.get_all(\"Provides-Extra\", [])\n    if any(\"opencv\" in requirement.lower() for requirement in requirements):\n        raise ValueError(\n            f\"OpenCV runtime requirement remains in {wheel}: {requirements}\"\n        )\n    if any(\"opencv\" in extra.lower() for extra in extras):\n        raise ValueError(f\"OpenCV extra remains in {wheel}: {extras}\")\n\n","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/roboflow/supervision/blob/7f254d9784d4c37e0f03cd89ddee164c8db099c0/.github/scripts/verify_clean_wheel.py#L12-L48","documentation":"Error \"expected one METADATA file in {wheel}, found {metadata_paths}\" thrown in roboflow/supervision.","triggerScenarios":"Thrown at .github/scripts/verify_clean_wheel.py:30 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild the wheel so it contains exactly one METADATA file; the current artifact is malformed.","Inspect the wheel packaging step for duplicate or missing dist-info metadata."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"7f254d9784d4c37e0f03cd89ddee164c8db099c0","analyzedAt":"2026-08-15T05:13:01.950Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}