Split split command to sub commands.

This commit is contained in:
Andrés N. Robalino 2020-05-24 01:41:30 -05:00
parent 74c2daf665
commit edbecda14d
22 changed files with 154 additions and 57 deletions

View File

@ -279,6 +279,7 @@ pub fn create_default_context(
whole_stream_command(Autoview), whole_stream_command(Autoview),
whole_stream_command(Table), whole_stream_command(Table),
// Text manipulation // Text manipulation
whole_stream_command(Split),
whole_stream_command(SplitColumn), whole_stream_command(SplitColumn),
whole_stream_command(SplitRow), whole_stream_command(SplitRow),
whole_stream_command(Lines), whole_stream_command(Lines),

View File

@ -96,9 +96,8 @@ pub(crate) mod skip;
pub(crate) mod skip_until; pub(crate) mod skip_until;
pub(crate) mod skip_while; pub(crate) mod skip_while;
pub(crate) mod sort_by; pub(crate) mod sort_by;
pub(crate) mod split;
pub(crate) mod split_by; pub(crate) mod split_by;
pub(crate) mod split_column;
pub(crate) mod split_row;
pub(crate) mod sum; pub(crate) mod sum;
#[allow(unused)] #[allow(unused)]
pub(crate) mod t_sort_by; pub(crate) mod t_sort_by;
@ -222,9 +221,10 @@ pub(crate) use skip::Skip;
pub(crate) use skip_until::SkipUntil; pub(crate) use skip_until::SkipUntil;
pub(crate) use skip_while::SkipWhile; pub(crate) use skip_while::SkipWhile;
pub(crate) use sort_by::SortBy; pub(crate) use sort_by::SortBy;
pub(crate) use split::Split;
pub(crate) use split::SplitColumn;
pub(crate) use split::SplitRow;
pub(crate) use split_by::SplitBy; pub(crate) use split_by::SplitBy;
pub(crate) use split_column::SplitColumn;
pub(crate) use split_row::SplitRow;
pub(crate) use sum::Sum; pub(crate) use sum::Sum;
#[allow(unused_imports)] #[allow(unused_imports)]
pub(crate) use t_sort_by::TSortBy; pub(crate) use t_sort_by::TSortBy;

View File

@ -33,7 +33,7 @@ impl WholeStreamCommand for Headers {
fn examples(&self) -> Vec<Example> { fn examples(&self) -> Vec<Example> {
vec![Example { vec![Example {
description: "Create headers for a raw string", description: "Create headers for a raw string",
example: r#"echo "a b c|1 2 3" | split-row "|" | split-column " " | headers"#, example: r#"echo "a b c|1 2 3" | split row "|" | split column " " | headers"#,
result: None, result: None,
}] }]
} }

View File

@ -15,15 +15,15 @@ struct SplitColumnArgs {
collapse_empty: bool, collapse_empty: bool,
} }
pub struct SplitColumn; pub struct SubCommand;
impl WholeStreamCommand for SplitColumn { impl WholeStreamCommand for SubCommand {
fn name(&self) -> &str { fn name(&self) -> &str {
"split-column" "split column"
} }
fn signature(&self) -> Signature { fn signature(&self) -> Signature {
Signature::build("split-column") Signature::build("split column")
.required( .required(
"separator", "separator",
SyntaxShape::Any, SyntaxShape::Any,
@ -34,7 +34,7 @@ impl WholeStreamCommand for SplitColumn {
} }
fn usage(&self) -> &str { fn usage(&self) -> &str {
"Split row contents across multiple columns via the separator." "splits contents across multiple columns via the separator."
} }
fn run( fn run(
@ -106,12 +106,12 @@ fn split_column(args: CommandArgs, registry: &CommandRegistry) -> Result<OutputS
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::SplitColumn; use super::SubCommand;
#[test] #[test]
fn examples_work_as_expected() { fn examples_work_as_expected() {
use crate::examples::test as test_examples; use crate::examples::test as test_examples;
test_examples(SplitColumn {}) test_examples(SubCommand {})
} }
} }

View File

@ -0,0 +1,49 @@
use crate::commands::WholeStreamCommand;
use crate::prelude::*;
use nu_errors::ShellError;
use nu_protocol::{ReturnSuccess, Signature, UntaggedValue};
#[derive(Clone)]
pub struct Command;
impl WholeStreamCommand for Command {
fn name(&self) -> &str {
"split"
}
fn signature(&self) -> Signature {
Signature::build("split")
}
fn usage(&self) -> &str {
"split contents across desired subcommand (like row, column) via the separator."
}
fn run(
&self,
_args: CommandArgs,
registry: &CommandRegistry,
) -> Result<OutputStream, ShellError> {
let registry = registry.clone();
let stream = async_stream! {
yield Ok(ReturnSuccess::Value(
UntaggedValue::string(crate::commands::help::get_help(&Command, &registry))
.into_value(Tag::unknown()),
));
};
Ok(stream.to_output_stream())
}
}
#[cfg(test)]
mod tests {
use super::Command;
#[test]
fn examples_work_as_expected() {
use crate::examples::test as test_examples;
test_examples(Command {})
}
}

View File

@ -0,0 +1,7 @@
pub mod column;
pub mod command;
pub mod row;
pub use column::SubCommand as SplitColumn;
pub use command::Command as Split;
pub use row::SubCommand as SplitRow;

View File

@ -10,15 +10,15 @@ struct SplitRowArgs {
separator: Tagged<String>, separator: Tagged<String>,
} }
pub struct SplitRow; pub struct SubCommand;
impl WholeStreamCommand for SplitRow { impl WholeStreamCommand for SubCommand {
fn name(&self) -> &str { fn name(&self) -> &str {
"split-row" "split row"
} }
fn signature(&self) -> Signature { fn signature(&self) -> Signature {
Signature::build("split-row").required( Signature::build("split row").required(
"separator", "separator",
SyntaxShape::Any, SyntaxShape::Any,
"the character that denotes what separates rows", "the character that denotes what separates rows",
@ -26,7 +26,7 @@ impl WholeStreamCommand for SplitRow {
} }
fn usage(&self) -> &str { fn usage(&self) -> &str {
"Split row contents over multiple rows via the separator." "splits contents over multiple rows via the separator."
} }
fn run( fn run(
@ -73,12 +73,12 @@ fn split_row(args: CommandArgs, registry: &CommandRegistry) -> Result<OutputStre
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::SplitRow; use super::SubCommand;
#[test] #[test]
fn examples_work_as_expected() { fn examples_work_as_expected() {
use crate::examples::test as test_examples; use crate::examples::test as test_examples;
test_examples(SplitRow {}) test_examples(SubCommand {})
} }
} }

View File

@ -35,7 +35,7 @@ fn condition_is_met() {
open --raw caballeros.txt open --raw caballeros.txt
| lines | lines
| skip 2 | skip 2
| split-column ',' | split column ','
| headers | headers
| skip-while "Chickens Collction" != "Blue Chickens" | skip-while "Chickens Collction" != "Blue Chickens"
| keep-until "Chicken Collection" == "Red Chickens" | keep-until "Chicken Collection" == "Red Chickens"

View File

@ -35,7 +35,7 @@ fn condition_is_met() {
open --raw caballeros.txt open --raw caballeros.txt
| lines | lines
| skip 2 | skip 2
| split-column ',' | split column ','
| headers | headers
| skip 1 | skip 1
| keep-while "Chicken Collection" != "Blue Chickens" | keep-while "Chicken Collection" != "Blue Chickens"

View File

@ -10,7 +10,7 @@ fn lines() {
| skip-while $it != "[dependencies]" | skip-while $it != "[dependencies]"
| skip 1 | skip 1
| first 1 | first 1
| split-column "=" | split column "="
| get Column1 | get Column1
| trim | trim
| echo $it | echo $it

View File

@ -41,6 +41,7 @@ mod skip_until;
mod sort_by; mod sort_by;
mod split_by; mod split_by;
mod split_column; mod split_column;
mod split_row;
mod sum; mod sum;
mod touch; mod touch;
mod trim; mod trim;

View File

@ -35,7 +35,7 @@ fn condition_is_met() {
open --raw caballeros.txt open --raw caballeros.txt
| lines | lines
| skip 2 | skip 2
| split-column ',' | split column ','
| headers | headers
| skip-until "Chicken Collection" == "Red Chickens" | skip-until "Chicken Collection" == "Red Chickens"
| str "31/04/2020" --to-int | str "31/04/2020" --to-int

View File

@ -9,7 +9,7 @@ fn by_column() {
| lines | lines
| skip 1 | skip 1
| first 4 | first 4
| split-column "=" | split column "="
| sort-by Column1 | sort-by Column1
| skip 1 | skip 1
| first 1 | first 1

View File

@ -1,20 +1,30 @@
use nu_test_support::fs::Stub::FileWithContentToBeTrimmed;
use nu_test_support::playground::Playground;
use nu_test_support::{nu, pipeline}; use nu_test_support::{nu, pipeline};
#[test] #[test]
fn by_column() { fn to_column() {
let actual = nu!( Playground::setup("split_column_test_1", |dirs, sandbox| {
cwd: "tests/fixtures/formats", pipeline( sandbox.with_files(vec![FileWithContentToBeTrimmed(
"sample.txt",
r#" r#"
open cargo_sample.toml --raw importer,shipper,tariff_item,name,origin
"#,
)]);
let actual = nu!(
cwd: dirs.test(), pipeline(
r#"
open sample.txt
| lines | lines
| skip 1
| first 1
| split-column "="
| get Column1
| trim | trim
| split column ","
| pivot
| nth 1
| echo $it | echo $it
"# "#
)); ));
assert_eq!(actual.out, "name"); assert!(actual.out.contains("shipper"));
})
} }

View File

@ -0,0 +1,29 @@
use nu_test_support::fs::Stub::FileWithContentToBeTrimmed;
use nu_test_support::playground::Playground;
use nu_test_support::{nu, pipeline};
#[test]
fn to_row() {
Playground::setup("split_row_test_1", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContentToBeTrimmed(
"sample.txt",
r#"
importer,shipper,tariff_item,name,origin
"#,
)]);
let actual = nu!(
cwd: dirs.test(), pipeline(
r#"
open sample.txt
| lines
| trim
| split row ","
| count
| echo $it
"#
));
assert!(actual.out.contains("5"));
})
}

View File

@ -30,7 +30,7 @@ fn table_to_csv_text() {
open csv_text_sample.txt open csv_text_sample.txt
| lines | lines
| trim | trim
| split-column "," a b c d origin | split column "," a b c d origin
| last 1 | last 1
| to csv | to csv
| lines | lines
@ -63,7 +63,7 @@ fn table_to_csv_text_skipping_headers_after_conversion() {
open csv_text_sample.txt open csv_text_sample.txt
| lines | lines
| trim | trim
| split-column "," a b c d origin | split column "," a b c d origin
| last 1 | last 1
| to csv --headerless | to csv --headerless
| echo $it | echo $it

View File

@ -88,7 +88,7 @@ fn table_to_json_text() {
r#" r#"
open sample.txt open sample.txt
| lines | lines
| split-column "," name luck | split column "," name luck
| select name | select name
| to json | to json
| from json | from json

View File

@ -39,7 +39,7 @@ fn table_to_tsv_text() {
r#" r#"
open tsv_text_sample.txt open tsv_text_sample.txt
| lines | lines
| split-column "\t" a b c d origin | split column "\t" a b c d origin
| last 1 | last 1
| to tsv | to tsv
| lines | lines
@ -69,7 +69,7 @@ fn table_to_tsv_text_skipping_headers_after_conversion() {
r#" r#"
open tsv_text_sample.txt open tsv_text_sample.txt
| lines | lines
| split-column "\t" a b c d origin | split column "\t" a b c d origin
| last 1 | last 1
| to tsv --headerless | to tsv --headerless
| echo $it | echo $it

View File

@ -312,7 +312,7 @@ pub fn insert_data_at_column_path(
Ok(original) Ok(original)
} else { } else {
Err(ShellError::untagged_runtime_error( Err(ShellError::untagged_runtime_error(
"Internal error: could not split column-path correctly", "Internal error: could not split column path correctly",
)) ))
} }
} }

View File

@ -5,7 +5,7 @@ Use `rename` to give columns more appropriate names.
## Examples ## Examples
```shell ```shell
> open /etc/passwd | lines | split-column ":" | rename user password uid gid gecos home shell > open /etc/passwd | lines | split column ":" | rename user password uid gid gecos home shell
────┬────────┬──────────┬──────┬──────┬────────┬─────────────────┬────────────────── ────┬────────┬──────────┬──────┬──────┬────────┬─────────────────┬──────────────────
# │ user │ password │ uid │ gid │ gecos │ home │ shell # │ user │ password │ uid │ gid │ gecos │ home │ shell
────┼────────┼──────────┼──────┼──────┼────────┼─────────────────┼────────────────── ────┼────────┼──────────┼──────┼──────┼────────┼─────────────────┼──────────────────

View File

@ -1,8 +1,8 @@
# split-column # split column
Split row contents across multiple columns via the separator. splits contents across multiple columns via the separator.
Syntax: `split-column <separator> ...args{flags}` Syntax: `split column <separator> ...args{flags}`
### Parameters ### Parameters
@ -31,10 +31,10 @@ If we have file structured like this:
1.0459770114942528 | 1.0925925925925926 | 0.6164383561643836 1.0459770114942528 | 1.0925925925925926 | 0.6164383561643836
``` ```
We can build a table from it using the `split-column` command We can build a table from it using the `split column` command
```shell ```shell
> open coordinates.txt | lines | split-column " | " > open coordinates.txt | lines | split column " | "
━━━┯━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━ ━━━┯━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━
# │ Column1 │ Column2 │ Column3 # │ Column1 │ Column2 │ Column3
───┼─────────────────────┼──────────────────────┼──────────────────── ───┼─────────────────────┼──────────────────────┼────────────────────
@ -54,7 +54,7 @@ We can build a table from it using the `split-column` command
And give names to the columns And give names to the columns
```shell ```shell
> open coordinates.txt | lines | split-column " | " x y z > open coordinates.txt | lines | split column " | " x y z
━━━┯━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━ ━━━┯━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━
# │ x │ y │ z # │ x │ y │ z
───┼─────────────────────┼──────────────────────┼──────────────────── ───┼─────────────────────┼──────────────────────┼────────────────────

View File

@ -1,8 +1,8 @@
# split-row # split row
Split row contents over multiple rows via the separator. splits contents over multiple rows via the separator.
Syntax: `split-row <separator>` Syntax: `split row <separator>`
### Parameters: ### Parameters:
* `<separator>` the character that denotes what separates rows * `<separator>` the character that denotes what separates rows
@ -17,10 +17,10 @@ We can build a table from a file that looks like this
``` ```
using the `split-row` command. using the `split row` command.
```shell ```shell
open table.txt | split-row ", " open table.txt | split row ", "
━━━┯━━━━━━━━━ ━━━┯━━━━━━━━━
# │ <value> # │ <value>
───┼───────── ───┼─────────