class Cliprompt::Optionset

Attributes

aslist[R]
boolean[R]
choices[R]
default[R]
envdefault[R]

Public Class Methods

new(options = nil) click to toggle source
# File lib/cliprompt/optionset.rb, line 10
def initialize(options = nil)
  @choices = []
  @default = nil
  @boolean = false
  @envdefault = nil
  @aslist = false
  @type = options.class.name.downcase
  meth = "parse_#{@type}".to_sym
  if respond_to? meth
    send(meth, options)
  else
    fail OptionException, "Undefined parser ::#{meth}"
  end
end

Public Instance Methods

ask_again(question, msg) click to toggle source
# File lib/cliprompt/optionset.rb, line 165
def ask_again(question, msg)
  Cliprompt.shout msg
  Cliprompt.ask question, self
end
check_boolean(question, answer) click to toggle source
# File lib/cliprompt/optionset.rb, line 149
def check_boolean(question, answer)
  return ask_again(question, Cliprompt::MSG_YES_OR_NO) unless /^([yY1](es)?|[nN0](o)?)$/.match(answer)
  !/^[yY1](es)?$/.match(answer).nil?
end
check_choices(question, answer) click to toggle source
# File lib/cliprompt/optionset.rb, line 154
def check_choices(question, answer)
  return ask_again(question, Cliprompt::MSG_CHOSE_IN_LIST) unless @choices.include?(answer)
  answer
end
check_default(question) click to toggle source
# File lib/cliprompt/optionset.rb, line 144
def check_default(question)
  return ask_again(question, Cliprompt::MSG_MANDATORY_TEXT) if @default.nil?
  @default
end
check_list(question, answer) click to toggle source
# File lib/cliprompt/optionset.rb, line 159
def check_list(question, answer)
  return ask_again(question, Cliprompt::MSG_CHOSE_IN_LIST) unless answer.to_i < @choices.count
  return ask_again(question, Cliprompt::MSG_INPUT_A_NUMBER) unless /[0-9]+/.match(answer)
  @choices[answer.to_i]
end
display() click to toggle source
# File lib/cliprompt/optionset.rb, line 79
def display
  if @boolean
    display_boolean
  elsif @choices.count > 0
    if @aslist
      display_list
    else
      display_choices
    end
  else
    display_default
  end
end
display_boolean() click to toggle source
# File lib/cliprompt/optionset.rb, line 93
def display_boolean
  @default ? "[Y/n] " : "[y/N] "
end
display_choices() click to toggle source
# File lib/cliprompt/optionset.rb, line 111
def display_choices
  back = ''
  if @choices.count > 0
    back << "(#{@choices.join(' / ')}) "
  end
  back << display_default.to_s
  return back
end
display_default() click to toggle source
# File lib/cliprompt/optionset.rb, line 120
def display_default
  "[#{@default}] " if @default
end
display_default_index() click to toggle source
# File lib/cliprompt/optionset.rb, line 124
def display_default_index
  "[#{@choices.index(@default)}] " if @default
end
display_list() click to toggle source
# File lib/cliprompt/optionset.rb, line 97
def display_list
  back = "\n"
  choices.each_with_index do |choice, i|
    if @default == choice
      back << sprintf("> %-3s %s\n", i, choice)
    else
      back << sprintf("  %-3s %s\n", i, choice)
    end
  end
  back << "#{Cliprompt::MSG_CHOSE_A_NUMBER} "
  back << display_default_index.to_s
  return back
end
parse_array(args) click to toggle source
# File lib/cliprompt/optionset.rb, line 47
def parse_array(args)
  @choices = args.map(&:to_s).map do |a|
    if a[0] && a[0] == '='
      @default = a[1..-1]
    else
      a
    end
  end
  @aslist = (@choices.count > 5)
end
parse_fixnum(arg) click to toggle source
# File lib/cliprompt/optionset.rb, line 58
def parse_fixnum(arg)
  @default = arg.to_s
end
parse_float(arg) click to toggle source
# File lib/cliprompt/optionset.rb, line 62
def parse_float(arg)
  @default = arg.to_s
end
parse_hash(args) click to toggle source
# File lib/cliprompt/optionset.rb, line 29
def parse_hash(args)
  @choices = args[:choices] || args['choices'] || []
  parse_array @choices
  if args[:default] == false || args['default'] == false
    @default ||= false
  else
    @default ||= args[:default] || args['default']
  end
  if args[:aslist] == false || args['aslist'] == false
    @aslist = false
  elsif args[:aslist] == true || args['aslist'] == true
    @aslist = true
  end
  @boolean = args[:boolean] || args['boolean']
  @default = true if (@boolean && @default.nil?)
  @envdefault = args[:env] || args['env']
end
parse_nilclass(args) click to toggle source

placeholder for nil type objects

# File lib/cliprompt/optionset.rb, line 26
def parse_nilclass(args)
end
parse_string(arg) click to toggle source
# File lib/cliprompt/optionset.rb, line 66
def parse_string(arg)
  if /^[yY1](es)?(\/)?[nN0](o)?/.match(arg)
    @boolean = true
    if /y(es)?(\/)?N/.match(arg)
      @default = false
    else
      @default = true
    end
  else
    @default = arg
  end
end
validate(question, answer) click to toggle source
# File lib/cliprompt/optionset.rb, line 128
def validate(question, answer)
  if answer == ''
    check_default question
  elsif @boolean
    check_boolean question, answer
  elsif @choices.count > 0
    if @aslist
      check_list question, answer
    else
      check_choices question, answer
    end
  else
    answer
  end
end