rubygems-update 2.2.5 → 2.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 (135) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.autotest +4 -1
  5. data/CONTRIBUTING +20 -0
  6. data/History.txt +117 -14
  7. data/Manifest.txt +11 -2
  8. data/README.rdoc +1 -1
  9. data/Rakefile +0 -3
  10. data/lib/rubygems.rb +31 -11
  11. data/lib/rubygems/available_set.rb +1 -1
  12. data/lib/rubygems/basic_specification.rb +20 -10
  13. data/lib/rubygems/command.rb +4 -1
  14. data/lib/rubygems/commands/cert_command.rb +11 -13
  15. data/lib/rubygems/commands/cleanup_command.rb +2 -2
  16. data/lib/rubygems/commands/dependency_command.rb +2 -2
  17. data/lib/rubygems/commands/environment_command.rb +5 -2
  18. data/lib/rubygems/commands/help_command.rb +199 -20
  19. data/lib/rubygems/commands/install_command.rb +40 -10
  20. data/lib/rubygems/commands/list_command.rb +2 -2
  21. data/lib/rubygems/commands/open_command.rb +81 -0
  22. data/lib/rubygems/commands/search_command.rb +5 -5
  23. data/lib/rubygems/commands/setup_command.rb +1 -1
  24. data/lib/rubygems/commands/update_command.rb +8 -5
  25. data/lib/rubygems/commands/yank_command.rb +8 -13
  26. data/lib/rubygems/config_file.rb +13 -2
  27. data/lib/rubygems/dependency.rb +29 -16
  28. data/lib/rubygems/dependency_installer.rb +44 -10
  29. data/lib/rubygems/doctor.rb +1 -1
  30. data/lib/rubygems/errors.rb +30 -0
  31. data/lib/rubygems/exceptions.rb +20 -0
  32. data/lib/rubygems/ext/builder.rb +1 -1
  33. data/lib/rubygems/gemcutter_utilities.rb +1 -1
  34. data/lib/rubygems/installer.rb +4 -4
  35. data/lib/rubygems/name_tuple.rb +3 -1
  36. data/lib/rubygems/package.rb +27 -14
  37. data/lib/rubygems/package/file_source.rb +33 -0
  38. data/lib/rubygems/package/io_source.rb +45 -0
  39. data/lib/rubygems/package/old.rb +5 -5
  40. data/lib/rubygems/package/source.rb +3 -0
  41. data/lib/rubygems/platform.rb +2 -1
  42. data/lib/rubygems/rdoc.rb +1 -1
  43. data/lib/rubygems/remote_fetcher.rb +59 -18
  44. data/lib/rubygems/request.rb +71 -101
  45. data/lib/rubygems/request/connection_pools.rb +77 -0
  46. data/lib/rubygems/request/http_pool.rb +38 -0
  47. data/lib/rubygems/request/https_pool.rb +10 -0
  48. data/lib/rubygems/request_set.rb +65 -20
  49. data/lib/rubygems/request_set/gem_dependency_api.rb +234 -14
  50. data/lib/rubygems/request_set/lockfile.rb +65 -22
  51. data/lib/rubygems/requirement.rb +3 -0
  52. data/lib/rubygems/resolver.rb +33 -16
  53. data/lib/rubygems/resolver/activation_request.rb +7 -0
  54. data/lib/rubygems/resolver/api_set.rb +12 -2
  55. data/lib/rubygems/resolver/api_specification.rb +6 -0
  56. data/lib/rubygems/resolver/composed_set.rb +4 -0
  57. data/lib/rubygems/resolver/dependency_request.rb +20 -1
  58. data/lib/rubygems/resolver/git_set.rb +1 -1
  59. data/lib/rubygems/resolver/git_specification.rb +1 -1
  60. data/lib/rubygems/resolver/index_set.rb +3 -1
  61. data/lib/rubygems/resolver/installed_specification.rb +19 -1
  62. data/lib/rubygems/resolver/installer_set.rb +84 -4
  63. data/lib/rubygems/resolver/local_specification.rb +25 -0
  64. data/lib/rubygems/resolver/lock_set.rb +13 -9
  65. data/lib/rubygems/resolver/lock_specification.rb +1 -1
  66. data/lib/rubygems/resolver/set.rb +6 -0
  67. data/lib/rubygems/resolver/spec_specification.rb +0 -2
  68. data/lib/rubygems/resolver/specification.rb +23 -2
  69. data/lib/rubygems/resolver/vendor_set.rb +1 -1
  70. data/lib/rubygems/resolver/vendor_specification.rb +1 -1
  71. data/lib/rubygems/security/policy.rb +1 -0
  72. data/lib/rubygems/server.rb +36 -1
  73. data/lib/rubygems/source.rb +6 -2
  74. data/lib/rubygems/source/git.rb +1 -1
  75. data/lib/rubygems/source/installed.rb +4 -0
  76. data/lib/rubygems/source/specific_file.rb +6 -1
  77. data/lib/rubygems/spec_fetcher.rb +6 -13
  78. data/lib/rubygems/specification.rb +91 -63
  79. data/lib/rubygems/stub_specification.rb +9 -0
  80. data/lib/rubygems/test_case.rb +4 -2
  81. data/lib/rubygems/text.rb +15 -5
  82. data/lib/rubygems/uninstaller.rb +4 -1
  83. data/lib/rubygems/user_interaction.rb +8 -0
  84. data/lib/rubygems/version.rb +5 -1
  85. data/test/rubygems/test_gem.rb +88 -2
  86. data/test/rubygems/test_gem_available_set.rb +11 -8
  87. data/test/rubygems/test_gem_command.rb +55 -0
  88. data/test/rubygems/test_gem_commands_cert_command.rb +1 -0
  89. data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
  90. data/test/rubygems/test_gem_commands_help_command.rb +7 -0
  91. data/test/rubygems/test_gem_commands_install_command.rb +71 -4
  92. data/test/rubygems/test_gem_commands_open_command.rb +46 -0
  93. data/test/rubygems/test_gem_commands_setup_command.rb +9 -0
  94. data/test/rubygems/test_gem_commands_update_command.rb +48 -0
  95. data/test/rubygems/test_gem_commands_yank_command.rb +2 -2
  96. data/test/rubygems/test_gem_config_file.rb +19 -7
  97. data/test/rubygems/test_gem_dependency.rb +86 -2
  98. data/test/rubygems/test_gem_dependency_installer.rb +36 -164
  99. data/test/rubygems/test_gem_gemcutter_utilities.rb +9 -0
  100. data/test/rubygems/test_gem_installer.rb +6 -1
  101. data/test/rubygems/test_gem_name_tuple.rb +7 -0
  102. data/test/rubygems/test_gem_package.rb +17 -0
  103. data/test/rubygems/test_gem_remote_fetcher.rb +65 -46
  104. data/test/rubygems/test_gem_request.rb +75 -61
  105. data/test/rubygems/test_gem_request_connection_pools.rb +83 -0
  106. data/test/rubygems/test_gem_request_set.rb +156 -1
  107. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +72 -27
  108. data/test/rubygems/test_gem_request_set_lockfile.rb +335 -0
  109. data/test/rubygems/test_gem_requirement.rb +5 -0
  110. data/test/rubygems/test_gem_resolver.rb +91 -2
  111. data/test/rubygems/test_gem_resolver_activation_request.rb +10 -0
  112. data/test/rubygems/test_gem_resolver_api_set.rb +2 -2
  113. data/test/rubygems/test_gem_resolver_api_specification.rb +40 -0
  114. data/test/rubygems/test_gem_resolver_composed_set.rb +14 -0
  115. data/test/rubygems/test_gem_resolver_dependency_request.rb +55 -0
  116. data/test/rubygems/test_gem_resolver_git_set.rb +26 -0
  117. data/test/rubygems/test_gem_resolver_index_set.rb +28 -2
  118. data/test/rubygems/test_gem_resolver_installer_set.rb +143 -0
  119. data/test/rubygems/test_gem_resolver_lock_set.rb +12 -6
  120. data/test/rubygems/test_gem_resolver_lock_specification.rb +1 -1
  121. data/test/rubygems/test_gem_resolver_specification.rb +32 -0
  122. data/test/rubygems/test_gem_resolver_vendor_set.rb +14 -0
  123. data/test/rubygems/test_gem_security_policy.rb +2 -2
  124. data/test/rubygems/test_gem_server.rb +69 -4
  125. data/test/rubygems/test_gem_source.rb +4 -1
  126. data/test/rubygems/test_gem_source_git.rb +15 -0
  127. data/test/rubygems/test_gem_source_specific_file.rb +4 -0
  128. data/test/rubygems/test_gem_specification.rb +82 -27
  129. data/test/rubygems/test_gem_stub_specification.rb +61 -23
  130. data/test/rubygems/test_gem_uninstaller.rb +23 -0
  131. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +32 -0
  132. metadata +187 -33
  133. metadata.gz.sig +0 -0
  134. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  135. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +0 -32
@@ -9,7 +9,7 @@ class TestGemResolverLockSpecification < Gem::TestCase
9
9
  @LS = Gem::Resolver::LockSpecification
10
10
 
11
11
  @source = Gem::Source.new @gem_repo
12
- @set = Gem::Resolver::LockSet.new @source
12
+ @set = Gem::Resolver::LockSet.new [@source]
13
13
  end
14
14
 
15
15
  def test_initialize
@@ -3,6 +3,7 @@ require 'rubygems/test_case'
3
3
  class TestGemResolverSpecification < Gem::TestCase
4
4
 
5
5
  class TestSpec < Gem::Resolver::Specification
6
+ attr_writer :source
6
7
  attr_reader :spec
7
8
 
8
9
  def initialize spec
@@ -12,6 +13,26 @@ class TestGemResolverSpecification < Gem::TestCase
12
13
  end
13
14
  end
14
15
 
16
+ def test_install
17
+ gemhome = "#{@gemhome}2"
18
+ spec_fetcher do |fetcher|
19
+ fetcher.gem 'a', 1
20
+ end
21
+
22
+ a = util_spec 'a', 1
23
+
24
+ a_spec = TestSpec.new a
25
+ a_spec.source = Gem::Source.new @gem_repo
26
+
27
+ a_spec.install :install_dir => gemhome
28
+
29
+ assert_path_exists File.join gemhome, 'gems', a.full_name
30
+
31
+ expected = File.join gemhome, 'specifications', a.spec_name
32
+
33
+ assert_equal expected, a_spec.spec.loaded_from
34
+ end
35
+
15
36
  def test_installable_platform_eh
16
37
  a = util_spec 'a', 1
17
38
 
@@ -28,5 +49,16 @@ class TestGemResolverSpecification < Gem::TestCase
28
49
  refute b_spec.installable_platform?
29
50
  end
30
51
 
52
+ def test_source
53
+ a = util_spec 'a', 1
54
+
55
+ source = Gem::Source.new @gem_repo
56
+
57
+ a_spec = TestSpec.new a
58
+ a_spec.source = source
59
+
60
+ assert_equal source, a_spec.source
61
+ end
62
+
31
63
  end
32
64
 
@@ -55,6 +55,20 @@ class TestGemResolverVendorSet < Gem::TestCase
55
55
  assert_equal expected, found
56
56
  end
57
57
 
58
+ def test_find_all_prerelease
59
+ name, _, directory = vendor_gem 'a', '1.a'
60
+
61
+ @set.add_vendor_gem name, directory
62
+
63
+ req = Gem::Resolver::DependencyRequest.new dep('a'), nil
64
+
65
+ assert_empty @set.find_all req
66
+
67
+ req = Gem::Resolver::DependencyRequest.new dep('a', '>= 0.a'), nil
68
+
69
+ refute_empty @set.find_all req
70
+ end
71
+
58
72
  def test_load_spec
59
73
  error = Object.const_defined?(:KeyError) ? KeyError : IndexError
60
74
 
@@ -347,7 +347,7 @@ class TestGemSecurityPolicy < Gem::TestCase
347
347
  assert_match "WARNING: some_gem is not signed\n", @ui.error
348
348
 
349
349
  assert_raises Gem::Security::Exception do
350
- @almost_no.verify [PUBLIC_CERT], nil, digests, {}
350
+ @high.verify [PUBLIC_CERT], nil, digests, {}
351
351
  end
352
352
  end
353
353
 
@@ -513,7 +513,7 @@ class TestGemSecurityPolicy < Gem::TestCase
513
513
  digests['SHA1']['data.tar.gz'] = OpenSSL::Digest.new 'SHA1', 'hello'
514
514
 
515
515
  assert_raises Gem::Security::Exception do
516
- @almost_no.verify_signatures @spec, digests, {}
516
+ @high.verify_signatures @spec, digests, {}
517
517
  end
518
518
  end
519
519
 
@@ -10,8 +10,9 @@ class TestGemServer < Gem::TestCase
10
10
  def setup
11
11
  super
12
12
 
13
- @a1 = quick_gem 'a', '1'
14
- @a2 = quick_gem 'a', '2'
13
+ @a1 = quick_gem 'a', '1'
14
+ @a2 = quick_gem 'a', '2'
15
+ @a3_p = quick_gem 'a', '3.a'
15
16
 
16
17
  @server = Gem::Server.new Gem.dir, process_based_port, false
17
18
  @req = WEBrick::HTTPRequest.new :Logger => nil
@@ -144,6 +145,36 @@ class TestGemServer < Gem::TestCase
144
145
  assert_equal 2, @server.server.listeners.length
145
146
  end
146
147
 
148
+ def test_prerelease_specs
149
+ data = StringIO.new "GET /prerelease_specs.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
150
+ @req.parse data
151
+
152
+ Gem::Deprecate.skip_during do
153
+ @server.prerelease_specs @req, @res
154
+ end
155
+
156
+ assert_equal 200, @res.status, @res.body
157
+ assert_match %r| \d\d:\d\d:\d\d |, @res['date']
158
+ assert_equal 'application/octet-stream', @res['content-type']
159
+ assert_equal [['a', v('3.a'), Gem::Platform::RUBY]],
160
+ Marshal.load(@res.body)
161
+ end
162
+
163
+ def test_prerelease_specs_gz
164
+ data = StringIO.new "GET /prerelease_specs.#{Gem.marshal_version}.gz HTTP/1.0\r\n\r\n"
165
+ @req.parse data
166
+
167
+ Gem::Deprecate.skip_during do
168
+ @server.prerelease_specs @req, @res
169
+ end
170
+
171
+ assert_equal 200, @res.status, @res.body
172
+ assert_match %r| \d\d:\d\d:\d\d |, @res['date']
173
+ assert_equal 'application/x-gzip', @res['content-type']
174
+ assert_equal [['a', v('3.a'), Gem::Platform::RUBY]],
175
+ Marshal.load(Gem.gunzip(@res.body))
176
+ end
177
+
147
178
  def test_quick_gemdirs
148
179
  data = StringIO.new "GET /quick/Marshal.4.8/z-9.gemspec.rz HTTP/1.0\r\n\r\n"
149
180
  dir = "#{@gemhome}2"
@@ -223,6 +254,38 @@ class TestGemServer < Gem::TestCase
223
254
  assert_equal Gem::Platform.local, spec.platform
224
255
  end
225
256
 
257
+ def test_quick_marshal_a_3_a_gemspec_rz
258
+ data = StringIO.new "GET /quick/Marshal.#{Gem.marshal_version}/a-3.a.gemspec.rz HTTP/1.0\r\n\r\n"
259
+ @req.parse data
260
+
261
+ @server.quick @req, @res
262
+
263
+ assert_equal 200, @res.status, @res.body
264
+ assert @res['date']
265
+ assert_equal 'application/x-deflate', @res['content-type']
266
+
267
+ spec = Marshal.load Gem.inflate(@res.body)
268
+ assert_equal 'a', spec.name
269
+ assert_equal v('3.a'), spec.version
270
+ end
271
+
272
+ def test_quick_marshal_a_b_3_a_gemspec_rz
273
+ quick_gem 'a-b', '3.a'
274
+
275
+ data = StringIO.new "GET /quick/Marshal.#{Gem.marshal_version}/a-b-3.a.gemspec.rz HTTP/1.0\r\n\r\n"
276
+ @req.parse data
277
+
278
+ @server.quick @req, @res
279
+
280
+ assert_equal 200, @res.status, @res.body
281
+ assert @res['date']
282
+ assert_equal 'application/x-deflate', @res['content-type']
283
+
284
+ spec = Marshal.load Gem.inflate(@res.body)
285
+ assert_equal 'a-b', spec.name
286
+ assert_equal v('3.a'), spec.version
287
+ end
288
+
226
289
  def test_rdoc
227
290
  data = StringIO.new "GET /rdoc?q=a HTTP/1.0\r\n\r\n"
228
291
  @req.parse data
@@ -279,7 +342,8 @@ class TestGemServer < Gem::TestCase
279
342
  assert_equal 'application/octet-stream', @res['content-type']
280
343
 
281
344
  assert_equal [['a', Gem::Version.new(1), Gem::Platform::RUBY],
282
- ['a', Gem::Version.new(2), Gem::Platform::RUBY]],
345
+ ['a', Gem::Version.new(2), Gem::Platform::RUBY],
346
+ ['a', v('3.a'), Gem::Platform::RUBY]],
283
347
  Marshal.load(@res.body)
284
348
  end
285
349
 
@@ -318,7 +382,8 @@ class TestGemServer < Gem::TestCase
318
382
  assert_equal 'application/x-gzip', @res['content-type']
319
383
 
320
384
  assert_equal [['a', Gem::Version.new(1), Gem::Platform::RUBY],
321
- ['a', Gem::Version.new(2), Gem::Platform::RUBY]],
385
+ ['a', Gem::Version.new(2), Gem::Platform::RUBY],
386
+ ['a', v('3.a'), Gem::Platform::RUBY]],
322
387
  Marshal.load(Gem.gunzip(@res.body))
323
388
  end
324
389
 
@@ -40,7 +40,10 @@ class TestGemSource < Gem::TestCase
40
40
  end
41
41
 
42
42
  def test_dependency_resolver_set_bundler_api
43
- @fetcher.data["#{@gem_repo}api/v1/dependencies"] = 'data'
43
+ response = Net::HTTPResponse.new '1.1', 200, 'OK'
44
+ response.uri = URI('http://example') if response.respond_to? :uri
45
+
46
+ @fetcher.data["#{@gem_repo}api/v1/dependencies"] = response
44
47
 
45
48
  set = @source.dependency_resolver_set
46
49
 
@@ -27,6 +27,21 @@ class TestGemSourceGit < Gem::TestCase
27
27
  assert_path_exists File.join @source.install_dir, 'a.gemspec'
28
28
  end
29
29
 
30
+ def test_checkout_master
31
+ Dir.chdir @repository do
32
+ system @git, 'checkout', '-q', '-b', 'other'
33
+ system @git, 'mv', 'a.gemspec', 'b.gemspec'
34
+ system @git, 'commit', '-q', '-a', '-m', 'rename gemspec'
35
+ system @git, 'checkout', '-q', 'master'
36
+ end
37
+
38
+ @source = Gem::Source::Git.new @name, @repository, 'other', false
39
+
40
+ @source.checkout
41
+
42
+ assert_path_exists File.join @source.install_dir, 'b.gemspec'
43
+ end
44
+
30
45
  def test_checkout_local
31
46
  @source.remote = false
32
47
 
@@ -9,6 +9,10 @@ class TestGemSourceSpecificFile < Gem::TestCase
9
9
  @sf = Gem::Source::SpecificFile.new(@a_gem)
10
10
  end
11
11
 
12
+ def test_path
13
+ assert_equal @a_gem, @sf.path
14
+ end
15
+
12
16
  def test_spec
13
17
  assert_equal @a, @sf.spec
14
18
  end
@@ -226,7 +226,7 @@ end
226
226
  util_spec 'b', '2.0'
227
227
  c, _ = util_spec 'c', '1.0', 'b' => '= 2.0'
228
228
 
229
- e = assert_raises Gem::LoadError do
229
+ e = assert_raises Gem::ConflictError do
230
230
  assert_activate nil, a, c, "b"
231
231
  end
232
232
 
@@ -1232,14 +1232,11 @@ dependencies: []
1232
1232
  FileUtils.chmod 0555, @ext.base_dir
1233
1233
  FileUtils.chmod 0555, File.join(@ext.base_dir, 'extensions')
1234
1234
 
1235
- assert_raises Errno::EACCES do
1236
- @ext.build_extensions
1237
- end
1235
+ @ext.build_extensions
1236
+ refute_path_exists @ext.extension_dir
1238
1237
  ensure
1239
- unless Gem.win_platform? then
1240
- FileUtils.chmod 0755, File.join(@ext.base_dir, 'extensions')
1241
- FileUtils.chmod 0755, @ext.base_dir
1242
- end
1238
+ FileUtils.chmod 0755, File.join(@ext.base_dir, 'extensions')
1239
+ FileUtils.chmod 0755, @ext.base_dir
1243
1240
  end
1244
1241
 
1245
1242
  def test_build_extensions_no_extensions_dir_unwritable
@@ -1332,22 +1329,14 @@ dependencies: []
1332
1329
  def test_contains_requirable_file_eh_extension
1333
1330
  ext_spec
1334
1331
 
1335
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
1336
- FileUtils.mkdir_p File.dirname extconf_rb
1337
-
1338
- open extconf_rb, 'w' do |f|
1339
- f.write <<-'RUBY'
1340
- open 'Makefile', 'w' do |f|
1341
- f.puts "clean:\n\techo cleaned"
1342
- f.puts "default:\n\techo built"
1343
- f.puts "install:\n\techo installed"
1344
- end
1345
- RUBY
1332
+ _, err = capture_io do
1333
+ refute @ext.contains_requirable_file? 'nonexistent'
1346
1334
  end
1347
1335
 
1348
- refute @ext.contains_requirable_file? 'nonexistent'
1336
+ expected = "Ignoring ext-1 because its extensions are not built. " +
1337
+ "Try: gem pristine ext-1\n"
1349
1338
 
1350
- assert_path_exists @ext.extension_dir
1339
+ assert_equal expected, err
1351
1340
  end
1352
1341
 
1353
1342
  def test_date
@@ -1792,13 +1781,33 @@ dependencies: []
1792
1781
  enable_shared 'no' do
1793
1782
  ext_spec
1794
1783
 
1795
- @ext.require_path = 'lib'
1784
+ @ext.require_paths = 'lib'
1796
1785
 
1797
- ext_install_dir = Pathname(@ext.extension_dir)
1798
- full_gem_path = Pathname(@ext.full_gem_path)
1799
- relative_install_dir = ext_install_dir.relative_path_from full_gem_path
1786
+ assert_equal [@ext.extension_dir, 'lib'], @ext.require_paths
1787
+ end
1788
+ end
1789
+
1790
+ def test_require_paths_default_ext_dir_for
1791
+ class << Gem
1792
+ send :alias_method, :orig_default_ext_dir_for, :default_ext_dir_for
1793
+ end
1794
+
1795
+ def Gem.default_ext_dir_for base_dir
1796
+ '/foo'
1797
+ end
1798
+
1799
+ enable_shared 'no' do
1800
+ ext_spec
1800
1801
 
1801
- assert_equal [relative_install_dir.to_s, 'lib'], @ext.require_paths
1802
+ @ext.require_paths = 'lib'
1803
+
1804
+ assert_equal ['/foo/ext-1', 'lib'], @ext.require_paths
1805
+ end
1806
+ ensure
1807
+ class << Gem
1808
+ send :remove_method, :default_ext_dir_for
1809
+ send :alias_method, :default_ext_dir_for, :orig_default_ext_dir_for
1810
+ send :remove_method, :orig_default_ext_dir_for
1802
1811
  end
1803
1812
  end
1804
1813
 
@@ -1825,7 +1834,7 @@ dependencies: []
1825
1834
  def test_full_require_paths
1826
1835
  ext_spec
1827
1836
 
1828
- @ext.require_path = 'lib'
1837
+ @ext.require_paths = 'lib'
1829
1838
 
1830
1839
  expected = [
1831
1840
  @ext.extension_dir,
@@ -2875,6 +2884,52 @@ end
2875
2884
  assert_equal @m1.to_ruby, valid_ruby_spec
2876
2885
  end
2877
2886
 
2887
+ def test_missing_extensions_eh
2888
+ ext_spec
2889
+
2890
+ assert @ext.missing_extensions?
2891
+
2892
+ extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
2893
+ FileUtils.mkdir_p File.dirname extconf_rb
2894
+
2895
+ open extconf_rb, 'w' do |f|
2896
+ f.write <<-'RUBY'
2897
+ open 'Makefile', 'w' do |f|
2898
+ f.puts "clean:\n\techo clean"
2899
+ f.puts "default:\n\techo built"
2900
+ f.puts "install:\n\techo installed"
2901
+ end
2902
+ RUBY
2903
+ end
2904
+
2905
+ @ext.build_extensions
2906
+
2907
+ refute @ext.missing_extensions?
2908
+ end
2909
+
2910
+ def test_missing_extensions_eh_default_gem
2911
+ spec = new_default_spec 'default', 1
2912
+ spec.extensions << 'extconf.rb'
2913
+
2914
+ refute spec.missing_extensions?
2915
+ end
2916
+
2917
+ def test_missing_extensions_eh_legacy
2918
+ ext_spec
2919
+
2920
+ @ext.installed_by_version = v '2.2.0.preview.2'
2921
+
2922
+ assert @ext.missing_extensions?
2923
+
2924
+ @ext.installed_by_version = v '2.2.0.preview.1'
2925
+
2926
+ refute @ext.missing_extensions?
2927
+ end
2928
+
2929
+ def test_missing_extensions_eh_none
2930
+ refute @a1.missing_extensions?
2931
+ end
2932
+
2878
2933
  def test_find_by_name
2879
2934
  util_make_gems
2880
2935
  assert(Gem::Specification.find_by_name("a"))
@@ -23,16 +23,11 @@ class TestStubSpecification < Gem::TestCase
23
23
  def test_initialize_extension
24
24
  stub = stub_with_extension
25
25
 
26
- ext_install_dir = Pathname(stub.extension_dir)
27
- full_gem_path = Pathname(stub.full_gem_path)
28
- relative_install_dir = ext_install_dir.relative_path_from full_gem_path
29
- relative_install_dir = relative_install_dir.to_s
30
-
31
- assert_equal 'stub_e', stub.name
32
- assert_equal v(2), stub.version
33
- assert_equal Gem::Platform::RUBY, stub.platform
34
- assert_equal [relative_install_dir, 'lib'], stub.require_paths
35
- assert_equal %w[ext/stub_e/extconf.rb], stub.extensions
26
+ assert_equal 'stub_e', stub.name
27
+ assert_equal v(2), stub.version
28
+ assert_equal Gem::Platform::RUBY, stub.platform
29
+ assert_equal [stub.extension_dir, 'lib'], stub.require_paths
30
+ assert_equal %w[ext/stub_e/extconf.rb], stub.extensions
36
31
  end
37
32
 
38
33
  def test_initialize_missing_stubline
@@ -55,22 +50,14 @@ class TestStubSpecification < Gem::TestCase
55
50
 
56
51
  def test_contains_requirable_file_eh_extension
57
52
  stub_with_extension do |stub|
58
- extconf_rb = File.join stub.gem_dir, stub.extensions.first
59
- FileUtils.mkdir_p File.dirname extconf_rb
60
-
61
- open extconf_rb, 'w' do |f|
62
- f.write <<-'RUBY'
63
- open 'Makefile', 'w' do |f|
64
- f.puts "clean:\n\techo cleaned"
65
- f.puts "default:\n\techo built"
66
- f.puts "install:\n\techo installed"
67
- end
68
- RUBY
53
+ _, err = capture_io do
54
+ refute stub.contains_requirable_file? 'nonexistent'
69
55
  end
70
56
 
71
- refute stub.contains_requirable_file? 'nonexistent'
57
+ expected = "Ignoring stub_e-2 because its extensions are not built. " +
58
+ "Try: gem pristine stub_e-2\n"
72
59
 
73
- assert_path_exists stub.extension_dir
60
+ assert_equal expected, err
74
61
  end
75
62
  end
76
63
 
@@ -85,9 +72,60 @@ class TestStubSpecification < Gem::TestCase
85
72
  assert_equal expected, stub.full_require_paths
86
73
  end
87
74
 
75
+ def test_missing_extensions_eh
76
+ stub = stub_with_extension do |s|
77
+ extconf_rb = File.join s.gem_dir, s.extensions.first
78
+ FileUtils.mkdir_p File.dirname extconf_rb
79
+
80
+ open extconf_rb, 'w' do |f|
81
+ f.write <<-'RUBY'
82
+ open 'Makefile', 'w' do |f|
83
+ f.puts "clean:\n\techo clean"
84
+ f.puts "default:\n\techo built"
85
+ f.puts "install:\n\techo installed"
86
+ end
87
+ RUBY
88
+ end
89
+ end
90
+
91
+ assert stub.missing_extensions?
92
+
93
+ stub.build_extensions
94
+
95
+ refute stub.missing_extensions?
96
+ end
97
+
98
+ def test_missing_extensions_eh_default_gem
99
+ spec = new_default_spec 'default', 1
100
+ spec.extensions << 'extconf.rb'
101
+
102
+ open spec.loaded_from, 'w' do |io|
103
+ io.write spec.to_ruby_for_cache
104
+ end
105
+
106
+ default_spec = Gem::StubSpecification.new spec.loaded_from
107
+
108
+ refute default_spec.missing_extensions?
109
+ end
110
+
111
+ def test_missing_extensions_eh_none
112
+ refute @foo.missing_extensions?
113
+ end
114
+
88
115
  def test_to_spec
89
116
  assert @foo.to_spec.is_a?(Gem::Specification)
90
117
  assert_equal "foo", @foo.to_spec.name
118
+ refute @foo.to_spec.instance_variable_defined? :@ignored
119
+ end
120
+
121
+ def test_to_spec_missing_extensions
122
+ stub = stub_with_extension
123
+
124
+ capture_io do
125
+ stub.contains_requirable_file? 'nonexistent'
126
+ end
127
+
128
+ assert stub.to_spec.instance_variable_get :@ignored
91
129
  end
92
130
 
93
131
  def stub_with_extension