class Thor::Option

def self.parse(key, value) # rubocop:disable MethodLength

rubocop:disable MethodLength

By default all options are optional, unless :required is given.

string (--foo=value) or booleans (just --foo).
is given a default type is assumed. This default type accepts arguments as
The valid types are :boolean, :numeric, :hash, :array and :string. If none

#=> Option foo with default value true and type boolean
parse :foo => true

#=> Option foo without default value and type numeric
parse :foo => :numeric

#=> Option foo with default value 2 and type numeric
parse :foo => 2

#=> Required option foo without default value
parse :foo => :required

#=> Option foo with default value bar and alias :baz
parse [:foo, :baz] => "bar"

#=> Option foo with default value bar
parse :foo => "bar"

assumptions, but you can be more specific using the option method.
This parse quick options given as method_options. It makes several
def self.parse(key, value) # rubocop:disable MethodLength
  if key.is_a?(Array)
    name, *aliases = key
  else
    name, aliases = key, []
  end
  name    = name.to_s
  default = value
  type = case value
         when Symbol
           default = nil
           if VALID_TYPES.include?(value)
             value
           elsif required = (value == :required) # rubocop:disable AssignmentInCondition
             :string
           end
         when TrueClass, FalseClass
           :boolean
         when Numeric
           :numeric
         when Hash, Array, String
           value.class.name.downcase.to_sym
         end
  new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
end