rubygems-update 2.4.8 → 2.5.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 (125) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CODE_OF_CONDUCT.md +40 -0
  5. data/CVE-2015-3900.txt +40 -0
  6. data/History.txt +173 -2
  7. data/Manifest.txt +14 -1
  8. data/Rakefile +36 -1
  9. data/lib/rubygems.rb +32 -14
  10. data/lib/rubygems/basic_specification.rb +31 -9
  11. data/lib/rubygems/commands/dependency_command.rb +25 -15
  12. data/lib/rubygems/commands/environment_command.rb +2 -0
  13. data/lib/rubygems/commands/help_command.rb +0 -10
  14. data/lib/rubygems/commands/install_command.rb +1 -1
  15. data/lib/rubygems/commands/list_command.rb +1 -1
  16. data/lib/rubygems/commands/pristine_command.rb +11 -1
  17. data/lib/rubygems/commands/query_command.rb +1 -1
  18. data/lib/rubygems/commands/sources_command.rb +1 -1
  19. data/lib/rubygems/commands/update_command.rb +2 -2
  20. data/lib/rubygems/config_file.rb +4 -4
  21. data/lib/rubygems/core_ext/kernel_require.rb +2 -2
  22. data/lib/rubygems/dependency.rb +9 -6
  23. data/lib/rubygems/dependency_list.rb +3 -0
  24. data/lib/rubygems/ext/builder.rb +2 -0
  25. data/lib/rubygems/ext/ext_conf_builder.rb +6 -1
  26. data/lib/rubygems/indexer.rb +26 -91
  27. data/lib/rubygems/installer.rb +58 -26
  28. data/lib/rubygems/installer_test_case.rb +2 -2
  29. data/lib/rubygems/package.rb +18 -6
  30. data/lib/rubygems/package/old.rb +2 -2
  31. data/lib/rubygems/package/tar_reader/entry.rb +7 -1
  32. data/lib/rubygems/package/tar_test_case.rb +12 -3
  33. data/lib/rubygems/package/tar_writer.rb +19 -1
  34. data/lib/rubygems/platform.rb +3 -2
  35. data/lib/rubygems/rdoc.rb +1 -2
  36. data/lib/rubygems/remote_fetcher.rb +25 -6
  37. data/lib/rubygems/request/connection_pools.rb +8 -4
  38. data/lib/rubygems/request_set.rb +3 -4
  39. data/lib/rubygems/request_set/gem_dependency_api.rb +2 -2
  40. data/lib/rubygems/request_set/lockfile.rb +1 -1
  41. data/lib/rubygems/request_set/lockfile/parser.rb +54 -43
  42. data/lib/rubygems/request_set/lockfile/tokenizer.rb +16 -13
  43. data/lib/rubygems/resolver.rb +47 -242
  44. data/lib/rubygems/resolver/activation_request.rb +2 -1
  45. data/lib/rubygems/resolver/conflict.rb +0 -1
  46. data/lib/rubygems/resolver/dependency_request.rb +4 -1
  47. data/lib/rubygems/resolver/git_specification.rb +1 -2
  48. data/lib/rubygems/resolver/molinillo.rb +1 -0
  49. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +5 -0
  50. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +266 -0
  51. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +69 -0
  52. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +3 -0
  53. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +99 -0
  54. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +63 -0
  55. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +430 -0
  56. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +43 -0
  57. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +51 -0
  58. data/lib/rubygems/resolver/specification.rb +1 -1
  59. data/lib/rubygems/specification.rb +256 -86
  60. data/lib/rubygems/stub_specification.rb +37 -29
  61. data/lib/rubygems/test_case.rb +65 -28
  62. data/lib/rubygems/test_utilities.rb +18 -18
  63. data/lib/rubygems/text.rb +0 -2
  64. data/lib/rubygems/uninstaller.rb +1 -1
  65. data/lib/rubygems/util.rb +4 -4
  66. data/lib/rubygems/util/licenses.rb +309 -0
  67. data/lib/rubygems/util/list.rb +9 -21
  68. data/lib/rubygems/version.rb +24 -14
  69. data/test/rubygems/simple_gem.rb +1 -1
  70. data/test/rubygems/test_config.rb +10 -1
  71. data/test/rubygems/test_gem.rb +58 -11
  72. data/test/rubygems/test_gem_available_set.rb +2 -1
  73. data/test/rubygems/test_gem_commands_cleanup_command.rb +6 -5
  74. data/test/rubygems/test_gem_commands_dependency_command.rb +9 -1
  75. data/test/rubygems/test_gem_commands_install_command.rb +17 -28
  76. data/test/rubygems/test_gem_commands_mirror.rb +0 -13
  77. data/test/rubygems/test_gem_commands_outdated_command.rb +2 -3
  78. data/test/rubygems/test_gem_commands_pristine_command.rb +33 -5
  79. data/test/rubygems/test_gem_commands_query_command.rb +123 -158
  80. data/test/rubygems/test_gem_commands_server_command.rb +2 -2
  81. data/test/rubygems/test_gem_commands_specification_command.rb +4 -4
  82. data/test/rubygems/test_gem_commands_stale_command.rb +2 -0
  83. data/test/rubygems/test_gem_commands_uninstall_command.rb +5 -4
  84. data/test/rubygems/test_gem_commands_unpack_command.rb +4 -6
  85. data/test/rubygems/test_gem_commands_update_command.rb +22 -52
  86. data/test/rubygems/test_gem_commands_which_command.rb +1 -0
  87. data/test/rubygems/test_gem_config_file.rb +1 -1
  88. data/test/rubygems/test_gem_dependency.rb +7 -3
  89. data/test/rubygems/test_gem_dependency_installer.rb +5 -5
  90. data/test/rubygems/test_gem_doctor.rb +1 -1
  91. data/test/rubygems/test_gem_ext_builder.rb +2 -0
  92. data/test/rubygems/test_gem_ext_configure_builder.rb +8 -4
  93. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +25 -21
  94. data/test/rubygems/test_gem_indexer.rb +4 -4
  95. data/test/rubygems/test_gem_install_update_options.rb +2 -2
  96. data/test/rubygems/test_gem_installer.rb +32 -26
  97. data/test/rubygems/test_gem_package.rb +46 -1
  98. data/test/rubygems/test_gem_package_tar_reader_entry.rb +8 -1
  99. data/test/rubygems/test_gem_package_tar_writer.rb +10 -1
  100. data/test/rubygems/test_gem_package_task.rb +5 -2
  101. data/test/rubygems/test_gem_platform.rb +11 -0
  102. data/test/rubygems/test_gem_remote_fetcher.rb +64 -3
  103. data/test/rubygems/test_gem_request.rb +1 -1
  104. data/test/rubygems/test_gem_request_connection_pools.rb +10 -1
  105. data/test/rubygems/test_gem_request_set.rb +5 -8
  106. data/test/rubygems/test_gem_request_set_lockfile.rb +2 -4
  107. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
  108. data/test/rubygems/test_gem_resolver.rb +12 -31
  109. data/test/rubygems/test_gem_resolver_git_specification.rb +1 -0
  110. data/test/rubygems/test_gem_resolver_installer_set.rb +7 -11
  111. data/test/rubygems/test_gem_resolver_lock_specification.rb +3 -2
  112. data/test/rubygems/test_gem_security_trust_dir.rb +2 -0
  113. data/test/rubygems/test_gem_server.rb +4 -0
  114. data/test/rubygems/test_gem_specification.rb +344 -61
  115. data/test/rubygems/test_gem_stream_ui.rb +6 -6
  116. data/test/rubygems/test_gem_stub_specification.rb +21 -6
  117. data/test/rubygems/test_gem_text.rb +2 -0
  118. data/test/rubygems/test_gem_uninstaller.rb +2 -1
  119. data/test/rubygems/test_gem_util.rb +8 -0
  120. data/test/rubygems/test_require.rb +156 -125
  121. data/util/generate_spdx_license_list.rb +21 -0
  122. data/util/update_bundled_ca_certificates.rb +2 -1
  123. metadata +42 -6
  124. metadata.gz.sig +0 -0
  125. data/lib/rubygems/util/stringio.rb +0 -34
@@ -38,7 +38,7 @@ class TestGemStreamUI < Gem::TestCase
38
38
  skip 'TTY detection broken on windows' if
39
39
  Gem.win_platform? unless RUBY_VERSION > '1.9.2'
40
40
 
41
- timeout(1) do
41
+ Timeout.timeout(1) do
42
42
  expected_answer = "Arthur, King of the Britons"
43
43
  @in.string = "#{expected_answer}\n"
44
44
  actual_answer = @sui.ask("What is your name?")
@@ -52,7 +52,7 @@ class TestGemStreamUI < Gem::TestCase
52
52
 
53
53
  @in.tty = false
54
54
 
55
- timeout(0.1) do
55
+ Timeout.timeout(0.1) do
56
56
  answer = @sui.ask("what is your favorite color?")
57
57
  assert_equal nil, answer
58
58
  end
@@ -62,7 +62,7 @@ class TestGemStreamUI < Gem::TestCase
62
62
  skip 'Always uses $stdin on windows' if
63
63
  Gem.win_platform? unless RUBY_VERSION > '1.9.2'
64
64
 
65
- timeout(1) do
65
+ Timeout.timeout(1) do
66
66
  expected_answer = "Arthur, King of the Britons"
67
67
  @in.string = "#{expected_answer}\n"
68
68
  actual_answer = @sui.ask_for_password("What is your name?")
@@ -76,7 +76,7 @@ class TestGemStreamUI < Gem::TestCase
76
76
 
77
77
  @in.tty = false
78
78
 
79
- timeout(0.1) do
79
+ Timeout.timeout(0.1) do
80
80
  answer = @sui.ask_for_password("what is the airspeed velocity of an unladen swallow?")
81
81
  assert_equal nil, answer
82
82
  end
@@ -88,7 +88,7 @@ class TestGemStreamUI < Gem::TestCase
88
88
 
89
89
  @in.tty = false
90
90
 
91
- timeout(0.1) do
91
+ Timeout.timeout(0.1) do
92
92
  answer = @sui.ask_yes_no("do coconuts migrate?", false)
93
93
  assert_equal false, answer
94
94
 
@@ -103,7 +103,7 @@ class TestGemStreamUI < Gem::TestCase
103
103
 
104
104
  @in.tty = false
105
105
 
106
- timeout(0.1) do
106
+ Timeout.timeout(0.1) do
107
107
  assert_raises(Gem::OperationNotSupportedError) do
108
108
  @sui.ask_yes_no("do coconuts migrate?")
109
109
  end
@@ -9,7 +9,7 @@ class TestStubSpecification < Gem::TestCase
9
9
  def setup
10
10
  super
11
11
 
12
- @foo = Gem::StubSpecification.new FOO
12
+ @foo = Gem::StubSpecification.gemspec_stub FOO
13
13
  end
14
14
 
15
15
  def test_initialize
@@ -31,7 +31,7 @@ class TestStubSpecification < Gem::TestCase
31
31
  end
32
32
 
33
33
  def test_initialize_missing_stubline
34
- stub = Gem::StubSpecification.new(BAR)
34
+ stub = Gem::StubSpecification.gemspec_stub(BAR)
35
35
  assert_equal "bar", stub.name
36
36
  assert_equal Gem::Version.new("0.0.2"), stub.version
37
37
  assert_equal Gem::Platform.new("ruby"), stub.platform
@@ -72,6 +72,21 @@ class TestStubSpecification < Gem::TestCase
72
72
  assert_equal expected, stub.full_require_paths
73
73
  end
74
74
 
75
+ def test_lib_dirs_glob
76
+ stub = stub_without_extension
77
+
78
+ assert_equal File.join(stub.full_gem_path, 'lib'), stub.lib_dirs_glob
79
+ end
80
+
81
+ def test_matches_for_glob
82
+ stub = stub_without_extension
83
+ code_rb = File.join stub.gem_dir, 'lib', 'code.rb'
84
+ FileUtils.mkdir_p File.dirname code_rb
85
+ FileUtils.touch code_rb
86
+
87
+ assert_equal code_rb, stub.matches_for_glob('code*').first
88
+ end
89
+
75
90
  def test_missing_extensions_eh
76
91
  stub = stub_with_extension do |s|
77
92
  extconf_rb = File.join s.gem_dir, s.extensions.first
@@ -103,7 +118,7 @@ class TestStubSpecification < Gem::TestCase
103
118
  io.write spec.to_ruby_for_cache
104
119
  end
105
120
 
106
- default_spec = Gem::StubSpecification.new spec.loaded_from
121
+ default_spec = Gem::StubSpecification.gemspec_stub spec.loaded_from
107
122
 
108
123
  refute default_spec.missing_extensions?
109
124
  end
@@ -125,7 +140,7 @@ class TestStubSpecification < Gem::TestCase
125
140
  def test_to_spec_with_other_specs_loaded_does_not_warn
126
141
  real_foo = util_spec @foo.name, @foo.version
127
142
  real_foo.activate
128
- bar = Gem::StubSpecification.new BAR
143
+ bar = Gem::StubSpecification.gemspec_stub BAR
129
144
  refute_predicate Gem.loaded_specs, :empty?
130
145
  assert bar.to_spec
131
146
  end
@@ -164,7 +179,7 @@ end
164
179
 
165
180
  io.flush
166
181
 
167
- stub = Gem::StubSpecification.new io.path
182
+ stub = Gem::StubSpecification.gemspec_stub io.path
168
183
 
169
184
  yield stub if block_given?
170
185
 
@@ -187,7 +202,7 @@ end
187
202
 
188
203
  io.flush
189
204
 
190
- stub = Gem::StubSpecification.new io.path
205
+ stub = Gem::StubSpecification.gemspec_stub io.path
191
206
 
192
207
  yield stub if block_given?
193
208
 
@@ -64,6 +64,8 @@ Without the wrapping, the text might not look good in the RSS feed.
64
64
  def test_levenshtein_distance_remove
65
65
  assert_equal 3, levenshtein_distance("zentest", "zentestxxx")
66
66
  assert_equal 3, levenshtein_distance("zentestxxx", "zentest")
67
+ assert_equal 13, levenshtein_distance("cat", "thundercatsarego")
68
+ assert_equal 13, levenshtein_distance("thundercatsarego", "cat")
67
69
  end
68
70
 
69
71
  def test_levenshtein_distance_replace
@@ -158,6 +158,7 @@ class TestGemUninstaller < Gem::InstallerTestCase
158
158
  uninstaller = Gem::Uninstaller.new nil
159
159
 
160
160
  @spec.loaded_from = @spec.loaded_from.gsub @spec.full_name, '\&-legacy'
161
+ @spec.internal_init # blow out cache. but why did ^^ depend on cache?
161
162
  @spec.platform = 'legacy'
162
163
 
163
164
  assert_equal true, uninstaller.path_ok?(@gemhome, @spec)
@@ -236,7 +237,7 @@ create_makefile '#{@spec.name}'
236
237
  use_ui @ui do
237
238
  path = Gem::Package.build @spec
238
239
 
239
- installer = Gem::Installer.new path
240
+ installer = Gem::Installer.at path
240
241
  installer.install
241
242
  end
242
243
 
@@ -27,5 +27,13 @@ class TestGemUtil < Gem::TestCase
27
27
  assert_equal File.join(@tempdir, 'a'), enum.next
28
28
  end
29
29
 
30
+ def test_linked_list_find
31
+ list = [1,2,3,4,5].inject(Gem::List.new(0)) { |m,o|
32
+ Gem::List.new o, m
33
+ }
34
+ assert_equal 5, list.find { |x| x == 5 }
35
+ assert_equal 4, list.find { |x| x == 4 }
36
+ end
37
+
30
38
  end
31
39
 
@@ -26,11 +26,11 @@ class TestGemRequire < Gem::TestCase
26
26
  def setup
27
27
  super
28
28
 
29
+ @old_loaded_features = $LOADED_FEATURES.dup
29
30
  assert_raises LoadError do
30
- save_loaded_features do
31
- require 'test_gem_require_a'
32
- end
31
+ require 'test_gem_require_a'
33
32
  end
33
+ $LOADED_FEATURES.replace @old_loaded_features
34
34
  end
35
35
 
36
36
  def assert_require(path)
@@ -49,7 +49,39 @@ class TestGemRequire < Gem::TestCase
49
49
  end
50
50
  end
51
51
 
52
+ # Providing -I on the commandline should always beat gems
53
+ def test_dash_i_beats_gems
54
+ a1 = new_spec "a", "1", {"b" => "= 1"}, "lib/test_gem_require_a.rb"
55
+ b1 = new_spec "b", "1", {"c" => "> 0"}, "lib/b/c.rb"
56
+ c1 = new_spec "c", "1", nil, "lib/c/c.rb"
57
+ c2 = new_spec "c", "2", nil, "lib/c/c.rb"
58
+
59
+ install_specs c1, c2, b1, a1
60
+
61
+ dir = Dir.mktmpdir
62
+ dash_i_arg = File.join dir, 'lib'
63
+
64
+ c_rb = File.join dash_i_arg, 'b', 'c.rb'
65
+
66
+ FileUtils.mkdir_p File.dirname c_rb
67
+ File.open(c_rb, 'w') { |f| f.write "class Object; HELLO = 'world' end" }
68
+
69
+ lp = $LOAD_PATH.dup
70
+
71
+ # Pretend to provide a commandline argument that overrides a file in gem b
72
+ $LOAD_PATH.unshift dash_i_arg
73
+
74
+ assert_require 'test_gem_require_a'
75
+ assert_require 'b/c' # this should be required from -I
76
+ assert_equal "world", ::Object::HELLO
77
+ ensure
78
+ $LOAD_PATH.replace lp
79
+ Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
80
+ end
81
+
52
82
  def test_concurrent_require
83
+ skip 'deadlock' if /^1\.8\./ =~ RUBY_VERSION
84
+
53
85
  Object.const_set :FILE_ENTERED_LATCH, Latch.new(2)
54
86
  Object.const_set :FILE_EXIT_LATCH, Latch.new(1)
55
87
 
@@ -73,6 +105,8 @@ class TestGemRequire < Gem::TestCase
73
105
  assert t1.join, "thread 1 should exit"
74
106
  assert t2.join, "thread 2 should exit"
75
107
  ensure
108
+ return if $! # skipping
109
+
76
110
  Object.send :remove_const, :FILE_ENTERED_LATCH
77
111
  Object.send :remove_const, :FILE_EXIT_LATCH
78
112
  end
@@ -82,16 +116,14 @@ class TestGemRequire < Gem::TestCase
82
116
  b1 = new_spec "b", "1", nil, "lib/b/c.rb"
83
117
  b2 = new_spec "b", "2", nil, "lib/b/c.rb"
84
118
 
85
- install_specs a1, b1, b2
119
+ install_specs b1, b2, a1
86
120
 
87
- save_loaded_features do
88
- assert_require 'test_gem_require_a'
89
- assert_equal %w(a-1 b-1), loaded_spec_names
90
- assert_equal unresolved_names, []
121
+ assert_require 'test_gem_require_a'
122
+ assert_equal %w(a-1 b-1), loaded_spec_names
123
+ assert_equal unresolved_names, []
91
124
 
92
- assert_require "b/c"
93
- assert_equal %w(a-1 b-1), loaded_spec_names
94
- end
125
+ assert_require "b/c"
126
+ assert_equal %w(a-1 b-1), loaded_spec_names
95
127
  end
96
128
 
97
129
  def test_require_is_lazy_with_inexact_req
@@ -99,32 +131,28 @@ class TestGemRequire < Gem::TestCase
99
131
  b1 = new_spec "b", "1", nil, "lib/b/c.rb"
100
132
  b2 = new_spec "b", "2", nil, "lib/b/c.rb"
101
133
 
102
- install_specs a1, b1, b2
134
+ install_specs b1, b2, a1
103
135
 
104
- save_loaded_features do
105
- assert_require 'test_gem_require_a'
106
- assert_equal %w(a-1), loaded_spec_names
107
- assert_equal unresolved_names, ["b (>= 1)"]
136
+ assert_require 'test_gem_require_a'
137
+ assert_equal %w(a-1), loaded_spec_names
138
+ assert_equal unresolved_names, ["b (>= 1)"]
108
139
 
109
- assert_require "b/c"
110
- assert_equal %w(a-1 b-2), loaded_spec_names
111
- end
140
+ assert_require "b/c"
141
+ assert_equal %w(a-1 b-2), loaded_spec_names
112
142
  end
113
143
 
114
144
  def test_require_is_not_lazy_with_one_possible
115
145
  a1 = new_spec "a", "1", {"b" => ">= 1"}, "lib/test_gem_require_a.rb"
116
146
  b1 = new_spec "b", "1", nil, "lib/b/c.rb"
117
147
 
118
- install_specs a1, b1
148
+ install_specs b1, a1
119
149
 
120
- save_loaded_features do
121
- assert_require 'test_gem_require_a'
122
- assert_equal %w(a-1 b-1), loaded_spec_names
123
- assert_equal unresolved_names, []
150
+ assert_require 'test_gem_require_a'
151
+ assert_equal %w(a-1 b-1), loaded_spec_names
152
+ assert_equal unresolved_names, []
124
153
 
125
- assert_require "b/c"
126
- assert_equal %w(a-1 b-1), loaded_spec_names
127
- end
154
+ assert_require "b/c"
155
+ assert_equal %w(a-1 b-1), loaded_spec_names
128
156
  end
129
157
 
130
158
  def test_require_can_use_a_pathname_object
@@ -132,129 +160,140 @@ class TestGemRequire < Gem::TestCase
132
160
 
133
161
  install_specs a1
134
162
 
135
- save_loaded_features do
136
- assert_require Pathname.new 'test_gem_require_a'
137
- assert_equal %w(a-1), loaded_spec_names
138
- assert_equal unresolved_names, []
139
- end
163
+ assert_require Pathname.new 'test_gem_require_a'
164
+ assert_equal %w(a-1), loaded_spec_names
165
+ assert_equal unresolved_names, []
140
166
  end
141
167
 
142
168
  def test_activate_via_require_respects_loaded_files
143
- require 'benchmark' # stdlib
144
- save_loaded_features do
145
- a1 = new_spec "a", "1", {"b" => ">= 1"}, "lib/test_gem_require_a.rb"
146
- b1 = new_spec "b", "1", nil, "lib/benchmark.rb"
147
- b2 = new_spec "b", "2", nil, "lib/benchmark.rb"
169
+ a1 = new_spec "a", "1", {"b" => ">= 1"}, "lib/test_gem_require_a.rb"
170
+ b1 = new_spec "b", "1", nil, "lib/benchmark.rb"
171
+ b2 = new_spec "b", "2", nil, "lib/benchmark.rb"
148
172
 
149
- install_specs a1, b1, b2
173
+ install_specs b1, b2, a1
150
174
 
151
- require 'test_gem_require_a'
152
- assert_equal unresolved_names, ["b (>= 1)"]
175
+ require 'test_gem_require_a'
176
+ assert_equal unresolved_names, ["b (>= 1)"]
153
177
 
154
- refute require('benchmark'), "benchmark should have already been loaded"
178
+ refute require('benchmark'), "benchmark should have already been loaded"
155
179
 
156
- # We detected that we should activate b-2, so we did so, but
157
- # then original_require decided "I've already got benchmark.rb" loaded.
158
- # This case is fine because our lazy loading is provided exactly
159
- # the same behavior as eager loading would have.
180
+ # We detected that we should activate b-2, so we did so, but
181
+ # then original_require decided "I've already got benchmark.rb" loaded.
182
+ # This case is fine because our lazy loading is provided exactly
183
+ # the same behavior as eager loading would have.
160
184
 
161
- assert_equal %w(a-1 b-2), loaded_spec_names
162
- end
185
+ assert_equal %w(a-1 b-2), loaded_spec_names
163
186
  end
164
187
 
165
188
  def test_already_activated_direct_conflict
166
- save_loaded_features do
167
- a1 = new_spec "a", "1", { "b" => "> 0" }
168
- b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb"
169
- b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb"
170
- c1 = new_spec "c", "1", nil, "lib/d.rb"
171
- c2 = new_spec("c", "2", nil, "lib/d.rb")
189
+ a1 = new_spec "a", "1", { "b" => "> 0" }
190
+ b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb"
191
+ b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb"
192
+ c1 = new_spec "c", "1", nil, "lib/d.rb"
193
+ c2 = new_spec("c", "2", nil, "lib/d.rb")
172
194
 
173
- install_specs a1, b1, b2, c1, c2
195
+ install_specs c1, c2, b1, b2, a1
174
196
 
175
- a1.activate
176
- c1.activate
177
- assert_equal %w(a-1 c-1), loaded_spec_names
178
- assert_equal ["b (> 0)"], unresolved_names
197
+ a1.activate
198
+ c1.activate
199
+ assert_equal %w(a-1 c-1), loaded_spec_names
200
+ assert_equal ["b (> 0)"], unresolved_names
179
201
 
180
- assert require("ib")
202
+ assert require("ib")
181
203
 
182
- assert_equal %w(a-1 b-1 c-1), loaded_spec_names
183
- assert_equal [], unresolved_names
184
- end
204
+ assert_equal %w(a-1 b-1 c-1), loaded_spec_names
205
+ assert_equal [], unresolved_names
185
206
  end
186
207
 
187
208
  def test_multiple_gems_with_the_same_path
188
- save_loaded_features do
189
- a1 = new_spec "a", "1", { "b" => "> 0", "x" => "> 0" }
190
- b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb"
191
- b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb"
192
- x1 = new_spec "x", "1", nil, "lib/ib.rb"
193
- x2 = new_spec "x", "2", nil, "lib/ib.rb"
194
- c1 = new_spec "c", "1", nil, "lib/d.rb"
195
- c2 = new_spec("c", "2", nil, "lib/d.rb")
196
-
197
- install_specs a1, b1, b2, c1, c2, x1, x2
198
-
199
- a1.activate
200
- c1.activate
201
- assert_equal %w(a-1 c-1), loaded_spec_names
202
- assert_equal ["b (> 0)", "x (> 0)"], unresolved_names
203
-
204
- e = assert_raises(Gem::LoadError) do
205
- require("ib")
206
- end
207
-
208
- assert_equal "ib found in multiple gems: b, x", e.message
209
+ a1 = new_spec "a", "1", { "b" => "> 0", "x" => "> 0" }
210
+ b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb"
211
+ b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb"
212
+ x1 = new_spec "x", "1", nil, "lib/ib.rb"
213
+ x2 = new_spec "x", "2", nil, "lib/ib.rb"
214
+ c1 = new_spec "c", "1", nil, "lib/d.rb"
215
+ c2 = new_spec("c", "2", nil, "lib/d.rb")
216
+
217
+ install_specs c1, c2, x1, x2, b1, b2, a1
218
+
219
+ a1.activate
220
+ c1.activate
221
+ assert_equal %w(a-1 c-1), loaded_spec_names
222
+ assert_equal ["b (> 0)", "x (> 0)"], unresolved_names
223
+
224
+ e = assert_raises(Gem::LoadError) do
225
+ require("ib")
209
226
  end
227
+
228
+ assert_equal "ib found in multiple gems: b, x", e.message
210
229
  end
211
230
 
212
231
  def test_unable_to_find_good_unresolved_version
213
- save_loaded_features do
214
- a1 = new_spec "a", "1", { "b" => "> 0" }
215
- b1 = new_spec "b", "1", { "c" => ">= 2" }, "lib/ib.rb"
216
- b2 = new_spec "b", "2", { "c" => ">= 3" }, "lib/ib.rb"
232
+ a1 = new_spec "a", "1", { "b" => "> 0" }
233
+ b1 = new_spec "b", "1", { "c" => ">= 2" }, "lib/ib.rb"
234
+ b2 = new_spec "b", "2", { "c" => ">= 3" }, "lib/ib.rb"
217
235
 
218
- c1 = new_spec "c", "1", nil, "lib/d.rb"
219
- c2 = new_spec "c", "2", nil, "lib/d.rb"
220
- c3 = new_spec "c", "3", nil, "lib/d.rb"
236
+ c1 = new_spec "c", "1", nil, "lib/d.rb"
237
+ c2 = new_spec "c", "2", nil, "lib/d.rb"
238
+ c3 = new_spec "c", "3", nil, "lib/d.rb"
221
239
 
222
- install_specs a1, b1, b2, c1, c2, c3
240
+ install_specs c1, c2, c3, b1, b2, a1
223
241
 
224
- a1.activate
225
- c1.activate
226
- assert_equal %w(a-1 c-1), loaded_spec_names
227
- assert_equal ["b (> 0)"], unresolved_names
228
-
229
- e = assert_raises(Gem::LoadError) do
230
- require("ib")
231
- end
242
+ a1.activate
243
+ c1.activate
244
+ assert_equal %w(a-1 c-1), loaded_spec_names
245
+ assert_equal ["b (> 0)"], unresolved_names
232
246
 
233
- assert_equal "unable to find a version of 'b' to activate", e.message
247
+ e = assert_raises(Gem::LoadError) do
248
+ require("ib")
234
249
  end
250
+
251
+ assert_equal "unable to find a version of 'b' to activate", e.message
252
+ end
253
+
254
+ def test_require_works_after_cleanup
255
+ a1 = new_default_spec "a", "1.0", nil, "a/b.rb"
256
+ b1 = new_default_spec "b", "1.0", nil, "b/c.rb"
257
+ b2 = new_default_spec "b", "2.0", nil, "b/d.rb"
258
+
259
+ install_default_gems a1
260
+ install_default_gems b1
261
+ install_default_gems b2
262
+
263
+ # Load default ruby gems fresh as if we've just started a ruby script.
264
+ Gem::Specification.reset
265
+ require 'rubygems'
266
+ Gem::Specification.stubs
267
+
268
+ # Remove an old default gem version directly from disk as if someone ran
269
+ # gem cleanup.
270
+ FileUtils.rm_rf(File.join @default_dir, "#{b1.full_name}")
271
+ FileUtils.rm_rf(File.join @default_spec_dir, "#{b1.full_name}.gemspec")
272
+
273
+ # Require gems that have not been removed.
274
+ assert_require 'a/b'
275
+ assert_equal %w(a-1.0), loaded_spec_names
276
+ assert_require 'b/d'
277
+ assert_equal %w(a-1.0 b-2.0), loaded_spec_names
235
278
  end
236
279
 
237
280
  def test_default_gem_only
238
- save_loaded_features do
239
- default_gem_spec = new_default_spec("default", "2.0.0.0",
240
- nil, "default/gem.rb")
241
- install_default_specs(default_gem_spec)
242
- assert_require "default/gem"
243
- assert_equal %w(default-2.0.0.0), loaded_spec_names
244
- end
281
+ default_gem_spec = new_default_spec("default", "2.0.0.0",
282
+ nil, "default/gem.rb")
283
+ install_default_specs(default_gem_spec)
284
+ assert_require "default/gem"
285
+ assert_equal %w(default-2.0.0.0), loaded_spec_names
245
286
  end
246
287
 
247
288
  def test_default_gem_and_normal_gem
248
- save_loaded_features do
249
- default_gem_spec = new_default_spec("default", "2.0.0.0",
250
- nil, "default/gem.rb")
251
- install_default_specs(default_gem_spec)
252
- normal_gem_spec = new_spec("default", "3.0", nil,
253
- "lib/default/gem.rb")
254
- install_specs(normal_gem_spec)
255
- assert_require "default/gem"
256
- assert_equal %w(default-3.0), loaded_spec_names
257
- end
289
+ default_gem_spec = new_default_spec("default", "2.0.0.0",
290
+ nil, "default/gem.rb")
291
+ install_default_specs(default_gem_spec)
292
+ normal_gem_spec = new_spec("default", "3.0", nil,
293
+ "lib/default/gem.rb")
294
+ install_specs(normal_gem_spec)
295
+ assert_require "default/gem"
296
+ assert_equal %w(default-3.0), loaded_spec_names
258
297
  end
259
298
 
260
299
  def loaded_spec_names
@@ -264,12 +303,4 @@ class TestGemRequire < Gem::TestCase
264
303
  def unresolved_names
265
304
  Gem::Specification.unresolved_deps.values.map(&:to_s).sort
266
305
  end
267
-
268
- def save_loaded_features
269
- old_loaded_features = $LOADED_FEATURES.dup
270
- yield
271
- ensure
272
- $LOADED_FEATURES.replace old_loaded_features
273
- end
274
-
275
306
  end