make adding newlines with to text more consistent and opt-out-able (#14158)

# Description

This PR tries to make `to text` more consistent with how it adds
newlines and also gives you an opt-out --no-newline option.

![image](https://github.com/user-attachments/assets/e4976ce6-c685-47a4-8470-4947970daf47)


I wasn't sure how to change the `PipelineData::ByteStream` match arm. I
figure something needs to be done there but I'm not sure how to do it.


# User-Facing Changes
newlines are more consistent.

# Tests + Formatting
<!--
Don't forget to add tests that cover your changes.

Make sure you've run and fixed any issues with these commands:

- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to
check that you're using the standard code style
- `cargo test --workspace` to check that all tests pass (on Windows make
sure to [enable developer
mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging))
- `cargo run -- -c "use toolkit.nu; toolkit test stdlib"` to run the
tests for the standard library

> **Note**
> from `nushell` you can also use the `toolkit` as follows
> ```bash
> use toolkit.nu # or use an `env_change` hook to activate it
automatically
> toolkit check pr
> ```
-->

# After Submitting
<!-- If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
-->
This commit is contained in:
Darren Schroeder 2024-10-23 16:49:51 -05:00 committed by GitHub
parent 3ec1c40320
commit abb6fca5e3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 23 additions and 5 deletions

View file

@ -21,6 +21,11 @@ impl Command for ToText {
fn signature(&self) -> Signature { fn signature(&self) -> Signature {
Signature::build("to text") Signature::build("to text")
.input_output_types(vec![(Type::Any, Type::String)]) .input_output_types(vec![(Type::Any, Type::String)])
.switch(
"no-newline",
"Do not append a newline to the end of the text",
Some('n'),
)
.category(Category::Formats) .category(Category::Formats)
} }
@ -36,6 +41,7 @@ impl Command for ToText {
input: PipelineData, input: PipelineData,
) -> Result<PipelineData, ShellError> { ) -> Result<PipelineData, ShellError> {
let span = call.head; let span = call.head;
let no_newline = call.has_flag(engine_state, stack, "no-newline")?;
let input = input.try_expand_range()?; let input = input.try_expand_range()?;
let config = stack.get_config(engine_state); let config = stack.get_config(engine_state);
@ -43,7 +49,12 @@ impl Command for ToText {
PipelineData::Empty => Ok(Value::string(String::new(), span) PipelineData::Empty => Ok(Value::string(String::new(), span)
.into_pipeline_data_with_metadata(update_metadata(None))), .into_pipeline_data_with_metadata(update_metadata(None))),
PipelineData::Value(value, ..) => { PipelineData::Value(value, ..) => {
let str = local_into_string(value, LINE_ENDING, &config); let is_compound_type = matches!(value, Value::List { .. } | Value::Record { .. });
let mut str = local_into_string(value, LINE_ENDING, &config);
if is_compound_type && !no_newline {
str.push_str(LINE_ENDING);
}
Ok( Ok(
Value::string(str, span) Value::string(str, span)
.into_pipeline_data_with_metadata(update_metadata(None)), .into_pipeline_data_with_metadata(update_metadata(None)),
@ -53,7 +64,9 @@ impl Command for ToText {
let span = stream.span(); let span = stream.span();
let iter = stream.into_inner().map(move |value| { let iter = stream.into_inner().map(move |value| {
let mut str = local_into_string(value, LINE_ENDING, &config); let mut str = local_into_string(value, LINE_ENDING, &config);
str.push_str(LINE_ENDING); if !no_newline {
str.push_str(LINE_ENDING);
}
str str
}); });
Ok(PipelineData::ByteStream( Ok(PipelineData::ByteStream(
@ -75,8 +88,13 @@ impl Command for ToText {
fn examples(&self) -> Vec<Example> { fn examples(&self) -> Vec<Example> {
vec![ vec![
Example { Example {
description: "Outputs data as simple text", description: "Outputs data as simple text with a newline",
example: "1 | to text", example: "[1] | to text",
result: Some(Value::test_string("1".to_string() + LINE_ENDING)),
},
Example {
description: "Outputs data as simple text without a newline",
example: "[1] | to text --no-newline",
result: Some(Value::test_string("1")), result: Some(Value::test_string("1")),
}, },
Example { Example {

View file

@ -415,7 +415,7 @@ fn save_with_custom_converter() {
nu!(cwd: dirs.test(), pipeline( nu!(cwd: dirs.test(), pipeline(
r#" r#"
def "to ndjson" []: any -> string { each { to json --raw } | to text } ; def "to ndjson" []: any -> string { each { to json --raw } | to text --no-newline } ;
{a: 1, b: 2} | save test.ndjson {a: 1, b: 2} | save test.ndjson
"# "#
)); ));