Class: Gem::StreamUI

Inherits:
Object
  • Object
show all
Defined in:
lib/rubygems/user_interaction.rb

Overview

Gem::StreamUI implements a simple stream based user interface.

Direct Known Subclasses

ConsoleUI, MockGemUi, SilentUI

Defined Under Namespace

Classes: SilentDownloadReporter, SilentProgressReporter, SimpleProgressReporter, VerboseDownloadReporter, VerboseProgressReporter

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(in_stream, out_stream, err_stream = STDERR, usetty = true) ⇒ StreamUI

Returns a new instance of StreamUI.



131
132
133
134
135
136
# File 'lib/rubygems/user_interaction.rb', line 131

def initialize(in_stream, out_stream, err_stream=STDERR, usetty=true)
  @ins = in_stream
  @outs = out_stream
  @errs = err_stream
  @usetty = usetty
end

Instance Attribute Details

#errsObject (readonly)

Returns the value of attribute errs



129
130
131
# File 'lib/rubygems/user_interaction.rb', line 129

def errs
  @errs
end

#insObject (readonly)

Returns the value of attribute ins



129
130
131
# File 'lib/rubygems/user_interaction.rb', line 129

def ins
  @ins
end

#outsObject (readonly)

Returns the value of attribute outs



129
130
131
# File 'lib/rubygems/user_interaction.rb', line 129

def outs
  @outs
end

Instance Method Details

#alert(statement, question = nil) ⇒ Object

Display an informational alert. Will ask question if it is not nil.



297
298
299
300
# File 'lib/rubygems/user_interaction.rb', line 297

def alert(statement, question=nil)
  @outs.puts "INFO:  #{statement}"
  ask(question) if question
end

#alert_error(statement, question = nil) ⇒ Object

Display an error message in a location expected to get error messages. Will ask question if it is not nil.



315
316
317
318
# File 'lib/rubygems/user_interaction.rb', line 315

def alert_error(statement, question=nil)
  @errs.puts "ERROR:  #{statement}"
  ask(question) if question
end

#alert_warning(statement, question = nil) ⇒ Object

Display a warning in a location expected to get error messages. Will ask question if it is not nil.



306
307
308
309
# File 'lib/rubygems/user_interaction.rb', line 306

def alert_warning(statement, question=nil)
  @errs.puts "WARNING:  #{statement}"
  ask(question) if question
end

#ask(question) ⇒ Object

Ask a question. Returns an answer if connected to a tty, nil otherwise.



210
211
212
213
214
215
216
217
218
219
# File 'lib/rubygems/user_interaction.rb', line 210

def ask(question)
  return nil if not tty?

  @outs.print(question + "  ")
  @outs.flush

  result = @ins.gets
  result.chomp! if result
  result
end

#ask_for_password(question) ⇒ Object



225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/rubygems/user_interaction.rb', line 225

def ask_for_password(question)
  return nil if not tty?

  require 'io/console'

  @outs.print(question + "  ")
  @outs.flush

  password = @ins.noecho {@ins.gets}
  password.chomp! if password
  password
end

#ask_for_password_on_unixObject



276
277
278
279
280
281
282
283
284
# File 'lib/rubygems/user_interaction.rb', line 276

def ask_for_password_on_unix
  return nil if not tty?

  system "stty -echo"
  password = @ins.gets
  password.chomp! if password
  system "stty echo"
  password
end

#ask_for_password_on_windowsObject



253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
# File 'lib/rubygems/user_interaction.rb', line 253

def ask_for_password_on_windows
  return nil if not tty?

  require "Win32API"
  char = nil
  password = ''

  while char = Win32API.new("crtdll", "_getch", [ ], "L").Call do
    break if char == 10 || char == 13 # received carriage return or newline
    if char == 127 || char == 8 # backspace and delete
      password.slice!(-1, 1)
    else
      password << char.chr
    end
  end

  puts
  password
end

#ask_yes_no(question, default = nil) ⇒ Object

Ask a question. Returns a true for yes, false for no. If not connected to a tty, raises an exception if default is nil, otherwise returns default.



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/rubygems/user_interaction.rb', line 174

def ask_yes_no(question, default=nil)
  unless tty? then
    if default.nil? then
      raise Gem::OperationNotSupportedError,
            "Not connected to a tty and no default specified"
    else
      return default
    end
  end

  default_answer = case default
                   when nil
                     'yn'
                   when true
                     'Yn'
                   else
                     'yN'
                   end

  result = nil

  while result.nil? do
    result = case ask "#{question} [#{default_answer}]"
             when /^y/i then true
             when /^n/i then false
             when /^$/  then default
             else            nil
             end
  end

  return result
end

#choose_from_list(question, list) ⇒ Object

Choose from a list of options. question is a prompt displayed above the list. list is a list of option strings. Returns the pair [option_name, option_index].



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/rubygems/user_interaction.rb', line 151

def choose_from_list(question, list)
  @outs.puts question

  list.each_with_index do |item, index|
    @outs.puts " #{index+1}. #{item}"
  end

  @outs.print "> "
  @outs.flush

  result = @ins.gets

  return nil, nil unless result

  result = result.strip.to_i - 1
  return list[result], result
end

#debug(statement) ⇒ Object

Display a debug message on the same location as error messages.



323
324
325
# File 'lib/rubygems/user_interaction.rb', line 323

def debug(statement)
  @errs.puts statement
end

#download_reporter(*args) ⇒ Object

Return a download reporter object chosen from the current verbosity



444
445
446
447
448
449
450
451
452
453
454
455
# File 'lib/rubygems/user_interaction.rb', line 444

def download_reporter(*args)
  if self.kind_of?(Gem::SilentUI)
    return SilentDownloadReporter.new(@outs, *args)
  end

  case Gem.configuration.verbose
  when nil, false
    SilentDownloadReporter.new(@outs, *args)
  else
    VerboseDownloadReporter.new(@outs, *args)
  end
end

#progress_reporter(*args) ⇒ Object

Return a progress reporter object chosen from the current verbosity.



338
339
340
341
342
343
344
345
346
347
348
349
350
351
# File 'lib/rubygems/user_interaction.rb', line 338

def progress_reporter(*args)
  if self.kind_of?(Gem::SilentUI)
    return SilentProgressReporter.new(@outs, *args)
  end

  case Gem.configuration.verbose
  when nil, false
    SilentProgressReporter.new(@outs, *args)
  when true
    SimpleProgressReporter.new(@outs, *args)
  else
    VerboseProgressReporter.new(@outs, *args)
  end
end

#say(statement = "") ⇒ Object

Display a statement.



290
291
292
# File 'lib/rubygems/user_interaction.rb', line 290

def say(statement="")
  @outs.puts statement
end

#terminate_interaction(status = 0) ⇒ Object

Terminate the application with exit code status, running any exit handlers that might have been defined.



331
332
333
# File 'lib/rubygems/user_interaction.rb', line 331

def terminate_interaction(status = 0)
  raise Gem::SystemExitException, status
end

#tty?Boolean

Returns:

  • (Boolean)


138
139
140
141
142
143
144
# File 'lib/rubygems/user_interaction.rb', line 138

def tty?
  if RUBY_VERSION < '1.9.3' and RUBY_PLATFORM =~ /mingw|mswin/ then
    @usetty
  else
    @usetty && @ins.tty?
  end
end