rubygems-update 3.4.21 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +132 -2
  3. data/Manifest.txt +39 -221
  4. data/README.md +1 -3
  5. data/bundler/CHANGELOG.md +74 -0
  6. data/bundler/README.md +1 -2
  7. data/bundler/bundler.gemspec +4 -2
  8. data/bundler/exe/bundle +1 -10
  9. data/bundler/lib/bundler/build_metadata.rb +3 -3
  10. data/bundler/lib/bundler/capistrano.rb +1 -1
  11. data/bundler/lib/bundler/checksum.rb +245 -0
  12. data/bundler/lib/bundler/ci_detector.rb +75 -0
  13. data/bundler/lib/bundler/cli/add.rb +3 -3
  14. data/bundler/lib/bundler/cli/binstubs.rb +4 -4
  15. data/bundler/lib/bundler/cli/cache.rb +1 -1
  16. data/bundler/lib/bundler/cli/check.rb +1 -1
  17. data/bundler/lib/bundler/cli/common.rb +9 -1
  18. data/bundler/lib/bundler/cli/config.rb +8 -7
  19. data/bundler/lib/bundler/cli/console.rb +3 -2
  20. data/bundler/lib/bundler/cli/doctor.rb +2 -2
  21. data/bundler/lib/bundler/cli/exec.rb +1 -1
  22. data/bundler/lib/bundler/cli/gem.rb +31 -23
  23. data/bundler/lib/bundler/cli/info.rb +2 -13
  24. data/bundler/lib/bundler/cli/install.rb +5 -4
  25. data/bundler/lib/bundler/cli/issue.rb +1 -1
  26. data/bundler/lib/bundler/cli/lock.rb +4 -4
  27. data/bundler/lib/bundler/cli/open.rb +1 -1
  28. data/bundler/lib/bundler/cli/outdated.rb +6 -6
  29. data/bundler/lib/bundler/cli/plugin.rb +7 -14
  30. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  31. data/bundler/lib/bundler/cli/show.rb +2 -2
  32. data/bundler/lib/bundler/cli/update.rb +5 -5
  33. data/bundler/lib/bundler/cli.rb +215 -263
  34. data/bundler/lib/bundler/compact_index_client/cache.rb +29 -9
  35. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  36. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  37. data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
  38. data/bundler/lib/bundler/compact_index_client.rb +14 -7
  39. data/bundler/lib/bundler/constants.rb +1 -1
  40. data/bundler/lib/bundler/current_ruby.rb +5 -21
  41. data/bundler/lib/bundler/definition.rb +43 -16
  42. data/bundler/lib/bundler/dependency.rb +16 -12
  43. data/bundler/lib/bundler/digest.rb +2 -2
  44. data/bundler/lib/bundler/dsl.rb +43 -25
  45. data/bundler/lib/bundler/endpoint_specification.rb +6 -2
  46. data/bundler/lib/bundler/env.rb +1 -3
  47. data/bundler/lib/bundler/errors.rb +58 -0
  48. data/bundler/lib/bundler/fetcher/base.rb +3 -1
  49. data/bundler/lib/bundler/fetcher/compact_index.rb +4 -4
  50. data/bundler/lib/bundler/fetcher/downloader.rb +13 -11
  51. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  52. data/bundler/lib/bundler/fetcher/index.rb +1 -1
  53. data/bundler/lib/bundler/fetcher.rb +28 -25
  54. data/bundler/lib/bundler/friendly_errors.rb +5 -5
  55. data/bundler/lib/bundler/gem_helper.rb +1 -1
  56. data/bundler/lib/bundler/gem_helpers.rb +12 -2
  57. data/bundler/lib/bundler/graph.rb +9 -9
  58. data/bundler/lib/bundler/index.rb +1 -2
  59. data/bundler/lib/bundler/injector.rb +1 -1
  60. data/bundler/lib/bundler/inline.rb +3 -3
  61. data/bundler/lib/bundler/installer/gem_installer.rb +10 -10
  62. data/bundler/lib/bundler/installer/parallel_installer.rb +16 -8
  63. data/bundler/lib/bundler/installer/standalone.rb +2 -3
  64. data/bundler/lib/bundler/installer.rb +9 -9
  65. data/bundler/lib/bundler/lazy_specification.rb +28 -17
  66. data/bundler/lib/bundler/lockfile_generator.rb +9 -0
  67. data/bundler/lib/bundler/lockfile_parser.rb +81 -10
  68. data/bundler/lib/bundler/man/bundle-add.1 +3 -26
  69. data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
  70. data/bundler/lib/bundler/man/bundle-cache.1 +3 -24
  71. data/bundler/lib/bundler/man/bundle-check.1 +3 -12
  72. data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
  73. data/bundler/lib/bundler/man/bundle-config.1 +20 -211
  74. data/bundler/lib/bundler/man/bundle-config.1.ronn +6 -0
  75. data/bundler/lib/bundler/man/bundle-console.1 +4 -22
  76. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
  77. data/bundler/lib/bundler/man/bundle-exec.1 +12 -73
  78. data/bundler/lib/bundler/man/bundle-gem.1 +13 -49
  79. data/bundler/lib/bundler/man/bundle-help.1 +3 -7
  80. data/bundler/lib/bundler/man/bundle-info.1 +3 -9
  81. data/bundler/lib/bundler/man/bundle-init.1 +3 -12
  82. data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
  83. data/bundler/lib/bundler/man/bundle-install.1 +27 -125
  84. data/bundler/lib/bundler/man/bundle-install.1.ronn +1 -0
  85. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  86. data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
  87. data/bundler/lib/bundler/man/bundle-open.1 +7 -27
  88. data/bundler/lib/bundler/man/bundle-outdated.1 +3 -55
  89. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +1 -0
  90. data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
  91. data/bundler/lib/bundler/man/bundle-plugin.1 +3 -29
  92. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  93. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  94. data/bundler/lib/bundler/man/bundle-show.1 +3 -10
  95. data/bundler/lib/bundler/man/bundle-update.1 +18 -137
  96. data/bundler/lib/bundler/man/bundle-version.1 +3 -16
  97. data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
  98. data/bundler/lib/bundler/man/bundle.1 +5 -44
  99. data/bundler/lib/bundler/man/gemfile.5 +24 -301
  100. data/bundler/lib/bundler/man/gemfile.5.ronn +4 -0
  101. data/bundler/lib/bundler/match_metadata.rb +4 -0
  102. data/bundler/lib/bundler/match_platform.rb +1 -1
  103. data/bundler/lib/bundler/plugin/api/source.rb +3 -2
  104. data/bundler/lib/bundler/plugin/index.rb +8 -0
  105. data/bundler/lib/bundler/plugin/installer.rb +1 -1
  106. data/bundler/lib/bundler/plugin.rb +12 -5
  107. data/bundler/lib/bundler/resolver/base.rb +1 -1
  108. data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
  109. data/bundler/lib/bundler/resolver/spec_group.rb +1 -4
  110. data/bundler/lib/bundler/resolver.rb +16 -16
  111. data/bundler/lib/bundler/ruby_dsl.rb +20 -12
  112. data/bundler/lib/bundler/ruby_version.rb +1 -1
  113. data/bundler/lib/bundler/rubygems_ext.rb +27 -54
  114. data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -58
  115. data/bundler/lib/bundler/rubygems_integration.rb +25 -94
  116. data/bundler/lib/bundler/runtime.rb +2 -2
  117. data/bundler/lib/bundler/self_manager.rb +23 -7
  118. data/bundler/lib/bundler/settings.rb +27 -7
  119. data/bundler/lib/bundler/setup.rb +4 -1
  120. data/bundler/lib/bundler/shared_helpers.rb +35 -13
  121. data/bundler/lib/bundler/source/git/git_proxy.rb +22 -14
  122. data/bundler/lib/bundler/source/git.rb +4 -3
  123. data/bundler/lib/bundler/source/metadata.rb +16 -16
  124. data/bundler/lib/bundler/source/path.rb +7 -6
  125. data/bundler/lib/bundler/source/rubygems.rb +21 -14
  126. data/bundler/lib/bundler/source.rb +2 -0
  127. data/bundler/lib/bundler/spec_set.rb +43 -12
  128. data/bundler/lib/bundler/stub_specification.rb +1 -0
  129. data/bundler/lib/bundler/templates/Executable.bundler +1 -1
  130. data/bundler/lib/bundler/templates/newgem/README.md.tt +3 -3
  131. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -6
  132. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  133. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  134. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  135. data/bundler/lib/bundler/ui/shell.rb +2 -2
  136. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  137. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  138. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  139. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  140. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  141. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  142. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +36 -36
  143. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  144. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  145. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  146. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +8 -10
  147. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  148. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  149. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  150. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  151. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  152. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  153. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  154. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  155. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  156. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
  157. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  158. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
  159. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +44 -6
  160. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  161. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  162. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +26 -150
  163. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +4 -46
  164. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  165. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -45
  166. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
  167. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  168. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  169. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  170. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  171. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  172. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  173. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +155 -8
  174. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  175. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  176. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  177. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  178. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  179. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  180. data/bundler/lib/bundler/vendored_persistent.rb +0 -4
  181. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  182. data/bundler/lib/bundler/version.rb +1 -1
  183. data/bundler/lib/bundler/vlad.rb +1 -1
  184. data/bundler/lib/bundler/yaml_serializer.rb +9 -4
  185. data/bundler/lib/bundler.rb +38 -35
  186. data/lib/rubygems/available_set.rb +4 -4
  187. data/lib/rubygems/basic_specification.rb +35 -37
  188. data/lib/rubygems/bundler_version_finder.rb +4 -4
  189. data/lib/rubygems/ci_detector.rb +75 -0
  190. data/lib/rubygems/command.rb +15 -17
  191. data/lib/rubygems/command_manager.rb +5 -4
  192. data/lib/rubygems/commands/build_command.rb +2 -2
  193. data/lib/rubygems/commands/cert_command.rb +2 -3
  194. data/lib/rubygems/commands/check_command.rb +4 -4
  195. data/lib/rubygems/commands/cleanup_command.rb +12 -14
  196. data/lib/rubygems/commands/contents_command.rb +5 -5
  197. data/lib/rubygems/commands/dependency_command.rb +4 -5
  198. data/lib/rubygems/commands/environment_command.rb +3 -5
  199. data/lib/rubygems/commands/exec_command.rb +1 -1
  200. data/lib/rubygems/commands/fetch_command.rb +2 -2
  201. data/lib/rubygems/commands/generate_index_command.rb +39 -74
  202. data/lib/rubygems/commands/help_command.rb +4 -4
  203. data/lib/rubygems/commands/info_command.rb +2 -2
  204. data/lib/rubygems/commands/install_command.rb +8 -16
  205. data/lib/rubygems/commands/list_command.rb +2 -2
  206. data/lib/rubygems/commands/lock_command.rb +1 -1
  207. data/lib/rubygems/commands/open_command.rb +1 -1
  208. data/lib/rubygems/commands/owner_command.rb +1 -1
  209. data/lib/rubygems/commands/pristine_command.rb +13 -15
  210. data/lib/rubygems/commands/push_command.rb +2 -2
  211. data/lib/rubygems/commands/query_command.rb +4 -5
  212. data/lib/rubygems/commands/rdoc_command.rb +2 -2
  213. data/lib/rubygems/commands/search_command.rb +2 -2
  214. data/lib/rubygems/commands/setup_command.rb +33 -36
  215. data/lib/rubygems/commands/sources_command.rb +12 -12
  216. data/lib/rubygems/commands/specification_command.rb +10 -10
  217. data/lib/rubygems/commands/stale_command.rb +1 -1
  218. data/lib/rubygems/commands/uninstall_command.rb +13 -14
  219. data/lib/rubygems/commands/unpack_command.rb +7 -7
  220. data/lib/rubygems/commands/update_command.rb +11 -13
  221. data/lib/rubygems/commands/which_command.rb +1 -1
  222. data/lib/rubygems/commands/yank_command.rb +1 -1
  223. data/lib/rubygems/compatibility.rb +5 -6
  224. data/lib/rubygems/config_file.rb +7 -7
  225. data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
  226. data/lib/rubygems/core_ext/kernel_require.rb +20 -49
  227. data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
  228. data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
  229. data/lib/rubygems/defaults.rb +15 -3
  230. data/lib/rubygems/dependency.rb +12 -14
  231. data/lib/rubygems/dependency_installer.rb +30 -31
  232. data/lib/rubygems/dependency_list.rb +1 -1
  233. data/lib/rubygems/deprecate.rb +16 -15
  234. data/lib/rubygems/doctor.rb +6 -6
  235. data/lib/rubygems/errors.rb +2 -6
  236. data/lib/rubygems/exceptions.rb +2 -1
  237. data/lib/rubygems/ext/builder.rb +15 -10
  238. data/lib/rubygems/ext/cargo_builder.rb +5 -5
  239. data/lib/rubygems/ext/ext_conf_builder.rb +2 -4
  240. data/lib/rubygems/ext/rake_builder.rb +1 -1
  241. data/lib/rubygems/gem_runner.rb +4 -4
  242. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
  243. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
  244. data/lib/rubygems/gemcutter_utilities.rb +18 -19
  245. data/lib/rubygems/install_update_options.rb +18 -19
  246. data/lib/rubygems/installer.rb +66 -45
  247. data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
  248. data/lib/rubygems/local_remote_options.rb +8 -11
  249. data/lib/rubygems/name_tuple.rb +7 -9
  250. data/lib/rubygems/net/http.rb +3 -0
  251. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  252. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  253. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  254. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  255. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  256. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  257. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  258. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  259. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  260. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  261. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  262. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  263. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  264. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  265. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  266. data/lib/rubygems/optparse/lib/optparse.rb +39 -17
  267. data/lib/rubygems/package/digest_io.rb +1 -1
  268. data/lib/rubygems/package/old.rb +2 -2
  269. data/lib/rubygems/package/tar_header.rb +45 -39
  270. data/lib/rubygems/package/tar_reader/entry.rb +5 -4
  271. data/lib/rubygems/package/tar_reader.rb +14 -5
  272. data/lib/rubygems/package/tar_writer.rb +20 -18
  273. data/lib/rubygems/package.rb +28 -27
  274. data/lib/rubygems/package_task.rb +2 -2
  275. data/lib/rubygems/path_support.rb +10 -11
  276. data/lib/rubygems/platform.rb +65 -48
  277. data/lib/rubygems/query_utils.rb +7 -9
  278. data/lib/rubygems/remote_fetcher.rb +17 -17
  279. data/lib/rubygems/request/connection_pools.rb +3 -3
  280. data/lib/rubygems/request.rb +20 -17
  281. data/lib/rubygems/request_set/gem_dependency_api.rb +120 -123
  282. data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
  283. data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
  284. data/lib/rubygems/request_set/lockfile.rb +6 -11
  285. data/lib/rubygems/request_set.rb +5 -5
  286. data/lib/rubygems/requirement.rb +7 -7
  287. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  288. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  289. data/lib/rubygems/resolver/activation_request.rb +1 -3
  290. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  291. data/lib/rubygems/resolver/best_set.rb +1 -1
  292. data/lib/rubygems/resolver/composed_set.rb +1 -1
  293. data/lib/rubygems/resolver/conflict.rb +4 -12
  294. data/lib/rubygems/resolver/index_set.rb +4 -4
  295. data/lib/rubygems/resolver/index_specification.rb +2 -2
  296. data/lib/rubygems/resolver/installer_set.rb +5 -6
  297. data/lib/rubygems/resolver/lock_set.rb +1 -1
  298. data/lib/rubygems/resolver.rb +6 -13
  299. data/lib/rubygems/s3_uri_signer.rb +6 -6
  300. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  301. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  302. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  303. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  304. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  305. data/lib/rubygems/safe_marshal.rb +74 -0
  306. data/lib/rubygems/safe_yaml.rb +5 -28
  307. data/lib/rubygems/security/policies.rb +36 -38
  308. data/lib/rubygems/security/policy.rb +7 -11
  309. data/lib/rubygems/security/signer.rb +1 -1
  310. data/lib/rubygems/security/trust_dir.rb +4 -4
  311. data/lib/rubygems/security.rb +8 -22
  312. data/lib/rubygems/source/git.rb +1 -3
  313. data/lib/rubygems/source/installed.rb +0 -2
  314. data/lib/rubygems/source/local.rb +7 -9
  315. data/lib/rubygems/source/lock.rb +1 -3
  316. data/lib/rubygems/source/specific_file.rb +0 -1
  317. data/lib/rubygems/source/vendor.rb +0 -2
  318. data/lib/rubygems/source.rb +12 -12
  319. data/lib/rubygems/source_list.rb +5 -5
  320. data/lib/rubygems/spec_fetcher.rb +31 -31
  321. data/lib/rubygems/specification.rb +145 -150
  322. data/lib/rubygems/specification_policy.rb +61 -31
  323. data/lib/rubygems/stub_specification.rb +4 -5
  324. data/lib/rubygems/text.rb +1 -2
  325. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  326. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  327. data/lib/rubygems/timeout.rb +3 -0
  328. data/lib/rubygems/tsort/lib/tsort.rb +3 -0
  329. data/lib/rubygems/uninstaller.rb +9 -11
  330. data/lib/rubygems/update_suggestion.rb +5 -18
  331. data/lib/rubygems/uri_formatter.rb +1 -1
  332. data/lib/rubygems/user_interaction.rb +17 -23
  333. data/lib/rubygems/util/licenses.rb +113 -35
  334. data/lib/rubygems/util/list.rb +3 -1
  335. data/lib/rubygems/util.rb +2 -4
  336. data/lib/rubygems/validator.rb +6 -4
  337. data/lib/rubygems/version.rb +35 -29
  338. data/lib/rubygems/version_option.rb +2 -5
  339. data/lib/rubygems/yaml_serializer.rb +9 -4
  340. data/lib/rubygems.rb +42 -42
  341. data/rubygems-update.gemspec +4 -4
  342. data/setup.rb +2 -2
  343. metadata +43 -225
  344. data/lib/rubygems/indexer.rb +0 -428
  345. data/lib/rubygems/mock_gem_ui.rb +0 -86
  346. data/test/rubygems/alternate_cert.pem +0 -19
  347. data/test/rubygems/alternate_cert_32.pem +0 -19
  348. data/test/rubygems/alternate_key.pem +0 -27
  349. data/test/rubygems/bad_rake.rb +0 -3
  350. data/test/rubygems/bundler_test_gem.rb +0 -424
  351. data/test/rubygems/ca_cert.pem +0 -77
  352. data/test/rubygems/child_cert.pem +0 -19
  353. data/test/rubygems/child_cert_32.pem +0 -19
  354. data/test/rubygems/child_key.pem +0 -27
  355. data/test/rubygems/client.pem +0 -107
  356. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  357. data/test/rubygems/data/gem-private_key.pem +0 -27
  358. data/test/rubygems/data/gem-public_cert.pem +0 -20
  359. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  360. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  361. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  362. data/test/rubygems/encrypted_private_key.pem +0 -30
  363. data/test/rubygems/expired_cert.pem +0 -19
  364. data/test/rubygems/fake_certlib/openssl.rb +0 -9
  365. data/test/rubygems/foo/discover.rb +0 -1
  366. data/test/rubygems/future_cert.pem +0 -19
  367. data/test/rubygems/future_cert_32.pem +0 -19
  368. data/test/rubygems/good_rake.rb +0 -3
  369. data/test/rubygems/grandchild_cert.pem +0 -19
  370. data/test/rubygems/grandchild_cert_32.pem +0 -19
  371. data/test/rubygems/grandchild_key.pem +0 -27
  372. data/test/rubygems/helper.rb +0 -1649
  373. data/test/rubygems/installer_test_case.rb +0 -248
  374. data/test/rubygems/invalid_client.pem +0 -49
  375. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  376. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  377. data/test/rubygems/invalid_key.pem +0 -27
  378. data/test/rubygems/invalid_signer_cert.pem +0 -19
  379. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  380. data/test/rubygems/invalidchild_cert.pem +0 -19
  381. data/test/rubygems/invalidchild_cert_32.pem +0 -19
  382. data/test/rubygems/invalidchild_key.pem +0 -27
  383. data/test/rubygems/multifactor_auth_utilities.rb +0 -111
  384. data/test/rubygems/package/tar_test_case.rb +0 -175
  385. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  386. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  387. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  388. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
  389. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
  390. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
  391. data/test/rubygems/private3072_key.pem +0 -40
  392. data/test/rubygems/private_ec_key.pem +0 -9
  393. data/test/rubygems/private_key.pem +0 -27
  394. data/test/rubygems/public3072_cert.pem +0 -25
  395. data/test/rubygems/public_cert.pem +0 -20
  396. data/test/rubygems/public_cert_32.pem +0 -19
  397. data/test/rubygems/public_key.pem +0 -9
  398. data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
  399. data/test/rubygems/rubygems_plugin.rb +0 -24
  400. data/test/rubygems/sff/discover.rb +0 -1
  401. data/test/rubygems/simple_gem.rb +0 -68
  402. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  403. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  404. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
  405. data/test/rubygems/ssl_cert.pem +0 -80
  406. data/test/rubygems/ssl_key.pem +0 -27
  407. data/test/rubygems/test_bundled_ca.rb +0 -61
  408. data/test/rubygems/test_config.rb +0 -28
  409. data/test/rubygems/test_deprecate.rb +0 -158
  410. data/test/rubygems/test_exit.rb +0 -17
  411. data/test/rubygems/test_gem.rb +0 -1799
  412. data/test/rubygems/test_gem_available_set.rb +0 -130
  413. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
  414. data/test/rubygems/test_gem_command.rb +0 -403
  415. data/test/rubygems/test_gem_command_manager.rb +0 -400
  416. data/test/rubygems/test_gem_commands_build_command.rb +0 -739
  417. data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
  418. data/test/rubygems/test_gem_commands_check_command.rb +0 -68
  419. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
  420. data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
  421. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
  422. data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
  423. data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
  424. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
  425. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
  426. data/test/rubygems/test_gem_commands_help_command.rb +0 -94
  427. data/test/rubygems/test_gem_commands_info_command.rb +0 -70
  428. data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
  429. data/test/rubygems/test_gem_commands_list_command.rb +0 -33
  430. data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
  431. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  432. data/test/rubygems/test_gem_commands_open_command.rb +0 -101
  433. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
  434. data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
  435. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
  436. data/test/rubygems/test_gem_commands_push_command.rb +0 -603
  437. data/test/rubygems/test_gem_commands_query_command.rb +0 -858
  438. data/test/rubygems/test_gem_commands_search_command.rb +0 -16
  439. data/test/rubygems/test_gem_commands_server_command.rb +0 -20
  440. data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
  441. data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
  442. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  443. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  444. data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
  445. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  446. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -522
  447. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
  448. data/test/rubygems/test_gem_commands_update_command.rb +0 -836
  449. data/test/rubygems/test_gem_commands_which_command.rb +0 -85
  450. data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
  451. data/test/rubygems/test_gem_config_file.rb +0 -551
  452. data/test/rubygems/test_gem_dependency.rb +0 -398
  453. data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
  454. data/test/rubygems/test_gem_dependency_list.rb +0 -265
  455. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
  456. data/test/rubygems/test_gem_doctor.rb +0 -195
  457. data/test/rubygems/test_gem_ext_builder.rb +0 -337
  458. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  459. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  460. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
  461. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
  462. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
  463. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
  464. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  465. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
  466. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  467. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
  468. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
  469. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
  470. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
  471. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
  472. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
  473. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
  474. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
  475. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
  476. data/test/rubygems/test_gem_gem_runner.rb +0 -119
  477. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
  478. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
  479. data/test/rubygems/test_gem_indexer.rb +0 -381
  480. data/test/rubygems/test_gem_install_update_options.rb +0 -208
  481. data/test/rubygems/test_gem_installer.rb +0 -2512
  482. data/test/rubygems/test_gem_local_remote_options.rb +0 -133
  483. data/test/rubygems/test_gem_name_tuple.rb +0 -43
  484. data/test/rubygems/test_gem_package.rb +0 -1306
  485. data/test/rubygems/test_gem_package_old.rb +0 -91
  486. data/test/rubygems/test_gem_package_tar_header.rb +0 -226
  487. data/test/rubygems/test_gem_package_tar_reader.rb +0 -135
  488. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
  489. data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
  490. data/test/rubygems/test_gem_package_task.rb +0 -118
  491. data/test/rubygems/test_gem_path_support.rb +0 -139
  492. data/test/rubygems/test_gem_platform.rb +0 -497
  493. data/test/rubygems/test_gem_rdoc.rb +0 -137
  494. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
  495. data/test/rubygems/test_gem_request.rb +0 -547
  496. data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
  497. data/test/rubygems/test_gem_request_set.rb +0 -672
  498. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
  499. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
  500. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
  501. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
  502. data/test/rubygems/test_gem_requirement.rb +0 -505
  503. data/test/rubygems/test_gem_resolver.rb +0 -859
  504. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
  505. data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
  506. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
  507. data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
  508. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
  509. data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
  510. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
  511. data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
  512. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  513. data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
  514. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
  515. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
  516. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
  517. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
  518. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
  519. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
  520. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
  521. data/test/rubygems/test_gem_resolver_specification.rb +0 -63
  522. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
  523. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
  524. data/test/rubygems/test_gem_security.rb +0 -341
  525. data/test/rubygems/test_gem_security_policy.rb +0 -535
  526. data/test/rubygems/test_gem_security_signer.rb +0 -218
  527. data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
  528. data/test/rubygems/test_gem_silent_ui.rb +0 -123
  529. data/test/rubygems/test_gem_source.rb +0 -254
  530. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
  531. data/test/rubygems/test_gem_source_git.rb +0 -310
  532. data/test/rubygems/test_gem_source_installed.rb +0 -35
  533. data/test/rubygems/test_gem_source_list.rb +0 -119
  534. data/test/rubygems/test_gem_source_local.rb +0 -107
  535. data/test/rubygems/test_gem_source_lock.rb +0 -113
  536. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  537. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
  538. data/test/rubygems/test_gem_source_vendor.rb +0 -30
  539. data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
  540. data/test/rubygems/test_gem_specification.rb +0 -3856
  541. data/test/rubygems/test_gem_stream_ui.rb +0 -255
  542. data/test/rubygems/test_gem_stub_specification.rb +0 -278
  543. data/test/rubygems/test_gem_text.rb +0 -103
  544. data/test/rubygems/test_gem_uninstaller.rb +0 -675
  545. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
  546. data/test/rubygems/test_gem_update_suggestion.rb +0 -209
  547. data/test/rubygems/test_gem_uri.rb +0 -41
  548. data/test/rubygems/test_gem_uri_formatter.rb +0 -27
  549. data/test/rubygems/test_gem_util.rb +0 -91
  550. data/test/rubygems/test_gem_validator.rb +0 -42
  551. data/test/rubygems/test_gem_version.rb +0 -305
  552. data/test/rubygems/test_gem_version_option.rb +0 -165
  553. data/test/rubygems/test_kernel.rb +0 -124
  554. data/test/rubygems/test_project_sanity.rb +0 -49
  555. data/test/rubygems/test_remote_fetch_error.rb +0 -20
  556. data/test/rubygems/test_require.rb +0 -732
  557. data/test/rubygems/test_rubygems.rb +0 -76
  558. data/test/rubygems/test_webauthn_listener.rb +0 -143
  559. data/test/rubygems/test_webauthn_listener_response.rb +0 -93
  560. data/test/rubygems/test_webauthn_poller.rb +0 -124
  561. data/test/rubygems/utilities.rb +0 -436
  562. data/test/rubygems/wrong_key_cert.pem +0 -19
  563. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  564. data/test/test_changelog_generator.rb +0 -17
@@ -5,20 +5,21 @@ require_relative "user_interaction"
5
5
  class Gem::SpecificationPolicy
6
6
  include Gem::UserInteraction
7
7
 
8
- VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/.freeze # :nodoc:
8
+ VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc:
9
9
 
10
- SPECIAL_CHARACTERS = /\A[#{Regexp.escape('.-_')}]+/.freeze # :nodoc:
10
+ SPECIAL_CHARACTERS = /\A[#{Regexp.escape('.-_')}]+/ # :nodoc:
11
11
 
12
- VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z}.freeze # :nodoc:
12
+ VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z} # :nodoc:
13
13
 
14
14
  METADATA_LINK_KEYS = %w[
15
- bug_tracker_uri
16
- changelog_uri
17
- documentation_uri
18
15
  homepage_uri
19
- mailing_list_uri
16
+ changelog_uri
20
17
  source_code_uri
18
+ documentation_uri
21
19
  wiki_uri
20
+ mailing_list_uri
21
+ bug_tracker_uri
22
+ download_uri
22
23
  funding_uri
23
24
  ].freeze # :nodoc:
24
25
 
@@ -106,6 +107,8 @@ class Gem::SpecificationPolicy
106
107
 
107
108
  validate_removed_attributes
108
109
 
110
+ validate_unique_links
111
+
109
112
  if @warnings > 0
110
113
  if strict
111
114
  error "specification has warnings"
@@ -144,7 +147,7 @@ class Gem::SpecificationPolicy
144
147
  end
145
148
 
146
149
  next unless METADATA_LINK_KEYS.include? key
147
- if value !~ VALID_URI_PATTERN
150
+ unless VALID_URI_PATTERN.match?(value)
148
151
  error "#{entry} has invalid link: #{value.inspect}"
149
152
  end
150
153
  end
@@ -162,7 +165,7 @@ class Gem::SpecificationPolicy
162
165
  if prev = seen[dep.type][dep.name]
163
166
  error_messages << <<-MESSAGE
164
167
  duplicate dependency on #{dep}, (#{prev.requirement}) use:
165
- add_#{dep.type}_dependency '#{dep.name}', '#{dep.requirement}', '#{prev.requirement}'
168
+ add_#{dep.type}_dependency \"#{dep.name}\", \"#{dep.requirement}\", \"#{prev.requirement}\"
166
169
  MESSAGE
167
170
  end
168
171
 
@@ -194,7 +197,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
194
197
  prerelease_dep && !@specification.version.prerelease?
195
198
 
196
199
  open_ended = dep.requirement.requirements.all? do |op, version|
197
- !version.prerelease? && (op == ">" || op == ">=")
200
+ !version.prerelease? && [">", ">="].include?(op)
198
201
  end
199
202
 
200
203
  next unless open_ended
@@ -204,17 +207,17 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
204
207
 
205
208
  base = segments.first 2
206
209
 
207
- recommendation = if (op == ">" || op == ">=") && segments == [0]
208
- " use a bounded requirement, such as '~> x.y'"
210
+ recommendation = if [">", ">="].include?(op) && segments == [0]
211
+ " use a bounded requirement, such as \"~> x.y\""
209
212
  else
210
213
  bugfix = if op == ">"
211
- ", '> #{dep_version}'"
214
+ ", \"> #{dep_version}\""
212
215
  elsif op == ">=" && base != segments
213
- ", '>= #{dep_version}'"
216
+ ", \">= #{dep_version}\""
214
217
  end
215
218
 
216
219
  " if #{dep.name} is semantically versioned, use:\n" \
217
- " add_#{dep.type}_dependency '#{dep.name}', '~> #{base.join "."}'#{bugfix}"
220
+ " add_#{dep.type}_dependency \"#{dep.name}\", \"~> #{base.join "."}\"#{bugfix}"
218
221
  end
219
222
 
220
223
  warning_messages << ["open-ended dependency on #{dep} is not recommended", recommendation].join("\n") + "\n"
@@ -279,11 +282,11 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
279
282
 
280
283
  if !name.is_a?(String)
281
284
  error "invalid value for attribute name: \"#{name.inspect}\" must be a string"
282
- elsif name !~ /[a-zA-Z]/
285
+ elsif !/[a-zA-Z]/.match?(name)
283
286
  error "invalid value for attribute name: #{name.dump} must include at least one letter"
284
- elsif name !~ VALID_NAME_PATTERN
287
+ elsif !VALID_NAME_PATTERN.match?(name)
285
288
  error "invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores"
286
- elsif name =~ SPECIAL_CHARACTERS
289
+ elsif SPECIAL_CHARACTERS.match?(name)
287
290
  error "invalid value for attribute name: #{name.dump} can not begin with a period, dash, or underscore"
288
291
  end
289
292
  end
@@ -300,7 +303,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
300
303
  non_files = @specification.files.reject {|x| File.file?(x) || File.symlink?(x) }
301
304
 
302
305
  unless non_files.empty?
303
- error "[\"#{non_files.join '", "'}\"] are not files"
306
+ error "[\"#{non_files.join "\", \""}\"] are not files"
304
307
  end
305
308
  end
306
309
 
@@ -337,10 +340,10 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
337
340
  def validate_array_attribute(field)
338
341
  val = @specification.send(field)
339
342
  klass = case field
340
- when :dependencies then
341
- Gem::Dependency
342
- else
343
- String
343
+ when :dependencies then
344
+ Gem::Dependency
345
+ else
346
+ String
344
347
  end
345
348
 
346
349
  unless Array === val && val.all? {|x| x.is_a?(klass) || (field == :licenses && x.nil?) }
@@ -371,10 +374,21 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
371
374
 
372
375
  licenses.each do |license|
373
376
  next if Gem::Licenses.match?(license) || license.nil?
377
+ license_id_deprecated = Gem::Licenses.deprecated_license_id?(license)
378
+ exception_id_deprecated = Gem::Licenses.deprecated_exception_id?(license)
374
379
  suggestions = Gem::Licenses.suggestions(license)
380
+
381
+ if license_id_deprecated
382
+ main_message = "License identifier '#{license}' is deprecated"
383
+ elsif exception_id_deprecated
384
+ main_message = "Exception identifier at '#{license}' is deprecated"
385
+ else
386
+ main_message = "License identifier '#{license}' is invalid"
387
+ end
388
+
375
389
  message = <<-WARNING
376
- license value '#{license}' is invalid. Use a license identifier from
377
- http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license,
390
+ #{main_message}. Use an identifier from
391
+ https://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license,
378
392
  or set it to nil if you don't want to specify a license.
379
393
  WARNING
380
394
  message += "Did you mean #{suggestions.map {|s| "'#{s}'" }.join(", ")}?\n" unless suggestions.nil?
@@ -382,15 +396,15 @@ or set it to nil if you don't want to specify a license.
382
396
  end
383
397
 
384
398
  warning <<-WARNING if licenses.empty?
385
- licenses is empty, but is recommended. Use a license identifier from
386
- http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license,
399
+ licenses is empty, but is recommended. Use an license identifier from
400
+ https://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license,
387
401
  or set it to nil if you don't want to specify a license.
388
402
  WARNING
389
403
  end
390
404
 
391
405
  LAZY = '"FIxxxXME" or "TOxxxDO"'.gsub(/xxx/, "")
392
- LAZY_PATTERN = /\AFI XME|\ATO DO/x.freeze
393
- HOMEPAGE_URI_PATTERN = /\A[a-z][a-z\d+.-]*:/i.freeze
406
+ LAZY_PATTERN = /\AFI XME|\ATO DO/x
407
+ HOMEPAGE_URI_PATTERN = /\A[a-z][a-z\d+.-]*:/i
394
408
 
395
409
  def validate_lazy_metadata
396
410
  unless @specification.authors.grep(LAZY_PATTERN).empty?
@@ -401,11 +415,11 @@ or set it to nil if you don't want to specify a license.
401
415
  error "#{LAZY} is not an email"
402
416
  end
403
417
 
404
- if @specification.description =~ LAZY_PATTERN
418
+ if LAZY_PATTERN.match?(@specification.description)
405
419
  error "#{LAZY} is not a description"
406
420
  end
407
421
 
408
- if @specification.summary =~ LAZY_PATTERN
422
+ if LAZY_PATTERN.match?(@specification.summary)
409
423
  error "#{LAZY} is not a summary"
410
424
  end
411
425
 
@@ -490,6 +504,22 @@ You have specified rake based extension, but rake is not added as dependency. It
490
504
  WARNING
491
505
  end
492
506
 
507
+ def validate_unique_links
508
+ links = @specification.metadata.slice(*METADATA_LINK_KEYS)
509
+ grouped = links.group_by {|_key, uri| uri }
510
+ grouped.each do |uri, copies|
511
+ next unless copies.length > 1
512
+ keys = copies.map(&:first).join("\n ")
513
+ warning <<~WARNING
514
+ You have specified the uri:
515
+ #{uri}
516
+ for all of the following keys:
517
+ #{keys}
518
+ Only the first one will be shown on rubygems.org
519
+ WARNING
520
+ end
521
+ end
522
+
493
523
  def warning(statement) # :nodoc:
494
524
  @warnings += 1
495
525
 
@@ -69,7 +69,6 @@ class Gem::StubSpecification < Gem::BasicSpecification
69
69
 
70
70
  def initialize(filename, base_dir, gems_dir, default_gem)
71
71
  super()
72
- filename.tap(&Gem::UNTAINT)
73
72
 
74
73
  self.loaded_from = filename
75
74
  @data = nil
@@ -85,10 +84,10 @@ class Gem::StubSpecification < Gem::BasicSpecification
85
84
 
86
85
  def activated?
87
86
  @activated ||=
88
- begin
89
- loaded = Gem.loaded_specs[name]
90
- loaded && loaded.version == version
91
- end
87
+ begin
88
+ loaded = Gem.loaded_specs[name]
89
+ loaded && loaded.version == version
90
+ end
92
91
  end
93
92
 
94
93
  def default_gem?
data/lib/rubygems/text.rb CHANGED
@@ -4,7 +4,6 @@
4
4
  # A collection of text-wrangling methods
5
5
 
6
6
  module Gem::Text
7
-
8
7
  ##
9
8
  # Remove any non-printable characters and make the text suitable for
10
9
  # printing.
@@ -67,7 +66,7 @@ module Gem::Text
67
66
  str1.each_codepoint.with_index(1) do |char1, i|
68
67
  j = 0
69
68
  while j < m
70
- cost = (char1 == str2_codepoints[j]) ? 0 : 1
69
+ cost = char1 == str2_codepoints[j] ? 0 : 1
71
70
  x = min3(
72
71
  d[j + 1] + 1, # insertion
73
72
  i + 1, # deletion
@@ -0,0 +1,22 @@
1
+ Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
@@ -0,0 +1,199 @@
1
+ # frozen_string_literal: true
2
+ # Timeout long-running blocks
3
+ #
4
+ # == Synopsis
5
+ #
6
+ # require 'rubygems/timeout/lib/timeout'
7
+ # status = Gem::Timeout::timeout(5) {
8
+ # # Something that should be interrupted if it takes more than 5 seconds...
9
+ # }
10
+ #
11
+ # == Description
12
+ #
13
+ # Gem::Timeout provides a way to auto-terminate a potentially long-running
14
+ # operation if it hasn't finished in a fixed amount of time.
15
+ #
16
+ # Previous versions didn't use a module for namespacing, however
17
+ # #timeout is provided for backwards compatibility. You
18
+ # should prefer Gem::Timeout.timeout instead.
19
+ #
20
+ # == Copyright
21
+ #
22
+ # Copyright:: (C) 2000 Network Applied Communication Laboratory, Inc.
23
+ # Copyright:: (C) 2000 Information-technology Promotion Agency, Japan
24
+
25
+ module Gem::Timeout
26
+ VERSION = "0.4.1"
27
+
28
+ # Internal error raised to when a timeout is triggered.
29
+ class ExitException < Exception
30
+ def exception(*)
31
+ self
32
+ end
33
+ end
34
+
35
+ # Raised by Gem::Timeout.timeout when the block times out.
36
+ class Error < RuntimeError
37
+ def self.handle_timeout(message)
38
+ exc = ExitException.new(message)
39
+
40
+ begin
41
+ yield exc
42
+ rescue ExitException => e
43
+ raise new(message) if exc.equal?(e)
44
+ raise
45
+ end
46
+ end
47
+ end
48
+
49
+ # :stopdoc:
50
+ CONDVAR = ConditionVariable.new
51
+ QUEUE = Queue.new
52
+ QUEUE_MUTEX = Mutex.new
53
+ TIMEOUT_THREAD_MUTEX = Mutex.new
54
+ @timeout_thread = nil
55
+ private_constant :CONDVAR, :QUEUE, :QUEUE_MUTEX, :TIMEOUT_THREAD_MUTEX
56
+
57
+ class Request
58
+ attr_reader :deadline
59
+
60
+ def initialize(thread, timeout, exception_class, message)
61
+ @thread = thread
62
+ @deadline = GET_TIME.call(Process::CLOCK_MONOTONIC) + timeout
63
+ @exception_class = exception_class
64
+ @message = message
65
+
66
+ @mutex = Mutex.new
67
+ @done = false # protected by @mutex
68
+ end
69
+
70
+ def done?
71
+ @mutex.synchronize do
72
+ @done
73
+ end
74
+ end
75
+
76
+ def expired?(now)
77
+ now >= @deadline
78
+ end
79
+
80
+ def interrupt
81
+ @mutex.synchronize do
82
+ unless @done
83
+ @thread.raise @exception_class, @message
84
+ @done = true
85
+ end
86
+ end
87
+ end
88
+
89
+ def finished
90
+ @mutex.synchronize do
91
+ @done = true
92
+ end
93
+ end
94
+ end
95
+ private_constant :Request
96
+
97
+ def self.create_timeout_thread
98
+ watcher = Thread.new do
99
+ requests = []
100
+ while true
101
+ until QUEUE.empty? and !requests.empty? # wait to have at least one request
102
+ req = QUEUE.pop
103
+ requests << req unless req.done?
104
+ end
105
+ closest_deadline = requests.min_by(&:deadline).deadline
106
+
107
+ now = 0.0
108
+ QUEUE_MUTEX.synchronize do
109
+ while (now = GET_TIME.call(Process::CLOCK_MONOTONIC)) < closest_deadline and QUEUE.empty?
110
+ CONDVAR.wait(QUEUE_MUTEX, closest_deadline - now)
111
+ end
112
+ end
113
+
114
+ requests.each do |req|
115
+ req.interrupt if req.expired?(now)
116
+ end
117
+ requests.reject!(&:done?)
118
+ end
119
+ end
120
+ ThreadGroup::Default.add(watcher) unless watcher.group.enclosed?
121
+ watcher.name = "Gem::Timeout stdlib thread"
122
+ watcher.thread_variable_set(:"\0__detached_thread__", true)
123
+ watcher
124
+ end
125
+ private_class_method :create_timeout_thread
126
+
127
+ def self.ensure_timeout_thread_created
128
+ unless @timeout_thread and @timeout_thread.alive?
129
+ TIMEOUT_THREAD_MUTEX.synchronize do
130
+ unless @timeout_thread and @timeout_thread.alive?
131
+ @timeout_thread = create_timeout_thread
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ # We keep a private reference so that time mocking libraries won't break
138
+ # Gem::Timeout.
139
+ GET_TIME = Process.method(:clock_gettime)
140
+ private_constant :GET_TIME
141
+
142
+ # :startdoc:
143
+
144
+ # Perform an operation in a block, raising an error if it takes longer than
145
+ # +sec+ seconds to complete.
146
+ #
147
+ # +sec+:: Number of seconds to wait for the block to terminate. Any number
148
+ # may be used, including Floats to specify fractional seconds. A
149
+ # value of 0 or +nil+ will execute the block without any timeout.
150
+ # +klass+:: Exception Class to raise if the block fails to terminate
151
+ # in +sec+ seconds. Omitting will use the default, Gem::Timeout::Error
152
+ # +message+:: Error message to raise with Exception Class.
153
+ # Omitting will use the default, "execution expired"
154
+ #
155
+ # Returns the result of the block *if* the block completed before
156
+ # +sec+ seconds, otherwise throws an exception, based on the value of +klass+.
157
+ #
158
+ # The exception thrown to terminate the given block cannot be rescued inside
159
+ # the block unless +klass+ is given explicitly. However, the block can use
160
+ # ensure to prevent the handling of the exception. For that reason, this
161
+ # method cannot be relied on to enforce timeouts for untrusted blocks.
162
+ #
163
+ # If a scheduler is defined, it will be used to handle the timeout by invoking
164
+ # Scheduler#timeout_after.
165
+ #
166
+ # Note that this is both a method of module Gem::Timeout, so you can <tt>include
167
+ # Gem::Timeout</tt> into your classes so they have a #timeout method, as well as
168
+ # a module method, so you can call it directly as Gem::Timeout.timeout().
169
+ def timeout(sec, klass = nil, message = nil, &block) #:yield: +sec+
170
+ return yield(sec) if sec == nil or sec.zero?
171
+
172
+ message ||= "execution expired"
173
+
174
+ if Fiber.respond_to?(:current_scheduler) && (scheduler = Fiber.current_scheduler)&.respond_to?(:timeout_after)
175
+ return scheduler.timeout_after(sec, klass || Error, message, &block)
176
+ end
177
+
178
+ Gem::Timeout.ensure_timeout_thread_created
179
+ perform = Proc.new do |exc|
180
+ request = Request.new(Thread.current, sec, exc, message)
181
+ QUEUE_MUTEX.synchronize do
182
+ QUEUE << request
183
+ CONDVAR.signal
184
+ end
185
+ begin
186
+ return yield(sec)
187
+ ensure
188
+ request.finished
189
+ end
190
+ end
191
+
192
+ if klass
193
+ perform.call(klass)
194
+ else
195
+ Error.handle_timeout(message, &perform)
196
+ end
197
+ end
198
+ module_function :timeout
199
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "timeout/lib/timeout"
@@ -122,6 +122,9 @@
122
122
  #
123
123
 
124
124
  module Gem::TSort
125
+
126
+ VERSION = "0.2.0"
127
+
125
128
  class Cyclic < StandardError
126
129
  end
127
130
 
@@ -46,7 +46,7 @@ class Gem::Uninstaller
46
46
  # Constructs an uninstaller that will uninstall +gem+
47
47
 
48
48
  def initialize(gem, options = {})
49
- # TODO document the valid options
49
+ # TODO: document the valid options
50
50
  @gem = gem
51
51
  @version = options[:version] || Gem::Requirement.default
52
52
  @gem_home = File.realpath(options[:install_dir] || Gem.dir)
@@ -99,9 +99,7 @@ class Gem::Uninstaller
99
99
  raise Gem::InstallError, "gem #{@gem.inspect} is not installed"
100
100
  end
101
101
 
102
- default_specs, list = list.partition do |spec|
103
- spec.default_gem?
104
- end
102
+ default_specs, list = list.partition(&:default_gem?)
105
103
  warn_cannot_uninstall_default_gems(default_specs - list)
106
104
  @default_specs_matching_uninstall_params = default_specs
107
105
 
@@ -115,7 +113,7 @@ class Gem::Uninstaller
115
113
  if list.empty?
116
114
  return unless other_repo_specs.any?
117
115
 
118
- other_repos = other_repo_specs.map {|spec| spec.base_dir }.uniq
116
+ other_repos = other_repo_specs.map(&:base_dir).uniq
119
117
 
120
118
  message = ["#{@gem} is not installed in GEM_HOME, try:"]
121
119
  message.concat other_repos.map {|repo|
@@ -127,7 +125,7 @@ class Gem::Uninstaller
127
125
  remove_all list
128
126
 
129
127
  elsif list.size > 1
130
- gem_names = list.map {|gem| gem.full_name }
128
+ gem_names = list.map(&:full_name)
131
129
  gem_names << "All versions"
132
130
 
133
131
  say
@@ -201,8 +199,8 @@ class Gem::Uninstaller
201
199
  executables = executables.map {|exec| formatted_program_filename exec }
202
200
 
203
201
  remove = if @force_executables.nil?
204
- ask_yes_no("Remove executables:\n" +
205
- "\t#{executables.join ", "}\n\n" +
202
+ ask_yes_no("Remove executables:\n" \
203
+ "\t#{executables.join ", "}\n\n" \
206
204
  "in addition to the gem?",
207
205
  true)
208
206
  else
@@ -243,7 +241,7 @@ class Gem::Uninstaller
243
241
  unless path_ok?(@gem_home, spec) ||
244
242
  (@user_install && path_ok?(Gem.user_dir, spec))
245
243
  e = Gem::GemNotInHomeException.new \
246
- "Gem '#{spec.full_name}' is not installed in directory #{@gem_home}"
244
+ "Gem '#{spec.full_name}' is not installed in directory #{@gem_home}"
247
245
  e.spec = spec
248
246
 
249
247
  raise e
@@ -342,7 +340,7 @@ class Gem::Uninstaller
342
340
  s.name == spec.name && s.full_name != spec.full_name
343
341
  end
344
342
 
345
- spec.dependent_gems(@check_dev).each do |dep_spec, dep, satlist|
343
+ spec.dependent_gems(@check_dev).each do |dep_spec, dep, _satlist|
346
344
  unless siblings.any? {|s| s.satisfies_requirement? dep }
347
345
  msg << "#{dep_spec.name}-#{dep_spec.version} depends on #{dep}"
348
346
  end
@@ -350,7 +348,7 @@ class Gem::Uninstaller
350
348
 
351
349
  msg << "If you remove this gem, these dependencies will not be met."
352
350
  msg << "Continue with Uninstall?"
353
- return ask_yes_no(msg.join("\n"), false)
351
+ ask_yes_no(msg.join("\n"), false)
354
352
  end
355
353
 
356
354
  ##
@@ -4,15 +4,6 @@
4
4
  # Mixin methods for Gem::Command to promote available RubyGems update
5
5
 
6
6
  module Gem::UpdateSuggestion
7
- # list taken from https://github.com/watson/ci-info/blob/7a3c30d/index.js#L56-L66
8
- CI_ENV_VARS = [
9
- "CI", # Travis CI, CircleCI, Cirrus CI, Gitlab CI, Appveyor, CodeShip, dsari
10
- "CONTINUOUS_INTEGRATION", # Travis CI, Cirrus CI
11
- "BUILD_NUMBER", # Jenkins, TeamCity
12
- "CI_APP_ID", "CI_BUILD_ID", "CI_BUILD_NUMBER", # Applfow
13
- "RUN_ID" # TaskCluster, dsari
14
- ].freeze
15
-
16
7
  ONE_WEEK = 7 * 24 * 60 * 60
17
8
 
18
9
  ##
@@ -28,9 +19,9 @@ Run `gem update --system #{Gem.latest_rubygems_version}` to update your installa
28
19
  end
29
20
 
30
21
  ##
31
- # Determines if current environment is eglible for update suggestion.
22
+ # Determines if current environment is eligible for update suggestion.
32
23
 
33
- def eglible_for_update?
24
+ def eligible_for_update?
34
25
  # explicit opt-out
35
26
  return false if Gem.configuration[:prevent_update_suggestion]
36
27
  return false if ENV["RUBYGEMS_PREVENT_UPDATE_SUGGESTION"]
@@ -39,7 +30,7 @@ Run `gem update --system #{Gem.latest_rubygems_version}` to update your installa
39
30
  return false unless Gem.ui.tty?
40
31
  return false if Gem.rubygems_version.prerelease?
41
32
  return false if Gem.disable_system_update_message
42
- return false if ci?
33
+ return false if Gem::CIDetector.ci?
43
34
 
44
35
  # check makes sense only when we can store timestamp of last try
45
36
  # otherwise we will not be able to prevent "annoying" update message
@@ -53,17 +44,13 @@ Run `gem update --system #{Gem.latest_rubygems_version}` to update your installa
53
44
 
54
45
  # compare current and latest version, this is the part where
55
46
  # latest rubygems spec is fetched from remote
56
- (Gem.rubygems_version < Gem.latest_rubygems_version).tap do |eglible|
47
+ (Gem.rubygems_version < Gem.latest_rubygems_version).tap do |eligible|
57
48
  # store the time of last successful check into state file
58
49
  Gem.configuration.last_update_check = check_time
59
50
 
60
- return eglible
51
+ return eligible
61
52
  end
62
53
  rescue StandardError # don't block install command on any problem
63
54
  false
64
55
  end
65
-
66
- def ci?
67
- CI_ENV_VARS.any? {|var| ENV.include?(var) }
68
- end
69
56
  end
@@ -34,7 +34,7 @@ class Gem::UriFormatter
34
34
  # Normalize the URI by adding "http://" if it is missing.
35
35
 
36
36
  def normalize
37
- (@uri =~ /^(https?|ftp|file):/i) ? @uri : "http://#{@uri}"
37
+ /^(https?|ftp|file):/i.match?(@uri) ? @uri : "http://#{@uri}"
38
38
  end
39
39
 
40
40
  ##