{"record":{"id":"02edf901a4230cda","repo":"dbt-labs/dbt-core","slug":"wheel-filename-not-in-pep-491-form-filename","errorCode":null,"errorMessage":"wheel filename not in PEP 491 form: {filename}","messagePattern":"wheel filename not in PEP 491 form: (.+?)","errorType":"validation","errorClass":"anyhow","httpStatus":null,"severity":"error","filePath":"crates/dbt-ci/src/publish.rs","lineNumber":361,"sourceCode":"    dist: &Path,\n    kind: DistKind,\n) -> Result<()> {\n    let filename = dist\n        .file_name()\n        .and_then(|s| s.to_str())\n        .ok_or_else(|| anyhow!(\"non-UTF8 distribution filename: {}\", dist.display()))?\n        .to_string();\n\n    let metadata = Distribution::new(dist)\n        .with_context(|| format!(\"read metadata from {}\", dist.display()))?\n        .metadata()\n        .clone();\n\n    // Wheels carry name/version/pyversion in the filename; the sdist's from PKG-INFO.\n    let (parsed, filetype) = match kind {\n        DistKind::Wheel => {\n            let parsed = parse_wheel_filename(&filename)\n                .ok_or_else(|| anyhow!(\"wheel filename not in PEP 491 form: {filename}\"))?;\n            (parsed, \"bdist_wheel\")\n        }\n        DistKind::Sdist => (\n            ParsedWheel {\n                name: metadata.name.clone(),\n                version: metadata.version.clone(),\n                pyversion: \"source\".to_string(),\n            },\n            \"sdist\",\n        ),\n    };\n\n    let bytes: Bytes = fs::read(dist)\n        .with_context(|| format!(\"read {}\", dist.display()))?\n        .into();\n    let md5_digest = format!(\"{:x}\", md5::compute(&bytes));\n    let sha256_digest = sha256_hex(&bytes);\n","sourceCodeStart":343,"sourceCodeEnd":379,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-ci/src/publish.rs#L343-L379","documentation":"upload_dist failed to parse the wheel filename into PEP 491 components (distribution-version-python_tag-abi_tag-platform_tag), so the name/version/filetype fields required for the twine-style upload payload cannot be derived from the filename.","triggerScenarios":"Thrown at crates/dbt-ci/src/publish.rs:361 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild or rename the wheel to the standard '{name}-{version}-{pytag}-{abitag}-{platform}.whl' form","Check for missing/extra dashes or tags in the filename","Upload via sdist instead if the wheel name can't be corrected"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"0267ce9170576975b76b64ce856b2e5848e96617","analyzedAt":"2026-09-07T21:53:39.732Z","contentChangedAt":"2026-09-07T21:53:39.732Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}