module Doing::PromptInput

Methods for requesting user text input

Public Instance Methods

enter_text(prompt, default_response: '') click to toggle source

Request single-line input

@param prompt [String] The prompt @param default_response [String] The default response returned if :default_answer is true

@return [String] The user response

@deprecated Use {#read_line} instead

# File lib/doing/prompt/input.rb, line 19
def enter_text(prompt, default_response: '')
  $stdin.reopen('/dev/tty')
  return default_response if @default_answer

  print "#{yellow(prompt).sub(/:?$/, ':')} #{reset}"
  $stdin.gets.strip
end
read_line(prompt: 'Enter text', completions: [], default_response: '') click to toggle source

Request single-line input using Readline. Allows for control sequences and tab completions

@param prompt [String] The prompt @param completions [Array] Array of tab completions @param default_response [String] The default response returned if :default_answer is true

@return [String] User input string

# File lib/doing/prompt/input.rb, line 41
def read_line(prompt: 'Enter text', completions: [], default_response: '')
  $stdin.reopen('/dev/tty')
  return default_response if @default_answer

  unless completions.empty?
    completions.sort!
    comp = proc { |s| completions.grep(/^#{Regexp.escape(s)}/) }
    Readline.completion_append_character = ' '
    Readline.completion_proc = comp
  end

  begin
    Readline.readline("#{yellow(prompt).sub(/:?$/, ':')} #{reset}", true).strip
  rescue Interrupt
    raise UserCancelled
  end
end
read_lines(prompt: 'Enter text', completions: [], default_response: '') click to toggle source

Request multi-line input using Readline. Allows for control sequences and tab completion

@param prompt [String] The prompt @param completions [Array] Array of tab completions @param default_response [String] The default response returned if :default_answer is true

@return [String] Multi-line result, joined with newlines

# File lib/doing/prompt/input.rb, line 73
def read_lines(prompt: 'Enter text', completions: [], default_response: '')
  $stdin.reopen('/dev/tty')
  return default_response if @default_answer

  completions.sort!
  comp = proc { |s| completions.grep(/^#{Regexp.escape(s)}/) }
  Readline.completion_append_character = ' '
  Readline.completion_proc = comp
  puts format(['%<promptcolor>s%<prompt>s %<textcolor>sEnter a blank line',
    '(%<keycolor>sreturn twice%<textcolor>s)',
    'to end editing and save,',
    '%<keycolor>sCTRL-C%<textcolor>s to cancel%<reset>s'].join(' '),
    { promptcolor: boldgreen, prompt: prompt.sub(/:?$/, ':'),
      textcolor: yellow, keycolor: boldwhite, reset: reset })

  res = []

  begin
    while (line = Readline.readline('> ', true))
      break if line.strip.empty?

      res << line.chomp
    end
  rescue Interrupt
    return nil
  end

  res.join("\n").strip
end
request_lines(prompt: 'Enter text', default_response: '') click to toggle source

Request multi-line input

@param prompt [String] The prompt @param default_response [String] The default response, returned if :default_answer is true

@deprecated Use {#read_lines} instead

# File lib/doing/prompt/input.rb, line 113
def request_lines(prompt: 'Enter text', default_response: '')
  $stdin.reopen('/dev/tty')
  return default_response if @default_answer

  ask_note = []
  reader = TTY::Reader.new(interrupt: -> { raise Errors::UserCancelled }, track_history: false)
  puts "#{boldgreen(prompt.sub(/:?$/, ':'))} #{yellow('Hit return for a new line, ')}#{boldwhite('enter a blank line (')}#{boldyellow('return twice')}#{boldwhite(') to end editing')}"
  loop do
    res = reader.read_line(green('> '))
    break if res.strip.empty?

    ask_note.push(res)
  end
  ask_note.join("\n").strip
end