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
@@ -0,0 +1,853 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "helper"
4
+ require "rubygems/commands/exec_command"
5
+
6
+ class TestGemCommandsExecCommand < Gem::TestCase
7
+ def setup
8
+ @orig_args = Gem::Command.build_args
9
+ @orig_specific_extra_args = Gem::Command.specific_extra_args_hash.dup
10
+ @orig_extra_args = Gem::Command.extra_args.dup
11
+
12
+ super
13
+ common_installer_setup
14
+
15
+ @cmd = Gem::Commands::ExecCommand.new
16
+
17
+ @gem_home = Gem.dir
18
+ @gem_path = Gem.path
19
+ @test_arch = RbConfig::CONFIG["arch"]
20
+
21
+ @installed_specs = []
22
+ Gem.post_install {|installer| @installed_specs << installer.spec }
23
+ end
24
+
25
+ def teardown
26
+ super
27
+
28
+ common_installer_teardown
29
+
30
+ Gem::Command.build_args = @orig_args
31
+ Gem::Command.specific_extra_args_hash = @orig_specific_extra_args
32
+ Gem::Command.extra_args = @orig_extra_args
33
+ Gem.configuration = nil
34
+ end
35
+
36
+ def invoke(*args)
37
+ @ui.outs.truncate(0)
38
+ @ui.outs.rewind
39
+ @ui.errs.truncate(0)
40
+ @ui.errs.rewind
41
+ @installed_specs.clear
42
+
43
+ @cmd.invoke(*args)
44
+ ensure
45
+ Gem::Specification.unresolved_deps.clear
46
+ Gem.loaded_specs.clear
47
+ Gem.instance_variable_set(:@activated_gem_paths, 0)
48
+ Gem.clear_default_specs
49
+ Gem.use_paths(@gem_home, @gem_path)
50
+ Gem.refresh
51
+ end
52
+
53
+ def test_error_with_no_arguments
54
+ e = assert_raise Gem::CommandLineError do
55
+ @cmd.invoke
56
+ end
57
+ assert_equal "Please specify an executable to run (e.g. gem exec COMMAND)",
58
+ e.message
59
+ end
60
+
61
+ def test_error_with_no_executable
62
+ e = assert_raise Gem::CommandLineError do
63
+ @cmd.invoke "--verbose", "--gem", "GEM", "--version", "< 10", "--conservative"
64
+ end
65
+ assert_equal "Please specify an executable to run (e.g. gem exec COMMAND)",
66
+ e.message
67
+ end
68
+
69
+ def test_full_option_parsing
70
+ @cmd.when_invoked do |options|
71
+ assert_equal options, {
72
+ args: ["install", "--no-color", "--help", "--verbose"],
73
+ executable: "pod",
74
+ :explicit_prerelease => false,
75
+ gem_name: "cocoapods",
76
+ prerelease: false,
77
+ :version => Gem::Requirement.new(["> 1", "< 1.3"]),
78
+ build_args: nil,
79
+ }
80
+ end
81
+ @cmd.invoke "--gem", "cocoapods", "-v", "> 1", "--version", "< 1.3", "--verbose", "--", "pod", "install", "--no-color", "--help", "--verbose"
82
+ end
83
+
84
+ def test_single_arg_parsing
85
+ @cmd.when_invoked do |options|
86
+ assert_equal options, {
87
+ args: [],
88
+ executable: "rails",
89
+ gem_name: "rails",
90
+ :version => Gem::Requirement.new([">= 0"]),
91
+ build_args: nil,
92
+ }
93
+ end
94
+ @cmd.invoke "rails"
95
+ end
96
+
97
+ def test_single_arg_parsing_with_version
98
+ @cmd.when_invoked do |options|
99
+ assert_equal options, {
100
+ args: [],
101
+ executable: "rails",
102
+ gem_name: "rails",
103
+ :version => Gem::Requirement.new(["= 7.1"]),
104
+ build_args: nil,
105
+ }
106
+ end
107
+ @cmd.invoke "rails:7.1"
108
+ end
109
+
110
+ def test_gem_without_executable
111
+ spec_fetcher do |fetcher|
112
+ fetcher.gem "a", 2
113
+ end
114
+
115
+ util_clear_gems
116
+
117
+ use_ui @ui do
118
+ e = assert_raise Gem::MockGemUi::TermError, @ui.error do
119
+ @cmd.invoke "a:2"
120
+ end
121
+ assert_equal 1, e.exit_code
122
+ assert_equal "ERROR: Failed to load executable `a`, are you sure the gem `a` contains it?\n", @ui.error
123
+ end
124
+ end
125
+
126
+ def test_gem_with_executable
127
+ spec_fetcher do |fetcher|
128
+ fetcher.gem "a", 2 do |s|
129
+ s.executables = %w[a]
130
+ s.files = %w[bin/a lib/a.rb]
131
+
132
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
133
+ f << "Gem.ui.say #{s.original_name.dump}"
134
+ end
135
+ end
136
+ end
137
+
138
+ util_clear_gems
139
+
140
+ use_ui @ui do
141
+ @cmd.invoke "a:2"
142
+ assert_equal "a-2\n", @ui.output
143
+ end
144
+ end
145
+
146
+ def test_gem_with_platforms
147
+ spec_fetcher do |fetcher|
148
+ fetcher.download "a", 2 do |s|
149
+ s.executables = %w[a]
150
+ s.files = %w[bin/a lib/a.rb]
151
+
152
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
153
+ f << "Gem.ui.say #{s.original_name.dump}"
154
+ end
155
+ end
156
+
157
+ fetcher.download "a", 2 do |s|
158
+ s.executables = %w[a]
159
+ s.files = %w[bin/a lib/a.rb]
160
+ s.platform = "x86_64-darwin"
161
+
162
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
163
+ f << "Gem.ui.say #{s.original_name.dump}"
164
+ end
165
+ end
166
+ end
167
+
168
+ use_ui @ui do
169
+ invoke "a:2"
170
+ assert_equal "a-2\n", @ui.output
171
+ end
172
+
173
+ use_ui @ui do
174
+ util_set_arch "x86_64-darwin-18"
175
+ invoke "a:2"
176
+ assert_equal "a-2-x86_64-darwin\n", @ui.output
177
+ end
178
+ end
179
+
180
+ def test_gem_with_platform_dependencies
181
+ spec_fetcher do |fetcher|
182
+ fetcher.download "a", 2 do |s|
183
+ s.executables = %w[a]
184
+ s.files = %w[bin/a lib/a.rb]
185
+ s.add_runtime_dependency "with_platform"
186
+
187
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
188
+ f << 'require "with_platform"' << "\n"
189
+ f << 'Gem.ui.say Gem.loaded_specs.each_value.map(&:original_name).sort.join("\n")'
190
+ end
191
+ end
192
+
193
+ fetcher.download "with_platform", 2 do |s|
194
+ s.files = %w[lib/with_platform.rb]
195
+ s.platform = Gem::Platform.local
196
+ end
197
+
198
+ fetcher.download "with_platform", 2 do |s|
199
+ s.files = %w[lib/with_platform.rb]
200
+ end
201
+ end
202
+
203
+ use_ui @ui do
204
+ util_set_arch "unknown-unknown"
205
+ invoke "a"
206
+ assert_equal "a-2\nwith_platform-2\n", @ui.output
207
+ end
208
+
209
+ use_ui @ui do
210
+ util_set_arch @test_arch
211
+ invoke "a"
212
+ assert_empty @ui.error
213
+ assert_equal "a-2\nwith_platform-2-#{Gem::Platform.local}\n", @ui.output
214
+ end
215
+ end
216
+
217
+ def test_gem_with_platform_and_platform_dependencies
218
+ pend "extensions don't quite work on jruby" if Gem.java_platform?
219
+ pend "terminates on mswin" if vc_windows? && ruby_repo?
220
+
221
+ spec_fetcher do |fetcher|
222
+ fetcher.download "a", 2 do |s|
223
+ s.executables = %w[a]
224
+ s.files = %w[bin/a lib/a.rb]
225
+ s.add_runtime_dependency "with_platform"
226
+ s.platform = Gem::Platform.local.to_s
227
+
228
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
229
+ f << 'require "with_platform"' << "\n"
230
+ f << 'Gem.ui.say Gem.loaded_specs.each_value.map(&:original_name).sort.join("\n")'
231
+ end
232
+ end
233
+
234
+ fetcher.download "a", 2 do |s|
235
+ s.executables = %w[a]
236
+ s.files = %w[bin/a lib/a.rb extconf.rb]
237
+ s.add_runtime_dependency "with_platform"
238
+
239
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
240
+ f << 'require "with_platform"' << "\n"
241
+ f << 'Gem.ui.say Gem.loaded_specs.each_value.map(&:original_name).sort.join("\n")'
242
+ end
243
+
244
+ s.extensions = %w[extconf.rb]
245
+ write_file File.join(*%W[gems #{s.original_name} extconf.rb]) do |f|
246
+ f.write <<-RUBY
247
+ gem('with_platform', '~> 2.0')
248
+ require 'with_platform'
249
+ gem 'sometimes_used'
250
+ require 'sometimes_used'
251
+ require "mkmf"
252
+ create_makefile("#{s.name}")
253
+ RUBY
254
+ end
255
+ end
256
+
257
+ fetcher.download "with_platform", 2 do |s|
258
+ s.files = %w[lib/with_platform.rb]
259
+ s.platform = Gem::Platform.local.to_s
260
+ end
261
+
262
+ fetcher.download "with_platform", 2 do |s|
263
+ s.files = %w[lib/with_platform.rb]
264
+ s.add_runtime_dependency "sometimes_used"
265
+ end
266
+
267
+ fetcher.download "sometimes_used", 2 do |s|
268
+ s.files = %w[lib/sometimes_used.rb]
269
+ end
270
+ end
271
+
272
+ use_ui @ui do
273
+ util_set_arch "unknown-unknown"
274
+ invoke "a"
275
+ assert_empty @ui.error
276
+ assert_equal "Building native extensions. This could take a while...\na-2\nsometimes_used-2\nwith_platform-2\n", @ui.output
277
+ end
278
+
279
+ use_ui @ui do
280
+ util_set_arch @test_arch
281
+ invoke "a"
282
+ assert_empty @ui.error
283
+ assert_equal "a-2-#{Gem::Platform.local}\nwith_platform-2-#{Gem::Platform.local}\n", @ui.output
284
+ end
285
+ end
286
+
287
+ def test_gem_with_other_executable_name
288
+ spec_fetcher do |fetcher|
289
+ fetcher.gem "a", 2 do |s|
290
+ s.executables = %w[foo]
291
+ s.files = %w[bin/foo lib/a.rb]
292
+
293
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
294
+ f << "Gem.ui.say #{s.original_name.dump}"
295
+ end
296
+ end
297
+ end
298
+
299
+ util_clear_gems
300
+
301
+ use_ui @ui do
302
+ @cmd.invoke "a:2"
303
+ assert_equal "a-2\n", @ui.output
304
+ end
305
+ end
306
+
307
+ def test_gem_with_executable_error
308
+ spec_fetcher do |fetcher|
309
+ fetcher.gem "a", 2 do |s|
310
+ s.executables = %w[foo]
311
+ s.files = %w[bin/foo lib/a.rb]
312
+
313
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
314
+ f << "raise #{s.original_name.dump}"
315
+ end
316
+ end
317
+ end
318
+
319
+ util_clear_gems
320
+
321
+ use_ui @ui do
322
+ e = assert_raise RuntimeError do
323
+ @cmd.invoke "a:2"
324
+ end
325
+ assert_equal "a-2", e.message
326
+ assert_empty @ui.error
327
+ end
328
+ end
329
+
330
+ def test_gem_with_multiple_executables_one_match
331
+ spec_fetcher do |fetcher|
332
+ fetcher.gem "a", 2 do |s|
333
+ s.executables = %w[foo a]
334
+ s.files = %w[bin/foo bin/a lib/a.rb]
335
+
336
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
337
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
338
+ end
339
+
340
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
341
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
342
+ end
343
+ end
344
+ end
345
+
346
+ util_clear_gems
347
+
348
+ use_ui @ui do
349
+ @cmd.invoke "a:2"
350
+ assert_equal "a-2 a\n", @ui.output
351
+ end
352
+ end
353
+
354
+ def test_gem_with_multiple_executables_no_match
355
+ spec_fetcher do |fetcher|
356
+ fetcher.gem "a", 2 do |s|
357
+ s.executables = %w[foo bar]
358
+ s.files = %w[bin/foo bin/bar lib/a.rb]
359
+
360
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
361
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
362
+ end
363
+
364
+ write_file File.join(*%W[gems #{s.original_name} bin bar]) do |f|
365
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
366
+ end
367
+ end
368
+ end
369
+
370
+ util_clear_gems
371
+
372
+ use_ui @ui do
373
+ @cmd.invoke "a:2"
374
+ assert_equal "a-2 foo\n", @ui.output
375
+ end
376
+ end
377
+
378
+ def test_gem_dependency_contains_executable
379
+ spec_fetcher do |fetcher|
380
+ fetcher.gem "a", 2 do |s|
381
+ s.executables = %w[]
382
+ s.files = %w[lib/a.rb]
383
+
384
+ s.add_dependency "b"
385
+ end
386
+
387
+ fetcher.gem "b", 2 do |s|
388
+ s.executables = %w[a]
389
+ s.files = %w[bin/a lib/b.rb]
390
+
391
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
392
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
393
+ end
394
+ end
395
+ end
396
+
397
+ util_clear_gems
398
+
399
+ use_ui @ui do
400
+ @cmd.invoke "a:2"
401
+ assert_equal "b-2 a\n", @ui.output
402
+ end
403
+ end
404
+
405
+ def test_gem_dependency_contains_other_executable
406
+ spec_fetcher do |fetcher|
407
+ fetcher.gem "a", 2 do |s|
408
+ s.executables = %w[]
409
+ s.files = %w[lib/a.rb]
410
+
411
+ s.add_dependency "b"
412
+ end
413
+
414
+ fetcher.gem "b", 2 do |s|
415
+ s.executables = %w[foo]
416
+ s.files = %w[bin/foo lib/b.rb]
417
+
418
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
419
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
420
+ end
421
+ end
422
+ end
423
+
424
+ util_clear_gems
425
+
426
+ use_ui @ui do
427
+ e = assert_raise Gem::MockGemUi::TermError do
428
+ @cmd.invoke "a:2"
429
+ end
430
+ assert_equal 1, e.exit_code
431
+ assert_equal <<~ERR, @ui.error
432
+ ERROR: Failed to load executable `a`, are you sure the gem `a` contains it?
433
+ ERR
434
+ end
435
+ end
436
+
437
+ def test_other_gem_contains_executable
438
+ spec_fetcher do |fetcher|
439
+ fetcher.gem "a", 2 do |s|
440
+ s.executables = %w[]
441
+ s.files = %w[lib/a.rb]
442
+ end
443
+
444
+ fetcher.gem "b", 2 do |s|
445
+ s.executables = %w[a]
446
+ s.files = %w[bin/a lib/b.rb]
447
+
448
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
449
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
450
+ end
451
+ end
452
+ end
453
+
454
+ util_clear_gems
455
+
456
+ use_ui @ui do
457
+ e = assert_raise Gem::MockGemUi::TermError do
458
+ @cmd.invoke "a:2"
459
+ end
460
+ assert_equal 1, e.exit_code
461
+ assert_equal <<~ERR, @ui.error
462
+ ERROR: Failed to load executable `a`, are you sure the gem `a` contains it?
463
+ ERR
464
+ end
465
+ end
466
+
467
+ def test_missing_gem
468
+ spec_fetcher do |fetcher|
469
+ end
470
+
471
+ use_ui @ui do
472
+ e = assert_raise Gem::MockGemUi::TermError do
473
+ @cmd.invoke "a"
474
+ end
475
+ assert_equal 2, e.exit_code
476
+ assert_equal <<~ERR, @ui.error
477
+ ERROR: Could not find a valid gem 'a' (>= 0) in any repository
478
+ ERR
479
+ end
480
+ end
481
+
482
+ def test_version_mismatch
483
+ spec_fetcher do |fetcher|
484
+ fetcher.gem "a", 1
485
+ end
486
+
487
+ util_clear_gems
488
+
489
+ use_ui @ui do
490
+ e = assert_raise Gem::MockGemUi::TermError do
491
+ @cmd.invoke "a:2"
492
+ end
493
+ assert_equal 2, e.exit_code
494
+ assert_equal <<~ERR, @ui.error
495
+ ERROR: Could not find a valid gem 'a' (= 2) in any repository
496
+ ERROR: Possible alternatives: a
497
+ ERR
498
+ end
499
+ end
500
+
501
+ def test_pre_argument
502
+ spec_fetcher do |fetcher|
503
+ fetcher.gem "a", 1 do |s|
504
+ s.executables = %w[foo]
505
+ s.files = %w[bin/foo lib/a.rb]
506
+
507
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
508
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
509
+ end
510
+ end
511
+ fetcher.gem "a", "1.1.a" do |s|
512
+ s.executables = %w[foo ]
513
+ s.files = %w[bin/foo lib/a.rb]
514
+
515
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
516
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
517
+ end
518
+ end
519
+ end
520
+
521
+ util_clear_gems
522
+
523
+ use_ui @ui do
524
+ @cmd.invoke "--pre", "a"
525
+ assert_equal "a-1.1.a foo\n", @ui.output
526
+ end
527
+ end
528
+
529
+ def test_pre_version_option
530
+ spec_fetcher do |fetcher|
531
+ fetcher.download "a", 1 do |s|
532
+ s.executables = %w[foo]
533
+ s.files = %w[bin/foo lib/a.rb]
534
+
535
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
536
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
537
+ end
538
+ end
539
+ fetcher.download "a", "1.1.a" do |s|
540
+ s.executables = %w[foo ]
541
+ s.files = %w[bin/foo lib/a.rb]
542
+
543
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
544
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
545
+ end
546
+ end
547
+ end
548
+
549
+ use_ui @ui do
550
+ @cmd.invoke "-v", ">= 0.a", "a"
551
+ assert_equal "a-1.1.a foo\n", @ui.output
552
+ end
553
+ end
554
+
555
+ def test_conservative_missing_gem
556
+ spec_fetcher do |fetcher|
557
+ fetcher.gem "a", 1 do |s|
558
+ s.executables = %w[foo]
559
+ s.files = %w[bin/foo lib/a.rb]
560
+
561
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
562
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
563
+ end
564
+ end
565
+ end
566
+
567
+ util_clear_gems
568
+
569
+ use_ui @ui do
570
+ e = assert_raise Gem::MockGemUi::TermError do
571
+ @cmd.invoke "--verbose", "--conservative", "a:2"
572
+ end
573
+ assert_equal 2, e.exit_code
574
+ assert_include @ui.output, "a (= 2) not available locally"
575
+ assert_equal <<~ERROR, @ui.error
576
+ ERROR: Could not find a valid gem 'a' (= 2) in any repository
577
+ ERROR: Possible alternatives: a
578
+ ERROR
579
+ end
580
+ end
581
+
582
+ def test_conservative
583
+ spec_fetcher do |fetcher|
584
+ fetcher.download "a", 1 do |s|
585
+ s.executables = %w[foo]
586
+ s.files = %w[bin/foo lib/a.rb]
587
+
588
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
589
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
590
+ end
591
+ end
592
+ end
593
+
594
+ use_ui @ui do
595
+ invoke "--verbose", "--conservative", "a"
596
+ assert_include @ui.output, "a (>= 0) not available locally"
597
+ assert_include @ui.output, "a-1 foo"
598
+ assert_equal %w[a-1], @installed_specs.map(&:original_name)
599
+ end
600
+
601
+ spec_fetcher do |fetcher|
602
+ fetcher.gem "a", 1 do |s|
603
+ s.executables = %w[foo]
604
+ s.files = %w[bin/foo lib/a.rb]
605
+
606
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
607
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
608
+ end
609
+ end
610
+
611
+ fetcher.download "a", 2 do |s|
612
+ s.executables = %w[foo]
613
+ s.files = %w[bin/foo lib/a.rb]
614
+
615
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
616
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
617
+ end
618
+ end
619
+ end
620
+
621
+ use_ui @ui do
622
+ invoke "--verbose", "--conservative", "a"
623
+ assert_not_include @ui.output, "a (>= 0) not available locally"
624
+ assert_include @ui.output, "a-1 foo"
625
+ assert_empty @installed_specs.map(&:original_name)
626
+ end
627
+ end
628
+
629
+ def test_uses_newest_version
630
+ spec_fetcher do |fetcher|
631
+ fetcher.download "a", 1 do |s|
632
+ s.executables = %w[foo]
633
+ s.files = %w[bin/foo lib/a.rb]
634
+
635
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
636
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
637
+ end
638
+ end
639
+ end
640
+
641
+ use_ui @ui do
642
+ invoke "a"
643
+ assert_include @ui.output, "a-1 foo"
644
+ end
645
+
646
+ spec_fetcher do |fetcher|
647
+ fetcher.download "a", 1 do |s|
648
+ s.executables = %w[foo]
649
+ s.files = %w[bin/foo lib/a.rb]
650
+
651
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
652
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
653
+ end
654
+ end
655
+
656
+ fetcher.download "a", 2 do |s|
657
+ s.executables = %w[foo]
658
+ s.files = %w[bin/foo lib/a.rb]
659
+
660
+ write_file File.join(*%W[gems #{s.original_name} bin foo]) do |f|
661
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
662
+ end
663
+ end
664
+ end
665
+
666
+ use_ui @ui do
667
+ invoke "--verbose", "a:2"
668
+ refute_predicate @ui, :terminated?
669
+ assert_empty @ui.error
670
+ assert_include @ui.output, "a-2 foo"
671
+ assert_equal %w[a-2], @installed_specs.map(&:original_name)
672
+ end
673
+ end
674
+
675
+ def test_uses_newest_version_of_dependency
676
+ spec_fetcher do |fetcher|
677
+ fetcher.gem "a", 1 do |s|
678
+ s.executables = %w[]
679
+ s.files = %w[lib/a.rb]
680
+ s.add_runtime_dependency "b"
681
+ end
682
+
683
+ fetcher.gem "b", 1 do |s|
684
+ s.executables = %w[a]
685
+ s.files = %w[bin/a lib/a.rb]
686
+
687
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
688
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
689
+ end
690
+ end
691
+
692
+ fetcher.download "b", 2 do |s|
693
+ s.executables = %w[a]
694
+ s.files = %w[bin/a lib/a.rb]
695
+
696
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
697
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
698
+ end
699
+ end
700
+ end
701
+
702
+ use_ui @ui do
703
+ invoke "a"
704
+ assert_include @ui.output, "b-2 a"
705
+ assert_equal %w[b-2], @installed_specs.map(&:original_name)
706
+ end
707
+ end
708
+
709
+ def test_gem_exec_gem_uninstall
710
+ spec_fetcher do |fetcher|
711
+ fetcher.download "a", 2 do |s|
712
+ s.executables = %w[a]
713
+ s.files = %w[bin/a lib/a.rb]
714
+ s.add_runtime_dependency "b"
715
+
716
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
717
+ f << "Gem.ui.say #{s.original_name.dump}"
718
+ end
719
+ end
720
+
721
+ fetcher.download "b", 2 do |s|
722
+ s.files = %w[lib/b.rb]
723
+ end
724
+ end
725
+
726
+ use_ui @ui do
727
+ invoke "a:2"
728
+ assert_equal "a-2\n", @ui.output
729
+
730
+ invoke "gem", "list", "--local"
731
+ assert_includes @ui.output, "a (2)\n"
732
+ assert_includes @ui.output, "b (2)\n"
733
+
734
+ invoke "gem", "uninstall", "--verbose", "-x", "a" rescue nil
735
+ refute_includes @ui.output, "running gem exec with"
736
+ assert_includes @ui.output, "Successfully uninstalled a-2\n"
737
+
738
+ invoke "--verbose", "gem", "uninstall", "b"
739
+ assert_includes @ui.output, "Successfully uninstalled b-2\n"
740
+
741
+ invoke "gem", "list", "--local"
742
+ assert_empty @ui.error
743
+ assert_match(/\A\s*\** LOCAL GEMS \**\s*\z/m, @ui.output)
744
+
745
+ invoke "gem", "env", "GEM_HOME"
746
+ assert_equal "#{@gem_home}/gem_exec\n", @ui.output
747
+ end
748
+ end
749
+
750
+ def test_only_prerelease_available
751
+ spec_fetcher do |fetcher|
752
+ fetcher.download "a", "1.a" do |s|
753
+ s.executables = %w[a]
754
+ s.files = %w[lib/a.rb bin/a]
755
+
756
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
757
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
758
+ end
759
+ end
760
+ end
761
+
762
+ use_ui @ui do
763
+ assert_raise Gem::MockGemUi::TermError do
764
+ invoke "a"
765
+ end
766
+ assert_equal "ERROR: Could not find a valid gem 'a' (>= 0) in any repository\n" +
767
+ "ERROR: Possible alternatives: a\n", @ui.error
768
+ assert_empty @ui.output
769
+ assert_empty @installed_specs
770
+ end
771
+
772
+ use_ui @ui do
773
+ invoke "a:1.a"
774
+ assert_empty @ui.error
775
+ assert_equal "a-1.a a\n", @ui.output
776
+ assert_equal %w[a-1.a], @installed_specs.map(&:full_name)
777
+ end
778
+
779
+ FileUtils.rm_rf Gem.dir
780
+
781
+ use_ui @ui do
782
+ invoke "--version", ">= 1.a", "a"
783
+ assert_empty @ui.error
784
+ assert_equal "a-1.a a\n", @ui.output
785
+ assert_equal %w[a-1.a], @installed_specs.map(&:full_name)
786
+ end
787
+
788
+ FileUtils.rm_rf Gem.dir
789
+
790
+ use_ui @ui do
791
+ invoke "--pre", "a"
792
+ assert_empty @ui.error
793
+ assert_equal "a-1.a a\n", @ui.output
794
+ assert_equal %w[a-1.a], @installed_specs.map(&:full_name)
795
+ end
796
+ end
797
+
798
+ def test_newer_prerelease_available
799
+ spec_fetcher do |fetcher|
800
+ fetcher.download "a", "1" do |s|
801
+ s.executables = %w[a]
802
+ s.files = %w[lib/a.rb bin/a]
803
+
804
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
805
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
806
+ end
807
+ end
808
+
809
+ fetcher.download "a", "1.1.a" do |s|
810
+ s.executables = %w[a]
811
+ s.files = %w[lib/a.rb bin/a]
812
+
813
+ write_file File.join(*%W[gems #{s.original_name} bin a]) do |f|
814
+ f << "Gem.ui.say #{s.original_name.dump} + ' ' + File.basename(__FILE__)"
815
+ end
816
+ end
817
+ end
818
+
819
+ use_ui @ui do
820
+ invoke "a"
821
+ assert_empty @ui.error
822
+ assert_equal "a-1 a\n", @ui.output
823
+ assert_equal %w[a-1], @installed_specs.map(&:full_name)
824
+ end
825
+
826
+ FileUtils.rm_rf Gem.dir
827
+
828
+ use_ui @ui do
829
+ invoke "a:1.1.a"
830
+ assert_empty @ui.error
831
+ assert_equal "a-1.1.a a\n", @ui.output
832
+ assert_equal %w[a-1.1.a], @installed_specs.map(&:full_name)
833
+ end
834
+
835
+ FileUtils.rm_rf Gem.dir
836
+
837
+ use_ui @ui do
838
+ invoke "--version", ">= 1.a", "a"
839
+ assert_empty @ui.error
840
+ assert_equal "a-1.1.a a\n", @ui.output
841
+ assert_equal %w[a-1.1.a], @installed_specs.map(&:full_name)
842
+ end
843
+
844
+ FileUtils.rm_rf Gem.dir
845
+
846
+ use_ui @ui do
847
+ invoke "--pre", "a"
848
+ assert_empty @ui.error
849
+ assert_equal "a-1.1.a a\n", @ui.output
850
+ assert_equal %w[a-1.1.a], @installed_specs.map(&:full_name)
851
+ end
852
+ end
853
+ end