{"record":{"id":"1f7292d9a63b5cb3","repo":"puppetlabs/puppet","slug":"a-short-option-name-can-t-be-a-number-or-a-dash","errorCode":null,"errorMessage":"a short option name can't be a number or a dash","messagePattern":"a short option name can't be a number or a dash","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/util/command_line/trollop.rb","lineNumber":244,"sourceCode":"          opts[:long]\n        else\n          raise ArgumentError, _(\"invalid long option name %{name}\") % { name: opts[:long].inspect }\n        end\n      raise ArgumentError, _(\"long option name %{value0} is already taken; please specify a (different) :long\") % { value0: opts[:long].inspect } if @long[opts[:long]]\n\n      ## fill in :short\n      unless opts[:short] == :none\n        opts[:short] = opts[:short].to_s if opts[:short]\n      end\n      opts[:short] = case opts[:short]\n                     when /^-(.)$/; ::Regexp.last_match(1)\n                     when nil, :none, /^.$/; opts[:short]\n                     else raise ArgumentError, _(\"invalid short option name '%{name}'\") % { name: opts[:short].inspect }\n                     end\n\n      if opts[:short]\n        raise ArgumentError, _(\"short option name %{value0} is already taken; please specify a (different) :short\") % { value0: opts[:short].inspect } if @short[opts[:short]]\n        raise ArgumentError, _(\"a short option name can't be a number or a dash\") if opts[:short] =~ INVALID_SHORT_ARG_REGEX\n      end\n\n      ## fill in :default for flags\n      opts[:default] = false if opts[:type] == :flag && opts[:default].nil?\n\n      ## autobox :default for :multi (multi-occurrence) arguments\n      opts[:default] = [opts[:default]] if opts[:default] && opts[:multi] && !opts[:default].is_a?(Array)\n\n      ## fill in :multi\n      opts[:multi] ||= false\n\n      opts[:desc] ||= desc\n      @long[opts[:long]] = name\n      @short[opts[:short]] = name if opts[:short] && opts[:short] != :none\n      @specs[name] = opts\n      @order << [:opt, name]\n    end\n","sourceCodeStart":226,"sourceCodeEnd":262,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/util/command_line/trollop.rb#L226-L262","documentation":"INVALID_SHORT_ARG_REGEX is /[\\d-]/ (trollop.rb:70). After the duplicate-character check, opt raises ArgumentError at trollop.rb:244 when the short option character is a digit or a dash. Digits are forbidden because a token like '-5' must stay consumable as a parameter (for example a negative number value for another option), and '-' is ambiguous with stdin-style conventions.","triggerScenarios":"`short: '3'`, `short: '0'`, or `short: '-'`.","commonSituations":"Numeric options where a digit feels mnemonic ('2' for two-way sync); porting legacy CLIs in the tar/od style whose classic flags were digits.","solutions":["Use a letter for the short form (`short: 'n'`)","Drop :short and rely on the long form only","Pass `short: :none` to skip the short form entirely"],"exampleFix":"# before\nopt :level, 'Level', short: '3'\n\n# after\nopt :level, 'Level', short: 'l'","handlingStrategy":"validation","validationCode":"# Reject digit/dash short names before opt (mirrors INVALID_SHORT_ARG_REGEX /[\\d-]/)\nraise ArgumentError, 'short option cannot be a digit or dash' if opts[:short].to_s =~ /[\\d-]/ && opts[:short].to_s.length == 1","typeGuard":null,"tryCatchPattern":"begin\n  parser.opt name, desc, short: candidate\nrescue ArgumentError => e\n  raise unless e.message.include?(\"can't be a number or a dash\")\n  parser.opt name, desc, short: candidate.to_s.tr('0-9-', 'abc').chars.first  # or just drop it\nend","preventionTips":["Never use digits or '-' as short flags - reserve them for values like negative numbers","When porting legacy digit-flag CLIs, map digit flags to long options instead"],"tags":["puppet","trollop","cli","option-parsing","argumenterror"],"backgroundTag":"invalid-option-name","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}