rubygems-update 3.1.6 → 3.2.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (347) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +55 -19
  3. data/CONTRIBUTING.md +1 -2
  4. data/History.txt +122 -14
  5. data/Manifest.txt +13 -25
  6. data/POLICIES.md +2 -9
  7. data/README.md +1 -1
  8. data/Rakefile +31 -33
  9. data/bin/update_rubygems +1 -1
  10. data/bundler/CHANGELOG.md +806 -741
  11. data/bundler/README.md +6 -8
  12. data/bundler/UPGRADING.md +16 -30
  13. data/bundler/bundler.gemspec +3 -3
  14. data/bundler/exe/bundle +3 -0
  15. data/bundler/lib/bundler.rb +15 -4
  16. data/bundler/lib/bundler/build_metadata.rb +2 -2
  17. data/bundler/lib/bundler/cli.rb +32 -11
  18. data/bundler/lib/bundler/cli/console.rb +1 -1
  19. data/bundler/lib/bundler/cli/gem.rb +83 -10
  20. data/bundler/lib/bundler/cli/info.rb +13 -3
  21. data/bundler/lib/bundler/cli/init.rb +1 -1
  22. data/bundler/lib/bundler/cli/install.rb +5 -14
  23. data/bundler/lib/bundler/cli/issue.rb +2 -2
  24. data/bundler/lib/bundler/cli/list.rb +11 -9
  25. data/bundler/lib/bundler/cli/outdated.rb +88 -65
  26. data/bundler/lib/bundler/cli/plugin.rb +10 -0
  27. data/bundler/lib/bundler/cli/pristine.rb +5 -0
  28. data/bundler/lib/bundler/definition.rb +32 -32
  29. data/bundler/lib/bundler/dependency.rb +0 -9
  30. data/bundler/lib/bundler/dsl.rb +1 -5
  31. data/bundler/lib/bundler/environment_preserver.rb +26 -2
  32. data/bundler/lib/bundler/errors.rb +1 -0
  33. data/bundler/lib/bundler/feature_flag.rb +0 -2
  34. data/bundler/lib/bundler/fetcher.rb +1 -0
  35. data/bundler/lib/bundler/friendly_errors.rb +4 -10
  36. data/bundler/lib/bundler/gem_helper.rb +17 -10
  37. data/bundler/lib/bundler/gem_version_promoter.rb +1 -1
  38. data/bundler/lib/bundler/injector.rb +14 -3
  39. data/bundler/lib/bundler/inline.rb +1 -1
  40. data/bundler/lib/bundler/installer.rb +29 -28
  41. data/bundler/lib/bundler/installer/gem_installer.rb +2 -2
  42. data/bundler/lib/bundler/installer/parallel_installer.rb +9 -9
  43. data/bundler/lib/bundler/lazy_specification.rb +16 -3
  44. data/bundler/lib/bundler/plugin.rb +26 -0
  45. data/bundler/lib/bundler/plugin/index.rb +9 -0
  46. data/bundler/lib/bundler/psyched_yaml.rb +0 -15
  47. data/bundler/lib/bundler/remote_specification.rb +4 -1
  48. data/bundler/lib/bundler/resolver.rb +31 -8
  49. data/bundler/lib/bundler/resolver/spec_group.rb +26 -5
  50. data/bundler/lib/bundler/rubygems_ext.rb +7 -8
  51. data/bundler/lib/bundler/rubygems_gem_installer.rb +1 -7
  52. data/bundler/lib/bundler/rubygems_integration.rb +3 -48
  53. data/bundler/lib/bundler/runtime.rb +2 -12
  54. data/bundler/lib/bundler/settings.rb +0 -3
  55. data/bundler/lib/bundler/shared_helpers.rb +1 -1
  56. data/bundler/lib/bundler/source/git.rb +4 -4
  57. data/bundler/lib/bundler/source/git/git_proxy.rb +53 -58
  58. data/bundler/lib/bundler/source/path.rb +5 -1
  59. data/bundler/lib/bundler/source/path/installer.rb +7 -9
  60. data/bundler/lib/bundler/source/rubygems.rb +11 -14
  61. data/bundler/lib/bundler/stub_specification.rb +16 -4
  62. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  63. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  64. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  65. data/bundler/lib/bundler/templates/newgem/bin/console.tt +2 -0
  66. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  67. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  68. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  69. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  70. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +2 -0
  71. data/bundler/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  72. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -4
  73. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
  74. data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  75. data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -0
  76. data/bundler/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  77. data/bundler/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  78. data/bundler/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  79. data/bundler/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  80. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +75 -189
  81. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  82. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  83. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  84. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  85. data/bundler/lib/bundler/version.rb +1 -1
  86. data/bundler/man/bundle-add.1 +1 -1
  87. data/bundler/man/bundle-add.1.txt +15 -15
  88. data/bundler/man/bundle-binstubs.1 +1 -1
  89. data/bundler/man/bundle-binstubs.1.txt +10 -10
  90. data/bundler/man/bundle-cache.1 +1 -1
  91. data/bundler/man/bundle-cache.1.txt +15 -15
  92. data/bundler/man/bundle-check.1 +1 -1
  93. data/bundler/man/bundle-check.1.txt +8 -8
  94. data/bundler/man/bundle-clean.1 +1 -1
  95. data/bundler/man/bundle-clean.1.txt +6 -6
  96. data/bundler/man/bundle-config.1 +3 -9
  97. data/bundler/man/bundle-config.1.txt +271 -272
  98. data/bundler/man/bundle-config.ronn +5 -9
  99. data/bundler/man/bundle-doctor.1 +1 -1
  100. data/bundler/man/bundle-doctor.1.txt +9 -9
  101. data/bundler/man/bundle-exec.1 +1 -1
  102. data/bundler/man/bundle-exec.1.txt +84 -81
  103. data/bundler/man/bundle-gem.1 +25 -3
  104. data/bundler/man/bundle-gem.1.txt +65 -39
  105. data/bundler/man/bundle-gem.ronn +30 -7
  106. data/bundler/man/bundle-info.1 +1 -1
  107. data/bundler/man/bundle-info.1.txt +2 -2
  108. data/bundler/man/bundle-init.1 +1 -1
  109. data/bundler/man/bundle-init.1.txt +9 -9
  110. data/bundler/man/bundle-inject.1 +1 -1
  111. data/bundler/man/bundle-inject.1.txt +4 -4
  112. data/bundler/man/bundle-install.1 +1 -1
  113. data/bundler/man/bundle-install.1.txt +169 -169
  114. data/bundler/man/bundle-list.1 +7 -7
  115. data/bundler/man/bundle-list.1.txt +12 -11
  116. data/bundler/man/bundle-list.ronn +6 -6
  117. data/bundler/man/bundle-lock.1 +1 -1
  118. data/bundler/man/bundle-lock.1.txt +28 -28
  119. data/bundler/man/bundle-open.1 +1 -1
  120. data/bundler/man/bundle-open.1.txt +3 -3
  121. data/bundler/man/bundle-outdated.1 +1 -1
  122. data/bundler/man/bundle-outdated.1.txt +34 -34
  123. data/bundler/man/bundle-platform.1 +1 -1
  124. data/bundler/man/bundle-platform.1.txt +16 -16
  125. data/bundler/man/bundle-pristine.1 +1 -1
  126. data/bundler/man/bundle-pristine.1.txt +8 -8
  127. data/bundler/man/bundle-remove.1 +1 -1
  128. data/bundler/man/bundle-remove.1.txt +9 -9
  129. data/bundler/man/bundle-show.1 +1 -1
  130. data/bundler/man/bundle-show.1.txt +8 -8
  131. data/bundler/man/bundle-update.1 +1 -1
  132. data/bundler/man/bundle-update.1.txt +149 -148
  133. data/bundler/man/bundle-viz.1 +1 -1
  134. data/bundler/man/bundle-viz.1.txt +11 -11
  135. data/bundler/man/bundle.1 +1 -1
  136. data/bundler/man/bundle.1.txt +31 -31
  137. data/bundler/man/gemfile.5 +1 -1
  138. data/bundler/man/gemfile.5.txt +218 -216
  139. data/lib/rubygems.rb +68 -148
  140. data/lib/rubygems/available_set.rb +4 -4
  141. data/lib/rubygems/basic_specification.rb +11 -5
  142. data/lib/rubygems/bundler_version_finder.rb +14 -9
  143. data/lib/rubygems/command.rb +16 -14
  144. data/lib/rubygems/command_manager.rb +4 -3
  145. data/lib/rubygems/commands/cert_command.rb +1 -1
  146. data/lib/rubygems/commands/cleanup_command.rb +3 -3
  147. data/lib/rubygems/commands/contents_command.rb +4 -4
  148. data/lib/rubygems/commands/dependency_command.rb +6 -6
  149. data/lib/rubygems/commands/fetch_command.rb +2 -2
  150. data/lib/rubygems/commands/help_command.rb +1 -1
  151. data/lib/rubygems/commands/info_command.rb +9 -4
  152. data/lib/rubygems/commands/install_command.rb +3 -3
  153. data/lib/rubygems/commands/list_command.rb +9 -6
  154. data/lib/rubygems/commands/lock_command.rb +1 -1
  155. data/lib/rubygems/commands/open_command.rb +0 -2
  156. data/lib/rubygems/commands/pristine_command.rb +10 -2
  157. data/lib/rubygems/commands/push_command.rb +4 -42
  158. data/lib/rubygems/commands/query_command.rb +7 -352
  159. data/lib/rubygems/commands/search_command.rb +8 -6
  160. data/lib/rubygems/commands/setup_command.rb +128 -32
  161. data/lib/rubygems/commands/specification_command.rb +2 -2
  162. data/lib/rubygems/commands/stale_command.rb +1 -1
  163. data/lib/rubygems/commands/uninstall_command.rb +1 -1
  164. data/lib/rubygems/commands/unpack_command.rb +1 -1
  165. data/lib/rubygems/commands/update_command.rb +40 -10
  166. data/lib/rubygems/config_file.rb +11 -2
  167. data/lib/rubygems/core_ext/kernel_require.rb +2 -2
  168. data/lib/rubygems/defaults.rb +99 -5
  169. data/lib/rubygems/dependency.rb +2 -5
  170. data/lib/rubygems/dependency_installer.rb +1 -73
  171. data/lib/rubygems/dependency_list.rb +7 -7
  172. data/lib/rubygems/deprecate.rb +46 -1
  173. data/lib/rubygems/doctor.rb +4 -2
  174. data/lib/rubygems/errors.rb +3 -2
  175. data/lib/rubygems/exceptions.rb +2 -13
  176. data/lib/rubygems/ext.rb +6 -6
  177. data/lib/rubygems/ext/build_error.rb +2 -0
  178. data/lib/rubygems/ext/builder.rb +1 -1
  179. data/lib/rubygems/ext/cmake_builder.rb +1 -1
  180. data/lib/rubygems/ext/ext_conf_builder.rb +6 -7
  181. data/lib/rubygems/gem_runner.rb +3 -8
  182. data/lib/rubygems/gemcutter_utilities.rb +1 -1
  183. data/lib/rubygems/indexer.rb +1 -19
  184. data/lib/rubygems/install_update_options.rb +5 -5
  185. data/lib/rubygems/installer.rb +45 -42
  186. data/lib/rubygems/installer_test_case.rb +19 -2
  187. data/lib/rubygems/installer_uninstaller_utils.rb +24 -0
  188. data/lib/rubygems/local_remote_options.rb +1 -1
  189. data/lib/rubygems/name_tuple.rb +2 -4
  190. data/lib/rubygems/package.rb +8 -13
  191. data/lib/rubygems/package/old.rb +1 -1
  192. data/lib/rubygems/package/tar_header.rb +3 -3
  193. data/lib/rubygems/package/tar_reader.rb +0 -1
  194. data/lib/rubygems/package/tar_reader/entry.rb +0 -1
  195. data/lib/rubygems/package/tar_test_case.rb +1 -1
  196. data/lib/rubygems/package/tar_writer.rb +2 -6
  197. data/lib/rubygems/package_task.rb +1 -5
  198. data/lib/rubygems/path_support.rb +1 -1
  199. data/lib/rubygems/platform.rb +3 -3
  200. data/lib/rubygems/query_utils.rb +362 -0
  201. data/lib/rubygems/rdoc.rb +0 -12
  202. data/lib/rubygems/remote_fetcher.rb +5 -19
  203. data/lib/rubygems/request/connection_pools.rb +1 -1
  204. data/lib/rubygems/request_set.rb +5 -5
  205. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
  206. data/lib/rubygems/request_set/lockfile.rb +8 -8
  207. data/lib/rubygems/request_set/lockfile/tokenizer.rb +1 -1
  208. data/lib/rubygems/requirement.rb +14 -15
  209. data/lib/rubygems/resolver.rb +7 -8
  210. data/lib/rubygems/resolver/api_set.rb +3 -3
  211. data/lib/rubygems/resolver/composed_set.rb +3 -3
  212. data/lib/rubygems/resolver/conflict.rb +1 -1
  213. data/lib/rubygems/resolver/index_set.rb +1 -1
  214. data/lib/rubygems/resolver/installer_set.rb +3 -3
  215. data/lib/rubygems/resolver/lock_set.rb +1 -1
  216. data/lib/rubygems/safe_yaml.rb +4 -4
  217. data/lib/rubygems/security.rb +25 -25
  218. data/lib/rubygems/security/policy.rb +3 -3
  219. data/lib/rubygems/security/signer.rb +4 -4
  220. data/lib/rubygems/security/trust_dir.rb +1 -1
  221. data/lib/rubygems/server.rb +8 -8
  222. data/lib/rubygems/source/git.rb +7 -6
  223. data/lib/rubygems/source/local.rb +2 -2
  224. data/lib/rubygems/source_list.rb +4 -5
  225. data/lib/rubygems/spec_fetcher.rb +18 -15
  226. data/lib/rubygems/specification.rb +79 -104
  227. data/lib/rubygems/specification_policy.rb +79 -27
  228. data/lib/rubygems/ssl_certs/{rubygems.org → index.rubygems.org}/GlobalSignRootCA.pem +0 -0
  229. data/lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +23 -0
  230. data/lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +25 -0
  231. data/lib/rubygems/test_case.rb +63 -83
  232. data/lib/rubygems/test_utilities.rb +6 -6
  233. data/lib/rubygems/uninstaller.rb +35 -14
  234. data/lib/rubygems/user_interaction.rb +1 -10
  235. data/lib/rubygems/util.rb +10 -2
  236. data/lib/rubygems/util/licenses.rb +4 -4
  237. data/lib/rubygems/validator.rb +1 -1
  238. data/lib/rubygems/version.rb +4 -4
  239. data/rubygems-update.gemspec +2 -2
  240. data/setup.rb +2 -7
  241. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -2
  242. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -2
  243. data/test/rubygems/test_bundled_ca.rb +4 -12
  244. data/test/rubygems/test_deprecate.rb +43 -4
  245. data/test/rubygems/test_gem.rb +79 -74
  246. data/test/rubygems/test_gem_available_set.rb +3 -3
  247. data/test/rubygems/test_gem_bundler_version_finder.rb +19 -1
  248. data/test/rubygems/test_gem_command.rb +24 -3
  249. data/test/rubygems/test_gem_command_manager.rb +37 -4
  250. data/test/rubygems/test_gem_commands_build_command.rb +7 -2
  251. data/test/rubygems/test_gem_commands_cert_command.rb +2 -2
  252. data/test/rubygems/test_gem_commands_cleanup_command.rb +1 -1
  253. data/test/rubygems/test_gem_commands_contents_command.rb +48 -15
  254. data/test/rubygems/test_gem_commands_environment_command.rb +21 -21
  255. data/test/rubygems/test_gem_commands_generate_index_command.rb +1 -5
  256. data/test/rubygems/test_gem_commands_info_command.rb +6 -6
  257. data/test/rubygems/test_gem_commands_install_command.rb +31 -31
  258. data/test/rubygems/test_gem_commands_mirror.rb +1 -1
  259. data/test/rubygems/test_gem_commands_open_command.rb +4 -4
  260. data/test/rubygems/test_gem_commands_owner_command.rb +11 -3
  261. data/test/rubygems/test_gem_commands_pristine_command.rb +41 -8
  262. data/test/rubygems/test_gem_commands_push_command.rb +7 -2
  263. data/test/rubygems/test_gem_commands_query_command.rb +9 -5
  264. data/test/rubygems/test_gem_commands_setup_command.rb +160 -108
  265. data/test/rubygems/test_gem_commands_signin_command.rb +6 -4
  266. data/test/rubygems/test_gem_commands_signout_command.rb +0 -5
  267. data/test/rubygems/test_gem_commands_specification_command.rb +18 -18
  268. data/test/rubygems/test_gem_commands_uninstall_command.rb +1 -1
  269. data/test/rubygems/test_gem_commands_update_command.rb +68 -5
  270. data/test/rubygems/test_gem_commands_which_command.rb +3 -3
  271. data/test/rubygems/test_gem_commands_yank_command.rb +14 -6
  272. data/test/rubygems/test_gem_config_file.rb +7 -10
  273. data/test/rubygems/test_gem_dependency_installer.rb +52 -189
  274. data/test/rubygems/test_gem_dependency_list.rb +8 -8
  275. data/test/rubygems/test_gem_dependency_resolution_error.rb +1 -1
  276. data/test/rubygems/test_gem_doctor.rb +28 -0
  277. data/test/rubygems/test_gem_ext_builder.rb +14 -25
  278. data/test/rubygems/test_gem_ext_cmake_builder.rb +13 -12
  279. data/test/rubygems/test_gem_ext_configure_builder.rb +1 -9
  280. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -1
  281. data/test/rubygems/test_gem_ext_rake_builder.rb +9 -9
  282. data/test/rubygems/test_gem_gem_runner.rb +42 -0
  283. data/test/rubygems/test_gem_gemcutter_utilities.rb +5 -0
  284. data/test/rubygems/test_gem_indexer.rb +9 -13
  285. data/test/rubygems/test_gem_installer.rb +149 -45
  286. data/test/rubygems/test_gem_package.rb +13 -12
  287. data/test/rubygems/test_gem_package_tar_header.rb +19 -0
  288. data/test/rubygems/test_gem_package_tar_writer.rb +3 -3
  289. data/test/rubygems/test_gem_package_task.rb +46 -11
  290. data/test/rubygems/test_gem_remote_fetcher.rb +152 -190
  291. data/test/rubygems/test_gem_request.rb +11 -11
  292. data/test/rubygems/test_gem_request_set.rb +20 -20
  293. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +3 -3
  294. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +9 -9
  295. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +118 -118
  296. data/test/rubygems/test_gem_requirement.rb +2 -2
  297. data/test/rubygems/test_gem_resolver.rb +6 -6
  298. data/test/rubygems/test_gem_resolver_api_set.rb +3 -3
  299. data/test/rubygems/test_gem_resolver_best_set.rb +2 -2
  300. data/test/rubygems/test_gem_resolver_index_set.rb +2 -2
  301. data/test/rubygems/test_gem_resolver_installer_set.rb +7 -7
  302. data/test/rubygems/test_gem_resolver_lock_set.rb +3 -3
  303. data/test/rubygems/test_gem_security.rb +20 -20
  304. data/test/rubygems/test_gem_security_policy.rb +5 -8
  305. data/test/rubygems/test_gem_security_signer.rb +8 -8
  306. data/test/rubygems/test_gem_security_trust_dir.rb +2 -2
  307. data/test/rubygems/test_gem_server.rb +10 -10
  308. data/test/rubygems/test_gem_source.rb +12 -14
  309. data/test/rubygems/test_gem_source_git.rb +12 -11
  310. data/test/rubygems/test_gem_source_installed.rb +7 -7
  311. data/test/rubygems/test_gem_source_local.rb +8 -8
  312. data/test/rubygems/test_gem_source_lock.rb +10 -10
  313. data/test/rubygems/test_gem_source_specific_file.rb +7 -7
  314. data/test/rubygems/test_gem_source_vendor.rb +7 -7
  315. data/test/rubygems/test_gem_spec_fetcher.rb +11 -2
  316. data/test/rubygems/test_gem_specification.rb +143 -113
  317. data/test/rubygems/test_gem_stream_ui.rb +3 -1
  318. data/test/rubygems/test_gem_text.rb +1 -1
  319. data/test/rubygems/test_gem_uninstaller.rb +134 -10
  320. data/test/rubygems/test_gem_util.rb +7 -5
  321. data/test/rubygems/test_gem_version.rb +1 -1
  322. data/test/rubygems/test_kernel.rb +10 -12
  323. data/test/rubygems/test_project_sanity.rb +8 -1
  324. data/test/rubygems/test_require.rb +141 -43
  325. metadata +32 -45
  326. data/.bundle/config +0 -2
  327. data/.rubocop.yml +0 -91
  328. data/Gemfile +0 -8
  329. data/Gemfile.lock +0 -43
  330. data/bundler/CODE_OF_CONDUCT.md +0 -136
  331. data/lib/rubygems/source_local.rb +0 -7
  332. data/lib/rubygems/source_specific_file.rb +0 -6
  333. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +0 -21
  334. data/lib/ubygems.rb +0 -14
  335. data/tmp/.keep +0 -0
  336. data/util/CL2notes +0 -55
  337. data/util/bisect +0 -10
  338. data/util/ci.sh +0 -62
  339. data/util/cops/deprecations.rb +0 -52
  340. data/util/create_certs.rb +0 -171
  341. data/util/create_certs.sh +0 -27
  342. data/util/create_encrypted_key.rb +0 -16
  343. data/util/generate_spdx_license_list.rb +0 -63
  344. data/util/patch_with_prs.rb +0 -77
  345. data/util/rubocop +0 -8
  346. data/util/update_bundled_ca_certificates.rb +0 -137
  347. data/util/update_changelog.rb +0 -64
@@ -5,7 +5,9 @@ require 'timeout'
5
5
 
6
6
  class TestGemStreamUI < Gem::TestCase
7
7
 
8
- SHORT_TIMEOUT = (defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?) ? 1.0 : 0.1 # increase timeout with MJIT for --jit-wait testing
8
+ # increase timeout with MJIT for --jit-wait testing
9
+ mjit_enabled = defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?
10
+ SHORT_TIMEOUT = (RUBY_ENGINE == "ruby" && !mjit_enabled) ? 0.1 : 1.0
9
11
 
10
12
  module IsTty
11
13
  attr_accessor :tty
@@ -23,7 +23,7 @@ class TestGemText < Gem::TestCase
23
23
  end
24
24
 
25
25
  def test_format_text_no_space
26
- assert_equal "texttowr\nap", format_text("texttowrap", 8)
26
+ assert_equal "texttowr\nap", format_text("texttowrap", 8)
27
27
  end
28
28
 
29
29
  def test_format_text_trailing # for two spaces after .
@@ -27,7 +27,7 @@ class TestGemUninstaller < Gem::InstallerTestCase
27
27
  FileUtils.mkdir_p 'foo/bar'
28
28
  uninstaller = Gem::Uninstaller.new nil, :install_dir => 'foo//bar'
29
29
 
30
- assert_match %r|foo/bar$|, uninstaller.instance_variable_get(:@gem_home)
30
+ assert_match %r{foo/bar$}, uninstaller.instance_variable_get(:@gem_home)
31
31
  end
32
32
 
33
33
  def test_ask_if_ok
@@ -154,6 +154,8 @@ class TestGemUninstaller < Gem::InstallerTestCase
154
154
  end
155
155
 
156
156
  def test_remove_symlinked_gem_home
157
+ skip "Symlinks not supported or not enabled" unless symlink_supported?
158
+
157
159
  Dir.mktmpdir("gem_home") do |dir|
158
160
  symlinked_gem_home = "#{dir}/#{File.basename(@gemhome)}"
159
161
 
@@ -169,6 +171,59 @@ class TestGemUninstaller < Gem::InstallerTestCase
169
171
  end
170
172
  end
171
173
 
174
+ def test_remove_plugins
175
+ write_file File.join(@tempdir, 'lib', 'rubygems_plugin.rb') do |io|
176
+ io.write "puts __FILE__"
177
+ end
178
+
179
+ @spec.files += %w[lib/rubygems_plugin.rb]
180
+
181
+ Gem::Installer.at(Gem::Package.build(@spec)).install
182
+
183
+ plugin_path = File.join Gem.plugindir, 'a_plugin.rb'
184
+ assert File.exist?(plugin_path), 'plugin not written'
185
+
186
+ Gem::Uninstaller.new(nil).remove_plugins @spec
187
+
188
+ refute File.exist?(plugin_path), 'plugin not removed'
189
+ end
190
+
191
+ def test_remove_plugins_with_install_dir
192
+ write_file File.join(@tempdir, 'lib', 'rubygems_plugin.rb') do |io|
193
+ io.write "puts __FILE__"
194
+ end
195
+
196
+ @spec.files += %w[lib/rubygems_plugin.rb]
197
+
198
+ Gem::Installer.at(Gem::Package.build(@spec)).install
199
+
200
+ plugin_path = File.join Gem.plugindir, 'a_plugin.rb'
201
+ assert File.exist?(plugin_path), 'plugin not written'
202
+
203
+ Dir.mkdir "#{@gemhome}2"
204
+ Gem::Uninstaller.new(nil, :install_dir => "#{@gemhome}2").remove_plugins @spec
205
+
206
+ assert File.exist?(plugin_path), 'plugin unintentionally removed'
207
+ end
208
+
209
+ def test_regenerate_plugins_for
210
+ write_file File.join(@tempdir, 'lib', 'rubygems_plugin.rb') do |io|
211
+ io.write "puts __FILE__"
212
+ end
213
+
214
+ @spec.files += %w[lib/rubygems_plugin.rb]
215
+
216
+ Gem::Installer.at(Gem::Package.build(@spec)).install
217
+
218
+ plugin_path = File.join Gem.plugindir, 'a_plugin.rb'
219
+ assert File.exist?(plugin_path), 'plugin not written'
220
+
221
+ FileUtils.rm plugin_path
222
+ Gem::Uninstaller.new(nil).regenerate_plugins_for @spec, Gem.plugindir
223
+
224
+ assert File.exist?(plugin_path), 'plugin not regenerated'
225
+ end
226
+
172
227
  def test_path_ok_eh
173
228
  uninstaller = Gem::Uninstaller.new nil
174
229
 
@@ -405,12 +460,12 @@ create_makefile '#{@spec.name}'
405
460
  lines = ui.output.split("\n")
406
461
  lines.shift
407
462
 
408
- assert_match %r!You have requested to uninstall the gem:!, lines.shift
463
+ assert_match %r{You have requested to uninstall the gem:}, lines.shift
409
464
  lines.shift
410
465
  lines.shift
411
466
 
412
- assert_match %r!r-1 depends on q \(= 1\)!, lines.shift
413
- assert_match %r!Successfully uninstalled q-1!, lines.last
467
+ assert_match %r{r-1 depends on q \(= 1\)}, lines.shift
468
+ assert_match %r{Successfully uninstalled q-1}, lines.last
414
469
  end
415
470
 
416
471
  def test_uninstall_only_lists_unsatisfied_deps
@@ -435,12 +490,12 @@ create_makefile '#{@spec.name}'
435
490
  lines = ui.output.split("\n")
436
491
  lines.shift
437
492
 
438
- assert_match %r!You have requested to uninstall the gem:!, lines.shift
493
+ assert_match %r{You have requested to uninstall the gem:}, lines.shift
439
494
  lines.shift
440
495
  lines.shift
441
496
 
442
- assert_match %r!x-1 depends on q \(= 1.0\)!, lines.shift
443
- assert_match %r!Successfully uninstalled q-1.0!, lines.last
497
+ assert_match %r{x-1 depends on q \(= 1.0\)}, lines.shift
498
+ assert_match %r{Successfully uninstalled q-1.0}, lines.last
444
499
  end
445
500
 
446
501
  def test_uninstall_doesnt_prompt_when_other_gem_satisfies_requirement
@@ -516,12 +571,41 @@ create_makefile '#{@spec.name}'
516
571
  lines = ui.output.split("\n")
517
572
  lines.shift
518
573
 
519
- assert_match %r!You have requested to uninstall the gem:!, lines.shift
574
+ assert_match %r{You have requested to uninstall the gem:}, lines.shift
520
575
  lines.shift
521
576
  lines.shift
522
577
 
523
- assert_match %r!r-1 depends on q \(= 1, development\)!, lines.shift
524
- assert_match %r!Successfully uninstalled q-1!, lines.last
578
+ assert_match %r{r-1 depends on q \(= 1, development\)}, lines.shift
579
+ assert_match %r{Successfully uninstalled q-1}, lines.last
580
+ end
581
+
582
+ def test_uninstall_prompt_only_lists_the_dependents_that_prevented_uninstallation
583
+ quick_gem 'r', '1' do |s|
584
+ s.add_development_dependency 'q', '= 1'
585
+ end
586
+
587
+ quick_gem 's', '1' do |s|
588
+ s.add_dependency 'q', '= 1'
589
+ end
590
+
591
+ quick_gem 'q', '1'
592
+
593
+ un = Gem::Uninstaller.new('q', :check_dev => false)
594
+ ui = Gem::MockGemUi.new("y\n")
595
+
596
+ use_ui ui do
597
+ un.uninstall
598
+ end
599
+
600
+ lines = ui.output.split("\n")
601
+ lines.shift
602
+
603
+ assert_match %r{You have requested to uninstall the gem:}, lines.shift
604
+ lines.shift
605
+ lines.shift
606
+
607
+ assert_match %r{s-1 depends on q \(= 1\)}, lines.shift
608
+ assert_match %r{Successfully uninstalled q-1}, lines.last
525
609
  end
526
610
 
527
611
  def test_uninstall_no_permission
@@ -542,4 +626,44 @@ create_makefile '#{@spec.name}'
542
626
  end
543
627
  end
544
628
 
629
+ def test_uninstall_keeps_plugins_up_to_date
630
+ write_file File.join(@tempdir, 'lib', 'rubygems_plugin.rb') do |io|
631
+ io.write "puts __FILE__"
632
+ end
633
+
634
+ plugin_path = File.join Gem.plugindir, 'a_plugin.rb'
635
+
636
+ @spec.version = '1'
637
+ Gem::Installer.at(Gem::Package.build(@spec)).install
638
+
639
+ refute File.exist?(plugin_path), 'version without plugin installed, but plugin written'
640
+
641
+ @spec.files += %w[lib/rubygems_plugin.rb]
642
+ @spec.version = '2'
643
+ Gem::Installer.at(Gem::Package.build(@spec)).install
644
+
645
+ assert File.exist?(plugin_path), 'version with plugin installed, but plugin not written'
646
+ assert_match %r{\Arequire.*a-2/lib/rubygems_plugin\.rb}, File.read(plugin_path), 'written plugin has incorrect content'
647
+
648
+ @spec.version = '3'
649
+ Gem::Installer.at(Gem::Package.build(@spec)).install
650
+
651
+ assert File.exist?(plugin_path), 'version with plugin installed, but plugin removed'
652
+ assert_match %r{\Arequire.*a-3/lib/rubygems_plugin\.rb}, File.read(plugin_path), 'old version installed, but plugin updated'
653
+
654
+ Gem::Uninstaller.new('a', :version => '1', :executables => true).uninstall
655
+
656
+ assert File.exist?(plugin_path), 'plugin removed when old version uninstalled'
657
+ assert_match %r{\Arequire.*a-3/lib/rubygems_plugin\.rb}, File.read(plugin_path), 'old version uninstalled, but plugin updated'
658
+
659
+ Gem::Uninstaller.new('a', version: '3', :executables => true).uninstall
660
+
661
+ assert File.exist?(plugin_path), 'plugin removed when old version uninstalled and another version with plugin still present'
662
+ assert_match %r{\Arequire.*a-2/lib/rubygems_plugin\.rb}, File.read(plugin_path), 'latest version uninstalled, but plugin not updated to previous version'
663
+
664
+ Gem::Uninstaller.new('a', version: '2', :executables => true).uninstall
665
+
666
+ refute File.exist?(plugin_path), 'last version uninstalled, but plugin still present'
667
+ end
668
+
545
669
  end
@@ -6,7 +6,7 @@ class TestGemUtil < Gem::TestCase
6
6
 
7
7
  def test_class_popen
8
8
  skip "popen with a block does not behave well on jruby" if Gem.java_platform?
9
- assert_equal "0\n", Gem::Util.popen(Gem.ruby, '-I', File.expand_path('../../../lib', __FILE__), '-e', 'p 0')
9
+ assert_equal "0\n", Gem::Util.popen(*ruby_with_rubygems_in_load_path, '-e', 'p 0')
10
10
 
11
11
  assert_raises Errno::ECHILD do
12
12
  Process.wait(-1)
@@ -15,8 +15,10 @@ class TestGemUtil < Gem::TestCase
15
15
 
16
16
  def test_silent_system
17
17
  skip if Gem.java_platform?
18
- assert_silent do
19
- Gem::Util.silent_system Gem.ruby, '-I', File.expand_path('../../../lib', __FILE__), '-e', 'puts "hello"; warn "hello"'
18
+ Gem::Deprecate.skip_during do
19
+ assert_silent do
20
+ Gem::Util.silent_system(*ruby_with_rubygems_in_load_path, '-e', 'puts "hello"; warn "hello"')
21
+ end
20
22
  end
21
23
  end
22
24
 
@@ -56,8 +58,8 @@ class TestGemUtil < Gem::TestCase
56
58
  list = [1,2,3,4,5].inject(Gem::List.new(0)) do |m,o|
57
59
  Gem::List.new o, m
58
60
  end
59
- assert_equal 5, list.find { |x| x == 5 }
60
- assert_equal 4, list.find { |x| x == 4 }
61
+ assert_equal 5, list.find {|x| x == 5 }
62
+ assert_equal 4, list.find {|x| x == 4 }
61
63
  end
62
64
 
63
65
  def test_glob_files_in_dir
@@ -236,7 +236,7 @@ class TestGemVersion < Gem::TestCase
236
236
  assert_equal expected, v(version).approximate_recommendation
237
237
  end
238
238
 
239
- # Assert that the "approximate" recommendation for +version+ satifies +version+.
239
+ # Assert that the "approximate" recommendation for +version+ satisfies +version+.
240
240
 
241
241
  def assert_approximate_satisfies_itself(version)
242
242
  gem_version = v(version)
@@ -19,7 +19,7 @@ class TestKernel < Gem::TestCase
19
19
 
20
20
  def test_gem
21
21
  assert gem('a', '= 1'), "Should load"
22
- assert $:.any? { |p| %r{a-1/lib} =~ p }
22
+ assert $:.any? {|p| %r{a-1/lib} =~ p }
23
23
  end
24
24
 
25
25
  def test_gem_default
@@ -49,13 +49,13 @@ class TestKernel < Gem::TestCase
49
49
  def test_gem_redundant
50
50
  assert gem('a', '= 1'), "Should load"
51
51
  refute gem('a', '= 1'), "Should not load"
52
- assert_equal 1, $:.select { |p| %r{a-1/lib} =~ p }.size
52
+ assert_equal 1, $:.select {|p| %r{a-1/lib} =~ p }.size
53
53
  end
54
54
 
55
55
  def test_gem_overlapping
56
56
  assert gem('a', '= 1'), "Should load"
57
57
  refute gem('a', '>= 1'), "Should not load"
58
- assert_equal 1, $:.select { |p| %r{a-1/lib} =~ p }.size
58
+ assert_equal 1, $:.select {|p| %r{a-1/lib} =~ p }.size
59
59
  end
60
60
 
61
61
  def test_gem_prerelease
@@ -82,13 +82,13 @@ class TestKernel < Gem::TestCase
82
82
  assert_match(/activated a-1/, ex.message)
83
83
  assert_equal 'a', ex.name
84
84
 
85
- assert $:.any? { |p| %r{a-1/lib} =~ p }
86
- refute $:.any? { |p| %r{a-2/lib} =~ p }
85
+ assert $:.any? {|p| %r{a-1/lib} =~ p }
86
+ refute $:.any? {|p| %r{a-2/lib} =~ p }
87
87
  end
88
88
 
89
89
  def test_gem_not_adding_bin
90
90
  assert gem('a', '= 1'), "Should load"
91
- refute $:.any? { |p| %r{a-1/bin} =~ p }
91
+ refute $:.any? {|p| %r{a-1/bin} =~ p }
92
92
  end
93
93
 
94
94
  def test_gem_failing_inside_require_doesnt_cause_double_exceptions
@@ -98,14 +98,12 @@ class TestKernel < Gem::TestCase
98
98
 
99
99
  output, _ = Open3.capture2e(
100
100
  { "GEM_HOME" => Gem.paths.home },
101
- Gem.ruby,
102
- "-I",
103
- File.expand_path("../../lib", __dir__),
101
+ *ruby_with_rubygems_in_load_path,
104
102
  "-r",
105
103
  "./activate.rb"
106
104
  )
107
105
 
108
- load_errors = output.split("\n").select { |line| line.include?("Could not find")}
106
+ load_errors = output.split("\n").select {|line| line.include?("Could not find") }
109
107
 
110
108
  assert_equal 1, load_errors.size
111
109
  end
@@ -115,7 +113,7 @@ class TestKernel < Gem::TestCase
115
113
  quick_gem 'bundler', '2.a'
116
114
 
117
115
  assert gem('bundler')
118
- assert $:.any? { |p| %r{bundler-1/lib} =~ p }
116
+ assert $:.any? {|p| %r{bundler-1/lib} =~ p }
119
117
  end
120
118
 
121
119
  def test_gem_bundler_missing_bundler_version
@@ -136,7 +134,7 @@ class TestKernel < Gem::TestCase
136
134
  quick_gem 'bundler', '2.a'
137
135
 
138
136
  assert gem('bundler', '>= 0.a')
139
- assert $:.any? { |p| %r{bundler-1/lib} =~ p }
137
+ assert $:.any? {|p| %r{bundler-1/lib} =~ p }
140
138
  end
141
139
  end
142
140
 
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rubygems/test_case"
3
4
  require "open3"
4
5
 
5
- class TestProjectSanity < Minitest::Test
6
+ class TestProjectSanity < Gem::TestCase
6
7
 
7
8
  def test_manifest_is_up_to_date
8
9
  skip unless File.exist?(File.expand_path("../../../Rakefile", __FILE__))
@@ -12,4 +13,10 @@ class TestProjectSanity < Minitest::Test
12
13
  assert status.success?, "Expected Manifest.txt to be up to date, but it's not. Run `rake update_manifest` to sync it."
13
14
  end
14
15
 
16
+ def test_require_rubygems_package
17
+ err, status = Open3.capture2e(*ruby_with_rubygems_in_load_path, "--disable-gems", "-e", "'require \"rubygems/package\"'")
18
+
19
+ assert status.success?, err
20
+ end
21
+
15
22
  end
@@ -52,7 +52,7 @@ class TestGemRequire < Gem::TestCase
52
52
  foo1 = File.join lp1, 'foo.rb'
53
53
 
54
54
  FileUtils.mkdir_p lp1
55
- File.open(foo1, 'w') { |f| f.write "class Object; HELLO = 'foo1' end" }
55
+ File.open(foo1, 'w') {|f| f.write "class Object; HELLO = 'foo1' end" }
56
56
 
57
57
  lp = $LOAD_PATH.dup
58
58
 
@@ -64,7 +64,7 @@ class TestGemRequire < Gem::TestCase
64
64
  foo2 = File.join lp2, 'foo.rb'
65
65
 
66
66
  FileUtils.mkdir_p lp2
67
- File.open(foo2, 'w') { |f| f.write "class Object; HELLO = 'foo2' end" }
67
+ File.open(foo2, 'w') {|f| f.write "class Object; HELLO = 'foo2' end" }
68
68
 
69
69
  $LOAD_PATH.unshift lp2
70
70
  refute_require 'foo'
@@ -89,7 +89,7 @@ class TestGemRequire < Gem::TestCase
89
89
  c_rb = File.join dash_i_arg, 'b', 'c.rb'
90
90
 
91
91
  FileUtils.mkdir_p File.dirname c_rb
92
- File.open(c_rb, 'w') { |f| f.write "class Object; HELLO = 'world' end" }
92
+ File.open(c_rb, 'w') {|f| f.write "class Object; HELLO = 'world' end" }
93
93
 
94
94
  lp = $LOAD_PATH.dup
95
95
 
@@ -99,7 +99,7 @@ class TestGemRequire < Gem::TestCase
99
99
  assert_require 'test_gem_require_a'
100
100
  assert_require 'b/c' # this should be required from -I
101
101
  assert_equal "world", ::Object::HELLO
102
- assert_equal %w(a-1 b-1), loaded_spec_names
102
+ assert_equal %w[a-1 b-1], loaded_spec_names
103
103
  ensure
104
104
  $LOAD_PATH.replace lp
105
105
  Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
@@ -131,7 +131,7 @@ class TestGemRequire < Gem::TestCase
131
131
  c_rb = File.join dash_i_arg, 'c', 'c.rb'
132
132
 
133
133
  FileUtils.mkdir_p File.dirname c_rb
134
- File.open(c_rb, 'w') { |f| f.write "class Object; HELLO = 'world' end" }
134
+ File.open(c_rb, 'w') {|f| f.write "class Object; HELLO = 'world' end" }
135
135
 
136
136
  assert_require 'test_gem_require_a'
137
137
 
@@ -143,7 +143,7 @@ class TestGemRequire < Gem::TestCase
143
143
  assert_require 'b/c'
144
144
  assert_require 'c/c' # this should be required from -I
145
145
  assert_equal "world", ::Object::HELLO
146
- assert_equal %w(a-1 b-1), loaded_spec_names
146
+ assert_equal %w[a-1 b-1], loaded_spec_names
147
147
  ensure
148
148
  $LOAD_PATH.replace lp
149
149
  Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
@@ -151,6 +151,7 @@ class TestGemRequire < Gem::TestCase
151
151
 
152
152
  def test_dash_i_respects_default_library_extension_priority
153
153
  skip "extensions don't quite work on jruby" if Gem.java_platform?
154
+ skip "not installed yet" unless RbConfig::TOPDIR
154
155
 
155
156
  dash_i_ext_arg = util_install_extension_file('a')
156
157
  dash_i_lib_arg = util_install_ruby_file('a')
@@ -200,11 +201,11 @@ class TestGemRequire < Gem::TestCase
200
201
  install_specs b1, b2, a1
201
202
 
202
203
  assert_require 'test_gem_require_a'
203
- assert_equal %w(a-1 b-1), loaded_spec_names
204
+ assert_equal %w[a-1 b-1], loaded_spec_names
204
205
  assert_equal unresolved_names, []
205
206
 
206
207
  assert_require "b/c"
207
- assert_equal %w(a-1 b-1), loaded_spec_names
208
+ assert_equal %w[a-1 b-1], loaded_spec_names
208
209
  end
209
210
 
210
211
  def test_require_is_lazy_with_inexact_req
@@ -215,11 +216,11 @@ class TestGemRequire < Gem::TestCase
215
216
  install_specs b1, b2, a1
216
217
 
217
218
  assert_require 'test_gem_require_a'
218
- assert_equal %w(a-1), loaded_spec_names
219
+ assert_equal %w[a-1], loaded_spec_names
219
220
  assert_equal unresolved_names, ["b (>= 1)"]
220
221
 
221
222
  assert_require "b/c"
222
- assert_equal %w(a-1 b-2), loaded_spec_names
223
+ assert_equal %w[a-1 b-2], loaded_spec_names
223
224
  end
224
225
 
225
226
  def test_require_is_not_lazy_with_one_possible
@@ -229,11 +230,11 @@ class TestGemRequire < Gem::TestCase
229
230
  install_specs b1, a1
230
231
 
231
232
  assert_require 'test_gem_require_a'
232
- assert_equal %w(a-1 b-1), loaded_spec_names
233
+ assert_equal %w[a-1 b-1], loaded_spec_names
233
234
  assert_equal unresolved_names, []
234
235
 
235
236
  assert_require "b/c"
236
- assert_equal %w(a-1 b-1), loaded_spec_names
237
+ assert_equal %w[a-1 b-1], loaded_spec_names
237
238
  end
238
239
 
239
240
  def test_require_can_use_a_pathname_object
@@ -242,7 +243,7 @@ class TestGemRequire < Gem::TestCase
242
243
  install_specs a1
243
244
 
244
245
  assert_require Pathname.new 'test_gem_require_a'
245
- assert_equal %w(a-1), loaded_spec_names
246
+ assert_equal %w[a-1], loaded_spec_names
246
247
  assert_equal unresolved_names, []
247
248
  end
248
249
 
@@ -252,32 +253,77 @@ class TestGemRequire < Gem::TestCase
252
253
  stdlib one is already in $LOADED_FEATURES?. Reproducible by running the
253
254
  spaceship_specific_file test before this one" if java_platform?
254
255
 
255
- lp = $LOAD_PATH.dup
256
- lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "../../lib"))
257
- if File.exist?(lib_dir)
256
+ skip "not installed yet" unless RbConfig::TOPDIR
257
+
258
+ lib_dir = File.expand_path("../../lib", File.dirname(__FILE__))
259
+ rubylibdir = File.realdirpath(RbConfig::CONFIG["rubylibdir"])
260
+ if rubylibdir == lib_dir
261
+ # testing in the ruby repository where RubyGems' lib/ == stdlib lib/
262
+ # In that case we want to move the stdlib lib/ to still be after b-2 in $LOAD_PATH
263
+ lp = $LOAD_PATH.dup
258
264
  $LOAD_PATH.delete lib_dir
259
265
  $LOAD_PATH.push lib_dir
266
+ load_path_changed = true
260
267
  end
261
268
 
269
+ require 'benchmark' # the stdlib
270
+
262
271
  a1 = util_spec "a", "1", {"b" => ">= 1"}, "lib/test_gem_require_a.rb"
263
272
  b1 = util_spec "b", "1", nil, "lib/benchmark.rb"
264
273
  b2 = util_spec "b", "2", nil, "lib/benchmark.rb"
265
274
 
266
275
  install_specs b1, b2, a1
267
276
 
277
+ # Activates a-1, but not b-1 and b-2
268
278
  assert_require 'test_gem_require_a'
279
+ assert_equal %w[a-1], loaded_spec_names
280
+ assert $LOAD_PATH.include? a1.load_paths[0]
281
+ refute $LOAD_PATH.include? b1.load_paths[0]
282
+ refute $LOAD_PATH.include? b2.load_paths[0]
283
+
269
284
  assert_equal unresolved_names, ["b (>= 1)"]
270
285
 
271
- refute require('benchmark'), "benchmark should have already been loaded"
286
+ # The require('benchmark') below will activate b-2. However, its
287
+ # lib/benchmark.rb won't ever be loaded. The reason is MRI sees that even
288
+ # though b-2 is earlier in $LOAD_PATH it already loaded a benchmark.rb file
289
+ # and that still exists in $LOAD_PATH (further down),
290
+ # and as a result #gem_original_require returns false.
291
+ refute require('benchmark'), "the benchmark stdlib should be recognized as already loaded"
292
+
293
+ assert_includes $LOAD_PATH, b2.load_paths[0]
294
+ assert_includes $LOAD_PATH, rubylibdir
295
+ message = proc {
296
+ "this test relies on the b-2 gem lib/ to be before stdlib to make sense\n" +
297
+ $LOAD_PATH.pretty_inspect
298
+ }
299
+ assert_operator $LOAD_PATH.index(b2.load_paths[0]), :<, $LOAD_PATH.index(rubylibdir), message
272
300
 
273
301
  # We detected that we should activate b-2, so we did so, but
274
- # then original_require decided "I've already got benchmark.rb" loaded.
275
- # This case is fine because our lazy loading is provided exactly
302
+ # then #gem_original_require decided "I've already got some benchmark.rb" loaded.
303
+ # This case is fine because our lazy loading provided exactly
276
304
  # the same behavior as eager loading would have.
277
305
 
278
- assert_equal %w(a-1 b-2), loaded_spec_names
306
+ assert_equal %w[a-1 b-2], loaded_spec_names
279
307
  ensure
280
- $LOAD_PATH.replace lp unless java_platform?
308
+ $LOAD_PATH.replace lp if load_path_changed
309
+ end
310
+
311
+ def test_activate_via_require_respects_loaded_default_from_default_gems
312
+ a1 = new_default_spec "a", "1", nil, "a.rb"
313
+
314
+ # simulate requiring a default gem before rubygems is loaded
315
+ Kernel.send(:gem_original_require, "a")
316
+
317
+ # simulate registering default specs on loading rubygems
318
+ install_default_gems a1
319
+
320
+ a2 = util_spec "a", "2", nil, "lib/a.rb"
321
+
322
+ install_specs a2
323
+
324
+ refute_require 'a'
325
+
326
+ assert_equal %w[a-1], loaded_spec_names
281
327
  end
282
328
 
283
329
  def test_already_activated_direct_conflict
@@ -291,12 +337,12 @@ class TestGemRequire < Gem::TestCase
291
337
 
292
338
  a1.activate
293
339
  c1.activate
294
- assert_equal %w(a-1 c-1), loaded_spec_names
340
+ assert_equal %w[a-1 c-1], loaded_spec_names
295
341
  assert_equal ["b (> 0)"], unresolved_names
296
342
 
297
343
  assert require("ib")
298
344
 
299
- assert_equal %w(a-1 b-1 c-1), loaded_spec_names
345
+ assert_equal %w[a-1 b-1 c-1], loaded_spec_names
300
346
  assert_equal [], unresolved_names
301
347
  end
302
348
 
@@ -313,7 +359,7 @@ class TestGemRequire < Gem::TestCase
313
359
 
314
360
  a1.activate
315
361
  c1.activate
316
- assert_equal %w(a-1 c-1), loaded_spec_names
362
+ assert_equal %w[a-1 c-1], loaded_spec_names
317
363
  assert_equal ["b (> 0)", "x (> 0)"], unresolved_names
318
364
 
319
365
  e = assert_raises(Gem::LoadError) do
@@ -336,7 +382,7 @@ class TestGemRequire < Gem::TestCase
336
382
 
337
383
  a1.activate
338
384
  c1.activate
339
- assert_equal %w(a-1 c-1), loaded_spec_names
385
+ assert_equal %w[a-1 c-1], loaded_spec_names
340
386
  assert_equal ["b (> 0)"], unresolved_names
341
387
 
342
388
  e = assert_raises(Gem::LoadError) do
@@ -367,21 +413,21 @@ class TestGemRequire < Gem::TestCase
367
413
 
368
414
  # Require gems that have not been removed.
369
415
  assert_require 'a/b'
370
- assert_equal %w(a-1.0), loaded_spec_names
416
+ assert_equal %w[a-1.0], loaded_spec_names
371
417
  assert_require 'b/d'
372
- assert_equal %w(a-1.0 b-2.0), loaded_spec_names
418
+ assert_equal %w[a-1.0 b-2.0], loaded_spec_names
373
419
  end
374
420
 
375
421
  def test_require_doesnt_traverse_development_dependencies
376
422
  a = util_spec("a#{$$}", "1", nil, "lib/a#{$$}.rb")
377
423
  z = util_spec("z", "1", "w" => "> 0")
378
- w1 = util_spec("w", "1") { |s| s.add_development_dependency "non-existent" }
379
- w2 = util_spec("w", "2") { |s| s.add_development_dependency "non-existent" }
424
+ w1 = util_spec("w", "1") {|s| s.add_development_dependency "non-existent" }
425
+ w2 = util_spec("w", "2") {|s| s.add_development_dependency "non-existent" }
380
426
 
381
427
  install_specs a, w1, w2, z
382
428
 
383
429
  assert gem("z")
384
- assert_equal %w(z-1), loaded_spec_names
430
+ assert_equal %w[z-1], loaded_spec_names
385
431
  assert_equal ["w (> 0)"], unresolved_names
386
432
 
387
433
  assert require("a#{$$}")
@@ -392,7 +438,7 @@ class TestGemRequire < Gem::TestCase
392
438
  nil, "default/gem.rb")
393
439
  install_default_specs(default_gem_spec)
394
440
  assert_require "default/gem"
395
- assert_equal %w(default-2.0.0.0), loaded_spec_names
441
+ assert_equal %w[default-2.0.0.0], loaded_spec_names
396
442
  end
397
443
 
398
444
  def test_default_gem_require_activates_just_once
@@ -431,8 +477,33 @@ class TestGemRequire < Gem::TestCase
431
477
  require "json"
432
478
  puts Gem.loaded_specs["json"]
433
479
  RUBY
434
- output = Gem::Util.popen(Gem.ruby, "-e", cmd).strip
480
+ output = Gem::Util.popen(*ruby_with_rubygems_in_load_path, "-e", cmd).strip
481
+ assert $?.success?
482
+ refute_empty output
483
+ end
484
+
485
+ def test_realworld_upgraded_default_gem
486
+ testing_ruby_repo = !ENV["GEM_COMMAND"].nil?
487
+ skip "this test can't work under ruby-core setup" if testing_ruby_repo
488
+
489
+ newer_json = util_spec("json", "999.99.9", nil, ["lib/json.rb"])
490
+ install_gem newer_json
491
+
492
+ path = "#{@tempdir}/test_realworld_upgraded_default_gem.rb"
493
+ code = <<-RUBY
494
+ $stderr = $stdout
495
+ require "json"
496
+ puts Gem.loaded_specs["json"].version
497
+ puts $LOADED_FEATURES
498
+ RUBY
499
+ File.write(path, code)
500
+
501
+ output = Gem::Util.popen({ 'GEM_HOME' => @gemhome }, *ruby_with_rubygems_in_load_path, path).strip
502
+ assert $?.success?
435
503
  refute_empty output
504
+ assert_equal "999.99.9", output.lines[0].chomp
505
+ # Make sure only files from the newer json gem are loaded, and no files from the default json gem
506
+ assert_equal ["#{@gemhome}/gems/json-999.99.9/lib/json.rb"], output.lines.grep(%r{/gems/json-}).map(&:chomp)
436
507
  end
437
508
 
438
509
  def test_default_gem_and_normal_gem
@@ -443,7 +514,34 @@ class TestGemRequire < Gem::TestCase
443
514
  "lib/default/gem.rb")
444
515
  install_specs(normal_gem_spec)
445
516
  assert_require "default/gem"
446
- assert_equal %w(default-3.0), loaded_spec_names
517
+ assert_equal %w[default-3.0], loaded_spec_names
518
+ end
519
+
520
+ def test_normal_gems_with_overridden_load_error_message
521
+ normal_gem_spec = util_spec("normal", "3.0", nil, "lib/normal/gem.rb")
522
+
523
+ install_specs(normal_gem_spec)
524
+
525
+ File.write("require_with_overridden_load_error_message.rb", <<-RUBY)
526
+ LoadError.class_eval do
527
+ def message
528
+ "Overridden message"
529
+ end
530
+ end
531
+
532
+ require 'normal/gem'
533
+ RUBY
534
+
535
+ require "open3"
536
+
537
+ output, exit_status = Open3.capture2e(
538
+ { "GEM_HOME" => Gem.paths.home },
539
+ *ruby_with_rubygems_in_load_path,
540
+ "-r",
541
+ "./require_with_overridden_load_error_message.rb"
542
+ )
543
+
544
+ assert exit_status.success?, "Require failed due to #{output}"
447
545
  end
448
546
 
449
547
  def test_default_gem_prerelease
@@ -456,7 +554,7 @@ class TestGemRequire < Gem::TestCase
456
554
  install_default_specs(normal_gem_higher_prerelease_spec)
457
555
 
458
556
  assert_require "default/gem"
459
- assert_equal %w(default-3.0.0.rc2), loaded_spec_names
557
+ assert_equal %w[default-3.0.0.rc2], loaded_spec_names
460
558
  end
461
559
 
462
560
  def loaded_spec_names
@@ -502,7 +600,7 @@ class TestGemRequire < Gem::TestCase
502
600
  end
503
601
  end
504
602
  assert c.send(:require, "default/gem")
505
- assert_equal %w(default-2.0.0.0), loaded_spec_names
603
+ assert_equal %w[default-2.0.0.0], loaded_spec_names
506
604
  end
507
605
 
508
606
  def test_require_default_when_gem_defined
@@ -514,7 +612,7 @@ class TestGemRequire < Gem::TestCase
514
612
  end
515
613
  end
516
614
  assert c.send(:require, "a#{$$}")
517
- assert_equal %W(a#{$$}-1), loaded_spec_names
615
+ assert_equal %W[a#{$$}-1], loaded_spec_names
518
616
  end
519
617
 
520
618
  def test_require_bundler
@@ -558,31 +656,29 @@ class TestGemRequire < Gem::TestCase
558
656
  if RUBY_VERSION >= "2.5"
559
657
  ["", "Kernel."].each do |prefix|
560
658
  define_method "test_no_kernel_require_in_#{prefix.tr(".", "_")}warn_with_uplevel" do
561
- lib = File.realpath("../../../lib", __FILE__)
562
659
  Dir.mktmpdir("warn_test") do |dir|
563
660
  File.write(dir + "/sub.rb", "#{prefix}warn 'uplevel', 'test', uplevel: 1\n")
564
661
  File.write(dir + "/main.rb", "require 'sub'\n")
565
662
  _, err = capture_subprocess_io do
566
- system(@@ruby, "-w", "--disable=gems", "-I", lib, "-C", dir, "-I.", "main.rb")
663
+ system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
567
664
  end
568
665
  assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
569
666
  _, err = capture_subprocess_io do
570
- system(@@ruby, "-w", "--enable=gems", "-I", lib, "-C", dir, "-I.", "main.rb")
667
+ system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
571
668
  end
572
669
  assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
573
670
  end
574
671
  end
575
672
 
576
673
  define_method "test_no_other_behavioral_changes_with_#{prefix.tr(".", "_")}warn" do
577
- lib = File.realpath("../../../lib", __FILE__)
578
674
  Dir.mktmpdir("warn_test") do |dir|
579
675
  File.write(dir + "/main.rb", "#{prefix}warn({x:1}, {y:2}, [])\n")
580
676
  _, err = capture_subprocess_io do
581
- system(@@ruby, "-w", "--disable=gems", "-I", lib, "-C", dir, "main.rb")
677
+ system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
582
678
  end
583
679
  assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
584
680
  _, err = capture_subprocess_io do
585
- system(@@ruby, "-w", "--enable=gems", "-I", lib, "-C", dir, "main.rb")
681
+ system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
586
682
  end
587
683
  assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
588
684
  end
@@ -590,6 +686,8 @@ class TestGemRequire < Gem::TestCase
590
686
  end
591
687
  end
592
688
 
689
+ private
690
+
593
691
  def silence_warnings
594
692
  old_verbose, $VERBOSE = $VERBOSE, false
595
693
  yield
@@ -638,7 +736,7 @@ class TestGemRequire < Gem::TestCase
638
736
  a_rb = File.join dash_i_lib_arg, "#{name}.rb"
639
737
 
640
738
  FileUtils.mkdir_p File.dirname a_rb
641
- File.open(a_rb, 'w') { |f| f.write "# #{name}.rb" }
739
+ File.open(a_rb, 'w') {|f| f.write "# #{name}.rb" }
642
740
 
643
741
  dash_i_lib_arg
644
742
  end