rubygems-update 1.2.0 → 1.3.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 (65) hide show
  1. data.tar.gz.sig +2 -4
  2. data/ChangeLog +155 -0
  3. data/Rakefile +20 -5
  4. data/doc/release_notes/rel_1_3_0.rdoc +125 -0
  5. data/lib/rubygems.rb +107 -15
  6. data/lib/rubygems/commands/contents_command.rb +1 -1
  7. data/lib/rubygems/commands/environment_command.rb +40 -0
  8. data/lib/rubygems/commands/help_command.rb +2 -2
  9. data/lib/rubygems/commands/install_command.rb +15 -0
  10. data/lib/rubygems/commands/lock_command.rb +15 -6
  11. data/lib/rubygems/commands/outdated_command.rb +1 -1
  12. data/lib/rubygems/commands/pristine_command.rb +1 -1
  13. data/lib/rubygems/commands/query_command.rb +14 -9
  14. data/lib/rubygems/commands/rdoc_command.rb +5 -1
  15. data/lib/rubygems/commands/specification_command.rb +2 -2
  16. data/lib/rubygems/commands/unpack_command.rb +1 -1
  17. data/lib/rubygems/commands/update_command.rb +23 -14
  18. data/lib/rubygems/commands/which_command.rb +4 -3
  19. data/lib/rubygems/config_file.rb +25 -3
  20. data/lib/rubygems/defaults.rb +42 -11
  21. data/lib/rubygems/dependency_installer.rb +19 -15
  22. data/lib/rubygems/doc_manager.rb +162 -115
  23. data/lib/rubygems/ext/builder.rb +2 -2
  24. data/lib/rubygems/ext/rake_builder.rb +1 -1
  25. data/lib/rubygems/gem_path_searcher.rb +35 -19
  26. data/lib/rubygems/indexer.rb +15 -6
  27. data/lib/rubygems/install_update_options.rb +7 -0
  28. data/lib/rubygems/installer.rb +85 -9
  29. data/lib/rubygems/local_remote_options.rb +7 -0
  30. data/lib/rubygems/package/tar_reader.rb +7 -7
  31. data/lib/rubygems/platform.rb +1 -18
  32. data/lib/rubygems/remote_fetcher.rb +45 -54
  33. data/lib/rubygems/rubygems_version.rb +1 -1
  34. data/lib/rubygems/source_index.rb +22 -7
  35. data/lib/rubygems/source_info_cache.rb +9 -0
  36. data/lib/rubygems/spec_fetcher.rb +18 -20
  37. data/lib/rubygems/specification.rb +502 -293
  38. data/lib/rubygems/test_utilities.rb +19 -8
  39. data/lib/rubygems/uninstaller.rb +60 -26
  40. data/setup.rb +15 -7
  41. data/test/gemutilities.rb +84 -0
  42. data/test/mockgemui.rb +22 -2
  43. data/test/test_gem.rb +118 -13
  44. data/test/test_gem_commands_dependency_command.rb +1 -1
  45. data/test/test_gem_commands_list_command.rb +37 -0
  46. data/test/test_gem_commands_lock_command.rb +69 -0
  47. data/test/test_gem_commands_query_command.rb +40 -1
  48. data/test/test_gem_commands_uninstall_command.rb +60 -0
  49. data/test/test_gem_config_file.rb +51 -17
  50. data/test/test_gem_ext_configure_builder.rb +9 -9
  51. data/test/test_gem_ext_rake_builder.rb +21 -12
  52. data/test/test_gem_gem_path_searcher.rb +15 -7
  53. data/test/test_gem_indexer.rb +35 -1
  54. data/test/test_gem_install_update_options.rb +26 -5
  55. data/test/test_gem_installer.rb +93 -21
  56. data/test/test_gem_local_remote_options.rb +12 -0
  57. data/test/test_gem_platform.rb +6 -13
  58. data/test/test_gem_remote_fetcher.rb +121 -31
  59. data/test/test_gem_source_index.rb +74 -21
  60. data/test/test_gem_source_info_cache.rb +2 -1
  61. data/test/test_gem_spec_fetcher.rb +13 -3
  62. data/test/test_gem_specification.rb +13 -7
  63. data/test/test_gem_uninstaller.rb +25 -2
  64. metadata +6 -2
  65. metadata.gz.sig +0 -0
@@ -30,29 +30,40 @@ class Gem::FakeFetcher
30
30
  @paths = []
31
31
  end
32
32
 
33
- def fetch_path(path)
33
+ def fetch_path path, mtime = nil
34
34
  path = path.to_s
35
35
  @paths << path
36
36
  raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
37
- data = @data[path]
38
37
 
39
- if data.nil? then
40
- raise Gem::RemoteFetcher::FetchError.new('no data', path)
38
+ unless @data.key? path then
39
+ raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
41
40
  end
42
41
 
43
- data.respond_to?(:call) ? data.call : data
42
+ data = @data[path]
43
+
44
+ if data.respond_to?(:call) then
45
+ data.call
46
+ else
47
+ if path.to_s =~ /gz$/ and not data.nil? and not data.empty? then
48
+ data = Gem.gunzip data
49
+ end
50
+
51
+ data
52
+ end
44
53
  end
45
54
 
46
55
  def fetch_size(path)
47
56
  path = path.to_s
48
57
  @paths << path
58
+
49
59
  raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
50
- data = @data[path]
51
60
 
52
- if data.nil? then
53
- raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", nil)
61
+ unless @data.key? path then
62
+ raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
54
63
  end
55
64
 
65
+ data = @data[path]
66
+
56
67
  data.respond_to?(:call) ? data.call : data.length
57
68
  end
58
69
 
@@ -18,9 +18,23 @@ class Gem::Uninstaller
18
18
  include Gem::UserInteraction
19
19
 
20
20
  ##
21
- # Constructs an Uninstaller instance
22
- #
23
- # gem:: [String] The Gem name to uninstall
21
+ # The directory a gem's executables will be installed into
22
+
23
+ attr_reader :bin_dir
24
+
25
+ ##
26
+ # The gem repository the gem will be installed into
27
+
28
+ attr_reader :gem_home
29
+
30
+ ##
31
+ # The Gem::Specification for the gem being uninstalled, only set during
32
+ # #uninstall_gem
33
+
34
+ attr_reader :spec
35
+
36
+ ##
37
+ # Constructs an uninstaller that will uninstall +gem+
24
38
 
25
39
  def initialize(gem, options = {})
26
40
  @gem = gem
@@ -31,41 +45,62 @@ class Gem::Uninstaller
31
45
  @force_all = options[:all]
32
46
  @force_ignore = options[:ignore]
33
47
  @bin_dir = options[:bin_dir]
48
+
49
+ spec_dir = File.join @gem_home, 'specifications'
50
+ @source_index = Gem::SourceIndex.from_gems_in spec_dir
34
51
  end
35
52
 
36
53
  ##
37
- # Performs the uninstall of the Gem. This removes the spec, the
38
- # Gem directory, and the cached .gem file,
54
+ # Performs the uninstall of the gem. This removes the spec, the Gem
55
+ # directory, and the cached .gem file.
39
56
 
40
57
  def uninstall
41
- list = Gem.source_index.search(/^#{@gem}$/, @version)
58
+ list = @source_index.find_name @gem, @version
42
59
 
43
60
  if list.empty? then
44
61
  raise Gem::InstallError, "Unknown gem #{@gem} #{@version}"
45
- elsif list.size > 1 && @force_all
46
- remove_all(list.dup)
47
- remove_executables(list.last)
48
- elsif list.size > 1
49
- say
62
+
63
+ elsif list.size > 1 and @force_all then
64
+ remove_all list.dup
65
+
66
+ elsif list.size > 1 then
50
67
  gem_names = list.collect {|gem| gem.full_name} + ["All versions"]
51
- gem_name, index =
52
- choose_from_list("Select gem to uninstall:", gem_names)
53
- if index == list.size
54
- remove_all(list.dup)
55
- remove_executables(list.last)
56
- elsif index >= 0 && index < list.size
57
- to_remove = list[index]
58
- remove(to_remove, list)
59
- remove_executables(to_remove)
68
+
69
+ say
70
+ gem_name, index = choose_from_list "Select gem to uninstall:", gem_names
71
+
72
+ if index == list.size then
73
+ remove_all list.dup
74
+ elsif index >= 0 && index < list.size then
75
+ uninstall_gem list[index], list.dup
60
76
  else
61
77
  say "Error: must enter a number [1-#{list.size+1}]"
62
78
  end
63
79
  else
64
- remove(list[0], list.dup)
65
- remove_executables(list.last)
80
+ uninstall_gem list.first, list.dup
66
81
  end
67
82
  end
68
83
 
84
+ ##
85
+ # Uninstalls gem +spec+
86
+
87
+ def uninstall_gem(spec, specs)
88
+ @spec = spec
89
+
90
+ Gem.pre_uninstall_hooks.each do |hook|
91
+ hook.call self
92
+ end
93
+
94
+ specs.each { |s| remove_executables s }
95
+ remove spec, specs
96
+
97
+ Gem.post_uninstall_hooks.each do |hook|
98
+ hook.call self
99
+ end
100
+
101
+ @spec = nil
102
+ end
103
+
69
104
  ##
70
105
  # Removes installed executables and batch files (windows only) for
71
106
  # +gemspec+.
@@ -76,7 +111,7 @@ class Gem::Uninstaller
76
111
  if gemspec.executables.size > 0 then
77
112
  bindir = @bin_dir ? @bin_dir : (Gem.bindir @gem_home)
78
113
 
79
- list = Gem.source_index.search(gemspec.name).delete_if { |spec|
114
+ list = @source_index.find_name(gemspec.name).delete_if { |spec|
80
115
  spec.version == gemspec.version
81
116
  }
82
117
 
@@ -118,7 +153,7 @@ class Gem::Uninstaller
118
153
  # NOTE: removes uninstalled gems from +list+.
119
154
 
120
155
  def remove_all(list)
121
- list.dup.each { |spec| remove spec, list }
156
+ list.dup.each { |spec| uninstall_gem spec, list }
122
157
  end
123
158
 
124
159
  ##
@@ -185,8 +220,7 @@ class Gem::Uninstaller
185
220
  def dependencies_ok?(spec)
186
221
  return true if @force_ignore
187
222
 
188
- source_index = Gem::SourceIndex.from_installed_gems
189
- deplist = Gem::DependencyList.from_source_index source_index
223
+ deplist = Gem::DependencyList.from_source_index @source_index
190
224
  deplist.ok_to_remove?(spec.full_name) || ask_if_ok(spec)
191
225
  end
192
226
 
data/setup.rb CHANGED
@@ -90,14 +90,17 @@ HELP
90
90
  end
91
91
  end
92
92
 
93
- unless install_destdir.empty? then
94
- ENV['GEM_HOME'] ||= File.join(install_destdir,
95
- Gem.default_dir.sub(/\A[a-z]:/i, ''))
96
- end
97
-
98
93
  require 'fileutils'
99
94
  require 'rbconfig'
100
95
  require 'tmpdir'
96
+ require 'pathname'
97
+
98
+ unless install_destdir.empty? then
99
+ default_dir = Pathname.new(Gem.default_dir)
100
+ top_dir = Pathname.new(RbConfig::TOPDIR)
101
+ ENV['GEM_HOME'] ||= File.join(install_destdir,
102
+ default_dir.relative_path_from(top_dir))
103
+ end
101
104
 
102
105
  include FileUtils::Verbose
103
106
 
@@ -134,8 +137,12 @@ else
134
137
  end
135
138
 
136
139
  unless install_destdir.empty?
137
- lib_dir = File.join install_destdir, lib_dir
138
- bin_dir = File.join install_destdir, bin_dir
140
+ top_dir = Pathname.new(RbConfig::TOPDIR)
141
+ lib_dir_p = Pathname.new(lib_dir)
142
+ bin_dir_p = Pathname.new(bin_dir)
143
+
144
+ lib_dir = File.join install_destdir, lib_dir_p.relative_path_from(top_dir)
145
+ bin_dir = File.join install_destdir, bin_dir_p.relative_path_from(top_dir)
139
146
  end
140
147
 
141
148
  mkdir_p lib_dir
@@ -324,3 +331,4 @@ puts "If `gem` was installed by a previous RubyGems installation, you may need"
324
331
  puts "to remove it by hand."
325
332
  puts
326
333
 
334
+
data/test/gemutilities.rb CHANGED
@@ -7,6 +7,8 @@
7
7
 
8
8
  at_exit { $SAFE = 1 }
9
9
 
10
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
11
+
10
12
  require 'fileutils'
11
13
  require 'test/unit'
12
14
  require 'tmpdir'
@@ -17,6 +19,10 @@ require 'rubygems/test_utilities'
17
19
  require File.join(File.expand_path(File.dirname(__FILE__)), 'mockgemui')
18
20
 
19
21
  module Gem
22
+ def self.searcher=(searcher)
23
+ MUTEX.synchronize do @searcher = searcher end
24
+ end
25
+
20
26
  def self.source_index=(si)
21
27
  @@source_index = si
22
28
  end
@@ -24,6 +30,10 @@ module Gem
24
30
  def self.win_platform=(val)
25
31
  @@win_platform = val
26
32
  end
33
+
34
+ module DefaultUserInteraction
35
+ @ui = MockGemUi.new
36
+ end
27
37
  end
28
38
 
29
39
  class RubyGemTestCase < Test::Unit::TestCase
@@ -83,6 +93,27 @@ class RubyGemTestCase < Test::Unit::TestCase
83
93
  'private_key.pem')
84
94
  @public_cert = File.expand_path File.join(File.dirname(__FILE__),
85
95
  'public_cert.pem')
96
+
97
+ Gem.post_install_hooks.clear
98
+ Gem.post_uninstall_hooks.clear
99
+ Gem.pre_install_hooks.clear
100
+ Gem.pre_uninstall_hooks.clear
101
+
102
+ Gem.post_install do |installer|
103
+ @post_install_hook_arg = installer
104
+ end
105
+
106
+ Gem.post_uninstall do |uninstaller|
107
+ @post_uninstall_hook_arg = uninstaller
108
+ end
109
+
110
+ Gem.pre_install do |installer|
111
+ @pre_install_hook_arg = installer
112
+ end
113
+
114
+ Gem.pre_uninstall do |uninstaller|
115
+ @pre_uninstall_hook_arg = uninstaller
116
+ end
86
117
  end
87
118
 
88
119
  def teardown
@@ -386,5 +417,58 @@ class RubyGemTestCase < Test::Unit::TestCase
386
417
  self.class.process_based_port
387
418
  end
388
419
 
420
+ def build_rake_in
421
+ gem_ruby = Gem.ruby
422
+ ruby = @@ruby
423
+ Gem.module_eval {@ruby = ruby}
424
+ env_rake = ENV["rake"]
425
+ ENV["rake"] = @@rake
426
+ yield @@rake
427
+ ensure
428
+ Gem.module_eval {@ruby = gem_ruby}
429
+ if env_rake
430
+ ENV["rake"] = env_rake
431
+ else
432
+ ENV.delete("rake")
433
+ end
434
+ end
435
+
436
+ def self.rubybin
437
+ if ruby = ENV["RUBY"]
438
+ return ruby
439
+ end
440
+ ruby = "ruby"
441
+ rubyexe = ruby+".exe"
442
+ 3.times do
443
+ if File.exist? ruby and File.executable? ruby and !File.directory? ruby
444
+ return File.expand_path(ruby)
445
+ end
446
+ if File.exist? rubyexe and File.executable? rubyexe
447
+ return File.expand_path(rubyexe)
448
+ end
449
+ ruby = File.join("..", ruby)
450
+ end
451
+ begin
452
+ require "rbconfig"
453
+ File.join(
454
+ RbConfig::CONFIG["bindir"],
455
+ RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"]
456
+ )
457
+ rescue LoadError
458
+ "ruby"
459
+ end
460
+ end
461
+
462
+ @@ruby = rubybin
463
+ env_rake = ENV['rake']
464
+ ruby19_rake = @@ruby + " " + File.expand_path("../../../bin/rake", __FILE__)
465
+ @@rake = if env_rake then
466
+ ENV["rake"]
467
+ elsif File.exist? ruby19_rake then
468
+ ruby19_rake
469
+ else
470
+ 'rake'
471
+ end
472
+
389
473
  end
390
474
 
data/test/mockgemui.rb CHANGED
@@ -12,8 +12,28 @@ require 'rubygems/user_interaction'
12
12
  class MockGemUi < Gem::StreamUI
13
13
  class TermError < RuntimeError; end
14
14
 
15
- def initialize(input="")
16
- super(StringIO.new(input), StringIO.new, StringIO.new)
15
+ module TTY
16
+
17
+ attr_accessor :tty
18
+
19
+ def tty?()
20
+ @tty = true unless defined?(@tty)
21
+ @tty
22
+ end
23
+
24
+ end
25
+
26
+ def initialize(input = "")
27
+ ins = StringIO.new input
28
+ outs = StringIO.new
29
+ errs = StringIO.new
30
+
31
+ ins.extend TTY
32
+ outs.extend TTY
33
+ errs.extend TTY
34
+
35
+ super ins, outs, errs
36
+
17
37
  @terminated = false
18
38
  end
19
39
 
data/test/test_gem.rb CHANGED
@@ -3,6 +3,7 @@ require 'rubygems'
3
3
  require 'rubygems/gem_openssl'
4
4
  require 'rubygems/installer'
5
5
  require 'pathname'
6
+ require 'tmpdir'
6
7
 
7
8
  class TestGem < RubyGemTestCase
8
9
 
@@ -44,7 +45,12 @@ class TestGem < RubyGemTestCase
44
45
 
45
46
  def test_self_bindir_default_dir
46
47
  default = Gem.default_dir
47
- bindir = (defined? RUBY_FRAMEWORK_VERSION) ? '/usr/bin' : Config::CONFIG['bindir']
48
+ bindir = if defined?(RUBY_FRAMEWORK_VERSION) then
49
+ '/usr/bin'
50
+ else
51
+ Config::CONFIG['bindir']
52
+ end
53
+
48
54
  assert_equal bindir, Gem.bindir(default)
49
55
  assert_equal bindir, Gem.bindir(Pathname.new(default))
50
56
  end
@@ -217,6 +223,36 @@ class TestGem < RubyGemTestCase
217
223
  Gem.ssl_available = orig_Gem_ssl_available
218
224
  end
219
225
 
226
+ def test_self_find_files
227
+ foo1 = quick_gem 'foo', '1' do |s|
228
+ s.files << 'lib/foo/discover.rb'
229
+ end
230
+
231
+ foo2 = quick_gem 'foo', '2' do |s|
232
+ s.files << 'lib/foo/discover.rb'
233
+ end
234
+
235
+ path = File.join 'gems', foo1.full_name, 'lib', 'foo', 'discover.rb'
236
+ write_file(path) { |fp| fp.puts "# #{path}" }
237
+
238
+ path = File.join 'gems', foo2.full_name, 'lib', 'foo', 'discover.rb'
239
+ write_file(path) { |fp| fp.puts "# #{path}" }
240
+
241
+ @fetcher = Gem::FakeFetcher.new
242
+ Gem::RemoteFetcher.fetcher = @fetcher
243
+
244
+ Gem.source_index = util_setup_spec_fetcher foo1, foo2
245
+
246
+ Gem.searcher = nil
247
+
248
+ expected = [
249
+ File.join(foo1.full_gem_path, 'lib', 'foo', 'discover.rb'),
250
+ File.join(foo2.full_gem_path, 'lib', 'foo', 'discover.rb'),
251
+ ]
252
+
253
+ assert_equal expected, Gem.find_files('foo/discover').sort
254
+ end
255
+
220
256
  def test_self_latest_load_paths
221
257
  util_make_gems
222
258
 
@@ -260,36 +296,38 @@ class TestGem < RubyGemTestCase
260
296
  unless win_platform?
261
297
  def test_self_path_APPLE_GEM_HOME
262
298
  Gem.clear_paths
263
- Gem.const_set :APPLE_GEM_HOME, '/tmp/apple_gem_home'
264
-
265
- assert Gem.path.include?('/tmp/apple_gem_home')
299
+ apple_gem_home = File.join @tempdir, 'apple_gem_home'
300
+ Gem.const_set :APPLE_GEM_HOME, apple_gem_home
301
+
302
+ assert Gem.path.include?(apple_gem_home)
266
303
  ensure
267
304
  Gem.send :remove_const, :APPLE_GEM_HOME
268
305
  end
269
-
306
+
270
307
  def test_self_path_APPLE_GEM_HOME_GEM_PATH
271
308
  Gem.clear_paths
272
309
  ENV['GEM_PATH'] = @gemhome
273
- Gem.const_set :APPLE_GEM_HOME, '/tmp/apple_gem_home'
274
-
275
- assert !Gem.path.include?('/tmp/apple_gem_home')
310
+ apple_gem_home = File.join @tempdir, 'apple_gem_home'
311
+ Gem.const_set :APPLE_GEM_HOME, apple_gem_home
312
+
313
+ assert !Gem.path.include?(apple_gem_home)
276
314
  ensure
277
315
  Gem.send :remove_const, :APPLE_GEM_HOME
278
316
  end
279
317
  end
280
318
 
281
319
  def test_self_path_ENV_PATH
282
- Gem.clear_paths
320
+ Gem.send :set_paths, nil
283
321
  path_count = Gem.path.size
284
- path_count -= 1 if defined? APPLE_GEM_HOME
285
322
  Gem.clear_paths
286
- util_ensure_gem_dirs
287
323
 
288
324
  ENV['GEM_PATH'] = @additional.join(File::PATH_SEPARATOR)
289
325
 
290
326
  assert_equal @additional, Gem.path[0,2]
291
- assert_equal path_count + @additional.size, Gem.path.size
292
- assert_match Gem.dir, Gem.path.last
327
+
328
+ assert_equal path_count + @additional.size, Gem.path.size,
329
+ "extra path components: #{Gem.path[2..-1].inspect}"
330
+ assert_equal Gem.dir, Gem.path.last
293
331
  end
294
332
 
295
333
  def test_self_path_duplicate
@@ -337,6 +375,7 @@ class TestGem < RubyGemTestCase
337
375
 
338
376
  file_name = File.expand_path __FILE__
339
377
  prefix = File.dirname File.dirname(file_name)
378
+ prefix = File.dirname prefix if File.basename(prefix) == 'test'
340
379
 
341
380
  Gem::ConfigMap[:libdir] = prefix
342
381
 
@@ -350,6 +389,7 @@ class TestGem < RubyGemTestCase
350
389
 
351
390
  file_name = File.expand_path __FILE__
352
391
  prefix = File.dirname File.dirname(file_name)
392
+ prefix = File.dirname prefix if File.basename(prefix) == 'test'
353
393
 
354
394
  Gem::ConfigMap[:sitelibdir] = prefix
355
395
 
@@ -386,6 +426,44 @@ class TestGem < RubyGemTestCase
386
426
  Gem.required_location("a", "code.rb", "= 2")
387
427
  end
388
428
 
429
+ def test_self_ruby_escaping_spaces_in_path
430
+ orig_ruby = Gem.ruby
431
+ orig_bindir = Gem::ConfigMap[:bindir]
432
+ orig_ruby_install_name = Gem::ConfigMap[:ruby_install_name]
433
+ orig_exe_ext = Gem::ConfigMap[:EXEEXT]
434
+
435
+ Gem::ConfigMap[:bindir] = "C:/Ruby 1.8/bin"
436
+ Gem::ConfigMap[:ruby_install_name] = "ruby"
437
+ Gem::ConfigMap[:EXEEXT] = ".exe"
438
+ Gem.instance_variable_set("@ruby", nil)
439
+
440
+ assert_equal "\"C:/Ruby 1.8/bin/ruby.exe\"", Gem.ruby
441
+ ensure
442
+ Gem.instance_variable_set("@ruby", orig_ruby)
443
+ Gem::ConfigMap[:bindir] = orig_bindir
444
+ Gem::ConfigMap[:ruby_install_name] = orig_ruby_install_name
445
+ Gem::ConfigMap[:EXEEXT] = orig_exe_ext
446
+ end
447
+
448
+ def test_self_ruby_path_without_spaces
449
+ orig_ruby = Gem.ruby
450
+ orig_bindir = Gem::ConfigMap[:bindir]
451
+ orig_ruby_install_name = Gem::ConfigMap[:ruby_install_name]
452
+ orig_exe_ext = Gem::ConfigMap[:EXEEXT]
453
+
454
+ Gem::ConfigMap[:bindir] = "C:/Ruby18/bin"
455
+ Gem::ConfigMap[:ruby_install_name] = "ruby"
456
+ Gem::ConfigMap[:EXEEXT] = ".exe"
457
+ Gem.instance_variable_set("@ruby", nil)
458
+
459
+ assert_equal "C:/Ruby18/bin/ruby.exe", Gem.ruby
460
+ ensure
461
+ Gem.instance_variable_set("@ruby", orig_ruby)
462
+ Gem::ConfigMap[:bindir] = orig_bindir
463
+ Gem::ConfigMap[:ruby_install_name] = orig_ruby_install_name
464
+ Gem::ConfigMap[:EXEEXT] = orig_exe_ext
465
+ end
466
+
389
467
  def test_self_ruby_version
390
468
  version = RUBY_VERSION.dup
391
469
  version << ".#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
@@ -426,6 +504,11 @@ class TestGem < RubyGemTestCase
426
504
  assert_equal @additional + [Gem.dir], Gem.path
427
505
  end
428
506
 
507
+ def test_self_user_dir
508
+ assert_equal File.join(@userhome, '.gem', Gem.ruby_engine,
509
+ Gem::ConfigMap[:ruby_version]), Gem.user_dir
510
+ end
511
+
429
512
  def test_self_user_home
430
513
  if ENV['HOME'] then
431
514
  assert_equal ENV['HOME'], Gem.user_home
@@ -434,6 +517,28 @@ class TestGem < RubyGemTestCase
434
517
  end
435
518
  end
436
519
 
520
+ def test_self_user_home_user_drive_and_path
521
+ Gem.clear_paths
522
+
523
+ # safe-keep env variables
524
+ orig_home, orig_user_profile = ENV['HOME'], ENV['USERPROFILE']
525
+ orig_user_drive, orig_user_path = ENV['HOMEDRIVE'], ENV['HOMEPATH']
526
+
527
+ # prepare the environment
528
+ ENV.delete('HOME')
529
+ ENV.delete('USERPROFILE')
530
+ ENV['HOMEDRIVE'] = 'Z:'
531
+ ENV['HOMEPATH'] = '\\Users\\RubyUser'
532
+
533
+ assert_equal "Z:\\Users\\RubyUser", Gem.user_home
534
+
535
+ ensure
536
+ ENV['HOME'] = orig_home
537
+ ENV['USERPROFILE'] = orig_user_profile
538
+ ENV['USERDRIVE'] = orig_user_drive
539
+ ENV['USERPATH'] = orig_user_path
540
+ end
541
+
437
542
  def util_ensure_gem_dirs
438
543
  Gem.ensure_gem_subdirectories @gemhome
439
544
  @additional.each do |dir|