rubygems-update 3.4.10 → 3.5.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (725) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +714 -4
  3. data/CODE_OF_CONDUCT.md +79 -28
  4. data/CONTRIBUTING.md +3 -3
  5. data/Manifest.txt +128 -257
  6. data/POLICIES.md +82 -13
  7. data/README.md +1 -3
  8. data/bundler/CHANGELOG.md +556 -2
  9. data/bundler/README.md +1 -2
  10. data/bundler/bundler.gemspec +4 -2
  11. data/bundler/exe/bundle +5 -22
  12. data/bundler/lib/bundler/build_metadata.rb +3 -3
  13. data/bundler/lib/bundler/capistrano.rb +1 -1
  14. data/bundler/lib/bundler/checksum.rb +254 -0
  15. data/bundler/lib/bundler/ci_detector.rb +75 -0
  16. data/bundler/lib/bundler/cli/add.rb +4 -4
  17. data/bundler/lib/bundler/cli/binstubs.rb +5 -5
  18. data/bundler/lib/bundler/cli/cache.rb +1 -1
  19. data/bundler/lib/bundler/cli/check.rb +3 -3
  20. data/bundler/lib/bundler/cli/common.rb +9 -1
  21. data/bundler/lib/bundler/cli/config.rb +8 -7
  22. data/bundler/lib/bundler/cli/console.rb +3 -2
  23. data/bundler/lib/bundler/cli/doctor.rb +2 -2
  24. data/bundler/lib/bundler/cli/exec.rb +1 -1
  25. data/bundler/lib/bundler/cli/fund.rb +1 -1
  26. data/bundler/lib/bundler/cli/gem.rb +44 -42
  27. data/bundler/lib/bundler/cli/info.rb +2 -13
  28. data/bundler/lib/bundler/cli/install.rb +18 -12
  29. data/bundler/lib/bundler/cli/issue.rb +1 -1
  30. data/bundler/lib/bundler/cli/lock.rb +33 -29
  31. data/bundler/lib/bundler/cli/open.rb +5 -7
  32. data/bundler/lib/bundler/cli/outdated.rb +23 -25
  33. data/bundler/lib/bundler/cli/platform.rb +7 -5
  34. data/bundler/lib/bundler/cli/plugin.rb +9 -15
  35. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  36. data/bundler/lib/bundler/cli/show.rb +2 -2
  37. data/bundler/lib/bundler/cli/update.rb +6 -5
  38. data/bundler/lib/bundler/cli.rb +226 -291
  39. data/bundler/lib/bundler/compact_index_client/cache.rb +55 -60
  40. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  41. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  42. data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
  43. data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
  44. data/bundler/lib/bundler/compact_index_client.rb +58 -80
  45. data/bundler/lib/bundler/constants.rb +8 -1
  46. data/bundler/lib/bundler/current_ruby.rb +5 -21
  47. data/bundler/lib/bundler/definition.rb +341 -180
  48. data/bundler/lib/bundler/dependency.rb +22 -13
  49. data/bundler/lib/bundler/digest.rb +2 -2
  50. data/bundler/lib/bundler/dsl.rb +100 -54
  51. data/bundler/lib/bundler/endpoint_specification.rb +17 -2
  52. data/bundler/lib/bundler/env.rb +4 -6
  53. data/bundler/lib/bundler/environment_preserver.rb +5 -23
  54. data/bundler/lib/bundler/errors.rb +74 -0
  55. data/bundler/lib/bundler/feature_flag.rb +0 -1
  56. data/bundler/lib/bundler/fetcher/base.rb +5 -3
  57. data/bundler/lib/bundler/fetcher/compact_index.rb +21 -34
  58. data/bundler/lib/bundler/fetcher/dependency.rb +1 -1
  59. data/bundler/lib/bundler/fetcher/downloader.rb +15 -11
  60. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  61. data/bundler/lib/bundler/fetcher/index.rb +2 -3
  62. data/bundler/lib/bundler/fetcher.rb +72 -58
  63. data/bundler/lib/bundler/force_platform.rb +0 -2
  64. data/bundler/lib/bundler/friendly_errors.rb +6 -6
  65. data/bundler/lib/bundler/gem_helper.rb +5 -6
  66. data/bundler/lib/bundler/gem_helpers.rb +21 -4
  67. data/bundler/lib/bundler/gem_version_promoter.rb +43 -39
  68. data/bundler/lib/bundler/graph.rb +9 -9
  69. data/bundler/lib/bundler/index.rb +63 -33
  70. data/bundler/lib/bundler/injector.rb +6 -8
  71. data/bundler/lib/bundler/inline.rb +33 -12
  72. data/bundler/lib/bundler/installer/gem_installer.rb +13 -12
  73. data/bundler/lib/bundler/installer/parallel_installer.rb +19 -36
  74. data/bundler/lib/bundler/installer/standalone.rb +16 -6
  75. data/bundler/lib/bundler/installer.rb +29 -33
  76. data/bundler/lib/bundler/lazy_specification.rb +31 -17
  77. data/bundler/lib/bundler/lockfile_generator.rb +10 -1
  78. data/bundler/lib/bundler/lockfile_parser.rb +110 -45
  79. data/bundler/lib/bundler/man/bundle-add.1 +29 -41
  80. data/bundler/lib/bundler/man/bundle-add.1.ronn +37 -14
  81. data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
  82. data/bundler/lib/bundler/man/bundle-cache.1 +5 -26
  83. data/bundler/lib/bundler/man/bundle-cache.1.ronn +2 -2
  84. data/bundler/lib/bundler/man/bundle-check.1 +5 -12
  85. data/bundler/lib/bundler/man/bundle-check.1.ronn +3 -0
  86. data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
  87. data/bundler/lib/bundler/man/bundle-config.1 +21 -217
  88. data/bundler/lib/bundler/man/bundle-config.1.ronn +9 -9
  89. data/bundler/lib/bundler/man/bundle-console.1 +4 -22
  90. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
  91. data/bundler/lib/bundler/man/bundle-exec.1 +13 -74
  92. data/bundler/lib/bundler/man/bundle-exec.1.ronn +2 -3
  93. data/bundler/lib/bundler/man/bundle-gem.1 +19 -49
  94. data/bundler/lib/bundler/man/bundle-gem.1.ronn +11 -0
  95. data/bundler/lib/bundler/man/bundle-help.1 +3 -7
  96. data/bundler/lib/bundler/man/bundle-info.1 +5 -11
  97. data/bundler/lib/bundler/man/bundle-info.1.ronn +3 -3
  98. data/bundler/lib/bundler/man/bundle-init.1 +3 -12
  99. data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
  100. data/bundler/lib/bundler/man/bundle-install.1 +29 -127
  101. data/bundler/lib/bundler/man/bundle-install.1.ronn +3 -2
  102. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  103. data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
  104. data/bundler/lib/bundler/man/bundle-open.1 +7 -27
  105. data/bundler/lib/bundler/man/bundle-outdated.1 +15 -63
  106. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +12 -8
  107. data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
  108. data/bundler/lib/bundler/man/bundle-plugin.1 +24 -47
  109. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +12 -8
  110. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  111. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  112. data/bundler/lib/bundler/man/bundle-show.1 +3 -10
  113. data/bundler/lib/bundler/man/bundle-update.1 +18 -137
  114. data/bundler/lib/bundler/man/bundle-version.1 +3 -16
  115. data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
  116. data/bundler/lib/bundler/man/bundle.1 +5 -44
  117. data/bundler/lib/bundler/man/gemfile.5 +43 -294
  118. data/bundler/lib/bundler/man/gemfile.5.ronn +23 -3
  119. data/bundler/lib/bundler/match_metadata.rb +4 -0
  120. data/bundler/lib/bundler/match_platform.rb +1 -1
  121. data/bundler/lib/bundler/mirror.rb +3 -3
  122. data/bundler/lib/bundler/plugin/api/source.rb +7 -5
  123. data/bundler/lib/bundler/plugin/index.rb +9 -1
  124. data/bundler/lib/bundler/plugin/installer/path.rb +18 -0
  125. data/bundler/lib/bundler/plugin/installer.rb +37 -17
  126. data/bundler/lib/bundler/plugin/source_list.rb +4 -4
  127. data/bundler/lib/bundler/plugin.rb +13 -6
  128. data/bundler/lib/bundler/remote_specification.rb +4 -0
  129. data/bundler/lib/bundler/resolver/base.rb +12 -4
  130. data/bundler/lib/bundler/resolver/candidate.rb +5 -17
  131. data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
  132. data/bundler/lib/bundler/resolver/package.rb +19 -1
  133. data/bundler/lib/bundler/resolver/spec_group.rb +21 -6
  134. data/bundler/lib/bundler/resolver.rb +174 -64
  135. data/bundler/lib/bundler/retry.rb +2 -2
  136. data/bundler/lib/bundler/ruby_dsl.rb +42 -7
  137. data/bundler/lib/bundler/ruby_version.rb +18 -5
  138. data/bundler/lib/bundler/rubygems_ext.rb +173 -71
  139. data/bundler/lib/bundler/rubygems_gem_installer.rb +56 -57
  140. data/bundler/lib/bundler/rubygems_integration.rb +35 -112
  141. data/bundler/lib/bundler/runtime.rb +5 -10
  142. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  143. data/bundler/lib/bundler/self_manager.rb +49 -11
  144. data/bundler/lib/bundler/settings.rb +136 -49
  145. data/bundler/lib/bundler/setup.rb +10 -1
  146. data/bundler/lib/bundler/shared_helpers.rb +56 -17
  147. data/bundler/lib/bundler/source/git/git_proxy.rb +91 -32
  148. data/bundler/lib/bundler/source/git.rb +108 -39
  149. data/bundler/lib/bundler/source/metadata.rb +17 -15
  150. data/bundler/lib/bundler/source/path.rb +10 -20
  151. data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
  152. data/bundler/lib/bundler/source/rubygems.rb +87 -92
  153. data/bundler/lib/bundler/source.rb +3 -1
  154. data/bundler/lib/bundler/source_list.rb +26 -6
  155. data/bundler/lib/bundler/spec_set.rb +112 -30
  156. data/bundler/lib/bundler/stub_specification.rb +26 -4
  157. data/bundler/lib/bundler/templates/Executable.bundler +1 -1
  158. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  159. data/bundler/lib/bundler/templates/newgem/README.md.tt +7 -3
  160. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +8 -8
  161. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  162. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  163. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +5 -0
  164. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  165. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +4 -4
  166. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +1 -1
  167. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +5 -3
  168. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  169. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  170. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  171. data/bundler/lib/bundler/ui/shell.rb +25 -3
  172. data/bundler/lib/bundler/ui/silent.rb +12 -1
  173. data/bundler/lib/bundler/uri_credentials_filter.rb +2 -2
  174. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  175. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  176. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +9 -21
  177. data/bundler/lib/bundler/vendor/net-http-persistent/.document +1 -0
  178. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  179. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  180. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  181. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +102 -64
  182. data/bundler/lib/bundler/vendor/pub_grub/.document +1 -0
  183. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
  184. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +9 -4
  185. data/bundler/lib/bundler/vendor/securerandom/.document +1 -0
  186. data/bundler/lib/bundler/vendor/securerandom/lib/random/formatter.rb +373 -0
  187. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +96 -0
  188. data/bundler/lib/bundler/vendor/thor/.document +1 -0
  189. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  190. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  191. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  192. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +8 -10
  193. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  194. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  195. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  196. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  197. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  198. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  199. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  200. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  201. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  202. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
  203. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  204. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
  205. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +44 -6
  206. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  207. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  208. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +26 -150
  209. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
  210. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  211. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +0 -45
  212. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  213. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  214. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  215. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  216. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  217. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  218. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +155 -8
  219. data/bundler/lib/bundler/vendor/tsort/.document +1 -0
  220. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  221. data/bundler/lib/bundler/vendor/uri/.document +1 -0
  222. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +258 -132
  223. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  224. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +2 -2
  225. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +96 -32
  226. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  227. data/bundler/lib/bundler/vendored_net_http.rb +23 -0
  228. data/bundler/lib/bundler/vendored_persistent.rb +0 -4
  229. data/bundler/lib/bundler/vendored_securerandom.rb +14 -0
  230. data/bundler/lib/bundler/vendored_timeout.rb +12 -0
  231. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  232. data/bundler/lib/bundler/version.rb +1 -1
  233. data/bundler/lib/bundler/vlad.rb +1 -1
  234. data/bundler/lib/bundler/yaml_serializer.rb +22 -13
  235. data/bundler/lib/bundler.rb +108 -81
  236. data/{bin → exe}/gem +2 -0
  237. data/{bin → exe}/update_rubygems +8 -6
  238. data/lib/rubygems/available_set.rb +6 -5
  239. data/lib/rubygems/basic_specification.rb +81 -44
  240. data/lib/rubygems/bundler_version_finder.rb +6 -6
  241. data/lib/rubygems/ci_detector.rb +75 -0
  242. data/lib/rubygems/command.rb +32 -36
  243. data/lib/rubygems/command_manager.rb +13 -12
  244. data/lib/rubygems/commands/build_command.rb +5 -13
  245. data/lib/rubygems/commands/cert_command.rb +6 -6
  246. data/lib/rubygems/commands/check_command.rb +10 -5
  247. data/lib/rubygems/commands/cleanup_command.rb +15 -26
  248. data/lib/rubygems/commands/contents_command.rb +21 -13
  249. data/lib/rubygems/commands/dependency_command.rb +7 -8
  250. data/lib/rubygems/commands/environment_command.rb +4 -5
  251. data/lib/rubygems/commands/exec_command.rb +3 -7
  252. data/lib/rubygems/commands/fetch_command.rb +17 -2
  253. data/lib/rubygems/commands/generate_index_command.rb +40 -74
  254. data/lib/rubygems/commands/help_command.rb +9 -8
  255. data/lib/rubygems/commands/info_command.rb +2 -2
  256. data/lib/rubygems/commands/install_command.rb +9 -20
  257. data/lib/rubygems/commands/list_command.rb +3 -2
  258. data/lib/rubygems/commands/lock_command.rb +2 -1
  259. data/lib/rubygems/commands/mirror_command.rb +1 -0
  260. data/lib/rubygems/commands/open_command.rb +2 -3
  261. data/lib/rubygems/commands/outdated_command.rb +1 -0
  262. data/lib/rubygems/commands/owner_command.rb +11 -10
  263. data/lib/rubygems/commands/pristine_command.rb +41 -29
  264. data/lib/rubygems/commands/push_command.rb +3 -2
  265. data/lib/rubygems/commands/query_command.rb +5 -5
  266. data/lib/rubygems/commands/rdoc_command.rb +4 -10
  267. data/lib/rubygems/commands/rebuild_command.rb +264 -0
  268. data/lib/rubygems/commands/search_command.rb +3 -2
  269. data/lib/rubygems/commands/server_command.rb +1 -0
  270. data/lib/rubygems/commands/setup_command.rb +41 -39
  271. data/lib/rubygems/commands/signin_command.rb +1 -0
  272. data/lib/rubygems/commands/signout_command.rb +1 -0
  273. data/lib/rubygems/commands/sources_command.rb +15 -14
  274. data/lib/rubygems/commands/specification_command.rb +16 -11
  275. data/lib/rubygems/commands/stale_command.rb +3 -2
  276. data/lib/rubygems/commands/uninstall_command.rb +25 -21
  277. data/lib/rubygems/commands/unpack_command.rb +12 -13
  278. data/lib/rubygems/commands/update_command.rb +26 -30
  279. data/lib/rubygems/commands/which_command.rb +2 -1
  280. data/lib/rubygems/commands/yank_command.rb +3 -2
  281. data/lib/rubygems/compatibility.rb +5 -6
  282. data/lib/rubygems/config_file.rb +95 -30
  283. data/lib/rubygems/core_ext/kernel_gem.rb +2 -4
  284. data/lib/rubygems/core_ext/kernel_require.rb +31 -50
  285. data/lib/rubygems/core_ext/kernel_warn.rb +4 -5
  286. data/lib/rubygems/core_ext/tcpsocket_init.rb +3 -1
  287. data/lib/rubygems/defaults.rb +27 -10
  288. data/lib/rubygems/dependency.rb +25 -30
  289. data/lib/rubygems/dependency_installer.rb +39 -43
  290. data/lib/rubygems/dependency_list.rb +3 -2
  291. data/lib/rubygems/deprecate.rb +80 -75
  292. data/lib/rubygems/doctor.rb +8 -7
  293. data/lib/rubygems/errors.rb +6 -8
  294. data/lib/rubygems/exceptions.rb +15 -5
  295. data/lib/rubygems/ext/build_error.rb +1 -0
  296. data/lib/rubygems/ext/builder.rb +24 -18
  297. data/lib/rubygems/ext/cargo_builder.rb +10 -25
  298. data/lib/rubygems/ext/configure_builder.rb +1 -0
  299. data/lib/rubygems/ext/ext_conf_builder.rb +3 -4
  300. data/lib/rubygems/ext/rake_builder.rb +5 -3
  301. data/lib/rubygems/ext.rb +1 -0
  302. data/lib/rubygems/gem_runner.rb +10 -5
  303. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  304. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  305. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +80 -0
  306. data/lib/rubygems/gemcutter_utilities.rb +105 -43
  307. data/lib/rubygems/gemspec_helpers.rb +19 -0
  308. data/lib/rubygems/install_default_message.rb +1 -0
  309. data/lib/rubygems/install_message.rb +1 -0
  310. data/lib/rubygems/install_update_options.rb +20 -20
  311. data/lib/rubygems/installer.rb +112 -85
  312. data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
  313. data/lib/rubygems/local_remote_options.rb +15 -17
  314. data/lib/rubygems/name_tuple.rb +8 -9
  315. data/lib/rubygems/package/digest_io.rb +2 -1
  316. data/lib/rubygems/package/file_source.rb +1 -0
  317. data/lib/rubygems/package/io_source.rb +1 -0
  318. data/lib/rubygems/package/old.rb +3 -2
  319. data/lib/rubygems/package/source.rb +1 -0
  320. data/lib/rubygems/package/tar_header.rb +64 -41
  321. data/lib/rubygems/package/tar_reader/entry.rb +24 -24
  322. data/lib/rubygems/package/tar_reader.rb +15 -10
  323. data/lib/rubygems/package/tar_writer.rb +22 -19
  324. data/lib/rubygems/package.rb +69 -47
  325. data/lib/rubygems/package_task.rb +3 -2
  326. data/lib/rubygems/path_support.rb +11 -11
  327. data/lib/rubygems/platform.rb +73 -50
  328. data/lib/rubygems/psych_tree.rb +1 -0
  329. data/lib/rubygems/query_utils.rb +13 -15
  330. data/lib/rubygems/rdoc.rb +1 -0
  331. data/lib/rubygems/remote_fetcher.rb +30 -22
  332. data/lib/rubygems/request/connection_pools.rb +3 -3
  333. data/lib/rubygems/request/http_pool.rb +1 -0
  334. data/lib/rubygems/request/https_pool.rb +1 -0
  335. data/lib/rubygems/request.rb +29 -25
  336. data/lib/rubygems/request_set/gem_dependency_api.rb +122 -124
  337. data/lib/rubygems/request_set/lockfile/parser.rb +11 -10
  338. data/lib/rubygems/request_set/lockfile/tokenizer.rb +22 -12
  339. data/lib/rubygems/request_set/lockfile.rb +7 -11
  340. data/lib/rubygems/request_set.rb +11 -9
  341. data/lib/rubygems/requirement.rb +16 -10
  342. data/lib/rubygems/resolver/activation_request.rb +5 -8
  343. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  344. data/lib/rubygems/resolver/api_set.rb +16 -9
  345. data/lib/rubygems/resolver/api_specification.rb +2 -1
  346. data/lib/rubygems/resolver/best_set.rb +1 -28
  347. data/lib/rubygems/resolver/composed_set.rb +2 -1
  348. data/lib/rubygems/resolver/conflict.rb +5 -12
  349. data/lib/rubygems/resolver/current_set.rb +1 -0
  350. data/lib/rubygems/resolver/dependency_request.rb +1 -0
  351. data/lib/rubygems/resolver/git_set.rb +1 -0
  352. data/lib/rubygems/resolver/git_specification.rb +1 -0
  353. data/lib/rubygems/resolver/index_set.rb +5 -4
  354. data/lib/rubygems/resolver/index_specification.rb +3 -2
  355. data/lib/rubygems/resolver/installed_specification.rb +2 -1
  356. data/lib/rubygems/resolver/installer_set.rb +9 -7
  357. data/lib/rubygems/resolver/local_specification.rb +2 -1
  358. data/lib/rubygems/resolver/lock_set.rb +2 -1
  359. data/lib/rubygems/resolver/lock_specification.rb +1 -0
  360. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  361. data/lib/rubygems/resolver/set.rb +1 -0
  362. data/lib/rubygems/resolver/source_set.rb +2 -0
  363. data/lib/rubygems/resolver/spec_specification.rb +8 -0
  364. data/lib/rubygems/resolver/specification.rb +1 -0
  365. data/lib/rubygems/resolver/stats.rb +1 -0
  366. data/lib/rubygems/resolver/vendor_set.rb +1 -0
  367. data/lib/rubygems/resolver/vendor_specification.rb +1 -0
  368. data/lib/rubygems/resolver.rb +11 -17
  369. data/lib/rubygems/s3_uri_signer.rb +13 -11
  370. data/lib/rubygems/safe_marshal/elements.rb +146 -0
  371. data/lib/rubygems/safe_marshal/reader.rb +308 -0
  372. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  373. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +415 -0
  374. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  375. data/lib/rubygems/safe_marshal.rb +74 -0
  376. data/lib/rubygems/safe_yaml.rb +14 -26
  377. data/lib/rubygems/security/policies.rb +37 -38
  378. data/lib/rubygems/security/policy.rb +8 -11
  379. data/lib/rubygems/security/signer.rb +12 -3
  380. data/lib/rubygems/security/trust_dir.rb +10 -11
  381. data/lib/rubygems/security.rb +12 -25
  382. data/lib/rubygems/security_option.rb +2 -1
  383. data/lib/rubygems/shellwords.rb +3 -0
  384. data/lib/rubygems/source/git.rb +10 -10
  385. data/lib/rubygems/source/installed.rb +4 -3
  386. data/lib/rubygems/source/local.rb +48 -48
  387. data/lib/rubygems/source/lock.rb +2 -3
  388. data/lib/rubygems/source/specific_file.rb +6 -4
  389. data/lib/rubygems/source/vendor.rb +1 -2
  390. data/lib/rubygems/source.rb +28 -22
  391. data/lib/rubygems/source_list.rb +8 -8
  392. data/lib/rubygems/spec_fetcher.rb +46 -56
  393. data/lib/rubygems/specification.rb +252 -309
  394. data/lib/rubygems/specification_policy.rb +120 -67
  395. data/lib/rubygems/specification_record.rb +212 -0
  396. data/lib/rubygems/stub_specification.rb +48 -22
  397. data/lib/rubygems/text.rb +1 -2
  398. data/lib/rubygems/uninstaller.rb +52 -32
  399. data/lib/rubygems/update_suggestion.rb +6 -19
  400. data/lib/rubygems/uri.rb +6 -6
  401. data/lib/rubygems/uri_formatter.rb +1 -1
  402. data/lib/rubygems/user_interaction.rb +23 -27
  403. data/lib/rubygems/util/licenses.rb +297 -35
  404. data/lib/rubygems/util/list.rb +4 -1
  405. data/lib/rubygems/util.rb +9 -6
  406. data/lib/rubygems/validator.rb +11 -10
  407. data/lib/rubygems/vendor/molinillo/.document +1 -0
  408. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  409. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  410. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  411. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  412. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  413. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  414. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  415. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  416. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  417. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  418. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  419. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  420. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/errors.rb +1 -1
  421. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  422. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  423. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/ui.rb +1 -1
  424. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolution.rb +4 -4
  425. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolver.rb +1 -1
  426. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/state.rb +1 -1
  427. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo.rb +2 -2
  428. data/lib/rubygems/vendor/net-http/.document +1 -0
  429. data/lib/rubygems/vendor/net-http/LICENSE.txt +22 -0
  430. data/lib/rubygems/vendor/net-http/lib/net/http/backward.rb +40 -0
  431. data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +34 -0
  432. data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +414 -0
  433. data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +981 -0
  434. data/lib/rubygems/vendor/net-http/lib/net/http/proxy_delta.rb +17 -0
  435. data/lib/rubygems/vendor/net-http/lib/net/http/request.rb +88 -0
  436. data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +425 -0
  437. data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +738 -0
  438. data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +1174 -0
  439. data/lib/rubygems/vendor/net-http/lib/net/http/status.rb +84 -0
  440. data/lib/rubygems/vendor/net-http/lib/net/http.rb +2496 -0
  441. data/lib/rubygems/vendor/net-http/lib/net/https.rb +23 -0
  442. data/lib/rubygems/vendor/net-protocol/.document +1 -0
  443. data/lib/rubygems/vendor/net-protocol/LICENSE.txt +22 -0
  444. data/lib/rubygems/vendor/net-protocol/lib/net/protocol.rb +544 -0
  445. data/lib/rubygems/vendor/optparse/.document +1 -0
  446. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  447. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +49 -27
  448. data/lib/rubygems/vendor/resolv/.document +1 -0
  449. data/lib/rubygems/vendor/resolv/LICENSE.txt +22 -0
  450. data/lib/rubygems/vendor/resolv/lib/resolv.rb +3442 -0
  451. data/lib/rubygems/vendor/securerandom/.document +1 -0
  452. data/lib/rubygems/vendor/securerandom/LICENSE.txt +22 -0
  453. data/lib/rubygems/vendor/securerandom/lib/random/formatter.rb +373 -0
  454. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +96 -0
  455. data/lib/rubygems/vendor/timeout/.document +1 -0
  456. data/lib/rubygems/vendor/timeout/LICENSE.txt +22 -0
  457. data/lib/rubygems/vendor/timeout/lib/timeout.rb +199 -0
  458. data/lib/rubygems/vendor/tsort/.document +1 -0
  459. data/lib/rubygems/vendor/tsort/LICENSE.txt +22 -0
  460. data/lib/rubygems/{tsort → vendor/tsort}/lib/tsort.rb +5 -2
  461. data/lib/rubygems/vendor/uri/.document +1 -0
  462. data/lib/rubygems/vendor/uri/LICENSE.txt +22 -0
  463. data/lib/rubygems/vendor/uri/lib/uri/common.rb +855 -0
  464. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  465. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  466. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1588 -0
  467. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  468. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  469. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  470. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  471. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  472. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +539 -0
  473. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +183 -0
  474. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  475. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  476. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  477. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  478. data/lib/rubygems/vendored_molinillo.rb +3 -0
  479. data/lib/rubygems/vendored_net_http.rb +5 -0
  480. data/lib/rubygems/vendored_optparse.rb +3 -0
  481. data/lib/rubygems/vendored_securerandom.rb +4 -0
  482. data/lib/rubygems/vendored_timeout.rb +5 -0
  483. data/lib/rubygems/vendored_tsort.rb +3 -0
  484. data/lib/rubygems/version.rb +38 -31
  485. data/lib/rubygems/version_option.rb +3 -5
  486. data/lib/rubygems/yaml_serializer.rb +98 -0
  487. data/lib/rubygems.rb +99 -72
  488. data/rubygems-update.gemspec +15 -8
  489. data/setup.rb +4 -1
  490. metadata +169 -267
  491. data/lib/rubygems/indexer.rb +0 -427
  492. data/lib/rubygems/mock_gem_ui.rb +0 -85
  493. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  494. data/lib/rubygems/optparse.rb +0 -3
  495. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  496. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  497. data/lib/rubygems/resolver/molinillo.rb +0 -2
  498. data/lib/rubygems/tsort.rb +0 -3
  499. data/test/rubygems/alternate_cert.pem +0 -19
  500. data/test/rubygems/alternate_cert_32.pem +0 -19
  501. data/test/rubygems/alternate_key.pem +0 -27
  502. data/test/rubygems/bad_rake.rb +0 -2
  503. data/test/rubygems/bundler_test_gem.rb +0 -419
  504. data/test/rubygems/ca_cert.pem +0 -77
  505. data/test/rubygems/child_cert.pem +0 -19
  506. data/test/rubygems/child_cert_32.pem +0 -19
  507. data/test/rubygems/child_key.pem +0 -27
  508. data/test/rubygems/client.pem +0 -107
  509. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  510. data/test/rubygems/data/gem-private_key.pem +0 -27
  511. data/test/rubygems/data/gem-public_cert.pem +0 -20
  512. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  513. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  514. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  515. data/test/rubygems/encrypted_private_key.pem +0 -30
  516. data/test/rubygems/expired_cert.pem +0 -19
  517. data/test/rubygems/fake_certlib/openssl.rb +0 -8
  518. data/test/rubygems/foo/discover.rb +0 -1
  519. data/test/rubygems/future_cert.pem +0 -19
  520. data/test/rubygems/future_cert_32.pem +0 -19
  521. data/test/rubygems/good_rake.rb +0 -2
  522. data/test/rubygems/grandchild_cert.pem +0 -19
  523. data/test/rubygems/grandchild_cert_32.pem +0 -19
  524. data/test/rubygems/grandchild_key.pem +0 -27
  525. data/test/rubygems/helper.rb +0 -1629
  526. data/test/rubygems/installer_test_case.rb +0 -247
  527. data/test/rubygems/invalid_client.pem +0 -49
  528. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  529. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  530. data/test/rubygems/invalid_key.pem +0 -27
  531. data/test/rubygems/invalid_signer_cert.pem +0 -19
  532. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  533. data/test/rubygems/invalidchild_cert.pem +0 -19
  534. data/test/rubygems/invalidchild_cert_32.pem +0 -19
  535. data/test/rubygems/invalidchild_key.pem +0 -27
  536. data/test/rubygems/package/tar_test_case.rb +0 -174
  537. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  538. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  539. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  540. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
  541. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
  542. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
  543. data/test/rubygems/private3072_key.pem +0 -40
  544. data/test/rubygems/private_ec_key.pem +0 -9
  545. data/test/rubygems/private_key.pem +0 -27
  546. data/test/rubygems/public3072_cert.pem +0 -25
  547. data/test/rubygems/public_cert.pem +0 -20
  548. data/test/rubygems/public_cert_32.pem +0 -19
  549. data/test/rubygems/public_key.pem +0 -9
  550. data/test/rubygems/rubygems/commands/crash_command.rb +0 -4
  551. data/test/rubygems/rubygems_plugin.rb +0 -23
  552. data/test/rubygems/sff/discover.rb +0 -1
  553. data/test/rubygems/simple_gem.rb +0 -67
  554. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -7
  555. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  556. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -12
  557. data/test/rubygems/ssl_cert.pem +0 -80
  558. data/test/rubygems/ssl_key.pem +0 -27
  559. data/test/rubygems/test_bundled_ca.rb +0 -60
  560. data/test/rubygems/test_config.rb +0 -27
  561. data/test/rubygems/test_deprecate.rb +0 -157
  562. data/test/rubygems/test_exit.rb +0 -17
  563. data/test/rubygems/test_gem.rb +0 -1766
  564. data/test/rubygems/test_gem_available_set.rb +0 -129
  565. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -126
  566. data/test/rubygems/test_gem_command.rb +0 -400
  567. data/test/rubygems/test_gem_command_manager.rb +0 -399
  568. data/test/rubygems/test_gem_commands_build_command.rb +0 -737
  569. data/test/rubygems/test_gem_commands_cert_command.rb +0 -865
  570. data/test/rubygems/test_gem_commands_check_command.rb +0 -67
  571. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -291
  572. data/test/rubygems/test_gem_commands_contents_command.rb +0 -270
  573. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -227
  574. data/test/rubygems/test_gem_commands_environment_command.rb +0 -167
  575. data/test/rubygems/test_gem_commands_exec_command.rb +0 -851
  576. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -257
  577. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -80
  578. data/test/rubygems/test_gem_commands_help_command.rb +0 -93
  579. data/test/rubygems/test_gem_commands_info_command.rb +0 -69
  580. data/test/rubygems/test_gem_commands_install_command.rb +0 -1572
  581. data/test/rubygems/test_gem_commands_list_command.rb +0 -32
  582. data/test/rubygems/test_gem_commands_lock_command.rb +0 -66
  583. data/test/rubygems/test_gem_commands_mirror.rb +0 -19
  584. data/test/rubygems/test_gem_commands_open_command.rb +0 -97
  585. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -49
  586. data/test/rubygems/test_gem_commands_owner_command.rb +0 -407
  587. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -707
  588. data/test/rubygems/test_gem_commands_push_command.rb +0 -498
  589. data/test/rubygems/test_gem_commands_query_command.rb +0 -857
  590. data/test/rubygems/test_gem_commands_search_command.rb +0 -15
  591. data/test/rubygems/test_gem_commands_server_command.rb +0 -19
  592. data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
  593. data/test/rubygems/test_gem_commands_signin_command.rb +0 -258
  594. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  595. data/test/rubygems/test_gem_commands_sources_command.rb +0 -533
  596. data/test/rubygems/test_gem_commands_specification_command.rb +0 -276
  597. data/test/rubygems/test_gem_commands_stale_command.rb +0 -42
  598. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -521
  599. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -223
  600. data/test/rubygems/test_gem_commands_update_command.rb +0 -835
  601. data/test/rubygems/test_gem_commands_which_command.rb +0 -84
  602. data/test/rubygems/test_gem_commands_yank_command.rb +0 -180
  603. data/test/rubygems/test_gem_config_file.rb +0 -516
  604. data/test/rubygems/test_gem_dependency.rb +0 -397
  605. data/test/rubygems/test_gem_dependency_installer.rb +0 -1155
  606. data/test/rubygems/test_gem_dependency_list.rb +0 -264
  607. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -26
  608. data/test/rubygems/test_gem_doctor.rb +0 -194
  609. data/test/rubygems/test_gem_ext_builder.rb +0 -336
  610. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  611. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -8
  612. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -233
  613. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
  614. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
  615. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -1
  616. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  617. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -247
  618. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  619. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -8
  620. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
  621. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -166
  622. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -33
  623. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
  624. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -83
  625. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -79
  626. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
  627. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -112
  628. data/test/rubygems/test_gem_gem_runner.rb +0 -118
  629. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -276
  630. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -59
  631. data/test/rubygems/test_gem_indexer.rb +0 -380
  632. data/test/rubygems/test_gem_install_update_options.rb +0 -207
  633. data/test/rubygems/test_gem_installer.rb +0 -2463
  634. data/test/rubygems/test_gem_local_remote_options.rb +0 -132
  635. data/test/rubygems/test_gem_name_tuple.rb +0 -42
  636. data/test/rubygems/test_gem_package.rb +0 -1190
  637. data/test/rubygems/test_gem_package_old.rb +0 -90
  638. data/test/rubygems/test_gem_package_tar_header.rb +0 -225
  639. data/test/rubygems/test_gem_package_tar_reader.rb +0 -134
  640. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -297
  641. data/test/rubygems/test_gem_package_tar_writer.rb +0 -330
  642. data/test/rubygems/test_gem_package_task.rb +0 -117
  643. data/test/rubygems/test_gem_path_support.rb +0 -138
  644. data/test/rubygems/test_gem_platform.rb +0 -496
  645. data/test/rubygems/test_gem_rdoc.rb +0 -136
  646. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1226
  647. data/test/rubygems/test_gem_request.rb +0 -541
  648. data/test/rubygems/test_gem_request_connection_pools.rb +0 -150
  649. data/test/rubygems/test_gem_request_set.rb +0 -671
  650. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -845
  651. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -468
  652. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -543
  653. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
  654. data/test/rubygems/test_gem_requirement.rb +0 -504
  655. data/test/rubygems/test_gem_resolver.rb +0 -858
  656. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -42
  657. data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
  658. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -166
  659. data/test/rubygems/test_gem_resolver_best_set.rb +0 -158
  660. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -43
  661. data/test/rubygems/test_gem_resolver_conflict.rb +0 -81
  662. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -82
  663. data/test/rubygems/test_gem_resolver_git_set.rb +0 -187
  664. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -113
  665. data/test/rubygems/test_gem_resolver_index_set.rb +0 -87
  666. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -92
  667. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -46
  668. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -319
  669. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -43
  670. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -61
  671. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -97
  672. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -18
  673. data/test/rubygems/test_gem_resolver_specification.rb +0 -62
  674. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -81
  675. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -81
  676. data/test/rubygems/test_gem_security.rb +0 -340
  677. data/test/rubygems/test_gem_security_policy.rb +0 -535
  678. data/test/rubygems/test_gem_security_signer.rb +0 -217
  679. data/test/rubygems/test_gem_security_trust_dir.rb +0 -98
  680. data/test/rubygems/test_gem_silent_ui.rb +0 -122
  681. data/test/rubygems/test_gem_source.rb +0 -253
  682. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -36
  683. data/test/rubygems/test_gem_source_git.rb +0 -309
  684. data/test/rubygems/test_gem_source_installed.rb +0 -34
  685. data/test/rubygems/test_gem_source_list.rb +0 -118
  686. data/test/rubygems/test_gem_source_local.rb +0 -106
  687. data/test/rubygems/test_gem_source_lock.rb +0 -112
  688. data/test/rubygems/test_gem_source_specific_file.rb +0 -75
  689. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -49
  690. data/test/rubygems/test_gem_source_vendor.rb +0 -29
  691. data/test/rubygems/test_gem_spec_fetcher.rb +0 -337
  692. data/test/rubygems/test_gem_specification.rb +0 -3811
  693. data/test/rubygems/test_gem_stream_ui.rb +0 -224
  694. data/test/rubygems/test_gem_stub_specification.rb +0 -277
  695. data/test/rubygems/test_gem_text.rb +0 -102
  696. data/test/rubygems/test_gem_uninstaller.rb +0 -674
  697. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -30
  698. data/test/rubygems/test_gem_update_suggestion.rb +0 -208
  699. data/test/rubygems/test_gem_uri.rb +0 -39
  700. data/test/rubygems/test_gem_uri_formatter.rb +0 -26
  701. data/test/rubygems/test_gem_util.rb +0 -90
  702. data/test/rubygems/test_gem_validator.rb +0 -42
  703. data/test/rubygems/test_gem_version.rb +0 -302
  704. data/test/rubygems/test_gem_version_option.rb +0 -164
  705. data/test/rubygems/test_kernel.rb +0 -123
  706. data/test/rubygems/test_project_sanity.rb +0 -20
  707. data/test/rubygems/test_remote_fetch_error.rb +0 -19
  708. data/test/rubygems/test_require.rb +0 -733
  709. data/test/rubygems/test_rubygems.rb +0 -74
  710. data/test/rubygems/utilities.rb +0 -393
  711. data/test/rubygems/wrong_key_cert.pem +0 -19
  712. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  713. data/test/test_changelog_generator.rb +0 -17
  714. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/connection_pool}/.document +0 -0
  715. /data/{lib/rubygems/tsort → bundler/lib/bundler/vendor/fileutils}/.document +0 -0
  716. /data/{lib/rubygems/tsort → bundler/lib/bundler/vendor/securerandom}/LICENSE.txt +0 -0
  717. /data/lib/rubygems/{resolver → vendor}/molinillo/LICENSE +0 -0
  718. /data/lib/rubygems/{optparse → vendor/optparse}/COPYING +0 -0
  719. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  720. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +0 -0
  721. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  722. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +0 -0
  723. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  724. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  725. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +0 -0
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  #
3
4
  #--
4
5
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
@@ -10,8 +11,11 @@ require_relative "deprecate"
10
11
  require_relative "basic_specification"
11
12
  require_relative "stub_specification"
12
13
  require_relative "platform"
14
+ require_relative "specification_record"
13
15
  require_relative "util/list"
14
16
 
17
+ require "rbconfig"
18
+
15
19
  ##
16
20
  # The Specification class contains the information for a gem. Typically
17
21
  # defined in a .gemspec file or a Rakefile, and looks like this:
@@ -105,7 +109,7 @@ class Gem::Specification < Gem::BasicSpecification
105
109
  @load_cache = {} # :nodoc:
106
110
  @load_cache_mutex = Thread::Mutex.new
107
111
 
108
- VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/.freeze # :nodoc:
112
+ VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc:
109
113
 
110
114
  # :startdoc:
111
115
 
@@ -124,35 +128,35 @@ class Gem::Specification < Gem::BasicSpecification
124
128
  # Map of attribute names to default values.
125
129
 
126
130
  @@default_value = {
127
- :authors => [],
128
- :autorequire => nil,
129
- :bindir => "bin",
130
- :cert_chain => [],
131
- :date => nil,
132
- :dependencies => [],
133
- :description => nil,
134
- :email => nil,
135
- :executables => [],
136
- :extensions => [],
137
- :extra_rdoc_files => [],
138
- :files => [],
139
- :homepage => nil,
140
- :licenses => [],
141
- :metadata => {},
142
- :name => nil,
143
- :platform => Gem::Platform::RUBY,
144
- :post_install_message => nil,
145
- :rdoc_options => [],
146
- :require_paths => ["lib"],
147
- :required_ruby_version => Gem::Requirement.default,
148
- :required_rubygems_version => Gem::Requirement.default,
149
- :requirements => [],
150
- :rubygems_version => Gem::VERSION,
151
- :signing_key => nil,
152
- :specification_version => CURRENT_SPECIFICATION_VERSION,
153
- :summary => nil,
154
- :test_files => [],
155
- :version => nil,
131
+ authors: [],
132
+ autorequire: nil,
133
+ bindir: "bin",
134
+ cert_chain: [],
135
+ date: nil,
136
+ dependencies: [],
137
+ description: nil,
138
+ email: nil,
139
+ executables: [],
140
+ extensions: [],
141
+ extra_rdoc_files: [],
142
+ files: [],
143
+ homepage: nil,
144
+ licenses: [],
145
+ metadata: {},
146
+ name: nil,
147
+ platform: Gem::Platform::RUBY,
148
+ post_install_message: nil,
149
+ rdoc_options: [],
150
+ require_paths: ["lib"],
151
+ required_ruby_version: Gem::Requirement.default,
152
+ required_rubygems_version: Gem::Requirement.default,
153
+ requirements: [],
154
+ rubygems_version: Gem::VERSION,
155
+ signing_key: nil,
156
+ specification_version: CURRENT_SPECIFICATION_VERSION,
157
+ summary: nil,
158
+ test_files: [],
159
+ version: nil,
156
160
  }.freeze
157
161
 
158
162
  # rubocop:disable Style/MutableConstant
@@ -161,39 +165,27 @@ class Gem::Specification < Gem::BasicSpecification
161
165
 
162
166
  @@default_value.each do |k,v|
163
167
  INITIALIZE_CODE_FOR_DEFAULTS[k] = case v
164
- when [], {}, true, false, nil, Numeric, Symbol
165
- v.inspect
166
- when String
167
- v.dump
168
- when Numeric
169
- "default_value(:#{k})"
170
- else
171
- "default_value(:#{k}).dup"
168
+ when [], {}, true, false, nil, Numeric, Symbol
169
+ v.inspect
170
+ when String
171
+ v.dump
172
+ else
173
+ "default_value(:#{k}).dup"
172
174
  end
173
175
  end
174
176
 
175
- @@attributes = @@default_value.keys.sort_by {|s| s.to_s }
176
- @@array_attributes = @@default_value.reject {|k,v| v != [] }.keys
177
+ @@attributes = @@default_value.keys.sort_by(&:to_s)
178
+ @@array_attributes = @@default_value.select {|_k,v| v.is_a?(Array) }.keys
177
179
  @@nil_attributes, @@non_nil_attributes = @@default_value.keys.partition do |k|
178
180
  @@default_value[k].nil?
179
181
  end
180
182
 
181
- def self.clear_specs # :nodoc:
182
- @@all = nil
183
- @@stubs = nil
184
- @@stubs_by_name = {}
185
- @@spec_with_requirable_file = {}
186
- @@active_stub_with_requirable_file = {}
187
- end
188
- private_class_method :clear_specs
189
-
190
- clear_specs
191
-
192
183
  # Sentinel object to represent "not found" stubs
193
184
  NOT_FOUND = Struct.new(:to_spec, :this).new # :nodoc:
185
+ deprecate_constant :NOT_FOUND
194
186
 
195
187
  # Tracking removed method calls to warn users during build time.
196
- REMOVED_METHODS = [:rubyforge_project=].freeze # :nodoc:
188
+ REMOVED_METHODS = [:rubyforge_project=, :mark_version].freeze # :nodoc:
197
189
  def removed_method_calls
198
190
  @removed_method_calls ||= []
199
191
  end
@@ -262,8 +254,7 @@ class Gem::Specification < Gem::BasicSpecification
262
254
  @test_files,
263
255
  add_bindir(@executables),
264
256
  @extra_rdoc_files,
265
- @extensions,
266
- ].flatten.compact.uniq.sort
257
+ @extensions].flatten.compact.uniq.sort
267
258
  end
268
259
 
269
260
  ##
@@ -301,7 +292,7 @@ class Gem::Specification < Gem::BasicSpecification
301
292
  #
302
293
  # Usage:
303
294
  #
304
- # spec.description = <<-EOF
295
+ # spec.description = <<~EOF
305
296
  # Rake is a Make-like program implemented in Ruby. Tasks and
306
297
  # dependencies are specified in standard Ruby syntax.
307
298
  # EOF
@@ -341,7 +332,7 @@ class Gem::Specification < Gem::BasicSpecification
341
332
  # https://opensource.org/licenses/ approved.
342
333
  #
343
334
  # The most commonly used OSI-approved licenses are MIT and Apache-2.0.
344
- # GitHub also provides a license picker at http://choosealicense.com/.
335
+ # GitHub also provides a license picker at https://choosealicense.com/.
345
336
  #
346
337
  # You can also use a custom license file along with your gemspec and specify
347
338
  # a LicenseRef-<idstring>, where idstring is the name of the file containing
@@ -426,11 +417,11 @@ class Gem::Specification < Gem::BasicSpecification
426
417
  end
427
418
 
428
419
  ##
429
- # The path in the gem for executable scripts. Usually 'bin'
420
+ # The path in the gem for executable scripts. Usually 'exe'
430
421
  #
431
422
  # Usage:
432
423
  #
433
- # spec.bindir = 'bin'
424
+ # spec.bindir = 'exe'
434
425
 
435
426
  attr_accessor :bindir
436
427
 
@@ -502,8 +493,6 @@ class Gem::Specification < Gem::BasicSpecification
502
493
  @platform = @new_platform.to_s
503
494
 
504
495
  invalidate_memoized_attributes
505
-
506
- @new_platform
507
496
  end
508
497
 
509
498
  ##
@@ -532,13 +521,6 @@ class Gem::Specification < Gem::BasicSpecification
532
521
 
533
522
  attr_reader :required_rubygems_version
534
523
 
535
- ##
536
- # The version of RubyGems used to create this gem.
537
- #
538
- # Do not set this, it is set automatically when the gem is packaged.
539
-
540
- attr_accessor :rubygems_version
541
-
542
524
  ##
543
525
  # The key used to sign this gem. See Gem::Security for details.
544
526
 
@@ -564,9 +546,9 @@ class Gem::Specification < Gem::BasicSpecification
564
546
  #
565
547
  # Usage:
566
548
  #
567
- # spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'
549
+ # spec.add_dependency 'example', '~> 1.1', '>= 1.1.4'
568
550
 
569
- def add_runtime_dependency(gem, *requirements)
551
+ def add_dependency(gem, *requirements)
570
552
  if requirements.uniq.size != requirements.size
571
553
  warn "WARNING: duplicated #{gem} dependency #{requirements}"
572
554
  end
@@ -577,7 +559,7 @@ class Gem::Specification < Gem::BasicSpecification
577
559
  ##
578
560
  # Executables included in the gem.
579
561
  #
580
- # For example, the rake gem has rake as an executable. You dont specify the
562
+ # For example, the rake gem has rake as an executable. You don't specify the
581
563
  # full path (as in bin/rake); all application-style files are expected to be
582
564
  # found in bindir. These files must be executable Ruby files. Files that
583
565
  # use bash or other interpreters will not work.
@@ -598,7 +580,7 @@ class Gem::Specification < Gem::BasicSpecification
598
580
  # extconf.rb-style files used to compile extensions.
599
581
  #
600
582
  # These files will be run when the gem is installed, causing the C (or
601
- # whatever) code to be compiled on the users machine.
583
+ # whatever) code to be compiled on the user's machine.
602
584
  #
603
585
  # Usage:
604
586
  #
@@ -726,6 +708,21 @@ class Gem::Specification < Gem::BasicSpecification
726
708
  @test_files = Array files
727
709
  end
728
710
 
711
+ ######################################################################
712
+ # :section: Read-only attributes
713
+
714
+ ##
715
+ # The version of RubyGems used to create this gem.
716
+
717
+ attr_accessor :rubygems_version
718
+
719
+ ##
720
+ # The path where this gem installs its extensions.
721
+
722
+ def extensions_dir
723
+ @extensions_dir ||= super
724
+ end
725
+
729
726
  ######################################################################
730
727
  # :section: Specification internals
731
728
 
@@ -734,7 +731,7 @@ class Gem::Specification < Gem::BasicSpecification
734
731
 
735
732
  attr_accessor :activated
736
733
 
737
- alias :activated? :activated
734
+ alias_method :activated?, :activated
738
735
 
739
736
  ##
740
737
  # Autorequire was used by old RubyGems to automatically require a file.
@@ -764,7 +761,7 @@ class Gem::Specification < Gem::BasicSpecification
764
761
  attr_accessor :specification_version
765
762
 
766
763
  def self._all # :nodoc:
767
- @@all ||= Gem.loaded_specs.values | stubs.map(&:to_spec)
764
+ specification_record.all
768
765
  end
769
766
 
770
767
  def self.clear_load_cache # :nodoc:
@@ -774,34 +771,22 @@ class Gem::Specification < Gem::BasicSpecification
774
771
  end
775
772
  private_class_method :clear_load_cache
776
773
 
774
+ def self.gem_path # :nodoc:
775
+ Gem.path
776
+ end
777
+ private_class_method :gem_path
778
+
777
779
  def self.each_gemspec(dirs) # :nodoc:
778
780
  dirs.each do |dir|
779
781
  Gem::Util.glob_files_in_dir("*.gemspec", dir).each do |path|
780
- yield path.tap(&Gem::UNTAINT)
782
+ yield path
781
783
  end
782
784
  end
783
785
  end
784
786
 
785
- def self.gemspec_stubs_in(dir, pattern)
787
+ def self.gemspec_stubs_in(dir, pattern) # :nodoc:
786
788
  Gem::Util.glob_files_in_dir(pattern, dir).map {|path| yield path }.select(&:valid?)
787
789
  end
788
- private_class_method :gemspec_stubs_in
789
-
790
- def self.installed_stubs(dirs, pattern)
791
- map_stubs(dirs, pattern) do |path, base_dir, gems_dir|
792
- Gem::StubSpecification.gemspec_stub(path, base_dir, gems_dir)
793
- end
794
- end
795
- private_class_method :installed_stubs
796
-
797
- def self.map_stubs(dirs, pattern) # :nodoc:
798
- dirs.flat_map do |dir|
799
- base_dir = File.dirname dir
800
- gems_dir = File.join base_dir, "gems"
801
- gemspec_stubs_in(dir, pattern) {|path| yield path, base_dir, gems_dir }
802
- end
803
- end
804
- private_class_method :map_stubs
805
790
 
806
791
  def self.each_spec(dirs) # :nodoc:
807
792
  each_gemspec(dirs) do |path|
@@ -814,13 +799,7 @@ class Gem::Specification < Gem::BasicSpecification
814
799
  # Returns a Gem::StubSpecification for every installed gem
815
800
 
816
801
  def self.stubs
817
- @@stubs ||= begin
818
- pattern = "*.gemspec"
819
- stubs = stubs_for_pattern(pattern, false)
820
-
821
- @@stubs_by_name = stubs.select {|s| Gem::Platform.match_spec? s }.group_by(&:name)
822
- stubs
823
- end
802
+ specification_record.stubs
824
803
  end
825
804
 
826
805
  ##
@@ -839,13 +818,7 @@ class Gem::Specification < Gem::BasicSpecification
839
818
  # only returns stubs that match Gem.platforms
840
819
 
841
820
  def self.stubs_for(name)
842
- if @@stubs
843
- @@stubs_by_name[name] || []
844
- else
845
- @@stubs_by_name[name] ||= stubs_for_pattern("#{name}-*.gemspec").select do |s|
846
- s.name == name
847
- end
848
- end
821
+ specification_record.stubs_for(name)
849
822
  end
850
823
 
851
824
  ##
@@ -853,12 +826,7 @@ class Gem::Specification < Gem::BasicSpecification
853
826
  # optionally filtering out specs not matching the current platform
854
827
  #
855
828
  def self.stubs_for_pattern(pattern, match_platform = true) # :nodoc:
856
- installed_stubs = installed_stubs(Gem::Specification.dirs, pattern)
857
- installed_stubs.select! {|s| Gem::Platform.match_spec? s } if match_platform
858
- stubs = installed_stubs + default_stubs(pattern)
859
- stubs = stubs.uniq {|stub| stub.full_name }
860
- _resort!(stubs)
861
- stubs
829
+ specification_record.stubs_for_pattern(pattern, match_platform)
862
830
  end
863
831
 
864
832
  def self._resort!(specs) # :nodoc:
@@ -867,7 +835,11 @@ class Gem::Specification < Gem::BasicSpecification
867
835
  next names if names.nonzero?
868
836
  versions = b.version <=> a.version
869
837
  next versions if versions.nonzero?
870
- Gem::Platform.sort_priority(b.platform)
838
+ platforms = Gem::Platform.sort_priority(b.platform) <=> Gem::Platform.sort_priority(a.platform)
839
+ next platforms if platforms.nonzero?
840
+ default_gem = a.default_gem_priority <=> b.default_gem_priority
841
+ next default_gem if default_gem.nonzero?
842
+ a.base_dir_priority(gem_path) <=> b.base_dir_priority(gem_path)
871
843
  end
872
844
  end
873
845
 
@@ -887,23 +859,14 @@ class Gem::Specification < Gem::BasicSpecification
887
859
  # properly sorted.
888
860
 
889
861
  def self.add_spec(spec)
890
- return if _all.include? spec
891
-
892
- _all << spec
893
- stubs << spec
894
- (@@stubs_by_name[spec.name] ||= []) << spec
895
-
896
- _resort!(@@stubs_by_name[spec.name])
897
- _resort!(stubs)
862
+ specification_record.add_spec(spec)
898
863
  end
899
864
 
900
865
  ##
901
866
  # Removes +spec+ from the known specs.
902
867
 
903
868
  def self.remove_spec(spec)
904
- _all.delete spec.to_spec
905
- stubs.delete spec
906
- (@@stubs_by_name[spec.name] || []).delete spec
869
+ specification_record.remove_spec(spec)
907
870
  end
908
871
 
909
872
  ##
@@ -911,33 +874,23 @@ class Gem::Specification < Gem::BasicSpecification
911
874
  # You probably want to use one of the Enumerable methods instead.
912
875
 
913
876
  def self.all
914
- warn "NOTE: Specification.all called from #{caller.first}" unless
877
+ warn "NOTE: Specification.all called from #{caller(1, 1).first}" unless
915
878
  Gem::Deprecate.skip
916
879
  _all
917
880
  end
918
881
 
919
882
  ##
920
- # Sets the known specs to +specs+. Not guaranteed to work for you in
921
- # the future. Use at your own risk. Caveat emptor. Doomy doom doom.
922
- # Etc etc.
923
- #
924
- #--
925
- # Makes +specs+ the known specs
926
- # Listen, time is a river
927
- # Winter comes, code breaks
928
- #
929
- # -- wilsonb
883
+ # Sets the known specs to +specs+.
930
884
 
931
885
  def self.all=(specs)
932
- @@stubs_by_name = specs.group_by(&:name)
933
- @@all = @@stubs = specs
886
+ specification_record.all = specs
934
887
  end
935
888
 
936
889
  ##
937
890
  # Return full names of all specs in sorted order.
938
891
 
939
892
  def self.all_names
940
- self._all.map(&:full_name)
893
+ specification_record.all_names
941
894
  end
942
895
 
943
896
  ##
@@ -962,9 +915,7 @@ class Gem::Specification < Gem::BasicSpecification
962
915
  # Return the directories that Specification uses to find specs.
963
916
 
964
917
  def self.dirs
965
- @@dirs ||= Gem.path.collect do |dir|
966
- File.join dir.dup.tap(&Gem::UNTAINT), "specifications"
967
- end
918
+ @@dirs ||= Gem::SpecificationRecord.dirs_from(gem_path)
968
919
  end
969
920
 
970
921
  ##
@@ -972,9 +923,9 @@ class Gem::Specification < Gem::BasicSpecification
972
923
  # this resets the list of known specs.
973
924
 
974
925
  def self.dirs=(dirs)
975
- self.reset
926
+ reset
976
927
 
977
- @@dirs = Array(dirs).map {|dir| File.join dir, "specifications" }
928
+ @@dirs = Gem::SpecificationRecord.dirs_from(Array(dirs))
978
929
  end
979
930
 
980
931
  extend Enumerable
@@ -983,23 +934,15 @@ class Gem::Specification < Gem::BasicSpecification
983
934
  # Enumerate every known spec. See ::dirs= and ::add_spec to set the list of
984
935
  # specs.
985
936
 
986
- def self.each
987
- return enum_for(:each) unless block_given?
988
-
989
- self._all.each do |x|
990
- yield x
991
- end
937
+ def self.each(&block)
938
+ specification_record.each(&block)
992
939
  end
993
940
 
994
941
  ##
995
942
  # Returns every spec that matches +name+ and optional +requirements+.
996
943
 
997
944
  def self.find_all_by_name(name, *requirements)
998
- requirements = Gem::Requirement.default if requirements.empty?
999
-
1000
- # TODO: maybe try: find_all { |s| spec === dep }
1001
-
1002
- Gem::Dependency.new(name, *requirements).matching_specs
945
+ specification_record.find_all_by_name(name, *requirements)
1003
946
  end
1004
947
 
1005
948
  ##
@@ -1016,8 +959,6 @@ class Gem::Specification < Gem::BasicSpecification
1016
959
  def self.find_by_name(name, *requirements)
1017
960
  requirements = Gem::Requirement.default if requirements.empty?
1018
961
 
1019
- # TODO: maybe try: find { |s| spec === dep }
1020
-
1021
962
  Gem::Dependency.new(name, *requirements).to_spec
1022
963
  end
1023
964
 
@@ -1031,11 +972,7 @@ class Gem::Specification < Gem::BasicSpecification
1031
972
  # Return the best specification that contains the file matching +path+.
1032
973
 
1033
974
  def self.find_by_path(path)
1034
- path = path.dup.freeze
1035
- spec = @@spec_with_requirable_file[path] ||= (stubs.find do |s|
1036
- s.contains_requirable_file? path
1037
- end || NOT_FOUND)
1038
- spec.to_spec
975
+ specification_record.find_by_path(path)
1039
976
  end
1040
977
 
1041
978
  ##
@@ -1043,18 +980,15 @@ class Gem::Specification < Gem::BasicSpecification
1043
980
  # amongst the specs that are not activated.
1044
981
 
1045
982
  def self.find_inactive_by_path(path)
1046
- stub = stubs.find do |s|
1047
- next if s.activated?
1048
- s.contains_requirable_file? path
1049
- end
1050
- stub && stub.to_spec
983
+ specification_record.find_inactive_by_path(path)
1051
984
  end
1052
985
 
986
+ ##
987
+ # Return the best specification that contains the file matching +path+, among
988
+ # those already activated.
989
+
1053
990
  def self.find_active_stub_by_path(path)
1054
- stub = @@active_stub_with_requirable_file[path] ||= (stubs.find do |s|
1055
- s.activated? && s.contains_requirable_file?(path)
1056
- end || NOT_FOUND)
1057
- stub.this
991
+ specification_record.find_active_stub_by_path(path)
1058
992
  end
1059
993
 
1060
994
  ##
@@ -1070,7 +1004,7 @@ class Gem::Specification < Gem::BasicSpecification
1070
1004
 
1071
1005
  def self.find_in_unresolved_tree(path)
1072
1006
  unresolved_specs.each do |spec|
1073
- spec.traverse do |from_spec, dep, to_spec, trail|
1007
+ spec.traverse do |_from_spec, _dep, to_spec, trail|
1074
1008
  if to_spec.has_conflicts? || to_spec.conficts_when_loaded_with?(trail)
1075
1009
  :next
1076
1010
  else
@@ -1083,7 +1017,7 @@ class Gem::Specification < Gem::BasicSpecification
1083
1017
  end
1084
1018
 
1085
1019
  def self.unresolved_specs
1086
- unresolved_deps.values.map {|dep| dep.to_specs }.flatten
1020
+ unresolved_deps.values.map(&:to_specs).flatten
1087
1021
  end
1088
1022
  private_class_method :unresolved_specs
1089
1023
 
@@ -1121,26 +1055,28 @@ class Gem::Specification < Gem::BasicSpecification
1121
1055
  # +prerelease+ is true.
1122
1056
 
1123
1057
  def self.latest_specs(prerelease = false)
1124
- _latest_specs Gem::Specification.stubs, prerelease
1058
+ specification_record.latest_specs(prerelease)
1125
1059
  end
1126
1060
 
1127
1061
  ##
1128
1062
  # Return the latest installed spec for gem +name+.
1129
1063
 
1130
1064
  def self.latest_spec_for(name)
1131
- latest_specs(true).find {|installed_spec| installed_spec.name == name }
1065
+ specification_record.latest_spec_for(name)
1132
1066
  end
1133
1067
 
1134
1068
  def self._latest_specs(specs, prerelease = false) # :nodoc:
1135
1069
  result = {}
1136
1070
 
1137
1071
  specs.reverse_each do |spec|
1138
- next if spec.version.prerelease? unless prerelease
1072
+ unless prerelease
1073
+ next if spec.version.prerelease?
1074
+ end
1139
1075
 
1140
1076
  result[spec.name] = spec
1141
1077
  end
1142
1078
 
1143
- result.map(&:last).flatten.sort_by {|tup| tup.name }
1079
+ result.map(&:last).flatten.sort_by(&:name)
1144
1080
  end
1145
1081
 
1146
1082
  ##
@@ -1149,36 +1085,33 @@ class Gem::Specification < Gem::BasicSpecification
1149
1085
  def self.load(file)
1150
1086
  return unless file
1151
1087
 
1152
- _spec = @load_cache_mutex.synchronize { @load_cache[file] }
1153
- return _spec if _spec
1088
+ spec = @load_cache_mutex.synchronize { @load_cache[file] }
1089
+ return spec if spec
1154
1090
 
1155
- file = file.dup.tap(&Gem::UNTAINT)
1156
1091
  return unless File.file?(file)
1157
1092
 
1158
1093
  code = Gem.open_file(file, "r:UTF-8:-", &:read)
1159
1094
 
1160
- code.tap(&Gem::UNTAINT)
1161
-
1162
1095
  begin
1163
- _spec = eval code, binding, file
1096
+ spec = eval code, binding, file
1164
1097
 
1165
- if Gem::Specification === _spec
1166
- _spec.loaded_from = File.expand_path file.to_s
1098
+ if Gem::Specification === spec
1099
+ spec.loaded_from = File.expand_path file.to_s
1167
1100
  @load_cache_mutex.synchronize do
1168
1101
  prev = @load_cache[file]
1169
1102
  if prev
1170
- _spec = prev
1103
+ spec = prev
1171
1104
  else
1172
- @load_cache[file] = _spec
1105
+ @load_cache[file] = spec
1173
1106
  end
1174
1107
  end
1175
- return _spec
1108
+ return spec
1176
1109
  end
1177
1110
 
1178
- warn "[#{file}] isn't a Gem::Specification (#{_spec.class} instead)."
1111
+ warn "[#{file}] isn't a Gem::Specification (#{spec.class} instead)."
1179
1112
  rescue SignalException, SystemExit
1180
1113
  raise
1181
- rescue SyntaxError, Exception => e
1114
+ rescue SyntaxError, StandardError => e
1182
1115
  warn "Invalid gemspec in [#{file}]: #{e}"
1183
1116
  end
1184
1117
 
@@ -1266,8 +1199,8 @@ class Gem::Specification < Gem::BasicSpecification
1266
1199
 
1267
1200
  def self.reset
1268
1201
  @@dirs = nil
1269
- Gem.pre_reset_hooks.each {|hook| hook.call }
1270
- clear_specs
1202
+ Gem.pre_reset_hooks.each(&:call)
1203
+ @specification_record = nil
1271
1204
  clear_load_cache
1272
1205
  unresolved = unresolved_deps
1273
1206
  unless unresolved.empty?
@@ -1275,7 +1208,7 @@ class Gem::Specification < Gem::BasicSpecification
1275
1208
  unresolved.values.each do |dep|
1276
1209
  warn " #{dep}"
1277
1210
 
1278
- versions = find_all_by_name(dep.name)
1211
+ versions = find_all_by_name(dep.name).uniq(&:full_name)
1279
1212
  unless versions.empty?
1280
1213
  warn " Available/installed versions of this gem:"
1281
1214
  versions.each {|s| warn " - #{s.version}" }
@@ -1285,7 +1218,14 @@ class Gem::Specification < Gem::BasicSpecification
1285
1218
  warn "Please report a bug if this causes problems."
1286
1219
  unresolved.clear
1287
1220
  end
1288
- Gem.post_reset_hooks.each {|hook| hook.call }
1221
+ Gem.post_reset_hooks.each(&:call)
1222
+ end
1223
+
1224
+ ##
1225
+ # Keeps track of all currently known specifications
1226
+
1227
+ def self.specification_record
1228
+ @specification_record ||= Gem::SpecificationRecord.new(dirs)
1289
1229
  end
1290
1230
 
1291
1231
  # DOC: This method needs documented or nodoc'd
@@ -1298,10 +1238,23 @@ class Gem::Specification < Gem::BasicSpecification
1298
1238
 
1299
1239
  def self._load(str)
1300
1240
  Gem.load_yaml
1241
+ Gem.load_safe_marshal
1242
+
1243
+ yaml_set = false
1244
+ retry_count = 0
1301
1245
 
1302
1246
  array = begin
1303
- Marshal.load str
1247
+ Gem::SafeMarshal.safe_load str
1304
1248
  rescue ArgumentError => e
1249
+ # Avoid an infinite retry loop when the argument error has nothing to do
1250
+ # with the classes not being defined.
1251
+ # 1 retry each allowed in case all 3 of
1252
+ # - YAML
1253
+ # - YAML::Syck::DefaultKey
1254
+ # - YAML::PrivateType
1255
+ # need to be defined
1256
+ raise if retry_count >= 3
1257
+
1305
1258
  #
1306
1259
  # Some very old marshaled specs included references to `YAML::PrivateType`
1307
1260
  # and `YAML::Syck::DefaultKey` constants due to bugs in the old emitter
@@ -1311,17 +1264,23 @@ class Gem::Specification < Gem::BasicSpecification
1311
1264
  message = e.message
1312
1265
  raise unless message.include?("YAML::")
1313
1266
 
1314
- Object.const_set "YAML", Psych unless Object.const_defined?(:YAML)
1267
+ unless Object.const_defined?(:YAML)
1268
+ Object.const_set "YAML", Psych
1269
+ yaml_set = true
1270
+ end
1315
1271
 
1316
1272
  if message.include?("YAML::Syck::")
1317
1273
  YAML.const_set "Syck", YAML unless YAML.const_defined?(:Syck)
1318
1274
 
1319
- YAML::Syck.const_set "DefaultKey", Class.new if message.include?("YAML::Syck::DefaultKey")
1320
- elsif message.include?("YAML::PrivateType")
1275
+ YAML::Syck.const_set "DefaultKey", Class.new if message.include?("YAML::Syck::DefaultKey") && !YAML::Syck.const_defined?(:DefaultKey)
1276
+ elsif message.include?("YAML::PrivateType") && !YAML.const_defined?(:PrivateType)
1321
1277
  YAML.const_set "PrivateType", Class.new
1322
1278
  end
1323
1279
 
1280
+ retry_count += 1
1324
1281
  retry
1282
+ ensure
1283
+ Object.__send__(:remove_const, "YAML") if yaml_set
1325
1284
  end
1326
1285
 
1327
1286
  spec = Gem::Specification.new
@@ -1359,7 +1318,7 @@ class Gem::Specification < Gem::BasicSpecification
1359
1318
  spec.instance_variable_set :@has_rdoc, array[15]
1360
1319
  spec.instance_variable_set :@new_platform, array[16]
1361
1320
  spec.instance_variable_set :@platform, array[16].to_s
1362
- spec.instance_variable_set :@license, array[17]
1321
+ spec.instance_variable_set :@licenses, [array[17]]
1363
1322
  spec.instance_variable_set :@metadata, array[18]
1364
1323
  spec.instance_variable_set :@loaded, false
1365
1324
  spec.instance_variable_set :@activated, false
@@ -1415,7 +1374,7 @@ class Gem::Specification < Gem::BasicSpecification
1415
1374
  # there are conflicts upon activation.
1416
1375
 
1417
1376
  def activate
1418
- other = Gem.loaded_specs[self.name]
1377
+ other = Gem.loaded_specs[name]
1419
1378
  if other
1420
1379
  check_version_conflict other
1421
1380
  return false
@@ -1426,11 +1385,11 @@ class Gem::Specification < Gem::BasicSpecification
1426
1385
  activate_dependencies
1427
1386
  add_self_to_load_path
1428
1387
 
1429
- Gem.loaded_specs[self.name] = self
1388
+ Gem.loaded_specs[name] = self
1430
1389
  @activated = true
1431
1390
  @loaded = true
1432
1391
 
1433
- return true
1392
+ true
1434
1393
  end
1435
1394
 
1436
1395
  ##
@@ -1441,7 +1400,7 @@ class Gem::Specification < Gem::BasicSpecification
1441
1400
  def activate_dependencies
1442
1401
  unresolved = Gem::Specification.unresolved_deps
1443
1402
 
1444
- self.runtime_dependencies.each do |spec_dep|
1403
+ runtime_dependencies.each do |spec_dep|
1445
1404
  if loaded = Gem.loaded_specs[spec_dep.name]
1446
1405
  next if spec_dep.matches_spec? loaded
1447
1406
 
@@ -1453,9 +1412,9 @@ class Gem::Specification < Gem::BasicSpecification
1453
1412
  end
1454
1413
 
1455
1414
  begin
1456
- specs = spec_dep.to_specs
1415
+ specs = spec_dep.to_specs.uniq(&:full_name)
1457
1416
  rescue Gem::MissingSpecError => e
1458
- raise Gem::MissingSpecError.new(e.name, e.requirement, "at: #{self.spec_file}")
1417
+ raise Gem::MissingSpecError.new(e.name, e.requirement, "at: #{spec_file}")
1459
1418
  end
1460
1419
 
1461
1420
  if specs.size == 1
@@ -1501,7 +1460,7 @@ class Gem::Specification < Gem::BasicSpecification
1501
1460
  def sanitize_string(string)
1502
1461
  return string unless string
1503
1462
 
1504
- # HACK the #to_s is in here because RSpec has an Array of Arrays of
1463
+ # HACK: the #to_s is in here because RSpec has an Array of Arrays of
1505
1464
  # Strings for authors. Need a way to disallow bad values on gemspec
1506
1465
  # generation. (Probably won't happen.)
1507
1466
  string.to_s
@@ -1519,8 +1478,8 @@ class Gem::Specification < Gem::BasicSpecification
1519
1478
  else
1520
1479
  executables
1521
1480
  end
1522
- rescue
1523
- return nil
1481
+ rescue StandardError
1482
+ nil
1524
1483
  end
1525
1484
 
1526
1485
  ##
@@ -1545,7 +1504,7 @@ class Gem::Specification < Gem::BasicSpecification
1545
1504
 
1546
1505
  private :add_dependency_with_type
1547
1506
 
1548
- alias add_dependency add_runtime_dependency
1507
+ alias_method :add_runtime_dependency, :add_dependency
1549
1508
 
1550
1509
  ##
1551
1510
  # Adds this spec's require paths to LOAD_PATH, in the proper location.
@@ -1597,7 +1556,7 @@ class Gem::Specification < Gem::BasicSpecification
1597
1556
  def build_args
1598
1557
  if File.exist? build_info_file
1599
1558
  build_info = File.readlines build_info_file
1600
- build_info = build_info.map {|x| x.strip }
1559
+ build_info = build_info.map(&:strip)
1601
1560
  build_info.delete ""
1602
1561
  build_info
1603
1562
  else
@@ -1615,8 +1574,8 @@ class Gem::Specification < Gem::BasicSpecification
1615
1574
  # we need to fresh build when same name and version of default gems
1616
1575
  return if self.class.find_by_full_name(full_name)&.default_gem?
1617
1576
  return if File.exist? gem_build_complete_path
1618
- return if !File.writable?(base_dir)
1619
- return if !File.exist?(File.join(base_dir, "extensions"))
1577
+ return unless File.writable?(base_dir)
1578
+ return unless File.exist?(File.join(base_dir, "extensions"))
1620
1579
 
1621
1580
  begin
1622
1581
  # We need to require things in $LOAD_PATH without looking for the
@@ -1634,7 +1593,7 @@ class Gem::Specification < Gem::BasicSpecification
1634
1593
  builder.build_extensions
1635
1594
  end
1636
1595
  ensure
1637
- ui.close if ui
1596
+ ui&.close
1638
1597
  Gem::Specification.unresolved_deps.replace unresolved_deps
1639
1598
  end
1640
1599
  end
@@ -1674,7 +1633,7 @@ class Gem::Specification < Gem::BasicSpecification
1674
1633
 
1675
1634
  def conflicts
1676
1635
  conflicts = {}
1677
- self.runtime_dependencies.each do |dep|
1636
+ runtime_dependencies.each do |dep|
1678
1637
  spec = Gem.loaded_specs[dep.name]
1679
1638
  if spec && !spec.satisfies_requirement?(dep)
1680
1639
  (conflicts[spec] ||= []) << dep
@@ -1690,7 +1649,7 @@ class Gem::Specification < Gem::BasicSpecification
1690
1649
 
1691
1650
  def conficts_when_loaded_with?(list_of_specs) # :nodoc:
1692
1651
  result = list_of_specs.any? do |spec|
1693
- spec.dependencies.any? {|dep| dep.runtime? && (dep.name == name) && !satisfies_requirement?(dep) }
1652
+ spec.runtime_dependencies.any? {|dep| (dep.name == name) && !satisfies_requirement?(dep) }
1694
1653
  end
1695
1654
  result
1696
1655
  end
@@ -1700,14 +1659,12 @@ class Gem::Specification < Gem::BasicSpecification
1700
1659
 
1701
1660
  def has_conflicts?
1702
1661
  return true unless Gem.env_requirement(name).satisfied_by?(version)
1703
- self.dependencies.any? do |dep|
1704
- if dep.runtime?
1705
- spec = Gem.loaded_specs[dep.name]
1706
- spec && !spec.satisfies_requirement?(dep)
1707
- else
1708
- false
1709
- end
1662
+ runtime_dependencies.any? do |dep|
1663
+ spec = Gem.loaded_specs[dep.name]
1664
+ spec && !spec.satisfies_requirement?(dep)
1710
1665
  end
1666
+ rescue ArgumentError => e
1667
+ raise e, "#{name} #{version}: #{e.message}"
1711
1668
  end
1712
1669
 
1713
1670
  # The date this gem was created.
@@ -1731,7 +1688,7 @@ class Gem::Specification < Gem::BasicSpecification
1731
1688
  /\A
1732
1689
  (\d{4})-(\d{2})-(\d{2})
1733
1690
  (\s+ \d{2}:\d{2}:\d{2}\.\d+ \s* (Z | [-+]\d\d:\d\d) )?
1734
- \Z/x.freeze
1691
+ \Z/x
1735
1692
 
1736
1693
  ##
1737
1694
  # The date this gem was created
@@ -1743,17 +1700,17 @@ class Gem::Specification < Gem::BasicSpecification
1743
1700
  # This is the cleanest, most-readable, faster-than-using-Date
1744
1701
  # way to do it.
1745
1702
  @date = case date
1746
- when String then
1747
- if DateTimeFormat =~ date
1748
- Time.utc($1.to_i, $2.to_i, $3.to_i)
1749
- else
1750
- raise(Gem::InvalidSpecificationException,
1751
- "invalid date format in specification: #{date.inspect}")
1752
- end
1753
- when Time, DateLike then
1754
- Time.utc(date.year, date.month, date.day)
1755
- else
1756
- TODAY
1703
+ when String then
1704
+ if DateTimeFormat =~ date
1705
+ Time.utc($1.to_i, $2.to_i, $3.to_i)
1706
+ else
1707
+ raise(Gem::InvalidSpecificationException,
1708
+ "invalid date format in specification: #{date.inspect}")
1709
+ end
1710
+ when Time, DateLike then
1711
+ Time.utc(date.year, date.month, date.day)
1712
+ else
1713
+ TODAY
1757
1714
  end
1758
1715
  end
1759
1716
 
@@ -1803,13 +1760,12 @@ class Gem::Specification < Gem::BasicSpecification
1803
1760
  Gem::Specification.each do |spec|
1804
1761
  deps = check_dev ? spec.dependencies : spec.runtime_dependencies
1805
1762
  deps.each do |dep|
1806
- if self.satisfies_requirement?(dep)
1807
- sats = []
1808
- find_all_satisfiers(dep) do |sat|
1809
- sats << sat
1810
- end
1811
- out << [spec, dep, sats]
1763
+ next unless satisfies_requirement?(dep)
1764
+ sats = []
1765
+ find_all_satisfiers(dep) do |sat|
1766
+ sats << sat
1812
1767
  end
1768
+ out << [spec, dep, sats]
1813
1769
  end
1814
1770
  end
1815
1771
  out
@@ -1819,7 +1775,7 @@ class Gem::Specification < Gem::BasicSpecification
1819
1775
  # Returns all specs that matches this spec's runtime dependencies.
1820
1776
 
1821
1777
  def dependent_specs
1822
- runtime_dependencies.map {|dep| dep.to_specs }.flatten
1778
+ runtime_dependencies.map(&:to_specs).flatten
1823
1779
  end
1824
1780
 
1825
1781
  ##
@@ -1855,17 +1811,15 @@ class Gem::Specification < Gem::BasicSpecification
1855
1811
  end
1856
1812
 
1857
1813
  def encode_with(coder) # :nodoc:
1858
- mark_version
1859
-
1860
1814
  coder.add "name", @name
1861
1815
  coder.add "version", @version
1862
1816
  platform = case @original_platform
1863
- when nil, "" then
1864
- "ruby"
1865
- when String then
1866
- @original_platform
1867
- else
1868
- @original_platform.to_s
1817
+ when nil, "" then
1818
+ "ruby"
1819
+ when String then
1820
+ @original_platform
1821
+ else
1822
+ @original_platform.to_s
1869
1823
  end
1870
1824
  coder.add "platform", platform
1871
1825
 
@@ -1988,7 +1942,7 @@ class Gem::Specification < Gem::BasicSpecification
1988
1942
  end
1989
1943
  rubygems_deprecate :has_rdoc=
1990
1944
 
1991
- alias :has_rdoc? :has_rdoc # :nodoc:
1945
+ alias_method :has_rdoc?, :has_rdoc # :nodoc:
1992
1946
  rubygems_deprecate :has_rdoc?
1993
1947
 
1994
1948
  ##
@@ -1999,7 +1953,7 @@ class Gem::Specification < Gem::BasicSpecification
1999
1953
  end
2000
1954
 
2001
1955
  # :stopdoc:
2002
- alias has_test_suite? has_unit_tests?
1956
+ alias_method :has_test_suite?, :has_unit_tests?
2003
1957
  # :startdoc:
2004
1958
 
2005
1959
  def hash # :nodoc:
@@ -2056,7 +2010,8 @@ class Gem::Specification < Gem::BasicSpecification
2056
2010
  end
2057
2011
 
2058
2012
  ##
2059
- # Duplicates array_attributes from +other_spec+ so state isn't shared.
2013
+ # Duplicates Array and Gem::Requirement attributes from +other_spec+ so state isn't shared.
2014
+ #
2060
2015
 
2061
2016
  def initialize_copy(other_spec)
2062
2017
  self.class.array_attributes.each do |name|
@@ -2078,6 +2033,9 @@ class Gem::Specification < Gem::BasicSpecification
2078
2033
  raise e
2079
2034
  end
2080
2035
  end
2036
+
2037
+ @required_ruby_version = other_spec.required_ruby_version.dup
2038
+ @required_rubygems_version = other_spec.required_rubygems_version.dup
2081
2039
  end
2082
2040
 
2083
2041
  def base_dir
@@ -2146,13 +2104,6 @@ class Gem::Specification < Gem::BasicSpecification
2146
2104
  @spec_file = nil
2147
2105
  end
2148
2106
 
2149
- ##
2150
- # Sets the rubygems_version to the current RubyGems version.
2151
-
2152
- def mark_version
2153
- @rubygems_version = Gem::VERSION
2154
- end
2155
-
2156
2107
  ##
2157
2108
  # Track removed method calls to warn about during build time.
2158
2109
  # Warn about unknown attributes while loading a spec.
@@ -2233,7 +2184,7 @@ class Gem::Specification < Gem::BasicSpecification
2233
2184
  # The platform this gem runs on. See Gem::Platform for details.
2234
2185
 
2235
2186
  def platform
2236
- @new_platform ||= Gem::Platform::RUBY
2187
+ @new_platform ||= Gem::Platform::RUBY # rubocop:disable Naming/MemoizedInstanceVariableName
2237
2188
  end
2238
2189
 
2239
2190
  def pretty_print(q) # :nodoc:
@@ -2246,23 +2197,22 @@ class Gem::Specification < Gem::BasicSpecification
2246
2197
  attributes.unshift :name
2247
2198
 
2248
2199
  attributes.each do |attr_name|
2249
- current_value = self.send attr_name
2250
- current_value = current_value.sort if %i[files test_files].include? attr_name
2251
- if current_value != default_value(attr_name) ||
2252
- self.class.required_attribute?(attr_name)
2200
+ current_value = send attr_name
2201
+ current_value = current_value.sort if [:files, :test_files].include? attr_name
2202
+ next unless current_value != default_value(attr_name) ||
2203
+ self.class.required_attribute?(attr_name)
2253
2204
 
2254
- q.text "s.#{attr_name} = "
2205
+ q.text "s.#{attr_name} = "
2255
2206
 
2256
- if attr_name == :date
2257
- current_value = current_value.utc
2207
+ if attr_name == :date
2208
+ current_value = current_value.utc
2258
2209
 
2259
- q.text "Time.utc(#{current_value.year}, #{current_value.month}, #{current_value.day})"
2260
- else
2261
- q.pp current_value
2262
- end
2263
-
2264
- q.breakable
2210
+ q.text "Time.utc(#{current_value.year}, #{current_value.month}, #{current_value.day})"
2211
+ else
2212
+ q.pp current_value
2265
2213
  end
2214
+
2215
+ q.breakable
2266
2216
  end
2267
2217
  end
2268
2218
  end
@@ -2272,7 +2222,7 @@ class Gem::Specification < Gem::BasicSpecification
2272
2222
  # that is already loaded (+other+)
2273
2223
 
2274
2224
  def check_version_conflict(other) # :nodoc:
2275
- return if self.version == other.version
2225
+ return if version == other.version
2276
2226
 
2277
2227
  # This gem is already loaded. If the currently loaded gem is not in the
2278
2228
  # list of candidate gems, then we have a version conflict.
@@ -2280,7 +2230,7 @@ class Gem::Specification < Gem::BasicSpecification
2280
2230
  msg = "can't activate #{full_name}, already activated #{other.full_name}"
2281
2231
 
2282
2232
  e = Gem::LoadError.new msg
2283
- e.name = self.name
2233
+ e.name = name
2284
2234
 
2285
2235
  raise e
2286
2236
  end
@@ -2345,13 +2295,13 @@ class Gem::Specification < Gem::BasicSpecification
2345
2295
  when Array then "[" + obj.map {|x| ruby_code x }.join(", ") + "]"
2346
2296
  when Hash then
2347
2297
  seg = obj.keys.sort.map {|k| "#{k.to_s.dump} => #{obj[k].to_s.dump}" }
2348
- "{ #{seg.join(', ')} }"
2349
- when Gem::Version then obj.to_s.dump
2298
+ "{ #{seg.join(", ")} }"
2299
+ when Gem::Version then ruby_code(obj.to_s)
2350
2300
  when DateLike then obj.strftime("%Y-%m-%d").dump
2351
2301
  when Time then obj.strftime("%Y-%m-%d").dump
2352
2302
  when Numeric then obj.inspect
2353
2303
  when true, false, nil then obj.inspect
2354
- when Gem::Platform then "Gem::Platform.new(#{obj.to_a.inspect})"
2304
+ when Gem::Platform then "Gem::Platform.new(#{ruby_code obj.to_a})"
2355
2305
  when Gem::Requirement then
2356
2306
  list = obj.as_list
2357
2307
  "Gem::Requirement.new(#{ruby_code(list.size == 1 ? obj.to_s : list)})"
@@ -2372,7 +2322,7 @@ class Gem::Specification < Gem::BasicSpecification
2372
2322
  # True if this gem has the same attributes as +other+.
2373
2323
 
2374
2324
  def same_attributes?(spec)
2375
- @@attributes.all? {|name, default| self.send(name) == spec.send(name) }
2325
+ @@attributes.all? {|name, _default| send(name) == spec.send(name) }
2376
2326
  end
2377
2327
 
2378
2328
  private :same_attributes?
@@ -2381,8 +2331,8 @@ class Gem::Specification < Gem::BasicSpecification
2381
2331
  # Checks if this specification meets the requirement of +dependency+.
2382
2332
 
2383
2333
  def satisfies_requirement?(dependency)
2384
- return @name == dependency.name &&
2385
- dependency.requirement.satisfied_by?(@version)
2334
+ @name == dependency.name &&
2335
+ dependency.requirement.satisfied_by?(@version)
2386
2336
  end
2387
2337
 
2388
2338
  ##
@@ -2471,7 +2421,6 @@ class Gem::Specification < Gem::BasicSpecification
2471
2421
  # still have their default values are omitted.
2472
2422
 
2473
2423
  def to_ruby
2474
- mark_version
2475
2424
  result = []
2476
2425
  result << "# -*- encoding: utf-8 -*-"
2477
2426
  result << "#{Gem::StubSpecification::PREFIX}#{name} #{version} #{platform} #{raw_require_paths.join("\0")}"
@@ -2509,19 +2458,19 @@ class Gem::Specification < Gem::BasicSpecification
2509
2458
 
2510
2459
  @@attributes.each do |attr_name|
2511
2460
  next if handled.include? attr_name
2512
- current_value = self.send(attr_name)
2461
+ current_value = send(attr_name)
2513
2462
  if current_value != default_value(attr_name) || self.class.required_attribute?(attr_name)
2514
2463
  result << " s.#{attr_name} = #{ruby_code current_value}"
2515
2464
  end
2516
2465
  end
2517
2466
 
2518
2467
  if String === signing_key
2519
- result << " s.signing_key = #{signing_key.dump}.freeze"
2468
+ result << " s.signing_key = #{ruby_code signing_key}"
2520
2469
  end
2521
2470
 
2522
2471
  if @installed_by_version
2523
2472
  result << nil
2524
- result << " s.installed_by_version = \"#{Gem::VERSION}\" if s.respond_to? :installed_by_version"
2473
+ result << " s.installed_by_version = #{ruby_code Gem::VERSION}"
2525
2474
  end
2526
2475
 
2527
2476
  unless dependencies.empty?
@@ -2530,9 +2479,8 @@ class Gem::Specification < Gem::BasicSpecification
2530
2479
  result << nil
2531
2480
 
2532
2481
  dependencies.each do |dep|
2533
- req = dep.requirements_list.inspect
2534
2482
  dep.instance_variable_set :@type, :runtime if dep.type.nil? # HACK
2535
- result << " s.add_#{dep.type}_dependency(%q<#{dep.name}>.freeze, #{req})"
2483
+ result << " s.add_#{dep.type}_dependency(%q<#{dep.name}>.freeze, #{ruby_code dep.requirements_list})"
2536
2484
  end
2537
2485
  end
2538
2486
 
@@ -2593,10 +2541,9 @@ class Gem::Specification < Gem::BasicSpecification
2593
2541
  def traverse(trail = [], visited = {}, &block)
2594
2542
  trail.push(self)
2595
2543
  begin
2596
- dependencies.each do |dep|
2597
- next unless dep.runtime?
2544
+ runtime_dependencies.each do |dep|
2598
2545
  dep.matching_specs(true).each do |dep_spec|
2599
- next if visited.has_key?(dep_spec)
2546
+ next if visited.key?(dep_spec)
2600
2547
  visited[dep_spec] = true
2601
2548
  trail.push(dep_spec)
2602
2549
  begin
@@ -2604,11 +2551,10 @@ class Gem::Specification < Gem::BasicSpecification
2604
2551
  ensure
2605
2552
  trail.pop
2606
2553
  end
2607
- unless result == :next
2608
- spec_name = dep_spec.name
2609
- dep_spec.traverse(trail, visited, &block) unless
2610
- trail.any? {|s| s.name == spec_name }
2611
- end
2554
+ next if result == :next
2555
+ spec_name = dep_spec.name
2556
+ dep_spec.traverse(trail, visited, &block) unless
2557
+ trail.any? {|s| s.name == spec_name }
2612
2558
  end
2613
2559
  end
2614
2560
  ensure
@@ -2639,6 +2585,10 @@ class Gem::Specification < Gem::BasicSpecification
2639
2585
  @test_files.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2640
2586
  end
2641
2587
 
2588
+ def validate_for_resolution
2589
+ Gem::SpecificationPolicy.new(self).validate_for_resolution
2590
+ end
2591
+
2642
2592
  def validate_metadata
2643
2593
  Gem::SpecificationPolicy.new(self).validate_metadata
2644
2594
  end
@@ -2655,22 +2605,13 @@ class Gem::Specification < Gem::BasicSpecification
2655
2605
  rubygems_deprecate :validate_permissions
2656
2606
 
2657
2607
  ##
2658
- # Set the version to +version+, potentially also setting
2659
- # required_rubygems_version if +version+ indicates it is a
2660
- # prerelease.
2608
+ # Set the version to +version+.
2661
2609
 
2662
2610
  def version=(version)
2663
2611
  @version = Gem::Version.create(version)
2664
2612
  return if @version.nil?
2665
2613
 
2666
- # skip to set required_ruby_version when pre-released rubygems.
2667
- # It caused to raise CircularDependencyError
2668
- if @version.prerelease? && (@name.nil? || @name.strip != "rubygems")
2669
- self.required_rubygems_version = "> 1.3.1"
2670
- end
2671
2614
  invalidate_memoized_attributes
2672
-
2673
- return @version
2674
2615
  end
2675
2616
 
2676
2617
  def stubbed?
@@ -2682,9 +2623,9 @@ class Gem::Specification < Gem::BasicSpecification
2682
2623
  case ivar
2683
2624
  when "date"
2684
2625
  # Force Date to go through the extra coerce logic in date=
2685
- self.date = val.tap(&Gem::UNTAINT)
2626
+ self.date = val
2686
2627
  else
2687
- instance_variable_set "@#{ivar}", val.tap(&Gem::UNTAINT)
2628
+ instance_variable_set "@#{ivar}", val
2688
2629
  end
2689
2630
  end
2690
2631
 
@@ -2701,17 +2642,19 @@ class Gem::Specification < Gem::BasicSpecification
2701
2642
  end
2702
2643
 
2703
2644
  nil_attributes.each do |attribute|
2704
- default = self.default_value attribute
2645
+ default = default_value attribute
2705
2646
 
2706
2647
  value = case default
2707
- when Time, Numeric, Symbol, true, false, nil then default
2708
- else default.dup
2648
+ when Time, Numeric, Symbol, true, false, nil then default
2649
+ else default.dup
2709
2650
  end
2710
2651
 
2711
2652
  instance_variable_set "@#{attribute}", value
2712
2653
  end
2713
2654
 
2714
2655
  @installed_by_version ||= nil
2656
+
2657
+ nil
2715
2658
  end
2716
2659
 
2717
2660
  def flatten_require_paths # :nodoc: