mirror of
https://github.com/nushell/nushell.git
synced 2025-04-29 23:54:26 +02:00
Fixes #14660 # Description Fixed an issue where tables with empty values were incorrectly replaced with [table X row] when converted to Markdown using the ```to md``` command. Empty values are now replaced with whitespaces to preserve the original table structure. Additionally, fixed a missing newline (\n) between tables when using --per-element in a list. Removed (\n) from 2 examples for consistency. Example: ``` For the list let list = [ {name: bob, age: 21} {name: jim, age: 20} {name: sarah}] Running "$list | to md --pretty" outputs: | name | age | | ----- | --- | | bob | 21 | | jim | 20 | | sarah | | ------------------------------------------------------------------------------------------------ For the list let list = [ {name: bob, age: 21} {name: jim, age: 20} {name: sarah} {name: timothy, age: 50} {name: paul} ] Running "$list | to md --per-element --pretty" outputs: | name | age | | ------- | --- | | bob | 21 | | jim | 20 | | timothy | 50 | | name | | ----- | | sarah | | paul | ``` # User-Facing Changes The ```to md``` behaves as expected when piping a table that contains empty values showing all rows and the empty items replaced with whitespace. # Tests + Formatting Added 2 test cases to cover both issues. fmt + clippy OK. # After Submitting The command documentation needs to be updated with an example for when you want to "separate list into markdown tables"
This commit is contained in:
parent
220858d641
commit
f41b1460aa
@ -36,13 +36,13 @@ impl Command for ToMd {
|
|||||||
Example {
|
Example {
|
||||||
description: "Outputs an MD string representing the contents of this table",
|
description: "Outputs an MD string representing the contents of this table",
|
||||||
example: "[[foo bar]; [1 2]] | to md",
|
example: "[[foo bar]; [1 2]] | to md",
|
||||||
result: Some(Value::test_string("|foo|bar|\n|-|-|\n|1|2|\n")),
|
result: Some(Value::test_string("|foo|bar|\n|-|-|\n|1|2|")),
|
||||||
},
|
},
|
||||||
Example {
|
Example {
|
||||||
description: "Optionally, output a formatted markdown string",
|
description: "Optionally, output a formatted markdown string",
|
||||||
example: "[[foo bar]; [1 2]] | to md --pretty",
|
example: "[[foo bar]; [1 2]] | to md --pretty",
|
||||||
result: Some(Value::test_string(
|
result: Some(Value::test_string(
|
||||||
"| foo | bar |\n| --- | --- |\n| 1 | 2 |\n",
|
"| foo | bar |\n| --- | --- |\n| 1 | 2 |",
|
||||||
)),
|
)),
|
||||||
},
|
},
|
||||||
Example {
|
Example {
|
||||||
@ -57,6 +57,13 @@ impl Command for ToMd {
|
|||||||
example: "[0 1 2] | to md --pretty",
|
example: "[0 1 2] | to md --pretty",
|
||||||
result: Some(Value::test_string("0\n1\n2")),
|
result: Some(Value::test_string("0\n1\n2")),
|
||||||
},
|
},
|
||||||
|
Example {
|
||||||
|
description: "Separate list into markdown tables",
|
||||||
|
example: "[ {foo: 1, bar: 2} {foo: 3, bar: 4} {foo: 5}] | to md --per-element",
|
||||||
|
result: Some(Value::test_string(
|
||||||
|
"|foo|bar|\n|-|-|\n|1|2|\n|3|4|\n|foo|\n|-|\n|5|",
|
||||||
|
)),
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,11 +101,14 @@ fn to_md(
|
|||||||
grouped_input
|
grouped_input
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(move |val| match val {
|
.map(move |val| match val {
|
||||||
Value::List { .. } => table(val.into_pipeline_data(), pretty, config),
|
Value::List { .. } => {
|
||||||
|
format!("{}\n", table(val.into_pipeline_data(), pretty, config))
|
||||||
|
}
|
||||||
other => fragment(other, pretty, config),
|
other => fragment(other, pretty, config),
|
||||||
})
|
})
|
||||||
.collect::<Vec<String>>()
|
.collect::<Vec<String>>()
|
||||||
.join(""),
|
.join("")
|
||||||
|
.trim(),
|
||||||
head,
|
head,
|
||||||
)
|
)
|
||||||
.into_pipeline_data_with_metadata(Some(metadata)));
|
.into_pipeline_data_with_metadata(Some(metadata)));
|
||||||
@ -152,7 +162,13 @@ fn collect_headers(headers: &[String]) -> (Vec<String>, Vec<usize>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn table(input: PipelineData, pretty: bool, config: &Config) -> String {
|
fn table(input: PipelineData, pretty: bool, config: &Config) -> String {
|
||||||
let vec_of_values = input.into_iter().collect::<Vec<Value>>();
|
let vec_of_values = input
|
||||||
|
.into_iter()
|
||||||
|
.flat_map(|val| match val {
|
||||||
|
Value::List { vals, .. } => vals,
|
||||||
|
other => vec![other],
|
||||||
|
})
|
||||||
|
.collect::<Vec<Value>>();
|
||||||
let mut headers = merge_descriptors(&vec_of_values);
|
let mut headers = merge_descriptors(&vec_of_values);
|
||||||
|
|
||||||
let mut empty_header_index = 0;
|
let mut empty_header_index = 0;
|
||||||
@ -464,6 +480,39 @@ mod tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_empty_row_value() {
|
||||||
|
let value = Value::test_list(vec![
|
||||||
|
Value::test_record(record! {
|
||||||
|
"foo" => Value::test_string("1"),
|
||||||
|
"bar" => Value::test_string("2"),
|
||||||
|
}),
|
||||||
|
Value::test_record(record! {
|
||||||
|
"foo" => Value::test_string("3"),
|
||||||
|
"bar" => Value::test_string("4"),
|
||||||
|
}),
|
||||||
|
Value::test_record(record! {
|
||||||
|
"foo" => Value::test_string("5"),
|
||||||
|
"bar" => Value::test_string(""),
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
table(
|
||||||
|
value.clone().into_pipeline_data(),
|
||||||
|
false,
|
||||||
|
&Config::default()
|
||||||
|
),
|
||||||
|
one(r#"
|
||||||
|
|foo|bar|
|
||||||
|
|-|-|
|
||||||
|
|1|2|
|
||||||
|
|3|4|
|
||||||
|
|5||
|
||||||
|
"#)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_content_type_metadata() {
|
fn test_content_type_metadata() {
|
||||||
let mut engine_state = Box::new(EngineState::new());
|
let mut engine_state = Box::new(EngineState::new());
|
||||||
|
Loading…
Reference in New Issue
Block a user