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,249 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../command"
4
+ require_relative "../dependency_installer"
5
+ require_relative "../gem_runner"
6
+ require_relative "../package"
7
+ require_relative "../version_option"
8
+
9
+ class Gem::Commands::ExecCommand < Gem::Command
10
+ include Gem::VersionOption
11
+
12
+ def initialize
13
+ super "exec", "Run a command from a gem", {
14
+ version: Gem::Requirement.default,
15
+ }
16
+
17
+ add_version_option
18
+ add_prerelease_option "to be installed"
19
+
20
+ add_option "-g", "--gem GEM", "run the executable from the given gem" do |value, options|
21
+ options[:gem_name] = value
22
+ end
23
+
24
+ add_option(:"Install/Update", "--conservative",
25
+ "Prefer the most recent installed version, ",
26
+ "rather than the latest version overall") do |value, options|
27
+ options[:conservative] = true
28
+ end
29
+ end
30
+
31
+ def arguments # :nodoc:
32
+ "COMMAND the executable command to run"
33
+ end
34
+
35
+ def defaults_str # :nodoc:
36
+ "--version '#{Gem::Requirement.default}'"
37
+ end
38
+
39
+ def description # :nodoc:
40
+ <<-EOF
41
+ The exec command handles installing (if necessary) and running an executable
42
+ from a gem, regardless of whether that gem is currently installed.
43
+
44
+ The exec command can be thought of as a shortcut to running `gem install` and
45
+ then the executable from the installed gem.
46
+
47
+ For example, `gem exec rails new .` will run `rails new .` in the current
48
+ directory, without having to manually run `gem install rails`.
49
+ Additionally, the exec command ensures the most recent version of the gem
50
+ is used (unless run with `--conservative`), and that the gem is not installed
51
+ to the same gem path as user-installed gems.
52
+ EOF
53
+ end
54
+
55
+ def usage # :nodoc:
56
+ "#{program_name} [options --] COMMAND [args]"
57
+ end
58
+
59
+ def execute
60
+ gem_paths = { "GEM_HOME" => Gem.paths.home, "GEM_PATH" => Gem.paths.path.join(File::PATH_SEPARATOR), "GEM_SPEC_CACHE" => Gem.paths.spec_cache_dir }.compact
61
+
62
+ check_executable
63
+
64
+ print_command
65
+ if options[:gem_name] == "gem" && options[:executable] == "gem"
66
+ set_gem_exec_install_paths
67
+ Gem::GemRunner.new.run options[:args]
68
+ return
69
+ elsif options[:conservative]
70
+ install_if_needed
71
+ else
72
+ install
73
+ activate!
74
+ end
75
+
76
+ load!
77
+ ensure
78
+ ENV.update(gem_paths) if gem_paths
79
+ Gem.clear_paths
80
+ end
81
+
82
+ private
83
+
84
+ def handle_options(args)
85
+ args = add_extra_args(args)
86
+ check_deprecated_options(args)
87
+ @options = Marshal.load Marshal.dump @defaults # deep copy
88
+ parser.order!(args) do |v|
89
+ # put the non-option back at the front of the list of arguments
90
+ args.unshift(v)
91
+
92
+ # stop parsing once we hit the first non-option,
93
+ # so you can call `gem exec rails --version` and it prints the rails
94
+ # version rather than rubygem's
95
+ break
96
+ end
97
+ @options[:args] = args
98
+
99
+ options[:executable], gem_version = extract_gem_name_and_version(options[:args].shift)
100
+ options[:gem_name] ||= options[:executable]
101
+
102
+ if gem_version
103
+ if options[:version].none?
104
+ options[:version] = Gem::Requirement.new(gem_version)
105
+ else
106
+ options[:version].concat [gem_version]
107
+ end
108
+ end
109
+
110
+ if options[:prerelease] && !options[:version].prerelease?
111
+ if options[:version].none?
112
+ options[:version] = Gem::Requirement.default_prerelease
113
+ else
114
+ options[:version].concat [Gem::Requirement.default_prerelease]
115
+ end
116
+ end
117
+ end
118
+
119
+ def check_executable
120
+ if options[:executable].nil?
121
+ raise Gem::CommandLineError,
122
+ "Please specify an executable to run (e.g. #{program_name} COMMAND)"
123
+ end
124
+ end
125
+
126
+ def print_command
127
+ verbose "running #{program_name} with:\n"
128
+ opts = options.reject {|_, v| v.nil? || Array(v).empty? }
129
+ max_length = opts.map {|k, _| k.size }.max
130
+ opts.each do |k, v|
131
+ next if v.nil?
132
+ verbose "\t#{k.to_s.rjust(max_length)}: #{v}"
133
+ end
134
+ verbose ""
135
+ end
136
+
137
+ def install_if_needed
138
+ activate!
139
+ rescue Gem::MissingSpecError
140
+ verbose "#{Gem::Dependency.new(options[:gem_name], options[:version])} not available locally, installing from remote"
141
+ install
142
+ activate!
143
+ end
144
+
145
+ def set_gem_exec_install_paths
146
+ home = File.join(Gem.dir, "gem_exec")
147
+
148
+ ENV["GEM_PATH"] = ([home] + Gem.path).join(File::PATH_SEPARATOR)
149
+ ENV["GEM_HOME"] = home
150
+ Gem.clear_paths
151
+ end
152
+
153
+ def install
154
+ set_gem_exec_install_paths
155
+
156
+ gem_name = options[:gem_name]
157
+ gem_version = options[:version]
158
+
159
+ install_options = options.merge(
160
+ minimal_deps: false,
161
+ wrappers: true
162
+ )
163
+
164
+ suppress_always_install do
165
+ dep_installer = Gem::DependencyInstaller.new install_options
166
+
167
+ request_set = dep_installer.resolve_dependencies gem_name, gem_version
168
+
169
+ verbose "Gems to install:"
170
+ request_set.sorted_requests.each do |activation_request|
171
+ verbose "\t#{activation_request.full_name}"
172
+ end
173
+
174
+ request_set.install install_options
175
+ end
176
+
177
+ Gem::Specification.reset
178
+ rescue Gem::InstallError => e
179
+ alert_error "Error installing #{gem_name}:\n\t#{e.message}"
180
+ terminate_interaction 1
181
+ rescue Gem::GemNotFoundException => e
182
+ show_lookup_failure e.name, e.version, e.errors, false
183
+
184
+ terminate_interaction 2
185
+ rescue Gem::UnsatisfiableDependencyError => e
186
+ show_lookup_failure e.name, e.version, e.errors, false,
187
+ "'#{gem_name}' (#{gem_version})"
188
+
189
+ terminate_interaction 2
190
+ end
191
+
192
+ def activate!
193
+ gem(options[:gem_name], options[:version])
194
+ Gem.finish_resolve
195
+
196
+ verbose "activated #{options[:gem_name]} (#{Gem.loaded_specs[options[:gem_name]].version})"
197
+ end
198
+
199
+ def load!
200
+ argv = ARGV.clone
201
+ ARGV.replace options[:args]
202
+
203
+ exe = executable = options[:executable]
204
+
205
+ contains_executable = Gem.loaded_specs.values.select do |spec|
206
+ spec.executables.include?(executable)
207
+ end
208
+
209
+ if contains_executable.any? {|s| s.name == executable }
210
+ contains_executable.select! {|s| s.name == executable }
211
+ end
212
+
213
+ if contains_executable.empty?
214
+ if (spec = Gem.loaded_specs[executable]) && (exe = spec.executable)
215
+ contains_executable << spec
216
+ else
217
+ alert_error "Failed to load executable `#{executable}`," \
218
+ " are you sure the gem `#{options[:gem_name]}` contains it?"
219
+ terminate_interaction 1
220
+ end
221
+ end
222
+
223
+ if contains_executable.size > 1
224
+ alert_error "Ambiguous which gem `#{executable}` should come from: " \
225
+ "the options are #{contains_executable.map(&:name)}, " \
226
+ "specify one via `-g`"
227
+ terminate_interaction 1
228
+ end
229
+
230
+ load Gem.activate_bin_path(contains_executable.first.name, exe, ">= 0.a")
231
+ ensure
232
+ ARGV.replace argv
233
+ end
234
+
235
+ def suppress_always_install
236
+ name = :always_install
237
+ cls = ::Gem::Resolver::InstallerSet
238
+ method = cls.instance_method(name)
239
+ cls.remove_method(name)
240
+ cls.define_method(name) { [] }
241
+
242
+ begin
243
+ yield
244
+ ensure
245
+ cls.remove_method(name)
246
+ cls.define_method(name, method)
247
+ end
248
+ end
249
+ end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
3
- require_relative '../local_remote_options'
4
- require_relative '../version_option'
2
+
3
+ require_relative "../command"
4
+ require_relative "../local_remote_options"
5
+ require_relative "../version_option"
5
6
 
6
7
  class Gem::Commands::FetchCommand < Gem::Command
7
8
  include Gem::LocalRemoteOptions
@@ -10,10 +11,10 @@ class Gem::Commands::FetchCommand < Gem::Command
10
11
  def initialize
11
12
  defaults = {
12
13
  :suggest_alternate => true,
13
- :version => Gem::Requirement.default,
14
+ :version => Gem::Requirement.default,
14
15
  }
15
16
 
16
- super 'fetch', 'Download a gem and place it in the current directory', defaults
17
+ super "fetch", "Download a gem and place it in the current directory", defaults
17
18
 
18
19
  add_bulk_threshold_option
19
20
  add_proxy_option
@@ -24,13 +25,13 @@ class Gem::Commands::FetchCommand < Gem::Command
24
25
  add_platform_option
25
26
  add_prerelease_option
26
27
 
27
- add_option '--[no-]suggestions', 'Suggest alternates when gems are not found' do |value, options|
28
+ add_option "--[no-]suggestions", "Suggest alternates when gems are not found" do |value, options|
28
29
  options[:suggest_alternate] = value
29
30
  end
30
31
  end
31
32
 
32
33
  def arguments # :nodoc:
33
- 'GEMNAME name of gem to download'
34
+ "GEMNAME name of gem to download"
34
35
  end
35
36
 
36
37
  def defaults_str # :nodoc:
@@ -52,8 +53,8 @@ then repackaging it.
52
53
  end
53
54
 
54
55
  def check_version # :nodoc:
55
- if options[:version] != Gem::Requirement.default and
56
- get_all_gem_names.size > 1
56
+ if options[:version] != Gem::Requirement.default &&
57
+ get_all_gem_names.size > 1
57
58
  alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
58
59
  " version requirements using `gem fetch 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
59
60
  terminate_interaction 1
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
3
- require_relative '../indexer'
2
+
3
+ require_relative "../command"
4
+ require_relative "../indexer"
4
5
 
5
6
  ##
6
7
  # Generates a index files for use as a gem server.
@@ -9,27 +10,27 @@ require_relative '../indexer'
9
10
 
10
11
  class Gem::Commands::GenerateIndexCommand < Gem::Command
11
12
  def initialize
12
- super 'generate_index',
13
- 'Generates the index files for a gem server directory',
14
- :directory => '.', :build_modern => true
13
+ super "generate_index",
14
+ "Generates the index files for a gem server directory",
15
+ :directory => ".", :build_modern => true
15
16
 
16
- add_option '-d', '--directory=DIRNAME',
17
- 'repository base dir containing gems subdir' do |dir, options|
17
+ add_option "-d", "--directory=DIRNAME",
18
+ "repository base dir containing gems subdir" do |dir, options|
18
19
  options[:directory] = File.expand_path dir
19
20
  end
20
21
 
21
- add_option '--[no-]modern',
22
- 'Generate indexes for RubyGems',
23
- '(always true)' do |value, options|
22
+ add_option "--[no-]modern",
23
+ "Generate indexes for RubyGems",
24
+ "(always true)" do |value, options|
24
25
  options[:build_modern] = value
25
26
  end
26
27
 
27
- deprecate_option('--modern', version: '4.0', extra_msg: 'Modern indexes (specs, latest_specs, and prerelease_specs) are always generated, so this option is not needed.')
28
- deprecate_option('--no-modern', version: '4.0', extra_msg: 'The `--no-modern` option is currently ignored. Modern indexes (specs, latest_specs, and prerelease_specs) are always generated.')
28
+ deprecate_option("--modern", version: "4.0", extra_msg: "Modern indexes (specs, latest_specs, and prerelease_specs) are always generated, so this option is not needed.")
29
+ deprecate_option("--no-modern", version: "4.0", extra_msg: "The `--no-modern` option is currently ignored. Modern indexes (specs, latest_specs, and prerelease_specs) are always generated.")
29
30
 
30
- add_option '--update',
31
- 'Update modern indexes with gems added',
32
- 'since the last update' do |value, options|
31
+ add_option "--update",
32
+ "Update modern indexes with gems added",
33
+ "since the last update" do |value, options|
33
34
  options[:update] = value
34
35
  end
35
36
  end
@@ -68,8 +69,8 @@ Marshal::MINOR_VERSION constants. It is used to ensure compatibility.
68
69
  # This is always true because it's the only way now.
69
70
  options[:build_modern] = true
70
71
 
71
- if not File.exist?(options[:directory]) or
72
- not File.directory?(options[:directory])
72
+ if !File.exist?(options[:directory]) ||
73
+ !File.directory?(options[:directory])
73
74
  alert_error "unknown directory name #{options[:directory]}."
74
75
  terminate_interaction 1
75
76
  else
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
2
+
3
+ require_relative "../command"
3
4
 
4
5
  class Gem::Commands::HelpCommand < Gem::Command
5
6
  # :stopdoc:
6
- EXAMPLES = <<-EOF.freeze
7
+ EXAMPLES = <<-EOF
7
8
  Some examples of 'gem' usage.
8
9
 
9
10
  * Install 'rake', either from local directory or remote server:
@@ -52,7 +53,7 @@ Some examples of 'gem' usage.
52
53
  gem update --system
53
54
  EOF
54
55
 
55
- GEM_DEPENDENCIES = <<-EOF.freeze
56
+ GEM_DEPENDENCIES = <<-EOF
56
57
  A gem dependencies file allows installation of a consistent set of gems across
57
58
  multiple environments. The RubyGems implementation is designed to be
58
59
  compatible with Bundler's Gemfile format. You can see additional
@@ -229,7 +230,7 @@ default. This may be overridden with the :development_group option:
229
230
 
230
231
  EOF
231
232
 
232
- PLATFORMS = <<-'EOF'.freeze
233
+ PLATFORMS = <<-'EOF'
233
234
  RubyGems platforms are composed of three parts, a CPU, an OS, and a
234
235
  version. These values are taken from values in rbconfig.rb. You can view
235
236
  your current platform by running `gem environment`.
@@ -280,7 +281,7 @@ platform.
280
281
  # :startdoc:
281
282
 
282
283
  def initialize
283
- super 'help', "Provide help on the 'gem' command"
284
+ super "help", "Provide help on the 'gem' command"
284
285
 
285
286
  @command_manager = Gem::CommandManager.instance
286
287
  end
@@ -326,7 +327,7 @@ platform.
326
327
  desc_width = @command_manager.command_names.map {|n| n.size }.max + 4
327
328
 
328
329
  summary_width = 80 - margin_width - desc_width
329
- wrap_indent = ' ' * (margin_width + desc_width)
330
+ wrap_indent = " " * (margin_width + desc_width)
330
331
  format = "#{' ' * margin_width}%-#{desc_width}s%s"
331
332
 
332
333
  @command_manager.command_names.each do |cmd_name|
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../command'
4
- require_relative '../query_utils'
3
+ require_relative "../command"
4
+ require_relative "../query_utils"
5
5
 
6
6
  class Gem::Commands::InfoCommand < Gem::Command
7
7
  include Gem::QueryUtils
@@ -13,7 +13,7 @@ class Gem::Commands::InfoCommand < Gem::Command
13
13
 
14
14
  add_query_options
15
15
 
16
- remove_option('-d')
16
+ remove_option("-d")
17
17
 
18
18
  defaults[:details] = true
19
19
  defaults[:exact] = true
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
3
- require_relative '../install_update_options'
4
- require_relative '../dependency_installer'
5
- require_relative '../local_remote_options'
6
- require_relative '../validator'
7
- require_relative '../version_option'
2
+
3
+ require_relative "../command"
4
+ require_relative "../install_update_options"
5
+ require_relative "../dependency_installer"
6
+ require_relative "../local_remote_options"
7
+ require_relative "../validator"
8
+ require_relative "../version_option"
9
+ require_relative "../update_suggestion"
8
10
 
9
11
  ##
10
12
  # Gem installer command line tool
@@ -17,19 +19,20 @@ class Gem::Commands::InstallCommand < Gem::Command
17
19
  include Gem::VersionOption
18
20
  include Gem::LocalRemoteOptions
19
21
  include Gem::InstallUpdateOptions
22
+ include Gem::UpdateSuggestion
20
23
 
21
24
  def initialize
22
25
  defaults = Gem::DependencyInstaller::DEFAULT_OPTIONS.merge({
23
26
  :format_executable => false,
24
- :lock => true,
27
+ :lock => true,
25
28
  :suggest_alternate => true,
26
- :version => Gem::Requirement.default,
27
- :without_groups => [],
29
+ :version => Gem::Requirement.default,
30
+ :without_groups => [],
28
31
  })
29
32
 
30
33
  defaults.merge!(install_update_options)
31
34
 
32
- super 'install', 'Install a gem into the local repository', defaults
35
+ super "install", "Install a gem into the local repository", defaults
33
36
 
34
37
  add_install_update_options
35
38
  add_local_remote_options
@@ -46,8 +49,8 @@ class Gem::Commands::InstallCommand < Gem::Command
46
49
 
47
50
  def defaults_str # :nodoc:
48
51
  "--both --version '#{Gem::Requirement.default}' --no-force\n" +
49
- "--install-dir #{Gem.dir} --lock\n" +
50
- install_update_defaults_str
52
+ "--install-dir #{Gem.dir} --lock\n" +
53
+ install_update_defaults_str
51
54
  end
52
55
 
53
56
  def description # :nodoc:
@@ -134,15 +137,15 @@ You can use `i` command instead of `install`.
134
137
  end
135
138
 
136
139
  def check_install_dir # :nodoc:
137
- if options[:install_dir] and options[:user_install]
140
+ if options[:install_dir] && options[:user_install]
138
141
  alert_error "Use --install-dir or --user-install but not both"
139
142
  terminate_interaction 1
140
143
  end
141
144
  end
142
145
 
143
146
  def check_version # :nodoc:
144
- if options[:version] != Gem::Requirement.default and
145
- get_all_gem_names.size > 1
147
+ if options[:version] != Gem::Requirement.default &&
148
+ get_all_gem_names.size > 1
146
149
  alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
147
150
  " version requirements using `gem install 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
148
151
  terminate_interaction 1
@@ -157,7 +160,7 @@ You can use `i` command instead of `install`.
157
160
 
158
161
  @installed_specs = []
159
162
 
160
- ENV.delete 'GEM_PATH' if options[:install_dir].nil?
163
+ ENV.delete "GEM_PATH" if options[:install_dir].nil?
161
164
 
162
165
  check_install_dir
163
166
  check_version
@@ -168,11 +171,13 @@ You can use `i` command instead of `install`.
168
171
 
169
172
  show_installed
170
173
 
174
+ say update_suggestion if eglible_for_update?
175
+
171
176
  terminate_interaction exit_code
172
177
  end
173
178
 
174
179
  def install_from_gemdeps # :nodoc:
175
- require_relative '../request_set'
180
+ require_relative "../request_set"
176
181
  rs = Gem::RequestSet.new
177
182
 
178
183
  specs = rs.install_from_gemdeps options do |req, inst|
@@ -191,8 +196,8 @@ You can use `i` command instead of `install`.
191
196
  end
192
197
 
193
198
  def install_gem(name, version) # :nodoc:
194
- return if options[:conservative] and
195
- not Gem::Dependency.new(name, version).matching_specs.empty?
199
+ return if options[:conservative] &&
200
+ !Gem::Dependency.new(name, version).matching_specs.empty?
196
201
 
197
202
  req = Gem::Requirement.create(version)
198
203
 
@@ -247,11 +252,11 @@ You can use `i` command instead of `install`.
247
252
 
248
253
  def load_hooks # :nodoc:
249
254
  if options[:install_as_default]
250
- require_relative '../install_default_message'
255
+ require_relative "../install_default_message"
251
256
  else
252
- require_relative '../install_message'
257
+ require_relative "../install_message"
253
258
  end
254
- require_relative '../rdoc'
259
+ require_relative "../rdoc"
255
260
  end
256
261
 
257
262
  def show_install_errors(errors) # :nodoc:
@@ -270,7 +275,7 @@ You can use `i` command instead of `install`.
270
275
  def show_installed # :nodoc:
271
276
  return if @installed_specs.empty?
272
277
 
273
- gems = @installed_specs.length == 1 ? 'gem' : 'gems'
278
+ gems = @installed_specs.length == 1 ? "gem" : "gems"
274
279
  say "#{@installed_specs.length} #{gems} installed"
275
280
  end
276
281
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
3
- require_relative '../query_utils'
2
+
3
+ require_relative "../command"
4
+ require_relative "../query_utils"
4
5
 
5
6
  ##
6
7
  # Searches for gems starting with the supplied argument.
@@ -9,7 +10,7 @@ class Gem::Commands::ListCommand < Gem::Command
9
10
  include Gem::QueryUtils
10
11
 
11
12
  def initialize
12
- super 'list', 'Display local gems whose name matches REGEXP',
13
+ super "list", "Display local gems whose name matches REGEXP",
13
14
  :domain => :local, :details => false, :versions => true,
14
15
  :installed => nil, :version => Gem::Requirement.default
15
16
 
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
2
+
3
+ require_relative "../command"
3
4
 
4
5
  class Gem::Commands::LockCommand < Gem::Command
5
6
  def initialize
6
- super 'lock', 'Generate a lockdown list of gems',
7
+ super "lock", "Generate a lockdown list of gems",
7
8
  :strict => false
8
9
 
9
- add_option '-s', '--[no-]strict',
10
- 'fail if unable to satisfy a dependency' do |strict, options|
10
+ add_option "-s", "--[no-]strict",
11
+ "fail if unable to satisfy a dependency" do |strict, options|
11
12
  options[:strict] = strict
12
13
  end
13
14
  end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
2
+
3
+ require_relative "../command"
3
4
 
4
5
  unless defined? Gem::Commands::MirrorCommand
5
6
  class Gem::Commands::MirrorCommand < Gem::Command
6
7
  def initialize
7
- super('mirror', 'Mirror all gem files (requires rubygems-mirror)')
8
+ super("mirror", "Mirror all gem files (requires rubygems-mirror)")
8
9
  begin
9
- Gem::Specification.find_by_name('rubygems-mirror').activate
10
+ Gem::Specification.find_by_name("rubygems-mirror").activate
10
11
  rescue Gem::LoadError
11
12
  # no-op
12
13
  end
@@ -1,18 +1,19 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
3
- require_relative '../version_option'
2
+
3
+ require_relative "../command"
4
+ require_relative "../version_option"
4
5
 
5
6
  class Gem::Commands::OpenCommand < Gem::Command
6
7
  include Gem::VersionOption
7
8
 
8
9
  def initialize
9
- super 'open', 'Open gem sources in editor'
10
+ super "open", "Open gem sources in editor"
10
11
 
11
- add_option('-e', '--editor COMMAND', String,
12
+ add_option("-e", "--editor COMMAND", String,
12
13
  "Prepends COMMAND to gem path. Could be used to specify editor.") do |command, options|
13
14
  options[:editor] = command || get_env_editor
14
15
  end
15
- add_option('-v', '--version VERSION', String,
16
+ add_option("-v", "--version VERSION", String,
16
17
  "Opens specific gem version") do |version|
17
18
  options[:version] = version
18
19
  end
@@ -40,10 +41,10 @@ class Gem::Commands::OpenCommand < Gem::Command
40
41
  end
41
42
 
42
43
  def get_env_editor
43
- ENV['GEM_EDITOR'] ||
44
- ENV['VISUAL'] ||
45
- ENV['EDITOR'] ||
46
- 'vi'
44
+ ENV["GEM_EDITOR"] ||
45
+ ENV["VISUAL"] ||
46
+ ENV["EDITOR"] ||
47
+ "vi"
47
48
  end
48
49
 
49
50
  def execute
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
- require_relative '../command'
3
- require_relative '../local_remote_options'
4
- require_relative '../spec_fetcher'
5
- require_relative '../version_option'
2
+
3
+ require_relative "../command"
4
+ require_relative "../local_remote_options"
5
+ require_relative "../spec_fetcher"
6
+ require_relative "../version_option"
6
7
 
7
8
  class Gem::Commands::OutdatedCommand < Gem::Command
8
9
  include Gem::LocalRemoteOptions
9
10
  include Gem::VersionOption
10
11
 
11
12
  def initialize
12
- super 'outdated', 'Display all gems that need updates'
13
+ super "outdated", "Display all gems that need updates"
13
14
 
14
15
  add_local_remote_options
15
16
  add_platform_option