Skip to content

Commit 507318e

Browse files
andholpil
authored andcommitted
refactor(dependencies): return formatted string and eprint ♻️
1 parent 134f7ce commit 507318e

File tree

3 files changed

+85
-11
lines changed

3 files changed

+85
-11
lines changed

compiler-cli/src/dependencies.rs

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -423,25 +423,66 @@ pub fn download<Telem: Telemetry>(
423423
let major_versions_available =
424424
dependency::check_for_major_version_updates(&manifest, package_fetcher);
425425
if !major_versions_available.is_empty() {
426-
pretty_print_major_versions_available(major_versions_available);
426+
eprintln!(
427+
"{}",
428+
pretty_print_major_versions_available(major_versions_available)
429+
);
427430
}
428431

429432
Ok(manifest)
430433
}
431434

432-
fn pretty_print_major_versions_available(versions: dependency::PackageVersionDiffs) {
433-
let longest_package_name_length = versions.keys().map(|name| name.len()).max().unwrap_or(10);
435+
fn pretty_print_major_versions_available(versions: dependency::PackageVersionDiffs) -> String {
436+
let total_lines = versions.len() + 3;
437+
let versions = versions
438+
.iter()
439+
.map(|(name, (v1, v2))| (name, v1.to_string(), v2.to_string()))
440+
.sorted();
441+
442+
let longest_parts = versions.clone().fold(
443+
(0, 0, 0),
444+
|(max_name, max_curr, max_major), (name, curr, major)| {
445+
(
446+
max_name.max(name.len()),
447+
max_curr.max(curr.len()),
448+
max_major.max(major.len()),
449+
)
450+
},
451+
);
452+
453+
let (longest_package_name_length, longest_current_version_length, longest_major_version_length) =
454+
longest_parts;
434455

435-
// print to stderr instead of stdout because this is not part of the standard output of this
436-
// command
437-
eprintln!("\nHint: the following dependencies have new major versions available...\n");
438-
for (name, (v1, v2)) in versions {
439-
let padding = " ".repeat(longest_package_name_length - name.len());
456+
let mut output_string = String::with_capacity(
457+
(longest_package_name_length
458+
+ longest_current_version_length
459+
+ longest_major_version_length
460+
+ 5)
461+
* total_lines,
462+
);
440463

441-
// lazily assuming the longest version could be 8 characters. eg: 1.1234.2
442-
// excluding qualifiers other than x.y.z
443-
eprintln!("{name}:{padding} {v1:<8} -> {v2:<8}");
464+
output_string
465+
.push_str("\nHint: the following dependencies have new major versions available:\n\n");
466+
for (name, v1, v2) in versions {
467+
let name_padding = " ".repeat(longest_package_name_length - name.len());
468+
let curr_ver_padding = " ".repeat(longest_current_version_length - v1.to_string().len());
469+
470+
output_string.push_str(
471+
&[
472+
name,
473+
&name_padding,
474+
" ",
475+
&v1.to_string(),
476+
&curr_ver_padding,
477+
" -> ",
478+
&v2.to_string(),
479+
"\n",
480+
]
481+
.concat(),
482+
);
444483
}
484+
485+
output_string
445486
}
446487

447488
async fn add_missing_packages<Telem: Telemetry>(
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
source: compiler-cli/src/dependencies/tests.rs
3+
expression: output
4+
---
5+
Hint: the following dependencies have new major versions available:
6+
7+
gleam_stdlib 0.45.0 -> 1.0.0
8+
short_name 1.0.0 -> 2.0.0
9+
very_long_package_name 18.382.43 -> 19.0.38

compiler-cli/src/dependencies/tests.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,3 +1335,27 @@ fn test_remove_package_that_is_also_a_transitive_dependency() {
13351335
assert_eq!(manifest.requirements, config.dependencies);
13361336
assert_eq!(manifest.packages, manifest_copy.packages);
13371337
}
1338+
1339+
#[test]
1340+
fn test_pretty_print_major_versions_available() {
1341+
let versions = vec![
1342+
(
1343+
"very_long_package_name".to_string(),
1344+
(Version::new(18, 382, 43), Version::new(19, 0, 38)),
1345+
),
1346+
(
1347+
"gleam_stdlib".to_string(),
1348+
(Version::new(0, 45, 0), Version::new(1, 0, 0)),
1349+
),
1350+
(
1351+
"short_name".to_string(),
1352+
(Version::new(1, 0, 0), Version::new(2, 0, 0)),
1353+
),
1354+
]
1355+
.into_iter()
1356+
.collect();
1357+
1358+
let output = pretty_print_major_versions_available(versions);
1359+
1360+
insta::assert_snapshot!(output);
1361+
}

0 commit comments

Comments
 (0)