Bump clap to 4.0.x and adjust to best practices (#12381)

* Bump clap to 3.2.22

* Replace `from_os_str` with `value_parser`

* Replace `from_str` and `try_from_str` with `value_parser`

* Move possible_values to the new format

* Remove unwanted print

* Add missing match branch

* Update clap to 4.0.9 and make it compile

* Replace deprecated `clap` macro with `command` and `value`

* Move remaining `clap` attributes to `arg`

* Remove no-op value_parsers

* Adjust value_parser for state_version

* Remove "deprecated" feature flag and bump to 4.0.11

* Improve range

Co-authored-by: Bastian Köcher <git@kchr.de>

* Apply suggestions

* Trigger CI

* Fix unused error warning

* Fix doc errors

* Fix ArgGroup naming conflict

* Change default_value to default_value_t

* Use 1.. instead of 0..

Co-authored-by: Bastian Köcher <git@kchr.de>
This commit is contained in:
Sebastian Kunert
2022-10-18 08:52:46 +02:00
committed by GitHub
parent ca15fe7e3d
commit f687db40f7
70 changed files with 434 additions and 443 deletions
@@ -43,15 +43,15 @@ const LOG_TARGET: &'static str = "benchmark::block::weight";
#[derive(Debug, Default, Serialize, Clone, PartialEq, Args)]
pub struct BenchmarkParams {
/// Number of the first block to consider.
#[clap(long)]
#[arg(long)]
pub from: u32,
/// Last block number to consider.
#[clap(long)]
#[arg(long)]
pub to: u32,
/// Number of times that the benchmark should be repeated for each block.
#[clap(long, default_value = "10")]
#[arg(long, default_value_t = 10)]
pub repeat: u32,
}
@@ -71,7 +71,7 @@ pub struct BlockCmd {
/// Enable the Trie cache.
///
/// This should only be used for performance analysis and not for final results.
#[clap(long)]
#[arg(long)]
pub enable_trie_cache: bool,
}
@@ -43,17 +43,17 @@ use crate::shared::{StatSelect, Stats};
#[derive(Debug, Default, Serialize, Clone, PartialEq, Args)]
pub struct BenchmarkParams {
/// Rounds of warmups before measuring.
#[clap(long, default_value = "10")]
#[arg(long, default_value_t = 10)]
pub warmup: u32,
/// How many times the benchmark should be repeated.
#[clap(long, default_value = "100")]
#[arg(long, default_value_t = 100)]
pub repeat: u32,
/// Maximal number of extrinsics that should be put into a block.
///
/// Only useful for debugging.
#[clap(long)]
#[arg(long)]
pub max_ext_per_block: Option<u32>,
}
@@ -62,21 +62,21 @@ pub struct ExtrinsicParams {
/// List all available pallets and extrinsics.
///
/// The format is CSV with header `pallet, extrinsic`.
#[clap(long)]
#[arg(long)]
pub list: bool,
/// Pallet name of the extrinsic to benchmark.
#[clap(long, value_name = "PALLET", required_unless_present = "list")]
#[arg(long, value_name = "PALLET", required_unless_present = "list")]
pub pallet: Option<String>,
/// Extrinsic to benchmark.
#[clap(long, value_name = "EXTRINSIC", required_unless_present = "list")]
#[arg(long, value_name = "EXTRINSIC", required_unless_present = "list")]
pub extrinsic: Option<String>,
/// Enable the Trie cache.
///
/// This should only be used for performance analysis and not for final results.
#[clap(long)]
#[arg(long)]
pub enable_trie_cache: bool,
}
@@ -53,30 +53,30 @@ pub struct MachineCmd {
/// Do not return an error if any check fails.
///
/// Should only be used for debugging.
#[clap(long)]
#[arg(long)]
pub allow_fail: bool,
/// Set a fault tolerance for passing a requirement.
///
/// 10% means that the test would pass even when only 90% score was archived.
/// Can be used to mitigate outliers of the benchmarks.
#[clap(long, default_value = "10.0", value_name = "PERCENT")]
#[arg(long, default_value_t = 10.0, value_name = "PERCENT")]
pub tolerance: f64,
/// Time limit for the verification benchmark.
#[clap(long, default_value = "5.0", value_name = "SECONDS")]
#[arg(long, default_value_t = 5.0, value_name = "SECONDS")]
pub verify_duration: f32,
/// Time limit for the hash function benchmark.
#[clap(long, default_value = "5.0", value_name = "SECONDS")]
#[arg(long, default_value_t = 5.0, value_name = "SECONDS")]
pub hash_duration: f32,
/// Time limit for the memory benchmark.
#[clap(long, default_value = "5.0", value_name = "SECONDS")]
#[arg(long, default_value_t = 5.0, value_name = "SECONDS")]
pub memory_duration: f32,
/// Time limit for each disk benchmark.
#[clap(long, default_value = "5.0", value_name = "SECONDS")]
#[arg(long, default_value_t = 5.0, value_name = "SECONDS")]
pub disk_duration: f32,
}
@@ -73,13 +73,13 @@ pub struct OverheadParams {
/// Add a header to the generated weight output file.
///
/// Good for adding LICENSE headers.
#[clap(long, value_name = "PATH")]
#[arg(long, value_name = "PATH")]
pub header: Option<PathBuf>,
/// Enable the Trie cache.
///
/// This should only be used for performance analysis and not for final results.
#[clap(long)]
#[arg(long)]
pub enable_trie_cache: bool,
}
@@ -27,69 +27,69 @@ use std::{fmt::Debug, path::PathBuf};
// Add a more relaxed parsing for pallet names by allowing pallet directory names with `-` to be
// used like crate names with `_`
fn parse_pallet_name(pallet: &str) -> String {
pallet.replace("-", "_")
fn parse_pallet_name(pallet: &str) -> std::result::Result<String, String> {
Ok(pallet.replace("-", "_"))
}
/// Benchmark the extrinsic weight of FRAME Pallets.
#[derive(Debug, clap::Parser)]
pub struct PalletCmd {
/// Select a FRAME Pallet to benchmark, or `*` for all (in which case `extrinsic` must be `*`).
#[clap(short, long, parse(from_str = parse_pallet_name), required_unless_present_any = ["list", "json-input"])]
#[arg(short, long, value_parser = parse_pallet_name, required_unless_present_any = ["list", "json_input"])]
pub pallet: Option<String>,
/// Select an extrinsic inside the pallet to benchmark, or `*` for all.
#[clap(short, long, required_unless_present_any = ["list", "json-input"])]
#[arg(short, long, required_unless_present_any = ["list", "json_input"])]
pub extrinsic: Option<String>,
/// Select how many samples we should take across the variable components.
#[clap(short, long, default_value = "2")]
#[arg(short, long, default_value_t = 2)]
pub steps: u32,
/// Indicates lowest values for each of the component ranges.
#[clap(long = "low", use_value_delimiter = true)]
#[arg(long = "low", value_delimiter = ',')]
pub lowest_range_values: Vec<u32>,
/// Indicates highest values for each of the component ranges.
#[clap(long = "high", use_value_delimiter = true)]
#[arg(long = "high", value_delimiter = ',')]
pub highest_range_values: Vec<u32>,
/// Select how many repetitions of this benchmark should run from within the wasm.
#[clap(short, long, default_value = "1")]
#[arg(short, long, default_value_t = 1)]
pub repeat: u32,
/// Select how many repetitions of this benchmark should run from the client.
///
/// NOTE: Using this alone may give slower results, but will afford you maximum Wasm memory.
#[clap(long, default_value = "1")]
#[arg(long, default_value_t = 1)]
pub external_repeat: u32,
/// Print the raw results in JSON format.
#[clap(long = "json")]
#[arg(long = "json")]
pub json_output: bool,
/// Write the raw results in JSON format into the given file.
#[clap(long, conflicts_with = "json-output")]
#[arg(long, conflicts_with = "json_output")]
pub json_file: Option<PathBuf>,
/// Don't print the median-slopes linear regression analysis.
#[clap(long)]
#[arg(long)]
pub no_median_slopes: bool,
/// Don't print the min-squares linear regression analysis.
#[clap(long)]
#[arg(long)]
pub no_min_squares: bool,
/// Output the benchmarks to a Rust file at the given path.
#[clap(long)]
#[arg(long)]
pub output: Option<PathBuf>,
/// Add a header file to your outputted benchmarks.
#[clap(long)]
#[arg(long)]
pub header: Option<PathBuf>,
/// Path to Handlebars template file used for outputting benchmark results. (Optional)
#[clap(long)]
#[arg(long)]
pub template: Option<PathBuf>,
#[allow(missing_docs)]
@@ -100,25 +100,25 @@ pub struct PalletCmd {
/// * min-squares (default)
/// * median-slopes
/// * max (max of min squares and median slopes for each value)
#[clap(long)]
#[arg(long)]
pub output_analysis: Option<String>,
/// Set the heap pages while running benchmarks. If not set, the default value from the client
/// is used.
#[clap(long)]
#[arg(long)]
pub heap_pages: Option<u64>,
/// Disable verification logic when running benchmarks.
#[clap(long)]
#[arg(long)]
pub no_verify: bool,
/// Display and run extra benchmarks that would otherwise not be needed for weight
/// construction.
#[clap(long)]
#[arg(long)]
pub extra: bool,
/// Estimate PoV size.
#[clap(long)]
#[arg(long)]
pub record_proof: bool,
#[allow(missing_docs)]
@@ -126,50 +126,50 @@ pub struct PalletCmd {
pub shared_params: sc_cli::SharedParams,
/// The execution strategy that should be used for benchmarks.
#[clap(long, value_name = "STRATEGY", arg_enum, ignore_case = true)]
#[arg(long, value_name = "STRATEGY", value_enum, ignore_case = true)]
pub execution: Option<ExecutionStrategy>,
/// Method for executing Wasm runtime code.
#[clap(
#[arg(
long = "wasm-execution",
value_name = "METHOD",
possible_values = WasmExecutionMethod::variants(),
value_enum,
ignore_case = true,
default_value = DEFAULT_WASM_EXECUTION_METHOD,
default_value_t = DEFAULT_WASM_EXECUTION_METHOD,
)]
pub wasm_method: WasmExecutionMethod,
/// The WASM instantiation method to use.
///
/// Only has an effect when `wasm-execution` is set to `compiled`.
#[clap(
#[arg(
long = "wasm-instantiation-strategy",
value_name = "STRATEGY",
default_value_t = DEFAULT_WASMTIME_INSTANTIATION_STRATEGY,
arg_enum,
value_enum,
)]
pub wasmtime_instantiation_strategy: WasmtimeInstantiationStrategy,
/// Limit the memory the database cache can use.
#[clap(long = "db-cache", value_name = "MiB", default_value = "1024")]
#[arg(long = "db-cache", value_name = "MiB", default_value_t = 1024)]
pub database_cache_size: u32,
/// List the benchmarks that match your query rather than running them.
///
/// When nothing is provided, we list all benchmarks.
#[clap(long)]
#[arg(long)]
pub list: bool,
/// If enabled, the storage info is not displayed in the output next to the analysis.
///
/// This is independent of the storage info appearing in the *output file*. Use a Handlebar
/// template for that purpose.
#[clap(long)]
#[arg(long)]
pub no_storage_info: bool,
/// A path to a `.json` file with existing benchmark results generated with `--json` or
/// `--json-file`. When specified the benchmarks are not actually executed, and the data for
/// the analysis is read from this file.
#[clap(long)]
#[arg(long)]
pub json_input: Option<PathBuf>,
}
@@ -95,22 +95,22 @@ pub fn check_build_profile() -> Result<(), String> {
/// Parameters to configure how the host info will be determined.
#[derive(Debug, Default, Serialize, Clone, PartialEq, Args)]
#[clap(rename_all = "kebab-case")]
#[command(rename_all = "kebab-case")]
pub struct HostInfoParams {
/// Manually override the hostname to use.
#[clap(long)]
#[arg(long)]
pub hostname_override: Option<String>,
/// Specify a fallback hostname if no-one could be detected automatically.
///
/// Note: This only exists to make the `hostname` function infallible.
#[clap(long, default_value = "<UNKNOWN>")]
#[arg(long, default_value = "<UNKNOWN>")]
pub hostname_fallback: String,
/// Specify a fallback CPU name if no-one could be detected automatically.
///
/// Note: This only exists to make the `cpuname` function infallible.
#[clap(long, default_value = "<UNKNOWN>")]
#[arg(long, default_value = "<UNKNOWN>")]
pub cpuname_fallback: String,
}
@@ -31,23 +31,23 @@ pub struct WeightParams {
/// File or directory to write the *weight* files to.
///
/// For Substrate this should be `frame/support/src/weights`.
#[clap(long)]
#[arg(long)]
pub weight_path: Option<PathBuf>,
/// Select a specific metric to calculate the final weight output.
#[clap(long = "metric", default_value = "average")]
#[arg(long = "metric", default_value = "average")]
pub weight_metric: StatSelect,
/// Multiply the resulting weight with the given factor. Must be positive.
///
/// Is applied before `weight_add`.
#[clap(long = "mul", default_value = "1")]
#[arg(long = "mul", default_value_t = 1.0)]
pub weight_mul: f64,
/// Add the given offset to the resulting weight.
///
/// Is applied after `weight_mul`.
#[clap(long = "add", default_value = "0")]
#[arg(long = "add", default_value_t = 0)]
pub weight_add: u64,
}
@@ -68,54 +68,54 @@ pub struct StorageParams {
pub hostinfo: HostInfoParams,
/// Skip the `read` benchmark.
#[clap(long)]
#[arg(long)]
pub skip_read: bool,
/// Skip the `write` benchmark.
#[clap(long)]
#[arg(long)]
pub skip_write: bool,
/// Specify the Handlebars template to use for outputting benchmark results.
#[clap(long)]
#[arg(long)]
pub template_path: Option<PathBuf>,
/// Add a header to the generated weight output file.
///
/// Good for adding LICENSE headers.
#[clap(long, value_name = "PATH")]
#[arg(long, value_name = "PATH")]
pub header: Option<PathBuf>,
/// Path to write the raw 'read' results in JSON format to. Can be a file or directory.
#[clap(long)]
#[arg(long)]
pub json_read_path: Option<PathBuf>,
/// Path to write the raw 'write' results in JSON format to. Can be a file or directory.
#[clap(long)]
#[arg(long)]
pub json_write_path: Option<PathBuf>,
/// Rounds of warmups before measuring.
#[clap(long, default_value = "1")]
#[arg(long, default_value_t = 1)]
pub warmups: u32,
/// The `StateVersion` to use. Substrate `--dev` should use `V1` and Polkadot `V0`.
/// Selecting the wrong version can corrupt the DB.
#[clap(long, possible_values = ["0", "1"])]
#[arg(long, value_parser = clap::value_parser!(u8).range(0..=1))]
pub state_version: u8,
/// Trie cache size in bytes.
///
/// Providing `0` will disable the cache.
#[clap(long, value_name = "Bytes", default_value = "67108864")]
#[arg(long, value_name = "Bytes", default_value_t = 67108864)]
pub trie_cache_size: usize,
/// Enable the Trie cache.
///
/// This should only be used for performance analysis and not for final results.
#[clap(long)]
#[arg(long)]
pub enable_trie_cache: bool,
/// Include child trees in benchmark.
#[clap(long)]
#[arg(long)]
pub include_child_trees: bool,
}