diff --git a/Cargo.lock b/Cargo.lock index 81898e8..b6e5a81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -520,7 +520,7 @@ dependencies = [ [[package]] name = "pyproject-fmt-rust" -version = "1.0.1" +version = "1.0.4" dependencies = [ "indoc", "lexical-sort", diff --git a/rust/src/global.rs b/rust/src/global.rs index e7b5b93..c32c2f8 100644 --- a/rust/src/global.rs +++ b/rust/src/global.rs @@ -101,6 +101,14 @@ mod tests { mr="vr" [demo] ed = "ed" + [tool.coverage.report] + cd="de" + [tool.coverage] + aa = "bb" + [tool.coverage.paths] + ab="bc" + [tool.coverage.run] + ef="fg" [tool.pytest] mk="mv" "#}, @@ -129,6 +137,15 @@ mod tests { [tool.pytest] mk = "mv" + [tool.coverage] + aa = "bb" + [tool.coverage.report] + cd = "de" + [tool.coverage.paths] + ab = "bc" + [tool.coverage.run] + ef = "fg" + [tool.mypy] mk = "mv" diff --git a/rust/src/helpers/table.rs b/rust/src/helpers/table.rs index 39d7bf0..2e609b3 100644 --- a/rust/src/helpers/table.rs +++ b/rust/src/helpers/table.rs @@ -87,18 +87,23 @@ fn calculate_order(header_to_pos: &HashMap, ordering: &[&str]) -> .map(|(k, v)| (v, k * 2)) .collect::>(); - let mut order: Vec = header_to_pos.clone().into_keys().collect(); - order.sort_by_cached_key(|k| -> usize { + let mut header_pos: Vec<(String, usize)> = header_to_pos.clone().into_iter().collect(); + + header_pos.sort_by_cached_key(|(k, file_pos)| -> (usize, usize) { let key = get_key(k); let pos = key_to_pos.get(&key.as_str()); - if pos.is_some() { - let offset = usize::from(key != *k); - pos.unwrap() + offset - } else { - max_ordering + header_to_pos[k] - } + + ( + if let Some(&pos) = pos { + let offset = usize::from(key != *k); + pos + offset + } else { + max_ordering + }, + *file_pos, + ) }); - order + header_pos.into_iter().map(|(k, _)| k).collect() } fn get_key(k: &str) -> String { diff --git a/rust/src/main.rs b/rust/src/main.rs index f99110f..d316006 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -177,6 +177,37 @@ mod tests { true, (3, 8) )] + #[case::subsubtable( + indoc ! {r#" + [project] + [tool.coverage.report] + a = 2 + [tool.coverage] + a = 0 + [tool.coverage.paths] + a = 1 + [tool.coverage.run] + a = 3 + "#}, + indoc ! {r#" + [project] + classifiers = [ + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.8", + ] + [tool.coverage] + a = 0 + [tool.coverage.report] + a = 2 + [tool.coverage.paths] + a = 1 + [tool.coverage.run] + a = 3 + "#}, + 2, + true, + (3, 8) + )] fn test_format_toml( #[case] start: &str, #[case] expected: &str,