Included Modules

Files

Commander::UI

User Interaction

Commander's user interaction module mixes in common methods which extend HighLine's functionality such as a password method rather than calling ask directly.

Public Instance Methods

applescript(script) click to toggle source

Execute apple script.

# File lib/commander/user_interaction.rb, line 183
def applescript script
  `osascript -e "#{ script.gsub('"', '\"') }"`
end
ask_editor(input = nil, editor = ENV['EDITOR'] || 'mate') click to toggle source

Prompt editor for input. Optionally supply initial input which is written to the editor.

The editor defaults to the EDITOR environment variable when present, or 'mate' for TextMate.

Examples

ask_editor                # => prompts EDITOR with no input
ask_editor('foo')         # => prompts EDITOR with default text of 'foo'
ask_editor('foo', :mate)  # => prompts TextMate with default text of 'foo'
# File lib/commander/user_interaction.rb, line 242
def ask_editor input = nil, editor = ENV['EDITOR'] || 'mate'
  IO.popen(editor.to_s, 'w+') do |pipe|
    pipe.puts input.to_s unless input.nil?
    pipe.close_write
    pipe.read
  end
end
choose(message, *choices) click to toggle source

Choose from a set array of choices.

# File lib/commander/user_interaction.rb, line 41
def choose message, *choices
  say message
  super *choices
end
color(*args) click to toggle source

'Say' something using the specified color

Examples

color 'I am blue', :blue
color 'I am bold', :bold
color 'White on Red', :white, :on_red

Notes

You may use:
* color:    black blue cyan green magenta red white yellow
* style:    blink bold clear underline
* highligh: on_<color>
# File lib/commander/user_interaction.rb, line 115
def color(*args)
  say $terminal.color(*args)
end
converse(prompt, responses = {}) click to toggle source

Converse with speech recognition.

Currently a "poorman's" DSL to utilize applescript and the MacOS speech recognition server.

Examples

case converse 'What is the best food?', :cookies => 'Cookies', :unknown => 'Nothing'
when :cookies 
  speak 'o.m.g. you are awesome!'
else
  case converse 'That is lame, shall I convince you cookies are the best?', :yes => 'Ok', :no => 'No', :maybe => 'Maybe another time'
  when :yes
    speak 'Well you see, cookies are just fantastic.'
  else
    speak 'Ok then, bye.'
  end
end

Notes

  • MacOS only

# File lib/commander/user_interaction.rb, line 163
def converse prompt, responses = {}
  i, commands = 0, responses.map { |key, value| value.inspect }.join(',')
  statement = responses.inject '' do |statement, (key, value)|
    statement << (((i += 1) == 1 ? 
      %(if response is "#{value}" then\n):
        %(else if response is "#{value}" then\n))) <<
          %(do shell script "echo '#{key}'"\n)
  end
  applescript(%(
    tell application "SpeechRecognitionServer" 
      set response to listen for {#{commands}} with prompt "#{prompt}"
      #{statement}
      end if
    end tell
  )).strip.to_sym
end
enable_paging() click to toggle source

Enable paging of output after called.

# File lib/commander/user_interaction.rb, line 253
def enable_paging
  return unless $stdout.tty?
  return if Platform::jruby? # Fork is not supported by JRuby
  read, write = IO.pipe

  if Kernel.fork
    $stdin.reopen read
    read.close; write.close
    Kernel.select [$stdin]
    ENV['LESS'] = 'FSRX'
    pager = ENV['PAGER'] || 'less'
    exec pager rescue exec '/bin/sh', '-c', pager
  else
    $stdout.reopen write
    $stderr.reopen write if $stderr.tty?
    read.close; write.close
    return
  end
end
io(input = nil, output = nil, &block) click to toggle source

Normalize IO streams, allowing for redirection of input and/or output, for example:

$ foo              # => read from terminal I/O
$ foo in           # => read from 'in' file, output to terminal output stream
$ foo in out       # => read from 'in' file, output to 'out' file
$ foo < in > out   # => equivalent to above (essentially)

Optionally a block may be supplied, in which case IO will be reset once the block has executed.

Examples

command :foo do |c|
  c.syntax = 'foo [input] [output]'
  c.when_called do |args, options|
    # or io(args.shift, args.shift)
    io *args
    str = $stdin.gets
    puts 'input was: ' + str.inspect
  end
end
# File lib/commander/user_interaction.rb, line 212
def io input = nil, output = nil, &block
  $stdin = File.new(input) if input
  $stdout = File.new(output, 'r+') if output
  if block
    yield
    reset_io
  end
end
log(action, *args) click to toggle source

'Log' an action to the terminal. This is typically used for verbose output regarding actions performed. For example:

create  path/to/file.rb
remove  path/to/old_file.rb
remove  path/to/old_file2.rb
# File lib/commander/user_interaction.rb, line 55
def log action, *args
  say '%15s  %s' % [action, args.join(' ')]
end
password(message = 'Password: ', mask = '*') click to toggle source

Ask the user for a password. Specify a custom message other than 'Password: ' or override the default mask of '*'.

# File lib/commander/user_interaction.rb, line 32
def password message = 'Password: ', mask = '*'
  pass = ask(message) { |q| q.echo = mask }
  pass = password message, mask if pass.nil? || pass.empty?
  pass
end
progress(arr, options = {}) click to toggle source

Output progress while iterating arr.

Examples

uris = %w( http://vision-media.ca http://google.com )
progress uris, :format => "Remaining: :time_remaining" do |uri|
  res = open uri
end
# File lib/commander/user_interaction.rb, line 284
def progress arr, options = {}, &block
  bar = ProgressBar.new arr.length, options
  bar.show
  arr.each { |v| bar.increment yield(v) }
end
reset_io() click to toggle source

Reset IO to initial constant streams.

# File lib/commander/user_interaction.rb, line 224
def reset_io
  $stdin, $stdout = STDIN, STDOUT
end
say_error(*args) click to toggle source

'Say' something using the ERROR color (red).

Examples

say_error 'Everything is not fine'
say_error 'It is not ok', 'This is not ok too'
# File lib/commander/user_interaction.rb, line 95
def say_error *args
  args.each do |arg|
    say $terminal.color(arg, :red)
  end
end
say_ok(*args) click to toggle source

'Say' something using the OK color (green).

Examples

say_ok 'Everything is fine'
say_ok 'It is ok', 'This is ok too'
# File lib/commander/user_interaction.rb, line 67
def say_ok *args
  args.each do |arg|
    say $terminal.color(arg, :green)
  end
end
say_warning(*args) click to toggle source

'Say' something using the WARNING color (yellow).

Examples

say_warning 'This is a warning'
say_warning 'Be careful', 'Think about it'
# File lib/commander/user_interaction.rb, line 81
def say_warning *args
  args.each do |arg|
    say $terminal.color(arg, :yellow)
  end
end
speak(message, voice = :Alex) click to toggle source

Speak message using voice which defaults to 'Alex', which is one of the better voices.

Examples

speak 'What is your favorite food? '
food = ask 'favorite food?: '
speak "wow, I like #{food} too. We have so much alike."

Notes

  • MacOS only

# File lib/commander/user_interaction.rb, line 134
def speak message, voice = :Alex
  Thread.new { applescript "say #{message.inspect} using #{voice.to_s.inspect}" }
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.