-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3827 from epage/unstable
fix(derive): Switch default action/parser for `unstable-v4`
- Loading branch information
Showing
44 changed files
with
5,506 additions
and
101 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
#![allow(deprecated)] | ||
#![cfg(not(feature = "unstable-v4"))] | ||
|
||
mod app_from_crate; | ||
mod app_settings; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
#![allow(deprecated)] | ||
#![cfg(not(feature = "unstable-v4"))] | ||
|
||
mod app_name; | ||
mod arg_enum; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
use clap::CommandFactory; | ||
use clap::Parser; | ||
#[test] | ||
fn app_name_in_short_help_from_struct() { | ||
#[derive(Parser)] | ||
#[clap(name = "my-cmd")] | ||
struct MyApp {} | ||
|
||
let mut help = Vec::new(); | ||
MyApp::command().write_help(&mut help).unwrap(); | ||
let help = String::from_utf8(help).unwrap(); | ||
|
||
assert!(help.contains("my-cmd")); | ||
} | ||
|
||
#[test] | ||
fn app_name_in_long_help_from_struct() { | ||
#[derive(Parser)] | ||
#[clap(name = "my-cmd")] | ||
struct MyApp {} | ||
|
||
let mut help = Vec::new(); | ||
MyApp::command().write_long_help(&mut help).unwrap(); | ||
let help = String::from_utf8(help).unwrap(); | ||
|
||
assert!(help.contains("my-cmd")); | ||
} | ||
|
||
#[test] | ||
fn app_name_in_short_help_from_enum() { | ||
#[derive(Parser)] | ||
#[clap(name = "my-cmd")] | ||
enum MyApp {} | ||
|
||
let mut help = Vec::new(); | ||
MyApp::command().write_help(&mut help).unwrap(); | ||
let help = String::from_utf8(help).unwrap(); | ||
|
||
assert!(help.contains("my-cmd")); | ||
} | ||
|
||
#[test] | ||
fn app_name_in_long_help_from_enum() { | ||
#[derive(Parser)] | ||
#[clap(name = "my-cmd")] | ||
enum MyApp {} | ||
|
||
let mut help = Vec::new(); | ||
MyApp::command().write_long_help(&mut help).unwrap(); | ||
let help = String::from_utf8(help).unwrap(); | ||
|
||
assert!(help.contains("my-cmd")); | ||
} | ||
|
||
#[test] | ||
fn app_name_in_short_version_from_struct() { | ||
#[derive(Parser)] | ||
#[clap(name = "my-cmd")] | ||
struct MyApp {} | ||
|
||
let version = MyApp::command().render_version(); | ||
|
||
assert!(version.contains("my-cmd")); | ||
} | ||
|
||
#[test] | ||
fn app_name_in_long_version_from_struct() { | ||
#[derive(Parser)] | ||
#[clap(name = "my-cmd")] | ||
struct MyApp {} | ||
|
||
let version = MyApp::command().render_long_version(); | ||
|
||
assert!(version.contains("my-cmd")); | ||
} | ||
|
||
#[test] | ||
fn app_name_in_short_version_from_enum() { | ||
#[derive(Parser)] | ||
#[clap(name = "my-cmd")] | ||
enum MyApp {} | ||
|
||
let version = MyApp::command().render_version(); | ||
|
||
assert!(version.contains("my-cmd")); | ||
} | ||
|
||
#[test] | ||
fn app_name_in_long_version_from_enum() { | ||
#[derive(Parser)] | ||
#[clap(name = "my-cmd")] | ||
enum MyApp {} | ||
|
||
let version = MyApp::command().render_long_version(); | ||
|
||
assert!(version.contains("my-cmd")); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>, | ||
// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and | ||
// Ana Hobden (@hoverbear) <operator@hoverbear.org> | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
// | ||
// This work was derived from Structopt (https://github.com/TeXitoi/structopt) | ||
// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the | ||
// MIT/Apache 2.0 license. | ||
|
||
use clap::CommandFactory; | ||
use clap::Parser; | ||
|
||
#[test] | ||
fn required_argument() { | ||
#[derive(Parser, PartialEq, Debug)] | ||
struct Opt { | ||
arg: i32, | ||
} | ||
assert_eq!( | ||
Opt { arg: 42 }, | ||
Opt::try_parse_from(&["test", "42"]).unwrap() | ||
); | ||
assert!(Opt::try_parse_from(&["test"]).is_err()); | ||
assert!(Opt::try_parse_from(&["test", "42", "24"]).is_err()); | ||
} | ||
|
||
#[test] | ||
fn argument_with_default() { | ||
#[derive(Parser, PartialEq, Debug)] | ||
struct Opt { | ||
#[clap(default_value = "42")] | ||
arg: i32, | ||
} | ||
assert_eq!( | ||
Opt { arg: 24 }, | ||
Opt::try_parse_from(&["test", "24"]).unwrap() | ||
); | ||
assert_eq!(Opt { arg: 42 }, Opt::try_parse_from(&["test"]).unwrap()); | ||
assert!(Opt::try_parse_from(&["test", "42", "24"]).is_err()); | ||
} | ||
|
||
#[test] | ||
fn auto_value_name() { | ||
#[derive(Parser, PartialEq, Debug)] | ||
struct Opt { | ||
my_special_arg: i32, | ||
} | ||
|
||
let mut help = Vec::new(); | ||
Opt::command().write_help(&mut help).unwrap(); | ||
let help = String::from_utf8(help).unwrap(); | ||
|
||
assert!(help.contains("MY_SPECIAL_ARG")); | ||
// Ensure the implicit `num_vals` is just 1 | ||
assert_eq!( | ||
Opt { my_special_arg: 10 }, | ||
Opt::try_parse_from(&["test", "10"]).unwrap() | ||
); | ||
} | ||
|
||
#[test] | ||
fn explicit_value_name() { | ||
#[derive(Parser, PartialEq, Debug)] | ||
struct Opt { | ||
#[clap(value_name = "BROWNIE_POINTS")] | ||
my_special_arg: i32, | ||
} | ||
|
||
let mut help = Vec::new(); | ||
Opt::command().write_help(&mut help).unwrap(); | ||
let help = String::from_utf8(help).unwrap(); | ||
|
||
assert!(help.contains("BROWNIE_POINTS")); | ||
assert!(!help.contains("MY_SPECIAL_ARG")); | ||
// Ensure the implicit `num_vals` is just 1 | ||
assert_eq!( | ||
Opt { my_special_arg: 10 }, | ||
Opt::try_parse_from(&["test", "10"]).unwrap() | ||
); | ||
} | ||
|
||
#[test] | ||
fn option_type_is_optional() { | ||
#[derive(Parser, PartialEq, Debug)] | ||
struct Opt { | ||
arg: Option<i32>, | ||
} | ||
assert_eq!( | ||
Opt { arg: Some(42) }, | ||
Opt::try_parse_from(&["test", "42"]).unwrap() | ||
); | ||
assert_eq!(Opt { arg: None }, Opt::try_parse_from(&["test"]).unwrap()); | ||
assert!(Opt::try_parse_from(&["test", "42", "24"]).is_err()); | ||
} | ||
|
||
#[test] | ||
fn vec_type_is_multiple_values() { | ||
#[derive(Parser, PartialEq, Debug)] | ||
struct Opt { | ||
arg: Vec<i32>, | ||
} | ||
assert_eq!( | ||
Opt { arg: vec![24] }, | ||
Opt::try_parse_from(&["test", "24"]).unwrap() | ||
); | ||
assert_eq!(Opt { arg: vec![] }, Opt::try_parse_from(&["test"]).unwrap()); | ||
assert_eq!( | ||
Opt { arg: vec![24, 42] }, | ||
Opt::try_parse_from(&["test", "24", "42"]).unwrap() | ||
); | ||
assert_eq!( | ||
clap::ErrorKind::ValueValidation, | ||
Opt::try_parse_from(&["test", "NOPE"]).err().unwrap().kind() | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>, | ||
// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and | ||
// Ana Hobden (@hoverbear) <operator@hoverbear.org> | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
// | ||
// This work was derived from Structopt (https://github.com/TeXitoi/structopt) | ||
// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the | ||
// MIT/Apache 2.0 license. | ||
|
||
use crate::utils; | ||
|
||
use clap::Parser; | ||
|
||
#[test] | ||
fn no_author_version_about() { | ||
#[derive(Parser, PartialEq, Debug)] | ||
#[clap(name = "foo")] | ||
struct Opt {} | ||
|
||
let output = utils::get_long_help::<Opt>(); | ||
assert!(output.starts_with("foo \n\nUSAGE:")); | ||
} | ||
|
||
#[test] | ||
fn use_env() { | ||
#[derive(Parser, PartialEq, Debug)] | ||
#[clap(author, about, version)] | ||
struct Opt {} | ||
|
||
let output = utils::get_long_help::<Opt>(); | ||
assert!(output.starts_with("clap")); | ||
assert!(output | ||
.contains("A simple to use, efficient, and full-featured Command Line Argument Parser")); | ||
} | ||
|
||
#[test] | ||
fn explicit_version_not_str_lit() { | ||
const VERSION: &str = "custom version"; | ||
|
||
#[derive(Parser)] | ||
#[clap(version = VERSION)] | ||
pub struct Opt {} | ||
|
||
let output = utils::get_long_help::<Opt>(); | ||
assert!(output.contains("custom version")); | ||
} |
Oops, something went wrong.