Merge pull request #1006 from andrasio/additions

Default.
This commit is contained in:
Andrés N. Robalino 2019-11-24 04:55:12 -05:00 committed by GitHub
commit fe53c37654
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 118 additions and 4 deletions

View File

@ -270,6 +270,7 @@ Nu adheres closely to a set of goals that make up its design philosophy. As feat
| append row-data | Append a row to the end of the table |
| compact ...columns | Remove rows where given columns are empty |
| count | Show the total number of rows |
| default column row-data | Sets a default row's column if missing |
| edit column-or-column-path value | Edit an existing column to have a new value |
| embed column | Creates a new table of one column with the given name, and places the current table inside of it |
| first amount | Show only the first number of rows |

View File

@ -310,6 +310,7 @@ pub async fn cli() -> Result<(), Box<dyn Error>> {
per_item_command(Echo),
whole_stream_command(Config),
whole_stream_command(Compact),
whole_stream_command(Default),
whole_stream_command(SkipWhile),
per_item_command(Enter),
per_item_command(Help),

View File

@ -17,6 +17,7 @@ pub(crate) mod count;
pub(crate) mod cp;
pub(crate) mod date;
pub(crate) mod debug;
pub(crate) mod default;
pub(crate) mod echo;
pub(crate) mod enter;
pub(crate) mod env;
@ -105,6 +106,7 @@ pub(crate) use count::Count;
pub(crate) use cp::Cpy;
pub(crate) use date::Date;
pub(crate) use debug::Debug;
pub(crate) use default::Default;
pub(crate) use echo::Echo;
pub(crate) use enter::Enter;
pub(crate) use env::Env;

View File

@ -37,13 +37,19 @@ pub fn compact(
CompactArgs { rest: columns }: CompactArgs,
RunnableContext { input, .. }: RunnableContext,
) -> Result<OutputStream, ShellError> {
let objects = input.values.take_while(move |item| {
let objects = input.values.filter(move |item| {
let keep = if columns.is_empty() {
item.is_some()
} else {
columns
match item {
Tagged {
item: Value::Row(ref r),
..
} => columns
.iter()
.all(|field| item.get_data(field).borrow().is_some())
.all(|field| r.get_data(field).borrow().is_some()),
_ => false,
}
};
futures::future::ready(keep)

72
src/commands/default.rs Normal file
View File

@ -0,0 +1,72 @@
use crate::commands::WholeStreamCommand;
use crate::errors::ShellError;
use crate::parser::CommandRegistry;
use crate::prelude::*;
#[derive(Deserialize)]
struct DefaultArgs {
column: Tagged<String>,
value: Tagged<Value>,
}
pub struct Default;
impl WholeStreamCommand for Default {
fn name(&self) -> &str {
"default"
}
fn signature(&self) -> Signature {
Signature::build("default")
.required("column name", SyntaxShape::String, "the name of the column")
.required(
"column value",
SyntaxShape::Any,
"the value of the column to default",
)
}
fn usage(&self) -> &str {
"Sets a default row's column if missing."
}
fn run(
&self,
args: CommandArgs,
registry: &CommandRegistry,
) -> Result<OutputStream, ShellError> {
args.process(registry, default)?.run()
}
}
fn default(
DefaultArgs { column, value }: DefaultArgs,
RunnableContext { input, .. }: RunnableContext,
) -> Result<OutputStream, ShellError> {
let stream = input
.values
.map(move |item| {
let mut result = VecDeque::new();
let should_add = match item {
Tagged {
item: Value::Row(ref r),
..
} => r.get_data(&column.item).borrow().is_none(),
_ => false,
};
if should_add {
match item.insert_data_at_path(&column.item, value.item.clone()) {
Some(new_value) => result.push_back(ReturnSuccess::value(new_value)),
None => result.push_back(ReturnSuccess::value(item)),
}
} else {
result.push_back(ReturnSuccess::value(item));
}
result
})
.flatten();
Ok(stream.to_output_stream())
}

View File

@ -3,6 +3,38 @@ mod helpers;
use helpers as h;
use helpers::{Playground, Stub::*};
#[test]
fn default_row_data_if_column_missing() {
Playground::setup("default_test_1", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContentToBeTrimmed(
"los_tres_amigos.json",
r#"
{
"amigos": [
{"name": "Yehuda"},
{"name": "Jonathan", "rusty_luck": 0},
{"name": "Andres", "rusty_luck": 0},
{"name":"GorbyPuff"}
]
}
"#,
)]);
let actual = nu!(
cwd: dirs.test(), h::pipeline(
r#"
open los_tres_amigos.json
| get amigos
| default rusty_luck 1
| get rusty_luck
| sum
| echo $it
"#
));
assert_eq!(actual, "2");
});
}
#[test]
fn compact_rows_where_given_column_is_empty() {
Playground::setup("compact_test_1", |dirs, sandbox| {