diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2e69b014..d609d1b1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,11 @@
## Unreleased
TODO: Structopt and traits
-TODO: `Shell`, `YamlLoader`
+TODO: `YamlLoader`
TODO: `cargo`, `std` features
+
+## v3.0.0-rc.0
#### Minimum Required Rust
* As of this release, `clap` requires `rustc 1.46.0` or greater.
@@ -21,21 +23,46 @@ TODO: `cargo`, `std` features
* **ErrorKind**
* `ErrorKind::MissingArgumentOrSubcommand` => `ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand`
* **Changed**
- * `Arg::env` & `Arg::env_os` does not set `ArgSettings::TakesValue` anymore
+ * Allowing empty values is the default again with `ArgSettings::AllowEmptyValues` changing to
+ `ArgSettings::ForbidEmptyValues`
+ * `Arg::env`, `Arg::env_os`, `Arg::last`, `Arg::require_equals`, `Arg::allow_hyphen_values`,
+ `Arg::hide_possible_values`, `Arg::hide_default_value`, `Arg::hide_env_values`,
+ `Arg::case_insensitive` and `Arg::multiple_values` does not set `ArgSettings::TakesValue` anymore
+ * `Arg::require_delimiter` does not set `ArgSettings::TakesValue` and `ArgSettings::UseValueDelimiter` anymore
+ * `Arg::require_equals` does not disallow empty values anymore
+ * `Arg::default_value_if`, `Arg::default_value_if_os`, `Arg::default_value_ifs`,
+ `Arg::default_value_ifs_os` now takes the default value parameter as an option
+ * `Arg::index`, `Arg::number_of_values`, `Arg::min_values`, `Arg::max_values` now takes `usize`
* `@group` in `clap_app!` now needs `:` instead of `=>`
#### Features
+* **Added**
+ * `clap_generate::Shell`
* **Added Methods**
* **App**
* `App::license`
+ * `App::get_long_about`
+ * `App::get_env`
+ * `App::get_default_values`
* **Arg**
* `Arg::hide_env`
+ * `Arg::required_if_eq_all`
+ * `Arg::forbid_empty_values`
+ * **ArgMatches**
+ * `ArgMatches::grouped_values_of`
* **Macros**
* `crate_license!`
+ * **Error**
+ * `Error::print`
* **Added Settings**
* `ArgSettings::HideEnv`
+#### Enhancements
+
+* Better completion scripts
+* Multiple bug fixes, performance improvements and error message improvements
+
## v3.0.0-beta.2 (2020-09-18)
@@ -120,6 +147,7 @@ TODO: `cargo`, `std` features
* `SubCommand` in favor of `App`
* `SubCommand::with_name` => `App::new`
* `SubCommand::from_yaml` => `App::from`
+ * `Shell` (changed again in 3.0.0-rc.0)
* **App**
* `App::with_defaults`
* `App::version_message` in favor of `App::mut_arg`
@@ -127,14 +155,14 @@ TODO: `cargo`, `std` features
* `App::help_message` in favor of `App::mut_arg`
* `App::help_short` in favor of `App::mut_arg`
* `App::arg_from_usage` in favor of `App::arg`
- * `App::args_from_usage` in favor of `App::args(usage.lines().map(|l| l.trim()).filter(|l| !l.is_empty()))`
- * `App::gen_completions` in favor of TODO:
- * `App::gen_completions_to` in favor of TODO:
+ * `App::args_from_usage` in favor of `App::args`
* `App::settings` in favor of `App::setting(Setting1 | Setting2)`
* `App::unset_settings` in favor of `App::unset_setting(Setting1 | Setting2)`
* `App::global_settings` in favor of `App::global_setting(Setting1 | Setting2)`
+ * `App::gen_completions` in favor of TODO:
+ * `App::gen_completions_to` in favor of TODO:
* **Arg**
- * `Arg::empty_values` in favor of TODO:
+ * `Arg::empty_values`
* **ArgMatches**
* `ArgMatches::usage` in favor of `App::generate_usage`
* **Macros**
@@ -178,9 +206,9 @@ TODO: `cargo`, `std` features
* Removed support for `{n}` in help text
* In usage parser, for options `[name]... --option [val]` results in `ArgSettings::MultipleOccurrences`
but `--option [val]...` results in `ArgSettings::MultipleValues` *and* `ArgSettings::MultipleOccurrences`.
- Before both resulted in the same thing
+ Before both resulted in the same thing.
* `App` and `Arg` now need only one lifetime
-* Allowing empty values is no longer the default
+* Allowing empty values is no longer the default (changed again in 3.0.0-rc.0)
* `UseValueDelimiter` is no longer the default
* `App::override_usage` no longer implies `\t` which allows multi lined usages
@@ -199,7 +227,7 @@ TODO: `cargo`, `std` features
* `Arg::multiple_values`
* `Arg::multiple_occurrences`
* `Arg::help_heading`
- * `Arg::settings`
+ * `Arg::settings` (changed again in 3.0.0-rc.0)
* **Added Settings**
* `AppSettings::HelpRequired`
* `AppSettings::NoAutoHelp`
diff --git a/clap_up/src/lib.rs b/clap_up/src/lib.rs
index a1f1215b..ee87ec79 100644
--- a/clap_up/src/lib.rs
+++ b/clap_up/src/lib.rs
@@ -1,4 +1,10 @@
-use cargo_up::{ra_ap_syntax::ast, Runner, Semantics, Upgrader, Version};
+use cargo_up::{
+ ra_ap_syntax::{
+ ast::{ArgListOwner, CallExpr},
+ AstNode,
+ },
+ Runner, Version,
+};
pub fn runner() -> Runner {
Runner::new()
@@ -52,6 +58,7 @@ pub fn runner() -> Runner {
&[
["from_yaml", "from"],
["arg_from_usage", "arg"],
+ ["args_from_usage", "args"],
["help", "override_help"],
["usage", "override_usage"],
["template", "help_template"],
@@ -59,6 +66,11 @@ pub fn runner() -> Runner {
["get_matches_from_safe", "try_get_matches_from"],
["get_matches_from_safe_borrow", "try_get_matches_from_mut"],
["set_term_width", "term_width"],
+ ["with_defaults", "new"],
+ ["version_message", "mut_arg"],
+ ["version_short", "mut_arg"],
+ ["help_message", "mut_arg"],
+ ["help_short", "mut_arg"],
],
)
.rename_methods(
@@ -86,17 +98,67 @@ pub fn runner() -> Runner {
&[["from_yaml", "from"], ["with_name", "new"]],
)
.rename_members("clap::errors::Error", &[["message", "cause"]]) // TODO: check
- .hook_method_call_expr(&print_method_calls),
+ .hook_method_call_expr_on("clap::app::App", "args_from_usage", |u, n, _| {
+ let arg = n.arg_list().unwrap().args().last();
+
+ u.insert(
+ arg.unwrap().syntax().text_range().end(),
+ ".lines().map(|l| l.trim()).filter(|l| !l.is_empty())",
+ );
+ })
+ .hook_path_expr_on("clap::app::App", "with_defaults", |u, n, _| {
+ if let Some(parent) = n.syntax().parent() {
+ if let Some(call_expr) = CallExpr::cast(parent) {
+ // TODO: Add full path
+ u.insert(
+ call_expr.syntax().text_range().end(),
+ ".author(crate_authors!()).version(crate_version!())",
+ );
+ }
+ }
+ })
+ .hook_method_call_expr_on("clap::app::App", "version_message", |u, n, _| {
+ let arg_list = n.arg_list().unwrap();
+
+ u.insert(
+ arg_list.l_paren_token().unwrap().text_range().end(),
+ "\"version\", |a| a.about(",
+ );
+ u.insert(arg_list.r_paren_token().unwrap().text_range().start(), ")")
+ })
+ .hook_method_call_expr_on("clap::app::App", "version_short", |u, n, _| {
+ let arg_list = n.arg_list().unwrap();
+
+ u.insert(
+ arg_list.l_paren_token().unwrap().text_range().end(),
+ "\"version\", |a| a.short(",
+ );
+ u.insert(
+ arg_list.r_paren_token().unwrap().text_range().start(),
+ ".trim_start_matches(|c| c == '-').chars().nth(0).unwrap_or('V'))",
+ )
+ })
+ .hook_method_call_expr_on("clap::app::App", "help_message", |u, n, _| {
+ let arg_list = n.arg_list().unwrap();
+
+ u.insert(
+ arg_list.l_paren_token().unwrap().text_range().end(),
+ "\"help\", |a| a.about(",
+ );
+ u.insert(arg_list.r_paren_token().unwrap().text_range().start(), ")")
+ })
+ .hook_method_call_expr_on("clap::app::App", "help_short", |u, n, _| {
+ let arg_list = n.arg_list().unwrap();
+
+ u.insert(
+ arg_list.l_paren_token().unwrap().text_range().end(),
+ "\"help\", |a| a.short(",
+ );
+ u.insert(
+ arg_list.r_paren_token().unwrap().text_range().start(),
+ ".trim_start_matches(|c| c == '-').chars().nth(0).unwrap_or('h'))",
+ )
+ }),
)
.version(Version::new("3.0.0").unwrap())
}
-
-fn print_method_calls(
- upgrader: &mut Upgrader,
- method_call_expr: &ast::MethodCallExpr,
- semantics: &Semantics,
-) {
- if let Some(name_ref) = method_call_expr.name_ref() {
- // println!("method: {}", name_ref.text());
- }
-}