rubygems-update 3.4.21 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +132 -2
  3. data/Manifest.txt +39 -221
  4. data/README.md +1 -3
  5. data/bundler/CHANGELOG.md +74 -0
  6. data/bundler/README.md +1 -2
  7. data/bundler/bundler.gemspec +4 -2
  8. data/bundler/exe/bundle +1 -10
  9. data/bundler/lib/bundler/build_metadata.rb +3 -3
  10. data/bundler/lib/bundler/capistrano.rb +1 -1
  11. data/bundler/lib/bundler/checksum.rb +245 -0
  12. data/bundler/lib/bundler/ci_detector.rb +75 -0
  13. data/bundler/lib/bundler/cli/add.rb +3 -3
  14. data/bundler/lib/bundler/cli/binstubs.rb +4 -4
  15. data/bundler/lib/bundler/cli/cache.rb +1 -1
  16. data/bundler/lib/bundler/cli/check.rb +1 -1
  17. data/bundler/lib/bundler/cli/common.rb +9 -1
  18. data/bundler/lib/bundler/cli/config.rb +8 -7
  19. data/bundler/lib/bundler/cli/console.rb +3 -2
  20. data/bundler/lib/bundler/cli/doctor.rb +2 -2
  21. data/bundler/lib/bundler/cli/exec.rb +1 -1
  22. data/bundler/lib/bundler/cli/gem.rb +31 -23
  23. data/bundler/lib/bundler/cli/info.rb +2 -13
  24. data/bundler/lib/bundler/cli/install.rb +5 -4
  25. data/bundler/lib/bundler/cli/issue.rb +1 -1
  26. data/bundler/lib/bundler/cli/lock.rb +4 -4
  27. data/bundler/lib/bundler/cli/open.rb +1 -1
  28. data/bundler/lib/bundler/cli/outdated.rb +6 -6
  29. data/bundler/lib/bundler/cli/plugin.rb +7 -14
  30. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  31. data/bundler/lib/bundler/cli/show.rb +2 -2
  32. data/bundler/lib/bundler/cli/update.rb +5 -5
  33. data/bundler/lib/bundler/cli.rb +215 -263
  34. data/bundler/lib/bundler/compact_index_client/cache.rb +29 -9
  35. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  36. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  37. data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
  38. data/bundler/lib/bundler/compact_index_client.rb +14 -7
  39. data/bundler/lib/bundler/constants.rb +1 -1
  40. data/bundler/lib/bundler/current_ruby.rb +5 -21
  41. data/bundler/lib/bundler/definition.rb +43 -16
  42. data/bundler/lib/bundler/dependency.rb +16 -12
  43. data/bundler/lib/bundler/digest.rb +2 -2
  44. data/bundler/lib/bundler/dsl.rb +43 -25
  45. data/bundler/lib/bundler/endpoint_specification.rb +6 -2
  46. data/bundler/lib/bundler/env.rb +1 -3
  47. data/bundler/lib/bundler/errors.rb +58 -0
  48. data/bundler/lib/bundler/fetcher/base.rb +3 -1
  49. data/bundler/lib/bundler/fetcher/compact_index.rb +4 -4
  50. data/bundler/lib/bundler/fetcher/downloader.rb +13 -11
  51. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  52. data/bundler/lib/bundler/fetcher/index.rb +1 -1
  53. data/bundler/lib/bundler/fetcher.rb +28 -25
  54. data/bundler/lib/bundler/friendly_errors.rb +5 -5
  55. data/bundler/lib/bundler/gem_helper.rb +1 -1
  56. data/bundler/lib/bundler/gem_helpers.rb +12 -2
  57. data/bundler/lib/bundler/graph.rb +9 -9
  58. data/bundler/lib/bundler/index.rb +1 -2
  59. data/bundler/lib/bundler/injector.rb +1 -1
  60. data/bundler/lib/bundler/inline.rb +3 -3
  61. data/bundler/lib/bundler/installer/gem_installer.rb +10 -10
  62. data/bundler/lib/bundler/installer/parallel_installer.rb +16 -8
  63. data/bundler/lib/bundler/installer/standalone.rb +2 -3
  64. data/bundler/lib/bundler/installer.rb +9 -9
  65. data/bundler/lib/bundler/lazy_specification.rb +28 -17
  66. data/bundler/lib/bundler/lockfile_generator.rb +9 -0
  67. data/bundler/lib/bundler/lockfile_parser.rb +81 -10
  68. data/bundler/lib/bundler/man/bundle-add.1 +3 -26
  69. data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
  70. data/bundler/lib/bundler/man/bundle-cache.1 +3 -24
  71. data/bundler/lib/bundler/man/bundle-check.1 +3 -12
  72. data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
  73. data/bundler/lib/bundler/man/bundle-config.1 +20 -211
  74. data/bundler/lib/bundler/man/bundle-config.1.ronn +6 -0
  75. data/bundler/lib/bundler/man/bundle-console.1 +4 -22
  76. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
  77. data/bundler/lib/bundler/man/bundle-exec.1 +12 -73
  78. data/bundler/lib/bundler/man/bundle-gem.1 +13 -49
  79. data/bundler/lib/bundler/man/bundle-help.1 +3 -7
  80. data/bundler/lib/bundler/man/bundle-info.1 +3 -9
  81. data/bundler/lib/bundler/man/bundle-init.1 +3 -12
  82. data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
  83. data/bundler/lib/bundler/man/bundle-install.1 +27 -125
  84. data/bundler/lib/bundler/man/bundle-install.1.ronn +1 -0
  85. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  86. data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
  87. data/bundler/lib/bundler/man/bundle-open.1 +7 -27
  88. data/bundler/lib/bundler/man/bundle-outdated.1 +3 -55
  89. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +1 -0
  90. data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
  91. data/bundler/lib/bundler/man/bundle-plugin.1 +3 -29
  92. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  93. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  94. data/bundler/lib/bundler/man/bundle-show.1 +3 -10
  95. data/bundler/lib/bundler/man/bundle-update.1 +18 -137
  96. data/bundler/lib/bundler/man/bundle-version.1 +3 -16
  97. data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
  98. data/bundler/lib/bundler/man/bundle.1 +5 -44
  99. data/bundler/lib/bundler/man/gemfile.5 +24 -301
  100. data/bundler/lib/bundler/man/gemfile.5.ronn +4 -0
  101. data/bundler/lib/bundler/match_metadata.rb +4 -0
  102. data/bundler/lib/bundler/match_platform.rb +1 -1
  103. data/bundler/lib/bundler/plugin/api/source.rb +3 -2
  104. data/bundler/lib/bundler/plugin/index.rb +8 -0
  105. data/bundler/lib/bundler/plugin/installer.rb +1 -1
  106. data/bundler/lib/bundler/plugin.rb +12 -5
  107. data/bundler/lib/bundler/resolver/base.rb +1 -1
  108. data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
  109. data/bundler/lib/bundler/resolver/spec_group.rb +1 -4
  110. data/bundler/lib/bundler/resolver.rb +16 -16
  111. data/bundler/lib/bundler/ruby_dsl.rb +20 -12
  112. data/bundler/lib/bundler/ruby_version.rb +1 -1
  113. data/bundler/lib/bundler/rubygems_ext.rb +27 -54
  114. data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -58
  115. data/bundler/lib/bundler/rubygems_integration.rb +25 -94
  116. data/bundler/lib/bundler/runtime.rb +2 -2
  117. data/bundler/lib/bundler/self_manager.rb +23 -7
  118. data/bundler/lib/bundler/settings.rb +27 -7
  119. data/bundler/lib/bundler/setup.rb +4 -1
  120. data/bundler/lib/bundler/shared_helpers.rb +35 -13
  121. data/bundler/lib/bundler/source/git/git_proxy.rb +22 -14
  122. data/bundler/lib/bundler/source/git.rb +4 -3
  123. data/bundler/lib/bundler/source/metadata.rb +16 -16
  124. data/bundler/lib/bundler/source/path.rb +7 -6
  125. data/bundler/lib/bundler/source/rubygems.rb +21 -14
  126. data/bundler/lib/bundler/source.rb +2 -0
  127. data/bundler/lib/bundler/spec_set.rb +43 -12
  128. data/bundler/lib/bundler/stub_specification.rb +1 -0
  129. data/bundler/lib/bundler/templates/Executable.bundler +1 -1
  130. data/bundler/lib/bundler/templates/newgem/README.md.tt +3 -3
  131. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -6
  132. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  133. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  134. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  135. data/bundler/lib/bundler/ui/shell.rb +2 -2
  136. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  137. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  138. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  139. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  140. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  141. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  142. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +36 -36
  143. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  144. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  145. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  146. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +8 -10
  147. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  148. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  149. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  150. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  151. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  152. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  153. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  154. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  155. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  156. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
  157. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  158. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
  159. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +44 -6
  160. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  161. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  162. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +26 -150
  163. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +4 -46
  164. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  165. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -45
  166. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
  167. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  168. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  169. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  170. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  171. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  172. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  173. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +155 -8
  174. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  175. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  176. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  177. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  178. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  179. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  180. data/bundler/lib/bundler/vendored_persistent.rb +0 -4
  181. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  182. data/bundler/lib/bundler/version.rb +1 -1
  183. data/bundler/lib/bundler/vlad.rb +1 -1
  184. data/bundler/lib/bundler/yaml_serializer.rb +9 -4
  185. data/bundler/lib/bundler.rb +38 -35
  186. data/lib/rubygems/available_set.rb +4 -4
  187. data/lib/rubygems/basic_specification.rb +35 -37
  188. data/lib/rubygems/bundler_version_finder.rb +4 -4
  189. data/lib/rubygems/ci_detector.rb +75 -0
  190. data/lib/rubygems/command.rb +15 -17
  191. data/lib/rubygems/command_manager.rb +5 -4
  192. data/lib/rubygems/commands/build_command.rb +2 -2
  193. data/lib/rubygems/commands/cert_command.rb +2 -3
  194. data/lib/rubygems/commands/check_command.rb +4 -4
  195. data/lib/rubygems/commands/cleanup_command.rb +12 -14
  196. data/lib/rubygems/commands/contents_command.rb +5 -5
  197. data/lib/rubygems/commands/dependency_command.rb +4 -5
  198. data/lib/rubygems/commands/environment_command.rb +3 -5
  199. data/lib/rubygems/commands/exec_command.rb +1 -1
  200. data/lib/rubygems/commands/fetch_command.rb +2 -2
  201. data/lib/rubygems/commands/generate_index_command.rb +39 -74
  202. data/lib/rubygems/commands/help_command.rb +4 -4
  203. data/lib/rubygems/commands/info_command.rb +2 -2
  204. data/lib/rubygems/commands/install_command.rb +8 -16
  205. data/lib/rubygems/commands/list_command.rb +2 -2
  206. data/lib/rubygems/commands/lock_command.rb +1 -1
  207. data/lib/rubygems/commands/open_command.rb +1 -1
  208. data/lib/rubygems/commands/owner_command.rb +1 -1
  209. data/lib/rubygems/commands/pristine_command.rb +13 -15
  210. data/lib/rubygems/commands/push_command.rb +2 -2
  211. data/lib/rubygems/commands/query_command.rb +4 -5
  212. data/lib/rubygems/commands/rdoc_command.rb +2 -2
  213. data/lib/rubygems/commands/search_command.rb +2 -2
  214. data/lib/rubygems/commands/setup_command.rb +33 -36
  215. data/lib/rubygems/commands/sources_command.rb +12 -12
  216. data/lib/rubygems/commands/specification_command.rb +10 -10
  217. data/lib/rubygems/commands/stale_command.rb +1 -1
  218. data/lib/rubygems/commands/uninstall_command.rb +13 -14
  219. data/lib/rubygems/commands/unpack_command.rb +7 -7
  220. data/lib/rubygems/commands/update_command.rb +11 -13
  221. data/lib/rubygems/commands/which_command.rb +1 -1
  222. data/lib/rubygems/commands/yank_command.rb +1 -1
  223. data/lib/rubygems/compatibility.rb +5 -6
  224. data/lib/rubygems/config_file.rb +7 -7
  225. data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
  226. data/lib/rubygems/core_ext/kernel_require.rb +20 -49
  227. data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
  228. data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
  229. data/lib/rubygems/defaults.rb +15 -3
  230. data/lib/rubygems/dependency.rb +12 -14
  231. data/lib/rubygems/dependency_installer.rb +30 -31
  232. data/lib/rubygems/dependency_list.rb +1 -1
  233. data/lib/rubygems/deprecate.rb +16 -15
  234. data/lib/rubygems/doctor.rb +6 -6
  235. data/lib/rubygems/errors.rb +2 -6
  236. data/lib/rubygems/exceptions.rb +2 -1
  237. data/lib/rubygems/ext/builder.rb +15 -10
  238. data/lib/rubygems/ext/cargo_builder.rb +5 -5
  239. data/lib/rubygems/ext/ext_conf_builder.rb +2 -4
  240. data/lib/rubygems/ext/rake_builder.rb +1 -1
  241. data/lib/rubygems/gem_runner.rb +4 -4
  242. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
  243. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
  244. data/lib/rubygems/gemcutter_utilities.rb +18 -19
  245. data/lib/rubygems/install_update_options.rb +18 -19
  246. data/lib/rubygems/installer.rb +66 -45
  247. data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
  248. data/lib/rubygems/local_remote_options.rb +8 -11
  249. data/lib/rubygems/name_tuple.rb +7 -9
  250. data/lib/rubygems/net/http.rb +3 -0
  251. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  252. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  253. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  254. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  255. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  256. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  257. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  258. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  259. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  260. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  261. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  262. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  263. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  264. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  265. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  266. data/lib/rubygems/optparse/lib/optparse.rb +39 -17
  267. data/lib/rubygems/package/digest_io.rb +1 -1
  268. data/lib/rubygems/package/old.rb +2 -2
  269. data/lib/rubygems/package/tar_header.rb +45 -39
  270. data/lib/rubygems/package/tar_reader/entry.rb +5 -4
  271. data/lib/rubygems/package/tar_reader.rb +14 -5
  272. data/lib/rubygems/package/tar_writer.rb +20 -18
  273. data/lib/rubygems/package.rb +28 -27
  274. data/lib/rubygems/package_task.rb +2 -2
  275. data/lib/rubygems/path_support.rb +10 -11
  276. data/lib/rubygems/platform.rb +65 -48
  277. data/lib/rubygems/query_utils.rb +7 -9
  278. data/lib/rubygems/remote_fetcher.rb +17 -17
  279. data/lib/rubygems/request/connection_pools.rb +3 -3
  280. data/lib/rubygems/request.rb +20 -17
  281. data/lib/rubygems/request_set/gem_dependency_api.rb +120 -123
  282. data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
  283. data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
  284. data/lib/rubygems/request_set/lockfile.rb +6 -11
  285. data/lib/rubygems/request_set.rb +5 -5
  286. data/lib/rubygems/requirement.rb +7 -7
  287. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  288. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  289. data/lib/rubygems/resolver/activation_request.rb +1 -3
  290. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  291. data/lib/rubygems/resolver/best_set.rb +1 -1
  292. data/lib/rubygems/resolver/composed_set.rb +1 -1
  293. data/lib/rubygems/resolver/conflict.rb +4 -12
  294. data/lib/rubygems/resolver/index_set.rb +4 -4
  295. data/lib/rubygems/resolver/index_specification.rb +2 -2
  296. data/lib/rubygems/resolver/installer_set.rb +5 -6
  297. data/lib/rubygems/resolver/lock_set.rb +1 -1
  298. data/lib/rubygems/resolver.rb +6 -13
  299. data/lib/rubygems/s3_uri_signer.rb +6 -6
  300. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  301. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  302. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  303. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  304. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  305. data/lib/rubygems/safe_marshal.rb +74 -0
  306. data/lib/rubygems/safe_yaml.rb +5 -28
  307. data/lib/rubygems/security/policies.rb +36 -38
  308. data/lib/rubygems/security/policy.rb +7 -11
  309. data/lib/rubygems/security/signer.rb +1 -1
  310. data/lib/rubygems/security/trust_dir.rb +4 -4
  311. data/lib/rubygems/security.rb +8 -22
  312. data/lib/rubygems/source/git.rb +1 -3
  313. data/lib/rubygems/source/installed.rb +0 -2
  314. data/lib/rubygems/source/local.rb +7 -9
  315. data/lib/rubygems/source/lock.rb +1 -3
  316. data/lib/rubygems/source/specific_file.rb +0 -1
  317. data/lib/rubygems/source/vendor.rb +0 -2
  318. data/lib/rubygems/source.rb +12 -12
  319. data/lib/rubygems/source_list.rb +5 -5
  320. data/lib/rubygems/spec_fetcher.rb +31 -31
  321. data/lib/rubygems/specification.rb +145 -150
  322. data/lib/rubygems/specification_policy.rb +61 -31
  323. data/lib/rubygems/stub_specification.rb +4 -5
  324. data/lib/rubygems/text.rb +1 -2
  325. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  326. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  327. data/lib/rubygems/timeout.rb +3 -0
  328. data/lib/rubygems/tsort/lib/tsort.rb +3 -0
  329. data/lib/rubygems/uninstaller.rb +9 -11
  330. data/lib/rubygems/update_suggestion.rb +5 -18
  331. data/lib/rubygems/uri_formatter.rb +1 -1
  332. data/lib/rubygems/user_interaction.rb +17 -23
  333. data/lib/rubygems/util/licenses.rb +113 -35
  334. data/lib/rubygems/util/list.rb +3 -1
  335. data/lib/rubygems/util.rb +2 -4
  336. data/lib/rubygems/validator.rb +6 -4
  337. data/lib/rubygems/version.rb +35 -29
  338. data/lib/rubygems/version_option.rb +2 -5
  339. data/lib/rubygems/yaml_serializer.rb +9 -4
  340. data/lib/rubygems.rb +42 -42
  341. data/rubygems-update.gemspec +4 -4
  342. data/setup.rb +2 -2
  343. metadata +43 -225
  344. data/lib/rubygems/indexer.rb +0 -428
  345. data/lib/rubygems/mock_gem_ui.rb +0 -86
  346. data/test/rubygems/alternate_cert.pem +0 -19
  347. data/test/rubygems/alternate_cert_32.pem +0 -19
  348. data/test/rubygems/alternate_key.pem +0 -27
  349. data/test/rubygems/bad_rake.rb +0 -3
  350. data/test/rubygems/bundler_test_gem.rb +0 -424
  351. data/test/rubygems/ca_cert.pem +0 -77
  352. data/test/rubygems/child_cert.pem +0 -19
  353. data/test/rubygems/child_cert_32.pem +0 -19
  354. data/test/rubygems/child_key.pem +0 -27
  355. data/test/rubygems/client.pem +0 -107
  356. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  357. data/test/rubygems/data/gem-private_key.pem +0 -27
  358. data/test/rubygems/data/gem-public_cert.pem +0 -20
  359. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  360. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  361. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  362. data/test/rubygems/encrypted_private_key.pem +0 -30
  363. data/test/rubygems/expired_cert.pem +0 -19
  364. data/test/rubygems/fake_certlib/openssl.rb +0 -9
  365. data/test/rubygems/foo/discover.rb +0 -1
  366. data/test/rubygems/future_cert.pem +0 -19
  367. data/test/rubygems/future_cert_32.pem +0 -19
  368. data/test/rubygems/good_rake.rb +0 -3
  369. data/test/rubygems/grandchild_cert.pem +0 -19
  370. data/test/rubygems/grandchild_cert_32.pem +0 -19
  371. data/test/rubygems/grandchild_key.pem +0 -27
  372. data/test/rubygems/helper.rb +0 -1649
  373. data/test/rubygems/installer_test_case.rb +0 -248
  374. data/test/rubygems/invalid_client.pem +0 -49
  375. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  376. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  377. data/test/rubygems/invalid_key.pem +0 -27
  378. data/test/rubygems/invalid_signer_cert.pem +0 -19
  379. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  380. data/test/rubygems/invalidchild_cert.pem +0 -19
  381. data/test/rubygems/invalidchild_cert_32.pem +0 -19
  382. data/test/rubygems/invalidchild_key.pem +0 -27
  383. data/test/rubygems/multifactor_auth_utilities.rb +0 -111
  384. data/test/rubygems/package/tar_test_case.rb +0 -175
  385. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  386. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  387. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  388. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
  389. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
  390. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
  391. data/test/rubygems/private3072_key.pem +0 -40
  392. data/test/rubygems/private_ec_key.pem +0 -9
  393. data/test/rubygems/private_key.pem +0 -27
  394. data/test/rubygems/public3072_cert.pem +0 -25
  395. data/test/rubygems/public_cert.pem +0 -20
  396. data/test/rubygems/public_cert_32.pem +0 -19
  397. data/test/rubygems/public_key.pem +0 -9
  398. data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
  399. data/test/rubygems/rubygems_plugin.rb +0 -24
  400. data/test/rubygems/sff/discover.rb +0 -1
  401. data/test/rubygems/simple_gem.rb +0 -68
  402. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  403. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  404. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
  405. data/test/rubygems/ssl_cert.pem +0 -80
  406. data/test/rubygems/ssl_key.pem +0 -27
  407. data/test/rubygems/test_bundled_ca.rb +0 -61
  408. data/test/rubygems/test_config.rb +0 -28
  409. data/test/rubygems/test_deprecate.rb +0 -158
  410. data/test/rubygems/test_exit.rb +0 -17
  411. data/test/rubygems/test_gem.rb +0 -1799
  412. data/test/rubygems/test_gem_available_set.rb +0 -130
  413. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
  414. data/test/rubygems/test_gem_command.rb +0 -403
  415. data/test/rubygems/test_gem_command_manager.rb +0 -400
  416. data/test/rubygems/test_gem_commands_build_command.rb +0 -739
  417. data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
  418. data/test/rubygems/test_gem_commands_check_command.rb +0 -68
  419. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
  420. data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
  421. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
  422. data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
  423. data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
  424. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
  425. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
  426. data/test/rubygems/test_gem_commands_help_command.rb +0 -94
  427. data/test/rubygems/test_gem_commands_info_command.rb +0 -70
  428. data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
  429. data/test/rubygems/test_gem_commands_list_command.rb +0 -33
  430. data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
  431. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  432. data/test/rubygems/test_gem_commands_open_command.rb +0 -101
  433. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
  434. data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
  435. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
  436. data/test/rubygems/test_gem_commands_push_command.rb +0 -603
  437. data/test/rubygems/test_gem_commands_query_command.rb +0 -858
  438. data/test/rubygems/test_gem_commands_search_command.rb +0 -16
  439. data/test/rubygems/test_gem_commands_server_command.rb +0 -20
  440. data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
  441. data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
  442. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  443. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  444. data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
  445. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  446. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -522
  447. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
  448. data/test/rubygems/test_gem_commands_update_command.rb +0 -836
  449. data/test/rubygems/test_gem_commands_which_command.rb +0 -85
  450. data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
  451. data/test/rubygems/test_gem_config_file.rb +0 -551
  452. data/test/rubygems/test_gem_dependency.rb +0 -398
  453. data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
  454. data/test/rubygems/test_gem_dependency_list.rb +0 -265
  455. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
  456. data/test/rubygems/test_gem_doctor.rb +0 -195
  457. data/test/rubygems/test_gem_ext_builder.rb +0 -337
  458. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  459. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  460. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
  461. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
  462. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
  463. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
  464. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  465. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
  466. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  467. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
  468. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
  469. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
  470. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
  471. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
  472. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
  473. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
  474. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
  475. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
  476. data/test/rubygems/test_gem_gem_runner.rb +0 -119
  477. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
  478. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
  479. data/test/rubygems/test_gem_indexer.rb +0 -381
  480. data/test/rubygems/test_gem_install_update_options.rb +0 -208
  481. data/test/rubygems/test_gem_installer.rb +0 -2512
  482. data/test/rubygems/test_gem_local_remote_options.rb +0 -133
  483. data/test/rubygems/test_gem_name_tuple.rb +0 -43
  484. data/test/rubygems/test_gem_package.rb +0 -1306
  485. data/test/rubygems/test_gem_package_old.rb +0 -91
  486. data/test/rubygems/test_gem_package_tar_header.rb +0 -226
  487. data/test/rubygems/test_gem_package_tar_reader.rb +0 -135
  488. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
  489. data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
  490. data/test/rubygems/test_gem_package_task.rb +0 -118
  491. data/test/rubygems/test_gem_path_support.rb +0 -139
  492. data/test/rubygems/test_gem_platform.rb +0 -497
  493. data/test/rubygems/test_gem_rdoc.rb +0 -137
  494. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
  495. data/test/rubygems/test_gem_request.rb +0 -547
  496. data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
  497. data/test/rubygems/test_gem_request_set.rb +0 -672
  498. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
  499. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
  500. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
  501. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
  502. data/test/rubygems/test_gem_requirement.rb +0 -505
  503. data/test/rubygems/test_gem_resolver.rb +0 -859
  504. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
  505. data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
  506. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
  507. data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
  508. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
  509. data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
  510. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
  511. data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
  512. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  513. data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
  514. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
  515. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
  516. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
  517. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
  518. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
  519. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
  520. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
  521. data/test/rubygems/test_gem_resolver_specification.rb +0 -63
  522. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
  523. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
  524. data/test/rubygems/test_gem_security.rb +0 -341
  525. data/test/rubygems/test_gem_security_policy.rb +0 -535
  526. data/test/rubygems/test_gem_security_signer.rb +0 -218
  527. data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
  528. data/test/rubygems/test_gem_silent_ui.rb +0 -123
  529. data/test/rubygems/test_gem_source.rb +0 -254
  530. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
  531. data/test/rubygems/test_gem_source_git.rb +0 -310
  532. data/test/rubygems/test_gem_source_installed.rb +0 -35
  533. data/test/rubygems/test_gem_source_list.rb +0 -119
  534. data/test/rubygems/test_gem_source_local.rb +0 -107
  535. data/test/rubygems/test_gem_source_lock.rb +0 -113
  536. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  537. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
  538. data/test/rubygems/test_gem_source_vendor.rb +0 -30
  539. data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
  540. data/test/rubygems/test_gem_specification.rb +0 -3856
  541. data/test/rubygems/test_gem_stream_ui.rb +0 -255
  542. data/test/rubygems/test_gem_stub_specification.rb +0 -278
  543. data/test/rubygems/test_gem_text.rb +0 -103
  544. data/test/rubygems/test_gem_uninstaller.rb +0 -675
  545. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
  546. data/test/rubygems/test_gem_update_suggestion.rb +0 -209
  547. data/test/rubygems/test_gem_uri.rb +0 -41
  548. data/test/rubygems/test_gem_uri_formatter.rb +0 -27
  549. data/test/rubygems/test_gem_util.rb +0 -91
  550. data/test/rubygems/test_gem_validator.rb +0 -42
  551. data/test/rubygems/test_gem_version.rb +0 -305
  552. data/test/rubygems/test_gem_version_option.rb +0 -165
  553. data/test/rubygems/test_kernel.rb +0 -124
  554. data/test/rubygems/test_project_sanity.rb +0 -49
  555. data/test/rubygems/test_remote_fetch_error.rb +0 -20
  556. data/test/rubygems/test_require.rb +0 -732
  557. data/test/rubygems/test_rubygems.rb +0 -76
  558. data/test/rubygems/test_webauthn_listener.rb +0 -143
  559. data/test/rubygems/test_webauthn_listener_response.rb +0 -93
  560. data/test/rubygems/test_webauthn_poller.rb +0 -124
  561. data/test/rubygems/utilities.rb +0 -436
  562. data/test/rubygems/wrong_key_cert.pem +0 -19
  563. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  564. data/test/test_changelog_generator.rb +0 -17
@@ -1,732 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require "rubygems"
5
-
6
- class TestGemRequire < Gem::TestCase
7
- class Latch
8
- def initialize(count = 1)
9
- @count = count
10
- @lock = Monitor.new
11
- @cv = @lock.new_cond
12
- end
13
-
14
- def release
15
- @lock.synchronize do
16
- @count -= 1 if @count > 0
17
- @cv.broadcast if @count.zero?
18
- end
19
- end
20
-
21
- def await
22
- @lock.synchronize do
23
- @cv.wait_while { @count > 0 }
24
- end
25
- end
26
- end
27
-
28
- def assert_require(path)
29
- assert require(path), "'#{path}' was already required"
30
- end
31
-
32
- def refute_require(path)
33
- refute require(path), "'#{path}' was not yet required"
34
- end
35
-
36
- def test_respect_loaded_features_caching_like_standard_require
37
- dir = Dir.mktmpdir("test_require", @tempdir)
38
-
39
- lp1 = File.join dir, "foo1"
40
- foo1 = File.join lp1, "foo.rb"
41
-
42
- FileUtils.mkdir_p lp1
43
- File.open(foo1, "w") {|f| f.write "class Object; HELLO = 'foo1' end" }
44
-
45
- lp = $LOAD_PATH.dup
46
-
47
- $LOAD_PATH.unshift lp1
48
- assert_require "foo"
49
- assert_equal "foo1", ::Object::HELLO
50
-
51
- lp2 = File.join dir, "foo2"
52
- foo2 = File.join lp2, "foo.rb"
53
-
54
- FileUtils.mkdir_p lp2
55
- File.open(foo2, "w") {|f| f.write "class Object; HELLO = 'foo2' end" }
56
-
57
- $LOAD_PATH.unshift lp2
58
- refute_require "foo"
59
- assert_equal "foo1", ::Object::HELLO
60
- ensure
61
- $LOAD_PATH.replace lp
62
- Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
63
- end
64
-
65
- # Providing -I on the commandline should always beat gems
66
- def test_dash_i_beats_gems
67
- a1 = util_spec "a", "1", { "b" => "= 1" }, "lib/test_gem_require_a.rb"
68
- b1 = util_spec "b", "1", { "c" => "> 0" }, "lib/b/c.rb"
69
- c1 = util_spec "c", "1", nil, "lib/c/c.rb"
70
- c2 = util_spec "c", "2", nil, "lib/c/c.rb"
71
-
72
- install_specs c1, c2, b1, a1
73
-
74
- dir = Dir.mktmpdir("test_require", @tempdir)
75
- dash_i_arg = File.join dir, "lib"
76
-
77
- c_rb = File.join dash_i_arg, "b", "c.rb"
78
-
79
- FileUtils.mkdir_p File.dirname c_rb
80
- File.open(c_rb, "w") {|f| f.write "class Object; HELLO = 'world' end" }
81
-
82
- # Pretend to provide a commandline argument that overrides a file in gem b
83
- $LOAD_PATH.unshift dash_i_arg
84
-
85
- assert_require "test_gem_require_a"
86
- assert_require "b/c" # this should be required from -I
87
- assert_equal "world", ::Object::HELLO
88
- assert_equal %w[a-1 b-1], loaded_spec_names
89
- ensure
90
- Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
91
- end
92
-
93
- def create_sync_thread
94
- Thread.new do
95
- yield
96
- ensure
97
- FILE_ENTERED_LATCH.release
98
- FILE_EXIT_LATCH.await
99
- end
100
- end
101
-
102
- # Providing -I on the commandline should always beat gems
103
- def test_dash_i_beats_default_gems
104
- a1 = new_default_spec "a", "1", { "b" => "= 1" }, "test_gem_require_a.rb"
105
- b1 = new_default_spec "b", "1", { "c" => "> 0" }, "b/c.rb"
106
- c1 = new_default_spec "c", "1", nil, "c/c.rb"
107
- c2 = new_default_spec "c", "2", nil, "c/c.rb"
108
-
109
- install_default_gems c1, c2, b1, a1
110
-
111
- dir = Dir.mktmpdir("test_require", @tempdir)
112
- dash_i_arg = File.join dir, "lib"
113
-
114
- c_rb = File.join dash_i_arg, "c", "c.rb"
115
-
116
- FileUtils.mkdir_p File.dirname c_rb
117
- File.open(c_rb, "w") {|f| f.write "class Object; HELLO = 'world' end" }
118
-
119
- assert_require "test_gem_require_a"
120
-
121
- # Pretend to provide a commandline argument that overrides a file in gem b
122
- $LOAD_PATH.unshift dash_i_arg
123
-
124
- assert_require "b/c"
125
- assert_require "c/c" # this should be required from -I
126
- assert_equal "world", ::Object::HELLO
127
- assert_equal %w[a-1 b-1], loaded_spec_names
128
- ensure
129
- Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
130
- end
131
-
132
- def test_dash_i_respects_default_library_extension_priority
133
- pend "extensions don't quite work on jruby" if Gem.java_platform?
134
- pend "not installed yet" unless RbConfig::TOPDIR
135
-
136
- dash_i_ext_arg = util_install_extension_file("a")
137
- dash_i_lib_arg = util_install_ruby_file("a")
138
-
139
- $LOAD_PATH.unshift dash_i_lib_arg
140
- $LOAD_PATH.unshift dash_i_ext_arg
141
- assert_require "a"
142
- assert_match(/a\.rb$/, $LOADED_FEATURES.last)
143
- end
144
-
145
- def test_concurrent_require
146
- Object.const_set :FILE_ENTERED_LATCH, Latch.new(2)
147
- Object.const_set :FILE_EXIT_LATCH, Latch.new(1)
148
-
149
- a1 = util_spec "a#{$$}", "1", nil, "lib/a#{$$}.rb"
150
- b1 = util_spec "b#{$$}", "1", nil, "lib/b#{$$}.rb"
151
-
152
- install_specs a1, b1
153
-
154
- t1 = create_sync_thread { assert_require "a#{$$}" }
155
- t2 = create_sync_thread { assert_require "b#{$$}" }
156
-
157
- # wait until both files are waiting on the exit latch
158
- FILE_ENTERED_LATCH.await
159
-
160
- # now let them finish
161
- FILE_EXIT_LATCH.release
162
-
163
- assert t1.join, "thread 1 should exit"
164
- assert t2.join, "thread 2 should exit"
165
- ensure
166
- Object.send :remove_const, :FILE_ENTERED_LATCH if Object.const_defined? :FILE_ENTERED_LATCH
167
- Object.send :remove_const, :FILE_EXIT_LATCH if Object.const_defined? :FILE_EXIT_LATCH
168
- end
169
-
170
- def test_require_is_not_lazy_with_exact_req
171
- a1 = util_spec "a", "1", { "b" => "= 1" }, "lib/test_gem_require_a.rb"
172
- b1 = util_spec "b", "1", nil, "lib/b/c.rb"
173
- b2 = util_spec "b", "2", nil, "lib/b/c.rb"
174
-
175
- install_specs b1, b2, a1
176
-
177
- assert_require "test_gem_require_a"
178
- assert_equal %w[a-1 b-1], loaded_spec_names
179
- assert_equal unresolved_names, []
180
-
181
- assert_require "b/c"
182
- assert_equal %w[a-1 b-1], loaded_spec_names
183
- end
184
-
185
- def test_require_is_lazy_with_inexact_req
186
- a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb"
187
- b1 = util_spec "b", "1", nil, "lib/b/c.rb"
188
- b2 = util_spec "b", "2", nil, "lib/b/c.rb"
189
-
190
- install_specs b1, b2, a1
191
-
192
- assert_require "test_gem_require_a"
193
- assert_equal %w[a-1], loaded_spec_names
194
- assert_equal unresolved_names, ["b (>= 1)"]
195
-
196
- assert_require "b/c"
197
- assert_equal %w[a-1 b-2], loaded_spec_names
198
- end
199
-
200
- def test_require_is_not_lazy_with_one_possible
201
- a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb"
202
- b1 = util_spec "b", "1", nil, "lib/b/c.rb"
203
-
204
- install_specs b1, a1
205
-
206
- assert_require "test_gem_require_a"
207
- assert_equal %w[a-1 b-1], loaded_spec_names
208
- assert_equal unresolved_names, []
209
-
210
- assert_require "b/c"
211
- assert_equal %w[a-1 b-1], loaded_spec_names
212
- end
213
-
214
- def test_require_can_use_a_pathname_object
215
- a1 = util_spec "a", "1", nil, "lib/test_gem_require_a.rb"
216
-
217
- install_specs a1
218
-
219
- assert_require Pathname.new "test_gem_require_a"
220
- assert_equal %w[a-1], loaded_spec_names
221
- assert_equal unresolved_names, []
222
- end
223
-
224
- def test_activate_via_require_respects_loaded_files
225
- pend "Not sure what's going on. If another spec creates a 'a' gem before
226
- this test, somehow require will load the benchmark in b, and ignore that the
227
- stdlib one is already in $LOADED_FEATURES?. Reproducible by running the
228
- spaceship_specific_file test before this one" if java_platform?
229
-
230
- pend "not installed yet" unless RbConfig::TOPDIR
231
-
232
- lib_dir = File.expand_path("../lib", __dir__)
233
- rubylibdir = File.realdirpath(RbConfig::CONFIG["rubylibdir"])
234
- if rubylibdir == lib_dir
235
- # testing in the ruby repository where RubyGems' lib/ == stdlib lib/
236
- # In that case we want to move the stdlib lib/ to still be after b-2 in $LOAD_PATH
237
- lp = $LOAD_PATH.dup
238
- $LOAD_PATH.delete lib_dir
239
- $LOAD_PATH.push lib_dir
240
- load_path_changed = true
241
- end
242
-
243
- require "benchmark" # the stdlib
244
-
245
- a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb"
246
- b1 = util_spec "b", "1", nil, "lib/benchmark.rb"
247
- b2 = util_spec "b", "2", nil, "lib/benchmark.rb"
248
-
249
- install_specs b1, b2, a1
250
-
251
- # Activates a-1, but not b-1 and b-2
252
- assert_require "test_gem_require_a"
253
- assert_equal %w[a-1], loaded_spec_names
254
- assert $LOAD_PATH.include? a1.full_require_paths[0]
255
- refute $LOAD_PATH.include? b1.full_require_paths[0]
256
- refute $LOAD_PATH.include? b2.full_require_paths[0]
257
-
258
- assert_equal unresolved_names, ["b (>= 1)"]
259
-
260
- # The require('benchmark') below will activate b-2. However, its
261
- # lib/benchmark.rb won't ever be loaded. The reason is MRI sees that even
262
- # though b-2 is earlier in $LOAD_PATH it already loaded a benchmark.rb file
263
- # and that still exists in $LOAD_PATH (further down),
264
- # and as a result #gem_original_require returns false.
265
- refute require("benchmark"), "the benchmark stdlib should be recognized as already loaded"
266
-
267
- assert_includes $LOAD_PATH, b2.full_require_paths[0]
268
- assert_includes $LOAD_PATH, rubylibdir
269
- message = proc {
270
- "this test relies on the b-2 gem lib/ to be before stdlib to make sense\n" +
271
- $LOAD_PATH.pretty_inspect
272
- }
273
- assert_operator $LOAD_PATH.index(b2.full_require_paths[0]), :<, $LOAD_PATH.index(rubylibdir), message
274
-
275
- # We detected that we should activate b-2, so we did so, but
276
- # then #gem_original_require decided "I've already got some benchmark.rb" loaded.
277
- # This case is fine because our lazy loading provided exactly
278
- # the same behavior as eager loading would have.
279
-
280
- assert_equal %w[a-1 b-2], loaded_spec_names
281
- ensure
282
- $LOAD_PATH.replace lp if load_path_changed
283
- end
284
-
285
- def test_activate_via_require_respects_loaded_default_from_default_gems
286
- a1 = new_default_spec "a", "1", nil, "a.rb"
287
-
288
- # simulate requiring a default gem before rubygems is loaded
289
- Kernel.send(:gem_original_require, "a")
290
-
291
- # simulate registering default specs on loading rubygems
292
- install_default_gems a1
293
-
294
- a2 = util_spec "a", "2", nil, "lib/a.rb"
295
-
296
- install_specs a2
297
-
298
- refute_require "a"
299
-
300
- assert_equal %w[a-1], loaded_spec_names
301
- end
302
-
303
- def test_already_activated_direct_conflict
304
- a1 = util_spec "a", "1", { "b" => "> 0" }
305
- b1 = util_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb"
306
- b2 = util_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb"
307
- c1 = util_spec "c", "1", nil, "lib/d.rb"
308
- c2 = util_spec("c", "2", nil, "lib/d.rb")
309
-
310
- install_specs c1, c2, b1, b2, a1
311
-
312
- a1.activate
313
- c1.activate
314
- assert_equal %w[a-1 c-1], loaded_spec_names
315
- assert_equal ["b (> 0)"], unresolved_names
316
-
317
- assert require("ib")
318
-
319
- assert_equal %w[a-1 b-1 c-1], loaded_spec_names
320
- assert_equal [], unresolved_names
321
- end
322
-
323
- def test_multiple_gems_with_the_same_path
324
- a1 = util_spec "a", "1", { "b" => "> 0", "x" => "> 0" }
325
- b1 = util_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb"
326
- b2 = util_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb"
327
- x1 = util_spec "x", "1", nil, "lib/ib.rb"
328
- x2 = util_spec "x", "2", nil, "lib/ib.rb"
329
- c1 = util_spec "c", "1", nil, "lib/d.rb"
330
- c2 = util_spec("c", "2", nil, "lib/d.rb")
331
-
332
- install_specs c1, c2, x1, x2, b1, b2, a1
333
-
334
- a1.activate
335
- c1.activate
336
- assert_equal %w[a-1 c-1], loaded_spec_names
337
- assert_equal ["b (> 0)", "x (> 0)"], unresolved_names
338
-
339
- e = assert_raise(Gem::LoadError) do
340
- require("ib")
341
- end
342
-
343
- assert_equal "ib found in multiple gems: b, x", e.message
344
- end
345
-
346
- def test_unable_to_find_good_unresolved_version
347
- a1 = util_spec "a", "1", { "b" => "> 0" }
348
- b1 = util_spec "b", "1", { "c" => ">= 2" }, "lib/ib.rb"
349
- b2 = util_spec "b", "2", { "c" => ">= 3" }, "lib/ib.rb"
350
-
351
- c1 = util_spec "c", "1", nil, "lib/d.rb"
352
- c2 = util_spec "c", "2", nil, "lib/d.rb"
353
- c3 = util_spec "c", "3", nil, "lib/d.rb"
354
-
355
- install_specs c1, c2, c3, b1, b2, a1
356
-
357
- a1.activate
358
- c1.activate
359
- assert_equal %w[a-1 c-1], loaded_spec_names
360
- assert_equal ["b (> 0)"], unresolved_names
361
-
362
- e = assert_raise(Gem::LoadError) do
363
- require("ib")
364
- end
365
-
366
- assert_equal "unable to find a version of 'b' to activate", e.message
367
- end
368
-
369
- def test_require_works_after_cleanup
370
- a1 = new_default_spec "a", "1.0", nil, "a/b.rb"
371
- b1 = new_default_spec "b", "1.0", nil, "b/c.rb"
372
- b2 = new_default_spec "b", "2.0", nil, "b/d.rb"
373
-
374
- install_default_gems a1
375
- install_default_gems b1
376
- install_default_gems b2
377
-
378
- # Load default ruby gems fresh as if we've just started a ruby script.
379
- Gem::Specification.reset
380
- require "rubygems"
381
- Gem::Specification.stubs
382
-
383
- # Remove an old default gem version directly from disk as if someone ran
384
- # gem cleanup.
385
- FileUtils.rm_rf(File.join @gemhome, "#{b1.full_name}")
386
- FileUtils.rm_rf(File.join @gemhome, "specifications", "default", "#{b1.full_name}.gemspec")
387
-
388
- # Require gems that have not been removed.
389
- assert_require "a/b"
390
- assert_equal %w[a-1.0], loaded_spec_names
391
- assert_require "b/d"
392
- assert_equal %w[a-1.0 b-2.0], loaded_spec_names
393
- end
394
-
395
- def test_require_doesnt_traverse_development_dependencies
396
- a = util_spec("a#{$$}", "1", nil, "lib/a#{$$}.rb")
397
- z = util_spec("z", "1", "w" => "> 0")
398
- w1 = util_spec("w", "1") {|s| s.add_development_dependency "non-existent" }
399
- w2 = util_spec("w", "2") {|s| s.add_development_dependency "non-existent" }
400
-
401
- install_specs a, w1, w2, z
402
-
403
- assert gem("z")
404
- assert_equal %w[z-1], loaded_spec_names
405
- assert_equal ["w (> 0)"], unresolved_names
406
-
407
- assert require("a#{$$}")
408
- end
409
-
410
- def test_default_gem_only
411
- default_gem_spec = new_default_spec("default", "2.0.0.0",
412
- nil, "default/gem.rb")
413
- install_default_gems(default_gem_spec)
414
- assert_require "default/gem"
415
- assert_equal %w[default-2.0.0.0], loaded_spec_names
416
- end
417
-
418
- def test_default_gem_require_activates_just_once
419
- default_gem_spec = new_default_spec("default", "2.0.0.0",
420
- nil, "default/gem.rb")
421
- install_default_gems(default_gem_spec)
422
-
423
- assert_require "default/gem"
424
-
425
- times_called = 0
426
-
427
- Kernel.stub(:gem, ->(name, requirement) { times_called += 1 }) do
428
- refute_require "default/gem"
429
- end
430
-
431
- assert_equal 0, times_called
432
- end
433
-
434
- def test_second_gem_require_does_not_resolve_path_manually_before_going_through_standard_require
435
- a1 = util_spec "a", "1", nil, "lib/test_gem_require_a.rb"
436
- install_gem a1
437
-
438
- assert_require "test_gem_require_a"
439
-
440
- stub(:gem_original_require, ->(path) { assert_equal "test_gem_require_a", path }) do
441
- require "test_gem_require_a"
442
- end
443
- end
444
-
445
- def test_realworld_default_gem
446
- omit "this test can't work under ruby-core setup" if ruby_repo?
447
-
448
- cmd = <<-RUBY
449
- $stderr = $stdout
450
- require "json"
451
- puts Gem.loaded_specs["json"]
452
- RUBY
453
- output = Gem::Util.popen(*ruby_with_rubygems_in_load_path, "-e", cmd).strip
454
- assert $?.success?
455
- refute_empty output
456
- end
457
-
458
- def test_realworld_upgraded_default_gem
459
- omit "this test can't work under ruby-core setup" if ruby_repo?
460
-
461
- newer_json = util_spec("json", "999.99.9", nil, ["lib/json.rb"])
462
- install_gem newer_json
463
-
464
- path = "#{@tempdir}/test_realworld_upgraded_default_gem.rb"
465
- code = <<-RUBY
466
- $stderr = $stdout
467
- require "json"
468
- puts Gem.loaded_specs["json"].version
469
- puts $LOADED_FEATURES
470
- RUBY
471
- File.write(path, code)
472
-
473
- output = Gem::Util.popen({ "GEM_HOME" => @gemhome }, *ruby_with_rubygems_in_load_path, path).strip
474
- assert $?.success?
475
- refute_empty output
476
- assert_equal "999.99.9", output.lines[0].chomp
477
- # Make sure only files from the newer json gem are loaded, and no files from the default json gem
478
- assert_equal ["#{@gemhome}/gems/json-999.99.9/lib/json.rb"], output.lines.grep(%r{/gems/json-}).map(&:chomp)
479
- end
480
-
481
- def test_default_gem_and_normal_gem
482
- default_gem_spec = new_default_spec("default", "2.0.0.0",
483
- nil, "default/gem.rb")
484
- install_default_gems(default_gem_spec)
485
- normal_gem_spec = util_spec("default", "3.0", nil,
486
- "lib/default/gem.rb")
487
- install_specs(normal_gem_spec)
488
- assert_require "default/gem"
489
- assert_equal %w[default-3.0], loaded_spec_names
490
- end
491
-
492
- def test_normal_gems_with_overridden_load_error_message
493
- normal_gem_spec = util_spec("normal", "3.0", nil, "lib/normal/gem.rb")
494
-
495
- install_specs(normal_gem_spec)
496
-
497
- File.write("require_with_overridden_load_error_message.rb", <<-RUBY)
498
- LoadError.class_eval do
499
- def message
500
- "Overridden message"
501
- end
502
- end
503
-
504
- require 'normal/gem'
505
- RUBY
506
-
507
- require "open3"
508
-
509
- output, exit_status = Open3.capture2e(
510
- { "GEM_HOME" => Gem.paths.home },
511
- *ruby_with_rubygems_in_load_path,
512
- "-r",
513
- "./require_with_overridden_load_error_message.rb"
514
- )
515
-
516
- assert exit_status.success?, "Require failed due to #{output}"
517
- end
518
-
519
- def test_default_gem_prerelease
520
- default_gem_spec = new_default_spec("default", "2.0.0",
521
- nil, "default/gem.rb")
522
- install_default_gems(default_gem_spec)
523
-
524
- normal_gem_higher_prerelease_spec = util_spec("default", "3.0.0.rc2", nil,
525
- "lib/default/gem.rb")
526
- install_default_gems(normal_gem_higher_prerelease_spec)
527
-
528
- assert_require "default/gem"
529
- assert_equal %w[default-3.0.0.rc2], loaded_spec_names
530
- end
531
-
532
- def loaded_spec_names
533
- Gem.loaded_specs.values.map(&:full_name).sort
534
- end
535
-
536
- def unresolved_names
537
- Gem::Specification.unresolved_deps.values.map(&:to_s).sort
538
- end
539
-
540
- def test_try_activate_error_unlocks_require_monitor
541
- silence_warnings do
542
- class << ::Gem
543
- alias old_try_activate try_activate
544
- def try_activate(*); raise "raised from try_activate"; end
545
- end
546
- end
547
-
548
- require "does_not_exist_for_try_activate_test"
549
- rescue RuntimeError => e
550
- assert_match(/raised from try_activate/, e.message)
551
- assert Kernel::RUBYGEMS_ACTIVATION_MONITOR.try_enter, "require monitor was not unlocked when try_activate raised"
552
- ensure
553
- silence_warnings do
554
- class << ::Gem
555
- alias try_activate old_try_activate
556
- end
557
- end
558
- Kernel::RUBYGEMS_ACTIVATION_MONITOR.exit
559
- end
560
-
561
- def test_require_when_gem_defined
562
- default_gem_spec = new_default_spec("default", "2.0.0.0",
563
- nil, "default/gem.rb")
564
- install_default_gems(default_gem_spec)
565
- c = Class.new do
566
- def self.gem(*args)
567
- raise "received #gem with #{args.inspect}"
568
- end
569
- end
570
- assert c.send(:require, "default/gem")
571
- assert_equal %w[default-2.0.0.0], loaded_spec_names
572
- end
573
-
574
- def test_require_default_when_gem_defined
575
- a = util_spec("a#{$$}", "1", nil, "lib/a#{$$}.rb")
576
- install_specs a
577
- c = Class.new do
578
- def self.gem(*args)
579
- raise "received #gem with #{args.inspect}"
580
- end
581
- end
582
- assert c.send(:require, "a#{$$}")
583
- assert_equal %W[a#{$$}-1], loaded_spec_names
584
- end
585
-
586
- def test_require_bundler
587
- b1 = util_spec("bundler", "1", nil, "lib/bundler/setup.rb")
588
- b2a = util_spec("bundler", "2.a", nil, "lib/bundler/setup.rb")
589
- install_specs b1, b2a
590
-
591
- require "rubygems/bundler_version_finder"
592
- $:.clear
593
- assert_require "bundler/setup"
594
- assert_equal %w[bundler-2.a], loaded_spec_names
595
- assert_empty unresolved_names
596
- end
597
-
598
- ["", "Kernel."].each do |prefix|
599
- define_method "test_no_kernel_require_in_#{prefix.tr(".", "_")}warn_with_uplevel" do
600
- Dir.mktmpdir("warn_test") do |dir|
601
- File.write(dir + "/sub.rb", "#{prefix}warn 'uplevel', 'test', uplevel: 1\n")
602
- File.write(dir + "/main.rb", "require 'sub'\n")
603
- _, err = capture_subprocess_io do
604
- system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
605
- end
606
- assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
607
- _, err = capture_subprocess_io do
608
- system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
609
- end
610
- assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
611
- end
612
- end
613
-
614
- define_method "test_no_other_behavioral_changes_with_#{prefix.tr(".", "_")}warn" do
615
- Dir.mktmpdir("warn_test") do |dir|
616
- File.write(dir + "/main.rb", "#{prefix}warn({x:1}, {y:2}, [])\n")
617
- _, err = capture_subprocess_io do
618
- system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
619
- end
620
- assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
621
- _, err = capture_subprocess_io do
622
- system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
623
- end
624
- assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
625
- end
626
- end
627
- end
628
-
629
- def test_no_crash_when_overriding_warn_with_warning_module
630
- Dir.mktmpdir("warn_test") do |dir|
631
- File.write(dir + "/main.rb", "module Warning; def warn(str); super; end; end; warn 'Foo Bar'")
632
- _, err = capture_subprocess_io do
633
- system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
634
- end
635
- assert_match(/Foo Bar\n$/, err)
636
- _, err = capture_subprocess_io do
637
- system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
638
- end
639
- assert_match(/Foo Bar\n$/, err)
640
- end
641
- end
642
-
643
- def test_expected_backtrace_location_when_inheriting_from_basic_object_and_including_kernel
644
- Dir.mktmpdir("warn_test") do |dir|
645
- File.write(dir + "/main.rb", "\nrequire 'sub'\n")
646
- File.write(dir + "/sub.rb", <<-'RUBY')
647
- require 'rubygems'
648
- class C < BasicObject
649
- include ::Kernel
650
- def deprecated
651
- warn "This is a deprecated method", uplevel: 2
652
- end
653
- end
654
- C.new.deprecated
655
- RUBY
656
-
657
- _, err = capture_subprocess_io do
658
- system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
659
- end
660
- assert_match(/main\.rb:2: warning: This is a deprecated method$/, err)
661
- _, err = capture_subprocess_io do
662
- system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
663
- end
664
- assert_match(/main\.rb:2: warning: This is a deprecated method$/, err)
665
- end
666
- end
667
-
668
- def test_require_does_not_crash_when_utilizing_bundler_version_finder
669
- a1 = util_spec "a", "1.1", { "bundler" => ">= 0" }
670
- a2 = util_spec "a", "1.2", { "bundler" => ">= 0" }
671
- b1 = util_spec "bundler", "2.3.7"
672
- b2 = util_spec "bundler", "2.3.24"
673
- c = util_spec "c", "1", { "a" => [">= 1.1", "< 99.0"] }, "lib/test_gem_require_c.rb"
674
-
675
- install_specs a1, a2, b1, b2, c
676
-
677
- cmd = <<-RUBY
678
- require "test_gem_require_c"
679
- require "json"
680
- RUBY
681
- out = Gem::Util.popen({ "GEM_HOME" => @gemhome }, *ruby_with_rubygems_in_load_path, "-e", cmd)
682
- assert_predicate $?, :success?, "Require failed due to #{out}"
683
- end
684
-
685
- private
686
-
687
- def util_install_extension_file(name)
688
- spec = quick_gem name
689
- util_build_gem spec
690
-
691
- spec.extensions << "extconf.rb"
692
- write_file File.join(@tempdir, "extconf.rb") do |io|
693
- io.write <<-RUBY
694
- require "mkmf"
695
- CONFIG['LDSHARED'] = '$(TOUCH) $@ ||'
696
- create_makefile("#{name}")
697
- RUBY
698
- end
699
-
700
- write_file File.join(@tempdir, "#{name}.c") do |io|
701
- io.write <<-C
702
- void Init_#{name}() { }
703
- C
704
- end
705
-
706
- write_file File.join(@tempdir, "depend")
707
-
708
- spec.files += ["extconf.rb", "depend", "#{name}.c"]
709
-
710
- extension_file = File.join(spec.extension_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
711
- assert_path_not_exist extension_file
712
-
713
- path = Gem::Package.build spec
714
- installer = Gem::Installer.at path
715
- installer.install
716
- assert_path_exist extension_file
717
-
718
- spec.gem_dir
719
- end
720
-
721
- def util_install_ruby_file(name)
722
- dir_lib = Dir.mktmpdir("test_require_lib", @tempdir)
723
- dash_i_lib_arg = File.join dir_lib
724
-
725
- a_rb = File.join dash_i_lib_arg, "#{name}.rb"
726
-
727
- FileUtils.mkdir_p File.dirname a_rb
728
- File.open(a_rb, "w") {|f| f.write "# #{name}.rb" }
729
-
730
- dash_i_lib_arg
731
- end
732
- end