rubygems-update 3.3.18 → 3.4.19

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 (615) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1429 -1064
  3. data/CONTRIBUTING.md +31 -8
  4. data/Manifest.txt +61 -36
  5. data/POLICIES.md +55 -20
  6. data/README.md +19 -6
  7. data/bundler/CHANGELOG.md +457 -1
  8. data/bundler/README.md +3 -6
  9. data/bundler/UPGRADING.md +11 -4
  10. data/bundler/bundler.gemspec +8 -10
  11. data/bundler/exe/bundle +5 -16
  12. data/bundler/lib/bundler/build_metadata.rb +2 -2
  13. data/bundler/lib/bundler/cli/add.rb +1 -1
  14. data/bundler/lib/bundler/cli/binstubs.rb +6 -2
  15. data/bundler/lib/bundler/cli/check.rb +1 -1
  16. data/bundler/lib/bundler/cli/common.rb +2 -0
  17. data/bundler/lib/bundler/cli/console.rb +2 -2
  18. data/bundler/lib/bundler/cli/doctor.rb +4 -6
  19. data/bundler/lib/bundler/cli/gem.rb +62 -40
  20. data/bundler/lib/bundler/cli/info.rb +1 -1
  21. data/bundler/lib/bundler/cli/init.rb +6 -2
  22. data/bundler/lib/bundler/cli/install.rb +8 -6
  23. data/bundler/lib/bundler/cli/lock.rb +8 -5
  24. data/bundler/lib/bundler/cli/open.rb +6 -4
  25. data/bundler/lib/bundler/cli/outdated.rb +14 -7
  26. data/bundler/lib/bundler/cli/platform.rb +7 -5
  27. data/bundler/lib/bundler/cli/viz.rb +1 -1
  28. data/bundler/lib/bundler/cli.rb +53 -7
  29. data/bundler/lib/bundler/compact_index_client/cache.rb +1 -1
  30. data/bundler/lib/bundler/compact_index_client/updater.rb +40 -39
  31. data/bundler/lib/bundler/constants.rb +1 -1
  32. data/bundler/lib/bundler/current_ruby.rb +16 -5
  33. data/bundler/lib/bundler/definition.rb +262 -133
  34. data/bundler/lib/bundler/dependency.rb +20 -86
  35. data/bundler/lib/bundler/digest.rb +1 -1
  36. data/bundler/lib/bundler/dsl.rb +6 -7
  37. data/bundler/lib/bundler/endpoint_specification.rb +2 -13
  38. data/bundler/lib/bundler/env.rb +2 -2
  39. data/bundler/lib/bundler/environment_preserver.rb +3 -2
  40. data/bundler/lib/bundler/errors.rb +1 -11
  41. data/bundler/lib/bundler/feature_flag.rb +0 -2
  42. data/bundler/lib/bundler/fetcher/compact_index.rb +11 -13
  43. data/bundler/lib/bundler/fetcher/dependency.rb +2 -6
  44. data/bundler/lib/bundler/fetcher/downloader.rb +4 -5
  45. data/bundler/lib/bundler/fetcher/index.rb +1 -2
  46. data/bundler/lib/bundler/fetcher.rb +21 -15
  47. data/bundler/lib/bundler/force_platform.rb +18 -0
  48. data/bundler/lib/bundler/friendly_errors.rb +1 -4
  49. data/bundler/lib/bundler/gem_helper.rb +3 -4
  50. data/bundler/lib/bundler/gem_helpers.rb +7 -2
  51. data/bundler/lib/bundler/gem_version_promoter.rb +53 -98
  52. data/bundler/lib/bundler/graph.rb +3 -3
  53. data/bundler/lib/bundler/index.rb +13 -47
  54. data/bundler/lib/bundler/injector.rb +5 -4
  55. data/bundler/lib/bundler/inline.rb +9 -11
  56. data/bundler/lib/bundler/installer/parallel_installer.rb +4 -34
  57. data/bundler/lib/bundler/installer/standalone.rb +13 -9
  58. data/bundler/lib/bundler/installer.rb +17 -29
  59. data/bundler/lib/bundler/lazy_specification.rb +54 -53
  60. data/bundler/lib/bundler/lockfile_generator.rb +3 -3
  61. data/bundler/lib/bundler/lockfile_parser.rb +17 -16
  62. data/bundler/lib/bundler/man/bundle-add.1 +6 -2
  63. data/bundler/lib/bundler/man/bundle-add.1.ronn +4 -1
  64. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  65. data/bundler/lib/bundler/man/bundle-cache.1 +9 -3
  66. data/bundler/lib/bundler/man/bundle-cache.1.ronn +9 -2
  67. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  68. data/bundler/lib/bundler/man/bundle-clean.1 +2 -2
  69. data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
  70. data/bundler/lib/bundler/man/bundle-config.1 +26 -10
  71. data/bundler/lib/bundler/man/bundle-config.1.ronn +17 -10
  72. data/bundler/lib/bundler/man/bundle-console.1 +53 -0
  73. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  74. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  75. data/bundler/lib/bundler/man/bundle-exec.1 +6 -6
  76. data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -6
  77. data/bundler/lib/bundler/man/bundle-gem.1 +27 -37
  78. data/bundler/lib/bundler/man/bundle-gem.1.ronn +5 -5
  79. data/bundler/lib/bundler/man/bundle-help.1 +13 -0
  80. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  81. data/bundler/lib/bundler/man/bundle-info.1 +3 -3
  82. data/bundler/lib/bundler/man/bundle-info.1.ronn +3 -3
  83. data/bundler/lib/bundler/man/bundle-init.1 +5 -1
  84. data/bundler/lib/bundler/man/bundle-init.1.ronn +2 -0
  85. data/bundler/lib/bundler/man/bundle-inject.1 +5 -2
  86. data/bundler/lib/bundler/man/bundle-inject.1.ronn +3 -1
  87. data/bundler/lib/bundler/man/bundle-install.1 +5 -30
  88. data/bundler/lib/bundler/man/bundle-install.1.ronn +6 -29
  89. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  90. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  91. data/bundler/lib/bundler/man/bundle-open.1 +22 -2
  92. data/bundler/lib/bundler/man/bundle-open.1.ronn +9 -1
  93. data/bundler/lib/bundler/man/bundle-outdated.1 +13 -9
  94. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +12 -9
  95. data/bundler/lib/bundler/man/bundle-platform.1 +16 -6
  96. data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
  97. data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
  98. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  99. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  100. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  101. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  102. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  103. data/bundler/lib/bundler/man/bundle-version.1 +35 -0
  104. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  105. data/bundler/lib/bundler/man/bundle-viz.1 +4 -1
  106. data/bundler/lib/bundler/man/bundle-viz.1.ronn +2 -0
  107. data/bundler/lib/bundler/man/bundle.1 +15 -10
  108. data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
  109. data/bundler/lib/bundler/man/gemfile.5 +55 -55
  110. data/bundler/lib/bundler/man/gemfile.5.ronn +57 -53
  111. data/bundler/lib/bundler/man/index.txt +4 -0
  112. data/bundler/lib/bundler/match_metadata.rb +13 -0
  113. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  114. data/bundler/lib/bundler/mirror.rb +5 -7
  115. data/bundler/lib/bundler/plugin/index.rb +5 -5
  116. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  117. data/bundler/lib/bundler/plugin/installer.rb +5 -2
  118. data/bundler/lib/bundler/plugin.rb +3 -1
  119. data/bundler/lib/bundler/remote_specification.rb +7 -12
  120. data/bundler/lib/bundler/resolver/base.rb +107 -0
  121. data/bundler/lib/bundler/resolver/candidate.rb +94 -0
  122. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  123. data/bundler/lib/bundler/resolver/package.rb +72 -0
  124. data/bundler/lib/bundler/resolver/root.rb +25 -0
  125. data/bundler/lib/bundler/resolver/spec_group.rb +42 -71
  126. data/bundler/lib/bundler/resolver.rb +335 -328
  127. data/bundler/lib/bundler/ruby_dsl.rb +7 -1
  128. data/bundler/lib/bundler/ruby_version.rb +8 -8
  129. data/bundler/lib/bundler/rubygems_ext.rb +100 -9
  130. data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -14
  131. data/bundler/lib/bundler/rubygems_integration.rb +11 -15
  132. data/bundler/lib/bundler/runtime.rb +2 -6
  133. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  134. data/bundler/lib/bundler/settings.rb +5 -11
  135. data/bundler/lib/bundler/setup.rb +4 -1
  136. data/bundler/lib/bundler/shared_helpers.rb +3 -3
  137. data/bundler/lib/bundler/source/git/git_proxy.rb +237 -74
  138. data/bundler/lib/bundler/source/git.rb +55 -30
  139. data/bundler/lib/bundler/source/metadata.rb +1 -2
  140. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  141. data/bundler/lib/bundler/source/path.rb +6 -6
  142. data/bundler/lib/bundler/source/rubygems.rb +26 -81
  143. data/bundler/lib/bundler/source.rb +1 -1
  144. data/bundler/lib/bundler/source_list.rb +8 -2
  145. data/bundler/lib/bundler/spec_set.rb +60 -37
  146. data/bundler/lib/bundler/templates/Executable +1 -1
  147. data/bundler/lib/bundler/templates/Executable.bundler +5 -10
  148. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  149. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  150. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  151. data/bundler/lib/bundler/templates/newgem/README.md.tt +6 -4
  152. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +12 -1
  153. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  154. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  155. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  156. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  157. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  158. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  159. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  160. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  161. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  162. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  163. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +9 -2
  164. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  165. data/bundler/lib/bundler/ui/shell.rb +35 -12
  166. data/bundler/lib/bundler/ui/silent.rb +21 -5
  167. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  168. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  169. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  170. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  171. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1351 -409
  172. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  173. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  174. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  175. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  176. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  177. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  178. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  179. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  180. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  181. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  182. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  183. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  184. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  185. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  186. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  187. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  188. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  189. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  190. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  191. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  192. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  193. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  194. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  195. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  196. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  197. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  198. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  199. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  200. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  201. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +15 -9
  202. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +11 -6
  203. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  204. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  205. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  206. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  207. data/bundler/lib/bundler/vendored_persistent.rb +1 -33
  208. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  209. data/bundler/lib/bundler/version.rb +5 -1
  210. data/bundler/lib/bundler/worker.rb +5 -7
  211. data/bundler/lib/bundler.rb +25 -77
  212. data/{bin → exe}/gem +4 -5
  213. data/{bin → exe}/update_rubygems +12 -10
  214. data/lib/rubygems/available_set.rb +4 -3
  215. data/lib/rubygems/basic_specification.rb +5 -4
  216. data/lib/rubygems/bundler_version_finder.rb +2 -2
  217. data/lib/rubygems/command.rb +41 -32
  218. data/lib/rubygems/command_manager.rb +30 -15
  219. data/lib/rubygems/commands/build_command.rb +12 -8
  220. data/lib/rubygems/commands/cert_command.rb +34 -33
  221. data/lib/rubygems/commands/check_command.rb +21 -20
  222. data/lib/rubygems/commands/cleanup_command.rb +18 -17
  223. data/lib/rubygems/commands/contents_command.rb +14 -13
  224. data/lib/rubygems/commands/dependency_command.rb +17 -16
  225. data/lib/rubygems/commands/environment_command.rb +6 -5
  226. data/lib/rubygems/commands/exec_command.rb +249 -0
  227. data/lib/rubygems/commands/fetch_command.rb +10 -9
  228. data/lib/rubygems/commands/generate_index_command.rb +18 -17
  229. data/lib/rubygems/commands/help_command.rb +7 -6
  230. data/lib/rubygems/commands/info_command.rb +3 -3
  231. data/lib/rubygems/commands/install_command.rb +28 -23
  232. data/lib/rubygems/commands/list_command.rb +4 -3
  233. data/lib/rubygems/commands/lock_command.rb +5 -4
  234. data/lib/rubygems/commands/mirror_command.rb +4 -3
  235. data/lib/rubygems/commands/open_command.rb +10 -9
  236. data/lib/rubygems/commands/outdated_command.rb +6 -5
  237. data/lib/rubygems/commands/owner_command.rb +17 -14
  238. data/lib/rubygems/commands/pristine_command.rb +46 -36
  239. data/lib/rubygems/commands/push_command.rb +9 -8
  240. data/lib/rubygems/commands/query_command.rb +9 -8
  241. data/lib/rubygems/commands/rdoc_command.rb +21 -19
  242. data/lib/rubygems/commands/search_command.rb +4 -3
  243. data/lib/rubygems/commands/server_command.rb +4 -3
  244. data/lib/rubygems/commands/setup_command.rb +97 -106
  245. data/lib/rubygems/commands/signin_command.rb +10 -9
  246. data/lib/rubygems/commands/signout_command.rb +8 -7
  247. data/lib/rubygems/commands/sources_command.rb +22 -21
  248. data/lib/rubygems/commands/specification_command.rb +14 -13
  249. data/lib/rubygems/commands/stale_command.rb +3 -2
  250. data/lib/rubygems/commands/uninstall_command.rb +44 -40
  251. data/lib/rubygems/commands/unpack_command.rb +14 -13
  252. data/lib/rubygems/commands/update_command.rb +42 -63
  253. data/lib/rubygems/commands/which_command.rb +8 -7
  254. data/lib/rubygems/commands/yank_command.rb +12 -11
  255. data/lib/rubygems/config_file.rb +55 -21
  256. data/lib/rubygems/core_ext/kernel_gem.rb +1 -6
  257. data/lib/rubygems/core_ext/kernel_require.rb +109 -115
  258. data/lib/rubygems/core_ext/kernel_warn.rb +33 -37
  259. data/lib/rubygems/core_ext/tcpsocket_init.rb +3 -1
  260. data/lib/rubygems/defaults.rb +33 -18
  261. data/lib/rubygems/dependency.rb +15 -11
  262. data/lib/rubygems/dependency_installer.rb +38 -37
  263. data/lib/rubygems/dependency_list.rb +7 -6
  264. data/lib/rubygems/deprecate.rb +3 -2
  265. data/lib/rubygems/doctor.rb +19 -18
  266. data/lib/rubygems/errors.rb +3 -2
  267. data/lib/rubygems/exceptions.rb +16 -8
  268. data/lib/rubygems/ext/build_error.rb +2 -1
  269. data/lib/rubygems/ext/builder.rb +37 -21
  270. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  271. data/lib/rubygems/ext/cargo_builder.rb +150 -111
  272. data/lib/rubygems/ext/cmake_builder.rb +2 -2
  273. data/lib/rubygems/ext/configure_builder.rb +2 -1
  274. data/lib/rubygems/ext/ext_conf_builder.rb +11 -9
  275. data/lib/rubygems/ext/rake_builder.rb +7 -5
  276. data/lib/rubygems/ext.rb +8 -7
  277. data/lib/rubygems/gem_runner.rb +6 -5
  278. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  279. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  280. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  281. data/lib/rubygems/gemcutter_utilities.rb +90 -34
  282. data/lib/rubygems/indexer.rb +29 -28
  283. data/lib/rubygems/install_default_message.rb +3 -2
  284. data/lib/rubygems/install_message.rb +3 -2
  285. data/lib/rubygems/install_update_options.rb +56 -55
  286. data/lib/rubygems/installer.rb +54 -46
  287. data/lib/rubygems/installer_uninstaller_utils.rb +2 -2
  288. data/lib/rubygems/local_remote_options.rb +19 -20
  289. data/lib/rubygems/mock_gem_ui.rb +3 -2
  290. data/lib/rubygems/name_tuple.rb +5 -4
  291. data/lib/rubygems/optparse/lib/optparse.rb +20 -15
  292. data/lib/rubygems/optparse.rb +1 -1
  293. data/lib/rubygems/package/digest_io.rb +1 -0
  294. data/lib/rubygems/package/file_source.rb +3 -2
  295. data/lib/rubygems/package/io_source.rb +1 -0
  296. data/lib/rubygems/package/old.rb +9 -8
  297. data/lib/rubygems/package/source.rb +1 -0
  298. data/lib/rubygems/package/tar_header.rb +63 -62
  299. data/lib/rubygems/package/tar_reader/entry.rb +91 -9
  300. data/lib/rubygems/package/tar_reader.rb +2 -29
  301. data/lib/rubygems/package/tar_writer.rb +8 -7
  302. data/lib/rubygems/package.rb +64 -48
  303. data/lib/rubygems/package_task.rb +5 -4
  304. data/lib/rubygems/path_support.rb +1 -0
  305. data/lib/rubygems/platform.rb +79 -53
  306. data/lib/rubygems/psych_tree.rb +2 -1
  307. data/lib/rubygems/query_utils.rb +35 -35
  308. data/lib/rubygems/rdoc.rb +3 -2
  309. data/lib/rubygems/remote_fetcher.rb +23 -22
  310. data/lib/rubygems/request/connection_pools.rb +4 -4
  311. data/lib/rubygems/request/http_pool.rb +2 -1
  312. data/lib/rubygems/request/https_pool.rb +1 -0
  313. data/lib/rubygems/request.rb +23 -22
  314. data/lib/rubygems/request_set/gem_dependency_api.rb +123 -123
  315. data/lib/rubygems/request_set/lockfile/parser.rb +28 -27
  316. data/lib/rubygems/request_set/lockfile/tokenizer.rb +5 -3
  317. data/lib/rubygems/request_set/lockfile.rb +6 -5
  318. data/lib/rubygems/request_set.rb +20 -19
  319. data/lib/rubygems/requirement.rb +15 -14
  320. data/lib/rubygems/resolver/activation_request.rb +4 -3
  321. data/lib/rubygems/resolver/api_set.rb +5 -4
  322. data/lib/rubygems/resolver/api_specification.rb +7 -6
  323. data/lib/rubygems/resolver/best_set.rb +6 -5
  324. data/lib/rubygems/resolver/composed_set.rb +1 -0
  325. data/lib/rubygems/resolver/conflict.rb +11 -10
  326. data/lib/rubygems/resolver/current_set.rb +1 -0
  327. data/lib/rubygems/resolver/dependency_request.rb +3 -2
  328. data/lib/rubygems/resolver/git_set.rb +3 -2
  329. data/lib/rubygems/resolver/git_specification.rb +7 -6
  330. data/lib/rubygems/resolver/index_set.rb +4 -3
  331. data/lib/rubygems/resolver/index_specification.rb +7 -5
  332. data/lib/rubygems/resolver/installed_specification.rb +5 -4
  333. data/lib/rubygems/resolver/installer_set.rb +15 -17
  334. data/lib/rubygems/resolver/local_specification.rb +3 -2
  335. data/lib/rubygems/resolver/lock_set.rb +5 -4
  336. data/lib/rubygems/resolver/lock_specification.rb +5 -4
  337. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +1 -1
  338. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +32 -26
  339. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  340. data/lib/rubygems/resolver/molinillo.rb +2 -1
  341. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  342. data/lib/rubygems/resolver/set.rb +1 -0
  343. data/lib/rubygems/resolver/source_set.rb +2 -0
  344. data/lib/rubygems/resolver/spec_specification.rb +1 -0
  345. data/lib/rubygems/resolver/specification.rb +2 -1
  346. data/lib/rubygems/resolver/stats.rb +2 -1
  347. data/lib/rubygems/resolver/vendor_set.rb +2 -1
  348. data/lib/rubygems/resolver/vendor_specification.rb +4 -3
  349. data/lib/rubygems/resolver.rb +41 -40
  350. data/lib/rubygems/s3_uri_signer.rb +10 -8
  351. data/lib/rubygems/safe_yaml.rb +4 -2
  352. data/lib/rubygems/security/policies.rb +48 -47
  353. data/lib/rubygems/security/policy.rb +19 -18
  354. data/lib/rubygems/security/signer.rb +6 -5
  355. data/lib/rubygems/security/trust_dir.rb +5 -4
  356. data/lib/rubygems/security.rb +30 -42
  357. data/lib/rubygems/security_option.rb +6 -5
  358. data/lib/rubygems/shellwords.rb +3 -0
  359. data/lib/rubygems/source/git.rb +22 -22
  360. data/lib/rubygems/source/installed.rb +2 -1
  361. data/lib/rubygems/source/local.rb +3 -2
  362. data/lib/rubygems/source/lock.rb +1 -0
  363. data/lib/rubygems/source/specific_file.rb +2 -1
  364. data/lib/rubygems/source/vendor.rb +1 -0
  365. data/lib/rubygems/source.rb +16 -16
  366. data/lib/rubygems/spec_fetcher.rb +10 -9
  367. data/lib/rubygems/specification.rb +121 -114
  368. data/lib/rubygems/specification_policy.rb +36 -15
  369. data/lib/rubygems/stub_specification.rb +11 -9
  370. data/lib/rubygems/text.rb +2 -2
  371. data/lib/rubygems/tsort/lib/tsort.rb +308 -310
  372. data/lib/rubygems/tsort.rb +1 -1
  373. data/lib/rubygems/uninstaller.rb +19 -18
  374. data/lib/rubygems/update_suggestion.rb +69 -0
  375. data/lib/rubygems/uri.rb +4 -4
  376. data/lib/rubygems/uri_formatter.rb +1 -1
  377. data/lib/rubygems/user_interaction.rb +37 -21
  378. data/lib/rubygems/util/licenses.rb +4 -3
  379. data/lib/rubygems/util/list.rb +1 -0
  380. data/lib/rubygems/util.rb +12 -15
  381. data/lib/rubygems/validator.rb +7 -6
  382. data/lib/rubygems/version.rb +17 -11
  383. data/lib/rubygems/version_option.rb +4 -3
  384. data/lib/rubygems.rb +89 -68
  385. data/rubygems-update.gemspec +10 -8
  386. data/setup.rb +10 -9
  387. data/test/rubygems/alternate_cert.pem +14 -14
  388. data/test/rubygems/alternate_cert_32.pem +15 -15
  389. data/test/rubygems/alternate_key.pem +25 -25
  390. data/test/rubygems/bad_rake.rb +1 -0
  391. data/test/rubygems/bundler_test_gem.rb +421 -0
  392. data/test/rubygems/child_cert.pem +15 -16
  393. data/test/rubygems/child_cert_32.pem +15 -16
  394. data/test/rubygems/child_key.pem +25 -25
  395. data/test/rubygems/encrypted_private_key.pem +26 -26
  396. data/test/rubygems/expired_cert.pem +15 -15
  397. data/test/rubygems/fake_certlib/openssl.rb +1 -0
  398. data/test/rubygems/future_cert.pem +15 -15
  399. data/test/rubygems/future_cert_32.pem +15 -15
  400. data/test/rubygems/good_rake.rb +1 -0
  401. data/test/rubygems/grandchild_cert.pem +15 -16
  402. data/test/rubygems/grandchild_cert_32.pem +15 -16
  403. data/test/rubygems/grandchild_key.pem +25 -25
  404. data/test/rubygems/helper.rb +172 -151
  405. data/test/rubygems/installer_test_case.rb +14 -13
  406. data/test/rubygems/invalid_issuer_cert.pem +16 -16
  407. data/test/rubygems/invalid_issuer_cert_32.pem +16 -16
  408. data/test/rubygems/invalid_key.pem +25 -25
  409. data/test/rubygems/invalid_signer_cert.pem +15 -15
  410. data/test/rubygems/invalid_signer_cert_32.pem +15 -15
  411. data/test/rubygems/invalidchild_cert.pem +15 -16
  412. data/test/rubygems/invalidchild_cert_32.pem +15 -16
  413. data/test/rubygems/invalidchild_key.pem +25 -25
  414. data/test/rubygems/multifactor_auth_utilities.rb +111 -0
  415. data/test/rubygems/package/tar_test_case.rb +53 -17
  416. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  417. data/test/rubygems/plugin/exception/rubygems_plugin.rb +2 -1
  418. data/test/rubygems/plugin/load/rubygems_plugin.rb +1 -0
  419. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +2 -1
  420. data/test/rubygems/private_key.pem +25 -25
  421. data/test/rubygems/public_cert.pem +16 -16
  422. data/test/rubygems/public_cert_32.pem +15 -15
  423. data/test/rubygems/public_key.pem +7 -7
  424. data/test/rubygems/rubygems/commands/crash_command.rb +1 -0
  425. data/test/rubygems/rubygems_plugin.rb +3 -2
  426. data/test/rubygems/simple_gem.rb +2 -1
  427. data/test/rubygems/specifications/bar-0.0.2.gemspec +2 -0
  428. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +6 -4
  429. data/test/rubygems/test_bundled_ca.rb +13 -12
  430. data/test/rubygems/test_config.rb +5 -4
  431. data/test/rubygems/test_deprecate.rb +5 -4
  432. data/test/rubygems/test_exit.rb +9 -3
  433. data/test/rubygems/test_gem.rb +339 -677
  434. data/test/rubygems/test_gem_available_set.rb +22 -21
  435. data/test/rubygems/test_gem_bundler_version_finder.rb +6 -4
  436. data/test/rubygems/test_gem_command.rb +45 -44
  437. data/test/rubygems/test_gem_command_manager.rb +96 -30
  438. data/test/rubygems/test_gem_commands_build_command.rb +74 -63
  439. data/test/rubygems/test_gem_commands_cert_command.rb +98 -99
  440. data/test/rubygems/test_gem_commands_check_command.rb +5 -4
  441. data/test/rubygems/test_gem_commands_cleanup_command.rb +41 -40
  442. data/test/rubygems/test_gem_commands_contents_command.rb +28 -27
  443. data/test/rubygems/test_gem_commands_dependency_command.rb +37 -36
  444. data/test/rubygems/test_gem_commands_environment_command.rb +17 -16
  445. data/test/rubygems/test_gem_commands_exec_command.rb +853 -0
  446. data/test/rubygems/test_gem_commands_fetch_command.rb +38 -37
  447. data/test/rubygems/test_gem_commands_generate_index_command.rb +8 -7
  448. data/test/rubygems/test_gem_commands_help_command.rb +14 -13
  449. data/test/rubygems/test_gem_commands_info_command.rb +29 -2
  450. data/test/rubygems/test_gem_commands_install_command.rb +152 -132
  451. data/test/rubygems/test_gem_commands_list_command.rb +5 -4
  452. data/test/rubygems/test_gem_commands_lock_command.rb +11 -10
  453. data/test/rubygems/test_gem_commands_mirror.rb +3 -2
  454. data/test/rubygems/test_gem_commands_open_command.rb +5 -4
  455. data/test/rubygems/test_gem_commands_outdated_command.rb +10 -9
  456. data/test/rubygems/test_gem_commands_owner_command.rb +227 -50
  457. data/test/rubygems/test_gem_commands_pristine_command.rb +142 -93
  458. data/test/rubygems/test_gem_commands_push_command.rb +189 -64
  459. data/test/rubygems/test_gem_commands_query_command.rb +74 -73
  460. data/test/rubygems/test_gem_commands_search_command.rb +3 -2
  461. data/test/rubygems/test_gem_commands_server_command.rb +3 -2
  462. data/test/rubygems/test_gem_commands_setup_command.rb +123 -96
  463. data/test/rubygems/test_gem_commands_signin_command.rb +71 -31
  464. data/test/rubygems/test_gem_commands_signout_command.rb +3 -3
  465. data/test/rubygems/test_gem_commands_sources_command.rb +29 -29
  466. data/test/rubygems/test_gem_commands_specification_command.rb +33 -32
  467. data/test/rubygems/test_gem_commands_stale_command.rb +5 -4
  468. data/test/rubygems/test_gem_commands_uninstall_command.rb +99 -81
  469. data/test/rubygems/test_gem_commands_unpack_command.rb +32 -31
  470. data/test/rubygems/test_gem_commands_update_command.rb +96 -95
  471. data/test/rubygems/test_gem_commands_which_command.rb +7 -6
  472. data/test/rubygems/test_gem_commands_yank_command.rb +162 -43
  473. data/test/rubygems/test_gem_config_file.rb +94 -81
  474. data/test/rubygems/test_gem_dependency.rb +76 -73
  475. data/test/rubygems/test_gem_dependency_installer.rb +200 -165
  476. data/test/rubygems/test_gem_dependency_list.rb +48 -47
  477. data/test/rubygems/test_gem_dependency_resolution_error.rb +5 -4
  478. data/test/rubygems/test_gem_doctor.rb +27 -26
  479. data/test/rubygems/test_gem_ext_builder.rb +60 -61
  480. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +4 -4
  481. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.lock → ext/custom_name_lib/Cargo.lock} +23 -33
  482. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.toml → ext/custom_name_lib/Cargo.toml} +1 -1
  483. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{src → ext/custom_name_lib/src}/lib.rs +1 -1
  484. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +3 -0
  485. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +37 -33
  486. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
  487. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +2 -0
  488. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +12 -0
  489. data/test/rubygems/test_gem_ext_cargo_builder.rb +48 -59
  490. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +20 -19
  491. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +21 -36
  492. data/test/rubygems/test_gem_ext_cmake_builder.rb +16 -15
  493. data/test/rubygems/test_gem_ext_configure_builder.rb +14 -13
  494. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +51 -52
  495. data/test/rubygems/test_gem_ext_rake_builder.rb +16 -15
  496. data/test/rubygems/test_gem_gem_runner.rb +15 -9
  497. data/test/rubygems/test_gem_gemcutter_utilities.rb +170 -84
  498. data/test/rubygems/test_gem_impossible_dependencies_error.rb +5 -4
  499. data/test/rubygems/test_gem_indexer.rb +87 -67
  500. data/test/rubygems/test_gem_install_update_options.rb +17 -16
  501. data/test/rubygems/test_gem_installer.rb +422 -304
  502. data/test/rubygems/test_gem_local_remote_options.rb +11 -10
  503. data/test/rubygems/test_gem_name_tuple.rb +5 -4
  504. data/test/rubygems/test_gem_package.rb +243 -231
  505. data/test/rubygems/test_gem_package_old.rb +14 -13
  506. data/test/rubygems/test_gem_package_tar_header.rb +48 -47
  507. data/test/rubygems/test_gem_package_tar_reader.rb +56 -8
  508. data/test/rubygems/test_gem_package_tar_reader_entry.rb +162 -16
  509. data/test/rubygems/test_gem_package_tar_writer.rb +77 -76
  510. data/test/rubygems/test_gem_package_task.rb +19 -18
  511. data/test/rubygems/test_gem_path_support.rb +15 -14
  512. data/test/rubygems/test_gem_platform.rb +333 -227
  513. data/test/rubygems/test_gem_rdoc.rb +15 -14
  514. data/test/rubygems/test_gem_remote_fetcher.rb +155 -154
  515. data/test/rubygems/test_gem_request.rb +64 -58
  516. data/test/rubygems/test_gem_request_connection_pools.rb +30 -29
  517. data/test/rubygems/test_gem_request_set.rb +101 -100
  518. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +210 -211
  519. data/test/rubygems/test_gem_request_set_lockfile.rb +87 -86
  520. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +58 -57
  521. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +63 -62
  522. data/test/rubygems/test_gem_requirement.rb +48 -41
  523. data/test/rubygems/test_gem_resolver.rb +167 -99
  524. data/test/rubygems/test_gem_resolver_activation_request.rb +7 -6
  525. data/test/rubygems/test_gem_resolver_api_set.rb +34 -33
  526. data/test/rubygems/test_gem_resolver_api_specification.rb +48 -47
  527. data/test/rubygems/test_gem_resolver_best_set.rb +23 -22
  528. data/test/rubygems/test_gem_resolver_composed_set.rb +2 -1
  529. data/test/rubygems/test_gem_resolver_conflict.rb +13 -12
  530. data/test/rubygems/test_gem_resolver_dependency_request.rb +16 -15
  531. data/test/rubygems/test_gem_resolver_git_set.rb +22 -21
  532. data/test/rubygems/test_gem_resolver_git_specification.rb +22 -21
  533. data/test/rubygems/test_gem_resolver_index_set.rb +13 -12
  534. data/test/rubygems/test_gem_resolver_index_specification.rb +17 -16
  535. data/test/rubygems/test_gem_resolver_installed_specification.rb +6 -5
  536. data/test/rubygems/test_gem_resolver_installer_set.rb +79 -34
  537. data/test/rubygems/test_gem_resolver_local_specification.rb +8 -7
  538. data/test/rubygems/test_gem_resolver_lock_set.rb +13 -12
  539. data/test/rubygems/test_gem_resolver_lock_specification.rb +18 -17
  540. data/test/rubygems/test_gem_resolver_requirement_list.rb +2 -1
  541. data/test/rubygems/test_gem_resolver_specification.rb +9 -8
  542. data/test/rubygems/test_gem_resolver_vendor_set.rb +7 -6
  543. data/test/rubygems/test_gem_resolver_vendor_specification.rb +11 -10
  544. data/test/rubygems/test_gem_security.rb +69 -68
  545. data/test/rubygems/test_gem_security_policy.rb +72 -72
  546. data/test/rubygems/test_gem_security_signer.rb +35 -34
  547. data/test/rubygems/test_gem_security_trust_dir.rb +7 -6
  548. data/test/rubygems/test_gem_silent_ui.rb +39 -32
  549. data/test/rubygems/test_gem_source.rb +45 -44
  550. data/test/rubygems/test_gem_source_fetch_problem.rb +10 -9
  551. data/test/rubygems/test_gem_source_git.rb +69 -62
  552. data/test/rubygems/test_gem_source_installed.rb +17 -16
  553. data/test/rubygems/test_gem_source_list.rb +6 -5
  554. data/test/rubygems/test_gem_source_local.rb +15 -14
  555. data/test/rubygems/test_gem_source_lock.rb +32 -31
  556. data/test/rubygems/test_gem_source_specific_file.rb +18 -17
  557. data/test/rubygems/test_gem_source_subpath_problem.rb +8 -7
  558. data/test/rubygems/test_gem_source_vendor.rb +14 -13
  559. data/test/rubygems/test_gem_spec_fetcher.rb +73 -72
  560. data/test/rubygems/test_gem_specification.rb +533 -469
  561. data/test/rubygems/test_gem_stream_ui.rb +53 -22
  562. data/test/rubygems/test_gem_stub_specification.rb +33 -32
  563. data/test/rubygems/test_gem_text.rb +2 -1
  564. data/test/rubygems/test_gem_uninstaller.rb +118 -117
  565. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +4 -3
  566. data/test/rubygems/test_gem_update_suggestion.rb +209 -0
  567. data/test/rubygems/test_gem_uri.rb +6 -4
  568. data/test/rubygems/test_gem_uri_formatter.rb +15 -14
  569. data/test/rubygems/test_gem_util.rb +24 -23
  570. data/test/rubygems/test_gem_validator.rb +8 -8
  571. data/test/rubygems/test_gem_version.rb +24 -16
  572. data/test/rubygems/test_gem_version_option.rb +16 -15
  573. data/test/rubygems/test_kernel.rb +43 -48
  574. data/test/rubygems/test_project_sanity.rb +32 -3
  575. data/test/rubygems/test_remote_fetch_error.rb +8 -7
  576. data/test/rubygems/test_require.rb +118 -103
  577. data/test/rubygems/test_rubygems.rb +10 -8
  578. data/test/rubygems/test_webauthn_listener.rb +143 -0
  579. data/test/rubygems/test_webauthn_listener_response.rb +93 -0
  580. data/test/rubygems/test_webauthn_poller.rb +124 -0
  581. data/test/rubygems/utilities.rb +98 -34
  582. data/test/rubygems/wrong_key_cert.pem +15 -15
  583. data/test/rubygems/wrong_key_cert_32.pem +15 -15
  584. data/test/test_changelog_generator.rb +1 -1
  585. metadata +99 -46
  586. data/bundler/lib/bundler/dep_proxy.rb +0 -55
  587. data/bundler/lib/bundler/templates/gems.rb +0 -5
  588. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  589. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  590. data/bundler/lib/bundler/vendor/molinillo/LICENSE +0 -9
  591. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  592. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  593. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  594. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  595. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  596. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  597. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  598. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  599. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  600. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  601. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  602. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  603. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  604. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  605. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  606. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  607. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  608. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  609. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  610. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  611. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  612. data/bundler/lib/bundler/vendored_molinillo.rb +0 -4
  613. data/bundler/lib/bundler/version_ranges.rb +0 -122
  614. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  615. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
- require_relative 'helper'
3
- require 'rubygems'
2
+
3
+ require_relative "helper"
4
+ require "rubygems"
4
5
 
5
6
  class TestGemRequire < Gem::TestCase
6
7
  class Latch
@@ -35,26 +36,26 @@ class TestGemRequire < Gem::TestCase
35
36
  def test_respect_loaded_features_caching_like_standard_require
36
37
  dir = Dir.mktmpdir("test_require", @tempdir)
37
38
 
38
- lp1 = File.join dir, 'foo1'
39
- foo1 = File.join lp1, 'foo.rb'
39
+ lp1 = File.join dir, "foo1"
40
+ foo1 = File.join lp1, "foo.rb"
40
41
 
41
42
  FileUtils.mkdir_p lp1
42
- File.open(foo1, 'w') {|f| f.write "class Object; HELLO = 'foo1' end" }
43
+ File.open(foo1, "w") {|f| f.write "class Object; HELLO = 'foo1' end" }
43
44
 
44
45
  lp = $LOAD_PATH.dup
45
46
 
46
47
  $LOAD_PATH.unshift lp1
47
- assert_require 'foo'
48
+ assert_require "foo"
48
49
  assert_equal "foo1", ::Object::HELLO
49
50
 
50
- lp2 = File.join dir, 'foo2'
51
- foo2 = File.join lp2, 'foo.rb'
51
+ lp2 = File.join dir, "foo2"
52
+ foo2 = File.join lp2, "foo.rb"
52
53
 
53
54
  FileUtils.mkdir_p lp2
54
- File.open(foo2, 'w') {|f| f.write "class Object; HELLO = 'foo2' end" }
55
+ File.open(foo2, "w") {|f| f.write "class Object; HELLO = 'foo2' end" }
55
56
 
56
57
  $LOAD_PATH.unshift lp2
57
- refute_require 'foo'
58
+ refute_require "foo"
58
59
  assert_equal "foo1", ::Object::HELLO
59
60
  ensure
60
61
  $LOAD_PATH.replace lp
@@ -71,18 +72,18 @@ class TestGemRequire < Gem::TestCase
71
72
  install_specs c1, c2, b1, a1
72
73
 
73
74
  dir = Dir.mktmpdir("test_require", @tempdir)
74
- dash_i_arg = File.join dir, 'lib'
75
+ dash_i_arg = File.join dir, "lib"
75
76
 
76
- c_rb = File.join dash_i_arg, 'b', 'c.rb'
77
+ c_rb = File.join dash_i_arg, "b", "c.rb"
77
78
 
78
79
  FileUtils.mkdir_p File.dirname c_rb
79
- File.open(c_rb, 'w') {|f| f.write "class Object; HELLO = 'world' end" }
80
+ File.open(c_rb, "w") {|f| f.write "class Object; HELLO = 'world' end" }
80
81
 
81
82
  # Pretend to provide a commandline argument that overrides a file in gem b
82
83
  $LOAD_PATH.unshift dash_i_arg
83
84
 
84
- assert_require 'test_gem_require_a'
85
- assert_require 'b/c' # this should be required from -I
85
+ assert_require "test_gem_require_a"
86
+ assert_require "b/c" # this should be required from -I
86
87
  assert_equal "world", ::Object::HELLO
87
88
  assert_equal %w[a-1 b-1], loaded_spec_names
88
89
  ensure
@@ -110,20 +111,20 @@ class TestGemRequire < Gem::TestCase
110
111
  install_default_gems c1, c2, b1, a1
111
112
 
112
113
  dir = Dir.mktmpdir("test_require", @tempdir)
113
- dash_i_arg = File.join dir, 'lib'
114
+ dash_i_arg = File.join dir, "lib"
114
115
 
115
- c_rb = File.join dash_i_arg, 'c', 'c.rb'
116
+ c_rb = File.join dash_i_arg, "c", "c.rb"
116
117
 
117
118
  FileUtils.mkdir_p File.dirname c_rb
118
- File.open(c_rb, 'w') {|f| f.write "class Object; HELLO = 'world' end" }
119
+ File.open(c_rb, "w") {|f| f.write "class Object; HELLO = 'world' end" }
119
120
 
120
- assert_require 'test_gem_require_a'
121
+ assert_require "test_gem_require_a"
121
122
 
122
123
  # Pretend to provide a commandline argument that overrides a file in gem b
123
124
  $LOAD_PATH.unshift dash_i_arg
124
125
 
125
- assert_require 'b/c'
126
- assert_require 'c/c' # this should be required from -I
126
+ assert_require "b/c"
127
+ assert_require "c/c" # this should be required from -I
127
128
  assert_equal "world", ::Object::HELLO
128
129
  assert_equal %w[a-1 b-1], loaded_spec_names
129
130
  ensure
@@ -134,12 +135,12 @@ class TestGemRequire < Gem::TestCase
134
135
  pend "extensions don't quite work on jruby" if Gem.java_platform?
135
136
  pend "not installed yet" unless RbConfig::TOPDIR
136
137
 
137
- dash_i_ext_arg = util_install_extension_file('a')
138
- dash_i_lib_arg = util_install_ruby_file('a')
138
+ dash_i_ext_arg = util_install_extension_file("a")
139
+ dash_i_lib_arg = util_install_ruby_file("a")
139
140
 
140
141
  $LOAD_PATH.unshift dash_i_lib_arg
141
142
  $LOAD_PATH.unshift dash_i_ext_arg
142
- assert_require 'a'
143
+ assert_require "a"
143
144
  assert_match(/a\.rb$/, $LOADED_FEATURES.last)
144
145
  end
145
146
 
@@ -175,7 +176,7 @@ class TestGemRequire < Gem::TestCase
175
176
 
176
177
  install_specs b1, b2, a1
177
178
 
178
- assert_require 'test_gem_require_a'
179
+ assert_require "test_gem_require_a"
179
180
  assert_equal %w[a-1 b-1], loaded_spec_names
180
181
  assert_equal unresolved_names, []
181
182
 
@@ -190,7 +191,7 @@ class TestGemRequire < Gem::TestCase
190
191
 
191
192
  install_specs b1, b2, a1
192
193
 
193
- assert_require 'test_gem_require_a'
194
+ assert_require "test_gem_require_a"
194
195
  assert_equal %w[a-1], loaded_spec_names
195
196
  assert_equal unresolved_names, ["b (>= 1)"]
196
197
 
@@ -204,7 +205,7 @@ class TestGemRequire < Gem::TestCase
204
205
 
205
206
  install_specs b1, a1
206
207
 
207
- assert_require 'test_gem_require_a'
208
+ assert_require "test_gem_require_a"
208
209
  assert_equal %w[a-1 b-1], loaded_spec_names
209
210
  assert_equal unresolved_names, []
210
211
 
@@ -217,7 +218,7 @@ class TestGemRequire < Gem::TestCase
217
218
 
218
219
  install_specs a1
219
220
 
220
- assert_require Pathname.new 'test_gem_require_a'
221
+ assert_require Pathname.new "test_gem_require_a"
221
222
  assert_equal %w[a-1], loaded_spec_names
222
223
  assert_equal unresolved_names, []
223
224
  end
@@ -241,7 +242,7 @@ class TestGemRequire < Gem::TestCase
241
242
  load_path_changed = true
242
243
  end
243
244
 
244
- require 'benchmark' # the stdlib
245
+ require "benchmark" # the stdlib
245
246
 
246
247
  a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb"
247
248
  b1 = util_spec "b", "1", nil, "lib/benchmark.rb"
@@ -250,11 +251,11 @@ class TestGemRequire < Gem::TestCase
250
251
  install_specs b1, b2, a1
251
252
 
252
253
  # Activates a-1, but not b-1 and b-2
253
- assert_require 'test_gem_require_a'
254
+ assert_require "test_gem_require_a"
254
255
  assert_equal %w[a-1], loaded_spec_names
255
- assert $LOAD_PATH.include? a1.load_paths[0]
256
- refute $LOAD_PATH.include? b1.load_paths[0]
257
- refute $LOAD_PATH.include? b2.load_paths[0]
256
+ assert $LOAD_PATH.include? a1.full_require_paths[0]
257
+ refute $LOAD_PATH.include? b1.full_require_paths[0]
258
+ refute $LOAD_PATH.include? b2.full_require_paths[0]
258
259
 
259
260
  assert_equal unresolved_names, ["b (>= 1)"]
260
261
 
@@ -263,15 +264,15 @@ class TestGemRequire < Gem::TestCase
263
264
  # though b-2 is earlier in $LOAD_PATH it already loaded a benchmark.rb file
264
265
  # and that still exists in $LOAD_PATH (further down),
265
266
  # and as a result #gem_original_require returns false.
266
- refute require('benchmark'), "the benchmark stdlib should be recognized as already loaded"
267
+ refute require("benchmark"), "the benchmark stdlib should be recognized as already loaded"
267
268
 
268
- assert_includes $LOAD_PATH, b2.load_paths[0]
269
+ assert_includes $LOAD_PATH, b2.full_require_paths[0]
269
270
  assert_includes $LOAD_PATH, rubylibdir
270
271
  message = proc {
271
272
  "this test relies on the b-2 gem lib/ to be before stdlib to make sense\n" +
272
- $LOAD_PATH.pretty_inspect
273
+ $LOAD_PATH.pretty_inspect
273
274
  }
274
- assert_operator $LOAD_PATH.index(b2.load_paths[0]), :<, $LOAD_PATH.index(rubylibdir), message
275
+ assert_operator $LOAD_PATH.index(b2.full_require_paths[0]), :<, $LOAD_PATH.index(rubylibdir), message
275
276
 
276
277
  # We detected that we should activate b-2, so we did so, but
277
278
  # then #gem_original_require decided "I've already got some benchmark.rb" loaded.
@@ -296,7 +297,7 @@ class TestGemRequire < Gem::TestCase
296
297
 
297
298
  install_specs a2
298
299
 
299
- refute_require 'a'
300
+ refute_require "a"
300
301
 
301
302
  assert_equal %w[a-1], loaded_spec_names
302
303
  end
@@ -378,7 +379,7 @@ class TestGemRequire < Gem::TestCase
378
379
 
379
380
  # Load default ruby gems fresh as if we've just started a ruby script.
380
381
  Gem::Specification.reset
381
- require 'rubygems'
382
+ require "rubygems"
382
383
  Gem::Specification.stubs
383
384
 
384
385
  # Remove an old default gem version directly from disk as if someone ran
@@ -387,9 +388,9 @@ class TestGemRequire < Gem::TestCase
387
388
  FileUtils.rm_rf(File.join @gemhome, "specifications", "default", "#{b1.full_name}.gemspec")
388
389
 
389
390
  # Require gems that have not been removed.
390
- assert_require 'a/b'
391
+ assert_require "a/b"
391
392
  assert_equal %w[a-1.0], loaded_spec_names
392
- assert_require 'b/d'
393
+ assert_require "b/d"
393
394
  assert_equal %w[a-1.0 b-2.0], loaded_spec_names
394
395
  end
395
396
 
@@ -471,7 +472,7 @@ class TestGemRequire < Gem::TestCase
471
472
  RUBY
472
473
  File.write(path, code)
473
474
 
474
- output = Gem::Util.popen({ 'GEM_HOME' => @gemhome }, *ruby_with_rubygems_in_load_path, path).strip
475
+ output = Gem::Util.popen({ "GEM_HOME" => @gemhome }, *ruby_with_rubygems_in_load_path, path).strip
475
476
  assert $?.success?
476
477
  refute_empty output
477
478
  assert_equal "999.99.9", output.lines[0].chomp
@@ -542,11 +543,11 @@ class TestGemRequire < Gem::TestCase
542
543
  silence_warnings do
543
544
  class << ::Gem
544
545
  alias old_try_activate try_activate
545
- def try_activate(*); raise 'raised from try_activate'; end
546
+ def try_activate(*); raise "raised from try_activate"; end
546
547
  end
547
548
  end
548
549
 
549
- require 'does_not_exist_for_try_activate_test'
550
+ require "does_not_exist_for_try_activate_test"
550
551
  rescue RuntimeError => e
551
552
  assert_match(/raised from try_activate/, e.message)
552
553
  assert Kernel::RUBYGEMS_ACTIVATION_MONITOR.try_enter, "require monitor was not unlocked when try_activate raised"
@@ -585,90 +586,104 @@ class TestGemRequire < Gem::TestCase
585
586
  end
586
587
 
587
588
  def test_require_bundler
588
- b1 = util_spec('bundler', '1', nil, "lib/bundler/setup.rb")
589
- b2a = util_spec('bundler', '2.a', nil, "lib/bundler/setup.rb")
589
+ b1 = util_spec("bundler", "1", nil, "lib/bundler/setup.rb")
590
+ b2a = util_spec("bundler", "2.a", nil, "lib/bundler/setup.rb")
590
591
  install_specs b1, b2a
591
592
 
592
593
  require "rubygems/bundler_version_finder"
593
594
  $:.clear
594
- assert_require 'bundler/setup'
595
+ assert_require "bundler/setup"
595
596
  assert_equal %w[bundler-2.a], loaded_spec_names
596
597
  assert_empty unresolved_names
597
598
  end
598
599
 
599
- # uplevel is 2.5+ only
600
- if RUBY_VERSION >= "2.5"
601
- ["", "Kernel."].each do |prefix|
602
- define_method "test_no_kernel_require_in_#{prefix.tr(".", "_")}warn_with_uplevel" do
603
- Dir.mktmpdir("warn_test") do |dir|
604
- File.write(dir + "/sub.rb", "#{prefix}warn 'uplevel', 'test', uplevel: 1\n")
605
- File.write(dir + "/main.rb", "require 'sub'\n")
606
- _, err = capture_subprocess_io do
607
- system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
608
- end
609
- assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
610
- _, err = capture_subprocess_io do
611
- system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
612
- end
613
- assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
600
+ ["", "Kernel."].each do |prefix|
601
+ define_method "test_no_kernel_require_in_#{prefix.tr(".", "_")}warn_with_uplevel" do
602
+ Dir.mktmpdir("warn_test") do |dir|
603
+ File.write(dir + "/sub.rb", "#{prefix}warn 'uplevel', 'test', uplevel: 1\n")
604
+ File.write(dir + "/main.rb", "require 'sub'\n")
605
+ _, err = capture_subprocess_io do
606
+ system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
614
607
  end
615
- end
616
-
617
- define_method "test_no_other_behavioral_changes_with_#{prefix.tr(".", "_")}warn" do
618
- Dir.mktmpdir("warn_test") do |dir|
619
- File.write(dir + "/main.rb", "#{prefix}warn({x:1}, {y:2}, [])\n")
620
- _, err = capture_subprocess_io do
621
- system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
622
- end
623
- assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
624
- _, err = capture_subprocess_io do
625
- system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
626
- end
627
- assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
608
+ assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
609
+ _, err = capture_subprocess_io do
610
+ system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
628
611
  end
612
+ assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
629
613
  end
630
614
  end
631
615
 
632
- def test_no_crash_when_overriding_warn_with_warning_module
616
+ define_method "test_no_other_behavioral_changes_with_#{prefix.tr(".", "_")}warn" do
633
617
  Dir.mktmpdir("warn_test") do |dir|
634
- File.write(dir + "/main.rb", "module Warning; def warn(str); super; end; end; warn 'Foo Bar'")
618
+ File.write(dir + "/main.rb", "#{prefix}warn({x:1}, {y:2}, [])\n")
635
619
  _, err = capture_subprocess_io do
636
620
  system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
637
621
  end
638
- assert_match(/Foo Bar\n$/, err)
622
+ assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
639
623
  _, err = capture_subprocess_io do
640
624
  system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
641
625
  end
642
- assert_match(/Foo Bar\n$/, err)
626
+ assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
643
627
  end
644
628
  end
629
+ end
645
630
 
646
- def test_expected_backtrace_location_when_inheriting_from_basic_object_and_including_kernel
647
- Dir.mktmpdir("warn_test") do |dir|
648
- File.write(dir + "/main.rb", "\nrequire 'sub'\n")
649
- File.write(dir + "/sub.rb", <<-'RUBY')
650
- require 'rubygems'
651
- class C < BasicObject
652
- include ::Kernel
653
- def deprecated
654
- warn "This is a deprecated method", uplevel: 2
655
- end
656
- end
657
- C.new.deprecated
658
- RUBY
631
+ def test_no_crash_when_overriding_warn_with_warning_module
632
+ Dir.mktmpdir("warn_test") do |dir|
633
+ File.write(dir + "/main.rb", "module Warning; def warn(str); super; end; end; warn 'Foo Bar'")
634
+ _, err = capture_subprocess_io do
635
+ system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
636
+ end
637
+ assert_match(/Foo Bar\n$/, err)
638
+ _, err = capture_subprocess_io do
639
+ system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
640
+ end
641
+ assert_match(/Foo Bar\n$/, err)
642
+ end
643
+ end
659
644
 
660
- _, err = capture_subprocess_io do
661
- system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
662
- end
663
- assert_match(/main\.rb:2: warning: This is a deprecated method$/, err)
664
- _, err = capture_subprocess_io do
665
- system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
645
+ def test_expected_backtrace_location_when_inheriting_from_basic_object_and_including_kernel
646
+ Dir.mktmpdir("warn_test") do |dir|
647
+ File.write(dir + "/main.rb", "\nrequire 'sub'\n")
648
+ File.write(dir + "/sub.rb", <<-'RUBY')
649
+ require 'rubygems'
650
+ class C < BasicObject
651
+ include ::Kernel
652
+ def deprecated
653
+ warn "This is a deprecated method", uplevel: 2
654
+ end
666
655
  end
667
- assert_match(/main\.rb:2: warning: This is a deprecated method$/, err)
656
+ C.new.deprecated
657
+ RUBY
658
+
659
+ _, err = capture_subprocess_io do
660
+ system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
661
+ end
662
+ assert_match(/main\.rb:2: warning: This is a deprecated method$/, err)
663
+ _, err = capture_subprocess_io do
664
+ system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
668
665
  end
666
+ assert_match(/main\.rb:2: warning: This is a deprecated method$/, err)
669
667
  end
670
668
  end
671
669
 
670
+ def test_require_does_not_crash_when_utilizing_bundler_version_finder
671
+ a1 = util_spec "a", "1.1", { "bundler" => ">= 0" }
672
+ a2 = util_spec "a", "1.2", { "bundler" => ">= 0" }
673
+ b1 = util_spec "bundler", "2.3.7"
674
+ b2 = util_spec "bundler", "2.3.24"
675
+ c = util_spec "c", "1", { "a" => [">= 1.1", "< 99.0"] }, "lib/test_gem_require_c.rb"
676
+
677
+ install_specs a1, a2, b1, b2, c
678
+
679
+ cmd = <<-RUBY
680
+ require "test_gem_require_c"
681
+ require "json"
682
+ RUBY
683
+ out = Gem::Util.popen({ "GEM_HOME" => @gemhome }, *ruby_with_rubygems_in_load_path, "-e", cmd)
684
+ assert_predicate $?, :success?, "Require failed due to #{out}"
685
+ end
686
+
672
687
  private
673
688
 
674
689
  def util_install_extension_file(name)
@@ -694,13 +709,13 @@ class TestGemRequire < Gem::TestCase
694
709
 
695
710
  spec.files += ["extconf.rb", "depend", "#{name}.c"]
696
711
 
697
- so = File.join(spec.gem_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
698
- assert_path_not_exist so
712
+ extension_file = File.join(spec.extension_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
713
+ assert_path_not_exist extension_file
699
714
 
700
715
  path = Gem::Package.build spec
701
716
  installer = Gem::Installer.at path
702
717
  installer.install
703
- assert_path_exist so
718
+ assert_path_exist extension_file
704
719
 
705
720
  spec.gem_dir
706
721
  end
@@ -712,7 +727,7 @@ class TestGemRequire < Gem::TestCase
712
727
  a_rb = File.join dash_i_lib_arg, "#{name}.rb"
713
728
 
714
729
  FileUtils.mkdir_p File.dirname a_rb
715
- File.open(a_rb, 'w') {|f| f.write "# #{name}.rb" }
730
+ File.open(a_rb, "w") {|f| f.write "# #{name}.rb" }
716
731
 
717
732
  dash_i_lib_arg
718
733
  end
@@ -1,19 +1,21 @@
1
- require_relative 'helper'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "helper"
2
4
 
3
5
  class GemTest < Gem::TestCase
4
6
  def test_rubygems_normal_behaviour
5
- _ = Gem::Util.popen(*ruby_with_rubygems_in_load_path, '-e', "'require \"rubygems\"'", { :err => [:child, :out] }).strip
7
+ _ = Gem::Util.popen(*ruby_with_rubygems_in_load_path, "-e", "'require \"rubygems\"'", { :err => [:child, :out] }).strip
6
8
  assert $?.success?
7
9
  end
8
10
 
9
11
  def test_operating_system_other_exceptions
10
- pend "does not apply to truffleruby" if RUBY_ENGINE == 'truffleruby'
12
+ pend "does not apply to truffleruby" if RUBY_ENGINE == "truffleruby"
11
13
 
12
14
  path = util_install_operating_system_rb <<-RUBY
13
15
  intentionally_not_implemented_method
14
16
  RUBY
15
17
 
16
- output = Gem::Util.popen(*ruby_with_rubygems_and_fake_operating_system_in_load_path(path), '-e', "'require \"rubygems\"'", { :err => [:child, :out] }).strip
18
+ output = Gem::Util.popen(*ruby_with_rubygems_and_fake_operating_system_in_load_path(path), "-e", "'require \"rubygems\"'", { :err => [:child, :out] }).strip
17
19
  assert !$?.success?
18
20
  assert_includes output, "undefined local variable or method `intentionally_not_implemented_method'"
19
21
  assert_includes output, "Loading the #{operating_system_rb_at(path)} file caused an error. " \
@@ -23,8 +25,8 @@ class GemTest < Gem::TestCase
23
25
  end
24
26
 
25
27
  def test_operating_system_customizing_default_dir
26
- pend "does not apply to truffleruby" if RUBY_ENGINE == 'truffleruby'
27
- pend "loads a custom defaults/jruby file that gets in the middle" if RUBY_ENGINE == 'jruby'
28
+ pend "does not apply to truffleruby" if RUBY_ENGINE == "truffleruby"
29
+ pend "loads a custom defaults/jruby file that gets in the middle" if RUBY_ENGINE == "jruby"
28
30
 
29
31
  # On a non existing default dir, there should be no gems
30
32
 
@@ -38,7 +40,7 @@ class GemTest < Gem::TestCase
38
40
 
39
41
  output = Gem::Util.popen(
40
42
  *ruby_with_rubygems_and_fake_operating_system_in_load_path(path),
41
- '-e',
43
+ "-e",
42
44
  "require \"rubygems\"; puts Gem::Specification.stubs.map(&:full_name)",
43
45
  { :err => [:child, :out] }
44
46
  ).strip
@@ -59,7 +61,7 @@ class GemTest < Gem::TestCase
59
61
 
60
62
  FileUtils.mkdir_p File.dirname(operating_system_rb)
61
63
 
62
- File.open(operating_system_rb, 'w') {|f| f.write content }
64
+ File.open(operating_system_rb, "w") {|f| f.write content }
63
65
 
64
66
  dir_lib_arg
65
67
  end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "helper"
4
+ require "rubygems/gemcutter_utilities/webauthn_listener"
5
+ require "rubygems/gemcutter_utilities"
6
+
7
+ class WebauthnListenerTest < Gem::TestCase
8
+ def setup
9
+ super
10
+ @server = TCPServer.new 0
11
+ @port = @server.addr[1].to_s
12
+ end
13
+
14
+ def teardown
15
+ @thread.kill.join if @thread
16
+ @server&.close
17
+ super
18
+ end
19
+
20
+ def test_listener_thread_retreives_otp_code
21
+ thread = Gem::GemcutterUtilities::WebauthnListener.listener_thread(Gem.host, @server)
22
+ Gem::MockBrowser.get URI("http://localhost:#{@port}?code=xyz")
23
+
24
+ thread.join
25
+ assert_equal "xyz", thread[:otp]
26
+ end
27
+
28
+ def test_listener_thread_sets_error
29
+ thread = Gem::GemcutterUtilities::WebauthnListener.listener_thread(Gem.host, @server)
30
+ Gem::MockBrowser.post URI("http://localhost:#{@port}?code=xyz")
31
+
32
+ thread.join
33
+ assert_equal "Security device verification failed: Invalid HTTP method POST received.", thread[:error].message
34
+ end
35
+
36
+ def test_wait_for_otp_code_get_follows_options
37
+ wait_for_otp_code
38
+ assert Gem::MockBrowser.options(URI("http://localhost:#{@port}?code=xyz")).is_a? Net::HTTPNoContent
39
+ assert Gem::MockBrowser.get(URI("http://localhost:#{@port}?code=xyz")).is_a? Net::HTTPOK
40
+ end
41
+
42
+ def test_wait_for_otp_code_options_request
43
+ wait_for_otp_code
44
+ response = Gem::MockBrowser.options URI("http://localhost:#{@port}?code=xyz")
45
+
46
+ assert response.is_a? Net::HTTPNoContent
47
+ assert_equal Gem.host, response["access-control-allow-origin"]
48
+ assert_equal "POST", response["access-control-allow-methods"]
49
+ assert_equal "Content-Type, Authorization, x-csrf-token", response["access-control-allow-headers"]
50
+ assert_equal "close", response["Connection"]
51
+ end
52
+
53
+ def test_wait_for_otp_code_get_request
54
+ wait_for_otp_code
55
+ response = Gem::MockBrowser.get URI("http://localhost:#{@port}?code=xyz")
56
+
57
+ assert response.is_a? Net::HTTPOK
58
+ assert_equal "text/plain; charset=utf-8", response["Content-Type"]
59
+ assert_equal "7", response["Content-Length"]
60
+ assert_equal Gem.host, response["access-control-allow-origin"]
61
+ assert_equal "POST", response["access-control-allow-methods"]
62
+ assert_equal "Content-Type, Authorization, x-csrf-token", response["access-control-allow-headers"]
63
+ assert_equal "close", response["Connection"]
64
+ assert_equal "success", response.body
65
+
66
+ @thread.join
67
+ assert_equal "xyz", @thread[:otp]
68
+ end
69
+
70
+ def test_wait_for_otp_code_invalid_post_req_method
71
+ wait_for_otp_code_expect_error_with_message("Security device verification failed: Invalid HTTP method POST received.")
72
+ response = Gem::MockBrowser.post URI("http://localhost:#{@port}?code=xyz")
73
+
74
+ assert response
75
+ assert response.is_a? Net::HTTPMethodNotAllowed
76
+ assert_equal "GET, OPTIONS", response["allow"]
77
+ assert_equal "close", response["Connection"]
78
+
79
+ @thread.join
80
+ assert_nil @thread[:otp]
81
+ end
82
+
83
+ def test_wait_for_otp_code_incorrect_path
84
+ wait_for_otp_code_expect_error_with_message("Security device verification failed: Page at /path not found.")
85
+ response = Gem::MockBrowser.post URI("http://localhost:#{@port}/path?code=xyz")
86
+
87
+ assert response.is_a? Net::HTTPNotFound
88
+ assert_equal "close", response["Connection"]
89
+
90
+ @thread.join
91
+ assert_nil @thread[:otp]
92
+ end
93
+
94
+ def test_wait_for_otp_code_no_params_response
95
+ wait_for_otp_code_expect_error_with_message("Security device verification failed: Did not receive OTP from https://rubygems.org.")
96
+ response = Gem::MockBrowser.get URI("http://localhost:#{@port}")
97
+
98
+ assert response.is_a? Net::HTTPBadRequest
99
+ assert_equal "text/plain; charset=utf-8", response["Content-Type"]
100
+ assert_equal "22", response["Content-Length"]
101
+ assert_equal "close", response["Connection"]
102
+ assert_equal "missing code parameter", response.body
103
+
104
+ @thread.join
105
+ assert_nil @thread[:otp]
106
+ end
107
+
108
+ def test_wait_for_otp_code_incorrect_params
109
+ wait_for_otp_code_expect_error_with_message("Security device verification failed: Did not receive OTP from https://rubygems.org.")
110
+ response = Gem::MockBrowser.get URI("http://localhost:#{@port}?param=xyz")
111
+
112
+ assert response.is_a? Net::HTTPBadRequest
113
+ assert_equal "text/plain; charset=utf-8", response["Content-Type"]
114
+ assert_equal "22", response["Content-Length"]
115
+ assert_equal "close", response["Connection"]
116
+ assert_equal "missing code parameter", response.body
117
+
118
+ @thread.join
119
+ assert_nil @thread[:otp]
120
+ end
121
+
122
+ private
123
+
124
+ def wait_for_otp_code
125
+ @thread = Thread.new do
126
+ Thread.current[:otp] = Gem::GemcutterUtilities::WebauthnListener.new(Gem.host).wait_for_otp_code(@server)
127
+ end
128
+ @thread.abort_on_exception = true
129
+ @thread.report_on_exception = false
130
+ end
131
+
132
+ def wait_for_otp_code_expect_error_with_message(message)
133
+ @thread = Thread.new do
134
+ error = assert_raise Gem::WebauthnVerificationError do
135
+ Thread.current[:otp] = Gem::GemcutterUtilities::WebauthnListener.new(Gem.host).wait_for_otp_code(@server)
136
+ end
137
+
138
+ assert_equal message, error.message
139
+ end
140
+ @thread.abort_on_exception = true
141
+ @thread.report_on_exception = false
142
+ end
143
+ end