Commander’s user interaction module mixes in common methods which extend HighLine’s functionality such as a password method rather than calling ask directly.
Execute apple script.
# File lib/commander/user_interaction.rb, line 188 def applescript script `osascript -e "#{ script.gsub('"', '\"') }"` end
Prompt an editor for input. Optionally supply initial input which is written to the editor.
preferred_editor can be hinted.
ask_editor # => prompts EDITOR with no input ask_editor('foo') # => prompts EDITOR with default text of 'foo' ask_editor('foo', 'mate -w') # => prompts TextMate with default text of 'foo'
# File lib/commander/user_interaction.rb, line 256 def ask_editor input = nil, preferred_editor = nil editor = available_editor preferred_editor program = Commander::Runner.instance.program(:name).downcase rescue 'commander' tmpfile = Tempfile.new program begin tmpfile.write input if input tmpfile.close system("#{editor} #{tmpfile.path.shellescape}") ? IO.read(tmpfile.path) : nil ensure tmpfile.unlink end end
Find an editor available in path. Optionally supply the preferred editor. Returns the name as a string, nil if none is available.
# File lib/commander/user_interaction.rb, line 237 def available_editor preferred = nil [preferred, ENV['EDITOR'], 'mate -w', 'vim', 'vi', 'emacs', 'nano', 'pico']. compact. find {|name| system("hash #{name.split.first} 2>&-") } end
Choose from a set array of choices.
# File lib/commander/user_interaction.rb, line 43 def choose message, *choices say message super(*choices) end
‘Say’ something using the specified color
color 'I am blue', :blue color 'I am bold', :bold color 'White on Red', :white, :on_red
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 117 def color(*args) say $terminal.color(*args) end
Converse with speech recognition.
Currently a “poorman’s” DSL to utilize applescript and the MacOS speech recognition server.
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
MacOS only
# File lib/commander/user_interaction.rb, line 168 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 of output after called.
# File lib/commander/user_interaction.rb, line 272 def enable_paging return unless $stdout.tty? return unless Process.respond_to? :fork read, write = IO.pipe # Kernel.fork is not supported on all platforms and configurations. # As of Ruby 1.9, `Process.respond_to? :fork` should return false on # configurations that don't support it, but versions before 1.9 don't # seem to do this reliably and instead raise a NotImplementedError # (which is rescued below). if Kernel.fork $stdin.reopen read write.close; read.close Kernel.select [$stdin] ENV['LESS'] = 'FSRX' unless ENV.key? 'LESS' pager = ENV['PAGER'] || 'less' exec pager rescue exec '/bin/sh', '-c', pager else # subprocess $stdout.reopen write $stderr.reopen write if $stderr.tty? write.close; read.close end rescue NotImplementedError ensure write.close if write && !write.closed? read.close if read && !read.closed? end
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.
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 217 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’ 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 57 def log action, *args say '%15s %s' % [action, args.join(' ')] end
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 34 def password message = 'Password: ', mask = '*' pass = ask(message) { |q| q.echo = mask } pass = password message, mask if pass.nil? || pass.empty? pass end
Output progress while iterating arr.
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 313 def progress arr, options = {}, &block bar = ProgressBar.new arr.length, options bar.show arr.each { |v| bar.increment yield(v) } end
Reset IO to initial constant streams.
# File lib/commander/user_interaction.rb, line 229 def reset_io $stdin, $stdout = STDIN, STDOUT end
‘Say’ something using the ERROR color (red).
say_error 'Everything is not fine' say_error 'It is not ok', 'This is not ok too'
# File lib/commander/user_interaction.rb, line 97 def say_error *args args.each do |arg| say $terminal.color(arg, :red) end end
‘Say’ something using the OK color (green).
say_ok 'Everything is fine' say_ok 'It is ok', 'This is ok too'
# File lib/commander/user_interaction.rb, line 69 def say_ok *args args.each do |arg| say $terminal.color(arg, :green) end end
‘Say’ something using the WARNING color (yellow).
say_warning 'This is a warning' say_warning 'Be careful', 'Think about it'
# File lib/commander/user_interaction.rb, line 83 def say_warning *args args.each do |arg| say $terminal.color(arg, :yellow) end end
Speak message using voice at a speaking rate of rate
Voice defaults to ‘Alex’, which is one of the better voices. Speaking rate defaults to 175 words per minute
speak 'What is your favorite food? ' food = ask 'favorite food?: ' speak "Wow, I like #{food} too. We have so much in common." speak "I like #{food} as well!", "Victoria", 190
MacOS only
# File lib/commander/user_interaction.rb, line 139 def speak message, voice = :Alex, rate = 175 Thread.new { applescript "say #{message.inspect} using #{voice.to_s.inspect} speaking rate #{rate}" } end
Generated with the Darkfish Rdoc Generator 2.