Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wrong Did you mean suggestion: for alignmentScorr clap suggests alignmentStart rather than alignmentScore #4660

Closed
2 tasks done
corneliusroemer opened this issue Jan 23, 2023 · 2 comments · Fixed by #4668
Closed
2 tasks done
Labels
A-help Area: documentation, including docs.rs, readme, examples, etc... C-bug Category: Updating dependencies S-waiting-on-design Status: Waiting on user-facing design to be resolved before implementing

Comments

@corneliusroemer
Copy link
Contributor

corneliusroemer commented Jan 23, 2023

Please complete the following tasks

Rust Version

rustc 1.66.0 (69f9c33d7 2022-12-12)

Clap Version

clap 3.1.18

Minimal reproducible code

Will try to extract a minimal reproducible example later

fn main() {}

Bug discovered here: nextstrain/nextclade@8facbb4

Steps to reproduce the bug with the above code

cargo run --bin nextclade run -d sars-cov-2 test.fa -C alignmentScorr -t out.tsv

Actual Behaviour

❯ cargo run --bin nextclade run -d sars-cov-2 test.fa  -C alignmentScorr -t out.tsv
    Finished dev [unoptimized + debuginfo] target(s) in 0.57s
     Running `target/debug/nextclade run -d sars-cov-2 test.fa -C alignmentScorr -t out.tsv`
error: "alignmentScorr" isn't a valid value for '--output-columns-selection <OUTPUT_COLUMNS_SELECTION>...'
        [possible values: all, general, ref-muts, priv-muts, errs-warns, qc, primers, dynamic, clade, qc.overallScore, qc.overallStatus, totalSubstitutions, totalDeletions, totalInsertions, totalFrameShifts, totalMissing, totalNonACGTNs, totalAminoacidSubstitutions, totalAminoacidDeletions, totalAminoacidInsertions, alignmentScore, alignmentStart, alignmentEnd, coverage, isReverseComplement, substitutions, deletions, insertions, frameShifts, aaSubstitutions, aaDeletions, aaInsertions, privateNucMutations.reversionSubstitutions, privateNucMutations.labeledSubstitutions, privateNucMutations.unlabeledSubstitutions, privateNucMutations.totalReversionSubstitutions, privateNucMutations.totalLabeledSubstitutions, privateNucMutations.totalUnlabeledSubstitutions, privateNucMutations.totalPrivateSubstitutions, missing, nonACGTNs, qc.overallScore, qc.overallStatus, qc.missingData.missingDataThreshold, qc.missingData.score, qc.missingData.status, qc.missingData.totalMissing, qc.mixedSites.mixedSitesThreshold, qc.mixedSites.score, qc.mixedSites.status, qc.mixedSites.totalMixedSites, qc.privateMutations.cutoff, qc.privateMutations.excess, qc.privateMutations.score, qc.privateMutations.status, qc.privateMutations.total, qc.snpClusters.clusteredSNPs, qc.snpClusters.score, qc.snpClusters.status, qc.snpClusters.totalSNPs, qc.frameShifts.frameShifts, qc.frameShifts.totalFrameShifts, qc.frameShifts.frameShiftsIgnored, qc.frameShifts.totalFrameShiftsIgnored, qc.frameShifts.score, qc.frameShifts.status, qc.stopCodons.stopCodons, qc.stopCodons.totalStopCodons, qc.stopCodons.score, qc.stopCodons.status, totalPcrPrimerChanges, pcrPrimerChanges, failedGenes, warnings, errors]

        Did you mean "alignmentStart"?

Expected Behaviour

Same as above except for:

        Did you mean "alignmentScore"?

alignmentScore is much much closer by any string metric to alignmentScorr than alignmentStart -> clear bug

Additional Context

I looked at the code how the did you mean is implemented and noticed that the tests don't seem to run due to type: features instead of feature:

#[cfg(all(test, features = "suggestions"))]

Debug Output

Click to unfold
[        clap::build::command]  Command::_do_parse
[        clap::build::command]  Command::_build: name="nextclade"
[        clap::build::command]  Command::_propagate:nextclade
[        clap::build::command]  Command::_check_help_and_version: nextclade
[        clap::build::command]  Command::_check_help_and_version: Building help subcommand
[        clap::build::command]  Command::_propagate_global_args:nextclade
[        clap::build::command]  Command::_derive_display_order:nextclade
[        clap::build::command]  Command::_derive_display_order:completions
[        clap::build::command]  Command::_derive_display_order:run
[        clap::build::command]  Command::_derive_display_order:dataset
[        clap::build::command]  Command::_derive_display_order:list
[        clap::build::command]  Command::_derive_display_order:get
[        clap::build::command]  Command::_derive_display_order:help
[  clap::build::debug_asserts]  Command::_debug_asserts
[  clap::build::debug_asserts]  Arg::_debug_asserts:help
[  clap::build::debug_asserts]  Arg::_debug_asserts:version
[  clap::build::debug_asserts]  Arg::_debug_asserts:verbosity
[  clap::build::debug_asserts]  Arg::_debug_asserts:silent
[  clap::build::debug_asserts]  Arg::_debug_asserts:verbose
[  clap::build::debug_asserts]  Arg::_debug_asserts:quiet
[  clap::build::debug_asserts]  Command::_verify_positionals
[         clap::parse::parser]  Parser::get_matches_with
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("run")' ([114, 117, 110])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::possible_subcommand: arg=Ok("run")
[         clap::parse::parser]  Parser::get_matches_with: sc=Some("run")
[         clap::parse::parser]  Parser::parse_subcommand
[         clap::output::usage]  Usage::get_required_usage_from: incls=[], matcher=false, incl_last=true
[         clap::output::usage]  Usage::get_required_usage_from: unrolled_reqs={}
[         clap::output::usage]  Usage::get_required_usage_from: ret_val={}
[        clap::build::command]  Command::_build_subcommand Setting bin_name of run to "nextclade run"
[        clap::build::command]  Command::_build_subcommand Setting display_name of run to "nextclade-run"
[        clap::build::command]  Command::_build: name="run"
[        clap::build::command]  Command::_propagate:run
[        clap::build::command]  Command::_check_help_and_version: run
[        clap::build::command]  Command::_check_help_and_version: Removing generated version
[        clap::build::command]  Command::_propagate_global_args:run
[        clap::build::command]  Command::_derive_display_order:run
[  clap::build::debug_asserts]  Command::_debug_asserts
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-fastas
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-fasta
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-dataset
[  clap::build::debug_asserts]  Arg::_debug_asserts:dataset-name
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-ref
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-tree
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-qc-config
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-virus-properties
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-pcr-primers
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-gene-map
[  clap::build::debug_asserts]  Arg::_debug_asserts:genes
[  clap::build::debug_asserts]  Arg::_debug_asserts:server
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-dir
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-all
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-basename
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-selection
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-fasta
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-translations
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-ndjson
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-json
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-csv
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-tsv
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-columns-selection
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-tree
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-insertions
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-errors
[  clap::build::debug_asserts]  Arg::_debug_asserts:include-reference
[  clap::build::debug_asserts]  Arg::_debug_asserts:in-order
[  clap::build::debug_asserts]  Arg::_debug_asserts:replace-unknown
[  clap::build::debug_asserts]  Arg::_debug_asserts:min-length
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-gap-extend
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-gap-open
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-gap-open-in-frame
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-gap-open-out-of-frame
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-mismatch
[  clap::build::debug_asserts]  Arg::_debug_asserts:score-match
[  clap::build::debug_asserts]  Arg::_debug_asserts:max-indel
[  clap::build::debug_asserts]  Arg::_debug_asserts:seed-length
[  clap::build::debug_asserts]  Arg::_debug_asserts:mismatches-allowed
[  clap::build::debug_asserts]  Arg::_debug_asserts:min-seeds
[  clap::build::debug_asserts]  Arg::_debug_asserts:min-match-rate
[  clap::build::debug_asserts]  Arg::_debug_asserts:seed-spacing
[  clap::build::debug_asserts]  Arg::_debug_asserts:retry-reverse-complement
[  clap::build::debug_asserts]  Arg::_debug_asserts:no-translate-past-stop
[  clap::build::debug_asserts]  Arg::_debug_asserts:excess-bandwidth
[  clap::build::debug_asserts]  Arg::_debug_asserts:terminal-bandwidth
[  clap::build::debug_asserts]  Arg::_debug_asserts:gap-alignment-side
[  clap::build::debug_asserts]  Arg::_debug_asserts:jobs
[  clap::build::debug_asserts]  Arg::_debug_asserts:help
[  clap::build::debug_asserts]  Arg::_debug_asserts:verbosity
[  clap::build::debug_asserts]  Arg::_debug_asserts:silent
[  clap::build::debug_asserts]  Arg::_debug_asserts:verbose
[  clap::build::debug_asserts]  Arg::_debug_asserts:quiet
[  clap::build::debug_asserts]  Command::_verify_positionals
[         clap::parse::parser]  Parser::parse_subcommand: About to parse sc=run
[         clap::parse::parser]  Parser::get_matches_with
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("-d")' ([45, 100])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::possible_subcommand: arg=Ok("-d")
[         clap::parse::parser]  Parser::get_matches_with: sc=None
[         clap::parse::parser]  Parser::parse_short_arg: short_arg=ShortFlags { inner: RawOsStr("d"), utf8_prefix: CharIndices { front_offset: 0, iter: Chars(['d']) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_short_arg:iter:d
[         clap::parse::parser]  Parser::parse_short_arg:iter:d: cur_idx:=1
[         clap::parse::parser]  Parser::parse_short_arg:iter:d: Found valid opt or flag
[         clap::parse::parser]  Parser::parse_short_arg:iter:d: val=RawOsStr("") (bytes), val=[] (ascii), short_arg=ShortFlags { inner: RawOsStr("d"), utf8_prefix: CharIndices { front_offset: 1, iter: Chars([]) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_opt; opt=dataset-name, val=None, has_eq=false
[         clap::parse::parser]  Parser::parse_opt; opt.settings=ArgFlags(TAKES_VAL)
[         clap::parse::parser]  Parser::parse_opt; Checking for val...
[         clap::parse::parser]  Parser::parse_opt: More arg vals required...
[         clap::parse::parser]  Parser::remove_overrides: id=dataset-name
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_arg: id=dataset-name
[        clap::build::command]  Command::groups_for_arg: id=dataset-name
[        clap::build::command]  Command::groups_for_arg: id=dataset-name
[         clap::parse::parser]  Parser::get_matches_with: After parse_short_arg Opt(dataset-name)
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("sars-cov-2")' ([115, 97, 114, 115, 45, 99, 111, 118, 45, 50])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::add_val_to_arg; arg=dataset-name, val=RawOsStr("sars-cov-2")
[         clap::parse::parser]  Parser::add_val_to_arg; trailing_values=false, DontDelimTrailingVals=false
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."sars-cov-2"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=2
[        clap::build::command]  Command::groups_for_arg: id=dataset-name
[    clap::parse::arg_matcher]  ArgMatcher::needs_more_vals: o=dataset-name
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("test.fa")' ([116, 101, 115, 116, 46, 102, 97])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::possible_subcommand: arg=Ok("test.fa")
[         clap::parse::parser]  Parser::get_matches_with: sc=None
[         clap::parse::parser]  Parser::remove_overrides: id=input-fastas
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_arg: id=input-fastas
[        clap::build::command]  Command::groups_for_arg: id=input-fastas
[         clap::parse::parser]  Parser::add_val_to_arg; arg=input-fastas, val=RawOsStr("test.fa")
[         clap::parse::parser]  Parser::add_val_to_arg; trailing_values=false, DontDelimTrailingVals=false
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."test.fa"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=3
[        clap::build::command]  Command::groups_for_arg: id=input-fastas
[    clap::parse::arg_matcher]  ArgMatcher::needs_more_vals: o=input-fastas
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("-C")' ([45, 67])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::parse_short_arg: short_arg=ShortFlags { inner: RawOsStr("C"), utf8_prefix: CharIndices { front_offset: 0, iter: Chars(['C']) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_short_arg:iter:C
[         clap::parse::parser]  Parser::parse_short_arg:iter:C: cur_idx:=4
[         clap::parse::parser]  Parser::parse_short_arg:iter:C: Found valid opt or flag
[         clap::parse::parser]  Parser::parse_short_arg:iter:C: val=RawOsStr("") (bytes), val=[] (ascii), short_arg=ShortFlags { inner: RawOsStr("C"), utf8_prefix: CharIndices { front_offset: 1, iter: Chars([]) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_opt; opt=output-columns-selection, val=None, has_eq=false
[         clap::parse::parser]  Parser::parse_opt; opt.settings=ArgFlags(MULTIPLE_OCC | TAKES_VAL | USE_DELIM | MULTIPLE_VALS | MULTIPLE)
[         clap::parse::parser]  Parser::parse_opt; Checking for val...
[         clap::parse::parser]  Parser::parse_opt: More arg vals required...
[         clap::parse::parser]  Parser::remove_overrides: id=output-columns-selection
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_arg: id=output-columns-selection
[        clap::build::command]  Command::groups_for_arg: id=output-columns-selection
[        clap::build::command]  Command::groups_for_arg: id=output-columns-selection
[         clap::parse::parser]  Parser::get_matches_with: After parse_short_arg Opt(output-columns-selection)
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("alignmentScorr")' ([97, 108, 105, 103, 110, 109, 101, 110, 116, 83, 99, 111, 114, 114])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::add_val_to_arg; arg=output-columns-selection, val=RawOsStr("alignmentScorr")
[         clap::parse::parser]  Parser::add_val_to_arg; trailing_values=false, DontDelimTrailingVals=false
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."alignmentScorr"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=5
[        clap::build::command]  Command::groups_for_arg: id=output-columns-selection
[    clap::parse::arg_matcher]  ArgMatcher::needs_more_vals: o=output-columns-selection
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("-t")' ([45, 116])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::parse_short_arg: short_arg=ShortFlags { inner: RawOsStr("t"), utf8_prefix: CharIndices { front_offset: 0, iter: Chars(['t']) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_short_arg:iter:t
[         clap::parse::parser]  Parser::parse_short_arg:iter:t: cur_idx:=6
[         clap::parse::parser]  Parser::parse_short_arg:iter:t: Found valid opt or flag
[         clap::parse::parser]  Parser::parse_short_arg:iter:t: val=RawOsStr("") (bytes), val=[] (ascii), short_arg=ShortFlags { inner: RawOsStr("t"), utf8_prefix: CharIndices { front_offset: 1, iter: Chars([]) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_opt; opt=output-tsv, val=None, has_eq=false
[         clap::parse::parser]  Parser::parse_opt; opt.settings=ArgFlags(TAKES_VAL)
[         clap::parse::parser]  Parser::parse_opt; Checking for val...
[         clap::parse::parser]  Parser::parse_opt: More arg vals required...
[         clap::parse::parser]  Parser::remove_overrides: id=output-tsv
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_arg: id=output-tsv
[        clap::build::command]  Command::groups_for_arg: id=output-tsv
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_group: id=tabular_output
[        clap::build::command]  Command::groups_for_arg: id=output-tsv
[         clap::parse::parser]  Parser::get_matches_with: After parse_short_arg Opt(output-tsv)
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("out.tsv")' ([111, 117, 116, 46, 116, 115, 118])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::add_val_to_arg; arg=output-tsv, val=RawOsStr("out.tsv")
[         clap::parse::parser]  Parser::add_val_to_arg; trailing_values=false, DontDelimTrailingVals=false
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."out.tsv"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=7
[        clap::build::command]  Command::groups_for_arg: id=output-tsv
[    clap::parse::arg_matcher]  ArgMatcher::needs_more_vals: o=output-tsv
[         clap::parse::parser]  Parser::add_defaults
[         clap::parse::parser]  Parser::add_defaults:iter:input-fasta:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-fasta: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-fasta: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-dataset:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-dataset: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-dataset: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:dataset-name:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:dataset-name: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:dataset-name: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-ref:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-ref: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-ref: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-tree:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-tree: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-tree: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-qc-config:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-qc-config: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-qc-config: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-virus-properties:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-virus-properties: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-virus-properties: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-pcr-primers:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-pcr-primers: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-pcr-primers: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-gene-map:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-gene-map: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-gene-map: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:genes:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:genes: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:genes: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:server:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:server: has default vals
[         clap::parse::parser]  Parser::add_value:iter:server: wasn't used
[        clap::build::command]  Command::groups_for_arg: id=server
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."https://data.master.clades.nextstrain.org/"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=8
[        clap::build::command]  Command::groups_for_arg: id=server
[         clap::parse::parser]  Parser::add_value:iter:server: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-dir:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-dir: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-dir: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-all:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-all: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-all: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-basename:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-basename: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-basename: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-selection:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-selection: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-selection: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-fasta:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-fasta: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-fasta: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-translations:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-translations: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-translations: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-ndjson:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-ndjson: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-ndjson: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-json:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-json: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-json: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-csv:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-csv: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-csv: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-tsv:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-tsv: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-tsv: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-columns-selection:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-columns-selection: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-columns-selection: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-tree:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-tree: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-tree: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-insertions:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-insertions: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-insertions: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-errors:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-errors: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-errors: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:min-length:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:min-length: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:min-length: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-gap-extend:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-extend: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-extend: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-gap-open:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-gap-open-in-frame:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open-in-frame: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open-in-frame: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-gap-open-out-of-frame:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open-out-of-frame: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open-out-of-frame: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-mismatch:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-mismatch: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-mismatch: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:score-match:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:score-match: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:score-match: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:max-indel:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:max-indel: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:max-indel: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:seed-length:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:seed-length: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:seed-length: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:mismatches-allowed:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:mismatches-allowed: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:mismatches-allowed: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:min-seeds:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:min-seeds: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:min-seeds: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:min-match-rate:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:min-match-rate: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:min-match-rate: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:seed-spacing:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:seed-spacing: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:seed-spacing: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:retry-reverse-complement:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:retry-reverse-complement: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:retry-reverse-complement: has default missing vals
[         clap::parse::parser]  Parser::add_value:iter:retry-reverse-complement: wasn't used
[         clap::parse::parser]  Parser::add_defaults:iter:no-translate-past-stop:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:no-translate-past-stop: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:no-translate-past-stop: has default missing vals
[         clap::parse::parser]  Parser::add_value:iter:no-translate-past-stop: wasn't used
[         clap::parse::parser]  Parser::add_defaults:iter:excess-bandwidth:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:excess-bandwidth: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:excess-bandwidth: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:terminal-bandwidth:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:terminal-bandwidth: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:terminal-bandwidth: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:gap-alignment-side:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:gap-alignment-side: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:gap-alignment-side: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:jobs:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:jobs: has default vals
[         clap::parse::parser]  Parser::add_value:iter:jobs: wasn't used
[        clap::build::command]  Command::groups_for_arg: id=jobs
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."10"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=9
[        clap::build::command]  Command::groups_for_arg: id=jobs
[         clap::parse::parser]  Parser::add_value:iter:jobs: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:verbosity:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:verbosity: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:verbosity: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-fastas:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-fastas: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-fastas: doesn't have default missing vals
[      clap::parse::validator]  Validator::validate
[      clap::parse::validator]  Validator::validate_conflicts
[      clap::parse::validator]  Validator::validate_exclusive
[      clap::parse::validator]  Validator::validate_exclusive:iter:dataset-name
[      clap::parse::validator]  Validator::validate_exclusive:iter:input-fastas
[      clap::parse::validator]  Validator::validate_exclusive:iter:output-columns-selection
[      clap::parse::validator]  Validator::validate_exclusive:iter:output-tsv
[      clap::parse::validator]  Validator::validate_exclusive:iter:tabular_output
[      clap::parse::validator]  Validator::validate_exclusive:iter:server
[      clap::parse::validator]  Validator::validate_exclusive:iter:jobs
[      clap::parse::validator]  Validator::validate_conflicts::iter: id=dataset-name
[      clap::parse::validator]  Conflicts::gather_conflicts: arg=dataset-name
[        clap::build::command]  Command::groups_for_arg: id=dataset-name
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=dataset-name, conflicts=[]
[        clap::build::command]  Command::groups_for_arg: id=input-fastas
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=input-fastas, conflicts=[]
[        clap::build::command]  Command::groups_for_arg: id=output-columns-selection
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=output-columns-selection, conflicts=[]
[        clap::build::command]  Command::groups_for_arg: id=output-tsv
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=output-tsv, conflicts=[output-all, output-csv]
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=tabular_output, conflicts=[]
[      clap::parse::validator]  Conflicts::gather_conflicts: conflicts=[]
[      clap::parse::validator]  Validator::validate_conflicts::iter: id=input-fastas
[      clap::parse::validator]  Conflicts::gather_conflicts: arg=input-fastas
[      clap::parse::validator]  Conflicts::gather_conflicts: conflicts=[]
[      clap::parse::validator]  Validator::validate_conflicts::iter: id=output-columns-selection
[      clap::parse::validator]  Conflicts::gather_conflicts: arg=output-columns-selection
[      clap::parse::validator]  Conflicts::gather_conflicts: conflicts=[]
[      clap::parse::validator]  Validator::validate_conflicts::iter: id=output-tsv
[      clap::parse::validator]  Conflicts::gather_conflicts: arg=output-tsv
[      clap::parse::validator]  Conflicts::gather_conflicts: conflicts=[]
[      clap::parse::validator]  Validator::validate_required: required=ChildGraph([])
[      clap::parse::validator]  Validator::gather_requires
[      clap::parse::validator]  Validator::gather_requires:iter:dataset-name
[      clap::parse::validator]  Validator::gather_requires:iter:input-fastas
[      clap::parse::validator]  Validator::gather_requires:iter:output-columns-selection
[      clap::parse::validator]  Validator::gather_requires:iter:output-tsv
[      clap::parse::validator]  Validator::gather_requires:iter:tabular_output
[      clap::parse::validator]  Validator::gather_requires:iter:tabular_output:group
[      clap::parse::validator]  Validator::validate_required: is_exclusive_present=false
[      clap::parse::validator]  Validator::validate_required_unless
[      clap::parse::validator]  Validator::validate_matched_args
[      clap::parse::validator]  Validator::validate_matched_args:iter:dataset-name: vals=Flatten {
    inner: FlattenCompat {
        iter: Fuse {
            iter: Some(
                Iter(
                    [
                        [
                            "sars-cov-2",
                        ],
                    ],
                ),
            ),
        },
        frontiter: None,
        backiter: None,
    },
}
[      clap::parse::validator]  Validator::validate_arg_num_vals
[      clap::parse::validator]  Validator::validate_arg_values: arg="dataset-name"
[      clap::parse::validator]  Validator::validate_arg_values: checking validator...
[      clap::parse::validator]  good
[      clap::parse::validator]  Validator::validate_arg_num_occurs: "dataset-name"=1
[      clap::parse::validator]  Validator::validate_matched_args:iter:input-fastas: vals=Flatten {
    inner: FlattenCompat {
        iter: Fuse {
            iter: Some(
                Iter(
                    [
                        [
                            "test.fa",
                        ],
                    ],
                ),
            ),
        },
        frontiter: None,
        backiter: None,
    },
}
[      clap::parse::validator]  Validator::validate_arg_num_vals
[      clap::parse::validator]  Validator::validate_arg_values: arg="input-fastas"
[      clap::parse::validator]  Validator::validate_arg_values: checking validator...
[      clap::parse::validator]  good
[      clap::parse::validator]  Validator::validate_arg_num_occurs: "input-fastas"=1
[      clap::parse::validator]  Validator::validate_matched_args:iter:output-columns-selection: vals=Flatten {
    inner: FlattenCompat {
        iter: Fuse {
            iter: Some(
                Iter(
                    [
                        [
                            "alignmentScorr",
                        ],
                    ],
                ),
            ),
        },
        frontiter: None,
        backiter: None,
    },
}
[      clap::parse::validator]  Validator::validate_arg_num_vals
[      clap::parse::validator]  Validator::validate_arg_values: arg="output-columns-selection"
[      clap::parse::validator]  Validator::validate_arg_values: possible_vals=[PossibleValue { name: "all", help: None, aliases: [], hide: false }, PossibleValue { name: "general", help: None, aliases: [], hide: false }, PossibleValue { name: "ref-muts", help: None, aliases: [], hide: false }, PossibleValue { name: "priv-muts", help: None, aliases: [], hide: false }, PossibleValue { name: "errs-warns", help: None, aliases: [], hide: false }, PossibleValue { name: "qc", help: None, aliases: [], hide: false }, PossibleValue { name: "primers", help: None, aliases: [], hide: false }, PossibleValue { name: "dynamic", help: None, aliases: [], hide: false }, PossibleValue { name: "clade", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.overallScore", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.overallStatus", help: None, aliases: [], hide: false }, PossibleValue { name: "totalSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalDeletions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalInsertions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalFrameShifts", help: None, aliases: [], hide: false }, PossibleValue { name: "totalMissing", help: None, aliases: [], hide: false }, PossibleValue { name: "totalNonACGTNs", help: None, aliases: [], hide: false }, PossibleValue { name: "totalAminoacidSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalAminoacidDeletions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalAminoacidInsertions", help: None, aliases: [], hide: false }, PossibleValue { name: "alignmentScore", help: None, aliases: [], hide: false }, PossibleValue { name: "alignmentStart", help: None, aliases: [], hide: false }, PossibleValue { name: "alignmentEnd", help: None, aliases: [], hide: false }, PossibleValue { name: "coverage", help: None, aliases: [], hide: false }, PossibleValue { name: "isReverseComplement", help: None, aliases: [], hide: false }, PossibleValue { name: "substitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "deletions", help: None, aliases: [], hide: false }, PossibleValue { name: "insertions", help: None, aliases: [], hide: false }, PossibleValue { name: "frameShifts", help: None, aliases: [], hide: false }, PossibleValue { name: "aaSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "aaDeletions", help: None, aliases: [], hide: false }, PossibleValue { name: "aaInsertions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.reversionSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.labeledSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.unlabeledSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.totalReversionSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.totalLabeledSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.totalUnlabeledSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.totalPrivateSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "missing", help: None, aliases: [], hide: false }, PossibleValue { name: "nonACGTNs", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.overallScore", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.overallStatus", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.missingData.missingDataThreshold", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.missingData.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.missingData.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.missingData.totalMissing", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.mixedSites.mixedSitesThreshold", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.mixedSites.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.mixedSites.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.mixedSites.totalMixedSites", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.cutoff", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.excess", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.total", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.snpClusters.clusteredSNPs", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.snpClusters.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.snpClusters.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.snpClusters.totalSNPs", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.frameShifts", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.totalFrameShifts", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.frameShiftsIgnored", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.totalFrameShiftsIgnored", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.stopCodons.stopCodons", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.stopCodons.totalStopCodons", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.stopCodons.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.stopCodons.status", help: None, aliases: [], hide: false }, PossibleValue { name: "totalPcrPrimerChanges", help: None, aliases: [], hide: false }, PossibleValue { name: "pcrPrimerChanges", help: None, aliases: [], hide: false }, PossibleValue { name: "failedGenes", help: None, aliases: [], hide: false }, PossibleValue { name: "warnings", help: None, aliases: [], hide: false }, PossibleValue { name: "errors", help: None, aliases: [], hide: false }]
[         clap::output::usage]  Usage::create_usage_with_title
[         clap::output::usage]  Usage::create_usage_no_title
[         clap::output::usage]  Usage::create_smart_usage
[         clap::output::usage]  Usage::get_required_usage_from: incls=[dataset-name, input-fastas, output-columns-selection, output-tsv, tabular_output], matcher=false, incl_last=true
[         clap::output::usage]  Usage::get_required_usage_from: unrolled_reqs={tabular_output}
[        clap::build::command]  Command::unroll_args_in_group: group=tabular_output
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-all
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-csv
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-tsv
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[         clap::output::usage]  Usage::get_required_usage_from:iter:dataset-name
[         clap::output::usage]  Usage::get_required_usage_from:iter:output-columns-selection
[        clap::build::command]  Command::unroll_args_in_group: group=tabular_output
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-all
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-csv
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-tsv
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[         clap::output::usage]  Usage::get_required_usage_from:push:input-fastas
[         clap::output::usage]  Usage::get_required_usage_from: ret_val={"--dataset-name <DATASET_NAME>", "--output-columns-selection <OUTPUT_COLUMNS_SELECTION>...", "<--output-all <OUTPUT_ALL>|--output-csv <OUTPUT_CSV>|--output-tsv <OUTPUT_TSV>>", "<INPUT_FASTAS>..."}
[        clap::build::command]  Command::color: Color setting...
[        clap::build::command]  Auto
error: "alignmentScorr" isn't a valid value for '--output-columns-selection <OUTPUT_COLUMNS_SELECTION>...'
        [possible values: all, general, ref-muts, priv-muts, errs-warns, qc, primers, dynamic, clade, qc.overallScore, qc.overallStatus, totalSubstitutions, totalDeletions, totalInsertions, totalFrameShifts, totalMissing, totalNonACGTNs, totalAminoacidSubstitutions, totalAminoacidDeletions, totalAminoacidInsertions, alignmentScore, alignmentStart, alignmentEnd, coverage, isReverseComplement, substitutions, deletions, insertions, frameShifts, aaSubstitutions, aaDeletions, aaInsertions, privateNucMutations.reversionSubstitutions, privateNucMutations.labeledSubstitutions, privateNucMutations.unlabeledSubstitutions, privateNucMutations.totalReversionSubstitutions, privateNucMutations.totalLabeledSubstitutions, privateNucMutations.totalUnlabeledSubstitutions, privateNucMutations.totalPrivateSubstitutions, missing, nonACGTNs, qc.overallScore, qc.overallStatus, qc.missingData.missingDataThreshold, qc.missingData.score, qc.missingData.status, qc.missingData.totalMissing, qc.mixedSites.mixedSitesThreshold, qc.mixedSites.score, qc.mixedSites.status, qc.mixedSites.totalMixedSites, qc.privateMutations.cutoff, qc.privateMutations.excess, qc.privateMutations.score, qc.privateMutations.status, qc.privateMutations.total, qc.snpClusters.clusteredSNPs, qc.snpClusters.score, qc.snpClusters.status, qc.snpClusters.totalSNPs, qc.frameShifts.frameShifts, qc.frameShifts.totalFrameShifts, qc.frameShifts.frameShiftsIgnored, qc.frameShifts.totalFrameShiftsIgnored, qc.frameShifts.score, qc.frameShifts.status, qc.stopCodons.stopCodons, qc.stopCodons.totalStopCodons, qc.stopCodons.score, qc.stopCodons.status, totalPcrPrimerChanges, pcrPrimerChanges, failedGenes, warnings, errors]

        Did you mean "alignmentStart"?

USAGE:
    nextclade run --dataset-name <DATASET_NAME> --output-columns-selection <OUTPUT_COLUMNS_SELECTION>... <--output-all <OUTPUT_ALL>|--output-csv <OUTPUT_CSV>|--output-tsv <OUTPUT_TSV>> <INPUT_FASTAS>...

For more information try --help
  
@corneliusroemer corneliusroemer added the C-bug Category: Updating dependencies label Jan 23, 2023
epage added a commit to epage/clap that referenced this issue Jan 23, 2023
@epage
Copy link
Member

epage commented Jan 23, 2023

I looked into this as part of #4664. The problem is jaro_winkler is returning the same score for both strings (1.0) and so the last declared value is being preferred

@epage epage added A-help Area: documentation, including docs.rs, readme, examples, etc... S-waiting-on-design Status: Waiting on user-facing design to be resolved before implementing labels Jan 23, 2023
@corneliusroemer
Copy link
Contributor Author

corneliusroemer commented Jan 23, 2023

Interesting, thanks! I'll check whether that's a bug in the jaro_winkler implementation - feels like it is to me.

It looks like https://github.com/dguo/strsim-rs is no longer maintained, and potentially has other bugs. I'll verify that this is indeed a bug. So one either needs to fork and fix, or switch to a different crate.

For other bugs in Jaro-Winkler: rapidfuzz/strsim-rs#49

It turns out that the implementation of Jaro-Winkler in strsim-rs is very unconventional to wrong, see rapidfuzz/strsim-rs#53, I dug in a bit and indeed, if the strings have common prefixes >=10 the similarity is 1, which isn't really what we want I think.

One immediate workaround would be to use just the normal Jaro instead, from the same crate. The Winkler modification is useful for things like making sure Billy and Bill are more similar than Willy and Billy. But since clap doesn't match names but options which don't necessarily have the important things at the beginning (typos can be anywhere) I don't see why Jaro-Winkler is necessarily the better metric to use.

In either case, the current use of the false/buggy Jaro-Winkler implementation means that clap's did_you_mean does not provide as helpful suggestions as it could if it used a proper implementation or Jaro instead.

corneliusroemer added a commit to corneliusroemer/clap that referenced this issue Jan 23, 2023
Implementation of Jaro-Winkler similarity in the dguo/strsim-rs crate
is wrong, causing strings with common prefix >=10
to all be considered perfect matches

Using Jaro instead from the same crate fixes this issue
Benefit of favoring long prefixes exists for matching common names
But not for typo detection
Hence use of Jaro instead of Jaro-Winkler is acceptable

Confidence threshold adjusted so that `bar` is still suggested for `baz`
since Jaro is strictly < Jaro-Winkler
such an adjustment is expected. This is acceptable.
While exact suggestions may change, the net change will be positive
Suggestions are purely decorative and should thus not breaking change

Fixes clap-rs#4660
Also see rapidfuzz/strsim-rs#53
corneliusroemer added a commit to corneliusroemer/clap that referenced this issue Jan 23, 2023
Implementation of Jaro-Winkler similarity in the dguo/strsim-rs crate
is wrong, causing strings with common prefix >=10
to all be considered perfect matches

Using Jaro instead from the same crate fixes this issue
Benefit of favoring long prefixes exists for matching common names
But not for typo detection
Hence use of Jaro instead of Jaro-Winkler is acceptable

Confidence threshold adjusted so that `bar` is still suggested for `baz`
since Jaro is strictly < Jaro-Winkler
such an adjustment is expected. This is acceptable.
While exact suggestions may change, the net change will be positive
Suggestions are purely decorative and should thus not breaking change

Fixes clap-rs#4660
Also see rapidfuzz/strsim-rs#53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-help Area: documentation, including docs.rs, readme, examples, etc... C-bug Category: Updating dependencies S-waiting-on-design Status: Waiting on user-facing design to be resolved before implementing
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants