123456789_123456789_123456789_123456789_123456789_

Class: Bundler::Thor::Arguments

Do not use. This class is for internal use only.
Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Inherits: Object
Defined in: lib/bundler/vendor/thor/lib/thor/parser/arguments.rb

Overview

rubocop:disable ClassLength

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(arguments = []) ⇒ Arguments

Takes an array of Argument objects.

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 26

def initialize(arguments = [])
  @assigns = {}
  @non_assigned_required = []
  @switches = arguments

  arguments.each do |argument|
    if !argument.default.nil?
      @assigns[argument.human_name] = argument.default
    elsif argument.required?
      @non_assigned_required << argument
    end
  end
end

Class Method Details

.parse(*args)

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 19

def self.parse(*args)
  to_parse = args.pop
  new(*args).parse(to_parse)
end

.split(args)

Receives an array of args and returns two arrays, one with arguments and one with switches.

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 8

def self.split(args)
  arguments = []

  args.each do |item|
    break if item =~ /^-/
    arguments << item
  end

  [arguments, args[Range.new(arguments.size, -1)]]
end

Instance Attribute Details

#current_is_value?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 84

def current_is_value?
  peek && peek.to_s !~ /^-/
end

#last?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 64

def last?
  @pile.empty?
end

Instance Method Details

#check_requirement! (private)

Raises an error if @non_assigned_required array is not empty.

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 166

def check_requirement!
  return if @non_assigned_required.empty?
  names = @non_assigned_required.map do |o|
    o.respond_to?(:switch_name) ? o.switch_name : o.human_name
  end.join("', '")
  class_name = self.class.name.split("::").last.downcase
  raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
end

#no_or_skip?(arg) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 59

def no_or_skip?(arg)
  arg =~ /^--(no|skip)-([-\w]+)$/
  $2
end

#parse(args)

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 40

def parse(args)
  @pile = args.dup

  @switches.each do |argument|
    break unless peek
    @non_assigned_required.delete(argument)
    @assigns[argument.human_name] = send(:"parse_#{argument.type}", argument.human_name)
  end

  check_requirement!
  @assigns
end

#parse_array(name) (private)

Runs through the argument array getting all strings until no string is found or a switch is found.

["a", "b", "c"]

And returns it as an array:

["a", "b", "c"]
[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 118

def parse_array(name)
  return shift if peek.is_a?(Array)
  array = []
  array << shift while current_is_value?
  array
end

#parse_hash(name) (private)

Runs through the argument array getting strings that contains “:” and mark it as a hash:

[ "name:string", "age:integer" ]

Becomes:

{ "name" => "string", "age" => "integer" }
[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 97

def parse_hash(name)
  return shift if peek.is_a?(Hash)
  hash = {}

  while current_is_value? && peek.include?(":")
    key, value = shift.split(":", 2)
    raise MalformattedArgumentError, "You can't specify '#{key}' more than once in option '#{name}'; got #{key}:#{hash[key]} and #{key}:#{value}" if hash.include? key
    hash[key] = value
  end
  hash
end

#parse_numeric(name) (private)

Check if the peek is numeric format and return a Float or Integer. Check if the peek is included in enum if enum is provided. Otherwise raises an error.

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 129

def parse_numeric(name)
  return shift if peek.is_a?(Numeric)

  unless peek =~ NUMERIC && $& == peek
    raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
  end

  value = $&.index(".") ? shift.to_f : shift.to_i
  if @switches.is_a?(Hash) && switch = @switches[name]
    if switch.enum && !switch.enum.include?(value)
      raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
    end
  end
  value
end

#parse_string(name) (private)

Parse string: for –string-arg, just return the current value in the pile for –no-string-arg, nil Check if the peek is included in enum if enum is provided. Otherwise raises an error.

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 150

def parse_string(name)
  if no_or_skip?(name)
    nil
  else
    value = shift
    if @switches.is_a?(Hash) && switch = @switches[name]
      if switch.enum && !switch.enum.include?(value)
        raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
      end
    end
    value
  end
end

#peek (private)

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 68

def peek
  @pile.first
end

#remaining

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 53

def remaining
  @pile
end

#shift (private)

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 72

def shift
  @pile.shift
end

#unshift(arg) (private)

[ GitHub ]

  
# File 'lib/bundler/vendor/thor/lib/thor/parser/arguments.rb', line 76

def unshift(arg)
  if arg.is_a?(Array)
    @pile = arg + @pile
  else
    @pile.unshift(arg)
  end
end