rubygems-update 3.2.30 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +163 -4
  3. data/CONTRIBUTING.md +40 -10
  4. data/Manifest.txt +28 -5
  5. data/POLICIES.md +22 -8
  6. data/README.md +9 -7
  7. data/UPGRADING.md +5 -81
  8. data/bin/gem +1 -6
  9. data/bundler/CHANGELOG.md +86 -0
  10. data/bundler/exe/bundle +7 -8
  11. data/bundler/lib/bundler/build_metadata.rb +2 -2
  12. data/bundler/lib/bundler/cli/doctor.rb +3 -2
  13. data/bundler/lib/bundler/cli/gem.rb +70 -8
  14. data/bundler/lib/bundler/cli/info.rb +6 -1
  15. data/bundler/lib/bundler/cli/install.rb +2 -0
  16. data/bundler/lib/bundler/cli/update.rb +2 -2
  17. data/bundler/lib/bundler/cli.rb +9 -1
  18. data/bundler/lib/bundler/compact_index_client/updater.rb +0 -5
  19. data/bundler/lib/bundler/definition.rb +66 -120
  20. data/bundler/lib/bundler/dependency.rb +5 -7
  21. data/bundler/lib/bundler/dsl.rb +18 -30
  22. data/bundler/lib/bundler/endpoint_specification.rb +0 -8
  23. data/bundler/lib/bundler/environment_preserver.rb +4 -1
  24. data/bundler/lib/bundler/fetcher/compact_index.rb +9 -4
  25. data/bundler/lib/bundler/fetcher.rb +2 -5
  26. data/bundler/lib/bundler/gem_helper.rb +2 -2
  27. data/bundler/lib/bundler/injector.rb +10 -1
  28. data/bundler/lib/bundler/installer/gem_installer.rb +1 -6
  29. data/bundler/lib/bundler/installer.rb +1 -4
  30. data/bundler/lib/bundler/lazy_specification.rb +17 -1
  31. data/bundler/lib/bundler/lockfile_parser.rb +10 -12
  32. data/bundler/lib/bundler/man/bundle-add.1 +10 -2
  33. data/bundler/lib/bundler/man/bundle-add.1.ronn +7 -1
  34. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  35. data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
  36. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  37. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  38. data/bundler/lib/bundler/man/bundle-config.1 +5 -5
  39. data/bundler/lib/bundler/man/bundle-config.1.ronn +5 -5
  40. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  41. data/bundler/lib/bundler/man/bundle-exec.1 +1 -1
  42. data/bundler/lib/bundler/man/bundle-gem.1 +14 -1
  43. data/bundler/lib/bundler/man/bundle-gem.1.ronn +16 -0
  44. data/bundler/lib/bundler/man/bundle-info.1 +1 -1
  45. data/bundler/lib/bundler/man/bundle-init.1 +1 -1
  46. data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
  47. data/bundler/lib/bundler/man/bundle-install.1 +2 -2
  48. data/bundler/lib/bundler/man/bundle-install.1.ronn +2 -2
  49. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  50. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  51. data/bundler/lib/bundler/man/bundle-open.1 +1 -1
  52. data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
  53. data/bundler/lib/bundler/man/bundle-platform.1 +1 -1
  54. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  55. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  56. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  57. data/bundler/lib/bundler/man/bundle-update.1 +2 -2
  58. data/bundler/lib/bundler/man/bundle-update.1.ronn +2 -1
  59. data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
  60. data/bundler/lib/bundler/man/bundle.1 +1 -1
  61. data/bundler/lib/bundler/man/gemfile.5 +28 -2
  62. data/bundler/lib/bundler/man/gemfile.5.ronn +9 -1
  63. data/bundler/lib/bundler/plugin/api/source.rb +1 -0
  64. data/bundler/lib/bundler/plugin/installer.rb +1 -1
  65. data/bundler/lib/bundler/process_lock.rb +1 -1
  66. data/bundler/lib/bundler/psyched_yaml.rb +1 -13
  67. data/bundler/lib/bundler/resolver.rb +34 -31
  68. data/bundler/lib/bundler/rubygems_ext.rb +2 -0
  69. data/bundler/lib/bundler/rubygems_integration.rb +11 -48
  70. data/bundler/lib/bundler/runtime.rb +1 -1
  71. data/bundler/lib/bundler/self_manager.rb +73 -0
  72. data/bundler/lib/bundler/shared_helpers.rb +4 -12
  73. data/bundler/lib/bundler/source/git/git_proxy.rb +7 -4
  74. data/bundler/lib/bundler/source/metadata.rb +1 -1
  75. data/bundler/lib/bundler/source/rubygems.rb +17 -13
  76. data/bundler/lib/bundler/source/rubygems_aggregate.rb +1 -1
  77. data/bundler/lib/bundler/source.rb +1 -1
  78. data/bundler/lib/bundler/source_list.rb +7 -29
  79. data/bundler/lib/bundler/spec_set.rb +1 -1
  80. data/bundler/lib/bundler/templates/Executable.bundler +1 -1
  81. data/bundler/lib/bundler/templates/Gemfile +0 -2
  82. data/bundler/lib/bundler/templates/gems.rb +0 -3
  83. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +5 -2
  84. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +15 -2
  85. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +2 -2
  86. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +13 -13
  87. data/bundler/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  88. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +2 -0
  89. data/bundler/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
  90. data/bundler/lib/bundler/ui/shell.rb +1 -1
  91. data/bundler/lib/bundler/vendor/.document +1 -0
  92. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  93. data/bundler/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  94. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +453 -0
  95. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +17 -80
  96. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -1
  97. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +5 -6
  98. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +0 -1
  99. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +0 -1
  100. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  101. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -1
  102. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +1 -14
  103. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -12
  104. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  105. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +84 -0
  106. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +22 -0
  107. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +0 -1
  108. data/bundler/lib/bundler/vendored_tsort.rb +4 -0
  109. data/bundler/lib/bundler/version.rb +1 -1
  110. data/bundler/lib/bundler.rb +9 -3
  111. data/hide_lib_for_update/note.txt +0 -4
  112. data/lib/rubygems/command.rb +4 -4
  113. data/lib/rubygems/command_manager.rb +4 -2
  114. data/lib/rubygems/commands/cert_command.rb +6 -6
  115. data/lib/rubygems/commands/fetch_command.rb +1 -1
  116. data/lib/rubygems/commands/install_command.rb +5 -2
  117. data/lib/rubygems/commands/pristine_command.rb +8 -2
  118. data/lib/rubygems/commands/server_command.rb +14 -77
  119. data/lib/rubygems/commands/setup_command.rb +84 -76
  120. data/lib/rubygems/commands/uninstall_command.rb +1 -1
  121. data/lib/rubygems/commands/update_command.rb +10 -5
  122. data/lib/rubygems/defaults.rb +2 -20
  123. data/lib/rubygems/dependency_list.rb +2 -2
  124. data/lib/rubygems/deprecate.rb +53 -6
  125. data/lib/rubygems/exceptions.rb +27 -1
  126. data/lib/rubygems/ext/builder.rb +11 -8
  127. data/lib/rubygems/ext/cmake_builder.rb +1 -1
  128. data/lib/rubygems/install_update_options.rb +13 -4
  129. data/lib/rubygems/installer.rb +46 -27
  130. data/lib/rubygems/local_remote_options.rb +3 -3
  131. data/lib/rubygems/name_tuple.rb +2 -3
  132. data/lib/rubygems/optparse/.document +1 -0
  133. data/lib/rubygems/optparse/COPYING +56 -0
  134. data/lib/rubygems/optparse/lib/optionparser.rb +2 -0
  135. data/lib/rubygems/optparse/lib/optparse/ac.rb +54 -0
  136. data/lib/rubygems/optparse/lib/optparse/date.rb +18 -0
  137. data/lib/rubygems/optparse/lib/optparse/kwargs.rb +22 -0
  138. data/lib/rubygems/optparse/lib/optparse/shellwords.rb +7 -0
  139. data/lib/rubygems/optparse/lib/optparse/time.rb +11 -0
  140. data/lib/rubygems/optparse/lib/optparse/uri.rb +7 -0
  141. data/lib/rubygems/optparse/lib/optparse/version.rb +71 -0
  142. data/lib/rubygems/optparse/lib/optparse.rb +2230 -0
  143. data/lib/rubygems/optparse.rb +3 -0
  144. data/lib/rubygems/path_support.rb +1 -6
  145. data/lib/rubygems/platform.rb +4 -0
  146. data/lib/rubygems/remote_fetcher.rb +1 -1
  147. data/lib/rubygems/request_set.rb +2 -2
  148. data/lib/rubygems/requirement.rb +1 -1
  149. data/lib/rubygems/resolver/installer_set.rb +1 -1
  150. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  151. data/lib/rubygems/security.rb +4 -3
  152. data/lib/rubygems/security_option.rb +3 -3
  153. data/lib/rubygems/source.rb +3 -1
  154. data/lib/rubygems/spec_fetcher.rb +1 -1
  155. data/lib/rubygems/specification.rb +46 -46
  156. data/lib/rubygems/text.rb +21 -20
  157. data/lib/rubygems/tsort/.document +1 -0
  158. data/lib/rubygems/tsort/LICENSE.txt +22 -0
  159. data/lib/rubygems/tsort/lib/tsort.rb +454 -0
  160. data/lib/rubygems/tsort.rb +3 -0
  161. data/lib/rubygems/uninstaller.rb +4 -1
  162. data/lib/rubygems/unknown_command_spell_checker.rb +21 -0
  163. data/lib/rubygems/util/licenses.rb +2 -0
  164. data/lib/rubygems/version.rb +2 -0
  165. data/lib/rubygems/version_option.rb +2 -2
  166. data/lib/rubygems.rb +13 -10
  167. data/rubygems-update.gemspec +1 -1
  168. data/setup.rb +1 -6
  169. data/test/rubygems/encrypted_private_key.pem +26 -26
  170. data/test/rubygems/helper.rb +48 -38
  171. data/test/rubygems/test_config.rb +2 -2
  172. data/test/rubygems/test_exit.rb +11 -0
  173. data/test/rubygems/test_gem.rb +46 -41
  174. data/test/rubygems/test_gem_command.rb +1 -1
  175. data/test/rubygems/test_gem_command_manager.rb +28 -2
  176. data/test/rubygems/test_gem_commands_cert_command.rb +8 -8
  177. data/test/rubygems/test_gem_commands_fetch_command.rb +36 -0
  178. data/test/rubygems/test_gem_commands_open_command.rb +1 -1
  179. data/test/rubygems/test_gem_commands_server_command.rb +4 -46
  180. data/test/rubygems/test_gem_commands_setup_command.rb +67 -19
  181. data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
  182. data/test/rubygems/test_gem_commands_uninstall_command.rb +1 -1
  183. data/test/rubygems/test_gem_commands_update_command.rb +2 -2
  184. data/test/rubygems/test_gem_commands_yank_command.rb +1 -1
  185. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +7 -3
  186. data/test/rubygems/test_gem_install_update_options.rb +2 -2
  187. data/test/rubygems/test_gem_installer.rb +37 -5
  188. data/test/rubygems/test_gem_path_support.rb +2 -6
  189. data/test/rubygems/test_gem_remote_fetcher.rb +15 -0
  190. data/test/rubygems/test_gem_request.rb +10 -4
  191. data/test/rubygems/test_gem_requirement.rb +0 -1
  192. data/test/rubygems/test_gem_resolver.rb +7 -7
  193. data/test/rubygems/test_gem_security.rb +1 -1
  194. data/test/rubygems/test_gem_specification.rb +27 -25
  195. data/test/rubygems/test_gem_text.rb +6 -0
  196. data/test/rubygems/test_project_sanity.rb +1 -1
  197. data/test/rubygems/test_require.rb +8 -35
  198. data/test/rubygems/test_rubygems.rb +23 -0
  199. metadata +31 -8
  200. data/bundler/lib/bundler/gemdeps.rb +0 -29
  201. data/lib/rubygems/server.rb +0 -882
  202. data/test/rubygems/bogussources.rb +0 -9
  203. data/test/rubygems/test_gem_server.rb +0 -608
@@ -14,9 +14,7 @@ class TestGemCommandsSetupCommand < Gem::TestCase
14
14
  def setup
15
15
  super
16
16
 
17
- @install_dir = File.join @tempdir, 'install'
18
17
  @cmd = Gem::Commands::SetupCommand.new
19
- @cmd.options[:prefix] = @install_dir
20
18
 
21
19
  filelist = %w[
22
20
  bin/gem
@@ -158,6 +156,21 @@ class TestGemCommandsSetupCommand < Gem::TestCase
158
156
  assert_match %r{\A#!\s*#{bin_env}#{ruby_exec}}, File.read(gem_bin_path)
159
157
  end
160
158
 
159
+ def test_destdir_flag_does_not_try_to_write_to_the_default_gem_home
160
+ FileUtils.chmod "-w", File.join(@gemhome, "plugins")
161
+
162
+ destdir = File.join(@tempdir, 'foo')
163
+
164
+ @cmd.options[:destdir] = destdir
165
+ @cmd.execute
166
+
167
+ spec = Gem::Specification.load("bundler/bundler.gemspec")
168
+
169
+ spec.executables.each do |e|
170
+ assert_path_exist File.join destdir, @gemhome.gsub(/^[a-zA-Z]:/, ''), 'gems', spec.full_name, spec.bindir, e
171
+ end
172
+ end
173
+
161
174
  def test_files_in
162
175
  assert_equal %w[rubygems.rb rubygems/requirement.rb rubygems/ssl_certs/rubygems.org/foo.pem],
163
176
  @cmd.files_in('lib').sort
@@ -227,27 +240,62 @@ class TestGemCommandsSetupCommand < Gem::TestCase
227
240
  f.puts 'echo "hello"'
228
241
  end
229
242
 
230
- bindir(bin_dir) do
231
- @cmd.options[:force] = true
243
+ @cmd.options[:force] = true
232
244
 
233
- @cmd.install_default_bundler_gem bin_dir
234
-
235
- bundler_spec = Gem::Specification.load("bundler/bundler.gemspec")
236
- default_spec_path = File.join(Gem.default_specifications_dir, "#{bundler_spec.full_name}.gemspec")
237
- spec = Gem::Specification.load(default_spec_path)
245
+ @cmd.install_default_bundler_gem bin_dir
238
246
 
239
- spec.executables.each do |e|
240
- if Gem.win_platform?
241
- assert_path_exist File.join(bin_dir, "#{e}.bat")
242
- end
247
+ bundler_spec = Gem::Specification.load("bundler/bundler.gemspec")
248
+ default_spec_path = File.join(Gem.default_specifications_dir, "#{bundler_spec.full_name}.gemspec")
249
+ spec = Gem::Specification.load(default_spec_path)
243
250
 
244
- assert_path_exist File.join bin_dir, e
251
+ spec.executables.each do |e|
252
+ if Gem.win_platform?
253
+ assert_path_exist File.join(bin_dir, "#{e}.bat")
245
254
  end
255
+
256
+ assert_path_exist File.join bin_dir, e
257
+ end
258
+ end
259
+
260
+ def test_install_default_bundler_gem_with_destdir_flag
261
+ @cmd.extend FileUtils
262
+
263
+ FileUtils.chmod "-w", @gemhome
264
+
265
+ destdir = File.join(@tempdir, 'foo')
266
+ bin_dir = File.join(destdir, 'bin')
267
+
268
+ @cmd.options[:destdir] = destdir
269
+
270
+ @cmd.install_default_bundler_gem bin_dir
271
+
272
+ spec = Gem::Specification.load("bundler/bundler.gemspec")
273
+
274
+ spec.executables.each do |e|
275
+ assert_path_exist File.join destdir, @gemhome.gsub(/^[a-zA-Z]:/, ''), 'gems', spec.full_name, spec.bindir, e
276
+ end
277
+ end
278
+
279
+ def test_install_default_bundler_gem_with_destdir_and_prefix_flags
280
+ @cmd.extend FileUtils
281
+
282
+ destdir = File.join(@tempdir, 'foo')
283
+ bin_dir = File.join(destdir, 'bin')
284
+
285
+ @cmd.options[:destdir] = destdir
286
+ @cmd.options[:prefix] = "/"
287
+
288
+ @cmd.install_default_bundler_gem bin_dir
289
+
290
+ spec = Gem::Specification.load("bundler/bundler.gemspec")
291
+
292
+ spec.executables.each do |e|
293
+ assert_path_exist File.join destdir, 'gems', spec.full_name, spec.bindir, e
246
294
  end
247
295
  end
248
296
 
249
297
  def test_remove_old_lib_files
250
- lib = File.join @install_dir, 'lib'
298
+ lib = RbConfig::CONFIG["sitelibdir"]
251
299
  lib_rubygems = File.join lib, 'rubygems'
252
300
  lib_bundler = File.join lib, 'bundler'
253
301
  lib_rubygems_defaults = File.join lib_rubygems, 'defaults'
@@ -278,7 +326,7 @@ class TestGemCommandsSetupCommand < Gem::TestCase
278
326
  end
279
327
 
280
328
  def test_remove_old_man_files
281
- man = File.join @install_dir, 'man'
329
+ man = File.join RbConfig::CONFIG['mandir'], 'man'
282
330
 
283
331
  ruby_1 = File.join man, 'man1', 'ruby.1'
284
332
  bundle_b_1 = File.join man, 'man1', 'bundle-b.1'
@@ -384,14 +432,14 @@ class TestGemCommandsSetupCommand < Gem::TestCase
384
432
  end
385
433
 
386
434
  def default_gem_bin_path
387
- File.join @install_dir, 'bin', 'gem'
435
+ File.join RbConfig::CONFIG['bindir'], 'gem'
388
436
  end
389
437
 
390
438
  def default_bundle_bin_path
391
- File.join @install_dir, 'bin', 'bundle'
439
+ File.join RbConfig::CONFIG['bindir'], 'bundle'
392
440
  end
393
441
 
394
442
  def default_bundler_bin_path
395
- File.join @install_dir, 'bin', 'bundler'
443
+ File.join RbConfig::CONFIG['bindir'], 'bundler'
396
444
  end
397
445
  end unless Gem.java_platform?
@@ -80,7 +80,7 @@ class TestGemCommandsSigninCommand < Gem::TestCase
80
80
  assert_equal api_key, credentials[:rubygems_api_key]
81
81
  end
82
82
 
83
- def test_excute_with_key_name_and_scope
83
+ def test_execute_with_key_name_and_scope
84
84
  email = 'you@example.com'
85
85
  password = 'secret'
86
86
  api_key = '1234'
@@ -436,7 +436,7 @@ WARNING: Use your OS package manager to uninstall vendor gems
436
436
 
437
437
  def test_handle_options_vendor_missing
438
438
  vendordir(nil) do
439
- e = assert_raise OptionParser::InvalidOption do
439
+ e = assert_raise Gem::OptionParser::InvalidOption do
440
440
  @cmd.handle_options %w[--vendor]
441
441
  end
442
442
 
@@ -579,7 +579,7 @@ class TestGemCommandsUpdateCommand < Gem::TestCase
579
579
 
580
580
  expected = {
581
581
  :args => [],
582
- :document => %w[rdoc ri],
582
+ :document => %w[ri],
583
583
  :force => false,
584
584
  :system => true,
585
585
  }
@@ -598,7 +598,7 @@ class TestGemCommandsUpdateCommand < Gem::TestCase
598
598
 
599
599
  expected = {
600
600
  :args => [],
601
- :document => %w[rdoc ri],
601
+ :document => %w[ri],
602
602
  :force => false,
603
603
  :system => "1.3.7",
604
604
  }
@@ -35,7 +35,7 @@ class TestGemCommandsYankCommand < Gem::TestCase
35
35
 
36
36
  def test_handle_options_missing_argument
37
37
  %w[-v --version -p --platform].each do |option|
38
- assert_raise OptionParser::MissingArgument do
38
+ assert_raise Gem::OptionParser::MissingArgument do
39
39
  @cmd.handle_options %W[a #{option}]
40
40
  end
41
41
  end
@@ -66,8 +66,11 @@ class TestGemExtExtConfBuilder < Gem::TestCase
66
66
  end
67
67
  end
68
68
 
69
- def test_class_build_env_make
70
- env_make = ENV.delete 'MAKE'
69
+ def test_class_build_env_MAKE
70
+ env_make = ENV.delete 'make'
71
+ ENV['make'] = nil
72
+
73
+ env_MAKE = ENV.delete 'MAKE'
71
74
  ENV['MAKE'] = 'anothermake'
72
75
 
73
76
  if java_platform?
@@ -89,7 +92,8 @@ class TestGemExtExtConfBuilder < Gem::TestCase
89
92
  assert_contains_make_command 'clean', output[4]
90
93
  end
91
94
  ensure
92
- ENV['MAKE'] = env_make
95
+ ENV['MAKE'] = env_MAKE
96
+ ENV['make'] = env_make
93
97
  end
94
98
 
95
99
  def test_class_build_extconf_fail
@@ -104,7 +104,7 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase
104
104
 
105
105
  @cmd.add_install_update_options
106
106
 
107
- e = assert_raise OptionParser::InvalidArgument do
107
+ e = assert_raise Gem::OptionParser::InvalidArgument do
108
108
  @cmd.handle_options %w[-P UnknownSecurity]
109
109
  end
110
110
  assert_includes e.message, "UnknownSecurity"
@@ -169,7 +169,7 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase
169
169
 
170
170
  def test_vendor_missing
171
171
  vendordir(nil) do
172
- e = assert_raise OptionParser::InvalidOption do
172
+ e = assert_raise Gem::OptionParser::InvalidOption do
173
173
  @cmd.handle_options %w[--vendor]
174
174
  end
175
175
 
@@ -288,6 +288,33 @@ gem 'other', version
288
288
  "(SyntaxError)", e.message
289
289
  end
290
290
 
291
+ def test_ensure_no_race_conditions_between_installing_and_loading_gemspecs
292
+ a, a_gem = util_gem 'a', 2
293
+
294
+ Gem::Installer.at(a_gem).install
295
+
296
+ t1 = Thread.new do
297
+ 5.times do
298
+ Gem::Installer.at(a_gem).install
299
+ sleep 0.1
300
+ end
301
+ end
302
+
303
+ t2 = Thread.new do
304
+ _, err = capture_output do
305
+ 20.times do
306
+ Gem::Specification.load(a.spec_file)
307
+ Gem::Specification.send(:clear_load_cache)
308
+ end
309
+ end
310
+
311
+ assert_empty err
312
+ end
313
+
314
+ t1.join
315
+ t2.join
316
+ end
317
+
291
318
  def test_ensure_loadable_spec_security_policy
292
319
  pend 'openssl is missing' unless Gem::HAVE_OPENSSL
293
320
 
@@ -948,7 +975,6 @@ gem 'other', version
948
975
 
949
976
  Gem.pre_install do
950
977
  assert_path_not_exist cache_file, 'cache file must not exist yet'
951
- assert_path_not_exist spec_file, 'spec file must not exist yet'
952
978
  true
953
979
  end
954
980
 
@@ -956,13 +982,11 @@ gem 'other', version
956
982
  assert_path_exist gemdir, 'gem install dir must exist'
957
983
  assert_path_exist rakefile, 'gem executable must exist'
958
984
  assert_path_not_exist stub_exe, 'gem executable must not exist'
959
- assert_path_not_exist spec_file, 'spec file must not exist yet'
960
985
  true
961
986
  end
962
987
 
963
988
  Gem.post_install do
964
989
  assert_path_exist cache_file, 'cache file must exist'
965
- assert_path_exist spec_file, 'spec file must exist'
966
990
  end
967
991
 
968
992
  @newspec = nil
@@ -1237,7 +1261,11 @@ gem 'other', version
1237
1261
  end
1238
1262
 
1239
1263
  def test_install_post_build_false
1240
- installer = setup_base_installer
1264
+ @spec = util_spec 'a'
1265
+
1266
+ util_build_gem @spec
1267
+
1268
+ installer = util_installer @spec, @gemhome
1241
1269
 
1242
1270
  Gem.post_build do
1243
1271
  false
@@ -1279,7 +1307,11 @@ gem 'other', version
1279
1307
  end
1280
1308
 
1281
1309
  def test_install_pre_install_false
1282
- installer = setup_base_installer
1310
+ @spec = util_spec 'a'
1311
+
1312
+ util_build_gem @spec
1313
+
1314
+ installer = util_installer @spec, @gemhome
1283
1315
 
1284
1316
  Gem.pre_install do
1285
1317
  false
@@ -16,7 +16,7 @@ class TestGemPathSupport < Gem::TestCase
16
16
 
17
17
  assert_equal ENV["GEM_HOME"], ps.home
18
18
 
19
- expected = util_path
19
+ expected = ENV["GEM_PATH"].split(File::PATH_SEPARATOR)
20
20
  assert_equal expected, ps.path, "defaults to GEM_PATH"
21
21
  end
22
22
 
@@ -25,7 +25,7 @@ class TestGemPathSupport < Gem::TestCase
25
25
 
26
26
  assert_equal File.join(@tempdir, "foo"), ps.home
27
27
 
28
- expected = util_path + [File.join(@tempdir, 'foo')]
28
+ expected = ENV["GEM_PATH"].split(File::PATH_SEPARATOR) + [File.join(@tempdir, 'foo')]
29
29
  assert_equal expected, ps.path
30
30
  end
31
31
 
@@ -102,10 +102,6 @@ class TestGemPathSupport < Gem::TestCase
102
102
  end
103
103
  end
104
104
 
105
- def util_path
106
- ENV["GEM_PATH"].split(File::PATH_SEPARATOR)
107
- end
108
-
109
105
  def test_initialize_spec
110
106
  ENV["GEM_SPEC_CACHE"] = nil
111
107
 
@@ -173,6 +173,21 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
173
173
  assert_equal 'hello', File.read(path)
174
174
  end
175
175
 
176
+ def test_cache_update_path_with_utf8_internal_encoding
177
+ with_internal_encoding('UTF-8') do
178
+ uri = URI 'http://example/file'
179
+ path = File.join @tempdir, 'file'
180
+ data = String.new("\xC8").force_encoding(Encoding::BINARY)
181
+
182
+ fetcher = util_fuck_with_fetcher data
183
+
184
+ written_data = fetcher.cache_update_path uri, path
185
+
186
+ assert_equal data, written_data
187
+ assert_equal data, File.binread(path)
188
+ end
189
+ end
190
+
176
191
  def test_cache_update_path_no_update
177
192
  uri = URI 'http://example/file'
178
193
  path = File.join @tempdir, 'file'
@@ -354,30 +354,36 @@ class TestGemRequest < Gem::TestCase
354
354
 
355
355
  def test_verify_certificate
356
356
  pend if Gem.java_platform?
357
+
358
+ error_number = OpenSSL::X509::V_ERR_OUT_OF_MEM
359
+
357
360
  store = OpenSSL::X509::Store.new
358
361
  context = OpenSSL::X509::StoreContext.new store
359
- context.error = OpenSSL::X509::V_ERR_OUT_OF_MEM
362
+ context.error = error_number
360
363
 
361
364
  use_ui @ui do
362
365
  Gem::Request.verify_certificate context
363
366
  end
364
367
 
365
- assert_equal "ERROR: SSL verification error at depth 0: out of memory (17)\n",
368
+ assert_equal "ERROR: SSL verification error at depth 0: out of memory (#{error_number})\n",
366
369
  @ui.error
367
370
  end
368
371
 
369
372
  def test_verify_certificate_extra_message
370
373
  pend if Gem.java_platform?
374
+
375
+ error_number = OpenSSL::X509::V_ERR_INVALID_CA
376
+
371
377
  store = OpenSSL::X509::Store.new
372
378
  context = OpenSSL::X509::StoreContext.new store
373
- context.error = OpenSSL::X509::V_ERR_INVALID_CA
379
+ context.error = error_number
374
380
 
375
381
  use_ui @ui do
376
382
  Gem::Request.verify_certificate context
377
383
  end
378
384
 
379
385
  expected = <<-ERROR
380
- ERROR: SSL verification error at depth 0: invalid CA certificate (24)
386
+ ERROR: SSL verification error at depth 0: invalid CA certificate (#{error_number})
381
387
  ERROR: Certificate is an invalid CA certificate
382
388
  ERROR
383
389
 
@@ -253,7 +253,6 @@ class TestGemRequirement < Gem::TestCase
253
253
  assert_satisfied_by "1.0.0.0", "= 1.0"
254
254
  assert_satisfied_by "10.3.2", "!= 9.3.4"
255
255
  assert_satisfied_by "10.3.2", "> 9.3.2"
256
- assert_satisfied_by "10.3.2", "> 9.3.2"
257
256
  assert_satisfied_by " 9.3.2", ">= 9.3.2"
258
257
  assert_satisfied_by "9.3.2 ", ">= 9.3.2"
259
258
  assert_satisfied_by "", "= 0"
@@ -266,14 +266,14 @@ class TestGemResolver < Gem::TestCase
266
266
 
267
267
  res = Gem::Resolver.new [a_dep], Gem::Resolver::IndexSet.new
268
268
 
269
- e = assert_raise Gem::UnsatisfiableDepedencyError do
269
+ e = assert_raise Gem::UnsatisfiableDependencyError do
270
270
  res.resolve
271
271
  end
272
272
 
273
273
  refute_empty e.errors
274
274
  end
275
275
 
276
- def test_no_overlap_specificly
276
+ def test_no_overlap_specifically
277
277
  a = util_spec "a", '1'
278
278
  b = util_spec "b", "1"
279
279
 
@@ -469,7 +469,7 @@ class TestGemResolver < Gem::TestCase
469
469
 
470
470
  r = Gem::Resolver.new([ad], set)
471
471
 
472
- e = assert_raise Gem::UnsatisfiableDepedencyError do
472
+ e = assert_raise Gem::UnsatisfiableDependencyError do
473
473
  r.resolve
474
474
  end
475
475
 
@@ -486,7 +486,7 @@ class TestGemResolver < Gem::TestCase
486
486
 
487
487
  r = Gem::Resolver.new([ad], set(a1))
488
488
 
489
- e = assert_raise Gem::UnsatisfiableDepedencyError do
489
+ e = assert_raise Gem::UnsatisfiableDependencyError do
490
490
  r.resolve
491
491
  end
492
492
 
@@ -499,7 +499,7 @@ class TestGemResolver < Gem::TestCase
499
499
 
500
500
  r = Gem::Resolver.new([ad], set(a1))
501
501
 
502
- e = assert_raise Gem::UnsatisfiableDepedencyError do
502
+ e = assert_raise Gem::UnsatisfiableDependencyError do
503
503
  r.resolve
504
504
  end
505
505
 
@@ -516,7 +516,7 @@ class TestGemResolver < Gem::TestCase
516
516
 
517
517
  r = Gem::Resolver.new([ad], set(a1))
518
518
 
519
- e = assert_raise Gem::UnsatisfiableDepedencyError do
519
+ e = assert_raise Gem::UnsatisfiableDependencyError do
520
520
  r.resolve
521
521
  end
522
522
 
@@ -781,7 +781,7 @@ class TestGemResolver < Gem::TestCase
781
781
 
782
782
  r = Gem::Resolver.new([ad], set(a1))
783
783
 
784
- e = assert_raise Gem::UnsatisfiableDepedencyError do
784
+ e = assert_raise Gem::UnsatisfiableDependencyError do
785
785
  r.resolve
786
786
  end
787
787
 
@@ -196,7 +196,7 @@ class TestGemSecurity < Gem::TestCase
196
196
 
197
197
  def test_class_sign
198
198
  issuer = PUBLIC_CERT.subject
199
- signee = OpenSSL::X509::Name.parse "/CN=signee/DC=example"
199
+ signee = OpenSSL::X509::Name.new([["CN", "signee"], ["DC", "example"]])
200
200
 
201
201
  key = PRIVATE_KEY
202
202
  cert = OpenSSL::X509::Certificate.new
@@ -147,6 +147,7 @@ end
147
147
  end
148
148
 
149
149
  def test_find_in_unresolved_tree_is_not_exponentiental
150
+ pend "currently slower in CI on TruffleRuby" if RUBY_ENGINE == 'truffleruby'
150
151
  num_of_pkg = 7
151
152
  num_of_version_per_pkg = 3
152
153
  packages = (0..num_of_pkg).map do |pkgi|
@@ -873,24 +874,21 @@ dependencies: []
873
874
  end
874
875
 
875
876
  def test_self_load_utf8_with_ascii_encoding
876
- int_enc = Encoding.default_internal
877
- silence_warnings { Encoding.default_internal = 'US-ASCII' }
878
-
879
- spec2 = @a2.dup
880
- bin = "\u5678".dup
881
- spec2.authors = [bin]
882
- full_path = spec2.spec_file
883
- write_file full_path do |io|
884
- io.write spec2.to_ruby_for_cache.force_encoding('BINARY').sub("\\u{5678}", bin.force_encoding('BINARY'))
885
- end
877
+ with_internal_encoding('US-ASCII') do
878
+ spec2 = @a2.dup
879
+ bin = "\u5678".dup
880
+ spec2.authors = [bin]
881
+ full_path = spec2.spec_file
882
+ write_file full_path do |io|
883
+ io.write spec2.to_ruby_for_cache.force_encoding('BINARY').sub("\\u{5678}", bin.force_encoding('BINARY'))
884
+ end
886
885
 
887
- spec = Gem::Specification.load full_path
886
+ spec = Gem::Specification.load full_path
888
887
 
889
- spec2.files.clear
888
+ spec2.files.clear
890
889
 
891
- assert_equal spec2, spec
892
- ensure
893
- silence_warnings { Encoding.default_internal = int_enc }
890
+ assert_equal spec2, spec
891
+ end
894
892
  end
895
893
 
896
894
  def test_self_load_legacy_ruby
@@ -944,7 +942,7 @@ dependencies: []
944
942
  end
945
943
 
946
944
  def test_self_outdated_and_latest_remotes
947
- specs = spec_fetcher do |fetcher|
945
+ spec_fetcher do |fetcher|
948
946
  fetcher.download 'a', 4
949
947
  fetcher.download 'b', 3
950
948
 
@@ -953,8 +951,8 @@ dependencies: []
953
951
  end
954
952
 
955
953
  expected = [
956
- [specs['a-3.a'], v(4)],
957
- [specs['b-2'], v(3)],
954
+ [Gem::Specification.stubs.find {|s| s.full_name == 'a-3.a' }, v(4)],
955
+ [Gem::Specification.stubs.find {|s| s.full_name == 'b-2' }, v(3)],
958
956
  ]
959
957
 
960
958
  assert_equal expected, Gem::Specification.outdated_and_latest_version.to_a
@@ -3066,6 +3064,17 @@ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
3066
3064
  WARNING
3067
3065
  end
3068
3066
 
3067
+ def test_validate_license_ref
3068
+ util_setup_validate
3069
+
3070
+ use_ui @ui do
3071
+ @a1.licenses = ['LicenseRef-LICENSE.md']
3072
+ @a1.validate
3073
+ end
3074
+
3075
+ assert_empty @ui.error
3076
+ end
3077
+
3069
3078
  def test_validate_license_values_plus
3070
3079
  util_setup_validate
3071
3080
 
@@ -3734,11 +3743,4 @@ end
3734
3743
  end
3735
3744
  end
3736
3745
  end
3737
-
3738
- def silence_warnings
3739
- old_verbose, $VERBOSE = $VERBOSE, false
3740
- yield
3741
- ensure
3742
- $VERBOSE = old_verbose
3743
- end
3744
3746
  end
@@ -83,6 +83,12 @@ Without the wrapping, the text might not look good in the RSS feed.
83
83
  assert_equal 7, levenshtein_distance("zentest", "xxxxxxx")
84
84
  end
85
85
 
86
+ def test_levenshtein_distance_all
87
+ assert_equal 6, levenshtein_distance("algorithm", "altruistic")
88
+ assert_equal 3, levenshtein_distance("saturday", "sunday")
89
+ assert_equal 3, levenshtein_distance("kitten", "sitting")
90
+ end
91
+
86
92
  def test_truncate_text
87
93
  assert_equal "abc", truncate_text("abc", "desc")
88
94
  assert_equal "Truncating desc to 2 characters:\nab", truncate_text("abc", "desc", 2)
@@ -13,7 +13,7 @@ class TestProjectSanity < Gem::TestCase
13
13
  end
14
14
 
15
15
  def test_require_rubygems_package
16
- err, status = Open3.capture2e(*ruby_with_rubygems_in_load_path, "--disable-gems", "-e", "'require \"rubygems/package\"'")
16
+ err, status = Open3.capture2e(*ruby_with_rubygems_in_load_path, "--disable-gems", "-e", "require \"rubygems/package\"")
17
17
 
18
18
  assert status.success?, err
19
19
  end