Only include rules with diagnostics in SARIF metadata (#13268)

This commit is contained in:
Luo Peng 2024-09-10 05:23:53 +08:00 committed by GitHub
parent 62c7d8f6ba
commit 5ef6979d9a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,9 +1,9 @@
use std::collections::HashSet;
use std::io::Write; use std::io::Write;
use anyhow::Result; use anyhow::Result;
use serde::{Serialize, Serializer}; use serde::{Serialize, Serializer};
use serde_json::json; use serde_json::json;
use strum::IntoEnumIterator;
use ruff_source_file::OneIndexed; use ruff_source_file::OneIndexed;
@ -27,6 +27,10 @@ impl Emitter for SarifEmitter {
.map(SarifResult::from_message) .map(SarifResult::from_message)
.collect::<Result<Vec<_>>>()?; .collect::<Result<Vec<_>>>()?;
let unique_rules: HashSet<_> = results.iter().filter_map(|result| result.rule).collect();
let mut rules: Vec<SarifRule> = unique_rules.into_iter().map(SarifRule::from).collect();
rules.sort_by(|a, b| a.code.cmp(&b.code));
let output = json!({ let output = json!({
"$schema": "https://json.schemastore.org/sarif-2.1.0.json", "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
"version": "2.1.0", "version": "2.1.0",
@ -35,7 +39,7 @@ impl Emitter for SarifEmitter {
"driver": { "driver": {
"name": "ruff", "name": "ruff",
"informationUri": "https://github.com/astral-sh/ruff", "informationUri": "https://github.com/astral-sh/ruff",
"rules": Rule::iter().map(SarifRule::from).collect::<Vec<_>>(), "rules": rules,
"version": VERSION.to_string(), "version": VERSION.to_string(),
} }
}, },
@ -216,9 +220,23 @@ mod tests {
let results = sarif["runs"][0]["results"].as_array().unwrap(); let results = sarif["runs"][0]["results"].as_array().unwrap();
assert_eq!(results.len(), 3); assert_eq!(results.len(), 3);
assert_eq!( assert_eq!(
results[0]["message"]["text"].as_str().unwrap(), results
"`os` imported but unused" .iter()
.map(|r| r["message"]["text"].as_str().unwrap())
.collect::<Vec<_>>(),
vec![
"`os` imported but unused",
"Local variable `x` is assigned to but never used",
"Undefined name `a`",
]
);
assert_eq!(rules.len(), 3);
assert_eq!(
rules
.iter()
.map(|r| r["id"].as_str().unwrap())
.collect::<Vec<_>>(),
vec!["F401", "F821", "F841"],
); );
assert!(rules.len() > 3);
} }
} }