diff --git a/CHANGELOG.md b/CHANGELOG.md index e6e4fdef..2ce43c4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,11 +20,17 @@ That said, these are more guidelines rather than hard rules, though the project --- +## Unreleased + +### Bug Fixes + +- [#2131](https://github.com/ClementTsang/bottom/pull/2131): Fix the config not accepting `Memory`, `Memory%`, `Total Read`, and `Total Write` process column aliases that the config schema advertised. + ## 0.14.3 - 2026-07-01 ### Other -- [#2119](https://github.com/ClementTsang/bottom/pull/2119): Workaround change for draw behaviour that caused Kitty with `cursor_trail` to occasionally use more CPU. +- [#2119](https://github.com/ClementTsang/bottom/pull/2119): Add workaround for draw behaviour that caused Kitty with `cursor_trail` to occasionally use more CPU. ## 0.14.2 - 2026-06-27 diff --git a/src/options/config/process.rs b/src/options/config/process.rs index a8c511d5..d6b880a5 100644 --- a/src/options/config/process.rs +++ b/src/options/config/process.rs @@ -175,4 +175,31 @@ mod test { vec![ProcWidgetColumn::WritePerSecond; 3] ); } + + /// The generated JSON schema advertises additional column name aliases + /// (via `ProcColumn::get_schema_names`) that the deserializer must also + /// accept, otherwise valid configs are rejected at runtime. + #[test] + fn valid_process_column_config_schema_aliases() { + let config = r#"columns = ["Memory", "Memory%"]"#; + let generated: ProcessesConfig = toml_edit::de::from_str(config).unwrap(); + assert_eq!( + to_columns(generated.columns), + vec![ProcWidgetColumn::Mem; 2] + ); + + let config = r#"columns = ["Total Read"]"#; + let generated: ProcessesConfig = toml_edit::de::from_str(config).unwrap(); + assert_eq!( + to_columns(generated.columns), + vec![ProcWidgetColumn::TotalRead] + ); + + let config = r#"columns = ["Total Write"]"#; + let generated: ProcessesConfig = toml_edit::de::from_str(config).unwrap(); + assert_eq!( + to_columns(generated.columns), + vec![ProcWidgetColumn::TotalWrite] + ); + } } diff --git a/src/widgets/process_table/process_columns.rs b/src/widgets/process_table/process_columns.rs index e1463a04..4c93cc5d 100644 --- a/src/widgets/process_table/process_columns.rs +++ b/src/widgets/process_table/process_columns.rs @@ -207,7 +207,7 @@ impl ProcColumn { pub fn parse_column_name(name: &str) -> Option { match name.to_lowercase().as_str() { "cpu%" => Some(ProcColumn::CpuPercent), - "mem" | "mem%" => Some(ProcColumn::MemPercent), + "mem" | "mem%" | "memory" | "memory%" => Some(ProcColumn::MemPercent), "virt" | "virtual" | "virtmem" | "virtual memory" => Some(ProcColumn::VirtualMem), "pid" => Some(ProcColumn::Pid), "count" => Some(ProcColumn::Count), @@ -215,8 +215,8 @@ impl ProcColumn { "command" => Some(ProcColumn::Command), "read" | "r/s" | "rps" => Some(ProcColumn::ReadPerSecond), "write" | "w/s" | "wps" => Some(ProcColumn::WritePerSecond), - "tread" | "t.read" => Some(ProcColumn::TotalRead), - "twrite" | "t.write" => Some(ProcColumn::TotalWrite), + "tread" | "t.read" | "total read" => Some(ProcColumn::TotalRead), + "twrite" | "t.write" | "total write" => Some(ProcColumn::TotalWrite), "state" => Some(ProcColumn::State), "user" => Some(ProcColumn::User), "time" => Some(ProcColumn::Time),