From 8089c1c59be6ed678010a1302d4c0ff1d1c5ef1a Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 29 May 2022 13:54:54 +0800 Subject: [PATCH 1/7] =?UTF-8?q?chore:=20=F0=9F=A4=96=20support=20report=20?= =?UTF-8?q?as=20a=20json=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rome_js_formatter/tests/prettier_tests.rs | 120 +++++++++++++++++- 1 file changed, 116 insertions(+), 4 deletions(-) diff --git a/crates/rome_js_formatter/tests/prettier_tests.rs b/crates/rome_js_formatter/tests/prettier_tests.rs index 297aaa8621d..fb1889b92c2 100644 --- a/crates/rome_js_formatter/tests/prettier_tests.rs +++ b/crates/rome_js_formatter/tests/prettier_tests.rs @@ -9,6 +9,7 @@ use std::{ ops::Range, os::raw::c_int, path::Path, + str::FromStr, sync::Once, }; @@ -17,6 +18,7 @@ use rome_formatter::IndentStyle; use rome_js_formatter::options::JsFormatOptions; use rome_js_parser::parse; use rome_js_syntax::SourceType; +use serde::Serialize; use crate::check_reformat::CheckReformatParams; @@ -270,6 +272,35 @@ enum MatchCategory { Match, } +#[derive(Debug, PartialEq, Eq)] +enum ReportType { + Json, + Markdown, +} + +#[derive(Debug, PartialEq, Serialize, Default)] +struct PeerFileJsonReport { + filename: String, + prettier_similarity: f64, +} +#[derive(Debug, PartialEq, Serialize, Default)] +struct ReportJson { + file_based_average_prettier_similarity: f64, + line_based_average_prettier_similarity: f64, + files: Vec, +} +impl FromStr for ReportType { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "json" => Ok(Self::Json), + "markdown" => Ok(Self::Markdown), + _ => Err("Only `json` and `markdown` are supported".to_string()), + } + } +} + struct DiffReportItem { file_name: &'static str, rome_formatted_result: String, @@ -341,18 +372,35 @@ impl DiffReport { if let Some(report) = rome_rowan::check_live() { panic!("\n{report}") } - // Only create the report file if the REPORT_PRETTIER // environment variable is set to 1 match env::var("REPORT_PRETTIER") { Ok(value) if value == "1" => { - self.report_prettier(); + let report_type = match env::var("REPORT_TYPE") { + Ok(value) => ReportType::from_str(&value).unwrap(), + _ => ReportType::Markdown, + }; + let report_filename = match env::var("REPORT_FILENAME") { + Ok(value) => value, + _ => match report_type { + ReportType::Json => "report.json".to_string(), + ReportType::Markdown => "report.md".to_string(), + }, + }; + self.report_prettier(report_type, report_filename); } _ => {} } } - fn report_prettier(&self) { + fn report_prettier(&self, report_type: ReportType, report_filename: String) { + match report_type { + ReportType::Json => self.report_json(report_filename), + ReportType::Markdown => self.report_markdown(report_filename), + } + } + + fn report_markdown(&self, report_filename: String) { let mut report = String::new(); let mut state = self.state.lock(); state.sort_by_key(|DiffReportItem { file_name, .. }| *file_name); @@ -416,6 +464,70 @@ impl DiffReport { (sum_of_per_compatibility_file / file_count as f64) * 100_f64, (total_matched_line as f64 / total_line as f64) * 100_f64 ) + &report; - write("report.md", report).unwrap(); + write(report_filename, report).unwrap(); + } + + fn report_json(&self, report_filename: String) { + let mut state = self.state.lock(); + state.sort_by_key(|DiffReportItem { file_name, .. }| *file_name); + + let mut report_json = ReportJson::default(); + + let mut sum_of_per_compatibility_file = 0_f64; + let mut total_line = 0; + let mut total_matched_line = 0; + let mut file_count = 0; + for DiffReportItem { + file_name, + rome_formatted_result, + prettier_formatted_result, + match_category, + } in state.iter() + { + file_count += 1; + let rome_lines = rome_formatted_result.lines().count(); + let prettier_lines = prettier_formatted_result.lines().count(); + let mut matched_lines = 0; + let compatibility_per_file; + if *match_category == MatchCategory::Diff { + for (tag, line) in diff_lines( + Algorithm::default(), + prettier_formatted_result, + rome_formatted_result, + ) { + if matches!(tag, ChangeTag::Equal) { + matched_lines += line.lines().count(); + } + } + + compatibility_per_file = + matched_lines as f64 / rome_lines.max(prettier_lines) as f64; + sum_of_per_compatibility_file += compatibility_per_file; + } else { + // in this branch `rome_lines` == `prettier_lines` == `matched_lines` + assert!(rome_lines == prettier_lines); + matched_lines = rome_lines; + compatibility_per_file = 1_f64; + sum_of_per_compatibility_file += compatibility_per_file; + } + + total_line += rome_lines.max(prettier_lines); + total_matched_line += matched_lines; + report_json.files.push(PeerFileJsonReport { + filename: file_name.to_string(), + prettier_similarity: compatibility_per_file, + }); + } + // extra two space force markdown render insert a new line + let line_based = sum_of_per_compatibility_file / file_count as f64; + let file_based = total_matched_line as f64 / total_line as f64; + report_json.line_based_average_prettier_similarity = line_based; + report_json.file_based_average_prettier_similarity = file_based; + + let json_content = serde_json::to_string(&report_json).unwrap(); + // report = format!( + // "**File Based Average Prettier Similarity**: {:.2}% \n**Line Based Average Prettier Similarity**: {:.2}% \n the definition of similarity you could found here: https://github.com/rome/tools/issues/2555#issuecomment-1124787893 \n", + // ) + &report; + write(report_filename, json_content).unwrap(); } } From ef938a0e66d718715612560e0df5a724d002e54e Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Wed, 1 Jun 2022 01:07:06 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=F0=9F=90=9B=20address=20CR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_formatter/tests/prettier_tests.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/crates/rome_js_formatter/tests/prettier_tests.rs b/crates/rome_js_formatter/tests/prettier_tests.rs index fb1889b92c2..e739ba41b17 100644 --- a/crates/rome_js_formatter/tests/prettier_tests.rs +++ b/crates/rome_js_formatter/tests/prettier_tests.rs @@ -504,7 +504,6 @@ impl DiffReport { matched_lines as f64 / rome_lines.max(prettier_lines) as f64; sum_of_per_compatibility_file += compatibility_per_file; } else { - // in this branch `rome_lines` == `prettier_lines` == `matched_lines` assert!(rome_lines == prettier_lines); matched_lines = rome_lines; compatibility_per_file = 1_f64; @@ -518,16 +517,12 @@ impl DiffReport { prettier_similarity: compatibility_per_file, }); } - // extra two space force markdown render insert a new line let line_based = sum_of_per_compatibility_file / file_count as f64; let file_based = total_matched_line as f64 / total_line as f64; report_json.line_based_average_prettier_similarity = line_based; report_json.file_based_average_prettier_similarity = file_based; let json_content = serde_json::to_string(&report_json).unwrap(); - // report = format!( - // "**File Based Average Prettier Similarity**: {:.2}% \n**Line Based Average Prettier Similarity**: {:.2}% \n the definition of similarity you could found here: https://github.com/rome/tools/issues/2555#issuecomment-1124787893 \n", - // ) + &report; write(report_filename, json_content).unwrap(); } } From c99411f9cfed9ff6c132eb71fe40b1c523ee29a2 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Thu, 2 Jun 2022 23:49:00 +0800 Subject: [PATCH 3/7] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7b893fc1cb3..d845590ba55 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,4 @@ npm/cli-* # https://github.com/nnethercote/dhat-rs output file dhat-heap.json -crates/rome_js_formatter/report.md +crates/rome_js_formatter/report.* \ No newline at end of file From 3fcf7b07491faf622c8c07f5c9ba67d9687d73a4 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 19 Jun 2022 22:26:10 +0800 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20=F0=9F=90=9B=20refactor=20common=20d?= =?UTF-8?q?ata=20structure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rome_js_formatter/tests/prettier_tests.rs | 190 ++++++++++-------- 1 file changed, 105 insertions(+), 85 deletions(-) diff --git a/crates/rome_js_formatter/tests/prettier_tests.rs b/crates/rome_js_formatter/tests/prettier_tests.rs index e739ba41b17..a50ce60c20d 100644 --- a/crates/rome_js_formatter/tests/prettier_tests.rs +++ b/crates/rome_js_formatter/tests/prettier_tests.rs @@ -281,8 +281,23 @@ enum ReportType { #[derive(Debug, PartialEq, Serialize, Default)] struct PeerFileJsonReport { filename: String, - prettier_similarity: f64, + single_file_compatibility: f64, } + +#[derive(Debug, Clone, Default)] +struct SingleFileMetricData { + filename: String, + single_file_compatibility: f64, + diff: String, +} + +#[derive(Clone, Debug, Default)] +struct PrettierCompatibilityMetricData { + file_based_average_prettier_similarity: f64, + line_based_average_prettier_similarity: f64, + files: Vec, +} + #[derive(Debug, PartialEq, Serialize, Default)] struct ReportJson { file_based_average_prettier_similarity: f64, @@ -394,16 +409,9 @@ impl DiffReport { } fn report_prettier(&self, report_type: ReportType, report_filename: String) { - match report_type { - ReportType::Json => self.report_json(report_filename), - ReportType::Markdown => self.report_markdown(report_filename), - } - } - - fn report_markdown(&self, report_filename: String) { - let mut report = String::new(); let mut state = self.state.lock(); state.sort_by_key(|DiffReportItem { file_name, .. }| *file_name); + let mut report_metric_data = PrettierCompatibilityMetricData::default(); let mut sum_of_per_compatibility_file = 0_f64; let mut total_line = 0; let mut total_matched_line = 0; @@ -415,14 +423,15 @@ impl DiffReport { match_category, } in state.iter() { + let mut single_file_metric_data = SingleFileMetricData::default(); file_count += 1; let rome_lines = rome_formatted_result.lines().count(); let prettier_lines = prettier_formatted_result.lines().count(); let mut matched_lines = 0; - let compatibility_per_file; + let mut per_file_compatibility = 1f64; + let mut diff = String::new(); if *match_category == MatchCategory::Diff { - writeln!(report, "# {}", file_name).unwrap(); - writeln!(report, "```diff").unwrap(); + writeln!(diff, "```diff").unwrap(); for (tag, line) in diff_lines( Algorithm::default(), @@ -433,94 +442,105 @@ impl DiffReport { matched_lines += line.lines().count(); } let line = line.strip_suffix('\n').unwrap_or(line); - writeln!(report, "{}{}", tag, line).unwrap(); + writeln!(diff, "{}{}", tag, line).unwrap(); } - compatibility_per_file = + per_file_compatibility = matched_lines as f64 / rome_lines.max(prettier_lines) as f64; - sum_of_per_compatibility_file += compatibility_per_file; - writeln!(report, "```").unwrap(); - writeln!(report, "----").unwrap(); - writeln!( - report, - "**Prettier Similarity**: {:.2}%", - compatibility_per_file * 100_f64 - ) - .unwrap(); - writeln!(report).unwrap(); - writeln!(report, "----").unwrap(); + sum_of_per_compatibility_file += per_file_compatibility; + writeln!(diff, "```").unwrap(); } else { // in this branch `rome_lines` == `prettier_lines` == `matched_lines` assert!(rome_lines == prettier_lines); matched_lines = rome_lines; - sum_of_per_compatibility_file += 1_f64; + sum_of_per_compatibility_file += per_file_compatibility; } total_line += rome_lines.max(prettier_lines); total_matched_line += matched_lines; + single_file_metric_data.diff = diff; + single_file_metric_data.filename = file_name.to_string(); + single_file_metric_data.single_file_compatibility = per_file_compatibility; + report_metric_data.files.push(single_file_metric_data); + } + report_metric_data.file_based_average_prettier_similarity = + sum_of_per_compatibility_file / file_count as f64; + report_metric_data.line_based_average_prettier_similarity = + total_matched_line as f64 / total_line as f64; + match report_type { + ReportType::Json => self.report_json(report_filename, report_metric_data), + ReportType::Markdown => self.report_markdown(report_filename, report_metric_data), } - // extra two space force markdown render insert a new line - report = format!( - "**File Based Average Prettier Similarity**: {:.2}% \n**Line Based Average Prettier Similarity**: {:.2}% \n the definition of similarity you could found here: https://github.com/rome/tools/issues/2555#issuecomment-1124787893 \n", - (sum_of_per_compatibility_file / file_count as f64) * 100_f64, - (total_matched_line as f64 / total_line as f64) * 100_f64 - ) + &report; - write(report_filename, report).unwrap(); } - fn report_json(&self, report_filename: String) { - let mut state = self.state.lock(); - state.sort_by_key(|DiffReportItem { file_name, .. }| *file_name); - - let mut report_json = ReportJson::default(); - - let mut sum_of_per_compatibility_file = 0_f64; - let mut total_line = 0; - let mut total_matched_line = 0; - let mut file_count = 0; - for DiffReportItem { - file_name, - rome_formatted_result, - prettier_formatted_result, - match_category, - } in state.iter() + fn report_markdown( + &self, + report_filename: String, + report_metric_data: PrettierCompatibilityMetricData, + ) { + let mut report = String::new(); + for SingleFileMetricData { + filename, + single_file_compatibility, + diff, + } in report_metric_data.files.iter() { - file_count += 1; - let rome_lines = rome_formatted_result.lines().count(); - let prettier_lines = prettier_formatted_result.lines().count(); - let mut matched_lines = 0; - let compatibility_per_file; - if *match_category == MatchCategory::Diff { - for (tag, line) in diff_lines( - Algorithm::default(), - prettier_formatted_result, - rome_formatted_result, - ) { - if matches!(tag, ChangeTag::Equal) { - matched_lines += line.lines().count(); - } - } - - compatibility_per_file = - matched_lines as f64 / rome_lines.max(prettier_lines) as f64; - sum_of_per_compatibility_file += compatibility_per_file; - } else { - assert!(rome_lines == prettier_lines); - matched_lines = rome_lines; - compatibility_per_file = 1_f64; - sum_of_per_compatibility_file += compatibility_per_file; - } - - total_line += rome_lines.max(prettier_lines); - total_matched_line += matched_lines; - report_json.files.push(PeerFileJsonReport { - filename: file_name.to_string(), - prettier_similarity: compatibility_per_file, - }); + writeln!(report, "# {}", filename).unwrap(); + write!(report, "{}", diff).unwrap(); + writeln!( + report, + "**Prettier Similarity**: {:.2}%", + single_file_compatibility * 100_f64 + ) + .unwrap(); } - let line_based = sum_of_per_compatibility_file / file_count as f64; - let file_based = total_matched_line as f64 / total_line as f64; - report_json.line_based_average_prettier_similarity = line_based; - report_json.file_based_average_prettier_similarity = file_based; + // extra two space force markdown render insert a new line + writeln!( + report, + "**File Based Average Prettier Similarity**: {:.2}% ", + report_metric_data.file_based_average_prettier_similarity * 100_f64, + ) + .unwrap(); + writeln!( + report, + "**Line Based Average Prettier Similarity**: {:.2}% ", + report_metric_data.line_based_average_prettier_similarity * 100_f64 + ) + .unwrap(); + writeln!( + report, + " the definition of similarity you could found here: https://github.com/rome/tools/issues/2555#issuecomment-1124787893", + ).unwrap(); + // write report content to target file_name + write(report_filename, report).unwrap(); + } + + fn report_json( + &self, + report_filename: String, + report_metric_data: PrettierCompatibilityMetricData, + ) { + let report_json = ReportJson { + file_based_average_prettier_similarity: report_metric_data + .file_based_average_prettier_similarity, + line_based_average_prettier_similarity: report_metric_data + .line_based_average_prettier_similarity, + files: report_metric_data + .files + .into_iter() + .map( + |SingleFileMetricData { + filename, + single_file_compatibility, + diff: _, + }| { + PeerFileJsonReport { + filename, + single_file_compatibility, + } + }, + ) + .collect::>(), + }; let json_content = serde_json::to_string(&report_json).unwrap(); write(report_filename, json_content).unwrap(); From bff85f68bb3d628b46af5bf16214d65ac246bba3 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 19 Jun 2022 22:27:16 +0800 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20rename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_formatter/tests/prettier_tests.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/rome_js_formatter/tests/prettier_tests.rs b/crates/rome_js_formatter/tests/prettier_tests.rs index a50ce60c20d..52134691a63 100644 --- a/crates/rome_js_formatter/tests/prettier_tests.rs +++ b/crates/rome_js_formatter/tests/prettier_tests.rs @@ -279,7 +279,7 @@ enum ReportType { } #[derive(Debug, PartialEq, Serialize, Default)] -struct PeerFileJsonReport { +struct SingleFileJsonReport { filename: String, single_file_compatibility: f64, } @@ -302,7 +302,7 @@ struct PrettierCompatibilityMetricData { struct ReportJson { file_based_average_prettier_similarity: f64, line_based_average_prettier_similarity: f64, - files: Vec, + files: Vec, } impl FromStr for ReportType { type Err = String; @@ -533,7 +533,7 @@ impl DiffReport { single_file_compatibility, diff: _, }| { - PeerFileJsonReport { + SingleFileJsonReport { filename, single_file_compatibility, } From 8e413c5448e57b7fc703a442b1ba253708cdbeb6 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 19 Jun 2022 22:29:12 +0800 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20rename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_formatter/tests/prettier_tests.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crates/rome_js_formatter/tests/prettier_tests.rs b/crates/rome_js_formatter/tests/prettier_tests.rs index 52134691a63..e3f673de960 100644 --- a/crates/rome_js_formatter/tests/prettier_tests.rs +++ b/crates/rome_js_formatter/tests/prettier_tests.rs @@ -412,7 +412,7 @@ impl DiffReport { let mut state = self.state.lock(); state.sort_by_key(|DiffReportItem { file_name, .. }| *file_name); let mut report_metric_data = PrettierCompatibilityMetricData::default(); - let mut sum_of_per_compatibility_file = 0_f64; + let mut sum_of_single_compatibility_file = 0_f64; let mut total_line = 0; let mut total_matched_line = 0; let mut file_count = 0; @@ -428,7 +428,7 @@ impl DiffReport { let rome_lines = rome_formatted_result.lines().count(); let prettier_lines = prettier_formatted_result.lines().count(); let mut matched_lines = 0; - let mut per_file_compatibility = 1f64; + let mut single_file_compatibility = 1f64; let mut diff = String::new(); if *match_category == MatchCategory::Diff { writeln!(diff, "```diff").unwrap(); @@ -445,25 +445,25 @@ impl DiffReport { writeln!(diff, "{}{}", tag, line).unwrap(); } - per_file_compatibility = + single_file_compatibility = matched_lines as f64 / rome_lines.max(prettier_lines) as f64; - sum_of_per_compatibility_file += per_file_compatibility; + sum_of_single_compatibility_file += single_file_compatibility; writeln!(diff, "```").unwrap(); } else { // in this branch `rome_lines` == `prettier_lines` == `matched_lines` assert!(rome_lines == prettier_lines); matched_lines = rome_lines; - sum_of_per_compatibility_file += per_file_compatibility; + sum_of_single_compatibility_file += single_file_compatibility; } total_line += rome_lines.max(prettier_lines); total_matched_line += matched_lines; single_file_metric_data.diff = diff; single_file_metric_data.filename = file_name.to_string(); - single_file_metric_data.single_file_compatibility = per_file_compatibility; + single_file_metric_data.single_file_compatibility = single_file_compatibility; report_metric_data.files.push(single_file_metric_data); } report_metric_data.file_based_average_prettier_similarity = - sum_of_per_compatibility_file / file_count as f64; + sum_of_single_compatibility_file / file_count as f64; report_metric_data.line_based_average_prettier_similarity = total_matched_line as f64 / total_line as f64; match report_type { From 0e90d5adbf32c43887a199f8f29e1f301cd38f19 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Mon, 20 Jun 2022 23:21:11 +0800 Subject: [PATCH 7/7] =?UTF-8?q?chore:=20=F0=9F=A4=96=20merge=20two=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rome_js_formatter/tests/prettier_tests.rs | 42 ++----------------- 1 file changed, 4 insertions(+), 38 deletions(-) diff --git a/crates/rome_js_formatter/tests/prettier_tests.rs b/crates/rome_js_formatter/tests/prettier_tests.rs index e3f673de960..58df67788a6 100644 --- a/crates/rome_js_formatter/tests/prettier_tests.rs +++ b/crates/rome_js_formatter/tests/prettier_tests.rs @@ -278,32 +278,21 @@ enum ReportType { Markdown, } -#[derive(Debug, PartialEq, Serialize, Default)] -struct SingleFileJsonReport { - filename: String, - single_file_compatibility: f64, -} - -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone, Default, Serialize)] struct SingleFileMetricData { filename: String, single_file_compatibility: f64, + #[serde(skip)] diff: String, } -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, Serialize)] struct PrettierCompatibilityMetricData { file_based_average_prettier_similarity: f64, line_based_average_prettier_similarity: f64, files: Vec, } -#[derive(Debug, PartialEq, Serialize, Default)] -struct ReportJson { - file_based_average_prettier_similarity: f64, - line_based_average_prettier_similarity: f64, - files: Vec, -} impl FromStr for ReportType { type Err = String; @@ -519,30 +508,7 @@ impl DiffReport { report_filename: String, report_metric_data: PrettierCompatibilityMetricData, ) { - let report_json = ReportJson { - file_based_average_prettier_similarity: report_metric_data - .file_based_average_prettier_similarity, - line_based_average_prettier_similarity: report_metric_data - .line_based_average_prettier_similarity, - files: report_metric_data - .files - .into_iter() - .map( - |SingleFileMetricData { - filename, - single_file_compatibility, - diff: _, - }| { - SingleFileJsonReport { - filename, - single_file_compatibility, - } - }, - ) - .collect::>(), - }; - - let json_content = serde_json::to_string(&report_json).unwrap(); + let json_content = serde_json::to_string(&report_metric_data).unwrap(); write(report_filename, json_content).unwrap(); } }