rubygems-update 1.5.3 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (79) hide show
  1. data.tar.gz.sig +2 -1
  2. data/History.txt +60 -9
  3. data/Manifest.txt +1 -1
  4. data/Rakefile +0 -2
  5. data/lib/rubygems.rb +142 -65
  6. data/lib/rubygems/commands/owner_command.rb +3 -2
  7. data/lib/rubygems/commands/pristine_command.rb +5 -3
  8. data/lib/rubygems/commands/push_command.rb +8 -4
  9. data/lib/rubygems/commands/setup_command.rb +1 -2
  10. data/lib/rubygems/commands/uninstall_command.rb +5 -0
  11. data/lib/rubygems/commands/unpack_command.rb +10 -16
  12. data/lib/rubygems/config_file.rb +12 -5
  13. data/lib/rubygems/custom_require.rb +27 -7
  14. data/lib/rubygems/dependency.rb +33 -8
  15. data/lib/rubygems/dependency_installer.rb +21 -6
  16. data/lib/rubygems/dependency_list.rb +35 -3
  17. data/lib/rubygems/doc_manager.rb +6 -4
  18. data/lib/rubygems/gem_path_searcher.rb +45 -1
  19. data/lib/rubygems/gemcutter_utilities.rb +33 -0
  20. data/lib/rubygems/indexer.rb +1 -0
  21. data/lib/rubygems/installer.rb +11 -7
  22. data/lib/rubygems/installer_test_case.rb +23 -15
  23. data/lib/rubygems/mock_gem_ui.rb +1 -1
  24. data/lib/rubygems/remote_fetcher.rb +29 -10
  25. data/lib/rubygems/requirement.rb +1 -1
  26. data/lib/rubygems/security.rb +1 -0
  27. data/lib/rubygems/source_index.rb +3 -2
  28. data/lib/rubygems/spec_fetcher.rb +3 -1
  29. data/lib/rubygems/specification.rb +54 -12
  30. data/lib/rubygems/test_case.rb +99 -28
  31. data/lib/rubygems/test_utilities.rb +11 -1
  32. data/lib/rubygems/uninstaller.rb +22 -11
  33. data/lib/rubygems/user_interaction.rb +50 -29
  34. data/lib/rubygems/validator.rb +1 -1
  35. data/test/rubygems/fix_openssl_warnings.rb +12 -0
  36. data/test/rubygems/plugin/load/rubygems_plugin.rb +3 -1
  37. data/test/rubygems/test_gem.rb +384 -38
  38. data/test/rubygems/test_gem_builder.rb +1 -1
  39. data/test/rubygems/test_gem_command_manager.rb +2 -2
  40. data/test/rubygems/test_gem_commands_build_command.rb +1 -1
  41. data/test/rubygems/test_gem_commands_cert_command.rb +2 -1
  42. data/test/rubygems/test_gem_commands_dependency_command.rb +6 -5
  43. data/test/rubygems/test_gem_commands_fetch_command.rb +4 -4
  44. data/test/rubygems/test_gem_commands_install_command.rb +21 -18
  45. data/test/rubygems/test_gem_commands_lock_command.rb +1 -1
  46. data/test/rubygems/test_gem_commands_outdated_command.rb +2 -5
  47. data/test/rubygems/test_gem_commands_owner_command.rb +42 -0
  48. data/test/rubygems/test_gem_commands_pristine_command.rb +28 -8
  49. data/test/rubygems/test_gem_commands_push_command.rb +31 -5
  50. data/test/rubygems/test_gem_commands_specification_command.rb +8 -8
  51. data/test/rubygems/test_gem_commands_stale_command.rb +4 -2
  52. data/test/rubygems/test_gem_commands_uninstall_command.rb +23 -4
  53. data/test/rubygems/test_gem_commands_unpack_command.rb +10 -8
  54. data/test/rubygems/test_gem_commands_update_command.rb +16 -13
  55. data/test/rubygems/test_gem_commands_which_command.rb +1 -1
  56. data/test/rubygems/test_gem_config_file.rb +14 -0
  57. data/test/rubygems/test_gem_dependency.rb +39 -0
  58. data/test/rubygems/test_gem_dependency_installer.rb +213 -92
  59. data/test/rubygems/test_gem_dependency_list.rb +37 -17
  60. data/test/rubygems/test_gem_doc_manager.rb +5 -4
  61. data/test/rubygems/test_gem_format.rb +2 -2
  62. data/test/rubygems/test_gem_gemcutter_utilities.rb +48 -0
  63. data/test/rubygems/test_gem_indexer.rb +11 -10
  64. data/test/rubygems/test_gem_install_update_options.rb +0 -2
  65. data/test/rubygems/test_gem_installer.rb +151 -78
  66. data/test/rubygems/test_gem_package_tar_output.rb +3 -0
  67. data/test/rubygems/test_gem_remote_fetcher.rb +23 -14
  68. data/test/rubygems/test_gem_requirement.rb +4 -0
  69. data/test/rubygems/test_gem_security.rb +1 -0
  70. data/test/rubygems/test_gem_source_index.rb +17 -16
  71. data/test/rubygems/test_gem_spec_fetcher.rb +6 -1
  72. data/test/rubygems/test_gem_specification.rb +81 -31
  73. data/test/rubygems/test_gem_stream_ui.rb +11 -1
  74. data/test/rubygems/test_gem_uninstaller.rb +70 -10
  75. data/test/rubygems/test_gem_validator.rb +1 -1
  76. data/test/rubygems/test_kernel.rb +1 -1
  77. metadata +7 -7
  78. metadata.gz.sig +0 -0
  79. data/ChangeLog +0 -5811
@@ -21,13 +21,6 @@ require 'pp'
21
21
  require 'zlib'
22
22
  Gem.load_yaml
23
23
 
24
- begin
25
- gem 'rdoc'
26
- rescue Gem::LoadError
27
- end
28
-
29
- require 'rdoc/rdoc'
30
-
31
24
  require 'rubygems/mock_gem_ui'
32
25
 
33
26
  module Gem
@@ -88,6 +81,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase
88
81
  undef_method :default_test if instance_methods.include? 'default_test' or
89
82
  instance_methods.include? :default_test
90
83
 
84
+ @@project_dir = Dir.pwd
85
+
91
86
  ##
92
87
  # #setup prepares a sandboxed location to install gems. All installs are
93
88
  # directed to a temporary directory. All install plugins are removed.
@@ -117,8 +112,6 @@ class Gem::TestCase < MiniTest::Unit::TestCase
117
112
  @gemhome = File.join @tempdir, 'gemhome'
118
113
  @userhome = File.join @tempdir, 'userhome'
119
114
 
120
- Gem.ensure_gem_subdirectories @gemhome
121
-
122
115
  @orig_ruby = if ruby = ENV['RUBY'] then
123
116
  Gem.class_eval { ruby, @ruby = @ruby, ruby }
124
117
  ruby
@@ -126,6 +119,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase
126
119
 
127
120
  Gem.ensure_gem_subdirectories @gemhome
128
121
 
122
+ Dir.chdir @tempdir
123
+
129
124
  @orig_ENV_HOME = ENV['HOME']
130
125
  ENV['HOME'] = @userhome
131
126
  Gem.instance_variable_set :@user_home, nil
@@ -135,6 +130,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
135
130
 
136
131
  Gem.use_paths(@gemhome)
137
132
  Gem.loaded_specs.clear
133
+ Gem.unresolved_deps.clear
138
134
 
139
135
  Gem.configuration.verbose = true
140
136
  Gem.configuration.update_sources = true
@@ -143,6 +139,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
143
139
  @uri = URI.parse @gem_repo
144
140
  Gem.sources.replace [@gem_repo]
145
141
 
142
+ Gem.searcher = nil
146
143
  Gem::SpecFetcher.fetcher = nil
147
144
 
148
145
  @orig_BASERUBY = Gem::ConfigMap[:BASERUBY]
@@ -158,17 +155,14 @@ class Gem::TestCase < MiniTest::Unit::TestCase
158
155
 
159
156
  @marshal_version = "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
160
157
 
161
- @private_key = File.expand_path('../../../test/rubygems/private_key.pem',
162
- __FILE__)
163
- @public_cert = File.expand_path('../../../test/rubygems/public_cert.pem',
164
- __FILE__)
165
-
158
+ # TODO: move to installer test cases
166
159
  Gem.post_build_hooks.clear
167
160
  Gem.post_install_hooks.clear
168
161
  Gem.post_uninstall_hooks.clear
169
162
  Gem.pre_install_hooks.clear
170
163
  Gem.pre_uninstall_hooks.clear
171
164
 
165
+ # TODO: move to installer test cases
172
166
  Gem.post_build do |installer|
173
167
  @post_build_hook_arg = installer
174
168
  true
@@ -208,6 +202,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase
208
202
  Gem::RemoteFetcher.fetcher = nil
209
203
  end
210
204
 
205
+ Dir.chdir @@project_dir
206
+
211
207
  FileUtils.rm_rf @tempdir unless ENV['KEEP_FILES']
212
208
 
213
209
  ENV['GEM_HOME'] = @orig_gem_home
@@ -308,14 +304,14 @@ class Gem::TestCase < MiniTest::Unit::TestCase
308
304
  require 'rubygems/specification'
309
305
 
310
306
  spec = Gem::Specification.new do |s|
311
- s.platform = Gem::Platform::RUBY
312
- s.name = name
313
- s.version = version
314
- s.author = 'A User'
315
- s.email = 'example@example.com'
316
- s.homepage = 'http://example.com'
317
- s.has_rdoc = true
318
- s.summary = "this is a summary"
307
+ s.platform = Gem::Platform::RUBY
308
+ s.name = name
309
+ s.version = version
310
+ s.author = 'A User'
311
+ s.email = 'example@example.com'
312
+ s.homepage = 'http://example.com'
313
+ s.has_rdoc = true
314
+ s.summary = "this is a summary"
319
315
  s.description = "This is a test description"
320
316
 
321
317
  yield(s) if block_given?
@@ -333,6 +329,30 @@ class Gem::TestCase < MiniTest::Unit::TestCase
333
329
  return spec
334
330
  end
335
331
 
332
+ def quick_spec name, version = '2'
333
+ require 'rubygems/specification'
334
+
335
+ spec = Gem::Specification.new do |s|
336
+ s.platform = Gem::Platform::RUBY
337
+ s.name = name
338
+ s.version = version
339
+ s.author = 'A User'
340
+ s.email = 'example@example.com'
341
+ s.homepage = 'http://example.com'
342
+ s.has_rdoc = true
343
+ s.summary = "this is a summary"
344
+ s.description = "This is a test description"
345
+
346
+ yield(s) if block_given?
347
+ end
348
+
349
+ spec.loaded_from = @gemhome
350
+
351
+ Gem.source_index.add_spec spec
352
+
353
+ return spec
354
+ end
355
+
336
356
  ##
337
357
  # Builds a gem from +spec+ and places it in <tt>File.join @gemhome,
338
358
  # 'cache'</tt>. Automatically creates files based on +spec.files+
@@ -353,7 +373,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
353
373
  end
354
374
 
355
375
  FileUtils.mv spec.file_name,
356
- File.join(@gemhome, 'cache', "#{spec.original_name}.gem")
376
+ Gem.cache_gem("#{spec.original_name}.gem")
357
377
  end
358
378
  end
359
379
 
@@ -361,11 +381,60 @@ class Gem::TestCase < MiniTest::Unit::TestCase
361
381
  # Removes all installed gems from +@gemhome+.
362
382
 
363
383
  def util_clear_gems
364
- FileUtils.rm_r File.join(@gemhome, 'gems')
365
- FileUtils.rm_r File.join(@gemhome, 'specifications')
384
+ FileUtils.rm_rf File.join(@gemhome, 'gems')
385
+ FileUtils.rm_rf File.join(@gemhome, 'specifications')
366
386
  Gem.source_index.refresh!
367
387
  end
368
388
 
389
+ ##
390
+ # Install the provided specs
391
+
392
+ def install_specs(*specs)
393
+ specs.each do |spec|
394
+ # TODO: inverted responsibility
395
+ Gem.source_index.add_spec spec
396
+ end
397
+ Gem.searcher = nil
398
+ end
399
+
400
+ ##
401
+ # Create a new spec (or gem if passed an array of files) and set it
402
+ # up properly. Use this instead of util_spec and util_gem.
403
+
404
+ def new_spec name, version, deps = nil, *files
405
+ # TODO: unfactor and deprecate util_gem and util_spec
406
+ spec, = unless files.empty? then
407
+ util_gem name, version do |s|
408
+ Array(deps).each do |n,v|
409
+ s.add_dependency n, v
410
+ end
411
+ s.files.push(*files)
412
+ end
413
+ else
414
+ util_spec name, version, deps
415
+ end
416
+ spec.loaded_from = File.join @gemhome, 'specifications', spec.spec_name
417
+ spec.loaded = false
418
+ spec
419
+ end
420
+
421
+ ##
422
+ # Creates a spec with +name+, +version+ and +deps+.
423
+
424
+ def util_spec(name, version, deps = nil, &block)
425
+ raise "deps or block, not both" if deps and block
426
+
427
+ if deps then
428
+ block = proc do |s|
429
+ deps.each do |n, req|
430
+ s.add_dependency n, (req || '>= 0')
431
+ end
432
+ end
433
+ end
434
+
435
+ quick_spec(name, version, &block)
436
+ end
437
+
369
438
  ##
370
439
  # Creates a gem with +name+, +version+ and +deps+. The specification will
371
440
  # be yielded before gem creation for customization. The gem will be placed
@@ -373,6 +442,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase
373
442
  # location are returned.
374
443
 
375
444
  def util_gem(name, version, deps = nil, &block)
445
+ raise "deps or block, not both" if deps and block
446
+
376
447
  if deps then
377
448
  block = proc do |s|
378
449
  deps.each do |n, req|
@@ -386,8 +457,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase
386
457
  util_build_gem spec
387
458
 
388
459
  cache_file = File.join @tempdir, 'gems', "#{spec.original_name}.gem"
389
- FileUtils.mv File.join(@gemhome, 'cache', "#{spec.original_name}.gem"),
390
- cache_file
460
+ FileUtils.mkdir_p File.dirname cache_file
461
+ FileUtils.mv Gem.cache_gem("#{spec.original_name}.gem"), cache_file
391
462
  FileUtils.rm File.join(@gemhome, 'specifications', spec.spec_name)
392
463
 
393
464
  spec.loaded_from = nil
@@ -694,7 +765,7 @@ Also, a list:
694
765
 
695
766
  @@ruby = rubybin
696
767
  env_rake = ENV['rake']
697
- ruby19_rake = File.expand_path("../../../bin/rake", __FILE__)
768
+ ruby19_rake = File.expand_path("bin/rake", @@project_dir)
698
769
  @@rake = if env_rake then
699
770
  ENV["rake"]
700
771
  elsif File.exist? ruby19_rake then
@@ -98,7 +98,7 @@ class Gem::FakeFetcher
98
98
 
99
99
  def download spec, source_uri, install_dir = Gem.dir
100
100
  name = spec.file_name
101
- path = File.join(install_dir, 'cache', name)
101
+ path = Gem.cache_gem(name, install_dir)
102
102
 
103
103
  Gem.ensure_gem_subdirectories install_dir
104
104
 
@@ -113,6 +113,16 @@ class Gem::FakeFetcher
113
113
  path
114
114
  end
115
115
 
116
+ def download_to_cache dependency
117
+ found = Gem::SpecFetcher.fetcher.fetch dependency
118
+
119
+ return if found.empty?
120
+
121
+ spec, source_uri = found.first
122
+
123
+ download spec, source_uri
124
+ end
125
+
116
126
  end
117
127
 
118
128
  # :stopdoc:
@@ -50,6 +50,7 @@ class Gem::Uninstaller
50
50
  @force_all = options[:all]
51
51
  @force_ignore = options[:ignore]
52
52
  @bin_dir = options[:bin_dir]
53
+ @format_executable = options[:format_executable]
53
54
 
54
55
  # only add user directory if install_dir is not set
55
56
  @user_install = false
@@ -102,6 +103,13 @@ class Gem::Uninstaller
102
103
  def uninstall_gem(spec, specs)
103
104
  @spec = spec
104
105
 
106
+ unless dependencies_ok? spec
107
+ unless ask_if_ok(spec)
108
+ raise Gem::DependencyRemovalException,
109
+ "Uninstallation aborted due to dependent gem(s)"
110
+ end
111
+ end
112
+
105
113
  Gem.pre_uninstall_hooks.each do |hook|
106
114
  hook.call self
107
115
  end
@@ -155,8 +163,8 @@ class Gem::Uninstaller
155
163
 
156
164
  spec.executables.each do |exe_name|
157
165
  say "Removing #{exe_name}"
158
- FileUtils.rm_f File.join(bindir, exe_name)
159
- FileUtils.rm_f File.join(bindir, "#{exe_name}.bat")
166
+ FileUtils.rm_f File.join(bindir, formatted_program_filename(exe_name))
167
+ FileUtils.rm_f File.join(bindir, "#{formatted_program_filename(exe_name)}.bat")
160
168
  end
161
169
  end
162
170
  end
@@ -178,11 +186,6 @@ class Gem::Uninstaller
178
186
  # uninstalled a gem, it is removed from that list.
179
187
 
180
188
  def remove(spec, list)
181
- unless dependencies_ok? spec then
182
- raise Gem::DependencyRemovalException,
183
- "Uninstallation aborted due to dependent gem(s)"
184
- end
185
-
186
189
  unless path_ok?(@gem_home, spec) or
187
190
  (@user_install and path_ok?(Gem.user_dir, spec)) then
188
191
  e = Gem::GemNotInHomeException.new \
@@ -209,11 +212,10 @@ class Gem::Uninstaller
209
212
 
210
213
  FileUtils.rm_rf gemspec
211
214
 
212
- cache_dir = File.join spec.installation_path, 'cache'
213
- gem = File.join cache_dir, spec.file_name
215
+ gem = Gem.cache_gem(spec.file_name, spec.installation_path)
214
216
 
215
217
  unless File.exist? gem then
216
- gem = File.join cache_dir, "#{original_platform_name}.gem"
218
+ gem = Gem.cache_gem("#{original_platform_name}.gem", spec.installation_path)
217
219
  end
218
220
 
219
221
  FileUtils.rm_rf gem
@@ -240,7 +242,7 @@ class Gem::Uninstaller
240
242
 
241
243
  deplist = Gem::DependencyList.from_source_index @source_index
242
244
  deplist.add(*@user_index.gems.values) if @user_install
243
- deplist.ok_to_remove?(spec.full_name) || ask_if_ok(spec)
245
+ deplist.ok_to_remove?(spec.full_name)
244
246
  end
245
247
 
246
248
  def ask_if_ok(spec)
@@ -257,5 +259,14 @@ class Gem::Uninstaller
257
259
  return ask_yes_no(msg.join("\n"), true)
258
260
  end
259
261
 
262
+ def formatted_program_filename(filename)
263
+ if @format_executable then
264
+ Gem::Installer.exec_format % File.basename(filename)
265
+ else
266
+ filename
267
+ end
268
+ end
269
+
270
+
260
271
  end
261
272
 
@@ -132,10 +132,19 @@ class Gem::StreamUI
132
132
 
133
133
  attr_reader :ins, :outs, :errs
134
134
 
135
- def initialize(in_stream, out_stream, err_stream=STDERR)
135
+ def initialize(in_stream, out_stream, err_stream=STDERR, usetty=true)
136
136
  @ins = in_stream
137
137
  @outs = out_stream
138
138
  @errs = err_stream
139
+ @usetty = usetty
140
+ end
141
+
142
+ def tty?
143
+ if RUBY_PLATFORM =~ /mingw|mswin/
144
+ @usetty
145
+ else
146
+ @usetty && @ins.tty?
147
+ end
139
148
  end
140
149
 
141
150
  ##
@@ -167,7 +176,7 @@ class Gem::StreamUI
167
176
  # default.
168
177
 
169
178
  def ask_yes_no(question, default=nil)
170
- unless @ins.tty? then
179
+ unless tty? then
171
180
  if default.nil? then
172
181
  raise Gem::OperationNotSupportedError,
173
182
  "Not connected to a tty and no default specified"
@@ -176,29 +185,24 @@ class Gem::StreamUI
176
185
  end
177
186
  end
178
187
 
179
- qstr = case default
180
- when nil
181
- 'yn'
182
- when true
183
- 'Yn'
184
- else
185
- 'yN'
186
- end
188
+ default_answer = case default
189
+ when nil
190
+ 'yn'
191
+ when true
192
+ 'Yn'
193
+ else
194
+ 'yN'
195
+ end
187
196
 
188
197
  result = nil
189
198
 
190
- while result.nil?
191
- result = ask("#{question} [#{qstr}]")
192
- result = case result
193
- when /^[Yy].*/
194
- true
195
- when /^[Nn].*/
196
- false
197
- when /^$/
198
- default
199
- else
200
- nil
201
- end
199
+ while result.nil? do
200
+ result = case ask "#{question} [#{default_answer}]"
201
+ when /^y/i then true
202
+ when /^n/i then false
203
+ when /^$/ then default
204
+ else nil
205
+ end
202
206
  end
203
207
 
204
208
  return result
@@ -208,7 +212,7 @@ class Gem::StreamUI
208
212
  # Ask a question. Returns an answer if connected to a tty, nil otherwise.
209
213
 
210
214
  def ask(question)
211
- return nil if not @ins.tty?
215
+ return nil if not tty?
212
216
 
213
217
  @outs.print(question + " ")
214
218
  @outs.flush
@@ -223,7 +227,7 @@ class Gem::StreamUI
223
227
  # Ask for a password. Does not echo response to terminal.
224
228
 
225
229
  def ask_for_password(question)
226
- return nil if not @ins.tty?
230
+ return nil if not tty?
227
231
 
228
232
  require 'io/console'
229
233
 
@@ -239,7 +243,7 @@ class Gem::StreamUI
239
243
  # Ask for a password. Does not echo response to terminal.
240
244
 
241
245
  def ask_for_password(question)
242
- return nil if not @ins.tty?
246
+ return nil if not tty?
243
247
 
244
248
  @outs.print(question + " ")
245
249
  @outs.flush
@@ -251,6 +255,8 @@ class Gem::StreamUI
251
255
  # Asks for a password that works on windows. Ripped from the Heroku gem.
252
256
 
253
257
  def ask_for_password_on_windows
258
+ return nil if not tty?
259
+
254
260
  require "Win32API"
255
261
  char = nil
256
262
  password = ''
@@ -272,6 +278,8 @@ class Gem::StreamUI
272
278
  # Asks for a password that works on unix
273
279
 
274
280
  def ask_for_password_on_unix
281
+ return nil if not tty?
282
+
275
283
  system "stty -echo"
276
284
  password = @ins.gets
277
285
  password.chomp! if password
@@ -332,6 +340,10 @@ class Gem::StreamUI
332
340
  # Return a progress reporter object chosen from the current verbosity.
333
341
 
334
342
  def progress_reporter(*args)
343
+ if self.kind_of?(Gem::SilentUI)
344
+ return SilentProgressReporter.new(@outs, *args)
345
+ end
346
+
335
347
  case Gem.configuration.verbose
336
348
  when nil, false
337
349
  SilentProgressReporter.new(@outs, *args)
@@ -434,6 +446,10 @@ class Gem::StreamUI
434
446
  # Return a download reporter object chosen from the current verbosity
435
447
 
436
448
  def download_reporter(*args)
449
+ if self.kind_of?(Gem::SilentUI)
450
+ return SilentDownloadReporter.new(@outs, *args)
451
+ end
452
+
437
453
  case Gem.configuration.verbose
438
454
  when nil, false
439
455
  SilentDownloadReporter.new(@outs, *args)
@@ -517,7 +533,7 @@ end
517
533
 
518
534
  class Gem::ConsoleUI < Gem::StreamUI
519
535
  def initialize
520
- super STDIN, STDOUT, STDERR
536
+ super STDIN, STDOUT, STDERR, true
521
537
  end
522
538
  end
523
539
 
@@ -525,9 +541,7 @@ end
525
541
  # SilentUI is a UI choice that is absolutely silent.
526
542
 
527
543
  class Gem::SilentUI < Gem::StreamUI
528
-
529
544
  def initialize
530
-
531
545
  reader, writer = nil, nil
532
546
 
533
547
  begin
@@ -538,8 +552,15 @@ class Gem::SilentUI < Gem::StreamUI
538
552
  writer = File.open('nul', 'w')
539
553
  end
540
554
 
541
- super reader, writer, writer
555
+ super reader, writer, writer, false
542
556
  end
543
557
 
558
+ def download_reporter(*args)
559
+ SilentDownloadReporter.new(@outs, *args)
560
+ end
561
+
562
+ def progress_reporter(*args)
563
+ SilentProgressReporter.new(@outs, *args)
564
+ end
544
565
  end
545
566