rubygems-update 3.1.6 → 3.3.22

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 (703) hide show
  1. checksums.yaml +4 -4
  2. data/{History.txt → CHANGELOG.md} +1452 -514
  3. data/CODE_OF_CONDUCT.md +55 -19
  4. data/CONTRIBUTING.md +74 -27
  5. data/Manifest.txt +154 -117
  6. data/POLICIES.md +27 -19
  7. data/README.md +10 -8
  8. data/UPGRADING.md +5 -81
  9. data/bin/gem +3 -8
  10. data/bin/update_rubygems +5 -5
  11. data/bundler/CHANGELOG.md +2358 -1430
  12. data/bundler/README.md +7 -9
  13. data/bundler/UPGRADING.md +27 -34
  14. data/bundler/bundler.gemspec +8 -11
  15. data/bundler/exe/bundle +10 -8
  16. data/bundler/exe/bundler +1 -1
  17. data/bundler/lib/bundler/.document +1 -0
  18. data/bundler/lib/bundler/build_metadata.rb +4 -12
  19. data/bundler/lib/bundler/cli/add.rb +1 -1
  20. data/bundler/lib/bundler/cli/binstubs.rb +6 -2
  21. data/bundler/lib/bundler/cli/cache.rb +3 -8
  22. data/bundler/lib/bundler/cli/check.rb +4 -2
  23. data/bundler/lib/bundler/cli/clean.rb +1 -1
  24. data/bundler/lib/bundler/cli/common.rb +31 -3
  25. data/bundler/lib/bundler/cli/config.rb +10 -1
  26. data/bundler/lib/bundler/cli/console.rb +1 -1
  27. data/bundler/lib/bundler/cli/doctor.rb +25 -6
  28. data/bundler/lib/bundler/cli/exec.rb +5 -10
  29. data/bundler/lib/bundler/cli/fund.rb +36 -0
  30. data/bundler/lib/bundler/cli/gem.rb +219 -28
  31. data/bundler/lib/bundler/cli/info.rb +38 -6
  32. data/bundler/lib/bundler/cli/init.rb +3 -3
  33. data/bundler/lib/bundler/cli/inject.rb +1 -1
  34. data/bundler/lib/bundler/cli/install.rb +25 -54
  35. data/bundler/lib/bundler/cli/issue.rb +5 -4
  36. data/bundler/lib/bundler/cli/list.rb +19 -11
  37. data/bundler/lib/bundler/cli/lock.rb +5 -1
  38. data/bundler/lib/bundler/cli/open.rb +1 -2
  39. data/bundler/lib/bundler/cli/outdated.rb +105 -76
  40. data/bundler/lib/bundler/cli/platform.rb +2 -2
  41. data/bundler/lib/bundler/cli/plugin.rb +10 -0
  42. data/bundler/lib/bundler/cli/pristine.rb +5 -0
  43. data/bundler/lib/bundler/cli/remove.rb +1 -2
  44. data/bundler/lib/bundler/cli/show.rb +2 -2
  45. data/bundler/lib/bundler/cli/update.rb +20 -9
  46. data/bundler/lib/bundler/cli.rb +106 -83
  47. data/bundler/lib/bundler/compact_index_client/cache.rb +6 -23
  48. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  49. data/bundler/lib/bundler/compact_index_client/updater.rb +29 -25
  50. data/bundler/lib/bundler/compact_index_client.rb +3 -9
  51. data/bundler/lib/bundler/current_ruby.rb +17 -6
  52. data/bundler/lib/bundler/definition.rb +297 -396
  53. data/bundler/lib/bundler/dep_proxy.rb +16 -9
  54. data/bundler/lib/bundler/dependency.rb +22 -77
  55. data/bundler/lib/bundler/digest.rb +71 -0
  56. data/bundler/lib/bundler/dsl.rb +76 -83
  57. data/bundler/lib/bundler/endpoint_specification.rb +16 -14
  58. data/bundler/lib/bundler/env.rb +2 -2
  59. data/bundler/lib/bundler/environment_preserver.rb +29 -2
  60. data/bundler/lib/bundler/errors.rb +30 -3
  61. data/bundler/lib/bundler/feature_flag.rb +0 -9
  62. data/bundler/lib/bundler/fetcher/base.rb +7 -9
  63. data/bundler/lib/bundler/fetcher/compact_index.rb +11 -16
  64. data/bundler/lib/bundler/fetcher/downloader.rb +10 -7
  65. data/bundler/lib/bundler/fetcher/index.rb +2 -30
  66. data/bundler/lib/bundler/fetcher.rb +24 -25
  67. data/bundler/lib/bundler/friendly_errors.rb +46 -47
  68. data/bundler/lib/bundler/gem_helper.rb +53 -31
  69. data/bundler/lib/bundler/gem_helpers.rb +43 -24
  70. data/bundler/lib/bundler/gem_version_promoter.rb +10 -20
  71. data/bundler/lib/bundler/graph.rb +1 -1
  72. data/bundler/lib/bundler/index.rb +19 -25
  73. data/bundler/lib/bundler/injector.rb +38 -6
  74. data/bundler/lib/bundler/inline.rb +4 -13
  75. data/bundler/lib/bundler/installer/gem_installer.rb +19 -24
  76. data/bundler/lib/bundler/installer/parallel_installer.rb +46 -25
  77. data/bundler/lib/bundler/installer/standalone.rb +58 -11
  78. data/bundler/lib/bundler/installer.rb +51 -81
  79. data/bundler/lib/bundler/lazy_specification.rb +79 -36
  80. data/bundler/lib/bundler/lockfile_generator.rb +3 -3
  81. data/bundler/lib/bundler/lockfile_parser.rb +19 -44
  82. data/bundler/lib/bundler/man/.document +1 -0
  83. data/bundler/{man → lib/bundler/man}/bundle-add.1 +21 -5
  84. data/bundler/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +16 -4
  85. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
  86. data/bundler/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  87. data/bundler/{man → lib/bundler/man}/bundle-cache.1 +7 -1
  88. data/bundler/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +7 -0
  89. data/bundler/{man → lib/bundler/man}/bundle-check.1 +1 -1
  90. data/bundler/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  91. data/bundler/{man → lib/bundler/man}/bundle-config.1 +65 -47
  92. data/bundler/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +74 -65
  93. data/bundler/lib/bundler/man/bundle-console.1 +53 -0
  94. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  95. data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  96. data/bundler/{man → lib/bundler/man}/bundle-exec.1 +2 -2
  97. data/bundler/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +1 -1
  98. data/bundler/{man → lib/bundler/man}/bundle-gem.1 +38 -3
  99. data/bundler/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +46 -7
  100. data/bundler/lib/bundler/man/bundle-help.1 +13 -0
  101. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  102. data/bundler/{man → lib/bundler/man}/bundle-info.1 +1 -1
  103. data/bundler/{man → lib/bundler/man}/bundle-init.1 +1 -1
  104. data/bundler/{man → lib/bundler/man}/bundle-inject.1 +5 -2
  105. data/bundler/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +3 -1
  106. data/bundler/{man → lib/bundler/man}/bundle-install.1 +35 -4
  107. data/bundler/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +33 -5
  108. data/bundler/{man → lib/bundler/man}/bundle-list.1 +7 -7
  109. data/bundler/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  110. data/bundler/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  111. data/bundler/{man → lib/bundler/man}/bundle-open.1 +1 -1
  112. data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +3 -10
  113. data/bundler/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +1 -10
  114. data/bundler/{man → lib/bundler/man}/bundle-platform.1 +16 -6
  115. data/bundler/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +14 -7
  116. data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
  117. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  118. data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  119. data/bundler/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  120. data/bundler/{man → lib/bundler/man}/bundle-show.1 +1 -1
  121. data/bundler/{man → lib/bundler/man}/bundle-update.1 +5 -5
  122. data/bundler/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +5 -4
  123. data/bundler/lib/bundler/man/bundle-version.1 +35 -0
  124. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  125. data/bundler/{man → lib/bundler/man}/bundle-viz.1 +4 -1
  126. data/bundler/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +2 -0
  127. data/bundler/{man → lib/bundler/man}/bundle.1 +15 -10
  128. data/bundler/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +12 -7
  129. data/bundler/{man → lib/bundler/man}/gemfile.5 +106 -80
  130. data/bundler/{man → lib/bundler/man}/gemfile.5.ronn +94 -83
  131. data/bundler/{man → lib/bundler/man}/index.txt +4 -0
  132. data/bundler/lib/bundler/match_metadata.rb +13 -0
  133. data/bundler/lib/bundler/match_platform.rb +0 -1
  134. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  135. data/bundler/lib/bundler/mirror.rb +2 -2
  136. data/bundler/lib/bundler/plugin/api/source.rb +25 -9
  137. data/bundler/lib/bundler/plugin/dsl.rb +1 -1
  138. data/bundler/lib/bundler/plugin/index.rb +13 -1
  139. data/bundler/lib/bundler/plugin/installer/git.rb +0 -4
  140. data/bundler/lib/bundler/plugin/installer/rubygems.rb +1 -5
  141. data/bundler/lib/bundler/plugin/installer.rb +11 -11
  142. data/bundler/lib/bundler/plugin/source_list.rb +5 -1
  143. data/bundler/lib/bundler/plugin.rb +58 -11
  144. data/bundler/lib/bundler/process_lock.rb +1 -1
  145. data/bundler/lib/bundler/remote_specification.rb +11 -6
  146. data/bundler/lib/bundler/resolver/base.rb +50 -0
  147. data/bundler/lib/bundler/resolver/spec_group.rb +64 -57
  148. data/bundler/lib/bundler/resolver.rb +234 -230
  149. data/bundler/lib/bundler/retry.rb +2 -2
  150. data/bundler/lib/bundler/ruby_dsl.rb +1 -1
  151. data/bundler/lib/bundler/ruby_version.rb +6 -19
  152. data/bundler/lib/bundler/rubygems_ext.rb +194 -33
  153. data/bundler/lib/bundler/rubygems_gem_installer.rb +87 -16
  154. data/bundler/lib/bundler/rubygems_integration.rb +71 -153
  155. data/bundler/lib/bundler/runtime.rb +22 -26
  156. data/bundler/lib/bundler/self_manager.rb +168 -0
  157. data/bundler/lib/bundler/settings.rb +145 -66
  158. data/bundler/lib/bundler/setup.rb +2 -2
  159. data/bundler/lib/bundler/shared_helpers.rb +17 -32
  160. data/bundler/lib/bundler/similarity_detector.rb +1 -1
  161. data/bundler/lib/bundler/source/git/git_proxy.rb +88 -84
  162. data/bundler/lib/bundler/source/git.rb +50 -32
  163. data/bundler/lib/bundler/source/metadata.rb +3 -7
  164. data/bundler/lib/bundler/source/path/installer.rb +10 -10
  165. data/bundler/lib/bundler/source/path.rb +10 -4
  166. data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
  167. data/bundler/lib/bundler/source/rubygems.rb +201 -179
  168. data/bundler/lib/bundler/source/rubygems_aggregate.rb +68 -0
  169. data/bundler/lib/bundler/source.rb +25 -5
  170. data/bundler/lib/bundler/source_list.rb +105 -63
  171. data/bundler/lib/bundler/source_map.rb +71 -0
  172. data/bundler/lib/bundler/spec_set.rb +62 -57
  173. data/bundler/lib/bundler/stub_specification.rb +30 -10
  174. data/bundler/lib/bundler/templates/Executable +2 -4
  175. data/bundler/lib/bundler/templates/Executable.bundler +8 -8
  176. data/bundler/lib/bundler/templates/Executable.standalone +2 -4
  177. data/bundler/lib/bundler/templates/Gemfile +0 -2
  178. data/bundler/lib/bundler/templates/gems.rb +0 -3
  179. data/bundler/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  180. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  181. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +12 -1
  182. data/bundler/lib/bundler/templates/newgem/README.md.tt +9 -14
  183. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +32 -5
  184. data/bundler/lib/bundler/templates/newgem/bin/console.tt +1 -0
  185. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  186. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  187. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +27 -0
  188. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  189. data/bundler/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  190. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  191. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +27 -17
  192. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  193. data/bundler/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  194. data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  195. data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  196. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  197. data/bundler/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  198. data/bundler/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/test_newgem.rb.tt} +3 -1
  199. data/bundler/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  200. data/bundler/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  201. data/bundler/lib/bundler/ui/shell.rb +6 -6
  202. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -1
  203. data/bundler/lib/bundler/vendor/.document +1 -0
  204. data/bundler/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  205. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
  206. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  207. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +57 -0
  208. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +39 -74
  209. data/bundler/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  210. data/bundler/lib/bundler/vendor/molinillo/LICENSE +9 -0
  211. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  212. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  213. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
  214. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +37 -5
  215. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +34 -28
  216. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  217. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +12 -1
  218. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +49 -47
  219. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  220. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  221. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
  222. data/bundler/lib/bundler/vendor/thor/LICENSE.md +20 -0
  223. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  224. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +9 -7
  225. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +1 -2
  226. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +7 -3
  227. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  228. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
  229. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +10 -5
  230. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
  231. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +28 -9
  232. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +27 -6
  233. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
  234. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  235. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  236. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  237. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +5 -13
  238. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  239. data/bundler/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  240. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +452 -0
  241. data/bundler/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  242. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +17 -80
  243. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -1
  244. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +5 -6
  245. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +0 -1
  246. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +0 -1
  247. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  248. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -1
  249. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +1 -14
  250. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -12
  251. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  252. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +84 -0
  253. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +22 -0
  254. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +0 -1
  255. data/bundler/lib/bundler/vendored_persistent.rb +0 -7
  256. data/bundler/lib/bundler/vendored_tmpdir.rb +4 -0
  257. data/bundler/lib/bundler/vendored_tsort.rb +4 -0
  258. data/bundler/lib/bundler/version.rb +1 -1
  259. data/bundler/lib/bundler/worker.rb +20 -5
  260. data/bundler/lib/bundler/yaml_serializer.rb +1 -1
  261. data/bundler/lib/bundler.rb +79 -47
  262. data/hide_lib_for_update/note.txt +0 -4
  263. data/lib/rubygems/available_set.rb +7 -9
  264. data/lib/rubygems/basic_specification.rb +23 -21
  265. data/lib/rubygems/bundler_version_finder.rb +26 -53
  266. data/lib/rubygems/command.rb +48 -45
  267. data/lib/rubygems/command_manager.rb +20 -14
  268. data/lib/rubygems/commands/build_command.rb +47 -27
  269. data/lib/rubygems/commands/cert_command.rb +78 -75
  270. data/lib/rubygems/commands/check_command.rb +20 -22
  271. data/lib/rubygems/commands/cleanup_command.rb +30 -26
  272. data/lib/rubygems/commands/contents_command.rb +16 -18
  273. data/lib/rubygems/commands/dependency_command.rb +39 -51
  274. data/lib/rubygems/commands/environment_command.rb +11 -10
  275. data/lib/rubygems/commands/fetch_command.rb +33 -16
  276. data/lib/rubygems/commands/generate_index_command.rb +17 -19
  277. data/lib/rubygems/commands/help_command.rb +6 -6
  278. data/lib/rubygems/commands/info_command.rb +10 -7
  279. data/lib/rubygems/commands/install_command.rb +29 -27
  280. data/lib/rubygems/commands/list_command.rb +9 -8
  281. data/lib/rubygems/commands/lock_command.rb +5 -7
  282. data/lib/rubygems/commands/mirror_command.rb +3 -5
  283. data/lib/rubygems/commands/open_command.rb +10 -14
  284. data/lib/rubygems/commands/outdated_command.rb +5 -7
  285. data/lib/rubygems/commands/owner_command.rb +26 -16
  286. data/lib/rubygems/commands/pristine_command.rb +61 -49
  287. data/lib/rubygems/commands/push_command.rb +22 -59
  288. data/lib/rubygems/commands/query_command.rb +21 -351
  289. data/lib/rubygems/commands/rdoc_command.rb +23 -25
  290. data/lib/rubygems/commands/search_command.rb +8 -8
  291. data/lib/rubygems/commands/server_command.rb +16 -77
  292. data/lib/rubygems/commands/setup_command.rb +255 -229
  293. data/lib/rubygems/commands/signin_command.rb +9 -11
  294. data/lib/rubygems/commands/signout_command.rb +7 -9
  295. data/lib/rubygems/commands/sources_command.rb +27 -25
  296. data/lib/rubygems/commands/specification_command.rb +25 -21
  297. data/lib/rubygems/commands/stale_command.rb +3 -5
  298. data/lib/rubygems/commands/uninstall_command.rb +41 -43
  299. data/lib/rubygems/commands/unpack_command.rb +13 -15
  300. data/lib/rubygems/commands/update_command.rb +132 -74
  301. data/lib/rubygems/commands/which_command.rb +7 -9
  302. data/lib/rubygems/commands/yank_command.rb +16 -19
  303. data/lib/rubygems/compatibility.rb +4 -2
  304. data/lib/rubygems/config_file.rb +42 -26
  305. data/lib/rubygems/core_ext/kernel_gem.rb +1 -1
  306. data/lib/rubygems/core_ext/kernel_require.rb +6 -3
  307. data/lib/rubygems/core_ext/kernel_warn.rb +12 -13
  308. data/lib/rubygems/core_ext/tcpsocket_init.rb +52 -0
  309. data/lib/rubygems/defaults.rb +108 -32
  310. data/lib/rubygems/dependency.rb +21 -22
  311. data/lib/rubygems/dependency_installer.rb +19 -91
  312. data/lib/rubygems/dependency_list.rb +13 -15
  313. data/lib/rubygems/deprecate.rb +102 -8
  314. data/lib/rubygems/doctor.rb +22 -22
  315. data/lib/rubygems/errors.rb +6 -21
  316. data/lib/rubygems/exceptions.rb +33 -34
  317. data/lib/rubygems/ext/build_error.rb +2 -0
  318. data/lib/rubygems/ext/builder.rb +48 -54
  319. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +23 -0
  320. data/lib/rubygems/ext/cargo_builder.rb +321 -0
  321. data/lib/rubygems/ext/cmake_builder.rb +6 -9
  322. data/lib/rubygems/ext/configure_builder.rb +5 -8
  323. data/lib/rubygems/ext/ext_conf_builder.rb +42 -66
  324. data/lib/rubygems/ext/rake_builder.rb +7 -10
  325. data/lib/rubygems/ext.rb +7 -6
  326. data/lib/rubygems/gem_runner.rb +15 -26
  327. data/lib/rubygems/gemcutter_utilities.rb +153 -32
  328. data/lib/rubygems/indexer.rb +30 -49
  329. data/lib/rubygems/install_default_message.rb +2 -2
  330. data/lib/rubygems/install_message.rb +2 -2
  331. data/lib/rubygems/install_update_options.rb +73 -64
  332. data/lib/rubygems/installer.rb +194 -151
  333. data/lib/rubygems/installer_uninstaller_utils.rb +29 -0
  334. data/lib/rubygems/local_remote_options.rb +22 -24
  335. data/lib/rubygems/mock_gem_ui.rb +2 -8
  336. data/lib/rubygems/name_tuple.rb +9 -14
  337. data/lib/rubygems/openssl.rb +7 -0
  338. data/lib/rubygems/optparse/.document +1 -0
  339. data/lib/rubygems/optparse/COPYING +56 -0
  340. data/lib/rubygems/optparse/lib/optionparser.rb +2 -0
  341. data/lib/rubygems/optparse/lib/optparse/ac.rb +54 -0
  342. data/lib/rubygems/optparse/lib/optparse/date.rb +18 -0
  343. data/lib/rubygems/optparse/lib/optparse/kwargs.rb +22 -0
  344. data/lib/rubygems/optparse/lib/optparse/shellwords.rb +7 -0
  345. data/lib/rubygems/optparse/lib/optparse/time.rb +11 -0
  346. data/lib/rubygems/optparse/lib/optparse/uri.rb +7 -0
  347. data/lib/rubygems/optparse/lib/optparse/version.rb +71 -0
  348. data/lib/rubygems/optparse/lib/optparse.rb +2303 -0
  349. data/lib/rubygems/optparse.rb +3 -0
  350. data/lib/rubygems/package/digest_io.rb +0 -2
  351. data/lib/rubygems/package/file_source.rb +2 -4
  352. data/lib/rubygems/package/io_source.rb +4 -2
  353. data/lib/rubygems/package/old.rb +9 -11
  354. data/lib/rubygems/package/tar_header.rb +54 -56
  355. data/lib/rubygems/package/tar_reader/entry.rb +2 -5
  356. data/lib/rubygems/package/tar_reader.rb +1 -4
  357. data/lib/rubygems/package/tar_writer.rb +8 -18
  358. data/lib/rubygems/package.rb +101 -117
  359. data/lib/rubygems/package_task.rb +5 -11
  360. data/lib/rubygems/path_support.rb +2 -9
  361. data/lib/rubygems/platform.rb +101 -76
  362. data/lib/rubygems/psych_tree.rb +1 -3
  363. data/lib/rubygems/query_utils.rb +351 -0
  364. data/lib/rubygems/rdoc.rb +2 -14
  365. data/lib/rubygems/remote_fetcher.rb +48 -74
  366. data/lib/rubygems/request/connection_pools.rb +6 -10
  367. data/lib/rubygems/request/http_pool.rb +2 -4
  368. data/lib/rubygems/request/https_pool.rb +0 -2
  369. data/lib/rubygems/request.rb +26 -31
  370. data/lib/rubygems/request_set/gem_dependency_api.rb +23 -25
  371. data/lib/rubygems/request_set/lockfile/parser.rb +26 -28
  372. data/lib/rubygems/request_set/lockfile/tokenizer.rb +5 -7
  373. data/lib/rubygems/request_set/lockfile.rb +17 -21
  374. data/lib/rubygems/request_set.rb +27 -40
  375. data/lib/rubygems/requirement.rb +28 -48
  376. data/lib/rubygems/resolver/activation_request.rb +12 -6
  377. data/lib/rubygems/resolver/api_set/gem_parser.rb +20 -0
  378. data/lib/rubygems/resolver/api_set.rb +32 -25
  379. data/lib/rubygems/resolver/api_specification.rb +29 -15
  380. data/lib/rubygems/resolver/best_set.rb +7 -9
  381. data/lib/rubygems/resolver/composed_set.rb +3 -5
  382. data/lib/rubygems/resolver/conflict.rb +12 -14
  383. data/lib/rubygems/resolver/current_set.rb +0 -2
  384. data/lib/rubygems/resolver/dependency_request.rb +3 -5
  385. data/lib/rubygems/resolver/git_set.rb +2 -4
  386. data/lib/rubygems/resolver/git_specification.rb +6 -8
  387. data/lib/rubygems/resolver/index_set.rb +4 -6
  388. data/lib/rubygems/resolver/index_specification.rb +38 -7
  389. data/lib/rubygems/resolver/installed_specification.rb +4 -6
  390. data/lib/rubygems/resolver/installer_set.rb +66 -24
  391. data/lib/rubygems/resolver/local_specification.rb +2 -4
  392. data/lib/rubygems/resolver/lock_set.rb +6 -8
  393. data/lib/rubygems/resolver/lock_specification.rb +4 -6
  394. data/lib/rubygems/resolver/molinillo/LICENSE +9 -0
  395. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  396. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +8 -0
  397. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  398. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +2 -1
  399. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +2 -1
  400. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +2 -1
  401. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +2 -1
  402. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +7 -6
  403. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +2 -1
  404. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +4 -3
  405. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +51 -12
  406. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +41 -8
  407. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +76 -8
  408. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  409. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +13 -1
  410. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
  411. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +510 -165
  412. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
  413. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +8 -4
  414. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
  415. data/lib/rubygems/resolver/molinillo.rb +1 -1
  416. data/lib/rubygems/resolver/requirement_list.rb +0 -2
  417. data/lib/rubygems/resolver/set.rb +0 -3
  418. data/lib/rubygems/resolver/source_set.rb +0 -2
  419. data/lib/rubygems/resolver/spec_specification.rb +14 -2
  420. data/lib/rubygems/resolver/specification.rb +14 -4
  421. data/lib/rubygems/resolver/stats.rb +0 -2
  422. data/lib/rubygems/resolver/vendor_set.rb +1 -3
  423. data/lib/rubygems/resolver/vendor_specification.rb +3 -5
  424. data/lib/rubygems/resolver.rb +53 -51
  425. data/lib/rubygems/s3_uri_signer.rb +7 -15
  426. data/lib/rubygems/safe_yaml.rb +14 -16
  427. data/lib/rubygems/security/policies.rb +11 -11
  428. data/lib/rubygems/security/policy.rb +25 -29
  429. data/lib/rubygems/security/signer.rb +13 -16
  430. data/lib/rubygems/security/trust_dir.rb +4 -5
  431. data/lib/rubygems/security.rb +103 -69
  432. data/lib/rubygems/security_option.rb +7 -7
  433. data/lib/rubygems/source/git.rb +30 -30
  434. data/lib/rubygems/source/installed.rb +1 -3
  435. data/lib/rubygems/source/local.rb +4 -6
  436. data/lib/rubygems/source/lock.rb +0 -2
  437. data/lib/rubygems/source/specific_file.rb +1 -3
  438. data/lib/rubygems/source/vendor.rb +0 -2
  439. data/lib/rubygems/source.rb +44 -38
  440. data/lib/rubygems/source_list.rb +9 -16
  441. data/lib/rubygems/spec_fetcher.rb +49 -48
  442. data/lib/rubygems/specification.rb +338 -295
  443. data/lib/rubygems/specification_policy.rb +112 -61
  444. data/lib/rubygems/stub_specification.rb +21 -28
  445. data/lib/rubygems/text.rb +21 -20
  446. data/lib/rubygems/tsort/.document +1 -0
  447. data/lib/rubygems/tsort/LICENSE.txt +22 -0
  448. data/lib/rubygems/tsort/lib/tsort.rb +454 -0
  449. data/lib/rubygems/tsort.rb +3 -0
  450. data/lib/rubygems/uninstaller.rb +98 -45
  451. data/lib/rubygems/unknown_command_spell_checker.rb +21 -0
  452. data/lib/rubygems/uri.rb +126 -0
  453. data/lib/rubygems/uri_formatter.rb +2 -3
  454. data/lib/rubygems/user_interaction.rb +43 -54
  455. data/lib/rubygems/util/licenses.rb +115 -10
  456. data/lib/rubygems/util/list.rb +0 -2
  457. data/lib/rubygems/util.rb +18 -12
  458. data/lib/rubygems/validator.rb +6 -8
  459. data/lib/rubygems/version.rb +29 -20
  460. data/lib/rubygems/version_option.rb +11 -5
  461. data/lib/rubygems.rb +192 -289
  462. data/rubygems-update.gemspec +4 -4
  463. data/setup.rb +11 -22
  464. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  465. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  466. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  467. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  468. data/test/rubygems/encrypted_private_key.pem +26 -26
  469. data/{lib/rubygems/test_case.rb → test/rubygems/helper.rb} +380 -314
  470. data/{lib → test}/rubygems/installer_test_case.rb +38 -24
  471. data/{lib → test}/rubygems/package/tar_test_case.rb +4 -6
  472. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  473. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  474. data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -1
  475. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -2
  476. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -1
  477. data/test/rubygems/private_ec_key.pem +9 -0
  478. data/test/rubygems/rubygems/commands/crash_command.rb +0 -2
  479. data/test/rubygems/rubygems_plugin.rb +2 -4
  480. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -2
  481. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +4 -6
  482. data/test/rubygems/test_bundled_ca.rb +43 -50
  483. data/test/rubygems/test_config.rb +5 -7
  484. data/test/rubygems/test_deprecate.rb +87 -10
  485. data/test/rubygems/test_exit.rb +11 -0
  486. data/test/rubygems/test_gem.rb +719 -639
  487. data/test/rubygems/test_gem_available_set.rb +24 -26
  488. data/test/rubygems/test_gem_bundler_version_finder.rb +37 -44
  489. data/test/rubygems/test_gem_command.rb +78 -49
  490. data/test/rubygems/test_gem_command_manager.rb +98 -35
  491. data/test/rubygems/test_gem_commands_build_command.rb +275 -57
  492. data/test/rubygems/test_gem_commands_cert_command.rb +180 -125
  493. data/test/rubygems/test_gem_commands_check_command.rb +9 -11
  494. data/test/rubygems/test_gem_commands_cleanup_command.rb +78 -69
  495. data/test/rubygems/test_gem_commands_contents_command.rb +73 -42
  496. data/test/rubygems/test_gem_commands_dependency_command.rb +38 -40
  497. data/test/rubygems/test_gem_commands_environment_command.rb +60 -38
  498. data/test/rubygems/test_gem_commands_fetch_command.rb +163 -32
  499. data/test/rubygems/test_gem_commands_generate_index_command.rb +8 -14
  500. data/test/rubygems/test_gem_commands_help_command.rb +34 -16
  501. data/test/rubygems/test_gem_commands_info_command.rb +33 -9
  502. data/test/rubygems/test_gem_commands_install_command.rb +401 -198
  503. data/test/rubygems/test_gem_commands_list_command.rb +5 -7
  504. data/test/rubygems/test_gem_commands_lock_command.rb +11 -13
  505. data/test/rubygems/test_gem_commands_mirror.rb +3 -5
  506. data/test/rubygems/test_gem_commands_open_command.rb +16 -19
  507. data/test/rubygems/test_gem_commands_outdated_command.rb +23 -7
  508. data/test/rubygems/test_gem_commands_owner_command.rb +100 -46
  509. data/test/rubygems/test_gem_commands_pristine_command.rb +131 -99
  510. data/test/rubygems/test_gem_commands_push_command.rb +134 -66
  511. data/test/rubygems/test_gem_commands_query_command.rb +91 -91
  512. data/test/rubygems/test_gem_commands_search_command.rb +2 -4
  513. data/test/rubygems/test_gem_commands_server_command.rb +6 -50
  514. data/test/rubygems/test_gem_commands_setup_command.rb +288 -179
  515. data/test/rubygems/test_gem_commands_signin_command.rb +162 -28
  516. data/test/rubygems/test_gem_commands_signout_command.rb +3 -10
  517. data/test/rubygems/test_gem_commands_sources_command.rb +139 -32
  518. data/test/rubygems/test_gem_commands_specification_command.rb +81 -55
  519. data/test/rubygems/test_gem_commands_stale_command.rb +4 -6
  520. data/test/rubygems/test_gem_commands_uninstall_command.rb +80 -82
  521. data/test/rubygems/test_gem_commands_unpack_command.rb +32 -34
  522. data/test/rubygems/test_gem_commands_update_command.rb +335 -88
  523. data/test/rubygems/test_gem_commands_which_command.rb +12 -14
  524. data/test/rubygems/test_gem_commands_yank_command.rb +80 -44
  525. data/test/rubygems/test_gem_config_file.rb +114 -97
  526. data/test/rubygems/test_gem_dependency.rb +87 -87
  527. data/test/rubygems/test_gem_dependency_installer.rb +277 -391
  528. data/test/rubygems/test_gem_dependency_list.rb +57 -59
  529. data/test/rubygems/test_gem_dependency_resolution_error.rb +5 -7
  530. data/test/rubygems/test_gem_doctor.rb +73 -47
  531. data/test/rubygems/test_gem_ext_builder.rb +115 -109
  532. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +1 -0
  533. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +243 -0
  534. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +10 -0
  535. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +21 -0
  536. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +10 -0
  537. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs +27 -0
  538. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +1 -0
  539. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +243 -0
  540. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +10 -0
  541. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +21 -0
  542. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +8 -0
  543. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +39 -0
  544. data/test/rubygems/test_gem_ext_cargo_builder.rb +178 -0
  545. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +33 -0
  546. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +75 -0
  547. data/test/rubygems/test_gem_ext_cmake_builder.rb +31 -38
  548. data/test/rubygems/test_gem_ext_configure_builder.rb +23 -39
  549. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +66 -82
  550. data/test/rubygems/test_gem_ext_rake_builder.rb +49 -32
  551. data/test/rubygems/test_gem_gem_runner.rb +51 -8
  552. data/test/rubygems/test_gem_gemcutter_utilities.rb +87 -76
  553. data/test/rubygems/test_gem_impossible_dependencies_error.rb +4 -6
  554. data/test/rubygems/test_gem_indexer.rb +62 -64
  555. data/test/rubygems/test_gem_install_update_options.rb +31 -21
  556. data/test/rubygems/test_gem_installer.rb +798 -491
  557. data/test/rubygems/test_gem_local_remote_options.rb +11 -13
  558. data/test/rubygems/test_gem_name_tuple.rb +4 -6
  559. data/test/rubygems/test_gem_package.rb +318 -283
  560. data/test/rubygems/test_gem_package_old.rb +18 -20
  561. data/test/rubygems/test_gem_package_tar_header.rb +64 -47
  562. data/test/rubygems/test_gem_package_tar_reader.rb +8 -10
  563. data/test/rubygems/test_gem_package_tar_reader_entry.rb +18 -20
  564. data/test/rubygems/test_gem_package_tar_writer.rb +96 -100
  565. data/test/rubygems/test_gem_package_task.rb +58 -25
  566. data/test/rubygems/test_gem_path_support.rb +15 -21
  567. data/test/rubygems/test_gem_platform.rb +354 -201
  568. data/test/rubygems/test_gem_rdoc.rb +19 -21
  569. data/test/rubygems/test_gem_remote_fetcher.rb +376 -337
  570. data/test/rubygems/test_gem_request.rb +114 -86
  571. data/test/rubygems/test_gem_request_connection_pools.rb +30 -34
  572. data/test/rubygems/test_gem_request_set.rb +123 -124
  573. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +222 -226
  574. data/test/rubygems/test_gem_request_set_lockfile.rb +93 -95
  575. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +68 -70
  576. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +136 -138
  577. data/test/rubygems/test_gem_requirement.rb +133 -54
  578. data/test/rubygems/test_gem_resolver.rb +149 -117
  579. data/test/rubygems/test_gem_resolver_activation_request.rb +6 -8
  580. data/test/rubygems/test_gem_resolver_api_set.rb +79 -78
  581. data/test/rubygems/test_gem_resolver_api_specification.rb +47 -49
  582. data/test/rubygems/test_gem_resolver_best_set.rb +43 -22
  583. data/test/rubygems/test_gem_resolver_composed_set.rb +1 -3
  584. data/test/rubygems/test_gem_resolver_conflict.rb +12 -14
  585. data/test/rubygems/test_gem_resolver_dependency_request.rb +15 -17
  586. data/test/rubygems/test_gem_resolver_git_set.rb +22 -24
  587. data/test/rubygems/test_gem_resolver_git_specification.rb +22 -23
  588. data/test/rubygems/test_gem_resolver_index_set.rb +14 -16
  589. data/test/rubygems/test_gem_resolver_index_specification.rb +16 -18
  590. data/test/rubygems/test_gem_resolver_installed_specification.rb +5 -7
  591. data/test/rubygems/test_gem_resolver_installer_set.rb +104 -44
  592. data/test/rubygems/test_gem_resolver_local_specification.rb +7 -9
  593. data/test/rubygems/test_gem_resolver_lock_set.rb +15 -17
  594. data/test/rubygems/test_gem_resolver_lock_specification.rb +17 -19
  595. data/test/rubygems/test_gem_resolver_requirement_list.rb +1 -3
  596. data/test/rubygems/test_gem_resolver_specification.rb +8 -12
  597. data/test/rubygems/test_gem_resolver_vendor_set.rb +9 -11
  598. data/test/rubygems/test_gem_resolver_vendor_specification.rb +10 -12
  599. data/test/rubygems/test_gem_security.rb +104 -78
  600. data/test/rubygems/test_gem_security_policy.rb +92 -97
  601. data/test/rubygems/test_gem_security_signer.rb +45 -47
  602. data/test/rubygems/test_gem_security_trust_dir.rb +12 -14
  603. data/test/rubygems/test_gem_silent_ui.rb +46 -42
  604. data/test/rubygems/test_gem_source.rb +53 -52
  605. data/test/rubygems/test_gem_source_fetch_problem.rb +16 -8
  606. data/test/rubygems/test_gem_source_git.rb +69 -69
  607. data/test/rubygems/test_gem_source_installed.rb +16 -18
  608. data/test/rubygems/test_gem_source_list.rb +5 -6
  609. data/test/rubygems/test_gem_source_local.rb +15 -17
  610. data/test/rubygems/test_gem_source_lock.rb +31 -33
  611. data/test/rubygems/test_gem_source_specific_file.rb +18 -20
  612. data/test/rubygems/test_gem_source_subpath_problem.rb +49 -0
  613. data/test/rubygems/test_gem_source_vendor.rb +13 -15
  614. data/test/rubygems/test_gem_spec_fetcher.rb +74 -67
  615. data/test/rubygems/test_gem_specification.rb +888 -1024
  616. data/test/rubygems/test_gem_stream_ui.rb +23 -23
  617. data/test/rubygems/test_gem_stub_specification.rb +39 -57
  618. data/test/rubygems/test_gem_text.rb +8 -4
  619. data/test/rubygems/test_gem_uninstaller.rb +233 -104
  620. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +3 -5
  621. data/test/rubygems/test_gem_uri.rb +39 -0
  622. data/test/rubygems/test_gem_uri_formatter.rb +14 -16
  623. data/test/rubygems/test_gem_util.rb +37 -35
  624. data/test/rubygems/test_gem_validator.rb +10 -12
  625. data/test/rubygems/test_gem_version.rb +31 -31
  626. data/test/rubygems/test_gem_version_option.rb +16 -18
  627. data/test/rubygems/test_kernel.rb +46 -60
  628. data/test/rubygems/test_project_sanity.rb +8 -3
  629. data/test/rubygems/test_remote_fetch_error.rb +7 -9
  630. data/test/rubygems/test_require.rb +240 -167
  631. data/test/rubygems/test_rubygems.rb +74 -0
  632. data/{lib/rubygems/test_utilities.rb → test/rubygems/utilities.rb} +30 -39
  633. data/test/test_changelog_generator.rb +17 -0
  634. metadata +158 -146
  635. data/.bundle/config +0 -2
  636. data/.rubocop.yml +0 -91
  637. data/Gemfile +0 -8
  638. data/Gemfile.lock +0 -43
  639. data/Rakefile +0 -428
  640. data/bundler/CODE_OF_CONDUCT.md +0 -136
  641. data/bundler/lib/bundler/gemdeps.rb +0 -29
  642. data/bundler/lib/bundler/psyched_yaml.rb +0 -37
  643. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
  644. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  645. data/bundler/man/bundle-add.1.txt +0 -58
  646. data/bundler/man/bundle-binstubs.1.txt +0 -48
  647. data/bundler/man/bundle-cache.1.txt +0 -78
  648. data/bundler/man/bundle-check.1.txt +0 -33
  649. data/bundler/man/bundle-clean.1.txt +0 -26
  650. data/bundler/man/bundle-config.1.txt +0 -528
  651. data/bundler/man/bundle-doctor.1.txt +0 -44
  652. data/bundler/man/bundle-exec.1.txt +0 -178
  653. data/bundler/man/bundle-gem.1.txt +0 -91
  654. data/bundler/man/bundle-info.1.txt +0 -21
  655. data/bundler/man/bundle-init.1.txt +0 -34
  656. data/bundler/man/bundle-inject.1.txt +0 -32
  657. data/bundler/man/bundle-install.1.txt +0 -401
  658. data/bundler/man/bundle-list.1.txt +0 -43
  659. data/bundler/man/bundle-lock.1.txt +0 -93
  660. data/bundler/man/bundle-open.1.txt +0 -29
  661. data/bundler/man/bundle-outdated.1.txt +0 -131
  662. data/bundler/man/bundle-platform.1.txt +0 -57
  663. data/bundler/man/bundle-pristine.1.txt +0 -44
  664. data/bundler/man/bundle-remove.1.txt +0 -34
  665. data/bundler/man/bundle-show.1.txt +0 -27
  666. data/bundler/man/bundle-update.1.txt +0 -390
  667. data/bundler/man/bundle-viz.1.txt +0 -39
  668. data/bundler/man/bundle.1.txt +0 -116
  669. data/bundler/man/gemfile.5.txt +0 -649
  670. data/lib/rubygems/psych_additions.rb +0 -10
  671. data/lib/rubygems/server.rb +0 -879
  672. data/lib/rubygems/source_local.rb +0 -7
  673. data/lib/rubygems/source_specific_file.rb +0 -6
  674. data/lib/rubygems/syck_hack.rb +0 -79
  675. data/lib/rubygems/uri_parser.rb +0 -36
  676. data/lib/rubygems/uri_parsing.rb +0 -23
  677. data/lib/ubygems.rb +0 -14
  678. data/test/rubygems/bogussources.rb +0 -9
  679. data/test/rubygems/data/null-type.gemspec.rz +0 -0
  680. data/test/rubygems/test_gem_server.rb +0 -612
  681. data/tmp/.keep +0 -0
  682. data/util/CL2notes +0 -55
  683. data/util/bisect +0 -10
  684. data/util/ci.sh +0 -62
  685. data/util/cops/deprecations.rb +0 -52
  686. data/util/create_certs.rb +0 -171
  687. data/util/create_certs.sh +0 -27
  688. data/util/create_encrypted_key.rb +0 -16
  689. data/util/generate_spdx_license_list.rb +0 -63
  690. data/util/patch_with_prs.rb +0 -77
  691. data/util/rubocop +0 -8
  692. data/util/update_bundled_ca_certificates.rb +0 -137
  693. data/util/update_changelog.rb +0 -64
  694. /data/bundler/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  695. /data/bundler/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  696. /data/bundler/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  697. /data/bundler/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  698. /data/bundler/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  699. /data/bundler/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  700. /data/bundler/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  701. /data/bundler/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  702. /data/bundler/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  703. /data/bundler/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
@@ -1,19 +1,16 @@
1
1
  # frozen_string_literal: true
2
- # -*- coding: utf-8 -*-
2
+ #
3
3
  #--
4
4
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
5
5
  # All rights reserved.
6
6
  # See LICENSE.txt for permissions.
7
7
  #++
8
8
 
9
- require 'rubygems/version'
10
- require 'rubygems/requirement'
11
- require 'rubygems/platform'
12
- require 'rubygems/deprecate'
13
- require 'rubygems/basic_specification'
14
- require 'rubygems/stub_specification'
15
- require 'rubygems/specification_policy'
16
- require 'rubygems/util/list'
9
+ require_relative "deprecate"
10
+ require_relative "basic_specification"
11
+ require_relative "stub_specification"
12
+ require_relative "platform"
13
+ require_relative "util/list"
17
14
 
18
15
  ##
19
16
  # The Specification class contains the information for a gem. Typically
@@ -37,7 +34,6 @@ require 'rubygems/util/list'
37
34
  # items you may add to a specification.
38
35
 
39
36
  class Gem::Specification < Gem::BasicSpecification
40
-
41
37
  extend Gem::Deprecate
42
38
 
43
39
  # REFACTOR: Consider breaking out this version stuff into a separate
@@ -78,21 +74,21 @@ class Gem::Specification < Gem::BasicSpecification
78
74
  # key should be equal to the CURRENT_SPECIFICATION_VERSION.
79
75
 
80
76
  SPECIFICATION_VERSION_HISTORY = { # :nodoc:
81
- -1 => ['(RubyGems versions up to and including 0.7 did not have versioned specifications)'],
77
+ -1 => ["(RubyGems versions up to and including 0.7 did not have versioned specifications)"],
82
78
  1 => [
83
79
  'Deprecated "test_suite_file" in favor of the new, but equivalent, "test_files"',
84
- '"test_file=x" is a shortcut for "test_files=[x]"'
80
+ '"test_file=x" is a shortcut for "test_files=[x]"',
85
81
  ],
86
82
  2 => [
87
83
  'Added "required_rubygems_version"',
88
- 'Now forward-compatible with future versions',
84
+ "Now forward-compatible with future versions",
89
85
  ],
90
86
  3 => [
91
- 'Added Fixnum validation to the specification_version'
87
+ "Added Fixnum validation to the specification_version",
92
88
  ],
93
89
  4 => [
94
- 'Added sandboxed freeform metadata to the specification version.'
95
- ]
90
+ "Added sandboxed freeform metadata to the specification version.",
91
+ ],
96
92
  }.freeze
97
93
 
98
94
  MARSHAL_FIELDS = { # :nodoc:
@@ -106,12 +102,8 @@ class Gem::Specification < Gem::BasicSpecification
106
102
  today = Time.now.utc
107
103
  TODAY = Time.utc(today.year, today.month, today.day) # :nodoc:
108
104
 
109
- # rubocop:disable Style/MutableConstant
110
- LOAD_CACHE = {} # :nodoc:
111
- # rubocop:enable Style/MutableConstant
112
- LOAD_CACHE_MUTEX = Mutex.new
113
-
114
- private_constant :LOAD_CACHE if defined? private_constant
105
+ @load_cache = {} # :nodoc:
106
+ @load_cache_mutex = Thread::Mutex.new
115
107
 
116
108
  VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/.freeze # :nodoc:
117
109
 
@@ -134,7 +126,7 @@ class Gem::Specification < Gem::BasicSpecification
134
126
  @@default_value = {
135
127
  :authors => [],
136
128
  :autorequire => nil,
137
- :bindir => 'bin',
129
+ :bindir => "bin",
138
130
  :cert_chain => [],
139
131
  :date => nil,
140
132
  :dependencies => [],
@@ -151,7 +143,7 @@ class Gem::Specification < Gem::BasicSpecification
151
143
  :platform => Gem::Platform::RUBY,
152
144
  :post_install_message => nil,
153
145
  :rdoc_options => [],
154
- :require_paths => ['lib'],
146
+ :require_paths => ["lib"],
155
147
  :required_ruby_version => Gem::Requirement.default,
156
148
  :required_rubygems_version => Gem::Requirement.default,
157
149
  :requirements => [],
@@ -164,34 +156,41 @@ class Gem::Specification < Gem::BasicSpecification
164
156
  }.freeze
165
157
 
166
158
  # rubocop:disable Style/MutableConstant
167
- INITIALIZE_CODE_FOR_DEFAULTS = { } # :nodoc:
159
+ INITIALIZE_CODE_FOR_DEFAULTS = {} # :nodoc:
168
160
  # rubocop:enable Style/MutableConstant
169
161
 
170
162
  @@default_value.each do |k,v|
171
163
  INITIALIZE_CODE_FOR_DEFAULTS[k] = case v
172
- when [], {}, true, false, nil, Numeric, Symbol
173
- v.inspect
174
- when String
175
- v.dump
176
- when Numeric
177
- "default_value(:#{k})"
178
- else
179
- "default_value(:#{k}).dup"
180
- end
181
- end
182
-
183
- @@attributes = @@default_value.keys.sort_by { |s| s.to_s }
184
- @@array_attributes = @@default_value.reject { |k,v| v != [] }.keys
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"
172
+ end
173
+ end
174
+
175
+ @@attributes = @@default_value.keys.sort_by {|s| s.to_s }
176
+ @@array_attributes = @@default_value.reject {|k,v| v != [] }.keys
185
177
  @@nil_attributes, @@non_nil_attributes = @@default_value.keys.partition do |k|
186
178
  @@default_value[k].nil?
187
179
  end
188
180
 
189
- @@stubs_by_name = {}
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
190
191
 
191
192
  # Sentinel object to represent "not found" stubs
192
193
  NOT_FOUND = Struct.new(:to_spec, :this).new # :nodoc:
193
- @@spec_with_requirable_file = {}
194
- @@active_stub_with_requirable_file = {}
195
194
 
196
195
  # Tracking removed method calls to warn users during build time.
197
196
  REMOVED_METHODS = [:rubyforge_project=].freeze # :nodoc:
@@ -225,7 +224,7 @@ class Gem::Specification < Gem::BasicSpecification
225
224
  attr_reader :version
226
225
 
227
226
  ##
228
- # A short summary of this gem's description. Displayed in `gem list -d`.
227
+ # A short summary of this gem's description. Displayed in <tt>gem list -d</tt>.
229
228
  #
230
229
  # The #description should be more detailed than the summary.
231
230
  #
@@ -249,12 +248,11 @@ class Gem::Specification < Gem::BasicSpecification
249
248
  # require 'rake'
250
249
  # spec.files = FileList['lib/**/*.rb',
251
250
  # 'bin/*',
252
- # '[A-Z]*',
253
- # 'test/**/*'].to_a
251
+ # '[A-Z]*'].to_a
254
252
  #
255
253
  # # or without Rake...
256
254
  # spec.files = Dir['lib/**/*.rb'] + Dir['bin/*']
257
- # spec.files += Dir['[A-Z]*'] + Dir['test/**/*']
255
+ # spec.files += Dir['[A-Z]*']
258
256
  # spec.files.reject! { |fn| fn.include? "CVS" }
259
257
 
260
258
  def files
@@ -272,7 +270,7 @@ class Gem::Specification < Gem::BasicSpecification
272
270
  # A list of authors for this gem.
273
271
  #
274
272
  # Alternatively, a single author can be specified by assigning a string to
275
- # `spec.author`
273
+ # +spec.author+
276
274
  #
277
275
  # Usage:
278
276
  #
@@ -285,6 +283,15 @@ class Gem::Specification < Gem::BasicSpecification
285
283
  ######################################################################
286
284
  # :section: Recommended gemspec attributes
287
285
 
286
+ ##
287
+ # The version of Ruby required by this gem
288
+ #
289
+ # Usage:
290
+ #
291
+ # spec.required_ruby_version = '>= 2.7.0'
292
+
293
+ attr_reader :required_ruby_version
294
+
288
295
  ##
289
296
  # A long description of this gem
290
297
  #
@@ -328,17 +335,21 @@ class Gem::Specification < Gem::BasicSpecification
328
335
  # This should just be the name of your license. The full text of the license
329
336
  # should be inside of the gem (at the top level) when you build it.
330
337
  #
331
- # The simplest way, is to specify the standard SPDX ID
338
+ # The simplest way is to specify the standard SPDX ID
332
339
  # https://spdx.org/licenses/ for the license.
333
- # Ideally you should pick one that is OSI (Open Source Initiative)
340
+ # Ideally, you should pick one that is OSI (Open Source Initiative)
334
341
  # http://opensource.org/licenses/alphabetical approved.
335
342
  #
336
- # The most commonly used OSI approved licenses are MIT and Apache-2.0.
343
+ # The most commonly used OSI-approved licenses are MIT and Apache-2.0.
337
344
  # GitHub also provides a license picker at http://choosealicense.com/.
338
345
  #
346
+ # You can also use a custom license file along with your gemspec and specify
347
+ # a LicenseRef-<idstring>, where idstring is the name of the file containing
348
+ # the license text.
349
+ #
339
350
  # You should specify a license for your gem so that people know how they are
340
- # permitted to use it, and any restrictions you're placing on it. Not
341
- # specifying a license means all rights are reserved; others have no rights
351
+ # permitted to use it and any restrictions you're placing on it. Not
352
+ # specifying a license means all rights are reserved; others have no right
342
353
  # to use the code for any purpose.
343
354
  #
344
355
  # You can set multiple licenses with #licenses=
@@ -390,6 +401,7 @@ class Gem::Specification < Gem::BasicSpecification
390
401
  # "mailing_list_uri" => "https://groups.example.com/bestgemever",
391
402
  # "source_code_uri" => "https://example.com/user/bestgemever",
392
403
  # "wiki_uri" => "https://example.com/user/bestgemever/wiki"
404
+ # "funding_uri" => "https://example.com/donate"
393
405
  # }
394
406
  #
395
407
  # These links will be used on your gem's page on rubygems.org and must pass
@@ -461,7 +473,7 @@ class Gem::Specification < Gem::BasicSpecification
461
473
  # spec.platform = Gem::Platform.local
462
474
 
463
475
  def platform=(platform)
464
- if @original_platform.nil? or
476
+ if @original_platform.nil? ||
465
477
  @original_platform == Gem::Platform::RUBY
466
478
  @original_platform = platform
467
479
  end
@@ -477,12 +489,12 @@ class Gem::Specification < Gem::BasicSpecification
477
489
  # legacy constants
478
490
  when nil, Gem::Platform::RUBY then
479
491
  @new_platform = Gem::Platform::RUBY
480
- when 'mswin32' then # was Gem::Platform::WIN32
481
- @new_platform = Gem::Platform.new 'x86-mswin32'
482
- when 'i586-linux' then # was Gem::Platform::LINUX_586
483
- @new_platform = Gem::Platform.new 'x86-linux'
484
- when 'powerpc-darwin' then # was Gem::Platform::DARWIN
485
- @new_platform = Gem::Platform.new 'ppc-darwin'
492
+ when "mswin32" then # was Gem::Platform::WIN32
493
+ @new_platform = Gem::Platform.new "x86-mswin32"
494
+ when "i586-linux" then # was Gem::Platform::LINUX_586
495
+ @new_platform = Gem::Platform.new "x86-linux"
496
+ when "powerpc-darwin" then # was Gem::Platform::DARWIN
497
+ @new_platform = Gem::Platform.new "ppc-darwin"
486
498
  else
487
499
  @new_platform = Gem::Platform.new platform
488
500
  end
@@ -515,11 +527,6 @@ class Gem::Specification < Gem::BasicSpecification
515
527
  @require_paths = Array(val)
516
528
  end
517
529
 
518
- ##
519
- # The version of Ruby required by this gem
520
-
521
- attr_reader :required_ruby_version
522
-
523
530
  ##
524
531
  # The RubyGems version required by this gem
525
532
 
@@ -560,6 +567,10 @@ class Gem::Specification < Gem::BasicSpecification
560
567
  # spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'
561
568
 
562
569
  def add_runtime_dependency(gem, *requirements)
570
+ if requirements.uniq.size != requirements.size
571
+ warn "WARNING: duplicated #{gem} dependency #{requirements}"
572
+ end
573
+
563
574
  add_dependency_with_type(gem, :runtime, requirements)
564
575
  end
565
576
 
@@ -645,6 +656,8 @@ class Gem::Specification < Gem::BasicSpecification
645
656
  @rdoc_options ||= []
646
657
  end
647
658
 
659
+ LATEST_RUBY_WITHOUT_PATCH_VERSIONS = Gem::Version.new("2.1")
660
+
648
661
  ##
649
662
  # The version of Ruby required by this gem. The ruby version can be
650
663
  # specified to the patch-level:
@@ -665,9 +678,20 @@ class Gem::Specification < Gem::BasicSpecification
665
678
  #
666
679
  # # Only prereleases or final releases after 2.6.0.preview2
667
680
  # spec.required_ruby_version = '> 2.6.0.preview2'
681
+ #
682
+ # # This gem will work with 2.3.0 or greater, including major version 3, but lesser than 4.0.0
683
+ # spec.required_ruby_version = '>= 2.3', '< 4'
668
684
 
669
685
  def required_ruby_version=(req)
670
686
  @required_ruby_version = Gem::Requirement.create req
687
+
688
+ @required_ruby_version.requirements.map! do |op, v|
689
+ if v >= LATEST_RUBY_WITHOUT_PATCH_VERSIONS && v.release.segments.size == 4
690
+ [op == "~>" ? "=" : op, Gem::Version.new(v.segments.tap {|s| s.delete_at(3) }.join("."))]
691
+ else
692
+ [op, v]
693
+ end
694
+ end
671
695
  end
672
696
 
673
697
  ##
@@ -725,7 +749,7 @@ class Gem::Specification < Gem::BasicSpecification
725
749
  # Deprecated: You must now specify the executable name to Gem.bin_path.
726
750
 
727
751
  attr_writer :default_executable
728
- deprecate :default_executable=, :none, 2018, 12
752
+ rubygems_deprecate :default_executable=
729
753
 
730
754
  ##
731
755
  # Allows deinstallation of gems with legacy platforms.
@@ -740,23 +764,15 @@ class Gem::Specification < Gem::BasicSpecification
740
764
  attr_accessor :specification_version
741
765
 
742
766
  def self._all # :nodoc:
743
- unless defined?(@@all) && @@all
744
- @@all = stubs.map(&:to_spec)
745
-
746
- # After a reset, make sure already loaded specs
747
- # are still marked as activated.
748
- specs = {}
749
- Gem.loaded_specs.each_value{|s| specs[s] = true}
750
- @@all.each{|s| s.activated = true if specs[s]}
751
- end
752
- @@all
767
+ @@all ||= Gem.loaded_specs.values | stubs.map(&:to_spec)
753
768
  end
754
769
 
755
- def self._clear_load_cache # :nodoc:
756
- LOAD_CACHE_MUTEX.synchronize do
757
- LOAD_CACHE.clear
770
+ def self.clear_load_cache # :nodoc:
771
+ @load_cache_mutex.synchronize do
772
+ @load_cache.clear
758
773
  end
759
774
  end
775
+ private_class_method :clear_load_cache
760
776
 
761
777
  def self.each_gemspec(dirs) # :nodoc:
762
778
  dirs.each do |dir|
@@ -767,7 +783,7 @@ class Gem::Specification < Gem::BasicSpecification
767
783
  end
768
784
 
769
785
  def self.gemspec_stubs_in(dir, pattern)
770
- Gem::Util.glob_files_in_dir(pattern, dir).map { |path| yield path }.select(&:valid?)
786
+ Gem::Util.glob_files_in_dir(pattern, dir).map {|path| yield path }.select(&:valid?)
771
787
  end
772
788
  private_class_method :gemspec_stubs_in
773
789
 
@@ -782,21 +798,11 @@ class Gem::Specification < Gem::BasicSpecification
782
798
  dirs.flat_map do |dir|
783
799
  base_dir = File.dirname dir
784
800
  gems_dir = File.join base_dir, "gems"
785
- gemspec_stubs_in(dir, pattern) { |path| yield path, base_dir, gems_dir }
801
+ gemspec_stubs_in(dir, pattern) {|path| yield path, base_dir, gems_dir }
786
802
  end
787
803
  end
788
804
  private_class_method :map_stubs
789
805
 
790
- def self.uniq_by(list, &block) # :nodoc:
791
- list.uniq(&block)
792
- end
793
- private_class_method :uniq_by
794
-
795
- def self.sort_by!(list, &block)
796
- list.sort_by!(&block)
797
- end
798
- private_class_method :sort_by!
799
-
800
806
  def self.each_spec(dirs) # :nodoc:
801
807
  each_gemspec(dirs) do |path|
802
808
  spec = self.load path
@@ -810,11 +816,9 @@ class Gem::Specification < Gem::BasicSpecification
810
816
  def self.stubs
811
817
  @@stubs ||= begin
812
818
  pattern = "*.gemspec"
813
- stubs = Gem.loaded_specs.values + installed_stubs(dirs, pattern) + default_stubs(pattern)
814
- stubs = uniq_by(stubs) { |stub| stub.full_name }
819
+ stubs = stubs_for_pattern(pattern, false)
815
820
 
816
- _resort!(stubs)
817
- @@stubs_by_name = stubs.select { |s| Gem::Platform.match s.platform }.group_by(&:name)
821
+ @@stubs_by_name = stubs.select {|s| Gem::Platform.match_spec? s }.group_by(&:name)
818
822
  stubs
819
823
  end
820
824
  end
@@ -830,8 +834,6 @@ class Gem::Specification < Gem::BasicSpecification
830
834
  end
831
835
  end
832
836
 
833
- EMPTY = [].freeze # :nodoc:
834
-
835
837
  ##
836
838
  # Returns a Gem::StubSpecification for installed gem named +name+
837
839
  # only returns stubs that match Gem.platforms
@@ -840,23 +842,32 @@ class Gem::Specification < Gem::BasicSpecification
840
842
  if @@stubs
841
843
  @@stubs_by_name[name] || []
842
844
  else
843
- pattern = "#{name}-*.gemspec"
844
- stubs = Gem.loaded_specs.values +
845
- installed_stubs(dirs, pattern).select { |s| Gem::Platform.match s.platform } +
846
- default_stubs(pattern)
847
- stubs = uniq_by(stubs) { |stub| stub.full_name }.group_by(&:name)
848
- stubs.each_value { |v| _resort!(v) }
849
-
850
- @@stubs_by_name.merge! stubs
851
- @@stubs_by_name[name] ||= EMPTY
845
+ @@stubs_by_name[name] ||= stubs_for_pattern("#{name}-*.gemspec").select do |s|
846
+ s.name == name
847
+ end
852
848
  end
853
849
  end
854
850
 
851
+ ##
852
+ # Finds stub specifications matching a pattern from the standard locations,
853
+ # optionally filtering out specs not matching the current platform
854
+ #
855
+ 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
862
+ end
863
+
855
864
  def self._resort!(specs) # :nodoc:
856
865
  specs.sort! do |a, b|
857
866
  names = a.name <=> b.name
858
867
  next names if names.nonzero?
859
- b.version <=> a.version
868
+ versions = b.version <=> a.version
869
+ next versions if versions.nonzero?
870
+ Gem::Platform.sort_priority(b.platform)
860
871
  end
861
872
  end
862
873
 
@@ -871,6 +882,30 @@ class Gem::Specification < Gem::BasicSpecification
871
882
  end
872
883
  end
873
884
 
885
+ ##
886
+ # Adds +spec+ to the known specifications, keeping the collection
887
+ # properly sorted.
888
+
889
+ 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)
898
+ end
899
+
900
+ ##
901
+ # Removes +spec+ from the known specs.
902
+
903
+ def self.remove_spec(spec)
904
+ _all.delete spec.to_spec
905
+ stubs.delete spec
906
+ (@@stubs_by_name[spec.name] || []).delete spec
907
+ end
908
+
874
909
  ##
875
910
  # Returns all specifications. This method is discouraged from use.
876
911
  # You probably want to use one of the Enumerable methods instead.
@@ -939,7 +974,7 @@ class Gem::Specification < Gem::BasicSpecification
939
974
  def self.dirs=(dirs)
940
975
  self.reset
941
976
 
942
- @@dirs = Array(dirs).map { |dir| File.join dir, "specifications" }
977
+ @@dirs = Array(dirs).map {|dir| File.join dir, "specifications" }
943
978
  end
944
979
 
945
980
  extend Enumerable
@@ -992,7 +1027,6 @@ class Gem::Specification < Gem::BasicSpecification
992
1027
  def self.find_by_path(path)
993
1028
  path = path.dup.freeze
994
1029
  spec = @@spec_with_requirable_file[path] ||= (stubs.find do |s|
995
- next unless Gem::BundlerVersionFinder.compatible?(s)
996
1030
  s.contains_requirable_file? path
997
1031
  end || NOT_FOUND)
998
1032
  spec.to_spec
@@ -1005,7 +1039,6 @@ class Gem::Specification < Gem::BasicSpecification
1005
1039
  def self.find_inactive_by_path(path)
1006
1040
  stub = stubs.find do |s|
1007
1041
  next if s.activated?
1008
- next unless Gem::BundlerVersionFinder.compatible?(s)
1009
1042
  s.contains_requirable_file? path
1010
1043
  end
1011
1044
  stub && stub.to_spec
@@ -1013,7 +1046,7 @@ class Gem::Specification < Gem::BasicSpecification
1013
1046
 
1014
1047
  def self.find_active_stub_by_path(path)
1015
1048
  stub = @@active_stub_with_requirable_file[path] ||= (stubs.find do |s|
1016
- s.activated? and s.contains_requirable_file? path
1049
+ s.activated? && s.contains_requirable_file?(path)
1017
1050
  end || NOT_FOUND)
1018
1051
  stub.this
1019
1052
  end
@@ -1022,10 +1055,7 @@ class Gem::Specification < Gem::BasicSpecification
1022
1055
  # Return currently unresolved specs that contain the file matching +path+.
1023
1056
 
1024
1057
  def self.find_in_unresolved(path)
1025
- # TODO: do we need these?? Kill it
1026
- specs = unresolved_deps.values.map { |dep| dep.to_specs }.flatten
1027
-
1028
- specs.find_all { |spec| spec.contains_requirable_file? path }
1058
+ unresolved_specs.find_all {|spec| spec.contains_requirable_file? path }
1029
1059
  end
1030
1060
 
1031
1061
  ##
@@ -1033,9 +1063,7 @@ class Gem::Specification < Gem::BasicSpecification
1033
1063
  # specs that contain the file matching +path+.
1034
1064
 
1035
1065
  def self.find_in_unresolved_tree(path)
1036
- specs = unresolved_deps.values.map { |dep| dep.to_specs }.flatten
1037
-
1038
- specs.each do |spec|
1066
+ unresolved_specs.each do |spec|
1039
1067
  spec.traverse do |from_spec, dep, to_spec, trail|
1040
1068
  if to_spec.has_conflicts? || to_spec.conficts_when_loaded_with?(trail)
1041
1069
  :next
@@ -1048,6 +1076,11 @@ class Gem::Specification < Gem::BasicSpecification
1048
1076
  []
1049
1077
  end
1050
1078
 
1079
+ def self.unresolved_specs
1080
+ unresolved_deps.values.map {|dep| dep.to_specs }.flatten
1081
+ end
1082
+ private_class_method :unresolved_specs
1083
+
1051
1084
  ##
1052
1085
  # Special loader for YAML files. When a Specification object is loaded
1053
1086
  # from a YAML file, it bypasses the normal Ruby object initialization
@@ -1072,6 +1105,7 @@ class Gem::Specification < Gem::BasicSpecification
1072
1105
 
1073
1106
  spec.specification_version ||= NONEXISTENT_SPECIFICATION_VERSION
1074
1107
  spec.reset_nil_attributes_to_default
1108
+ spec.flatten_require_paths
1075
1109
 
1076
1110
  spec
1077
1111
  end
@@ -1081,24 +1115,26 @@ class Gem::Specification < Gem::BasicSpecification
1081
1115
  # +prerelease+ is true.
1082
1116
 
1083
1117
  def self.latest_specs(prerelease = false)
1084
- _latest_specs Gem::Specification._all, prerelease
1118
+ _latest_specs Gem::Specification.stubs, prerelease
1119
+ end
1120
+
1121
+ ##
1122
+ # Return the latest installed spec for gem +name+.
1123
+
1124
+ def self.latest_spec_for(name)
1125
+ latest_specs(true).find {|installed_spec| installed_spec.name == name }
1085
1126
  end
1086
1127
 
1087
1128
  def self._latest_specs(specs, prerelease = false) # :nodoc:
1088
- result = Hash.new { |h,k| h[k] = {} }
1089
- native = {}
1129
+ result = {}
1090
1130
 
1091
1131
  specs.reverse_each do |spec|
1092
1132
  next if spec.version.prerelease? unless prerelease
1093
1133
 
1094
- native[spec.name] = spec.version if spec.platform == Gem::Platform::RUBY
1095
- result[spec.name][spec.platform] = spec
1134
+ result[spec.name] = spec
1096
1135
  end
1097
1136
 
1098
- result.map(&:last).map(&:values).flatten.reject do |spec|
1099
- minimum = native[spec.name]
1100
- minimum && spec.version < minimum
1101
- end.sort_by{ |tup| tup.name }
1137
+ result.map(&:last).flatten.sort_by {|tup| tup.name }
1102
1138
  end
1103
1139
 
1104
1140
  ##
@@ -1107,13 +1143,13 @@ class Gem::Specification < Gem::BasicSpecification
1107
1143
  def self.load(file)
1108
1144
  return unless file
1109
1145
 
1110
- _spec = LOAD_CACHE_MUTEX.synchronize { LOAD_CACHE[file] }
1146
+ _spec = @load_cache_mutex.synchronize { @load_cache[file] }
1111
1147
  return _spec if _spec
1112
1148
 
1113
1149
  file = file.dup.tap(&Gem::UNTAINT)
1114
1150
  return unless File.file?(file)
1115
1151
 
1116
- code = File.read file, :mode => 'r:UTF-8:-'
1152
+ code = Gem.open_file(file, "r:UTF-8:-", &:read)
1117
1153
 
1118
1154
  code.tap(&Gem::UNTAINT)
1119
1155
 
@@ -1122,12 +1158,12 @@ class Gem::Specification < Gem::BasicSpecification
1122
1158
 
1123
1159
  if Gem::Specification === _spec
1124
1160
  _spec.loaded_from = File.expand_path file.to_s
1125
- LOAD_CACHE_MUTEX.synchronize do
1126
- prev = LOAD_CACHE[file]
1161
+ @load_cache_mutex.synchronize do
1162
+ prev = @load_cache[file]
1127
1163
  if prev
1128
1164
  _spec = prev
1129
1165
  else
1130
- LOAD_CACHE[file] = _spec
1166
+ @load_cache[file] = _spec
1131
1167
  end
1132
1168
  end
1133
1169
  return _spec
@@ -1155,7 +1191,7 @@ class Gem::Specification < Gem::BasicSpecification
1155
1191
 
1156
1192
  def self.normalize_yaml_input(input)
1157
1193
  result = input.respond_to?(:read) ? input.read : input
1158
- result = "--- " + result unless result =~ /\A--- /
1194
+ result = "--- " + result unless result.start_with?("--- ")
1159
1195
  result = result.dup
1160
1196
  result.gsub!(/ !!null \n/, " \n")
1161
1197
  # date: 2011-04-26 00:00:00.000000000Z
@@ -1172,7 +1208,7 @@ class Gem::Specification < Gem::BasicSpecification
1172
1208
  # version as well.
1173
1209
 
1174
1210
  def self.outdated
1175
- outdated_and_latest_version.map { |local, _| local.name }
1211
+ outdated_and_latest_version.map {|local, _| local.name }
1176
1212
  end
1177
1213
 
1178
1214
  ##
@@ -1193,12 +1229,12 @@ class Gem::Specification < Gem::BasicSpecification
1193
1229
  Gem::Dependency.new local_spec.name, ">= #{local_spec.version}"
1194
1230
 
1195
1231
  remotes, = fetcher.search_for_dependency dependency
1196
- remotes = remotes.map { |n, _| n.version }
1232
+ remotes = remotes.map {|n, _| n.version }
1197
1233
 
1198
1234
  latest_remote = remotes.sort.last
1199
1235
 
1200
1236
  yield [local_spec, latest_remote] if
1201
- latest_remote and local_spec.version < latest_remote
1237
+ latest_remote && local_spec.version < latest_remote
1202
1238
  end
1203
1239
 
1204
1240
  nil
@@ -1224,13 +1260,9 @@ class Gem::Specification < Gem::BasicSpecification
1224
1260
 
1225
1261
  def self.reset
1226
1262
  @@dirs = nil
1227
- Gem.pre_reset_hooks.each { |hook| hook.call }
1228
- @@all = nil
1229
- @@stubs = nil
1230
- @@stubs_by_name = {}
1231
- @@spec_with_requirable_file = {}
1232
- @@active_stub_with_requirable_file = {}
1233
- _clear_load_cache
1263
+ Gem.pre_reset_hooks.each {|hook| hook.call }
1264
+ clear_specs
1265
+ clear_load_cache
1234
1266
  unresolved = unresolved_deps
1235
1267
  unless unresolved.empty?
1236
1268
  w = "W" + "ARN"
@@ -1241,19 +1273,19 @@ class Gem::Specification < Gem::BasicSpecification
1241
1273
  versions = find_all_by_name(dep.name)
1242
1274
  unless versions.empty?
1243
1275
  warn " Available/installed versions of this gem:"
1244
- versions.each { |s| warn " - #{s.version}" }
1276
+ versions.each {|s| warn " - #{s.version}" }
1245
1277
  end
1246
1278
  end
1247
1279
  warn "#{w}: Clearing out unresolved specs. Try 'gem cleanup <gem>'"
1248
1280
  warn "Please report a bug if this causes problems."
1249
1281
  unresolved.clear
1250
1282
  end
1251
- Gem.post_reset_hooks.each { |hook| hook.call }
1283
+ Gem.post_reset_hooks.each {|hook| hook.call }
1252
1284
  end
1253
1285
 
1254
1286
  # DOC: This method needs documented or nodoc'd
1255
1287
  def self.unresolved_deps
1256
- @unresolved_deps ||= Hash.new { |h, n| h[n] = Gem::Dependency.new n }
1288
+ @unresolved_deps ||= Hash.new {|h, n| h[n] = Gem::Dependency.new n }
1257
1289
  end
1258
1290
 
1259
1291
  ##
@@ -1262,7 +1294,30 @@ class Gem::Specification < Gem::BasicSpecification
1262
1294
  def self._load(str)
1263
1295
  Gem.load_yaml
1264
1296
 
1265
- array = Marshal.load str
1297
+ array = begin
1298
+ Marshal.load str
1299
+ rescue ArgumentError => e
1300
+ #
1301
+ # Some very old marshaled specs included references to `YAML::PrivateType`
1302
+ # and `YAML::Syck::DefaultKey` constants due to bugs in the old emitter
1303
+ # that generated them. Workaround the issue by defining the necessary
1304
+ # constants and retrying.
1305
+ #
1306
+ message = e.message
1307
+ raise unless message.include?("YAML::")
1308
+
1309
+ Object.const_set "YAML", Psych unless Object.const_defined?(:YAML)
1310
+
1311
+ if message.include?("YAML::Syck::")
1312
+ YAML.const_set "Syck", YAML unless YAML.const_defined?(:Syck)
1313
+
1314
+ YAML::Syck.const_set "DefaultKey", Class.new if message.include?("YAML::Syck::DefaultKey")
1315
+ elsif message.include?("YAML::PrivateType")
1316
+ YAML.const_set "PrivateType", Class.new
1317
+ end
1318
+
1319
+ retry
1320
+ end
1266
1321
 
1267
1322
  spec = Gem::Specification.new
1268
1323
  spec.instance_variable_set :@specification_version, array[1]
@@ -1270,22 +1325,17 @@ class Gem::Specification < Gem::BasicSpecification
1270
1325
  current_version = CURRENT_SPECIFICATION_VERSION
1271
1326
 
1272
1327
  field_count = if spec.specification_version > current_version
1273
- spec.instance_variable_set :@specification_version,
1274
- current_version
1275
- MARSHAL_FIELDS[current_version]
1276
- else
1277
- MARSHAL_FIELDS[spec.specification_version]
1278
- end
1328
+ spec.instance_variable_set :@specification_version,
1329
+ current_version
1330
+ MARSHAL_FIELDS[current_version]
1331
+ else
1332
+ MARSHAL_FIELDS[spec.specification_version]
1333
+ end
1279
1334
 
1280
1335
  if array.size < field_count
1281
1336
  raise TypeError, "invalid Gem::Specification format #{array.inspect}"
1282
1337
  end
1283
1338
 
1284
- # Cleanup any YAML::PrivateType. They only show up for an old bug
1285
- # where nil => null, so just convert them to nil based on the type.
1286
-
1287
- array.map! { |e| e.kind_of?(YAML::PrivateType) ? nil : e }
1288
-
1289
1339
  spec.instance_variable_set :@rubygems_version, array[0]
1290
1340
  # spec version
1291
1341
  spec.instance_variable_set :@name, array[2]
@@ -1341,7 +1391,7 @@ class Gem::Specification < Gem::BasicSpecification
1341
1391
  @required_rubygems_version,
1342
1392
  @original_platform,
1343
1393
  @dependencies,
1344
- '', # rubyforge_project
1394
+ "", # rubyforge_project
1345
1395
  @email,
1346
1396
  @authors,
1347
1397
  @description,
@@ -1349,7 +1399,7 @@ class Gem::Specification < Gem::BasicSpecification
1349
1399
  true, # has_rdoc
1350
1400
  @new_platform,
1351
1401
  @licenses,
1352
- @metadata
1402
+ @metadata,
1353
1403
  ]
1354
1404
  end
1355
1405
 
@@ -1397,7 +1447,11 @@ class Gem::Specification < Gem::BasicSpecification
1397
1447
  raise e
1398
1448
  end
1399
1449
 
1400
- specs = spec_dep.to_specs
1450
+ begin
1451
+ specs = spec_dep.to_specs
1452
+ rescue Gem::MissingSpecError => e
1453
+ raise Gem::MissingSpecError.new(e.name, e.requirement, "at: #{self.spec_file}")
1454
+ end
1401
1455
 
1402
1456
  if specs.size == 1
1403
1457
  specs.first.activate
@@ -1433,7 +1487,7 @@ class Gem::Specification < Gem::BasicSpecification
1433
1487
  self.summary = sanitize_string(summary)
1434
1488
  self.description = sanitize_string(description)
1435
1489
  self.post_install_message = sanitize_string(post_install_message)
1436
- self.authors = authors.collect { |a| sanitize_string(a) }
1490
+ self.authors = authors.collect {|a| sanitize_string(a) }
1437
1491
  end
1438
1492
 
1439
1493
  ##
@@ -1445,13 +1499,7 @@ class Gem::Specification < Gem::BasicSpecification
1445
1499
  # HACK the #to_s is in here because RSpec has an Array of Arrays of
1446
1500
  # Strings for authors. Need a way to disallow bad values on gemspec
1447
1501
  # generation. (Probably won't happen.)
1448
- string = string.to_s
1449
-
1450
- begin
1451
- Builder::XChar.encode string
1452
- rescue NameError, NoMethodError
1453
- string.to_xs
1454
- end
1502
+ string.to_s
1455
1503
  end
1456
1504
 
1457
1505
  ##
@@ -1462,7 +1510,7 @@ class Gem::Specification < Gem::BasicSpecification
1462
1510
  return nil if executables.nil?
1463
1511
 
1464
1512
  if @bindir
1465
- Array(executables).map { |e| File.join(@bindir, e) }
1513
+ Array(executables).map {|e| File.join(@bindir, e) }
1466
1514
  else
1467
1515
  executables
1468
1516
  end
@@ -1477,10 +1525,10 @@ class Gem::Specification < Gem::BasicSpecification
1477
1525
 
1478
1526
  def add_dependency_with_type(dependency, type, requirements)
1479
1527
  requirements = if requirements.empty?
1480
- Gem::Requirement.default
1481
- else
1482
- requirements.flatten
1483
- end
1528
+ Gem::Requirement.default
1529
+ else
1530
+ requirements.flatten
1531
+ end
1484
1532
 
1485
1533
  unless dependency.respond_to?(:name) &&
1486
1534
  dependency.respond_to?(:requirement)
@@ -1509,7 +1557,7 @@ class Gem::Specification < Gem::BasicSpecification
1509
1557
  # Singular reader for #authors. Returns the first author in the list
1510
1558
 
1511
1559
  def author
1512
- val = authors and val.first
1560
+ (val = authors) && val.first
1513
1561
  end
1514
1562
 
1515
1563
  ##
@@ -1544,7 +1592,7 @@ class Gem::Specification < Gem::BasicSpecification
1544
1592
  def build_args
1545
1593
  if File.exist? build_info_file
1546
1594
  build_info = File.readlines build_info_file
1547
- build_info = build_info.map { |x| x.strip }
1595
+ build_info = build_info.map {|x| x.strip }
1548
1596
  build_info.delete ""
1549
1597
  build_info
1550
1598
  else
@@ -1557,12 +1605,11 @@ class Gem::Specification < Gem::BasicSpecification
1557
1605
  # the gem.build_complete file is missing.
1558
1606
 
1559
1607
  def build_extensions # :nodoc:
1560
- return if default_gem?
1561
1608
  return if extensions.empty?
1562
- return if installed_by_version < Gem::Version.new('2.2.0.preview.2')
1609
+ return if default_gem?
1563
1610
  return if File.exist? gem_build_complete_path
1564
1611
  return if !File.writable?(base_dir)
1565
- return if !File.exist?(File.join(base_dir, 'extensions'))
1612
+ return if !File.exist?(File.join(base_dir, "extensions"))
1566
1613
 
1567
1614
  begin
1568
1615
  # We need to require things in $LOAD_PATH without looking for the
@@ -1570,9 +1617,9 @@ class Gem::Specification < Gem::BasicSpecification
1570
1617
  unresolved_deps = Gem::Specification.unresolved_deps.dup
1571
1618
  Gem::Specification.unresolved_deps.clear
1572
1619
 
1573
- require 'rubygems/config_file'
1574
- require 'rubygems/ext'
1575
- require 'rubygems/user_interaction'
1620
+ require_relative "config_file"
1621
+ require_relative "ext"
1622
+ require_relative "user_interaction"
1576
1623
 
1577
1624
  ui = Gem::SilentUI.new
1578
1625
  Gem::DefaultUserInteraction.use_ui ui do
@@ -1622,7 +1669,7 @@ class Gem::Specification < Gem::BasicSpecification
1622
1669
  conflicts = {}
1623
1670
  self.runtime_dependencies.each do |dep|
1624
1671
  spec = Gem.loaded_specs[dep.name]
1625
- if spec and not spec.satisfies_requirement? dep
1672
+ if spec && !spec.satisfies_requirement?(dep)
1626
1673
  (conflicts[spec] ||= []) << dep
1627
1674
  end
1628
1675
  end
@@ -1636,7 +1683,7 @@ class Gem::Specification < Gem::BasicSpecification
1636
1683
 
1637
1684
  def conficts_when_loaded_with?(list_of_specs) # :nodoc:
1638
1685
  result = list_of_specs.any? do |spec|
1639
- spec.dependencies.any? { |dep| dep.runtime? && (dep.name == name) && !satisfies_requirement?(dep) }
1686
+ spec.dependencies.any? {|dep| dep.runtime? && (dep.name == name) && !satisfies_requirement?(dep) }
1640
1687
  end
1641
1688
  result
1642
1689
  end
@@ -1649,7 +1696,7 @@ class Gem::Specification < Gem::BasicSpecification
1649
1696
  self.dependencies.any? do |dep|
1650
1697
  if dep.runtime?
1651
1698
  spec = Gem.loaded_specs[dep.name]
1652
- spec and not spec.satisfies_requirement? dep
1699
+ spec && !spec.satisfies_requirement?(dep)
1653
1700
  else
1654
1701
  false
1655
1702
  end
@@ -1670,7 +1717,7 @@ class Gem::Specification < Gem::BasicSpecification
1670
1717
 
1671
1718
  DateLike = Object.new # :nodoc:
1672
1719
  def DateLike.===(obj) # :nodoc:
1673
- defined?(::Date) and Date === obj
1720
+ defined?(::Date) && Date === obj
1674
1721
  end
1675
1722
 
1676
1723
  DateTimeFormat = # :nodoc:
@@ -1689,24 +1736,18 @@ class Gem::Specification < Gem::BasicSpecification
1689
1736
  # This is the cleanest, most-readable, faster-than-using-Date
1690
1737
  # way to do it.
1691
1738
  @date = case date
1692
- when String then
1693
- if DateTimeFormat =~ date
1694
- Time.utc($1.to_i, $2.to_i, $3.to_i)
1695
-
1696
- # Workaround for where the date format output from psych isn't
1697
- # parsed as a Time object by syck and thus comes through as a
1698
- # string.
1699
- elsif /\A(\d{4})-(\d{2})-(\d{2}) \d{2}:\d{2}:\d{2}\.\d+?Z\z/ =~ date
1700
- Time.utc($1.to_i, $2.to_i, $3.to_i)
1701
- else
1702
- raise(Gem::InvalidSpecificationException,
1703
- "invalid date format in specification: #{date.inspect}")
1704
- end
1705
- when Time, DateLike then
1706
- Time.utc(date.year, date.month, date.day)
1707
- else
1708
- TODAY
1709
- end
1739
+ when String then
1740
+ if DateTimeFormat =~ date
1741
+ Time.utc($1.to_i, $2.to_i, $3.to_i)
1742
+ else
1743
+ raise(Gem::InvalidSpecificationException,
1744
+ "invalid date format in specification: #{date.inspect}")
1745
+ end
1746
+ when Time, DateLike then
1747
+ Time.utc(date.year, date.month, date.day)
1748
+ else
1749
+ TODAY
1750
+ end
1710
1751
  end
1711
1752
 
1712
1753
  ##
@@ -1716,16 +1757,16 @@ class Gem::Specification < Gem::BasicSpecification
1716
1757
  # executable now. See Gem.bin_path.
1717
1758
 
1718
1759
  def default_executable # :nodoc:
1719
- if defined?(@default_executable) and @default_executable
1760
+ if defined?(@default_executable) && @default_executable
1720
1761
  result = @default_executable
1721
- elsif @executables and @executables.size == 1
1762
+ elsif @executables && @executables.size == 1
1722
1763
  result = Array(@executables).first
1723
1764
  else
1724
1765
  result = nil
1725
1766
  end
1726
1767
  result
1727
1768
  end
1728
- deprecate :default_executable, :none, 2018, 12
1769
+ rubygems_deprecate :default_executable
1729
1770
 
1730
1771
  ##
1731
1772
  # The default value for specification attribute +name+
@@ -1750,10 +1791,11 @@ class Gem::Specification < Gem::BasicSpecification
1750
1791
  #
1751
1792
  # [depending_gem, dependency, [list_of_gems_that_satisfy_dependency]]
1752
1793
 
1753
- def dependent_gems
1794
+ def dependent_gems(check_dev=true)
1754
1795
  out = []
1755
1796
  Gem::Specification.each do |spec|
1756
- spec.dependencies.each do |dep|
1797
+ deps = check_dev ? spec.dependencies : spec.runtime_dependencies
1798
+ deps.each do |dep|
1757
1799
  if self.satisfies_requirement?(dep)
1758
1800
  sats = []
1759
1801
  find_all_satisfiers(dep) do |sat|
@@ -1770,7 +1812,7 @@ class Gem::Specification < Gem::BasicSpecification
1770
1812
  # Returns all specs that matches this spec's runtime dependencies.
1771
1813
 
1772
1814
  def dependent_specs
1773
- runtime_dependencies.map { |dep| dep.to_specs }.flatten
1815
+ runtime_dependencies.map {|dep| dep.to_specs }.flatten
1774
1816
  end
1775
1817
 
1776
1818
  ##
@@ -1784,7 +1826,7 @@ class Gem::Specification < Gem::BasicSpecification
1784
1826
  # List of dependencies that are used for development
1785
1827
 
1786
1828
  def development_dependencies
1787
- dependencies.select { |d| d.type == :development }
1829
+ dependencies.select {|d| d.type == :development }
1788
1830
  end
1789
1831
 
1790
1832
  ##
@@ -1796,7 +1838,7 @@ class Gem::Specification < Gem::BasicSpecification
1796
1838
  # spec.doc_dir 'ri' # => "/path/to/gem_repo/doc/a-1/ri"
1797
1839
 
1798
1840
  def doc_dir(type = nil)
1799
- @doc_dir ||= File.join base_dir, 'doc', full_name
1841
+ @doc_dir ||= File.join base_dir, "doc", full_name
1800
1842
 
1801
1843
  if type
1802
1844
  File.join @doc_dir, type
@@ -1808,17 +1850,17 @@ class Gem::Specification < Gem::BasicSpecification
1808
1850
  def encode_with(coder) # :nodoc:
1809
1851
  mark_version
1810
1852
 
1811
- coder.add 'name', @name
1812
- coder.add 'version', @version
1853
+ coder.add "name", @name
1854
+ coder.add "version", @version
1813
1855
  platform = case @original_platform
1814
- when nil, '' then
1815
- 'ruby'
1816
- when String then
1817
- @original_platform
1818
- else
1819
- @original_platform.to_s
1820
- end
1821
- coder.add 'platform', platform
1856
+ when nil, "" then
1857
+ "ruby"
1858
+ when String then
1859
+ @original_platform
1860
+ else
1861
+ @original_platform.to_s
1862
+ end
1863
+ coder.add "platform", platform
1822
1864
 
1823
1865
  attributes = @@attributes.map(&:to_s) - %w[name version platform]
1824
1866
  attributes.each do |name|
@@ -1834,7 +1876,7 @@ class Gem::Specification < Gem::BasicSpecification
1834
1876
  # Singular accessor for #executables
1835
1877
 
1836
1878
  def executable
1837
- val = executables and val.first
1879
+ (val = executables) && val.first
1838
1880
  end
1839
1881
 
1840
1882
  ##
@@ -1845,29 +1887,23 @@ class Gem::Specification < Gem::BasicSpecification
1845
1887
  end
1846
1888
 
1847
1889
  ##
1848
- # Sets executables to +value+, ensuring it is an array. Don't
1849
- # use this, push onto the array instead.
1890
+ # Sets executables to +value+, ensuring it is an array.
1850
1891
 
1851
1892
  def executables=(value)
1852
- # TODO: warn about setting instead of pushing
1853
1893
  @executables = Array(value)
1854
1894
  end
1855
1895
 
1856
1896
  ##
1857
- # Sets extensions to +extensions+, ensuring it is an array. Don't
1858
- # use this, push onto the array instead.
1897
+ # Sets extensions to +extensions+, ensuring it is an array.
1859
1898
 
1860
1899
  def extensions=(extensions)
1861
- # TODO: warn about setting instead of pushing
1862
1900
  @extensions = Array extensions
1863
1901
  end
1864
1902
 
1865
1903
  ##
1866
- # Sets extra_rdoc_files to +files+, ensuring it is an array. Don't
1867
- # use this, push onto the array instead.
1904
+ # Sets extra_rdoc_files to +files+, ensuring it is an array.
1868
1905
 
1869
1906
  def extra_rdoc_files=(files)
1870
- # TODO: warn about setting instead of pushing
1871
1907
  @extra_rdoc_files = Array files
1872
1908
  end
1873
1909
 
@@ -1933,7 +1969,7 @@ class Gem::Specification < Gem::BasicSpecification
1933
1969
  def has_rdoc # :nodoc:
1934
1970
  true
1935
1971
  end
1936
- deprecate :has_rdoc, :none, 2018, 12
1972
+ rubygems_deprecate :has_rdoc
1937
1973
 
1938
1974
  ##
1939
1975
  # Deprecated and ignored.
@@ -1943,16 +1979,16 @@ class Gem::Specification < Gem::BasicSpecification
1943
1979
  def has_rdoc=(ignored) # :nodoc:
1944
1980
  @has_rdoc = true
1945
1981
  end
1946
- deprecate :has_rdoc=, :none, 2018, 12
1982
+ rubygems_deprecate :has_rdoc=
1947
1983
 
1948
1984
  alias :has_rdoc? :has_rdoc # :nodoc:
1949
- deprecate :has_rdoc?, :none, 2018, 12
1985
+ rubygems_deprecate :has_rdoc?
1950
1986
 
1951
1987
  ##
1952
1988
  # True if this gem has files in test_files
1953
1989
 
1954
1990
  def has_unit_tests? # :nodoc:
1955
- not test_files.empty?
1991
+ !test_files.empty?
1956
1992
  end
1957
1993
 
1958
1994
  # :stopdoc:
@@ -1968,7 +2004,9 @@ class Gem::Specification < Gem::BasicSpecification
1968
2004
  yaml_initialize coder.tag, coder.map
1969
2005
  end
1970
2006
 
1971
- eval <<-RB, binding, __FILE__, __LINE__ + 1
2007
+ eval <<-RUBY, binding, __FILE__, __LINE__ + 1
2008
+ # frozen_string_literal: true
2009
+
1972
2010
  def set_nil_attributes_to_nil
1973
2011
  #{@@nil_attributes.map {|key| "@#{key} = nil" }.join "; "}
1974
2012
  end
@@ -1978,7 +2016,7 @@ class Gem::Specification < Gem::BasicSpecification
1978
2016
  #{@@non_nil_attributes.map {|key| "@#{key} = #{INITIALIZE_CODE_FOR_DEFAULTS[key]}" }.join ";"}
1979
2017
  end
1980
2018
  private :set_not_nil_attributes_to_default_values
1981
- RB
2019
+ RUBY
1982
2020
 
1983
2021
  ##
1984
2022
  # Specification constructor. Assigns the default values to the attributes
@@ -2003,6 +2041,10 @@ class Gem::Specification < Gem::BasicSpecification
2003
2041
  self.name = name if name
2004
2042
  self.version = version if version
2005
2043
 
2044
+ if (platform = Gem.platforms.last) && platform != Gem::Platform::RUBY && platform != Gem::Platform.local
2045
+ self.platform = platform
2046
+ end
2047
+
2006
2048
  yield self if block_given?
2007
2049
  end
2008
2050
 
@@ -2034,10 +2076,10 @@ class Gem::Specification < Gem::BasicSpecification
2034
2076
  def base_dir
2035
2077
  return Gem.dir unless loaded_from
2036
2078
  @base_dir ||= if default_gem?
2037
- File.dirname File.dirname File.dirname loaded_from
2038
- else
2039
- File.dirname File.dirname loaded_from
2040
- end
2079
+ File.dirname File.dirname File.dirname loaded_from
2080
+ else
2081
+ File.dirname File.dirname loaded_from
2082
+ end
2041
2083
  end
2042
2084
 
2043
2085
  ##
@@ -2114,8 +2156,8 @@ class Gem::Specification < Gem::BasicSpecification
2114
2156
  return
2115
2157
  end
2116
2158
 
2117
- if @specification_version > CURRENT_SPECIFICATION_VERSION and
2118
- sym.to_s =~ /=$/
2159
+ if @specification_version > CURRENT_SPECIFICATION_VERSION &&
2160
+ sym.to_s.end_with?("=")
2119
2161
  warn "ignoring #{sym} loading #{full_name}" if $DEBUG
2120
2162
  else
2121
2163
  super
@@ -2127,9 +2169,8 @@ class Gem::Specification < Gem::BasicSpecification
2127
2169
  # probably want to build_extensions
2128
2170
 
2129
2171
  def missing_extensions?
2130
- return false if default_gem?
2131
2172
  return false if extensions.empty?
2132
- return false if installed_by_version < Gem::Version.new('2.2.0.preview.2')
2173
+ return false if default_gem?
2133
2174
  return false if File.exist? gem_build_complete_path
2134
2175
 
2135
2176
  true
@@ -2142,7 +2183,7 @@ class Gem::Specification < Gem::BasicSpecification
2142
2183
  # file list.
2143
2184
 
2144
2185
  def normalize
2145
- if defined?(@extra_rdoc_files) and @extra_rdoc_files
2186
+ if defined?(@extra_rdoc_files) && @extra_rdoc_files
2146
2187
  @extra_rdoc_files.uniq!
2147
2188
  @files ||= []
2148
2189
  @files.concat(@extra_rdoc_files)
@@ -2167,7 +2208,7 @@ class Gem::Specification < Gem::BasicSpecification
2167
2208
  # platform. For use with legacy gems.
2168
2209
 
2169
2210
  def original_name # :nodoc:
2170
- if platform == Gem::Platform::RUBY or platform.nil?
2211
+ if platform == Gem::Platform::RUBY || platform.nil?
2171
2212
  "#{@name}-#{@version}"
2172
2213
  else
2173
2214
  "#{@name}-#{@version}-#{@original_platform}"
@@ -2189,7 +2230,7 @@ class Gem::Specification < Gem::BasicSpecification
2189
2230
  end
2190
2231
 
2191
2232
  def pretty_print(q) # :nodoc:
2192
- q.group 2, 'Gem::Specification.new do |s|', 'end' do
2233
+ q.group 2, "Gem::Specification.new do |s|", "end" do
2193
2234
  q.breakable
2194
2235
 
2195
2236
  attributes = @@attributes - [:name, :version]
@@ -2199,9 +2240,9 @@ class Gem::Specification < Gem::BasicSpecification
2199
2240
 
2200
2241
  attributes.each do |attr_name|
2201
2242
  current_value = self.send attr_name
2202
- current_value = current_value.sort if %i(files test_files).include? attr_name
2203
- if current_value != default_value(attr_name) or
2204
- self.class.required_attribute? attr_name
2243
+ current_value = current_value.sort if %i[files test_files].include? attr_name
2244
+ if current_value != default_value(attr_name) ||
2245
+ self.class.required_attribute?(attr_name)
2205
2246
 
2206
2247
  q.text "s.#{attr_name} = "
2207
2248
 
@@ -2249,11 +2290,9 @@ class Gem::Specification < Gem::BasicSpecification
2249
2290
  end
2250
2291
 
2251
2292
  ##
2252
- # Sets rdoc_options to +value+, ensuring it is an array. Don't
2253
- # use this, push onto the array instead.
2293
+ # Sets rdoc_options to +value+, ensuring it is an array.
2254
2294
 
2255
2295
  def rdoc_options=(options)
2256
- # TODO: warn about setting instead of pushing
2257
2296
  @rdoc_options = Array options
2258
2297
  end
2259
2298
 
@@ -2261,7 +2300,7 @@ class Gem::Specification < Gem::BasicSpecification
2261
2300
  # Singular accessor for #require_paths
2262
2301
 
2263
2302
  def require_path
2264
- val = require_paths and val.first
2303
+ (val = require_paths) && val.first
2265
2304
  end
2266
2305
 
2267
2306
  ##
@@ -2272,11 +2311,9 @@ class Gem::Specification < Gem::BasicSpecification
2272
2311
  end
2273
2312
 
2274
2313
  ##
2275
- # Set requirements to +req+, ensuring it is an array. Don't
2276
- # use this, push onto the array instead.
2314
+ # Set requirements to +req+, ensuring it is an array.
2277
2315
 
2278
2316
  def requirements=(req)
2279
- # TODO: warn about setting instead of pushing
2280
2317
  @requirements = Array req
2281
2318
  end
2282
2319
 
@@ -2288,7 +2325,7 @@ class Gem::Specification < Gem::BasicSpecification
2288
2325
  # Returns the full path to this spec's ri directory.
2289
2326
 
2290
2327
  def ri_dir
2291
- @ri_dir ||= File.join base_dir, 'ri', full_name
2328
+ @ri_dir ||= File.join base_dir, "ri", full_name
2292
2329
  end
2293
2330
 
2294
2331
  ##
@@ -2298,13 +2335,13 @@ class Gem::Specification < Gem::BasicSpecification
2298
2335
  def ruby_code(obj)
2299
2336
  case obj
2300
2337
  when String then obj.dump + ".freeze"
2301
- when Array then '[' + obj.map { |x| ruby_code x }.join(", ") + ']'
2338
+ when Array then "[" + obj.map {|x| ruby_code x }.join(", ") + "]"
2302
2339
  when Hash then
2303
- seg = obj.keys.sort.map { |k| "#{k.to_s.dump} => #{obj[k].to_s.dump}" }
2340
+ seg = obj.keys.sort.map {|k| "#{k.to_s.dump} => #{obj[k].to_s.dump}" }
2304
2341
  "{ #{seg.join(', ')} }"
2305
2342
  when Gem::Version then obj.to_s.dump
2306
- when DateLike then obj.strftime('%Y-%m-%d').dump
2307
- when Time then obj.strftime('%Y-%m-%d').dump
2343
+ when DateLike then obj.strftime("%Y-%m-%d").dump
2344
+ when Time then obj.strftime("%Y-%m-%d").dump
2308
2345
  when Numeric then obj.inspect
2309
2346
  when true, false, nil then obj.inspect
2310
2347
  when Gem::Platform then "Gem::Platform.new(#{obj.to_a.inspect})"
@@ -2328,7 +2365,7 @@ class Gem::Specification < Gem::BasicSpecification
2328
2365
  # True if this gem has the same attributes as +other+.
2329
2366
 
2330
2367
  def same_attributes?(spec)
2331
- @@attributes.all? { |name, default| self.send(name) == spec.send(name) }
2368
+ @@attributes.all? {|name, default| self.send(name) == spec.send(name) }
2332
2369
  end
2333
2370
 
2334
2371
  private :same_attributes?
@@ -2338,14 +2375,14 @@ class Gem::Specification < Gem::BasicSpecification
2338
2375
 
2339
2376
  def satisfies_requirement?(dependency)
2340
2377
  return @name == dependency.name &&
2341
- dependency.requirement.satisfied_by?(@version)
2378
+ dependency.requirement.satisfied_by?(@version)
2342
2379
  end
2343
2380
 
2344
2381
  ##
2345
2382
  # Returns an object you can use to sort specifications in #sort_by.
2346
2383
 
2347
2384
  def sort_obj
2348
- [@name, @version, @new_platform == Gem::Platform::RUBY ? -1 : 1]
2385
+ [@name, @version, Gem::Platform.sort_priority(@new_platform)]
2349
2386
  end
2350
2387
 
2351
2388
  ##
@@ -2392,7 +2429,7 @@ class Gem::Specification < Gem::BasicSpecification
2392
2429
  # Singular accessor for #test_files
2393
2430
 
2394
2431
  def test_file # :nodoc:
2395
- val = test_files and val.first
2432
+ (val = test_files) && val.first
2396
2433
  end
2397
2434
 
2398
2435
  ##
@@ -2414,7 +2451,7 @@ class Gem::Specification < Gem::BasicSpecification
2414
2451
  @test_files = [@test_suite_file].flatten
2415
2452
  @test_suite_file = nil
2416
2453
  end
2417
- if defined?(@test_files) and @test_files
2454
+ if defined?(@test_files) && @test_files
2418
2455
  @test_files
2419
2456
  else
2420
2457
  @test_files = []
@@ -2427,7 +2464,6 @@ class Gem::Specification < Gem::BasicSpecification
2427
2464
  # still have their default values are omitted.
2428
2465
 
2429
2466
  def to_ruby
2430
- require 'openssl'
2431
2467
  mark_version
2432
2468
  result = []
2433
2469
  result << "# -*- encoding: utf-8 -*-"
@@ -2439,13 +2475,13 @@ class Gem::Specification < Gem::BasicSpecification
2439
2475
 
2440
2476
  result << " s.name = #{ruby_code name}"
2441
2477
  result << " s.version = #{ruby_code version}"
2442
- unless platform.nil? or platform == Gem::Platform::RUBY
2478
+ unless platform.nil? || platform == Gem::Platform::RUBY
2443
2479
  result << " s.platform = #{ruby_code original_platform}"
2444
2480
  end
2445
2481
  result << ""
2446
2482
  result << " s.required_rubygems_version = #{ruby_code required_rubygems_version} if s.respond_to? :required_rubygems_version="
2447
2483
 
2448
- if metadata and !metadata.empty?
2484
+ if metadata && !metadata.empty?
2449
2485
  result << " s.metadata = #{ruby_code metadata} if s.respond_to? :metadata="
2450
2486
  end
2451
2487
  result << " s.require_paths = #{ruby_code raw_require_paths}"
@@ -2460,17 +2496,22 @@ class Gem::Specification < Gem::BasicSpecification
2460
2496
  :version,
2461
2497
  :has_rdoc,
2462
2498
  :default_executable,
2463
- :metadata
2499
+ :metadata,
2500
+ :signing_key,
2464
2501
  ]
2465
2502
 
2466
2503
  @@attributes.each do |attr_name|
2467
2504
  next if handled.include? attr_name
2468
2505
  current_value = self.send(attr_name)
2469
2506
  if current_value != default_value(attr_name) || self.class.required_attribute?(attr_name)
2470
- result << " s.#{attr_name} = #{ruby_code current_value}" unless current_value.is_a?(OpenSSL::PKey::RSA)
2507
+ result << " s.#{attr_name} = #{ruby_code current_value}"
2471
2508
  end
2472
2509
  end
2473
2510
 
2511
+ if String === signing_key
2512
+ result << " s.signing_key = #{signing_key.dump}.freeze"
2513
+ end
2514
+
2474
2515
  if @installed_by_version
2475
2516
  result << nil
2476
2517
  result << " s.installed_by_version = \"#{Gem::VERSION}\" if s.respond_to? :installed_by_version"
@@ -2533,14 +2574,14 @@ class Gem::Specification < Gem::BasicSpecification
2533
2574
  # back, we have to check again here to make sure that our
2534
2575
  # psych code was properly loaded, and load it if not.
2535
2576
  unless Gem.const_defined?(:NoAliasYAMLTree)
2536
- require 'rubygems/psych_tree'
2577
+ require_relative "psych_tree"
2537
2578
  end
2538
2579
 
2539
2580
  builder = Gem::NoAliasYAMLTree.create
2540
2581
  builder << self
2541
2582
  ast = builder.tree
2542
2583
 
2543
- require 'stringio'
2584
+ require "stringio"
2544
2585
  io = StringIO.new
2545
2586
  io.set_encoding Encoding::UTF_8
2546
2587
 
@@ -2558,7 +2599,7 @@ class Gem::Specification < Gem::BasicSpecification
2558
2599
  begin
2559
2600
  dependencies.each do |dep|
2560
2601
  next unless dep.runtime?
2561
- dep.to_specs.each do |dep_spec|
2602
+ dep.matching_specs(true).each do |dep_spec|
2562
2603
  next if visited.has_key?(dep_spec)
2563
2604
  visited[dep_spec] = true
2564
2605
  trail.push(dep_spec)
@@ -2570,7 +2611,7 @@ class Gem::Specification < Gem::BasicSpecification
2570
2611
  unless result == :next
2571
2612
  spec_name = dep_spec.name
2572
2613
  dep_spec.traverse(trail, visited, &block) unless
2573
- trail.any? { |s| s.name == spec_name }
2614
+ trail.any? {|s| s.name == spec_name }
2574
2615
  end
2575
2616
  end
2576
2617
  end
@@ -2595,30 +2636,27 @@ class Gem::Specification < Gem::BasicSpecification
2595
2636
  end
2596
2637
 
2597
2638
  def keep_only_files_and_directories
2598
- @executables.delete_if { |x| File.directory?(File.join(@bindir, x)) }
2599
- @extensions.delete_if { |x| File.directory?(x) && !File.symlink?(x) }
2600
- @extra_rdoc_files.delete_if { |x| File.directory?(x) && !File.symlink?(x) }
2601
- @files.delete_if { |x| File.directory?(x) && !File.symlink?(x) }
2602
- @test_files.delete_if { |x| File.directory?(x) && !File.symlink?(x) }
2639
+ @executables.delete_if {|x| File.directory?(File.join(@bindir, x)) }
2640
+ @extensions.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2641
+ @extra_rdoc_files.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2642
+ @files.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2643
+ @test_files.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2603
2644
  end
2604
2645
 
2605
2646
  def validate_metadata
2606
2647
  Gem::SpecificationPolicy.new(self).validate_metadata
2607
2648
  end
2649
+ rubygems_deprecate :validate_metadata
2608
2650
 
2609
- ##
2610
- # Checks that dependencies use requirements as we recommend. Warnings are
2611
- # issued when dependencies are open-ended or overly strict for semantic
2612
- # versioning.
2613
2651
  def validate_dependencies
2614
2652
  Gem::SpecificationPolicy.new(self).validate_dependencies
2615
2653
  end
2654
+ rubygems_deprecate :validate_dependencies
2616
2655
 
2617
- ##
2618
- # Checks to see if the files to be packaged are world-readable.
2619
2656
  def validate_permissions
2620
2657
  Gem::SpecificationPolicy.new(self).validate_permissions
2621
2658
  end
2659
+ rubygems_deprecate :validate_permissions
2622
2660
 
2623
2661
  ##
2624
2662
  # Set the version to +version+, potentially also setting
@@ -2627,10 +2665,12 @@ class Gem::Specification < Gem::BasicSpecification
2627
2665
 
2628
2666
  def version=(version)
2629
2667
  @version = Gem::Version.create(version)
2668
+ return if @version.nil?
2669
+
2630
2670
  # skip to set required_ruby_version when pre-released rubygems.
2631
2671
  # It caused to raise CircularDependencyError
2632
2672
  if @version.prerelease? && (@name.nil? || @name.strip != "rubygems")
2633
- self.required_rubygems_version = '> 1.3.1'
2673
+ self.required_rubygems_version = "> 1.3.1"
2634
2674
  end
2635
2675
  invalidate_memoized_attributes
2636
2676
 
@@ -2668,9 +2708,9 @@ class Gem::Specification < Gem::BasicSpecification
2668
2708
  default = self.default_value attribute
2669
2709
 
2670
2710
  value = case default
2671
- when Time, Numeric, Symbol, true, false, nil then default
2672
- else default.dup
2673
- end
2711
+ when Time, Numeric, Symbol, true, false, nil then default
2712
+ else default.dup
2713
+ end
2674
2714
 
2675
2715
  instance_variable_set "@#{attribute}", value
2676
2716
  end
@@ -2678,11 +2718,14 @@ class Gem::Specification < Gem::BasicSpecification
2678
2718
  @installed_by_version ||= nil
2679
2719
  end
2680
2720
 
2721
+ def flatten_require_paths # :nodoc:
2722
+ return unless raw_require_paths.first.is_a?(Array)
2723
+
2724
+ warn "#{name} #{version} includes a gemspec with `require_paths` set to an array of arrays. Newer versions of this gem might've already fixed this"
2725
+ raw_require_paths.flatten!
2726
+ end
2727
+
2681
2728
  def raw_require_paths # :nodoc:
2682
2729
  @require_paths
2683
2730
  end
2684
-
2685
2731
  end
2686
-
2687
- # DOC: What is this and why is it here, randomly, at the end of this file?
2688
- Gem.clear_paths