{"record":{"id":"073c7f8ee10443c7","repo":"puppetlabs/puppet","slug":"invalid-long-option-name-name","errorCode":null,"errorMessage":"invalid long option name %{name}","messagePattern":"invalid long option name %(.+?)","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/util/command_line/trollop.rb","lineNumber":228,"sourceCode":"        when nil; nil\n        else\n          raise ArgumentError, _(\"unsupported argument type '%{value0}'\") % { value0: opts[:default].class.name }\n        end\n\n      raise ArgumentError, _(\":type specification and default type don't match (default type is %{type_from_default})\") % { type_from_default: type_from_default } if opts[:type] && type_from_default && opts[:type] != type_from_default\n\n      opts[:type] = opts[:type] || type_from_default || :flag\n\n      ## fill in :long\n      opts[:long] = opts[:long] ? opts[:long].to_s : name.to_s.tr(\"_\", \"-\")\n      opts[:long] =\n        case opts[:long]\n        when /^--([^-].*)$/\n          ::Regexp.last_match(1)\n        when /^[^-]/\n          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","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/util/command_line/trollop.rb#L210-L246","documentation":"Parser#opt computes each option's long name from :long (or from the symbol name with underscores converted to dashes) and validates its shape at trollop.rb:221-229: it must be a bare name whose first character is not a dash, or a name prefixed with exactly two dashes followed by a non-dash character. A value like '-x', '---verbose', or '--' matches neither alternative and raises ArgumentError at line 228.","triggerScenarios":"`opt :x, 'desc', long: '-x'` (single leading dash); `long: '---verbose'`; `long: '--'`; a symbol such as :'-foo' whose name becomes '-foo' after tr('_', '-').","commonSituations":"Porting specs from Ruby's OptionParser where '-x'-style strings were the convention; building option names programmatically from user-supplied strings without sanitizing leading dashes.","solutions":["Pass :long with no dashes at all (`long: 'verbose'`) or with exactly two leading dashes (`long: '--verbose'`)","Drop :long and let the symbol drive the name (opt :verbose yields '--verbose' automatically)","Sanitize programmatically generated names to letters, digits, and internal dashes before declaring them"],"exampleFix":"# before\nopt :verbose, 'Verbosity', long: '-verbose'\n\n# after\nopt :verbose, 'Verbosity'          # derives '--verbose'\n# or explicitly:\nopt :verbose, 'Verbosity', long: '--verbose'","handlingStrategy":"validation","validationCode":"# Normalize/validate a :long value (or derived name) before opt\ndef valid_long?(long)\n  long = long.to_s\n  long =~ /^--([^-].*)$/ || long =~ /^[^-]/\nend\n\nlong = opts.fetch(:long) { name.to_s.tr('_', '-') }\nraise ArgumentError, \"bad long name #{long.inspect}\" unless valid_long?(long)","typeGuard":null,"tryCatchPattern":"begin\n  parser.opt name, desc, long: candidate\nrescue ArgumentError => e\n  raise unless e.message.include?('invalid long option name')\n  parser.opt name, desc   # fall back to the symbol-derived name\nend","preventionTips":["Pass :long without any dashes, or exactly two - never one or three","Let the symbol name drive the long option and omit :long","Sanitize dynamically generated names (strip leading dashes, underscores are auto-converted)"],"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"}