From 127381497ca9e35796c046628a58d334350db77b Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Wed, 11 Sep 2019 10:36:50 -0400 Subject: [PATCH 01/10] run rustfmt --- src/commands/cd.rs | 3 +- src/commands/date.rs | 2 +- src/commands/exit.rs | 3 +- src/commands/first.rs | 3 +- src/commands/from_bson.rs | 2 +- src/commands/get.rs | 2 +- src/commands/help.rs | 2 +- src/commands/lines.rs | 2 +- src/commands/pick.rs | 2 +- src/commands/post.rs | 2 +- src/commands/reject.rs | 2 +- src/commands/save.rs | 2 +- src/commands/shells.rs | 2 +- src/commands/size.rs | 2 +- src/commands/split_column.rs | 8 +++-- src/commands/split_row.rs | 5 ++- src/commands/tags.rs | 2 +- src/commands/trim.rs | 2 +- src/commands/version.rs | 2 +- src/commands/where_.rs | 7 ++-- src/commands/which_.rs | 5 ++- src/lib.rs | 2 +- src/parser/parse/operator.rs | 1 - src/plugins/skip.rs | 2 +- src/shell.rs | 2 +- src/shell/filesystem_shell.rs | 3 +- tests/command_cd_tests.rs | 60 ++++++++++++++++------------------- tests/command_config_test.rs | 57 +++++++++++++++------------------ tests/command_ls_tests.rs | 31 ++++++++---------- tests/command_mv_tests.rs | 20 +++--------- tests/command_rm_tests.rs | 29 +++++++---------- tests/external_tests.rs | 4 +-- tests/filter_inc_tests.rs | 54 ++++++++++++++----------------- tests/filter_str_tests.rs | 35 +++++++++----------- 34 files changed, 159 insertions(+), 203 deletions(-) diff --git a/src/commands/cd.rs b/src/commands/cd.rs index a84e66fce..92875c273 100644 --- a/src/commands/cd.rs +++ b/src/commands/cd.rs @@ -10,8 +10,7 @@ impl WholeStreamCommand for CD { } fn signature(&self) -> Signature { - Signature::build("cd") - .optional("directory", SyntaxType::Path) + Signature::build("cd").optional("directory", SyntaxType::Path) } fn usage(&self) -> &str { diff --git a/src/commands/date.rs b/src/commands/date.rs index 7d3307fe5..2d16ec6c5 100644 --- a/src/commands/date.rs +++ b/src/commands/date.rs @@ -1,5 +1,5 @@ -use crate::errors::ShellError; use crate::data::{Dictionary, Value}; +use crate::errors::ShellError; use crate::prelude::*; use chrono::{DateTime, Local, Utc}; diff --git a/src/commands/exit.rs b/src/commands/exit.rs index feed8f7c4..8a382d8b7 100644 --- a/src/commands/exit.rs +++ b/src/commands/exit.rs @@ -11,8 +11,7 @@ impl WholeStreamCommand for Exit { } fn signature(&self) -> Signature { - Signature::build("exit") - .switch("now") + Signature::build("exit").switch("now") } fn usage(&self) -> &str { diff --git a/src/commands/first.rs b/src/commands/first.rs index 6381d5def..a3575b7fe 100644 --- a/src/commands/first.rs +++ b/src/commands/first.rs @@ -16,8 +16,7 @@ impl WholeStreamCommand for First { } fn signature(&self) -> Signature { - Signature::build("first") - .required("amount", SyntaxType::Literal) + Signature::build("first").required("amount", SyntaxType::Literal) } fn usage(&self) -> &str { diff --git a/src/commands/from_bson.rs b/src/commands/from_bson.rs index e2f5421bd..12f92965a 100644 --- a/src/commands/from_bson.rs +++ b/src/commands/from_bson.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ExpectedRange; use crate::data::{Primitive, TaggedDictBuilder, Value}; +use crate::errors::ExpectedRange; use crate::prelude::*; use bson::{decode_document, spec::BinarySubtype, Bson}; use std::str::FromStr; diff --git a/src/commands/get.rs b/src/commands/get.rs index 2f9ed8a32..7f9c4f521 100644 --- a/src/commands/get.rs +++ b/src/commands/get.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::Value; +use crate::errors::ShellError; use crate::prelude::*; pub struct Get; diff --git a/src/commands/help.rs b/src/commands/help.rs index 571868a02..f8d9b5c2f 100644 --- a/src/commands/help.rs +++ b/src/commands/help.rs @@ -1,7 +1,7 @@ use crate::commands::command::CommandAction; use crate::commands::PerItemCommand; -use crate::errors::ShellError; use crate::data::{command_dict, TaggedDictBuilder}; +use crate::errors::ShellError; use crate::parser::registry; use crate::prelude::*; diff --git a/src/commands/lines.rs b/src/commands/lines.rs index 15a467224..196da8802 100644 --- a/src/commands/lines.rs +++ b/src/commands/lines.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::{Primitive, Value}; +use crate::errors::ShellError; use crate::prelude::*; use log::trace; diff --git a/src/commands/pick.rs b/src/commands/pick.rs index bc5f8df40..1dce17266 100644 --- a/src/commands/pick.rs +++ b/src/commands/pick.rs @@ -1,7 +1,7 @@ use crate::commands::WholeStreamCommand; use crate::context::CommandRegistry; -use crate::errors::ShellError; use crate::data::base::select_fields; +use crate::errors::ShellError; use crate::prelude::*; #[derive(Deserialize)] diff --git a/src/commands/post.rs b/src/commands/post.rs index 8790c929a..e1001b98d 100644 --- a/src/commands/post.rs +++ b/src/commands/post.rs @@ -1,7 +1,7 @@ use crate::commands::UnevaluatedCallInfo; use crate::context::SpanSource; -use crate::errors::ShellError; use crate::data::Value; +use crate::errors::ShellError; use crate::parser::hir::SyntaxType; use crate::parser::registry::Signature; use crate::prelude::*; diff --git a/src/commands/reject.rs b/src/commands/reject.rs index 49dbc4dd3..3ad7de9fa 100644 --- a/src/commands/reject.rs +++ b/src/commands/reject.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::base::reject_fields; +use crate::errors::ShellError; use crate::prelude::*; #[derive(Deserialize)] diff --git a/src/commands/save.rs b/src/commands/save.rs index 26bf8cb16..2fd26defe 100644 --- a/src/commands/save.rs +++ b/src/commands/save.rs @@ -1,6 +1,6 @@ use crate::commands::{UnevaluatedCallInfo, WholeStreamCommand}; -use crate::errors::ShellError; use crate::data::Value; +use crate::errors::ShellError; use crate::prelude::*; use std::path::{Path, PathBuf}; diff --git a/src/commands/shells.rs b/src/commands/shells.rs index 856c23e7b..078040412 100644 --- a/src/commands/shells.rs +++ b/src/commands/shells.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::TaggedDictBuilder; +use crate::errors::ShellError; use crate::prelude::*; pub struct Shells; diff --git a/src/commands/size.rs b/src/commands/size.rs index d8383efcf..43829d524 100644 --- a/src/commands/size.rs +++ b/src/commands/size.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::{TaggedDictBuilder, Value}; +use crate::errors::ShellError; use crate::prelude::*; pub struct Size; diff --git a/src/commands/split_column.rs b/src/commands/split_column.rs index 2df02cac1..d057a3dd2 100644 --- a/src/commands/split_column.rs +++ b/src/commands/split_column.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::{Primitive, TaggedDictBuilder, Value}; +use crate::errors::ShellError; use crate::prelude::*; use log::trace; @@ -40,7 +40,11 @@ impl WholeStreamCommand for SplitColumn { } fn split_column( - SplitColumnArgs { separator, rest, collapse_empty}: SplitColumnArgs, + SplitColumnArgs { + separator, + rest, + collapse_empty, + }: SplitColumnArgs, RunnableContext { input, name, .. }: RunnableContext, ) -> Result { Ok(input diff --git a/src/commands/split_row.rs b/src/commands/split_row.rs index d4f3824a8..bec18099a 100644 --- a/src/commands/split_row.rs +++ b/src/commands/split_row.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::{Primitive, Value}; +use crate::errors::ShellError; use crate::prelude::*; use log::trace; @@ -17,8 +17,7 @@ impl WholeStreamCommand for SplitRow { } fn signature(&self) -> Signature { - Signature::build("split-row") - .required("separator", SyntaxType::Any) + Signature::build("split-row").required("separator", SyntaxType::Any) } fn usage(&self) -> &str { diff --git a/src/commands/tags.rs b/src/commands/tags.rs index 3f112482c..179700a9e 100644 --- a/src/commands/tags.rs +++ b/src/commands/tags.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::{TaggedDictBuilder, Value}; +use crate::errors::ShellError; use crate::prelude::*; pub struct Tags; diff --git a/src/commands/trim.rs b/src/commands/trim.rs index 865f6b50b..00a978e83 100644 --- a/src/commands/trim.rs +++ b/src/commands/trim.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::Value; +use crate::errors::ShellError; use crate::prelude::*; pub struct Trim; diff --git a/src/commands/version.rs b/src/commands/version.rs index a7a357819..703c20be7 100644 --- a/src/commands/version.rs +++ b/src/commands/version.rs @@ -1,6 +1,6 @@ use crate::commands::WholeStreamCommand; -use crate::errors::ShellError; use crate::data::{Dictionary, Value}; +use crate::errors::ShellError; use crate::parser::registry::Signature; use crate::prelude::*; use indexmap::IndexMap; diff --git a/src/commands/where_.rs b/src/commands/where_.rs index b09c341b4..2111e0687 100644 --- a/src/commands/where_.rs +++ b/src/commands/where_.rs @@ -12,8 +12,7 @@ impl PerItemCommand for Where { } fn signature(&self) -> registry::Signature { - Signature::build("where") - .required("condition", SyntaxType::Block) + Signature::build("where").required("condition", SyntaxType::Block) } fn usage(&self) -> &str { @@ -43,9 +42,7 @@ impl PerItemCommand for Where { VecDeque::new() } } - Err(e) => { - return Err(e) - } + Err(e) => return Err(e), } } Tagged { tag, .. } => { diff --git a/src/commands/which_.rs b/src/commands/which_.rs index 06c93f63f..eea9d2bec 100644 --- a/src/commands/which_.rs +++ b/src/commands/which_.rs @@ -1,5 +1,5 @@ -use crate::errors::ShellError; use crate::data::Value; +use crate::errors::ShellError; use crate::prelude::*; use crate::commands::WholeStreamCommand; @@ -13,8 +13,7 @@ impl WholeStreamCommand for Which { } fn signature(&self) -> Signature { - Signature::build("which") - .required("name", SyntaxType::Any) + Signature::build("which").required("name", SyntaxType::Any) } fn usage(&self) -> &str { diff --git a/src/lib.rs b/src/lib.rs index a18343df9..9ee1e9d09 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,8 +28,8 @@ pub use crate::parser::parse::token_tree_builder::TokenTreeBuilder; pub use crate::plugin::{serve_plugin, Plugin}; pub use crate::utils::{AbsoluteFile, AbsolutePath, RelativePath}; pub use cli::cli; -pub use data::config::{APP_INFO, config_path}; pub use data::base::{Primitive, Value}; +pub use data::config::{config_path, APP_INFO}; pub use data::dict::{Dictionary, TaggedDictBuilder}; pub use data::meta::{Span, Tag, Tagged, TaggedItem}; pub use errors::{CoerceInto, ShellError}; diff --git a/src/parser/parse/operator.rs b/src/parser/parse/operator.rs index 1942b6012..82a04ed79 100644 --- a/src/parser/parse/operator.rs +++ b/src/parser/parse/operator.rs @@ -20,7 +20,6 @@ impl ToDebug for Operator { } impl Operator { - pub fn print(&self) -> String { self.as_str().to_string() } diff --git a/src/plugins/skip.rs b/src/plugins/skip.rs index cb259e99b..135dbbd5d 100644 --- a/src/plugins/skip.rs +++ b/src/plugins/skip.rs @@ -15,7 +15,7 @@ impl Skip { impl Plugin for Skip { fn config(&mut self) -> Result { - Ok(Signature::build("skip") + Ok(Signature::build("skip") .desc("Skip a number of rows") .rest(SyntaxType::Number) .filter()) diff --git a/src/shell.rs b/src/shell.rs index caa1443ac..14ec1c675 100644 --- a/src/shell.rs +++ b/src/shell.rs @@ -1,9 +1,9 @@ pub(crate) mod completer; pub(crate) mod filesystem_shell; +pub(crate) mod help_shell; pub(crate) mod helper; pub(crate) mod shell; pub(crate) mod shell_manager; pub(crate) mod value_shell; -pub(crate) mod help_shell; pub(crate) use helper::Helper; diff --git a/src/shell/filesystem_shell.rs b/src/shell/filesystem_shell.rs index 16cbf513f..e746f41aa 100644 --- a/src/shell/filesystem_shell.rs +++ b/src/shell/filesystem_shell.rs @@ -207,8 +207,7 @@ impl Shell for FilesystemShell { let mut stream = VecDeque::new(); - stream.push_back( - ReturnSuccess::change_cwd( + stream.push_back(ReturnSuccess::change_cwd( path.to_string_lossy().to_string(), )); diff --git a/tests/command_cd_tests.rs b/tests/command_cd_tests.rs index b9ad8ca12..e0cc60867 100644 --- a/tests/command_cd_tests.rs +++ b/tests/command_cd_tests.rs @@ -31,7 +31,7 @@ fn filesystem_change_from_current_directory_using_absolute_path() { ); assert_eq!(PathBuf::from(actual), dirs.formats()); - }) + }) } #[test] @@ -113,29 +113,30 @@ fn filesystem_change_to_a_directory_containing_spaces() { "# ); - assert_eq!(PathBuf::from(actual), dirs.test().join("robalino turner katz")); + assert_eq!( + PathBuf::from(actual), + dirs.test().join("robalino turner katz") + ); }) } #[test] fn filesystem_directory_not_found() { let actual = nu_error!( - cwd: "tests/fixtures", - "cd dir_that_does_not_exist" + cwd: "tests/fixtures", + "cd dir_that_does_not_exist" ); assert!(actual.contains("dir_that_does_not_exist")); assert!(actual.contains("directory not found")); } - #[test] fn valuesystem_change_from_current_path_using_relative_path() { Playground::setup("cd_test_8", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [[bin]] path = "src/plugins/turner.rs" @@ -144,7 +145,7 @@ fn valuesystem_change_from_current_path_using_relative_path() { [[bin]] path = "src/plugins/katz.rs" - "# + "#, )]); let actual = nu!( @@ -164,10 +165,9 @@ fn valuesystem_change_from_current_path_using_relative_path() { #[test] fn valuesystem_change_from_current_path_using_absolute_path() { Playground::setup("cd_test_9", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [dependencies] turner-ts = "0.1.1" robalino-tkd = "0.0.1" @@ -178,7 +178,7 @@ fn valuesystem_change_from_current_path_using_absolute_path() { [[bin]] path = "src/plugins/bbq.rs" - "# + "#, )]); let actual = nu!( @@ -193,16 +193,15 @@ fn valuesystem_change_from_current_path_using_absolute_path() { ); assert_eq!(PathBuf::from(actual), PathBuf::from("/dependencies")); - }) + }) } #[test] fn valuesystem_switch_back_to_previous_working_path() { Playground::setup("cd_test_10", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [dependencies] turner-ts = "0.1.1" robalino-tkd = "0.0.1" @@ -214,7 +213,7 @@ fn valuesystem_switch_back_to_previous_working_path() { [[bin]] path = "src/plugins/bbq.rs" - "# + "#, )]); let actual = nu!( @@ -267,7 +266,6 @@ fn valuesystem_change_from_current_path_using_relative_path_and_dash() { }) } - #[test] fn valuesystem_change_current_path_to_parent_path() { Playground::setup("cd_test_12", |dirs, sandbox| { @@ -298,13 +296,12 @@ fn valuesystem_change_current_path_to_parent_path() { #[test] fn valuesystem_change_to_home_directory() { Playground::setup("cd_test_13", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [paquete] el = "pollo loco" - "# + "#, )]); let actual = nu!( @@ -325,13 +322,12 @@ fn valuesystem_change_to_home_directory() { #[test] fn valuesystem_change_to_a_path_containing_spaces() { Playground::setup("cd_test_14", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" ["pa que te"] el = "pollo loco" - "# + "#, )]); let actual = nu!( diff --git a/tests/command_config_test.rs b/tests/command_config_test.rs index 41038ddb1..3321f85dc 100644 --- a/tests/command_config_test.rs +++ b/tests/command_config_test.rs @@ -7,25 +7,23 @@ use std::path::PathBuf; #[test] fn has_default_configuration_file() { - let expected = "config.toml"; + let expected = "config.toml"; Playground::setup("config_test_1", |dirs, _| { - nu!(cwd: dirs.root(), "config"); assert_eq!( - dirs.config_path().join(expected), - nu::config_path().unwrap().join(expected) + dirs.config_path().join(expected), + nu::config_path().unwrap().join(expected) ); }) } #[test] fn shows_path_of_configuration_file() { - let expected = "config.toml"; + let expected = "config.toml"; Playground::setup("config_test_2", |dirs, _| { - let actual = nu!( cwd: dirs.test(), "config --path | echo $it" @@ -38,14 +36,13 @@ fn shows_path_of_configuration_file() { #[test] fn use_different_configuration() { Playground::setup("config_test_3", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "test_3.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "test_3.toml", + r#" caballero_1 = "Andrés N. Robalino" caballero_2 = "Jonathan Turner" caballero_3 = "Yehuda katz" - "# + "#, )]); let actual = nu!( @@ -57,20 +54,19 @@ fn use_different_configuration() { assert_eq!(actual, "Andrés N. Robalino"); }); - h::delete_file_at(nu::config_path().unwrap().join("test_3.toml")); + h::delete_file_at(nu::config_path().unwrap().join("test_3.toml")); } #[test] fn sets_configuration_value() { Playground::setup("config_test_4", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "test_4.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "test_4.toml", + r#" caballero_1 = "Andrés N. Robalino" caballero_2 = "Jonathan Turner" caballero_3 = "Yehuda katz" - "# + "#, )]); nu!( @@ -79,27 +75,26 @@ fn sets_configuration_value() { ); let actual = nu!( - cwd: dirs.root(), - r#"open "{}/test_4.toml" | get caballero_4 | echo $it"#, - dirs.config_path() + cwd: dirs.root(), + r#"open "{}/test_4.toml" | get caballero_4 | echo $it"#, + dirs.config_path() ); assert_eq!(actual, "jonas"); }); - h::delete_file_at(nu::config_path().unwrap().join("test_4.toml")); + h::delete_file_at(nu::config_path().unwrap().join("test_4.toml")); } #[test] fn removes_configuration_value() { Playground::setup("config_test_5", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "test_5.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "test_5.toml", + r#" caballeros = [1, 1, 1] podershell = [1, 1, 1] - "# + "#, )]); nu!( @@ -108,13 +103,13 @@ fn removes_configuration_value() { ); let actual = nu_error!( - cwd: dirs.root(), - r#"open "{}/test_5.toml" | get podershell | echo $it"#, - dirs.config_path() + cwd: dirs.root(), + r#"open "{}/test_5.toml" | get podershell | echo $it"#, + dirs.config_path() ); assert!(actual.contains("table missing column")); }); - h::delete_file_at(nu::config_path().unwrap().join("test_5.toml")); -} \ No newline at end of file + h::delete_file_at(nu::config_path().unwrap().join("test_5.toml")); +} diff --git a/tests/command_ls_tests.rs b/tests/command_ls_tests.rs index 8ec1d035d..f6f5f39f8 100644 --- a/tests/command_ls_tests.rs +++ b/tests/command_ls_tests.rs @@ -6,11 +6,10 @@ use helpers::{Playground, Stub::*}; #[test] fn ls_lists_regular_files() { Playground::setup("ls_test_1", |dirs, sandbox| { - sandbox - .with_files(vec![ - EmptyFile("yehuda.10.txt"), - EmptyFile("jonathan.10.txt"), - EmptyFile("andres.10.txt"), + sandbox.with_files(vec![ + EmptyFile("yehuda.10.txt"), + EmptyFile("jonathan.10.txt"), + EmptyFile("andres.10.txt"), ]); let actual = nu!( @@ -34,12 +33,11 @@ fn ls_lists_regular_files() { #[test] fn ls_lists_regular_files_using_asterisk_wildcard() { Playground::setup("ls_test_2", |dirs, sandbox| { - sandbox - .with_files(vec![ - EmptyFile("los.1.txt"), - EmptyFile("tres.1.txt"), - EmptyFile("amigos.1.txt"), - EmptyFile("arepas.1.clu"), + sandbox.with_files(vec![ + EmptyFile("los.1.txt"), + EmptyFile("tres.1.txt"), + EmptyFile("amigos.1.txt"), + EmptyFile("arepas.1.clu"), ]); let actual = nu!( @@ -63,12 +61,11 @@ fn ls_lists_regular_files_using_asterisk_wildcard() { #[test] fn ls_lists_regular_files_using_question_mark_wildcard() { Playground::setup("ls_test_3", |dirs, sandbox| { - sandbox - .with_files(vec![ - EmptyFile("yehuda.10.txt"), - EmptyFile("jonathan.10.txt"), - EmptyFile("andres.10.txt"), - EmptyFile("chicken_not_to_be_picked_up.100.txt"), + sandbox.with_files(vec![ + EmptyFile("yehuda.10.txt"), + EmptyFile("jonathan.10.txt"), + EmptyFile("andres.10.txt"), + EmptyFile("chicken_not_to_be_picked_up.100.txt"), ]); let actual = nu!( diff --git a/tests/command_mv_tests.rs b/tests/command_mv_tests.rs index 61ce84275..1d01e2332 100644 --- a/tests/command_mv_tests.rs +++ b/tests/command_mv_tests.rs @@ -26,11 +26,7 @@ fn moves_a_file() { #[test] fn overwrites_if_moving_to_existing_file() { Playground::setup("mv_test_2", |dirs, sandbox| { - sandbox - .with_files(vec![ - EmptyFile("andres.txt"), - EmptyFile("jonathan.txt") - ]); + sandbox.with_files(vec![EmptyFile("andres.txt"), EmptyFile("jonathan.txt")]); let original = dirs.test().join("andres.txt"); let expected = dirs.test().join("jonathan.txt"); @@ -142,7 +138,7 @@ fn moves_using_path_with_wildcard() { EmptyFile("sgml_description.json"), EmptyFile("sample.ini"), EmptyFile("utf16.ini"), - EmptyFile("yehuda.ini") + EmptyFile("yehuda.ini"), ]) .mkdir("work_dir") .mkdir("expected"); @@ -150,10 +146,7 @@ fn moves_using_path_with_wildcard() { let work_dir = dirs.test().join("work_dir"); let expected = dirs.test().join("expected"); - nu!( - cwd: work_dir, - "mv ../originals/*.ini ../expected" - ); + nu!(cwd: work_dir, "mv ../originals/*.ini ../expected"); assert!(h::files_exist_at( vec!["yehuda.ini", "jonathan.ini", "sample.ini", "andres.ini",], @@ -170,7 +163,7 @@ fn moves_using_a_glob() { .with_files(vec![ EmptyFile("arepa.txt"), EmptyFile("empanada.txt"), - EmptyFile("taquiza.txt") + EmptyFile("taquiza.txt"), ]) .mkdir("work_dir") .mkdir("expected"); @@ -179,10 +172,7 @@ fn moves_using_a_glob() { let work_dir = dirs.test().join("work_dir"); let expected = dirs.test().join("expected"); - nu!( - cwd: work_dir, - "mv ../meals/* ../expected" - ); + nu!(cwd: work_dir, "mv ../meals/* ../expected"); assert!(meal_dir.exists()); assert!(h::files_exist_at( diff --git a/tests/command_rm_tests.rs b/tests/command_rm_tests.rs index 568219e17..9317b586a 100644 --- a/tests/command_rm_tests.rs +++ b/tests/command_rm_tests.rs @@ -6,9 +6,7 @@ use helpers::{Playground, Stub::*}; #[test] fn rm_removes_a_file() { Playground::setup("rm_test_1", |dirs, sandbox| { - sandbox - .with_files(vec![EmptyFile("i_will_be_deleted.txt") - ]); + sandbox.with_files(vec![EmptyFile("i_will_be_deleted.txt")]); nu!( cwd: dirs.root(), @@ -29,7 +27,7 @@ fn rm_removes_files_with_wildcard() { .with_files(vec![ EmptyFile("cli.rs"), EmptyFile("lib.rs"), - EmptyFile("prelude.rs") + EmptyFile("prelude.rs"), ]) .within("src/parser") .with_files(vec![EmptyFile("parse.rs"), EmptyFile("parser.rs")]) @@ -38,8 +36,8 @@ fn rm_removes_files_with_wildcard() { .within("src/parser/hir") .with_files(vec![ EmptyFile("baseline_parse.rs"), - EmptyFile("baseline_parse_tokens.rs") - ]); + EmptyFile("baseline_parse_tokens.rs"), + ]); nu!( cwd: dirs.test(), @@ -70,7 +68,7 @@ fn rm_removes_deeply_nested_directories_with_wildcard_and_recursive_flag() { .with_files(vec![ EmptyFile("cli.rs"), EmptyFile("lib.rs"), - EmptyFile("prelude.rs") + EmptyFile("prelude.rs"), ]) .within("src/parser") .with_files(vec![EmptyFile("parse.rs"), EmptyFile("parser.rs")]) @@ -79,8 +77,8 @@ fn rm_removes_deeply_nested_directories_with_wildcard_and_recursive_flag() { .within("src/parser/hir") .with_files(vec![ EmptyFile("baseline_parse.rs"), - EmptyFile("baseline_parse_tokens.rs") - ]); + EmptyFile("baseline_parse_tokens.rs"), + ]); nu!( cwd: dirs.test(), @@ -109,11 +107,10 @@ fn rm_removes_directory_contents_without_recursive_flag_if_empty() { #[test] fn rm_removes_directory_contents_with_recursive_flag() { Playground::setup("rm_test_5", |dirs, sandbox| { - sandbox - .with_files(vec![ - EmptyFile("yehuda.txt"), - EmptyFile("jonathan.txt"), - EmptyFile("andres.txt") + sandbox.with_files(vec![ + EmptyFile("yehuda.txt"), + EmptyFile("jonathan.txt"), + EmptyFile("andres.txt"), ]); nu!( @@ -128,9 +125,7 @@ fn rm_removes_directory_contents_with_recursive_flag() { #[test] fn rm_errors_if_attempting_to_delete_a_directory_with_content_without_recursive_flag() { Playground::setup("rm_test_6", |dirs, sandbox| { - sandbox - .with_files(vec![EmptyFile("some_empty_file.txt") - ]); + sandbox.with_files(vec![EmptyFile("some_empty_file.txt")]); let actual = nu_error!( cwd: dirs.root(), diff --git a/tests/external_tests.rs b/tests/external_tests.rs index 7aabd592d..0d810acac 100644 --- a/tests/external_tests.rs +++ b/tests/external_tests.rs @@ -3,8 +3,8 @@ mod helpers; #[test] fn external_command() { let actual = nu!( - cwd: "tests/fixtures", - "echo 1" + cwd: "tests/fixtures", + "echo 1" ); assert!(actual.contains("1")); diff --git a/tests/filter_inc_tests.rs b/tests/filter_inc_tests.rs index 9ef0b311e..658e24308 100644 --- a/tests/filter_inc_tests.rs +++ b/tests/filter_inc_tests.rs @@ -15,13 +15,12 @@ fn can_only_apply_one() { #[test] fn by_one_with_field_passed() { Playground::setup("plugin_inc_test_1", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [package] edition = "2018" - "# + "#, )]); let actual = nu!( @@ -36,13 +35,12 @@ fn by_one_with_field_passed() { #[test] fn by_one_with_no_field_passed() { Playground::setup("plugin_inc_test_2", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [package] contributors = "2" - "# + "#, )]); let actual = nu!( @@ -57,13 +55,12 @@ fn by_one_with_no_field_passed() { #[test] fn semversion_major_inc() { Playground::setup("plugin_inc_test_3", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [package] version = "0.1.3" - "# + "#, )]); let actual = nu!( @@ -78,13 +75,12 @@ fn semversion_major_inc() { #[test] fn semversion_minor_inc() { Playground::setup("plugin_inc_test_4", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [package] version = "0.1.3" - "# + "#, )]); let actual = nu!( @@ -99,13 +95,12 @@ fn semversion_minor_inc() { #[test] fn semversion_patch_inc() { Playground::setup("plugin_inc_test_5", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [package] version = "0.1.3" - "# + "#, )]); let actual = nu!( @@ -120,13 +115,12 @@ fn semversion_patch_inc() { #[test] fn semversion_without_passing_field() { Playground::setup("plugin_inc_test_6", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [package] version = "0.1.3" - "# + "#, )]); let actual = nu!( diff --git a/tests/filter_str_tests.rs b/tests/filter_str_tests.rs index 03c9d6353..e26a18850 100644 --- a/tests/filter_str_tests.rs +++ b/tests/filter_str_tests.rs @@ -1,7 +1,7 @@ mod helpers; -use helpers as h; use h::{Playground, Stub::*}; +use helpers as h; #[test] fn can_only_apply_one() { @@ -39,10 +39,9 @@ fn acts_without_passing_field() { #[test] fn downcases() { Playground::setup("plugin_str_test_2", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [dependency] name = "LIGHT" "#, @@ -60,10 +59,9 @@ fn downcases() { #[test] fn upcases() { Playground::setup("plugin_str_test_3", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [package] name = "nushell" "#, @@ -98,10 +96,9 @@ fn converts_to_int() { #[test] fn replaces() { Playground::setup("plugin_str_test_4", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [package] name = "nushell" "#, @@ -124,10 +121,9 @@ fn replaces() { #[test] fn find_and_replaces() { Playground::setup("plugin_str_test_5", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( - "sample.toml", - r#" + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" [fortune.teller] phone = "1-800-KATZ" "#, @@ -150,10 +146,9 @@ fn find_and_replaces() { #[test] fn find_and_replaces_without_passing_field() { Playground::setup("plugin_str_test_6", |dirs, sandbox| { - sandbox - .with_files(vec![FileWithContent( + sandbox.with_files(vec![FileWithContent( "sample.toml", - r#" + r#" [fortune.teller] phone = "1-800-KATZ" "#, From dbefbcb0465ed4ea1412c3b39a3085167be7011f Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Wed, 11 Sep 2019 13:06:59 -0400 Subject: [PATCH 02/10] CI --- .azure/azure-pipelines.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.azure/azure-pipelines.yml b/.azure/azure-pipelines.yml index b384e8df3..21bbf2609 100644 --- a/.azure/azure-pipelines.yml +++ b/.azure/azure-pipelines.yml @@ -19,7 +19,10 @@ steps: curl https://sh.rustup.rs -sSf | sh -s -- -y --no-modify-path --default-toolchain `cat rust-toolchain` export PATH=$HOME/.cargo/bin:$PATH rustc -Vv + cargo install rustfmt echo "##vso[task.prependpath]$HOME/.cargo/bin" displayName: Install Rust - bash: RUSTFLAGS="-D warnings" cargo test --all-features displayName: Run tests + - bash: cargo fmt + displayName: Lint From 5ca075e38b330d3201c04694b75333c7c964eb33 Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Wed, 11 Sep 2019 13:14:31 -0400 Subject: [PATCH 03/10] already installed in CI --- .azure/azure-pipelines.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.azure/azure-pipelines.yml b/.azure/azure-pipelines.yml index 21bbf2609..5a8732716 100644 --- a/.azure/azure-pipelines.yml +++ b/.azure/azure-pipelines.yml @@ -19,7 +19,6 @@ steps: curl https://sh.rustup.rs -sSf | sh -s -- -y --no-modify-path --default-toolchain `cat rust-toolchain` export PATH=$HOME/.cargo/bin:$PATH rustc -Vv - cargo install rustfmt echo "##vso[task.prependpath]$HOME/.cargo/bin" displayName: Install Rust - bash: RUSTFLAGS="-D warnings" cargo test --all-features From 1f3f3d3105c9c02542f0aa9fe44d9475428988ca Mon Sep 17 00:00:00 2001 From: Vanessa Sochat Date: Wed, 11 Sep 2019 13:44:23 -0400 Subject: [PATCH 04/10] adding missing docker dependencies openssl and pkgconfig Signed-off-by: Vanessa Sochat --- docker/Dockerfile | 2 ++ docker/Dockerfile.nu-base | 1 + 2 files changed, 3 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index fa089e77d..c4dafe330 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,5 +2,7 @@ ARG FROMTAG=latest FROM quay.io/nushell/nu-base:${FROMTAG} as base FROM rust:1.37-slim COPY --from=base /usr/local/bin/nu /usr/local/bin/nu +RUN apt-get update && \ + apt-get install -y pkg-config libssl-dev ENTRYPOINT ["nu"] CMD ["-l", "info"] diff --git a/docker/Dockerfile.nu-base b/docker/Dockerfile.nu-base index faba0213a..08cb0a892 100644 --- a/docker/Dockerfile.nu-base +++ b/docker/Dockerfile.nu-base @@ -7,6 +7,7 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && apt-get install -y libssl-dev \ libxcb-composite0-dev \ libx11-dev \ + libssl-dev \ pkg-config \ curl From 206998a41a61d576018a9ef15462923e178cf221 Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Wed, 11 Sep 2019 13:49:16 -0400 Subject: [PATCH 05/10] install correct version --- .azure/azure-pipelines.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.azure/azure-pipelines.yml b/.azure/azure-pipelines.yml index 5a8732716..851259b43 100644 --- a/.azure/azure-pipelines.yml +++ b/.azure/azure-pipelines.yml @@ -20,8 +20,9 @@ steps: export PATH=$HOME/.cargo/bin:$PATH rustc -Vv echo "##vso[task.prependpath]$HOME/.cargo/bin" + rustup component add rustfmt --toolchain `cat rust-toolchain` displayName: Install Rust - bash: RUSTFLAGS="-D warnings" cargo test --all-features displayName: Run tests - - bash: cargo fmt + - bash: cargo fmt --all -- --check displayName: Lint From b35549adacf139848cee2f44f71c6104469b3531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20N=2E=20Robalino?= Date: Wed, 11 Sep 2019 22:20:42 -0500 Subject: [PATCH 06/10] Removes regex crate dependency. --- Cargo.lock | 1 - Cargo.toml | 1 - src/cli.rs | 88 ++++++++------ src/errors.rs | 10 -- src/plugins/str.rs | 236 +------------------------------------- tests/filter_str_tests.rs | 79 +------------ 6 files changed, 61 insertions(+), 354 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 08fcb94a0..07ddf9348 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1542,7 +1542,6 @@ dependencies = [ "prettytable-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "ptree 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rawkey 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "roxmltree 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rusqlite 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustyline 5.0.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index f9e13c934..b5256b840 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,7 +59,6 @@ unicode-xid = "0.2.0" serde_ini = "0.2.0" subprocess = "0.1.18" mime = "0.3.13" -regex = "1.2.1" pretty-hex = "0.1.0" hex = "0.3.2" tempfile = "3.1.0" diff --git a/src/cli.rs b/src/cli.rs index ec8c7085c..6d0211907 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -15,7 +15,6 @@ use crate::parser::{hir, CallNode, Pipeline, PipelineElement, TokenNode}; use crate::prelude::*; use log::{debug, trace}; -use regex::Regex; use rustyline::error::ReadlineError; use rustyline::{self, config::Configurer, config::EditMode, ColorMode, Config, Editor}; use std::env; @@ -98,38 +97,12 @@ fn load_plugin(path: &std::path::Path, context: &mut Context) -> Result<(), Shel result } -fn load_plugins_in_dir(path: &std::path::PathBuf, context: &mut Context) -> Result<(), ShellError> { - let re_bin = Regex::new(r"^nu_plugin_[A-Za-z_]+$")?; - let re_exe = Regex::new(r"^nu_plugin_[A-Za-z_]+\.(exe|bat)$")?; +fn search_paths() -> Vec { + let mut search_paths = Vec::new(); - trace!("Looking for plugins in {:?}", path); - - match std::fs::read_dir(path) { - Ok(p) => { - for entry in p { - let entry = entry?; - let filename = entry.file_name(); - let f_name = filename.to_string_lossy(); - - if re_bin.is_match(&f_name) || re_exe.is_match(&f_name) { - let mut load_path = path.clone(); - trace!("Found {:?}", f_name); - load_path.push(f_name.to_string()); - load_plugin(&load_path, context)?; - } - } - } - _ => {} - } - Ok(()) -} - -fn load_plugins(context: &mut Context) -> Result<(), ShellError> { match env::var_os("PATH") { Some(paths) => { - for path in env::split_paths(&paths) { - let _ = load_plugins_in_dir(&path, context); - } + search_paths = env::split_paths(&paths).collect::>(); } None => println!("PATH is not defined in the environment."), } @@ -140,7 +113,7 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { let mut path = std::path::PathBuf::from("."); path.push("target"); path.push("debug"); - let _ = load_plugins_in_dir(&path, context); + search_paths.push(path); } #[cfg(not(debug_assertions))] @@ -150,7 +123,58 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { path.push("target"); path.push("release"); - let _ = load_plugins_in_dir(&path, context); + search_paths.push(path); + } + + search_paths +} + +fn load_plugins(context: &mut Context) -> Result<(), ShellError> { + let opts = glob::MatchOptions { + case_sensitive: false, + require_literal_separator: false, + require_literal_leading_dot: false, + }; + + for path in search_paths() { + let pattern = path.join("nu_plugin_[a-z][a-z]*").clone(); + + trace!("Trying {:?}", pattern.display()); + + match glob::glob_with(&pattern.to_string_lossy(), opts) { + Err(_) => {} + Ok(binaries) => { + for bin in binaries.filter_map(Result::ok) { + if !bin.is_file() { + continue; + } + + trace!("Found {:?}", bin.display()); + + let bin_name = bin.file_name().unwrap().to_string_lossy(); + + let is_valid_name = bin_name + .chars() + .all(|c| c.is_ascii_alphabetic() || c == '_'); + + let is_executable = { + #[cfg(windows)] + { + bin_name.ends_with(".exe") || bin_name.ends_with(".bat") + } + + #[cfg(not(windows))] + { + true + } + }; + + if is_valid_name && is_executable { + load_plugin(&bin, context)?; + } + } + } + } } Ok(()) diff --git a/src/errors.rs b/src/errors.rs index d97435d22..579576e71 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -555,16 +555,6 @@ impl std::convert::From for ShellError { } } -impl std::convert::From for ShellError { - fn from(input: regex::Error) -> ShellError { - ProximateShellError::String(StringError { - title: format!("{:?}", input), - error: Value::nothing(), - }) - .start() - } -} - impl std::convert::From> for ShellError { fn from(input: Box) -> ShellError { ProximateShellError::String(StringError { diff --git a/src/plugins/str.rs b/src/plugins/str.rs index 99700449b..60b0146ef 100644 --- a/src/plugins/str.rs +++ b/src/plugins/str.rs @@ -2,20 +2,12 @@ use nu::{ serve_plugin, CallInfo, Plugin, Primitive, ReturnSuccess, ReturnValue, ShellError, Signature, SyntaxType, Tagged, Value, }; -use regex::Regex; #[derive(Debug, Eq, PartialEq)] enum Action { Downcase, Upcase, ToInteger, - Replace(ReplaceAction), -} - -#[derive(Debug, Eq, PartialEq)] -enum ReplaceAction { - Direct, - FindAndReplace, } struct Str { @@ -45,41 +37,12 @@ impl Str { Err(_) => Value::string(input), }, }, - Some(Action::Replace(ref mode)) => match mode { - ReplaceAction::Direct => Value::string(self.first_param()), - ReplaceAction::FindAndReplace => { - let regex = Regex::new(self.first_param()); - - match regex { - Ok(re) => Value::string(re.replace(input, self.second_param()).to_owned()), - Err(_) => Value::string(input), - } - } - }, None => Value::string(input), }; Ok(applied) } - fn did_supply_field(&self) -> bool { - self.field.is_some() - } - - fn first_param(&self) -> &str { - let idx = if self.did_supply_field() { 1 } else { 0 }; - self.get_param(idx) - } - - fn second_param(&self) -> &str { - let idx = if self.did_supply_field() { 2 } else { 1 }; - self.get_param(idx) - } - - fn get_param(&self, idx: usize) -> &str { - self.params.as_ref().unwrap().get(idx).unwrap().as_str() - } - fn for_field(&mut self, field: &str) { self.field = Some(String::from(field)); } @@ -92,14 +55,6 @@ impl Str { self.error = Some(message.to_string()); } - fn for_replace(&mut self, mode: ReplaceAction) { - if self.permit() { - self.action = Some(Action::Replace(mode)); - } else { - self.log_error("can only apply one"); - } - } - fn for_to_int(&mut self) { if self.permit() { self.action = Some(Action::ToInteger); @@ -125,7 +80,7 @@ impl Str { } pub fn usage() -> &'static str { - "Usage: str field [--downcase|--upcase|--to-int|--replace|--find-replace]" + "Usage: str field [--downcase|--upcase|--to-int]" } } @@ -172,8 +127,6 @@ impl Plugin for Str { .switch("downcase") .switch("upcase") .switch("to-int") - .switch("replace") - .switch("find-replace") .rest(SyntaxType::Member) .filter()) } @@ -190,12 +143,6 @@ impl Plugin for Str { if args.has("to-int") { self.for_to_int(); } - if args.has("replace") { - self.for_replace(ReplaceAction::Direct); - } - if args.has("find-replace") { - self.for_replace(ReplaceAction::FindAndReplace); - } if let Some(possible_field) = args.nth(0) { match possible_field { @@ -203,16 +150,6 @@ impl Plugin for Str { item: Value::Primitive(Primitive::String(s)), .. } => match self.action { - Some(Action::Replace(ReplaceAction::Direct)) => { - if args.len() == 2 { - self.for_field(&s); - } - } - Some(Action::Replace(ReplaceAction::FindAndReplace)) => { - if args.len() == 3 { - self.for_field(&s); - } - } Some(Action::Downcase) | Some(Action::Upcase) | Some(Action::ToInteger) @@ -258,7 +195,7 @@ fn main() { #[cfg(test)] mod tests { - use super::{Action, ReplaceAction, Str}; + use super::{Action, Str}; use indexmap::IndexMap; use nu::{ CallInfo, EvaluatedArgs, Plugin, Primitive, ReturnSuccess, SourceMap, Span, Tag, Tagged, @@ -266,16 +203,6 @@ mod tests { }; use num_bigint::BigInt; - impl Str { - fn replace_with(&mut self, value: &str) { - self.params.as_mut().unwrap().push(value.to_string()); - } - - fn find_with(&mut self, search: &str) { - self.params.as_mut().unwrap().push(search.to_string()); - } - } - struct CallStub { positionals: Vec>, flags: IndexMap>, @@ -328,7 +255,7 @@ mod tests { let configured = plugin.config().unwrap(); - for action_flag in &["downcase", "upcase", "to-int", "replace", "find-replace"] { + for action_flag in &["downcase", "upcase", "to-int"] { assert!(configured.named.get(*action_flag).is_some()); } } @@ -362,33 +289,6 @@ mod tests { .is_ok()); assert_eq!(plugin.action.unwrap(), Action::ToInteger); } - - #[test] - fn str_plugin_accepts_replace() { - let mut plugin = Str::new(); - - assert!(plugin - .begin_filter(CallStub::new().with_long_flag("replace").create()) - .is_ok()); - assert_eq!( - plugin.action.unwrap(), - Action::Replace(ReplaceAction::Direct) - ); - } - - #[test] - fn str_plugin_accepts_find_replace() { - let mut plugin = Str::new(); - - assert!(plugin - .begin_filter(CallStub::new().with_long_flag("find-replace").create()) - .is_ok()); - assert_eq!( - plugin.action.unwrap(), - Action::Replace(ReplaceAction::FindAndReplace) - ); - } - #[test] fn str_plugin_accepts_field() { let mut plugin = Str::new(); @@ -441,26 +341,6 @@ mod tests { assert_eq!(strutils.apply("9999").unwrap(), Value::int(9999 as i64)); } - #[test] - fn str_replace() { - let mut strutils = Str::new(); - strutils.for_replace(ReplaceAction::Direct); - strutils.replace_with("robalino"); - assert_eq!(strutils.apply("andres").unwrap(), Value::string("robalino")); - } - - #[test] - fn str_find_replace() { - let mut strutils = Str::new(); - strutils.for_replace(ReplaceAction::FindAndReplace); - strutils.find_with(r"kittens"); - strutils.replace_with("jotandrehuda"); - assert_eq!( - strutils.apply("wykittens").unwrap(), - Value::string("wyjotandrehuda") - ); - } - #[test] fn str_plugin_applies_upcase_with_field() { let mut plugin = Str::new(); @@ -604,114 +484,4 @@ mod tests { _ => {} } } - - #[test] - fn str_plugin_applies_replace_with_field() { - let mut plugin = Str::new(); - - assert!(plugin - .begin_filter( - CallStub::new() - .with_parameter("rustconf") - .with_parameter("22nd August 2019") - .with_long_flag("replace") - .create() - ) - .is_ok()); - - let subject = structured_sample_record("rustconf", "1st January 1970"); - let output = plugin.filter(subject).unwrap(); - - match output[0].as_ref().unwrap() { - ReturnSuccess::Value(Tagged { - item: Value::Row(o), - .. - }) => assert_eq!( - *o.get_data(&String::from("rustconf")).borrow(), - Value::string(String::from("22nd August 2019")) - ), - _ => {} - } - } - - #[test] - fn str_plugin_applies_replace_without_field() { - let mut plugin = Str::new(); - - assert!(plugin - .begin_filter( - CallStub::new() - .with_parameter("22nd August 2019") - .with_long_flag("replace") - .create() - ) - .is_ok()); - - let subject = unstructured_sample_record("1st January 1970"); - let output = plugin.filter(subject).unwrap(); - - match output[0].as_ref().unwrap() { - ReturnSuccess::Value(Tagged { - item: Value::Primitive(Primitive::String(s)), - .. - }) => assert_eq!(*s, String::from("22nd August 2019")), - _ => {} - } - } - - #[test] - fn str_plugin_applies_find_replace_with_field() { - let mut plugin = Str::new(); - - assert!(plugin - .begin_filter( - CallStub::new() - .with_parameter("staff") - .with_parameter("kittens") - .with_parameter("jotandrehuda") - .with_long_flag("find-replace") - .create() - ) - .is_ok()); - - let subject = structured_sample_record("staff", "wykittens"); - let output = plugin.filter(subject).unwrap(); - - match output[0].as_ref().unwrap() { - ReturnSuccess::Value(Tagged { - item: Value::Row(o), - .. - }) => assert_eq!( - *o.get_data(&String::from("staff")).borrow(), - Value::string(String::from("wyjotandrehuda")) - ), - _ => {} - } - } - - #[test] - fn str_plugin_applies_find_replace_without_field() { - let mut plugin = Str::new(); - - assert!(plugin - .begin_filter( - CallStub::new() - .with_parameter("kittens") - .with_parameter("jotandrehuda") - .with_long_flag("find-replace") - .create() - ) - .is_ok()); - - let subject = unstructured_sample_record("wykittens"); - let output = plugin.filter(subject).unwrap(); - - match output[0].as_ref().unwrap() { - ReturnSuccess::Value(Tagged { - item: Value::Primitive(Primitive::String(s)), - .. - }) => assert_eq!(*s, String::from("wyjotandrehuda")), - _ => {} - } - } } diff --git a/tests/filter_str_tests.rs b/tests/filter_str_tests.rs index e26a18850..55563c2fa 100644 --- a/tests/filter_str_tests.rs +++ b/tests/filter_str_tests.rs @@ -11,7 +11,7 @@ fn can_only_apply_one() { ); assert!( - actual.contains("Usage: str field [--downcase|--upcase|--to-int|--replace|--find-replace]") + actual.contains("Usage: str field [--downcase|--upcase|--to-int") ); } @@ -91,79 +91,4 @@ fn converts_to_int() { )); assert_eq!(actual, "2509000000"); -} - -#[test] -fn replaces() { - Playground::setup("plugin_str_test_4", |dirs, sandbox| { - sandbox.with_files(vec![FileWithContent( - "sample.toml", - r#" - [package] - name = "nushell" - "#, - )]); - - let actual = nu!( - cwd: dirs.test(), h::pipeline( - r#" - open sample.toml - | str package.name --replace wykittenshell - | get package.name - | echo $it - "# - )); - - assert_eq!(actual, "wykittenshell"); - }) -} - -#[test] -fn find_and_replaces() { - Playground::setup("plugin_str_test_5", |dirs, sandbox| { - sandbox.with_files(vec![FileWithContent( - "sample.toml", - r#" - [fortune.teller] - phone = "1-800-KATZ" - "#, - )]); - - let actual = nu!( - cwd: dirs.test(), h::pipeline( - r#" - open sample.toml - | str fortune.teller.phone --find-replace KATZ "5289" - | get fortune.teller.phone - | echo $it - "# - )); - - assert_eq!(actual, "1-800-5289"); - }) -} - -#[test] -fn find_and_replaces_without_passing_field() { - Playground::setup("plugin_str_test_6", |dirs, sandbox| { - sandbox.with_files(vec![FileWithContent( - "sample.toml", - r#" - [fortune.teller] - phone = "1-800-KATZ" - "#, - )]); - - let actual = nu!( - cwd: dirs.test(), h::pipeline( - r#" - open sample.toml - | get fortune.teller.phone - | str --find-replace KATZ "5289" - | echo $it - "# - )); - - assert_eq!(actual, "1-800-5289"); - }) -} +} \ No newline at end of file From c57c0eb371935a00884d91ffad73161db6d0f43b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20N=2E=20Robalino?= Date: Wed, 11 Sep 2019 22:34:47 -0500 Subject: [PATCH 07/10] pass lint checks. --- src/cli.rs | 30 +++++++++++++++++++++++------- tests/filter_str_tests.rs | 6 ++---- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 6d0211907..461524f49 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -122,7 +122,6 @@ fn search_paths() -> Vec { let mut path = std::path::PathBuf::from("."); path.push("target"); path.push("release"); - search_paths.push(path); } @@ -137,9 +136,17 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { }; for path in search_paths() { - let pattern = path.join("nu_plugin_[a-z][a-z]*").clone(); + let mut pattern = path.to_path_buf(); - trace!("Trying {:?}", pattern.display()); + #[cfg(windows)] + { + pattern.push(std::path::Path::new("nu_plugin_[a-z]*.[a-z]*")); + } + + #[cfg(not(windows))] + { + pattern.push(std::path::Path::new("nu_plugin_[a-z]*")); + } match glob::glob_with(&pattern.to_string_lossy(), opts) { Err(_) => {} @@ -149,9 +156,16 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { continue; } - trace!("Found {:?}", bin.display()); - - let bin_name = bin.file_name().unwrap().to_string_lossy(); + let bin_name = { + if let Some(name) = bin.file_name() { + match name.to_str() { + Some(raw) => raw, + None => continue, + } + } else { + continue; + } + }; let is_valid_name = bin_name .chars() @@ -160,7 +174,8 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { let is_executable = { #[cfg(windows)] { - bin_name.ends_with(".exe") || bin_name.ends_with(".bat") + bin.ends_with(std::path::Path::new(".exe")) + || bin.ends_with(std::path::Path::new(".bat")) } #[cfg(not(windows))] @@ -170,6 +185,7 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { }; if is_valid_name && is_executable { + trace!("Trying {:?}", bin.display()); load_plugin(&bin, context)?; } } diff --git a/tests/filter_str_tests.rs b/tests/filter_str_tests.rs index 55563c2fa..9f92186fa 100644 --- a/tests/filter_str_tests.rs +++ b/tests/filter_str_tests.rs @@ -10,9 +10,7 @@ fn can_only_apply_one() { "open caco3_plastics.csv | first 1 | str origin --downcase --upcase" ); - assert!( - actual.contains("Usage: str field [--downcase|--upcase|--to-int") - ); + assert!(actual.contains("Usage: str field [--downcase|--upcase|--to-int")); } #[test] @@ -91,4 +89,4 @@ fn converts_to_int() { )); assert_eq!(actual, "2509000000"); -} \ No newline at end of file +} From e4ed8c94addcd983996ac8d96af6d4d9a6b13171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20N=2E=20Robalino?= Date: Thu, 12 Sep 2019 02:11:38 -0500 Subject: [PATCH 08/10] dot character is valid in Windows plugin binaries. --- src/cli.rs | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 461524f49..c3b3eaeb5 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -138,15 +138,7 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { for path in search_paths() { let mut pattern = path.to_path_buf(); - #[cfg(windows)] - { - pattern.push(std::path::Path::new("nu_plugin_[a-z]*.[a-z]*")); - } - - #[cfg(not(windows))] - { - pattern.push(std::path::Path::new("nu_plugin_[a-z]*")); - } + pattern.push(std::path::Path::new("nu_plugin_[a-z]*")); match glob::glob_with(&pattern.to_string_lossy(), opts) { Err(_) => {} @@ -167,15 +159,26 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { } }; - let is_valid_name = bin_name - .chars() - .all(|c| c.is_ascii_alphabetic() || c == '_'); + let is_valid_name = { + #[cfg(windows)] + { + bin_name + .chars() + .all(|c| c.is_ascii_alphabetic() || c == '_' || c == '.') + } + + #[cfg(not(windows))] + { + bin_name + .chars() + .all(|c| c.is_ascii_alphabetic() || c == '_') + } + }; let is_executable = { #[cfg(windows)] { - bin.ends_with(std::path::Path::new(".exe")) - || bin.ends_with(std::path::Path::new(".bat")) + bin_name.ends_with(".exe") || bin_name.ends_with(".bat") } #[cfg(not(windows))] From 7838dac68947f5f68258ca496f23bd2c2654cdb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20N=2E=20Robalino?= Date: Thu, 12 Sep 2019 05:22:58 -0500 Subject: [PATCH 09/10] first and get coverage. --- src/commands/get.rs | 18 ++++++- tests/commands_test.rs | 113 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/src/commands/get.rs b/src/commands/get.rs index 7f9c4f521..19b5463d8 100644 --- a/src/commands/get.rs +++ b/src/commands/get.rs @@ -7,6 +7,7 @@ pub struct Get; #[derive(Deserialize)] pub struct GetArgs { + member: Tagged, rest: Vec>, } @@ -16,7 +17,9 @@ impl WholeStreamCommand for Get { } fn signature(&self) -> Signature { - Signature::build("get").rest(SyntaxType::Member) + Signature::build("get") + .required("member", SyntaxType::Member) + .rest(SyntaxType::Member) } fn usage(&self) -> &str { @@ -63,13 +66,24 @@ fn get_member(path: &Tagged, obj: &Tagged) -> Result Result { let stream = input .values .map(move |item| { let mut result = VecDeque::new(); + + let member = vec![member.clone()]; + + let fields = vec![&member, &fields] + .into_iter() + .flatten() + .collect::>>(); + for field in &fields { match get_member(field, &item) { Ok(Tagged { diff --git a/tests/commands_test.rs b/tests/commands_test.rs index 5188aee0a..30636eafc 100644 --- a/tests/commands_test.rs +++ b/tests/commands_test.rs @@ -3,6 +3,119 @@ mod helpers; use helpers as h; use helpers::{Playground, Stub::*}; +#[test] +fn first_gets_first_rows_by_amount() { + Playground::setup("first_test_1", |dirs, sandbox| { + sandbox.with_files(vec![ + EmptyFile("los.1.txt"), + EmptyFile("tres.1.txt"), + EmptyFile("amigos.1.txt"), + EmptyFile("arepas.1.clu"), + ]); + + let actual = nu!( + cwd: dirs.test(), h::pipeline( + r#" + ls + | get name + | first 2 + | split-column "." + | get Column2 + | str --to-int + | sum + | echo $it + "# + )); + + assert_eq!(actual, "2"); + }) +} + +#[test] +fn first_requires_an_amount() { + Playground::setup("first_test_2", |dirs, _| { + let actual = nu_error!( + cwd: dirs.test(), "ls | first" + ); + + assert!(actual.contains("requires amount parameter")); + }) +} + +#[test] +fn get() { + Playground::setup("get_test_1", |dirs, sandbox| { + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" + nu_party_venue = "zion" + "#, + )]); + + let actual = nu!( + cwd: dirs.test(), h::pipeline( + r#" + open sample.toml + | get nu_party_venue + | echo $it + "# + )); + + assert_eq!(actual, "zion"); + }) +} + +#[test] +fn get_more_than_one_member() { + Playground::setup("get_test_2", |dirs, sandbox| { + sandbox.with_files(vec![FileWithContent( + "sample.toml", + r#" + [[fortune_tellers]] + name = "Andrés N. Robalino" + arepas = 1 + broken_builds = 0 + + [[fortune_tellers]] + name = "Jonathan Turner" + arepas = 1 + broken_builds = 1 + + [[fortune_tellers]] + name = "Yehuda Katz" + arepas = 1 + broken_builds = 1 + "#, + )]); + + let actual = nu!( + cwd: dirs.test(), h::pipeline( + r#" + open sample.toml + | get fortune_tellers + | get arepas broken_builds + | sum + | echo $it + "# + )); + + assert_eq!(actual, "5"); + }) +} + +#[test] +fn get_requires_at_least_one_member() { + Playground::setup("first_test_3", |dirs, sandbox| { + sandbox.with_files(vec![EmptyFile("andres.txt")]); + + let actual = nu_error!( + cwd: dirs.test(), "ls | get" + ); + + assert!(actual.contains("requires member parameter")); + }) +} + #[test] fn lines() { let actual = nu!( From c2eefece0e2e7f49d0fc29cebe6739e76234559f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20N=2E=20Robalino?= Date: Thu, 12 Sep 2019 06:12:19 -0500 Subject: [PATCH 10/10] Remove warnings. --- src/commands/get.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/get.rs b/src/commands/get.rs index 19b5463d8..2de6c7a01 100644 --- a/src/commands/get.rs +++ b/src/commands/get.rs @@ -67,7 +67,7 @@ fn get_member(path: &Tagged, obj: &Tagged) -> Result