rubygems-update 2.6.1 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (801) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +5899 -0
  3. data/CODE_OF_CONDUCT.md +76 -35
  4. data/CONTRIBUTING.md +231 -0
  5. data/MAINTAINERS.txt +8 -0
  6. data/Manifest.txt +428 -216
  7. data/POLICIES.md +135 -0
  8. data/README.md +112 -0
  9. data/UPGRADING.md +15 -0
  10. data/bundler/CHANGELOG.md +4719 -0
  11. data/bundler/LICENSE.md +22 -0
  12. data/bundler/README.md +58 -0
  13. data/bundler/UPGRADING.md +222 -0
  14. data/bundler/bundler.gemspec +46 -0
  15. data/bundler/exe/bundle +29 -0
  16. data/bundler/exe/bundler +4 -0
  17. data/bundler/lib/bundler/.document +1 -0
  18. data/bundler/lib/bundler/build_metadata.rb +45 -0
  19. data/bundler/lib/bundler/capistrano.rb +22 -0
  20. data/bundler/lib/bundler/checksum.rb +245 -0
  21. data/bundler/lib/bundler/ci_detector.rb +75 -0
  22. data/bundler/lib/bundler/cli/add.rb +47 -0
  23. data/bundler/lib/bundler/cli/binstubs.rb +57 -0
  24. data/bundler/lib/bundler/cli/cache.rb +43 -0
  25. data/bundler/lib/bundler/cli/check.rb +40 -0
  26. data/bundler/lib/bundler/cli/clean.rb +25 -0
  27. data/bundler/lib/bundler/cli/common.rb +138 -0
  28. data/bundler/lib/bundler/cli/config.rb +204 -0
  29. data/bundler/lib/bundler/cli/console.rb +44 -0
  30. data/bundler/lib/bundler/cli/doctor.rb +157 -0
  31. data/bundler/lib/bundler/cli/exec.rb +88 -0
  32. data/bundler/lib/bundler/cli/fund.rb +36 -0
  33. data/bundler/lib/bundler/cli/gem.rb +471 -0
  34. data/bundler/lib/bundler/cli/info.rb +83 -0
  35. data/bundler/lib/bundler/cli/init.rb +51 -0
  36. data/bundler/lib/bundler/cli/inject.rb +60 -0
  37. data/bundler/lib/bundler/cli/install.rb +190 -0
  38. data/bundler/lib/bundler/cli/issue.rb +41 -0
  39. data/bundler/lib/bundler/cli/list.rb +66 -0
  40. data/bundler/lib/bundler/cli/lock.rb +73 -0
  41. data/bundler/lib/bundler/cli/open.rb +29 -0
  42. data/bundler/lib/bundler/cli/outdated.rb +297 -0
  43. data/bundler/lib/bundler/cli/platform.rb +48 -0
  44. data/bundler/lib/bundler/cli/plugin.rb +34 -0
  45. data/bundler/lib/bundler/cli/pristine.rb +60 -0
  46. data/bundler/lib/bundler/cli/remove.rb +17 -0
  47. data/bundler/lib/bundler/cli/show.rb +75 -0
  48. data/bundler/lib/bundler/cli/update.rb +123 -0
  49. data/bundler/lib/bundler/cli/viz.rb +31 -0
  50. data/bundler/lib/bundler/cli.rb +846 -0
  51. data/bundler/lib/bundler/compact_index_client/cache.rb +121 -0
  52. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  53. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +32 -0
  54. data/bundler/lib/bundler/compact_index_client/updater.rb +115 -0
  55. data/bundler/lib/bundler/compact_index_client.rb +126 -0
  56. data/bundler/lib/bundler/constants.rb +7 -0
  57. data/bundler/lib/bundler/current_ruby.rb +92 -0
  58. data/bundler/lib/bundler/definition.rb +1005 -0
  59. data/bundler/lib/bundler/dependency.rb +101 -0
  60. data/bundler/lib/bundler/deployment.rb +69 -0
  61. data/bundler/lib/bundler/deprecate.rb +44 -0
  62. data/bundler/lib/bundler/digest.rb +71 -0
  63. data/bundler/lib/bundler/dsl.rb +601 -0
  64. data/bundler/lib/bundler/endpoint_specification.rb +147 -0
  65. data/bundler/lib/bundler/env.rb +148 -0
  66. data/bundler/lib/bundler/environment_preserver.rb +86 -0
  67. data/bundler/lib/bundler/errors.rb +233 -0
  68. data/bundler/lib/bundler/feature_flag.rb +53 -0
  69. data/bundler/lib/bundler/fetcher/base.rb +52 -0
  70. data/bundler/lib/bundler/fetcher/compact_index.rb +129 -0
  71. data/bundler/lib/bundler/fetcher/dependency.rb +78 -0
  72. data/bundler/lib/bundler/fetcher/downloader.rb +91 -0
  73. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  74. data/bundler/lib/bundler/fetcher/index.rb +25 -0
  75. data/bundler/lib/bundler/fetcher.rb +324 -0
  76. data/bundler/lib/bundler/force_platform.rb +18 -0
  77. data/bundler/lib/bundler/friendly_errors.rb +126 -0
  78. data/bundler/lib/bundler/gem_helper.rb +237 -0
  79. data/bundler/lib/bundler/gem_helpers.rb +127 -0
  80. data/bundler/lib/bundler/gem_tasks.rb +7 -0
  81. data/bundler/lib/bundler/gem_version_promoter.rb +145 -0
  82. data/bundler/lib/bundler/graph.rb +152 -0
  83. data/bundler/lib/bundler/index.rb +205 -0
  84. data/bundler/lib/bundler/injector.rb +287 -0
  85. data/bundler/lib/bundler/inline.rb +73 -0
  86. data/bundler/lib/bundler/installer/gem_installer.rb +84 -0
  87. data/bundler/lib/bundler/installer/parallel_installer.rb +202 -0
  88. data/bundler/lib/bundler/installer/standalone.rb +116 -0
  89. data/bundler/lib/bundler/installer.rb +267 -0
  90. data/bundler/lib/bundler/lazy_specification.rb +170 -0
  91. data/bundler/lib/bundler/lockfile_generator.rb +104 -0
  92. data/bundler/lib/bundler/lockfile_parser.rb +289 -0
  93. data/bundler/lib/bundler/man/.document +1 -0
  94. data/bundler/lib/bundler/man/bundle-add.1 +59 -0
  95. data/bundler/lib/bundler/man/bundle-add.1.ronn +58 -0
  96. data/bundler/lib/bundler/man/bundle-binstubs.1 +30 -0
  97. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +41 -0
  98. data/bundler/lib/bundler/man/bundle-cache.1 +40 -0
  99. data/bundler/lib/bundler/man/bundle-cache.1.ronn +79 -0
  100. data/bundler/lib/bundler/man/bundle-check.1 +22 -0
  101. data/bundler/lib/bundler/man/bundle-check.1.ronn +26 -0
  102. data/bundler/lib/bundler/man/bundle-clean.1 +17 -0
  103. data/bundler/lib/bundler/man/bundle-clean.1.ronn +18 -0
  104. data/bundler/lib/bundler/man/bundle-config.1 +321 -0
  105. data/bundler/lib/bundler/man/bundle-config.1.ronn +411 -0
  106. data/bundler/lib/bundler/man/bundle-console.1 +35 -0
  107. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  108. data/bundler/lib/bundler/man/bundle-doctor.1 +30 -0
  109. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +33 -0
  110. data/bundler/lib/bundler/man/bundle-exec.1 +104 -0
  111. data/bundler/lib/bundler/man/bundle-exec.1.ronn +151 -0
  112. data/bundler/lib/bundler/man/bundle-gem.1 +69 -0
  113. data/bundler/lib/bundler/man/bundle-gem.1.ronn +117 -0
  114. data/bundler/lib/bundler/man/bundle-help.1 +9 -0
  115. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  116. data/bundler/lib/bundler/man/bundle-info.1 +14 -0
  117. data/bundler/lib/bundler/man/bundle-info.1.ronn +17 -0
  118. data/bundler/lib/bundler/man/bundle-init.1 +20 -0
  119. data/bundler/lib/bundler/man/bundle-init.1.ronn +31 -0
  120. data/bundler/lib/bundler/man/bundle-inject.1 +23 -0
  121. data/bundler/lib/bundler/man/bundle-inject.1.ronn +24 -0
  122. data/bundler/lib/bundler/man/bundle-install.1 +215 -0
  123. data/bundler/lib/bundler/man/bundle-install.1.ronn +383 -0
  124. data/bundler/lib/bundler/man/bundle-list.1 +35 -0
  125. data/bundler/lib/bundler/man/bundle-list.1.ronn +33 -0
  126. data/bundler/lib/bundler/man/bundle-lock.1 +60 -0
  127. data/bundler/lib/bundler/man/bundle-lock.1.ronn +94 -0
  128. data/bundler/lib/bundler/man/bundle-open.1 +32 -0
  129. data/bundler/lib/bundler/man/bundle-open.1.ronn +27 -0
  130. data/bundler/lib/bundler/man/bundle-outdated.1 +100 -0
  131. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +106 -0
  132. data/bundler/lib/bundler/man/bundle-platform.1 +49 -0
  133. data/bundler/lib/bundler/man/bundle-platform.1.ronn +49 -0
  134. data/bundler/lib/bundler/man/bundle-plugin.1 +55 -0
  135. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  136. data/bundler/lib/bundler/man/bundle-pristine.1 +23 -0
  137. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +34 -0
  138. data/bundler/lib/bundler/man/bundle-remove.1 +21 -0
  139. data/bundler/lib/bundler/man/bundle-remove.1.ronn +23 -0
  140. data/bundler/lib/bundler/man/bundle-show.1 +16 -0
  141. data/bundler/lib/bundler/man/bundle-show.1.ronn +21 -0
  142. data/bundler/lib/bundler/man/bundle-update.1 +275 -0
  143. data/bundler/lib/bundler/man/bundle-update.1.ronn +351 -0
  144. data/bundler/lib/bundler/man/bundle-version.1 +22 -0
  145. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  146. data/bundler/lib/bundler/man/bundle-viz.1 +30 -0
  147. data/bundler/lib/bundler/man/bundle-viz.1.ronn +32 -0
  148. data/bundler/lib/bundler/man/bundle.1 +102 -0
  149. data/bundler/lib/bundler/man/bundle.1.ronn +116 -0
  150. data/bundler/lib/bundler/man/gemfile.5 +470 -0
  151. data/bundler/lib/bundler/man/gemfile.5.ronn +552 -0
  152. data/bundler/lib/bundler/man/index.txt +29 -0
  153. data/bundler/lib/bundler/match_metadata.rb +17 -0
  154. data/bundler/lib/bundler/match_platform.rb +23 -0
  155. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  156. data/bundler/lib/bundler/mirror.rb +221 -0
  157. data/bundler/lib/bundler/plugin/api/source.rb +321 -0
  158. data/bundler/lib/bundler/plugin/api.rb +81 -0
  159. data/bundler/lib/bundler/plugin/dsl.rb +53 -0
  160. data/bundler/lib/bundler/plugin/events.rb +61 -0
  161. data/bundler/lib/bundler/plugin/index.rb +193 -0
  162. data/bundler/lib/bundler/plugin/installer/git.rb +34 -0
  163. data/bundler/lib/bundler/plugin/installer/rubygems.rb +19 -0
  164. data/bundler/lib/bundler/plugin/installer.rb +112 -0
  165. data/bundler/lib/bundler/plugin/source_list.rb +31 -0
  166. data/bundler/lib/bundler/plugin.rb +359 -0
  167. data/bundler/lib/bundler/process_lock.rb +24 -0
  168. data/bundler/lib/bundler/remote_specification.rb +117 -0
  169. data/bundler/lib/bundler/resolver/base.rb +107 -0
  170. data/bundler/lib/bundler/resolver/candidate.rb +94 -0
  171. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  172. data/bundler/lib/bundler/resolver/package.rb +77 -0
  173. data/bundler/lib/bundler/resolver/root.rb +25 -0
  174. data/bundler/lib/bundler/resolver/spec_group.rb +79 -0
  175. data/bundler/lib/bundler/resolver.rb +462 -0
  176. data/bundler/lib/bundler/retry.rb +66 -0
  177. data/bundler/lib/bundler/ruby_dsl.rb +53 -0
  178. data/bundler/lib/bundler/ruby_version.rb +131 -0
  179. data/bundler/lib/bundler/rubygems_ext.rb +328 -0
  180. data/bundler/lib/bundler/rubygems_gem_installer.rb +137 -0
  181. data/bundler/lib/bundler/rubygems_integration.rb +493 -0
  182. data/bundler/lib/bundler/runtime.rb +307 -0
  183. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  184. data/bundler/lib/bundler/self_manager.rb +186 -0
  185. data/bundler/lib/bundler/settings/validator.rb +102 -0
  186. data/bundler/lib/bundler/settings.rb +588 -0
  187. data/bundler/lib/bundler/setup.rb +33 -0
  188. data/bundler/lib/bundler/shared_helpers.rb +380 -0
  189. data/bundler/lib/bundler/similarity_detector.rb +63 -0
  190. data/bundler/lib/bundler/source/gemspec.rb +18 -0
  191. data/bundler/lib/bundler/source/git/git_proxy.rb +455 -0
  192. data/bundler/lib/bundler/source/git.rb +380 -0
  193. data/bundler/lib/bundler/source/metadata.rb +62 -0
  194. data/bundler/lib/bundler/source/path/installer.rb +53 -0
  195. data/bundler/lib/bundler/source/path.rb +261 -0
  196. data/bundler/lib/bundler/source/rubygems/remote.rb +68 -0
  197. data/bundler/lib/bundler/source/rubygems.rb +516 -0
  198. data/bundler/lib/bundler/source/rubygems_aggregate.rb +68 -0
  199. data/bundler/lib/bundler/source.rb +116 -0
  200. data/bundler/lib/bundler/source_list.rb +227 -0
  201. data/bundler/lib/bundler/source_map.rb +71 -0
  202. data/bundler/lib/bundler/spec_set.rb +247 -0
  203. data/bundler/lib/bundler/stub_specification.rb +119 -0
  204. data/bundler/lib/bundler/templates/.document +1 -0
  205. data/bundler/lib/bundler/templates/Executable +27 -0
  206. data/bundler/lib/bundler/templates/Executable.bundler +109 -0
  207. data/bundler/lib/bundler/templates/Executable.standalone +14 -0
  208. data/bundler/lib/bundler/templates/Gemfile +5 -0
  209. data/bundler/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  210. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +84 -0
  211. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  212. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +26 -0
  213. data/bundler/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
  214. data/bundler/lib/bundler/templates/newgem/README.md.tt +45 -0
  215. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +67 -0
  216. data/bundler/lib/bundler/templates/newgem/bin/console.tt +11 -0
  217. data/bundler/lib/bundler/templates/newgem/bin/setup.tt +8 -0
  218. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +25 -0
  219. data/bundler/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
  220. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  221. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  222. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  223. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
  224. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
  225. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  226. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +37 -0
  227. data/bundler/lib/bundler/templates/newgem/gitignore.tt +23 -0
  228. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +18 -0
  229. data/bundler/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +9 -0
  230. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +15 -0
  231. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +51 -0
  232. data/bundler/lib/bundler/templates/newgem/rspec.tt +3 -0
  233. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  234. data/bundler/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  235. data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +11 -0
  236. data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -0
  237. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  238. data/bundler/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  239. data/bundler/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +13 -0
  240. data/bundler/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  241. data/bundler/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  242. data/bundler/lib/bundler/ui/rg_proxy.rb +19 -0
  243. data/bundler/lib/bundler/ui/shell.rb +165 -0
  244. data/bundler/lib/bundler/ui/silent.rb +85 -0
  245. data/bundler/lib/bundler/ui.rb +9 -0
  246. data/bundler/lib/bundler/uri_credentials_filter.rb +43 -0
  247. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  248. data/bundler/lib/bundler/vendor/.document +1 -0
  249. data/bundler/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  250. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +174 -0
  251. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  252. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
  253. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +175 -0
  254. data/bundler/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  255. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +2694 -0
  256. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  257. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +41 -0
  258. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +65 -0
  259. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  260. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1073 -0
  261. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  262. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  263. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  264. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  265. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  266. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  267. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  268. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  269. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  270. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  271. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  272. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  273. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  274. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  275. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  276. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  277. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  278. data/bundler/lib/bundler/vendor/thor/LICENSE.md +20 -0
  279. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +105 -0
  280. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +61 -0
  281. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +108 -0
  282. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
  283. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
  284. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +130 -0
  285. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +340 -0
  286. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +825 -0
  287. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +151 -0
  288. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
  289. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +106 -0
  290. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
  291. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +178 -0
  292. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
  293. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
  294. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
  295. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  296. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +89 -0
  297. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +195 -0
  298. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +178 -0
  299. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +293 -0
  300. data/bundler/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  301. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +72 -0
  302. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +335 -0
  303. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +388 -0
  304. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +115 -0
  305. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  306. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +84 -0
  307. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
  308. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  309. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  310. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  311. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
  312. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +285 -0
  313. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
  314. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +663 -0
  315. data/bundler/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  316. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
  317. data/bundler/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  318. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +853 -0
  319. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
  320. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  321. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1588 -0
  322. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +125 -0
  323. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  324. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  325. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
  326. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
  327. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +539 -0
  328. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +183 -0
  329. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  330. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
  331. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
  332. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  333. data/bundler/lib/bundler/vendored_fileutils.rb +4 -0
  334. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  335. data/bundler/lib/bundler/vendored_persistent.rb +11 -0
  336. data/bundler/lib/bundler/vendored_pub_grub.rb +4 -0
  337. data/bundler/lib/bundler/vendored_thor.rb +8 -0
  338. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  339. data/bundler/lib/bundler/vendored_tsort.rb +4 -0
  340. data/bundler/lib/bundler/vendored_uri.rb +4 -0
  341. data/bundler/lib/bundler/version.rb +13 -0
  342. data/bundler/lib/bundler/vlad.rb +17 -0
  343. data/bundler/lib/bundler/worker.rb +117 -0
  344. data/bundler/lib/bundler/yaml_serializer.rb +93 -0
  345. data/bundler/lib/bundler.rb +665 -0
  346. data/{test/rubygems/bogussources.rb → exe/gem} +5 -2
  347. data/exe/update_rubygems +38 -0
  348. data/hide_lib_for_update/note.txt +0 -4
  349. data/lib/rubygems/available_set.rb +12 -12
  350. data/lib/rubygems/basic_specification.rb +75 -58
  351. data/lib/rubygems/bundler_version_finder.rb +77 -0
  352. data/lib/rubygems/ci_detector.rb +75 -0
  353. data/lib/rubygems/command.rb +144 -71
  354. data/lib/rubygems/command_manager.rb +64 -27
  355. data/lib/rubygems/commands/build_command.rb +88 -17
  356. data/lib/rubygems/commands/cert_command.rb +131 -83
  357. data/lib/rubygems/commands/check_command.rb +30 -27
  358. data/lib/rubygems/commands/cleanup_command.rb +57 -40
  359. data/lib/rubygems/commands/contents_command.rb +37 -39
  360. data/lib/rubygems/commands/dependency_command.rb +53 -65
  361. data/lib/rubygems/commands/environment_command.rb +32 -16
  362. data/lib/rubygems/commands/exec_command.rb +249 -0
  363. data/lib/rubygems/commands/fetch_command.rb +36 -19
  364. data/lib/rubygems/commands/generate_index_command.rb +40 -74
  365. data/lib/rubygems/commands/help_command.rb +22 -22
  366. data/lib/rubygems/commands/info_command.rb +38 -0
  367. data/lib/rubygems/commands/install_command.rb +67 -143
  368. data/lib/rubygems/commands/list_command.rb +10 -9
  369. data/lib/rubygems/commands/lock_command.rb +12 -14
  370. data/lib/rubygems/commands/mirror_command.rb +4 -4
  371. data/lib/rubygems/commands/open_command.rb +28 -26
  372. data/lib/rubygems/commands/outdated_command.rb +6 -6
  373. data/lib/rubygems/commands/owner_command.rb +51 -27
  374. data/lib/rubygems/commands/pristine_command.rb +99 -71
  375. data/lib/rubygems/commands/push_command.rb +53 -46
  376. data/lib/rubygems/commands/query_command.rb +21 -328
  377. data/lib/rubygems/commands/rdoc_command.rb +33 -33
  378. data/lib/rubygems/commands/search_command.rb +9 -9
  379. data/lib/rubygems/commands/server_command.rb +15 -76
  380. data/lib/rubygems/commands/setup_command.rb +370 -186
  381. data/lib/rubygems/commands/signin_command.rb +34 -0
  382. data/lib/rubygems/commands/signout_command.rb +32 -0
  383. data/lib/rubygems/commands/sources_command.rb +57 -41
  384. data/lib/rubygems/commands/specification_command.rb +38 -28
  385. data/lib/rubygems/commands/stale_command.rb +6 -5
  386. data/lib/rubygems/commands/uninstall_command.rb +96 -62
  387. data/lib/rubygems/commands/unpack_command.rb +44 -53
  388. data/lib/rubygems/commands/update_command.rb +155 -99
  389. data/lib/rubygems/commands/which_command.rb +14 -17
  390. data/lib/rubygems/commands/yank_command.rb +28 -32
  391. data/lib/rubygems/compatibility.rb +13 -32
  392. data/lib/rubygems/config_file.rb +214 -119
  393. data/lib/rubygems/core_ext/kernel_gem.rb +10 -16
  394. data/lib/rubygems/core_ext/kernel_require.rb +92 -90
  395. data/lib/rubygems/core_ext/kernel_warn.rb +49 -0
  396. data/lib/rubygems/core_ext/tcpsocket_init.rb +54 -0
  397. data/lib/rubygems/defaults.rb +184 -54
  398. data/lib/rubygems/dependency.rb +75 -62
  399. data/lib/rubygems/dependency_installer.rb +74 -230
  400. data/lib/rubygems/dependency_list.rb +32 -33
  401. data/lib/rubygems/deprecate.rb +113 -17
  402. data/lib/rubygems/doctor.rb +31 -31
  403. data/lib/rubygems/errors.rb +51 -13
  404. data/lib/rubygems/exceptions.rb +65 -35
  405. data/lib/rubygems/ext/build_error.rb +3 -1
  406. data/lib/rubygems/ext/builder.rb +103 -77
  407. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +27 -0
  408. data/lib/rubygems/ext/cargo_builder.rb +360 -0
  409. data/lib/rubygems/ext/cmake_builder.rb +6 -7
  410. data/lib/rubygems/ext/configure_builder.rb +6 -9
  411. data/lib/rubygems/ext/ext_conf_builder.rb +40 -61
  412. data/lib/rubygems/ext/rake_builder.rb +18 -21
  413. data/lib/rubygems/ext.rb +8 -7
  414. data/lib/rubygems/gem_runner.rb +19 -21
  415. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  416. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  417. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  418. data/lib/rubygems/gemcutter_utilities.rb +246 -43
  419. data/lib/rubygems/install_default_message.rb +3 -3
  420. data/lib/rubygems/install_message.rb +3 -3
  421. data/lib/rubygems/install_update_options.rb +104 -98
  422. data/lib/rubygems/installer.rb +407 -225
  423. data/lib/rubygems/installer_uninstaller_utils.rb +27 -0
  424. data/lib/rubygems/local_remote_options.rb +29 -32
  425. data/lib/rubygems/name_tuple.rb +18 -23
  426. data/lib/rubygems/net/http.rb +3 -0
  427. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  428. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  429. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  430. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  431. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  432. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  433. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  434. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  435. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  436. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  437. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  438. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  439. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  440. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  441. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  442. data/lib/rubygems/openssl.rb +7 -0
  443. data/lib/rubygems/optparse/.document +1 -0
  444. data/lib/rubygems/optparse/COPYING +56 -0
  445. data/lib/rubygems/optparse/lib/optionparser.rb +2 -0
  446. data/lib/rubygems/optparse/lib/optparse/ac.rb +54 -0
  447. data/lib/rubygems/optparse/lib/optparse/date.rb +18 -0
  448. data/lib/rubygems/optparse/lib/optparse/kwargs.rb +22 -0
  449. data/lib/rubygems/optparse/lib/optparse/shellwords.rb +7 -0
  450. data/lib/rubygems/optparse/lib/optparse/time.rb +11 -0
  451. data/lib/rubygems/optparse/lib/optparse/uri.rb +7 -0
  452. data/lib/rubygems/optparse/lib/optparse/version.rb +71 -0
  453. data/lib/rubygems/optparse/lib/optparse.rb +2330 -0
  454. data/lib/rubygems/optparse.rb +3 -0
  455. data/lib/rubygems/package/digest_io.rb +5 -7
  456. data/lib/rubygems/package/file_source.rb +6 -8
  457. data/lib/rubygems/package/io_source.rb +6 -4
  458. data/lib/rubygems/package/old.rb +19 -28
  459. data/lib/rubygems/package/source.rb +1 -1
  460. data/lib/rubygems/package/tar_header.rb +114 -93
  461. data/lib/rubygems/package/tar_reader/entry.rb +116 -22
  462. data/lib/rubygems/package/tar_reader.rb +18 -40
  463. data/lib/rubygems/package/tar_writer.rb +42 -56
  464. data/lib/rubygems/package.rb +245 -145
  465. data/lib/rubygems/package_task.rb +8 -14
  466. data/lib/rubygems/path_support.rb +21 -16
  467. data/lib/rubygems/platform.rb +135 -74
  468. data/lib/rubygems/psych_tree.rb +3 -2
  469. data/lib/rubygems/query_utils.rb +349 -0
  470. data/lib/rubygems/rdoc.rb +4 -326
  471. data/lib/rubygems/remote_fetcher.rb +99 -181
  472. data/lib/rubygems/request/connection_pools.rb +31 -24
  473. data/lib/rubygems/request/http_pool.rb +6 -7
  474. data/lib/rubygems/request/https_pool.rb +2 -3
  475. data/lib/rubygems/request.rb +103 -53
  476. data/lib/rubygems/request_set/gem_dependency_api.rb +182 -190
  477. data/lib/rubygems/request_set/lockfile/parser.rb +42 -52
  478. data/lib/rubygems/request_set/lockfile/tokenizer.rb +34 -24
  479. data/lib/rubygems/request_set/lockfile.rb +32 -35
  480. data/lib/rubygems/request_set.rb +115 -71
  481. data/lib/rubygems/requirement.rb +77 -68
  482. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  483. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  484. data/lib/rubygems/resolver/activation_request.rb +34 -61
  485. data/lib/rubygems/resolver/api_set/gem_parser.rb +24 -0
  486. data/lib/rubygems/resolver/api_set.rb +40 -32
  487. data/lib/rubygems/resolver/api_specification.rb +37 -18
  488. data/lib/rubygems/resolver/best_set.rb +15 -17
  489. data/lib/rubygems/resolver/composed_set.rb +9 -11
  490. data/lib/rubygems/resolver/conflict.rb +19 -33
  491. data/lib/rubygems/resolver/current_set.rb +2 -4
  492. data/lib/rubygems/resolver/dependency_request.rb +8 -9
  493. data/lib/rubygems/resolver/git_set.rb +8 -10
  494. data/lib/rubygems/resolver/git_specification.rb +11 -13
  495. data/lib/rubygems/resolver/index_set.rb +13 -15
  496. data/lib/rubygems/resolver/index_specification.rb +42 -11
  497. data/lib/rubygems/resolver/installed_specification.rb +9 -11
  498. data/lib/rubygems/resolver/installer_set.rb +87 -45
  499. data/lib/rubygems/resolver/local_specification.rb +5 -7
  500. data/lib/rubygems/resolver/lock_set.rb +13 -15
  501. data/lib/rubygems/resolver/lock_specification.rb +13 -15
  502. data/lib/rubygems/resolver/molinillo/LICENSE +9 -0
  503. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  504. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +88 -0
  505. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  506. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  507. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  508. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  509. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  510. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  511. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  512. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  513. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +164 -0
  514. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +110 -146
  515. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +83 -9
  516. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  517. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +13 -1
  518. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
  519. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +552 -172
  520. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
  521. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +12 -6
  522. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
  523. data/lib/rubygems/resolver/molinillo.rb +2 -1
  524. data/lib/rubygems/resolver/requirement_list.rb +2 -2
  525. data/lib/rubygems/resolver/set.rb +3 -5
  526. data/lib/rubygems/resolver/source_set.rb +6 -7
  527. data/lib/rubygems/resolver/spec_specification.rb +16 -4
  528. data/lib/rubygems/resolver/specification.rb +25 -10
  529. data/lib/rubygems/resolver/stats.rb +1 -0
  530. data/lib/rubygems/resolver/vendor_set.rb +6 -8
  531. data/lib/rubygems/resolver/vendor_specification.rb +6 -8
  532. data/lib/rubygems/resolver.rb +121 -72
  533. data/lib/rubygems/s3_uri_signer.rb +177 -0
  534. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  535. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  536. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  537. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  538. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  539. data/lib/rubygems/safe_marshal.rb +74 -0
  540. data/lib/rubygems/safe_yaml.rb +36 -0
  541. data/lib/rubygems/security/policies.rb +49 -51
  542. data/lib/rubygems/security/policy.rb +46 -53
  543. data/lib/rubygems/security/signer.rb +86 -29
  544. data/lib/rubygems/security/trust_dir.rb +22 -24
  545. data/lib/rubygems/security.rb +101 -82
  546. data/lib/rubygems/security_option.rb +43 -0
  547. data/lib/rubygems/shellwords.rb +3 -0
  548. data/lib/rubygems/source/git.rb +40 -42
  549. data/lib/rubygems/source/installed.rb +5 -9
  550. data/lib/rubygems/source/local.rb +30 -33
  551. data/lib/rubygems/source/lock.rb +10 -10
  552. data/lib/rubygems/source/specific_file.rb +7 -9
  553. data/lib/rubygems/source/vendor.rb +3 -7
  554. data/lib/rubygems/source.rb +78 -68
  555. data/lib/rubygems/source_list.rb +11 -15
  556. data/lib/rubygems/spec_fetcher.rb +71 -83
  557. data/lib/rubygems/specification.rb +833 -1115
  558. data/lib/rubygems/specification_policy.rb +538 -0
  559. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA.pem +21 -0
  560. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
  561. data/lib/rubygems/stub_specification.rb +55 -57
  562. data/lib/rubygems/text.rb +39 -27
  563. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  564. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  565. data/lib/rubygems/timeout.rb +3 -0
  566. data/lib/rubygems/tsort/.document +1 -0
  567. data/lib/rubygems/tsort/LICENSE.txt +22 -0
  568. data/lib/rubygems/tsort/lib/tsort.rb +455 -0
  569. data/lib/rubygems/tsort.rb +3 -0
  570. data/lib/rubygems/uninstaller.rb +150 -87
  571. data/lib/rubygems/unknown_command_spell_checker.rb +21 -0
  572. data/lib/rubygems/update_suggestion.rb +56 -0
  573. data/lib/rubygems/uri.rb +126 -0
  574. data/lib/rubygems/uri_formatter.rb +4 -7
  575. data/lib/rubygems/user_interaction.rb +92 -146
  576. data/lib/rubygems/util/licenses.rb +712 -317
  577. data/lib/rubygems/util/list.rb +5 -2
  578. data/lib/rubygems/util.rb +58 -75
  579. data/lib/rubygems/validator.rb +26 -48
  580. data/lib/rubygems/version.rb +106 -56
  581. data/lib/rubygems/version_option.rb +22 -14
  582. data/lib/rubygems/yaml_serializer.rb +93 -0
  583. data/lib/rubygems.rb +427 -361
  584. data/rubygems-update.gemspec +38 -0
  585. data/setup.rb +13 -27
  586. metadata +500 -363
  587. data/.autotest +0 -71
  588. data/.document +0 -5
  589. data/.travis.yml +0 -46
  590. data/CONTRIBUTING.rdoc +0 -129
  591. data/CVE-2013-4287.txt +0 -35
  592. data/CVE-2013-4363.txt +0 -45
  593. data/CVE-2015-3900.txt +0 -40
  594. data/History.txt +0 -3105
  595. data/MAINTAINERS.md +0 -5
  596. data/POLICIES.rdoc +0 -61
  597. data/README.rdoc +0 -54
  598. data/Rakefile +0 -449
  599. data/UPGRADING.rdoc +0 -92
  600. data/appveyor.yml +0 -36
  601. data/bin/gem +0 -25
  602. data/bin/update_rubygems +0 -37
  603. data/lib/gauntlet_rubygems.rb +0 -51
  604. data/lib/rubygems/indexer.rb +0 -434
  605. data/lib/rubygems/installer_test_case.rb +0 -194
  606. data/lib/rubygems/mock_gem_ui.rb +0 -89
  607. data/lib/rubygems/package/tar_test_case.rb +0 -147
  608. data/lib/rubygems/psych_additions.rb +0 -10
  609. data/lib/rubygems/server.rb +0 -869
  610. data/lib/rubygems/source_local.rb +0 -6
  611. data/lib/rubygems/source_specific_file.rb +0 -5
  612. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  613. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +0 -32
  614. data/lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
  615. data/lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
  616. data/lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  617. data/lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  618. data/lib/rubygems/syck_hack.rb +0 -77
  619. data/lib/rubygems/test_case.rb +0 -1496
  620. data/lib/rubygems/test_utilities.rb +0 -384
  621. data/lib/ubygems.rb +0 -11
  622. data/test/rubygems/alternate_cert.pem +0 -18
  623. data/test/rubygems/alternate_cert_32.pem +0 -18
  624. data/test/rubygems/alternate_key.pem +0 -27
  625. data/test/rubygems/bad_rake.rb +0 -2
  626. data/test/rubygems/ca_cert.pem +0 -68
  627. data/test/rubygems/child_cert.pem +0 -18
  628. data/test/rubygems/child_cert_32.pem +0 -18
  629. data/test/rubygems/child_key.pem +0 -27
  630. data/test/rubygems/client.pem +0 -49
  631. data/test/rubygems/data/gem-private_key.pem +0 -27
  632. data/test/rubygems/data/gem-public_cert.pem +0 -20
  633. data/test/rubygems/data/null-type.gemspec.rz +0 -0
  634. data/test/rubygems/encrypted_private_key.pem +0 -30
  635. data/test/rubygems/expired_cert.pem +0 -18
  636. data/test/rubygems/fake_certlib/openssl.rb +0 -8
  637. data/test/rubygems/fix_openssl_warnings.rb +0 -13
  638. data/test/rubygems/foo/discover.rb +0 -1
  639. data/test/rubygems/future_cert.pem +0 -18
  640. data/test/rubygems/future_cert_32.pem +0 -18
  641. data/test/rubygems/good_rake.rb +0 -2
  642. data/test/rubygems/grandchild_cert.pem +0 -18
  643. data/test/rubygems/grandchild_cert_32.pem +0 -18
  644. data/test/rubygems/grandchild_key.pem +0 -27
  645. data/test/rubygems/invalid_client.pem +0 -49
  646. data/test/rubygems/invalid_issuer_cert.pem +0 -18
  647. data/test/rubygems/invalid_issuer_cert_32.pem +0 -18
  648. data/test/rubygems/invalid_key.pem +0 -27
  649. data/test/rubygems/invalid_signer_cert.pem +0 -18
  650. data/test/rubygems/invalid_signer_cert_32.pem +0 -18
  651. data/test/rubygems/invalidchild_cert.pem +0 -18
  652. data/test/rubygems/invalidchild_cert_32.pem +0 -18
  653. data/test/rubygems/invalidchild_key.pem +0 -27
  654. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
  655. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
  656. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
  657. data/test/rubygems/private_key.pem +0 -27
  658. data/test/rubygems/public_cert.pem +0 -18
  659. data/test/rubygems/public_cert_32.pem +0 -18
  660. data/test/rubygems/public_key.pem +0 -9
  661. data/test/rubygems/rubygems/commands/crash_command.rb +0 -6
  662. data/test/rubygems/rubygems_plugin.rb +0 -22
  663. data/test/rubygems/sff/discover.rb +0 -1
  664. data/test/rubygems/simple_gem.rb +0 -67
  665. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  666. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  667. data/test/rubygems/ssl_cert.pem +0 -19
  668. data/test/rubygems/ssl_key.pem +0 -15
  669. data/test/rubygems/test_bundled_ca.rb +0 -59
  670. data/test/rubygems/test_config.rb +0 -24
  671. data/test/rubygems/test_deprecate.rb +0 -77
  672. data/test/rubygems/test_gem.rb +0 -1718
  673. data/test/rubygems/test_gem_available_set.rb +0 -130
  674. data/test/rubygems/test_gem_command.rb +0 -248
  675. data/test/rubygems/test_gem_command_manager.rb +0 -264
  676. data/test/rubygems/test_gem_commands_build_command.rb +0 -121
  677. data/test/rubygems/test_gem_commands_cert_command.rb +0 -671
  678. data/test/rubygems/test_gem_commands_check_command.rb +0 -69
  679. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -197
  680. data/test/rubygems/test_gem_commands_contents_command.rb +0 -240
  681. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -230
  682. data/test/rubygems/test_gem_commands_environment_command.rb +0 -154
  683. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -127
  684. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -51
  685. data/test/rubygems/test_gem_commands_help_command.rb +0 -75
  686. data/test/rubygems/test_gem_commands_install_command.rb +0 -1007
  687. data/test/rubygems/test_gem_commands_list_command.rb +0 -34
  688. data/test/rubygems/test_gem_commands_lock_command.rb +0 -69
  689. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  690. data/test/rubygems/test_gem_commands_open_command.rb +0 -70
  691. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -33
  692. data/test/rubygems/test_gem_commands_owner_command.rb +0 -205
  693. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -491
  694. data/test/rubygems/test_gem_commands_push_command.rb +0 -330
  695. data/test/rubygems/test_gem_commands_query_command.rb +0 -657
  696. data/test/rubygems/test_gem_commands_search_command.rb +0 -18
  697. data/test/rubygems/test_gem_commands_server_command.rb +0 -60
  698. data/test/rubygems/test_gem_commands_setup_command.rb +0 -136
  699. data/test/rubygems/test_gem_commands_sources_command.rb +0 -249
  700. data/test/rubygems/test_gem_commands_specification_command.rb +0 -251
  701. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  702. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -283
  703. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -209
  704. data/test/rubygems/test_gem_commands_update_command.rb +0 -514
  705. data/test/rubygems/test_gem_commands_which_command.rb +0 -87
  706. data/test/rubygems/test_gem_commands_yank_command.rb +0 -100
  707. data/test/rubygems/test_gem_config_file.rb +0 -491
  708. data/test/rubygems/test_gem_dependency.rb +0 -362
  709. data/test/rubygems/test_gem_dependency_installer.rb +0 -1235
  710. data/test/rubygems/test_gem_dependency_list.rb +0 -260
  711. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -29
  712. data/test/rubygems/test_gem_doctor.rb +0 -169
  713. data/test/rubygems/test_gem_ext_builder.rb +0 -341
  714. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -87
  715. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -87
  716. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -211
  717. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -65
  718. data/test/rubygems/test_gem_gem_runner.rb +0 -69
  719. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -235
  720. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -62
  721. data/test/rubygems/test_gem_indexer.rb +0 -367
  722. data/test/rubygems/test_gem_install_update_options.rb +0 -197
  723. data/test/rubygems/test_gem_installer.rb +0 -1552
  724. data/test/rubygems/test_gem_local_remote_options.rb +0 -134
  725. data/test/rubygems/test_gem_name_tuple.rb +0 -45
  726. data/test/rubygems/test_gem_package.rb +0 -876
  727. data/test/rubygems/test_gem_package_old.rb +0 -90
  728. data/test/rubygems/test_gem_package_tar_header.rb +0 -147
  729. data/test/rubygems/test_gem_package_tar_reader.rb +0 -90
  730. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -142
  731. data/test/rubygems/test_gem_package_tar_writer.rb +0 -264
  732. data/test/rubygems/test_gem_package_task.rb +0 -84
  733. data/test/rubygems/test_gem_path_support.rb +0 -121
  734. data/test/rubygems/test_gem_platform.rb +0 -308
  735. data/test/rubygems/test_gem_rdoc.rb +0 -270
  736. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1051
  737. data/test/rubygems/test_gem_request.rb +0 -363
  738. data/test/rubygems/test_gem_request_connection_pools.rb +0 -130
  739. data/test/rubygems/test_gem_request_set.rb +0 -595
  740. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -831
  741. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -470
  742. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -549
  743. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
  744. data/test/rubygems/test_gem_requirement.rb +0 -387
  745. data/test/rubygems/test_gem_resolver.rb +0 -715
  746. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -74
  747. data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
  748. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -145
  749. data/test/rubygems/test_gem_resolver_best_set.rb +0 -138
  750. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -46
  751. data/test/rubygems/test_gem_resolver_conflict.rb +0 -88
  752. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -85
  753. data/test/rubygems/test_gem_resolver_git_set.rb +0 -190
  754. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  755. data/test/rubygems/test_gem_resolver_index_set.rb +0 -90
  756. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -90
  757. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -50
  758. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -258
  759. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -46
  760. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -64
  761. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -100
  762. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -21
  763. data/test/rubygems/test_gem_resolver_specification.rb +0 -65
  764. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -84
  765. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -84
  766. data/test/rubygems/test_gem_security.rb +0 -307
  767. data/test/rubygems/test_gem_security_policy.rb +0 -541
  768. data/test/rubygems/test_gem_security_signer.rb +0 -209
  769. data/test/rubygems/test_gem_security_trust_dir.rb +0 -101
  770. data/test/rubygems/test_gem_server.rb +0 -409
  771. data/test/rubygems/test_gem_silent_ui.rb +0 -117
  772. data/test/rubygems/test_gem_source.rb +0 -242
  773. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -20
  774. data/test/rubygems/test_gem_source_git.rb +0 -309
  775. data/test/rubygems/test_gem_source_installed.rb +0 -37
  776. data/test/rubygems/test_gem_source_list.rb +0 -118
  777. data/test/rubygems/test_gem_source_local.rb +0 -107
  778. data/test/rubygems/test_gem_source_lock.rb +0 -115
  779. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  780. data/test/rubygems/test_gem_source_vendor.rb +0 -32
  781. data/test/rubygems/test_gem_spec_fetcher.rb +0 -311
  782. data/test/rubygems/test_gem_specification.rb +0 -3519
  783. data/test/rubygems/test_gem_stream_ui.rb +0 -239
  784. data/test/rubygems/test_gem_stub_specification.rb +0 -217
  785. data/test/rubygems/test_gem_text.rb +0 -77
  786. data/test/rubygems/test_gem_uninstaller.rb +0 -485
  787. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -33
  788. data/test/rubygems/test_gem_uri_formatter.rb +0 -29
  789. data/test/rubygems/test_gem_util.rb +0 -40
  790. data/test/rubygems/test_gem_validator.rb +0 -46
  791. data/test/rubygems/test_gem_version.rb +0 -222
  792. data/test/rubygems/test_gem_version_option.rb +0 -152
  793. data/test/rubygems/test_kernel.rb +0 -86
  794. data/test/rubygems/test_require.rb +0 -322
  795. data/test/rubygems/wrong_key_cert.pem +0 -18
  796. data/test/rubygems/wrong_key_cert_32.pem +0 -18
  797. data/util/CL2notes +0 -56
  798. data/util/create_certs.rb +0 -157
  799. data/util/create_encrypted_key.rb +0 -17
  800. data/util/generate_spdx_license_list.rb +0 -51
  801. data/util/update_bundled_ca_certificates.rb +0 -118
@@ -1,23 +1,22 @@
1
- # -*- coding: utf-8 -*-
2
1
  # frozen_string_literal: true
2
+
3
+ #
3
4
  #--
4
5
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
5
6
  # All rights reserved.
6
7
  # See LICENSE.txt for permissions.
7
8
  #++
8
9
 
10
+ require_relative "deprecate"
11
+ require_relative "basic_specification"
12
+ require_relative "stub_specification"
13
+ require_relative "platform"
14
+ require_relative "util/list"
9
15
 
10
- require 'rubygems/version'
11
- require 'rubygems/requirement'
12
- require 'rubygems/platform'
13
- require 'rubygems/deprecate'
14
- require 'rubygems/basic_specification'
15
- require 'rubygems/stub_specification'
16
- require 'rubygems/util/list'
17
- require 'stringio'
16
+ require "rbconfig"
18
17
 
19
18
  ##
20
- # The Specification class contains the information for a Gem. Typically
19
+ # The Specification class contains the information for a gem. Typically
21
20
  # defined in a .gemspec file or a Rakefile, and looks like this:
22
21
  #
23
22
  # Gem::Specification.new do |s|
@@ -30,6 +29,7 @@ require 'stringio'
30
29
  # s.email = 'rubycoder@example.com'
31
30
  # s.files = ["lib/example.rb"]
32
31
  # s.homepage = 'https://rubygems.org/gems/example'
32
+ # s.metadata = { "source_code_uri" => "https://github.com/example/example" }
33
33
  # end
34
34
  #
35
35
  # Starting in RubyGems 2.0, a Specification can hold arbitrary
@@ -37,6 +37,7 @@ require 'stringio'
37
37
  # items you may add to a specification.
38
38
 
39
39
  class Gem::Specification < Gem::BasicSpecification
40
+ extend Gem::Deprecate
40
41
 
41
42
  # REFACTOR: Consider breaking out this version stuff into a separate
42
43
  # module. There's enough special stuff around it that it may justify
@@ -76,37 +77,38 @@ class Gem::Specification < Gem::BasicSpecification
76
77
  # key should be equal to the CURRENT_SPECIFICATION_VERSION.
77
78
 
78
79
  SPECIFICATION_VERSION_HISTORY = { # :nodoc:
79
- -1 => ['(RubyGems versions up to and including 0.7 did not have versioned specifications)'],
80
- 1 => [
80
+ -1 => ["(RubyGems versions up to and including 0.7 did not have versioned specifications)"],
81
+ 1 => [
81
82
  'Deprecated "test_suite_file" in favor of the new, but equivalent, "test_files"',
82
- '"test_file=x" is a shortcut for "test_files=[x]"'
83
+ '"test_file=x" is a shortcut for "test_files=[x]"',
83
84
  ],
84
- 2 => [
85
+ 2 => [
85
86
  'Added "required_rubygems_version"',
86
- 'Now forward-compatible with future versions',
87
+ "Now forward-compatible with future versions",
87
88
  ],
88
89
  3 => [
89
- 'Added Fixnum validation to the specification_version'
90
+ "Added Fixnum validation to the specification_version",
90
91
  ],
91
92
  4 => [
92
- 'Added sandboxed freeform metadata to the specification version.'
93
- ]
94
- }
93
+ "Added sandboxed freeform metadata to the specification version.",
94
+ ],
95
+ }.freeze
95
96
 
96
97
  MARSHAL_FIELDS = { # :nodoc:
97
98
  -1 => 16,
98
- 1 => 16,
99
- 2 => 16,
100
- 3 => 17,
101
- 4 => 18,
102
- }
99
+ 1 => 16,
100
+ 2 => 16,
101
+ 3 => 17,
102
+ 4 => 18,
103
+ }.freeze
103
104
 
104
105
  today = Time.now.utc
105
106
  TODAY = Time.utc(today.year, today.month, today.day) # :nodoc:
106
107
 
107
- LOAD_CACHE = {} # :nodoc:
108
+ @load_cache = {} # :nodoc:
109
+ @load_cache_mutex = Thread::Mutex.new
108
110
 
109
- private_constant :LOAD_CACHE if defined? private_constant
111
+ VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc:
110
112
 
111
113
  # :startdoc:
112
114
 
@@ -125,61 +127,77 @@ class Gem::Specification < Gem::BasicSpecification
125
127
  # Map of attribute names to default values.
126
128
 
127
129
  @@default_value = {
128
- :authors => [],
129
- :autorequire => nil,
130
- :bindir => 'bin',
131
- :cert_chain => [],
132
- :date => TODAY,
133
- :dependencies => [],
134
- :description => nil,
135
- :email => nil,
136
- :executables => [],
137
- :extensions => [],
138
- :extra_rdoc_files => [],
139
- :files => [],
140
- :homepage => nil,
141
- :licenses => [],
142
- :metadata => {},
143
- :name => nil,
144
- :platform => Gem::Platform::RUBY,
145
- :post_install_message => nil,
146
- :rdoc_options => [],
147
- :require_paths => ['lib'],
148
- :required_ruby_version => Gem::Requirement.default,
149
- :required_rubygems_version => Gem::Requirement.default,
150
- :requirements => [],
151
- :rubyforge_project => nil,
152
- :rubygems_version => Gem::VERSION,
153
- :signing_key => nil,
154
- :specification_version => CURRENT_SPECIFICATION_VERSION,
155
- :summary => nil,
156
- :test_files => [],
157
- :version => nil,
158
- }
159
-
160
- Dupable = { } # :nodoc:
130
+ authors: [],
131
+ autorequire: nil,
132
+ bindir: "bin",
133
+ cert_chain: [],
134
+ date: nil,
135
+ dependencies: [],
136
+ description: nil,
137
+ email: nil,
138
+ executables: [],
139
+ extensions: [],
140
+ extra_rdoc_files: [],
141
+ files: [],
142
+ homepage: nil,
143
+ licenses: [],
144
+ metadata: {},
145
+ name: nil,
146
+ platform: Gem::Platform::RUBY,
147
+ post_install_message: nil,
148
+ rdoc_options: [],
149
+ require_paths: ["lib"],
150
+ required_ruby_version: Gem::Requirement.default,
151
+ required_rubygems_version: Gem::Requirement.default,
152
+ requirements: [],
153
+ rubygems_version: Gem::VERSION,
154
+ signing_key: nil,
155
+ specification_version: CURRENT_SPECIFICATION_VERSION,
156
+ summary: nil,
157
+ test_files: [],
158
+ version: nil,
159
+ }.freeze
160
+
161
+ # rubocop:disable Style/MutableConstant
162
+ INITIALIZE_CODE_FOR_DEFAULTS = {} # :nodoc:
163
+ # rubocop:enable Style/MutableConstant
161
164
 
162
165
  @@default_value.each do |k,v|
163
- case v
164
- when Time, Numeric, Symbol, true, false, nil
165
- Dupable[k] = false
166
- else
167
- Dupable[k] = true
166
+ INITIALIZE_CODE_FOR_DEFAULTS[k] = case v
167
+ when [], {}, true, false, nil, Numeric, Symbol
168
+ v.inspect
169
+ when String
170
+ v.dump
171
+ else
172
+ "default_value(:#{k}).dup"
168
173
  end
169
174
  end
170
175
 
171
- @@attributes = @@default_value.keys.sort_by { |s| s.to_s }
172
- @@array_attributes = @@default_value.reject { |k,v| v != [] }.keys
173
- @@nil_attributes, @@non_nil_attributes = @@default_value.keys.partition { |k|
176
+ @@attributes = @@default_value.keys.sort_by(&:to_s)
177
+ @@array_attributes = @@default_value.reject {|_k,v| v != [] }.keys
178
+ @@nil_attributes, @@non_nil_attributes = @@default_value.keys.partition do |k|
174
179
  @@default_value[k].nil?
175
- }
180
+ end
181
+
182
+ def self.clear_specs # :nodoc:
183
+ @@all = nil
184
+ @@stubs = nil
185
+ @@stubs_by_name = {}
186
+ @@spec_with_requirable_file = {}
187
+ @@active_stub_with_requirable_file = {}
188
+ end
189
+ private_class_method :clear_specs
176
190
 
177
- @@stubs_by_name = {}
191
+ clear_specs
178
192
 
179
193
  # Sentinel object to represent "not found" stubs
180
194
  NOT_FOUND = Struct.new(:to_spec, :this).new # :nodoc:
181
- @@spec_with_requirable_file = {}
182
- @@active_stub_with_requirable_file = {}
195
+
196
+ # Tracking removed method calls to warn users during build time.
197
+ REMOVED_METHODS = [:rubyforge_project=].freeze # :nodoc:
198
+ def removed_method_calls
199
+ @removed_method_calls ||= []
200
+ end
183
201
 
184
202
  ######################################################################
185
203
  # :section: Required gemspec attributes
@@ -207,35 +225,7 @@ class Gem::Specification < Gem::BasicSpecification
207
225
  attr_reader :version
208
226
 
209
227
  ##
210
- # Paths in the gem to add to <code>$LOAD_PATH</code> when this gem is
211
- # activated.
212
- #
213
- # See also #require_paths
214
- #
215
- # If you have an extension you do not need to add <code>"ext"</code> to the
216
- # require path, the extension build process will copy the extension files
217
- # into "lib" for you.
218
- #
219
- # The default value is <code>"lib"</code>
220
- #
221
- # Usage:
222
- #
223
- # # If all library files are in the root directory...
224
- # spec.require_paths = ['.']
225
-
226
- def require_paths=(val)
227
- @require_paths = Array(val)
228
- end
229
-
230
- ##
231
- # The version of RubyGems used to create this gem.
232
- #
233
- # Do not set this, it is set automatically when the gem is packaged.
234
-
235
- attr_accessor :rubygems_version
236
-
237
- ##
238
- # A short summary of this gem's description. Displayed in `gem list -d`.
228
+ # A short summary of this gem's description. Displayed in <tt>gem list -d</tt>.
239
229
  #
240
230
  # The #description should be more detailed than the summary.
241
231
  #
@@ -245,85 +235,6 @@ class Gem::Specification < Gem::BasicSpecification
245
235
 
246
236
  attr_reader :summary
247
237
 
248
- ##
249
- # Singular writer for #authors
250
- #
251
- # Usage:
252
- #
253
- # spec.author = 'John Jones'
254
-
255
- def author= o
256
- self.authors = [o]
257
- end
258
-
259
- ##
260
- # Sets the list of authors, ensuring it is an array.
261
- #
262
- # Usage:
263
- #
264
- # spec.authors = ['John Jones', 'Mary Smith']
265
-
266
- def authors= value
267
- @authors = Array(value).flatten.grep(String)
268
- end
269
-
270
- ##
271
- # The platform this gem runs on.
272
- #
273
- # This is usually Gem::Platform::RUBY or Gem::Platform::CURRENT.
274
- #
275
- # Most gems contain pure Ruby code; they should simply leave the default
276
- # value in place. Some gems contain C (or other) code to be compiled into a
277
- # Ruby "extension". The gem should leave the default value in place unless
278
- # the code will only compile on a certain type of system. Some gems consist
279
- # of pre-compiled code ("binary gems"). It's especially important that they
280
- # set the platform attribute appropriately. A shortcut is to set the
281
- # platform to Gem::Platform::CURRENT, which will cause the gem builder to set
282
- # the platform to the appropriate value for the system on which the build is
283
- # being performed.
284
- #
285
- # If this attribute is set to a non-default value, it will be included in
286
- # the filename of the gem when it is built such as:
287
- # nokogiri-1.6.0-x86-mingw32.gem
288
- #
289
- # Usage:
290
- #
291
- # spec.platform = Gem::Platform.local
292
-
293
- def platform= platform
294
- if @original_platform.nil? or
295
- @original_platform == Gem::Platform::RUBY then
296
- @original_platform = platform
297
- end
298
-
299
- case platform
300
- when Gem::Platform::CURRENT then
301
- @new_platform = Gem::Platform.local
302
- @original_platform = @new_platform.to_s
303
-
304
- when Gem::Platform then
305
- @new_platform = platform
306
-
307
- # legacy constants
308
- when nil, Gem::Platform::RUBY then
309
- @new_platform = Gem::Platform::RUBY
310
- when 'mswin32' then # was Gem::Platform::WIN32
311
- @new_platform = Gem::Platform.new 'x86-mswin32'
312
- when 'i586-linux' then # was Gem::Platform::LINUX_586
313
- @new_platform = Gem::Platform.new 'x86-linux'
314
- when 'powerpc-darwin' then # was Gem::Platform::DARWIN
315
- @new_platform = Gem::Platform.new 'ppc-darwin'
316
- else
317
- @new_platform = Gem::Platform.new platform
318
- end
319
-
320
- @platform = @new_platform.to_s
321
-
322
- invalidate_memoized_attributes
323
-
324
- @new_platform
325
- end
326
-
327
238
  ##
328
239
  # Files included in this gem. You cannot append to this accessor, you must
329
240
  # assign to it.
@@ -338,12 +249,11 @@ class Gem::Specification < Gem::BasicSpecification
338
249
  # require 'rake'
339
250
  # spec.files = FileList['lib/**/*.rb',
340
251
  # 'bin/*',
341
- # '[A-Z]*',
342
- # 'test/**/*'].to_a
252
+ # '[A-Z]*'].to_a
343
253
  #
344
254
  # # or without Rake...
345
255
  # spec.files = Dir['lib/**/*.rb'] + Dir['bin/*']
346
- # spec.files += Dir['[A-Z]*'] + Dir['test/**/*']
256
+ # spec.files += Dir['[A-Z]*']
347
257
  # spec.files.reject! { |fn| fn.include? "CVS" }
348
258
 
349
259
  def files
@@ -353,27 +263,34 @@ class Gem::Specification < Gem::BasicSpecification
353
263
  @test_files,
354
264
  add_bindir(@executables),
355
265
  @extra_rdoc_files,
356
- @extensions,
357
- ].flatten.compact.uniq.sort
266
+ @extensions].flatten.compact.uniq.sort
358
267
  end
359
268
 
360
- ######################################################################
361
- # :section: Optional gemspec attributes
362
-
363
269
  ##
364
- # The path in the gem for executable scripts. Usually 'bin'
270
+ # A list of authors for this gem.
271
+ #
272
+ # Alternatively, a single author can be specified by assigning a string to
273
+ # +spec.author+
365
274
  #
366
275
  # Usage:
367
276
  #
368
- # spec.bindir = 'bin'
277
+ # spec.authors = ['John Jones', 'Mary Smith']
369
278
 
370
- attr_accessor :bindir
279
+ def authors=(value)
280
+ @authors = Array(value).flatten.grep(String)
281
+ end
282
+
283
+ ######################################################################
284
+ # :section: Recommended gemspec attributes
371
285
 
372
286
  ##
373
- # The certificate chain used to sign this gem. See Gem::Security for
374
- # details.
287
+ # The version of Ruby required by this gem
288
+ #
289
+ # Usage:
290
+ #
291
+ # spec.required_ruby_version = '>= 2.7.0'
375
292
 
376
- attr_accessor :cert_chain
293
+ attr_reader :required_ruby_version
377
294
 
378
295
  ##
379
296
  # A long description of this gem
@@ -392,8 +309,6 @@ class Gem::Specification < Gem::BasicSpecification
392
309
  attr_reader :description
393
310
 
394
311
  ##
395
- # :category: Recommended gemspec attributes
396
- #
397
312
  # A contact email address (or addresses) for this gem
398
313
  #
399
314
  # Usage:
@@ -404,8 +319,6 @@ class Gem::Specification < Gem::BasicSpecification
404
319
  attr_accessor :email
405
320
 
406
321
  ##
407
- # :category: Recommended gemspec attributes
408
- #
409
322
  # The URL of this gem's home page
410
323
  #
411
324
  # Usage:
@@ -415,35 +328,59 @@ class Gem::Specification < Gem::BasicSpecification
415
328
  attr_accessor :homepage
416
329
 
417
330
  ##
418
- # A message that gets displayed after the gem is installed.
331
+ # The license for this gem.
419
332
  #
420
- # Usage:
333
+ # The license must be no more than 64 characters.
421
334
  #
422
- # spec.post_install_message = "Thanks for installing!"
423
-
424
- attr_accessor :post_install_message
425
-
426
- ##
427
- # The version of Ruby required by this gem
428
-
429
- attr_reader :required_ruby_version
430
-
431
- ##
432
- # The RubyGems version required by this gem
335
+ # This should just be the name of your license. The full text of the license
336
+ # should be inside of the gem (at the top level) when you build it.
337
+ #
338
+ # The simplest way is to specify the standard SPDX ID
339
+ # https://spdx.org/licenses/ for the license.
340
+ # Ideally, you should pick one that is OSI (Open Source Initiative)
341
+ # https://opensource.org/licenses/ approved.
342
+ #
343
+ # The most commonly used OSI-approved licenses are MIT and Apache-2.0.
344
+ # GitHub also provides a license picker at http://choosealicense.com/.
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
+ #
350
+ # You should specify a license for your gem so that people know how they are
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
353
+ # to use the code for any purpose.
354
+ #
355
+ # You can set multiple licenses with #licenses=
356
+ #
357
+ # Usage:
358
+ # spec.license = 'MIT'
433
359
 
434
- attr_reader :required_rubygems_version
360
+ def license=(o)
361
+ self.licenses = [o]
362
+ end
435
363
 
436
364
  ##
437
- # The key used to sign this gem. See Gem::Security for details.
365
+ # The license(s) for the library.
366
+ #
367
+ # Each license must be a short name, no more than 64 characters.
368
+ #
369
+ # This should just be the name of your license. The full
370
+ # text of the license should be inside of the gem when you build it.
371
+ #
372
+ # See #license= for more discussion
373
+ #
374
+ # Usage:
375
+ # spec.licenses = ['MIT', 'GPL-2.0']
438
376
 
439
- attr_accessor :signing_key
377
+ def licenses=(licenses)
378
+ @licenses = Array licenses
379
+ end
440
380
 
441
381
  ##
442
- # :attr_accessor: metadata
443
- #
444
382
  # The metadata holds extra data for this gem that may be useful to other
445
- # consumers and is settable by gem authors without requiring an update to
446
- # the rubygems software.
383
+ # consumers and is settable by gem authors.
447
384
  #
448
385
  # Metadata items have the following restrictions:
449
386
  #
@@ -453,12 +390,151 @@ class Gem::Specification < Gem::BasicSpecification
453
390
  # bytes
454
391
  # * All strings must be UTF-8, no binary data is allowed
455
392
  #
456
- # To add metadata for the location of a issue tracker:
393
+ # You can use metadata to specify links to your gem's homepage, codebase,
394
+ # documentation, wiki, mailing list, issue tracker and changelog.
457
395
  #
458
- # s.metadata = { "issue_tracker" => "https://example/issues" }
396
+ # s.metadata = {
397
+ # "bug_tracker_uri" => "https://example.com/user/bestgemever/issues",
398
+ # "changelog_uri" => "https://example.com/user/bestgemever/CHANGELOG.md",
399
+ # "documentation_uri" => "https://www.example.info/gems/bestgemever/0.0.1",
400
+ # "homepage_uri" => "https://bestgemever.example.io",
401
+ # "mailing_list_uri" => "https://groups.example.com/bestgemever",
402
+ # "source_code_uri" => "https://example.com/user/bestgemever",
403
+ # "wiki_uri" => "https://example.com/user/bestgemever/wiki"
404
+ # "funding_uri" => "https://example.com/donate"
405
+ # }
406
+ #
407
+ # These links will be used on your gem's page on rubygems.org and must pass
408
+ # validation against following regex.
409
+ #
410
+ # %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z}
459
411
 
460
412
  attr_accessor :metadata
461
413
 
414
+ ######################################################################
415
+ # :section: Optional gemspec attributes
416
+
417
+ ##
418
+ # Singular (alternative) writer for #authors
419
+ #
420
+ # Usage:
421
+ #
422
+ # spec.author = 'John Jones'
423
+
424
+ def author=(o)
425
+ self.authors = [o]
426
+ end
427
+
428
+ ##
429
+ # The path in the gem for executable scripts. Usually 'exe'
430
+ #
431
+ # Usage:
432
+ #
433
+ # spec.bindir = 'exe'
434
+
435
+ attr_accessor :bindir
436
+
437
+ ##
438
+ # The certificate chain used to sign this gem. See Gem::Security for
439
+ # details.
440
+
441
+ attr_accessor :cert_chain
442
+
443
+ ##
444
+ # A message that gets displayed after the gem is installed.
445
+ #
446
+ # Usage:
447
+ #
448
+ # spec.post_install_message = "Thanks for installing!"
449
+
450
+ attr_accessor :post_install_message
451
+
452
+ ##
453
+ # The platform this gem runs on.
454
+ #
455
+ # This is usually Gem::Platform::RUBY or Gem::Platform::CURRENT.
456
+ #
457
+ # Most gems contain pure Ruby code; they should simply leave the default
458
+ # value in place. Some gems contain C (or other) code to be compiled into a
459
+ # Ruby "extension". The gem should leave the default value in place unless
460
+ # the code will only compile on a certain type of system. Some gems consist
461
+ # of pre-compiled code ("binary gems"). It's especially important that they
462
+ # set the platform attribute appropriately. A shortcut is to set the
463
+ # platform to Gem::Platform::CURRENT, which will cause the gem builder to set
464
+ # the platform to the appropriate value for the system on which the build is
465
+ # being performed.
466
+ #
467
+ # If this attribute is set to a non-default value, it will be included in
468
+ # the filename of the gem when it is built such as:
469
+ # nokogiri-1.6.0-x86-mingw32.gem
470
+ #
471
+ # Usage:
472
+ #
473
+ # spec.platform = Gem::Platform.local
474
+
475
+ def platform=(platform)
476
+ if @original_platform.nil? ||
477
+ @original_platform == Gem::Platform::RUBY
478
+ @original_platform = platform
479
+ end
480
+
481
+ case platform
482
+ when Gem::Platform::CURRENT then
483
+ @new_platform = Gem::Platform.local
484
+ @original_platform = @new_platform.to_s
485
+
486
+ when Gem::Platform then
487
+ @new_platform = platform
488
+
489
+ # legacy constants
490
+ when nil, Gem::Platform::RUBY then
491
+ @new_platform = Gem::Platform::RUBY
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"
498
+ else
499
+ @new_platform = Gem::Platform.new platform
500
+ end
501
+
502
+ @platform = @new_platform.to_s
503
+
504
+ invalidate_memoized_attributes
505
+ end
506
+
507
+ ##
508
+ # Paths in the gem to add to <code>$LOAD_PATH</code> when this gem is
509
+ # activated.
510
+ #--
511
+ # See also #require_paths
512
+ #++
513
+ # If you have an extension you do not need to add <code>"ext"</code> to the
514
+ # require path, the extension build process will copy the extension files
515
+ # into "lib" for you.
516
+ #
517
+ # The default value is <code>"lib"</code>
518
+ #
519
+ # Usage:
520
+ #
521
+ # # If all library files are in the root directory...
522
+ # spec.require_paths = ['.']
523
+
524
+ def require_paths=(val)
525
+ @require_paths = Array(val)
526
+ end
527
+
528
+ ##
529
+ # The RubyGems version required by this gem
530
+
531
+ attr_reader :required_rubygems_version
532
+
533
+ ##
534
+ # The key used to sign this gem. See Gem::Security for details.
535
+
536
+ attr_accessor :signing_key
537
+
462
538
  ##
463
539
  # Adds a development dependency named +gem+ with +requirements+ to this
464
540
  # gem.
@@ -471,7 +547,7 @@ class Gem::Specification < Gem::BasicSpecification
471
547
  # activated when a gem is required.
472
548
 
473
549
  def add_development_dependency(gem, *requirements)
474
- add_dependency_with_type(gem, :development, *requirements)
550
+ add_dependency_with_type(gem, :development, requirements)
475
551
  end
476
552
 
477
553
  ##
@@ -482,13 +558,17 @@ class Gem::Specification < Gem::BasicSpecification
482
558
  # spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'
483
559
 
484
560
  def add_runtime_dependency(gem, *requirements)
485
- add_dependency_with_type(gem, :runtime, *requirements)
561
+ if requirements.uniq.size != requirements.size
562
+ warn "WARNING: duplicated #{gem} dependency #{requirements}"
563
+ end
564
+
565
+ add_dependency_with_type(gem, :runtime, requirements)
486
566
  end
487
567
 
488
568
  ##
489
569
  # Executables included in the gem.
490
570
  #
491
- # For example, the rake gem has rake as an executable. You dont specify the
571
+ # For example, the rake gem has rake as an executable. You don't specify the
492
572
  # full path (as in bin/rake); all application-style files are expected to be
493
573
  # found in bindir. These files must be executable Ruby files. Files that
494
574
  # use bash or other interpreters will not work.
@@ -509,7 +589,7 @@ class Gem::Specification < Gem::BasicSpecification
509
589
  # extconf.rb-style files used to compile extensions.
510
590
  #
511
591
  # These files will be run when the gem is installed, causing the C (or
512
- # whatever) code to be compiled on the users machine.
592
+ # whatever) code to be compiled on the user's machine.
513
593
  #
514
594
  # Usage:
515
595
  #
@@ -550,60 +630,10 @@ class Gem::Specification < Gem::BasicSpecification
550
630
  # Sets the version of RubyGems that installed this gem. See also
551
631
  # #installed_by_version.
552
632
 
553
- def installed_by_version= version # :nodoc:
633
+ def installed_by_version=(version) # :nodoc:
554
634
  @installed_by_version = Gem::Version.new version
555
635
  end
556
636
 
557
- ##
558
- # :category: Recommended gemspec attributes
559
- #
560
- # The license for this gem.
561
- #
562
- # The license must be no more than 64 characters.
563
- #
564
- # This should just be the name of your license. The full text of the license
565
- # should be inside of the gem (at the top level) when you build it.
566
- #
567
- # The simplest way, is to specify the standard SPDX ID
568
- # https://spdx.org/licenses/ for the license.
569
- # Ideally you should pick one that is OSI (Open Source Initiative)
570
- # http://opensource.org/licenses/alphabetical approved.
571
- #
572
- # The most commonly used OSI approved licenses are MIT and Apache-2.0.
573
- # GitHub also provides a license picker at http://choosealicense.com/.
574
- #
575
- # You should specify a license for your gem so that people know how they are
576
- # permitted to use it, and any restrictions you're placing on it. Not
577
- # specifying a license means all rights are reserved; others have no rights
578
- # to use the code for any purpose.
579
- #
580
- # You can set multiple licenses with #licenses=
581
- #
582
- # Usage:
583
- # spec.license = 'MIT'
584
-
585
- def license=o
586
- self.licenses = [o]
587
- end
588
-
589
- ##
590
- # :category: Recommended gemspec attributes
591
- # The license(s) for the library.
592
- #
593
- # Each license must be a short name, no more than 64 characters.
594
- #
595
- # This should just be the name of your license. The full
596
- # text of the license should be inside of the gem when you build it.
597
- #
598
- # See #license= for more discussion
599
- #
600
- # Usage:
601
- # spec.licenses = ['MIT', 'GPL-2.0']
602
-
603
- def licenses= licenses
604
- @licenses = Array licenses
605
- end
606
-
607
637
  ##
608
638
  # Specifies the rdoc options to be used when generating API documentation.
609
639
  #
@@ -617,6 +647,8 @@ class Gem::Specification < Gem::BasicSpecification
617
647
  @rdoc_options ||= []
618
648
  end
619
649
 
650
+ LATEST_RUBY_WITHOUT_PATCH_VERSIONS = Gem::Version.new("2.1")
651
+
620
652
  ##
621
653
  # The version of Ruby required by this gem. The ruby version can be
622
654
  # specified to the patch-level:
@@ -625,29 +657,38 @@ class Gem::Specification < Gem::BasicSpecification
625
657
  # ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
626
658
  # #<Gem::Version "2.0.0.247">
627
659
  #
628
- # Because patch-level is taken into account, be very careful specifying using
629
- # `<=`: `<= 2.2.2` will not match any patch-level of 2.2.2 after the `p0`
630
- # release. It is much safer to specify `< 2.2.3` instead
660
+ # Prereleases can also be specified.
631
661
  #
632
662
  # Usage:
633
663
  #
634
664
  # # This gem will work with 1.8.6 or greater...
635
665
  # spec.required_ruby_version = '>= 1.8.6'
636
666
  #
637
- # # Only with ruby 2.0.x
638
- # spec.required_ruby_version = '~> 2.0'
667
+ # # Only with final releases of major version 2 where minor version is at least 3
668
+ # spec.required_ruby_version = '~> 2.3'
669
+ #
670
+ # # Only prereleases or final releases after 2.6.0.preview2
671
+ # spec.required_ruby_version = '> 2.6.0.preview2'
639
672
  #
640
- # # Only with ruby between 2.2.0 and 2.2.2
641
- # spec.required_ruby_version = ['>= 2.2.0', '< 2.2.3']
673
+ # # This gem will work with 2.3.0 or greater, including major version 3, but lesser than 4.0.0
674
+ # spec.required_ruby_version = '>= 2.3', '< 4'
642
675
 
643
- def required_ruby_version= req
676
+ def required_ruby_version=(req)
644
677
  @required_ruby_version = Gem::Requirement.create req
678
+
679
+ @required_ruby_version.requirements.map! do |op, v|
680
+ if v >= LATEST_RUBY_WITHOUT_PATCH_VERSIONS && v.release.segments.size == 4
681
+ [op == "~>" ? "=" : op, Gem::Version.new(v.segments.tap {|s| s.delete_at(3) }.join("."))]
682
+ else
683
+ [op, v]
684
+ end
685
+ end
645
686
  end
646
687
 
647
688
  ##
648
689
  # The RubyGems version required by this gem
649
690
 
650
- def required_rubygems_version= req
691
+ def required_rubygems_version=(req)
651
692
  @required_rubygems_version = Gem::Requirement.create req
652
693
  end
653
694
 
@@ -672,10 +713,25 @@ class Gem::Specification < Gem::BasicSpecification
672
713
  # spec.test_files = Dir.glob('test/tc_*.rb')
673
714
  # spec.test_files = ['tests/test-suite.rb']
674
715
 
675
- def test_files= files # :nodoc:
716
+ def test_files=(files) # :nodoc:
676
717
  @test_files = Array files
677
718
  end
678
719
 
720
+ ######################################################################
721
+ # :section: Read-only attributes
722
+
723
+ ##
724
+ # The version of RubyGems used to create this gem.
725
+
726
+ attr_accessor :rubygems_version
727
+
728
+ ##
729
+ # The path where this gem installs its extensions.
730
+
731
+ def extensions_dir
732
+ @extensions_dir ||= super
733
+ end
734
+
679
735
  ######################################################################
680
736
  # :section: Specification internals
681
737
 
@@ -684,7 +740,7 @@ class Gem::Specification < Gem::BasicSpecification
684
740
 
685
741
  attr_accessor :activated
686
742
 
687
- alias :activated? :activated
743
+ alias_method :activated?, :activated
688
744
 
689
745
  ##
690
746
  # Autorequire was used by old RubyGems to automatically require a file.
@@ -699,20 +755,13 @@ class Gem::Specification < Gem::BasicSpecification
699
755
  # Deprecated: You must now specify the executable name to Gem.bin_path.
700
756
 
701
757
  attr_writer :default_executable
758
+ rubygems_deprecate :default_executable=
702
759
 
703
760
  ##
704
761
  # Allows deinstallation of gems with legacy platforms.
705
762
 
706
763
  attr_writer :original_platform # :nodoc:
707
764
 
708
- ##
709
- # The rubyforge project this gem lives under. i.e. RubyGems'
710
- # rubyforge_project is "rubygems".
711
- #
712
- # This option is deprecated.
713
-
714
- attr_accessor :rubyforge_project
715
-
716
765
  ##
717
766
  # The Gem::Specification version of this gemspec.
718
767
  #
@@ -721,100 +770,45 @@ class Gem::Specification < Gem::BasicSpecification
721
770
  attr_accessor :specification_version
722
771
 
723
772
  def self._all # :nodoc:
724
- unless defined?(@@all) && @@all then
725
- @@all = stubs.map(&:to_spec)
726
-
727
- # After a reset, make sure already loaded specs
728
- # are still marked as activated.
729
- specs = {}
730
- Gem.loaded_specs.each_value{|s| specs[s] = true}
731
- @@all.each{|s| s.activated = true if specs[s]}
732
- end
733
- @@all
773
+ @@all ||= Gem.loaded_specs.values | stubs.map(&:to_spec)
734
774
  end
735
775
 
736
- def self._clear_load_cache # :nodoc:
737
- LOAD_CACHE.clear
776
+ def self.clear_load_cache # :nodoc:
777
+ @load_cache_mutex.synchronize do
778
+ @load_cache.clear
779
+ end
738
780
  end
781
+ private_class_method :clear_load_cache
739
782
 
740
783
  def self.each_gemspec(dirs) # :nodoc:
741
784
  dirs.each do |dir|
742
- Dir[File.join(dir, "*.gemspec")].each do |path|
743
- yield path.untaint
785
+ Gem::Util.glob_files_in_dir("*.gemspec", dir).each do |path|
786
+ yield path
744
787
  end
745
788
  end
746
789
  end
747
790
 
748
- def self.gemspec_stubs_in dir, pattern
749
- Dir[File.join(dir, pattern)].map { |path| yield path }.select(&:valid?)
791
+ def self.gemspec_stubs_in(dir, pattern)
792
+ Gem::Util.glob_files_in_dir(pattern, dir).map {|path| yield path }.select(&:valid?)
750
793
  end
751
794
  private_class_method :gemspec_stubs_in
752
795
 
753
- def self.default_stubs pattern
754
- base_dir = Gem.default_dir
755
- gems_dir = File.join base_dir, "gems"
756
- gemspec_stubs_in(default_specifications_dir, pattern) do |path|
757
- Gem::StubSpecification.default_gemspec_stub(path, base_dir, gems_dir)
758
- end
759
- end
760
- private_class_method :default_stubs
761
-
762
- def self.installed_stubs dirs, pattern
796
+ def self.installed_stubs(dirs, pattern)
763
797
  map_stubs(dirs, pattern) do |path, base_dir, gems_dir|
764
798
  Gem::StubSpecification.gemspec_stub(path, base_dir, gems_dir)
765
799
  end
766
800
  end
767
801
  private_class_method :installed_stubs
768
802
 
769
- if [].respond_to? :flat_map
770
- def self.map_stubs(dirs, pattern) # :nodoc:
771
- dirs.flat_map { |dir|
772
- base_dir = File.dirname dir
773
- gems_dir = File.join base_dir, "gems"
774
- gemspec_stubs_in(dir, pattern) { |path| yield path, base_dir, gems_dir }
775
- }
776
- end
777
- else # FIXME: remove when 1.8 is dropped
778
- def self.map_stubs(dirs, pattern) # :nodoc:
779
- dirs.map { |dir|
780
- base_dir = File.dirname dir
781
- gems_dir = File.join base_dir, "gems"
782
- gemspec_stubs_in(dir, pattern) { |path| yield path, base_dir, gems_dir }
783
- }.flatten 1
803
+ def self.map_stubs(dirs, pattern) # :nodoc:
804
+ dirs.flat_map do |dir|
805
+ base_dir = File.dirname dir
806
+ gems_dir = File.join base_dir, "gems"
807
+ gemspec_stubs_in(dir, pattern) {|path| yield path, base_dir, gems_dir }
784
808
  end
785
809
  end
786
810
  private_class_method :map_stubs
787
811
 
788
- uniq_takes_a_block = false
789
- [1,2].uniq { uniq_takes_a_block = true }
790
-
791
- if uniq_takes_a_block
792
- def self.uniq_by(list, &block) # :nodoc:
793
- list.uniq(&block)
794
- end
795
- else # FIXME: remove when 1.8 is dropped
796
- def self.uniq_by(list) # :nodoc:
797
- values = {}
798
- list.each { |item|
799
- value = yield item
800
- values[value] ||= item
801
- }
802
- values.values
803
- end
804
- end
805
- private_class_method :uniq_by
806
-
807
- if [].respond_to? :sort_by!
808
- def self.sort_by! list, &block
809
- list.sort_by!(&block)
810
- end
811
- else # FIXME: remove when 1.8 is dropped
812
- def self.sort_by! list, &block
813
- list.replace list.sort_by(&block)
814
- end
815
- end
816
- private_class_method :sort_by!
817
-
818
812
  def self.each_spec(dirs) # :nodoc:
819
813
  each_gemspec(dirs) do |path|
820
814
  spec = self.load path
@@ -828,47 +822,66 @@ class Gem::Specification < Gem::BasicSpecification
828
822
  def self.stubs
829
823
  @@stubs ||= begin
830
824
  pattern = "*.gemspec"
831
- stubs = default_stubs(pattern).concat installed_stubs(dirs, pattern)
832
- stubs = uniq_by(stubs) { |stub| stub.full_name }
825
+ stubs = stubs_for_pattern(pattern, false)
833
826
 
834
- _resort!(stubs)
835
- @@stubs_by_name = stubs.group_by(&:name)
827
+ @@stubs_by_name = stubs.select {|s| Gem::Platform.match_spec? s }.group_by(&:name)
836
828
  stubs
837
829
  end
838
830
  end
839
831
 
840
- EMPTY = [].freeze # :nodoc:
832
+ ##
833
+ # Returns a Gem::StubSpecification for default gems
834
+
835
+ def self.default_stubs(pattern = "*.gemspec")
836
+ base_dir = Gem.default_dir
837
+ gems_dir = File.join base_dir, "gems"
838
+ gemspec_stubs_in(Gem.default_specifications_dir, pattern) do |path|
839
+ Gem::StubSpecification.default_gemspec_stub(path, base_dir, gems_dir)
840
+ end
841
+ end
841
842
 
842
843
  ##
843
844
  # Returns a Gem::StubSpecification for installed gem named +name+
845
+ # only returns stubs that match Gem.platforms
844
846
 
845
- def self.stubs_for name
847
+ def self.stubs_for(name)
846
848
  if @@stubs
847
849
  @@stubs_by_name[name] || []
848
850
  else
849
- pattern = "#{name}-*.gemspec"
850
- stubs = default_stubs(pattern) + installed_stubs(dirs, pattern)
851
- stubs = uniq_by(stubs) { |stub| stub.full_name }.group_by(&:name)
852
- stubs.each_value { |v| sort_by!(v) { |i| i.version } }
851
+ @@stubs_by_name[name] ||= stubs_for_pattern("#{name}-*.gemspec").select do |s|
852
+ s.name == name
853
+ end
854
+ end
855
+ end
853
856
 
854
- @@stubs_by_name.merge! stubs
855
- @@stubs_by_name[name] ||= EMPTY
856
- end
857
+ ##
858
+ # Finds stub specifications matching a pattern from the standard locations,
859
+ # optionally filtering out specs not matching the current platform
860
+ #
861
+ def self.stubs_for_pattern(pattern, match_platform = true) # :nodoc:
862
+ installed_stubs = installed_stubs(Gem::Specification.dirs, pattern)
863
+ installed_stubs.select! {|s| Gem::Platform.match_spec? s } if match_platform
864
+ stubs = installed_stubs + default_stubs(pattern)
865
+ stubs = stubs.uniq(&:full_name)
866
+ _resort!(stubs)
867
+ stubs
857
868
  end
858
869
 
859
870
  def self._resort!(specs) # :nodoc:
860
- specs.sort! { |a, b|
871
+ specs.sort! do |a, b|
861
872
  names = a.name <=> b.name
862
873
  next names if names.nonzero?
863
- b.version <=> a.version
864
- }
874
+ versions = b.version <=> a.version
875
+ next versions if versions.nonzero?
876
+ Gem::Platform.sort_priority(b.platform)
877
+ end
865
878
  end
866
879
 
867
880
  ##
868
881
  # Loads the default specifications. It should be called only once.
869
882
 
870
883
  def self.load_defaults
871
- each_spec([default_specifications_dir]) do |spec|
884
+ each_spec([Gem.default_specifications_dir]) do |spec|
872
885
  # #load returns nil if the spec is bad, so we just ignore
873
886
  # it at this stage
874
887
  Gem.register_default_spec(spec)
@@ -879,45 +892,24 @@ class Gem::Specification < Gem::BasicSpecification
879
892
  # Adds +spec+ to the known specifications, keeping the collection
880
893
  # properly sorted.
881
894
 
882
- def self.add_spec spec
883
- warn "Gem::Specification.add_spec is deprecated and will be removed in Rubygems 3.0" unless Gem::Deprecate.skip
884
- # TODO: find all extraneous adds
885
- # puts
886
- # p :add_spec => [spec.full_name, caller.reject { |s| s =~ /minitest/ }]
887
-
888
- # TODO: flush the rest of the crap from the tests
889
- # raise "no dupes #{spec.full_name} in #{all_names.inspect}" if
890
- # _all.include? spec
891
-
892
- raise "nil spec!" unless spec # TODO: remove once we're happy with tests
893
-
895
+ def self.add_spec(spec)
894
896
  return if _all.include? spec
895
897
 
896
898
  _all << spec
897
899
  stubs << spec
898
900
  (@@stubs_by_name[spec.name] ||= []) << spec
899
- sort_by!(@@stubs_by_name[spec.name]) { |s| s.version }
900
- _resort!(_all)
901
+
902
+ _resort!(@@stubs_by_name[spec.name])
901
903
  _resort!(stubs)
902
904
  end
903
905
 
904
906
  ##
905
- # Adds multiple specs to the known specifications.
906
-
907
- def self.add_specs *specs
908
- warn "Gem::Specification.add_specs is deprecated and will be removed in Rubygems 3.0" unless Gem::Deprecate.skip
909
-
910
- raise "nil spec!" if specs.any?(&:nil?) # TODO: remove once we're happy
911
-
912
- # TODO: this is much more efficient, but we need the extra checks for now
913
- # _all.concat specs
914
- # _resort!
907
+ # Removes +spec+ from the known specs.
915
908
 
916
- Gem::Deprecate.skip_during do
917
- specs.each do |spec| # TODO: slow
918
- add_spec spec
919
- end
920
- end
909
+ def self.remove_spec(spec)
910
+ _all.delete spec.to_spec
911
+ stubs.delete spec
912
+ (@@stubs_by_name[spec.name] || []).delete spec
921
913
  end
922
914
 
923
915
  ##
@@ -942,7 +934,7 @@ class Gem::Specification < Gem::BasicSpecification
942
934
  #
943
935
  # -- wilsonb
944
936
 
945
- def self.all= specs
937
+ def self.all=(specs)
946
938
  @@stubs_by_name = specs.group_by(&:name)
947
939
  @@all = @@stubs = specs
948
940
  end
@@ -951,7 +943,7 @@ class Gem::Specification < Gem::BasicSpecification
951
943
  # Return full names of all specs in sorted order.
952
944
 
953
945
  def self.all_names
954
- self._all.map(&:full_name)
946
+ _all.map(&:full_name)
955
947
  end
956
948
 
957
949
  ##
@@ -976,19 +968,19 @@ class Gem::Specification < Gem::BasicSpecification
976
968
  # Return the directories that Specification uses to find specs.
977
969
 
978
970
  def self.dirs
979
- @@dirs ||= Gem.path.collect { |dir|
980
- File.join dir.dup.untaint, "specifications"
981
- }
971
+ @@dirs ||= Gem.path.collect do |dir|
972
+ File.join dir, "specifications"
973
+ end
982
974
  end
983
975
 
984
976
  ##
985
977
  # Set the directories that Specification uses to find specs. Setting
986
978
  # this resets the list of known specs.
987
979
 
988
- def self.dirs= dirs
989
- self.reset
980
+ def self.dirs=(dirs)
981
+ reset
990
982
 
991
- @@dirs = Array(dirs).map { |dir| File.join dir, "specifications" }
983
+ @@dirs = Array(dirs).map {|dir| File.join dir, "specifications" }
992
984
  end
993
985
 
994
986
  extend Enumerable
@@ -1000,7 +992,7 @@ class Gem::Specification < Gem::BasicSpecification
1000
992
  def self.each
1001
993
  return enum_for(:each) unless block_given?
1002
994
 
1003
- self._all.each do |x|
995
+ _all.each do |x|
1004
996
  yield x
1005
997
  end
1006
998
  end
@@ -1008,7 +1000,7 @@ class Gem::Specification < Gem::BasicSpecification
1008
1000
  ##
1009
1001
  # Returns every spec that matches +name+ and optional +requirements+.
1010
1002
 
1011
- def self.find_all_by_name name, *requirements
1003
+ def self.find_all_by_name(name, *requirements)
1012
1004
  requirements = Gem::Requirement.default if requirements.empty?
1013
1005
 
1014
1006
  # TODO: maybe try: find_all { |s| spec === dep }
@@ -1016,11 +1008,18 @@ class Gem::Specification < Gem::BasicSpecification
1016
1008
  Gem::Dependency.new(name, *requirements).matching_specs
1017
1009
  end
1018
1010
 
1011
+ ##
1012
+ # Returns every spec that has the given +full_name+
1013
+
1014
+ def self.find_all_by_full_name(full_name)
1015
+ stubs.select {|s| s.full_name == full_name }.map(&:to_spec)
1016
+ end
1017
+
1019
1018
  ##
1020
1019
  # Find the best specification matching a +name+ and +requirements+. Raises
1021
1020
  # if the dependency doesn't resolve to a valid specification.
1022
1021
 
1023
- def self.find_by_name name, *requirements
1022
+ def self.find_by_name(name, *requirements)
1024
1023
  requirements = Gem::Requirement.default if requirements.empty?
1025
1024
 
1026
1025
  # TODO: maybe try: find { |s| spec === dep }
@@ -1028,14 +1027,21 @@ class Gem::Specification < Gem::BasicSpecification
1028
1027
  Gem::Dependency.new(name, *requirements).to_spec
1029
1028
  end
1030
1029
 
1030
+ ##
1031
+ # Find the best specification matching a +full_name+.
1032
+ def self.find_by_full_name(full_name)
1033
+ stubs.find {|s| s.full_name == full_name }&.to_spec
1034
+ end
1035
+
1031
1036
  ##
1032
1037
  # Return the best specification that contains the file matching +path+.
1033
1038
 
1034
- def self.find_by_path path
1039
+ def self.find_by_path(path)
1035
1040
  path = path.dup.freeze
1036
- spec = @@spec_with_requirable_file[path] ||= (stubs.find { |s|
1041
+ spec = @@spec_with_requirable_file[path] ||= stubs.find do |s|
1037
1042
  s.contains_requirable_file? path
1038
- } || NOT_FOUND)
1043
+ end || NOT_FOUND
1044
+
1039
1045
  spec.to_spec
1040
1046
  end
1041
1047
 
@@ -1043,39 +1049,36 @@ class Gem::Specification < Gem::BasicSpecification
1043
1049
  # Return the best specification that contains the file matching +path+
1044
1050
  # amongst the specs that are not activated.
1045
1051
 
1046
- def self.find_inactive_by_path path
1047
- stub = stubs.find { |s|
1048
- s.contains_requirable_file? path unless s.activated?
1049
- }
1050
- stub && stub.to_spec
1052
+ def self.find_inactive_by_path(path)
1053
+ stub = stubs.find do |s|
1054
+ next if s.activated?
1055
+ s.contains_requirable_file? path
1056
+ end
1057
+ stub&.to_spec
1051
1058
  end
1052
1059
 
1053
- def self.find_active_stub_by_path path
1054
- stub = @@active_stub_with_requirable_file[path] ||= (stubs.find { |s|
1055
- s.activated? and s.contains_requirable_file? path
1056
- } || NOT_FOUND)
1060
+ def self.find_active_stub_by_path(path)
1061
+ stub = @@active_stub_with_requirable_file[path] ||= stubs.find do |s|
1062
+ s.activated? && s.contains_requirable_file?(path)
1063
+ end || NOT_FOUND
1064
+
1057
1065
  stub.this
1058
1066
  end
1059
1067
 
1060
1068
  ##
1061
1069
  # Return currently unresolved specs that contain the file matching +path+.
1062
1070
 
1063
- def self.find_in_unresolved path
1064
- # TODO: do we need these?? Kill it
1065
- specs = unresolved_deps.values.map { |dep| dep.to_specs }.flatten
1066
-
1067
- specs.find_all { |spec| spec.contains_requirable_file? path }
1071
+ def self.find_in_unresolved(path)
1072
+ unresolved_specs.find_all {|spec| spec.contains_requirable_file? path }
1068
1073
  end
1069
1074
 
1070
1075
  ##
1071
1076
  # Search through all unresolved deps and sub-dependencies and return
1072
1077
  # specs that contain the file matching +path+.
1073
1078
 
1074
- def self.find_in_unresolved_tree path
1075
- specs = unresolved_deps.values.map { |dep| dep.to_specs }.flatten
1076
-
1077
- specs.reverse_each do |spec|
1078
- spec.traverse do |from_spec, dep, to_spec, trail|
1079
+ def self.find_in_unresolved_tree(path)
1080
+ unresolved_specs.each do |spec|
1081
+ spec.traverse do |_from_spec, _dep, to_spec, trail|
1079
1082
  if to_spec.has_conflicts? || to_spec.conficts_when_loaded_with?(trail)
1080
1083
  :next
1081
1084
  else
@@ -1087,6 +1090,11 @@ class Gem::Specification < Gem::BasicSpecification
1087
1090
  []
1088
1091
  end
1089
1092
 
1093
+ def self.unresolved_specs
1094
+ unresolved_deps.values.map(&:to_specs).flatten
1095
+ end
1096
+ private_class_method :unresolved_specs
1097
+
1090
1098
  ##
1091
1099
  # Special loader for YAML files. When a Specification object is loaded
1092
1100
  # from a YAML file, it bypasses the normal Ruby object initialization
@@ -1099,18 +1107,19 @@ class Gem::Specification < Gem::BasicSpecification
1099
1107
  Gem.load_yaml
1100
1108
 
1101
1109
  input = normalize_yaml_input input
1102
- spec = YAML.load input
1110
+ spec = Gem::SafeYAML.safe_load input
1103
1111
 
1104
- if spec && spec.class == FalseClass then
1112
+ if spec && spec.class == FalseClass
1105
1113
  raise Gem::EndOfYAMLException
1106
1114
  end
1107
1115
 
1108
- unless Gem::Specification === spec then
1116
+ unless Gem::Specification === spec
1109
1117
  raise Gem::Exception, "YAML data doesn't evaluate to gem specification"
1110
1118
  end
1111
1119
 
1112
1120
  spec.specification_version ||= NONEXISTENT_SPECIFICATION_VERSION
1113
1121
  spec.reset_nil_attributes_to_default
1122
+ spec.flatten_require_paths
1114
1123
 
1115
1124
  spec
1116
1125
  end
@@ -1119,60 +1128,64 @@ class Gem::Specification < Gem::BasicSpecification
1119
1128
  # Return the latest specs, optionally including prerelease specs if
1120
1129
  # +prerelease+ is true.
1121
1130
 
1122
- def self.latest_specs prerelease = false
1123
- _latest_specs Gem::Specification._all, prerelease
1131
+ def self.latest_specs(prerelease = false)
1132
+ _latest_specs Gem::Specification.stubs, prerelease
1133
+ end
1134
+
1135
+ ##
1136
+ # Return the latest installed spec for gem +name+.
1137
+
1138
+ def self.latest_spec_for(name)
1139
+ latest_specs(true).find {|installed_spec| installed_spec.name == name }
1124
1140
  end
1125
1141
 
1126
- def self._latest_specs specs, prerelease = false # :nodoc:
1127
- result = Hash.new { |h,k| h[k] = {} }
1128
- native = {}
1142
+ def self._latest_specs(specs, prerelease = false) # :nodoc:
1143
+ result = {}
1129
1144
 
1130
1145
  specs.reverse_each do |spec|
1131
- next if spec.version.prerelease? unless prerelease
1146
+ unless prerelease
1147
+ next if spec.version.prerelease?
1148
+ end
1132
1149
 
1133
- native[spec.name] = spec.version if spec.platform == Gem::Platform::RUBY
1134
- result[spec.name][spec.platform] = spec
1150
+ result[spec.name] = spec
1135
1151
  end
1136
1152
 
1137
- result.map(&:last).map(&:values).flatten.reject { |spec|
1138
- minimum = native[spec.name]
1139
- minimum && spec.version < minimum
1140
- }.sort_by{ |tup| tup.name }
1153
+ result.map(&:last).flatten.sort_by(&:name)
1141
1154
  end
1142
1155
 
1143
1156
  ##
1144
1157
  # Loads Ruby format gemspec from +file+.
1145
1158
 
1146
- def self.load file
1159
+ def self.load(file)
1147
1160
  return unless file
1148
1161
 
1149
- _spec = LOAD_CACHE[file]
1150
- return _spec if _spec
1162
+ spec = @load_cache_mutex.synchronize { @load_cache[file] }
1163
+ return spec if spec
1151
1164
 
1152
- file = file.dup.untaint
1153
1165
  return unless File.file?(file)
1154
1166
 
1155
- code = if defined? Encoding
1156
- File.read file, :mode => 'r:UTF-8:-'
1157
- else
1158
- File.read file
1159
- end
1160
-
1161
- code.untaint
1167
+ code = Gem.open_file(file, "r:UTF-8:-", &:read)
1162
1168
 
1163
1169
  begin
1164
- _spec = eval code, binding, file
1165
-
1166
- if Gem::Specification === _spec
1167
- _spec.loaded_from = File.expand_path file.to_s
1168
- LOAD_CACHE[file] = _spec
1169
- return _spec
1170
+ spec = eval code, binding, file
1171
+
1172
+ if Gem::Specification === spec
1173
+ spec.loaded_from = File.expand_path file.to_s
1174
+ @load_cache_mutex.synchronize do
1175
+ prev = @load_cache[file]
1176
+ if prev
1177
+ spec = prev
1178
+ else
1179
+ @load_cache[file] = spec
1180
+ end
1181
+ end
1182
+ return spec
1170
1183
  end
1171
1184
 
1172
- warn "[#{file}] isn't a Gem::Specification (#{_spec.class} instead)."
1185
+ warn "[#{file}] isn't a Gem::Specification (#{spec.class} instead)."
1173
1186
  rescue SignalException, SystemExit
1174
1187
  raise
1175
- rescue SyntaxError, Exception => e
1188
+ rescue SyntaxError, StandardError => e
1176
1189
  warn "Invalid gemspec in [#{file}]: #{e}"
1177
1190
  end
1178
1191
 
@@ -1191,7 +1204,7 @@ class Gem::Specification < Gem::BasicSpecification
1191
1204
 
1192
1205
  def self.normalize_yaml_input(input)
1193
1206
  result = input.respond_to?(:read) ? input.read : input
1194
- result = "--- " + result unless result =~ /\A--- /
1207
+ result = "--- " + result unless result.start_with?("--- ")
1195
1208
  result = result.dup
1196
1209
  result.gsub!(/ !!null \n/, " \n")
1197
1210
  # date: 2011-04-26 00:00:00.000000000Z
@@ -1208,7 +1221,7 @@ class Gem::Specification < Gem::BasicSpecification
1208
1221
  # version as well.
1209
1222
 
1210
1223
  def self.outdated
1211
- outdated_and_latest_version.map { |local, _| local.name }
1224
+ outdated_and_latest_version.map {|local, _| local.name }
1212
1225
  end
1213
1226
 
1214
1227
  ##
@@ -1229,28 +1242,17 @@ class Gem::Specification < Gem::BasicSpecification
1229
1242
  Gem::Dependency.new local_spec.name, ">= #{local_spec.version}"
1230
1243
 
1231
1244
  remotes, = fetcher.search_for_dependency dependency
1232
- remotes = remotes.map { |n, _| n.version }
1245
+ remotes = remotes.map {|n, _| n.version }
1233
1246
 
1234
1247
  latest_remote = remotes.sort.last
1235
1248
 
1236
1249
  yield [local_spec, latest_remote] if
1237
- latest_remote and local_spec.version < latest_remote
1250
+ latest_remote && local_spec.version < latest_remote
1238
1251
  end
1239
1252
 
1240
1253
  nil
1241
1254
  end
1242
1255
 
1243
- ##
1244
- # Removes +spec+ from the known specs.
1245
-
1246
- def self.remove_spec spec
1247
- warn "Gem::Specification.remove_spec is deprecated and will be removed in Rubygems 3.0" unless Gem::Deprecate.skip
1248
- _all.delete spec
1249
- stubs.delete_if { |s| s.full_name == spec.full_name }
1250
- (@@stubs_by_name[spec.name] || []).delete_if { |s| s.full_name == spec.full_name }
1251
- reset
1252
- end
1253
-
1254
1256
  ##
1255
1257
  # Is +name+ a required attribute?
1256
1258
 
@@ -1271,60 +1273,100 @@ class Gem::Specification < Gem::BasicSpecification
1271
1273
 
1272
1274
  def self.reset
1273
1275
  @@dirs = nil
1274
- Gem.pre_reset_hooks.each { |hook| hook.call }
1275
- @@all = nil
1276
- @@stubs = nil
1277
- @@stubs_by_name = {}
1278
- @@spec_with_requirable_file = {}
1279
- @@active_stub_with_requirable_file = {}
1280
- _clear_load_cache
1276
+ Gem.pre_reset_hooks.each(&:call)
1277
+ clear_specs
1278
+ clear_load_cache
1281
1279
  unresolved = unresolved_deps
1282
- unless unresolved.empty? then
1283
- w = "W" + "ARN"
1284
- warn "#{w}: Unresolved specs during Gem::Specification.reset:"
1280
+ unless unresolved.empty?
1281
+ warn "WARN: Unresolved or ambiguous specs during Gem::Specification.reset:"
1285
1282
  unresolved.values.each do |dep|
1286
1283
  warn " #{dep}"
1284
+
1285
+ versions = find_all_by_name(dep.name)
1286
+ unless versions.empty?
1287
+ warn " Available/installed versions of this gem:"
1288
+ versions.each {|s| warn " - #{s.version}" }
1289
+ end
1287
1290
  end
1288
- warn "#{w}: Clearing out unresolved specs."
1291
+ warn "WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'"
1289
1292
  warn "Please report a bug if this causes problems."
1290
1293
  unresolved.clear
1291
1294
  end
1292
- Gem.post_reset_hooks.each { |hook| hook.call }
1295
+ Gem.post_reset_hooks.each(&:call)
1293
1296
  end
1294
1297
 
1295
1298
  # DOC: This method needs documented or nodoc'd
1296
1299
  def self.unresolved_deps
1297
- @unresolved_deps ||= Hash.new { |h, n| h[n] = Gem::Dependency.new n }
1300
+ @unresolved_deps ||= Hash.new {|h, n| h[n] = Gem::Dependency.new n }
1298
1301
  end
1299
1302
 
1300
1303
  ##
1301
1304
  # Load custom marshal format, re-initializing defaults as needed
1302
1305
 
1303
1306
  def self._load(str)
1304
- array = Marshal.load str
1307
+ Gem.load_yaml
1308
+ Gem.load_safe_marshal
1309
+
1310
+ yaml_set = false
1311
+ retry_count = 0
1312
+
1313
+ array = begin
1314
+ Gem::SafeMarshal.safe_load str
1315
+ rescue ArgumentError => e
1316
+ # Avoid an infinite retry loop when the argument error has nothing to do
1317
+ # with the classes not being defined.
1318
+ # 1 retry each allowed in case all 3 of
1319
+ # - YAML
1320
+ # - YAML::Syck::DefaultKey
1321
+ # - YAML::PrivateType
1322
+ # need to be defined
1323
+ raise if retry_count >= 3
1324
+
1325
+ #
1326
+ # Some very old marshaled specs included references to `YAML::PrivateType`
1327
+ # and `YAML::Syck::DefaultKey` constants due to bugs in the old emitter
1328
+ # that generated them. Workaround the issue by defining the necessary
1329
+ # constants and retrying.
1330
+ #
1331
+ message = e.message
1332
+ raise unless message.include?("YAML::")
1333
+
1334
+ unless Object.const_defined?(:YAML)
1335
+ Object.const_set "YAML", Psych
1336
+ yaml_set = true
1337
+ end
1338
+
1339
+ if message.include?("YAML::Syck::")
1340
+ YAML.const_set "Syck", YAML unless YAML.const_defined?(:Syck)
1341
+
1342
+ YAML::Syck.const_set "DefaultKey", Class.new if message.include?("YAML::Syck::DefaultKey") && !YAML::Syck.const_defined?(:DefaultKey)
1343
+ elsif message.include?("YAML::PrivateType") && !YAML.const_defined?(:PrivateType)
1344
+ YAML.const_set "PrivateType", Class.new
1345
+ end
1346
+
1347
+ retry_count += 1
1348
+ retry
1349
+ ensure
1350
+ Object.__send__(:remove_const, "YAML") if yaml_set
1351
+ end
1305
1352
 
1306
1353
  spec = Gem::Specification.new
1307
1354
  spec.instance_variable_set :@specification_version, array[1]
1308
1355
 
1309
1356
  current_version = CURRENT_SPECIFICATION_VERSION
1310
1357
 
1311
- field_count = if spec.specification_version > current_version then
1312
- spec.instance_variable_set :@specification_version,
1313
- current_version
1314
- MARSHAL_FIELDS[current_version]
1315
- else
1316
- MARSHAL_FIELDS[spec.specification_version]
1317
- end
1358
+ field_count = if spec.specification_version > current_version
1359
+ spec.instance_variable_set :@specification_version,
1360
+ current_version
1361
+ MARSHAL_FIELDS[current_version]
1362
+ else
1363
+ MARSHAL_FIELDS[spec.specification_version]
1364
+ end
1318
1365
 
1319
- if array.size < field_count then
1366
+ if array.size < field_count
1320
1367
  raise TypeError, "invalid Gem::Specification format #{array.inspect}"
1321
1368
  end
1322
1369
 
1323
- # Cleanup any YAML::PrivateType. They only show up for an old bug
1324
- # where nil => null, so just convert them to nil based on the type.
1325
-
1326
- array.map! { |e| e.kind_of?(YAML::PrivateType) ? nil : e }
1327
-
1328
1370
  spec.instance_variable_set :@rubygems_version, array[0]
1329
1371
  # spec version
1330
1372
  spec.instance_variable_set :@name, array[2]
@@ -1335,7 +1377,7 @@ class Gem::Specification < Gem::BasicSpecification
1335
1377
  spec.instance_variable_set :@required_rubygems_version, array[7]
1336
1378
  spec.instance_variable_set :@original_platform, array[8]
1337
1379
  spec.instance_variable_set :@dependencies, array[9]
1338
- spec.instance_variable_set :@rubyforge_project, array[10]
1380
+ # offset due to rubyforge_project removal
1339
1381
  spec.instance_variable_set :@email, array[11]
1340
1382
  spec.instance_variable_set :@authors, array[12]
1341
1383
  spec.instance_variable_set :@description, array[13]
@@ -1355,7 +1397,7 @@ class Gem::Specification < Gem::BasicSpecification
1355
1397
  sort_obj <=> other.sort_obj
1356
1398
  end
1357
1399
 
1358
- def == other # :nodoc:
1400
+ def ==(other) # :nodoc:
1359
1401
  self.class === other &&
1360
1402
  name == other.name &&
1361
1403
  version == other.version &&
@@ -1380,7 +1422,7 @@ class Gem::Specification < Gem::BasicSpecification
1380
1422
  @required_rubygems_version,
1381
1423
  @original_platform,
1382
1424
  @dependencies,
1383
- @rubyforge_project,
1425
+ "", # rubyforge_project
1384
1426
  @email,
1385
1427
  @authors,
1386
1428
  @description,
@@ -1388,7 +1430,7 @@ class Gem::Specification < Gem::BasicSpecification
1388
1430
  true, # has_rdoc
1389
1431
  @new_platform,
1390
1432
  @licenses,
1391
- @metadata
1433
+ @metadata,
1392
1434
  ]
1393
1435
  end
1394
1436
 
@@ -1399,8 +1441,8 @@ class Gem::Specification < Gem::BasicSpecification
1399
1441
  # there are conflicts upon activation.
1400
1442
 
1401
1443
  def activate
1402
- other = Gem.loaded_specs[self.name]
1403
- if other then
1444
+ other = Gem.loaded_specs[name]
1445
+ if other
1404
1446
  check_version_conflict other
1405
1447
  return false
1406
1448
  end
@@ -1410,11 +1452,11 @@ class Gem::Specification < Gem::BasicSpecification
1410
1452
  activate_dependencies
1411
1453
  add_self_to_load_path
1412
1454
 
1413
- Gem.loaded_specs[self.name] = self
1455
+ Gem.loaded_specs[name] = self
1414
1456
  @activated = true
1415
1457
  @loaded = true
1416
1458
 
1417
- return true
1459
+ true
1418
1460
  end
1419
1461
 
1420
1462
  ##
@@ -1425,7 +1467,7 @@ class Gem::Specification < Gem::BasicSpecification
1425
1467
  def activate_dependencies
1426
1468
  unresolved = Gem::Specification.unresolved_deps
1427
1469
 
1428
- self.runtime_dependencies.each do |spec_dep|
1470
+ runtime_dependencies.each do |spec_dep|
1429
1471
  if loaded = Gem.loaded_specs[spec_dep.name]
1430
1472
  next if spec_dep.matches_spec? loaded
1431
1473
 
@@ -1436,9 +1478,13 @@ class Gem::Specification < Gem::BasicSpecification
1436
1478
  raise e
1437
1479
  end
1438
1480
 
1439
- specs = spec_dep.to_specs
1481
+ begin
1482
+ specs = spec_dep.to_specs
1483
+ rescue Gem::MissingSpecError => e
1484
+ raise Gem::MissingSpecError.new(e.name, e.requirement, "at: #{spec_file}")
1485
+ end
1440
1486
 
1441
- if specs.size == 1 then
1487
+ if specs.size == 1
1442
1488
  specs.first.activate
1443
1489
  else
1444
1490
  name = spec_dep.name
@@ -1472,7 +1518,7 @@ class Gem::Specification < Gem::BasicSpecification
1472
1518
  self.summary = sanitize_string(summary)
1473
1519
  self.description = sanitize_string(description)
1474
1520
  self.post_install_message = sanitize_string(post_install_message)
1475
- self.authors = authors.collect { |a| sanitize_string(a) }
1521
+ self.authors = authors.collect {|a| sanitize_string(a) }
1476
1522
  end
1477
1523
 
1478
1524
  ##
@@ -1481,16 +1527,10 @@ class Gem::Specification < Gem::BasicSpecification
1481
1527
  def sanitize_string(string)
1482
1528
  return string unless string
1483
1529
 
1484
- # HACK the #to_s is in here because RSpec has an Array of Arrays of
1530
+ # HACK: the #to_s is in here because RSpec has an Array of Arrays of
1485
1531
  # Strings for authors. Need a way to disallow bad values on gemspec
1486
1532
  # generation. (Probably won't happen.)
1487
- string = string.to_s
1488
-
1489
- begin
1490
- Builder::XChar.encode string
1491
- rescue NameError, NoMethodError
1492
- string.to_xs
1493
- end
1533
+ string.to_s
1494
1534
  end
1495
1535
 
1496
1536
  ##
@@ -1500,13 +1540,13 @@ class Gem::Specification < Gem::BasicSpecification
1500
1540
  def add_bindir(executables)
1501
1541
  return nil if executables.nil?
1502
1542
 
1503
- if @bindir then
1504
- Array(executables).map { |e| File.join(@bindir, e) }
1543
+ if @bindir
1544
+ Array(executables).map {|e| File.join(@bindir, e) }
1505
1545
  else
1506
1546
  executables
1507
1547
  end
1508
- rescue
1509
- return nil
1548
+ rescue StandardError
1549
+ nil
1510
1550
  end
1511
1551
 
1512
1552
  ##
@@ -1514,12 +1554,12 @@ class Gem::Specification < Gem::BasicSpecification
1514
1554
  # +requirements+. Valid types are currently <tt>:runtime</tt> and
1515
1555
  # <tt>:development</tt>.
1516
1556
 
1517
- def add_dependency_with_type(dependency, type, *requirements)
1518
- requirements = if requirements.empty? then
1519
- Gem::Requirement.default
1520
- else
1521
- requirements.flatten
1522
- end
1557
+ def add_dependency_with_type(dependency, type, requirements)
1558
+ requirements = if requirements.empty?
1559
+ Gem::Requirement.default
1560
+ else
1561
+ requirements.flatten
1562
+ end
1523
1563
 
1524
1564
  unless dependency.respond_to?(:name) &&
1525
1565
  dependency.respond_to?(:requirement)
@@ -1531,7 +1571,7 @@ class Gem::Specification < Gem::BasicSpecification
1531
1571
 
1532
1572
  private :add_dependency_with_type
1533
1573
 
1534
- alias add_dependency add_runtime_dependency
1574
+ alias_method :add_dependency, :add_runtime_dependency
1535
1575
 
1536
1576
  ##
1537
1577
  # Adds this spec's require paths to LOAD_PATH, in the proper location.
@@ -1541,23 +1581,14 @@ class Gem::Specification < Gem::BasicSpecification
1541
1581
 
1542
1582
  paths = full_require_paths
1543
1583
 
1544
- # gem directories must come after -I and ENV['RUBYLIB']
1545
- insert_index = Gem.load_path_insert_index
1546
-
1547
- if insert_index then
1548
- # gem directories must come after -I and ENV['RUBYLIB']
1549
- $LOAD_PATH.insert(insert_index, *paths)
1550
- else
1551
- # we are probably testing in core, -I and RUBYLIB don't apply
1552
- $LOAD_PATH.unshift(*paths)
1553
- end
1584
+ Gem.add_to_load_path(*paths)
1554
1585
  end
1555
1586
 
1556
1587
  ##
1557
1588
  # Singular reader for #authors. Returns the first author in the list
1558
1589
 
1559
1590
  def author
1560
- val = authors and val.first
1591
+ (val = authors) && val.first
1561
1592
  end
1562
1593
 
1563
1594
  ##
@@ -1576,13 +1607,13 @@ class Gem::Specification < Gem::BasicSpecification
1576
1607
  # a full path.
1577
1608
 
1578
1609
  def bin_dir
1579
- @bin_dir ||= File.join gem_dir, bindir # TODO: this is unfortunate
1610
+ @bin_dir ||= File.join gem_dir, bindir
1580
1611
  end
1581
1612
 
1582
1613
  ##
1583
1614
  # Returns the full path to an executable named +name+ in this gem.
1584
1615
 
1585
- def bin_file name
1616
+ def bin_file(name)
1586
1617
  File.join bin_dir, name
1587
1618
  end
1588
1619
 
@@ -1592,7 +1623,7 @@ class Gem::Specification < Gem::BasicSpecification
1592
1623
  def build_args
1593
1624
  if File.exist? build_info_file
1594
1625
  build_info = File.readlines build_info_file
1595
- build_info = build_info.map { |x| x.strip }
1626
+ build_info = build_info.map(&:strip)
1596
1627
  build_info.delete ""
1597
1628
  build_info
1598
1629
  else
@@ -1605,12 +1636,13 @@ class Gem::Specification < Gem::BasicSpecification
1605
1636
  # the gem.build_complete file is missing.
1606
1637
 
1607
1638
  def build_extensions # :nodoc:
1608
- return if default_gem?
1609
1639
  return if extensions.empty?
1610
- return if installed_by_version < Gem::Version.new('2.2.0.preview.2')
1640
+ return if default_gem?
1641
+ # we need to fresh build when same name and version of default gems
1642
+ return if self.class.find_by_full_name(full_name)&.default_gem?
1611
1643
  return if File.exist? gem_build_complete_path
1612
- return if !File.writable?(base_dir)
1613
- return if !File.exist?(File.join(base_dir, 'extensions'))
1644
+ return unless File.writable?(base_dir)
1645
+ return unless File.exist?(File.join(base_dir, "extensions"))
1614
1646
 
1615
1647
  begin
1616
1648
  # We need to require things in $LOAD_PATH without looking for the
@@ -1618,9 +1650,9 @@ class Gem::Specification < Gem::BasicSpecification
1618
1650
  unresolved_deps = Gem::Specification.unresolved_deps.dup
1619
1651
  Gem::Specification.unresolved_deps.clear
1620
1652
 
1621
- require 'rubygems/config_file'
1622
- require 'rubygems/ext'
1623
- require 'rubygems/user_interaction'
1653
+ require_relative "config_file"
1654
+ require_relative "ext"
1655
+ require_relative "user_interaction"
1624
1656
 
1625
1657
  ui = Gem::SilentUI.new
1626
1658
  Gem::DefaultUserInteraction.use_ui ui do
@@ -1628,7 +1660,7 @@ class Gem::Specification < Gem::BasicSpecification
1628
1660
  builder.build_extensions
1629
1661
  end
1630
1662
  ensure
1631
- ui.close if ui
1663
+ ui&.close
1632
1664
  Gem::Specification.unresolved_deps.replace unresolved_deps
1633
1665
  end
1634
1666
  end
@@ -1648,16 +1680,6 @@ class Gem::Specification < Gem::BasicSpecification
1648
1680
  File.join build_info_dir, "#{full_name}.info"
1649
1681
  end
1650
1682
 
1651
- ##
1652
- # Used to detect if the gem is bundled in older version of Ruby, but not
1653
- # detectable as default gem (see BasicSpecification#default_gem?).
1654
-
1655
- def bundled_gem_in_old_ruby?
1656
- !default_gem? &&
1657
- RUBY_VERSION < "2.0.0" &&
1658
- summary == "This #{name} is bundled with Ruby"
1659
- end
1660
-
1661
1683
  ##
1662
1684
  # Returns the full path to the cache directory containing this
1663
1685
  # spec's cached gem.
@@ -1678,12 +1700,12 @@ class Gem::Specification < Gem::BasicSpecification
1678
1700
 
1679
1701
  def conflicts
1680
1702
  conflicts = {}
1681
- self.runtime_dependencies.each { |dep|
1703
+ runtime_dependencies.each do |dep|
1682
1704
  spec = Gem.loaded_specs[dep.name]
1683
- if spec and not spec.satisfies_requirement? dep
1705
+ if spec && !spec.satisfies_requirement?(dep)
1684
1706
  (conflicts[spec] ||= []) << dep
1685
1707
  end
1686
- }
1708
+ end
1687
1709
  env_req = Gem.env_requirement(name)
1688
1710
  (conflicts[self] ||= []) << env_req unless env_req.satisfied_by? version
1689
1711
  conflicts
@@ -1693,9 +1715,9 @@ class Gem::Specification < Gem::BasicSpecification
1693
1715
  # return true if there will be conflict when spec if loaded together with the list of specs.
1694
1716
 
1695
1717
  def conficts_when_loaded_with?(list_of_specs) # :nodoc:
1696
- result = list_of_specs.any? { |spec|
1697
- spec.dependencies.any? { |dep| dep.runtime? && (dep.name == name) && !satisfies_requirement?(dep) }
1698
- }
1718
+ result = list_of_specs.any? do |spec|
1719
+ spec.runtime_dependencies.any? {|dep| (dep.name == name) && !satisfies_requirement?(dep) }
1720
+ end
1699
1721
  result
1700
1722
  end
1701
1723
 
@@ -1704,28 +1726,29 @@ class Gem::Specification < Gem::BasicSpecification
1704
1726
 
1705
1727
  def has_conflicts?
1706
1728
  return true unless Gem.env_requirement(name).satisfied_by?(version)
1707
- self.dependencies.any? { |dep|
1708
- if dep.runtime? then
1709
- spec = Gem.loaded_specs[dep.name]
1710
- spec and not spec.satisfies_requirement? dep
1711
- else
1712
- false
1713
- end
1714
- }
1729
+ runtime_dependencies.any? do |dep|
1730
+ spec = Gem.loaded_specs[dep.name]
1731
+ spec && !spec.satisfies_requirement?(dep)
1732
+ end
1733
+ rescue ArgumentError => e
1734
+ raise e, "#{name} #{version}: #{e.message}"
1715
1735
  end
1716
1736
 
1717
- ##
1718
- # The date this gem was created. Lazily defaults to the current UTC date.
1737
+ # The date this gem was created.
1738
+ #
1739
+ # If SOURCE_DATE_EPOCH is set as an environment variable, use that to support
1740
+ # reproducible builds; otherwise, default to the current UTC date.
1719
1741
  #
1720
- # There is no need to set this in your gem specification.
1742
+ # Details on SOURCE_DATE_EPOCH:
1743
+ # https://reproducible-builds.org/specs/source-date-epoch/
1721
1744
 
1722
1745
  def date
1723
- @date ||= TODAY
1746
+ @date ||= Time.utc(*Gem.source_date_epoch.utc.to_a[3..5].reverse)
1724
1747
  end
1725
1748
 
1726
1749
  DateLike = Object.new # :nodoc:
1727
1750
  def DateLike.===(obj) # :nodoc:
1728
- defined?(::Date) and Date === obj
1751
+ defined?(::Date) && Date === obj
1729
1752
  end
1730
1753
 
1731
1754
  DateTimeFormat = # :nodoc:
@@ -1739,19 +1762,13 @@ class Gem::Specification < Gem::BasicSpecification
1739
1762
  #
1740
1763
  # DO NOT set this, it is set automatically when the gem is packaged.
1741
1764
 
1742
- def date= date
1765
+ def date=(date)
1743
1766
  # We want to end up with a Time object with one-day resolution.
1744
1767
  # This is the cleanest, most-readable, faster-than-using-Date
1745
1768
  # way to do it.
1746
1769
  @date = case date
1747
1770
  when String then
1748
- if DateTimeFormat =~ date then
1749
- Time.utc($1.to_i, $2.to_i, $3.to_i)
1750
-
1751
- # Workaround for where the date format output from psych isn't
1752
- # parsed as a Time object by syck and thus comes through as a
1753
- # string.
1754
- elsif /\A(\d{4})-(\d{2})-(\d{2}) \d{2}:\d{2}:\d{2}\.\d+?Z\z/ =~ date then
1771
+ if DateTimeFormat =~ date
1755
1772
  Time.utc($1.to_i, $2.to_i, $3.to_i)
1756
1773
  else
1757
1774
  raise(Gem::InvalidSpecificationException,
@@ -1761,7 +1778,7 @@ class Gem::Specification < Gem::BasicSpecification
1761
1778
  Time.utc(date.year, date.month, date.day)
1762
1779
  else
1763
1780
  TODAY
1764
- end
1781
+ end
1765
1782
  end
1766
1783
 
1767
1784
  ##
@@ -1771,20 +1788,21 @@ class Gem::Specification < Gem::BasicSpecification
1771
1788
  # executable now. See Gem.bin_path.
1772
1789
 
1773
1790
  def default_executable # :nodoc:
1774
- if defined?(@default_executable) and @default_executable
1791
+ if defined?(@default_executable) && @default_executable
1775
1792
  result = @default_executable
1776
- elsif @executables and @executables.size == 1
1793
+ elsif @executables && @executables.size == 1
1777
1794
  result = Array(@executables).first
1778
1795
  else
1779
1796
  result = nil
1780
1797
  end
1781
1798
  result
1782
1799
  end
1800
+ rubygems_deprecate :default_executable
1783
1801
 
1784
1802
  ##
1785
1803
  # The default value for specification attribute +name+
1786
1804
 
1787
- def default_value name
1805
+ def default_value(name)
1788
1806
  @@default_value[name]
1789
1807
  end
1790
1808
 
@@ -1804,17 +1822,17 @@ class Gem::Specification < Gem::BasicSpecification
1804
1822
  #
1805
1823
  # [depending_gem, dependency, [list_of_gems_that_satisfy_dependency]]
1806
1824
 
1807
- def dependent_gems
1825
+ def dependent_gems(check_dev=true)
1808
1826
  out = []
1809
1827
  Gem::Specification.each do |spec|
1810
- spec.dependencies.each do |dep|
1811
- if self.satisfies_requirement?(dep) then
1812
- sats = []
1813
- find_all_satisfiers(dep) do |sat|
1814
- sats << sat
1815
- end
1816
- out << [spec, dep, sats]
1828
+ deps = check_dev ? spec.dependencies : spec.runtime_dependencies
1829
+ deps.each do |dep|
1830
+ next unless satisfies_requirement?(dep)
1831
+ sats = []
1832
+ find_all_satisfiers(dep) do |sat|
1833
+ sats << sat
1817
1834
  end
1835
+ out << [spec, dep, sats]
1818
1836
  end
1819
1837
  end
1820
1838
  out
@@ -1824,13 +1842,13 @@ class Gem::Specification < Gem::BasicSpecification
1824
1842
  # Returns all specs that matches this spec's runtime dependencies.
1825
1843
 
1826
1844
  def dependent_specs
1827
- runtime_dependencies.map { |dep| dep.to_specs }.flatten
1845
+ runtime_dependencies.map(&:to_specs).flatten
1828
1846
  end
1829
1847
 
1830
1848
  ##
1831
1849
  # A detailed description of this gem. See also #summary
1832
1850
 
1833
- def description= str
1851
+ def description=(str)
1834
1852
  @description = str.to_s
1835
1853
  end
1836
1854
 
@@ -1838,7 +1856,7 @@ class Gem::Specification < Gem::BasicSpecification
1838
1856
  # List of dependencies that are used for development
1839
1857
 
1840
1858
  def development_dependencies
1841
- dependencies.select { |d| d.type == :development }
1859
+ dependencies.select {|d| d.type == :development }
1842
1860
  end
1843
1861
 
1844
1862
  ##
@@ -1849,30 +1867,30 @@ class Gem::Specification < Gem::BasicSpecification
1849
1867
  #
1850
1868
  # spec.doc_dir 'ri' # => "/path/to/gem_repo/doc/a-1/ri"
1851
1869
 
1852
- def doc_dir type = nil
1853
- @doc_dir ||= File.join base_dir, 'doc', full_name
1870
+ def doc_dir(type = nil)
1871
+ @doc_dir ||= File.join base_dir, "doc", full_name
1854
1872
 
1855
- if type then
1873
+ if type
1856
1874
  File.join @doc_dir, type
1857
1875
  else
1858
1876
  @doc_dir
1859
1877
  end
1860
1878
  end
1861
1879
 
1862
- def encode_with coder # :nodoc:
1880
+ def encode_with(coder) # :nodoc:
1863
1881
  mark_version
1864
1882
 
1865
- coder.add 'name', @name
1866
- coder.add 'version', @version
1883
+ coder.add "name", @name
1884
+ coder.add "version", @version
1867
1885
  platform = case @original_platform
1868
- when nil, '' then
1869
- 'ruby'
1886
+ when nil, "" then
1887
+ "ruby"
1870
1888
  when String then
1871
1889
  @original_platform
1872
1890
  else
1873
1891
  @original_platform.to_s
1874
- end
1875
- coder.add 'platform', platform
1892
+ end
1893
+ coder.add "platform", platform
1876
1894
 
1877
1895
  attributes = @@attributes.map(&:to_s) - %w[name version platform]
1878
1896
  attributes.each do |name|
@@ -1880,7 +1898,7 @@ class Gem::Specification < Gem::BasicSpecification
1880
1898
  end
1881
1899
  end
1882
1900
 
1883
- def eql? other # :nodoc:
1901
+ def eql?(other) # :nodoc:
1884
1902
  self.class === other && same_attributes?(other)
1885
1903
  end
1886
1904
 
@@ -1888,40 +1906,34 @@ class Gem::Specification < Gem::BasicSpecification
1888
1906
  # Singular accessor for #executables
1889
1907
 
1890
1908
  def executable
1891
- val = executables and val.first
1909
+ (val = executables) && val.first
1892
1910
  end
1893
1911
 
1894
1912
  ##
1895
1913
  # Singular accessor for #executables
1896
1914
 
1897
- def executable=o
1915
+ def executable=(o)
1898
1916
  self.executables = [o]
1899
1917
  end
1900
1918
 
1901
1919
  ##
1902
- # Sets executables to +value+, ensuring it is an array. Don't
1903
- # use this, push onto the array instead.
1920
+ # Sets executables to +value+, ensuring it is an array.
1904
1921
 
1905
- def executables= value
1906
- # TODO: warn about setting instead of pushing
1922
+ def executables=(value)
1907
1923
  @executables = Array(value)
1908
1924
  end
1909
1925
 
1910
1926
  ##
1911
- # Sets extensions to +extensions+, ensuring it is an array. Don't
1912
- # use this, push onto the array instead.
1927
+ # Sets extensions to +extensions+, ensuring it is an array.
1913
1928
 
1914
- def extensions= extensions
1915
- # TODO: warn about setting instead of pushing
1929
+ def extensions=(extensions)
1916
1930
  @extensions = Array extensions
1917
1931
  end
1918
1932
 
1919
1933
  ##
1920
- # Sets extra_rdoc_files to +files+, ensuring it is an array. Don't
1921
- # use this, push onto the array instead.
1934
+ # Sets extra_rdoc_files to +files+, ensuring it is an array.
1922
1935
 
1923
- def extra_rdoc_files= files
1924
- # TODO: warn about setting instead of pushing
1936
+ def extra_rdoc_files=(files)
1925
1937
  @extra_rdoc_files = Array files
1926
1938
  end
1927
1939
 
@@ -1937,14 +1949,14 @@ class Gem::Specification < Gem::BasicSpecification
1937
1949
  ##
1938
1950
  # Sets files to +files+, ensuring it is an array.
1939
1951
 
1940
- def files= files
1952
+ def files=(files)
1941
1953
  @files = Array files
1942
1954
  end
1943
1955
 
1944
1956
  ##
1945
1957
  # Finds all gems that satisfy +dep+
1946
1958
 
1947
- def find_all_satisfiers dep
1959
+ def find_all_satisfiers(dep)
1948
1960
  Gem::Specification.each do |spec|
1949
1961
  yield spec if spec.satisfies_requirement? dep
1950
1962
  end
@@ -1976,8 +1988,7 @@ class Gem::Specification < Gem::BasicSpecification
1976
1988
  end
1977
1989
 
1978
1990
  def gems_dir
1979
- # TODO: this logic seems terribly broken, but tests fail if just base_dir
1980
- @gems_dir ||= File.join(loaded_from && base_dir || Gem.dir, "gems")
1991
+ @gems_dir ||= File.join(base_dir, "gems")
1981
1992
  end
1982
1993
 
1983
1994
  ##
@@ -1988,44 +1999,61 @@ class Gem::Specification < Gem::BasicSpecification
1988
1999
  def has_rdoc # :nodoc:
1989
2000
  true
1990
2001
  end
2002
+ rubygems_deprecate :has_rdoc
1991
2003
 
1992
2004
  ##
1993
2005
  # Deprecated and ignored.
1994
2006
  #
1995
2007
  # Formerly used to indicate this gem was RDoc-capable.
1996
2008
 
1997
- def has_rdoc= ignored # :nodoc:
2009
+ def has_rdoc=(ignored) # :nodoc:
1998
2010
  @has_rdoc = true
1999
2011
  end
2012
+ rubygems_deprecate :has_rdoc=
2000
2013
 
2001
- alias :has_rdoc? :has_rdoc # :nodoc:
2014
+ alias_method :has_rdoc?, :has_rdoc # :nodoc:
2015
+ rubygems_deprecate :has_rdoc?
2002
2016
 
2003
2017
  ##
2004
2018
  # True if this gem has files in test_files
2005
2019
 
2006
2020
  def has_unit_tests? # :nodoc:
2007
- not test_files.empty?
2021
+ !test_files.empty?
2008
2022
  end
2009
2023
 
2010
2024
  # :stopdoc:
2011
- alias has_test_suite? has_unit_tests?
2025
+ alias_method :has_test_suite?, :has_unit_tests?
2012
2026
  # :startdoc:
2013
2027
 
2014
2028
  def hash # :nodoc:
2015
2029
  name.hash ^ version.hash
2016
2030
  end
2017
2031
 
2018
- def init_with coder # :nodoc:
2032
+ def init_with(coder) # :nodoc:
2019
2033
  @installed_by_version ||= nil
2020
2034
  yaml_initialize coder.tag, coder.map
2021
2035
  end
2022
2036
 
2037
+ eval <<-RUBY, binding, __FILE__, __LINE__ + 1
2038
+ # frozen_string_literal: true
2039
+
2040
+ def set_nil_attributes_to_nil
2041
+ #{@@nil_attributes.map {|key| "@#{key} = nil" }.join "; "}
2042
+ end
2043
+ private :set_nil_attributes_to_nil
2044
+
2045
+ def set_not_nil_attributes_to_default_values
2046
+ #{@@non_nil_attributes.map {|key| "@#{key} = #{INITIALIZE_CODE_FOR_DEFAULTS[key]}" }.join ";"}
2047
+ end
2048
+ private :set_not_nil_attributes_to_default_values
2049
+ RUBY
2050
+
2023
2051
  ##
2024
2052
  # Specification constructor. Assigns the default values to the attributes
2025
2053
  # and yields itself for further initialization. Optionally takes +name+ and
2026
2054
  # +version+.
2027
2055
 
2028
- def initialize name = nil, version = nil
2056
+ def initialize(name = nil, version = nil)
2029
2057
  super()
2030
2058
  @gems_dir = nil
2031
2059
  @base_dir = nil
@@ -2035,35 +2063,32 @@ class Gem::Specification < Gem::BasicSpecification
2035
2063
  @original_platform = nil
2036
2064
  @installed_by_version = nil
2037
2065
 
2038
- @@nil_attributes.each do |key|
2039
- instance_variable_set "@#{key}", nil
2040
- end
2041
-
2042
- @@non_nil_attributes.each do |key|
2043
- default = default_value(key)
2044
- value = Dupable[key] ? default.dup : default
2045
- instance_variable_set "@#{key}", value
2046
- end
2066
+ set_nil_attributes_to_nil
2067
+ set_not_nil_attributes_to_default_values
2047
2068
 
2048
2069
  @new_platform = Gem::Platform::RUBY
2049
2070
 
2050
2071
  self.name = name if name
2051
2072
  self.version = version if version
2052
2073
 
2074
+ if (platform = Gem.platforms.last) && platform != Gem::Platform::RUBY && platform != Gem::Platform.local
2075
+ self.platform = platform
2076
+ end
2077
+
2053
2078
  yield self if block_given?
2054
2079
  end
2055
2080
 
2056
2081
  ##
2057
2082
  # Duplicates array_attributes from +other_spec+ so state isn't shared.
2058
2083
 
2059
- def initialize_copy other_spec
2084
+ def initialize_copy(other_spec)
2060
2085
  self.class.array_attributes.each do |name|
2061
2086
  name = :"@#{name}"
2062
2087
  next unless other_spec.instance_variable_defined? name
2063
2088
 
2064
2089
  begin
2065
2090
  val = other_spec.instance_variable_get(name)
2066
- if val then
2091
+ if val
2067
2092
  instance_variable_set name, val.dup
2068
2093
  elsif Gem.configuration.really_verbose
2069
2094
  warn "WARNING: #{full_name} has an invalid nil value for #{name}"
@@ -2080,11 +2105,11 @@ class Gem::Specification < Gem::BasicSpecification
2080
2105
 
2081
2106
  def base_dir
2082
2107
  return Gem.dir unless loaded_from
2083
- @base_dir ||= if default_gem? then
2084
- File.dirname File.dirname File.dirname loaded_from
2085
- else
2086
- File.dirname File.dirname loaded_from
2087
- end
2108
+ @base_dir ||= if default_gem?
2109
+ File.dirname File.dirname File.dirname loaded_from
2110
+ else
2111
+ File.dirname File.dirname loaded_from
2112
+ end
2088
2113
  end
2089
2114
 
2090
2115
  ##
@@ -2102,7 +2127,7 @@ class Gem::Specification < Gem::BasicSpecification
2102
2127
  if $DEBUG
2103
2128
  super
2104
2129
  else
2105
- "#<#{self.class}:0x#{__id__.to_s(16)} #{full_name}>"
2130
+ "#{super[0..-2]} #{full_name}>"
2106
2131
  end
2107
2132
  end
2108
2133
 
@@ -2152,11 +2177,17 @@ class Gem::Specification < Gem::BasicSpecification
2152
2177
  end
2153
2178
 
2154
2179
  ##
2180
+ # Track removed method calls to warn about during build time.
2155
2181
  # Warn about unknown attributes while loading a spec.
2156
2182
 
2157
2183
  def method_missing(sym, *a, &b) # :nodoc:
2158
- if @specification_version > CURRENT_SPECIFICATION_VERSION and
2159
- sym.to_s =~ /=$/ then
2184
+ if REMOVED_METHODS.include?(sym)
2185
+ removed_method_calls << sym
2186
+ return
2187
+ end
2188
+
2189
+ if @specification_version > CURRENT_SPECIFICATION_VERSION &&
2190
+ sym.to_s.end_with?("=")
2160
2191
  warn "ignoring #{sym} loading #{full_name}" if $DEBUG
2161
2192
  else
2162
2193
  super
@@ -2168,9 +2199,8 @@ class Gem::Specification < Gem::BasicSpecification
2168
2199
  # probably want to build_extensions
2169
2200
 
2170
2201
  def missing_extensions?
2171
- return false if default_gem?
2172
2202
  return false if extensions.empty?
2173
- return false if installed_by_version < Gem::Version.new('2.2.0.preview.2')
2203
+ return false if default_gem?
2174
2204
  return false if File.exist? gem_build_complete_path
2175
2205
 
2176
2206
  true
@@ -2183,7 +2213,7 @@ class Gem::Specification < Gem::BasicSpecification
2183
2213
  # file list.
2184
2214
 
2185
2215
  def normalize
2186
- if defined?(@extra_rdoc_files) and @extra_rdoc_files then
2216
+ if defined?(@extra_rdoc_files) && @extra_rdoc_files
2187
2217
  @extra_rdoc_files.uniq!
2188
2218
  @files ||= []
2189
2219
  @files.concat(@extra_rdoc_files)
@@ -2208,7 +2238,7 @@ class Gem::Specification < Gem::BasicSpecification
2208
2238
  # platform. For use with legacy gems.
2209
2239
 
2210
2240
  def original_name # :nodoc:
2211
- if platform == Gem::Platform::RUBY or platform.nil? then
2241
+ if platform == Gem::Platform::RUBY || platform.nil?
2212
2242
  "#{@name}-#{@version}"
2213
2243
  else
2214
2244
  "#{@name}-#{@version}-#{@original_platform}"
@@ -2226,11 +2256,11 @@ class Gem::Specification < Gem::BasicSpecification
2226
2256
  # The platform this gem runs on. See Gem::Platform for details.
2227
2257
 
2228
2258
  def platform
2229
- @new_platform ||= Gem::Platform::RUBY
2259
+ @new_platform ||= Gem::Platform::RUBY # rubocop:disable Naming/MemoizedInstanceVariableName
2230
2260
  end
2231
2261
 
2232
2262
  def pretty_print(q) # :nodoc:
2233
- q.group 2, 'Gem::Specification.new do |s|', 'end' do
2263
+ q.group 2, "Gem::Specification.new do |s|", "end" do
2234
2264
  q.breakable
2235
2265
 
2236
2266
  attributes = @@attributes - [:name, :version]
@@ -2239,22 +2269,22 @@ class Gem::Specification < Gem::BasicSpecification
2239
2269
  attributes.unshift :name
2240
2270
 
2241
2271
  attributes.each do |attr_name|
2242
- current_value = self.send attr_name
2243
- if current_value != default_value(attr_name) or
2244
- self.class.required_attribute? attr_name then
2245
-
2246
- q.text "s.#{attr_name} = "
2272
+ current_value = send attr_name
2273
+ current_value = current_value.sort if [:files, :test_files].include? attr_name
2274
+ next unless current_value != default_value(attr_name) ||
2275
+ self.class.required_attribute?(attr_name)
2247
2276
 
2248
- if attr_name == :date then
2249
- current_value = current_value.utc
2277
+ q.text "s.#{attr_name} = "
2250
2278
 
2251
- q.text "Time.utc(#{current_value.year}, #{current_value.month}, #{current_value.day})"
2252
- else
2253
- q.pp current_value
2254
- end
2279
+ if attr_name == :date
2280
+ current_value = current_value.utc
2255
2281
 
2256
- q.breakable
2282
+ q.text "Time.utc(#{current_value.year}, #{current_value.month}, #{current_value.day})"
2283
+ else
2284
+ q.pp current_value
2257
2285
  end
2286
+
2287
+ q.breakable
2258
2288
  end
2259
2289
  end
2260
2290
  end
@@ -2263,8 +2293,8 @@ class Gem::Specification < Gem::BasicSpecification
2263
2293
  # Raise an exception if the version of this spec conflicts with the one
2264
2294
  # that is already loaded (+other+)
2265
2295
 
2266
- def check_version_conflict other # :nodoc:
2267
- return if self.version == other.version
2296
+ def check_version_conflict(other) # :nodoc:
2297
+ return if version == other.version
2268
2298
 
2269
2299
  # This gem is already loaded. If the currently loaded gem is not in the
2270
2300
  # list of candidate gems, then we have a version conflict.
@@ -2272,8 +2302,7 @@ class Gem::Specification < Gem::BasicSpecification
2272
2302
  msg = "can't activate #{full_name}, already activated #{other.full_name}"
2273
2303
 
2274
2304
  e = Gem::LoadError.new msg
2275
- e.name = self.name
2276
- # TODO: e.requirement = dep.requirement
2305
+ e.name = name
2277
2306
 
2278
2307
  raise e
2279
2308
  end
@@ -2284,17 +2313,15 @@ class Gem::Specification < Gem::BasicSpecification
2284
2313
  # Check the spec for possible conflicts and freak out if there are any.
2285
2314
 
2286
2315
  def raise_if_conflicts # :nodoc:
2287
- if has_conflicts? then
2316
+ if has_conflicts?
2288
2317
  raise Gem::ConflictError.new self, conflicts
2289
2318
  end
2290
2319
  end
2291
2320
 
2292
2321
  ##
2293
- # Sets rdoc_options to +value+, ensuring it is an array. Don't
2294
- # use this, push onto the array instead.
2322
+ # Sets rdoc_options to +value+, ensuring it is an array.
2295
2323
 
2296
- def rdoc_options= options
2297
- # TODO: warn about setting instead of pushing
2324
+ def rdoc_options=(options)
2298
2325
  @rdoc_options = Array options
2299
2326
  end
2300
2327
 
@@ -2302,26 +2329,24 @@ class Gem::Specification < Gem::BasicSpecification
2302
2329
  # Singular accessor for #require_paths
2303
2330
 
2304
2331
  def require_path
2305
- val = require_paths and val.first
2332
+ (val = require_paths) && val.first
2306
2333
  end
2307
2334
 
2308
2335
  ##
2309
2336
  # Singular accessor for #require_paths
2310
2337
 
2311
- def require_path= path
2338
+ def require_path=(path)
2312
2339
  self.require_paths = Array(path)
2313
2340
  end
2314
2341
 
2315
2342
  ##
2316
- # Set requirements to +req+, ensuring it is an array. Don't
2317
- # use this, push onto the array instead.
2343
+ # Set requirements to +req+, ensuring it is an array.
2318
2344
 
2319
- def requirements= req
2320
- # TODO: warn about setting instead of pushing
2345
+ def requirements=(req)
2321
2346
  @requirements = Array req
2322
2347
  end
2323
2348
 
2324
- def respond_to_missing? m, include_private = false # :nodoc:
2349
+ def respond_to_missing?(m, include_private = false) # :nodoc:
2325
2350
  false
2326
2351
  end
2327
2352
 
@@ -2329,7 +2354,7 @@ class Gem::Specification < Gem::BasicSpecification
2329
2354
  # Returns the full path to this spec's ri directory.
2330
2355
 
2331
2356
  def ri_dir
2332
- @ri_dir ||= File.join base_dir, 'ri', full_name
2357
+ @ri_dir ||= File.join base_dir, "ri", full_name
2333
2358
  end
2334
2359
 
2335
2360
  ##
@@ -2338,18 +2363,18 @@ class Gem::Specification < Gem::BasicSpecification
2338
2363
 
2339
2364
  def ruby_code(obj)
2340
2365
  case obj
2341
- when String then obj.dump + ".freeze"
2342
- when Array then '[' + obj.map { |x| ruby_code x }.join(", ") + ']'
2343
- when Hash then
2344
- seg = obj.keys.sort.map { |k| "#{k.to_s.dump} => #{obj[k].to_s.dump}" }
2345
- "{ #{seg.join(', ')} }"
2346
- when Gem::Version then obj.to_s.dump
2347
- when DateLike then obj.strftime('%Y-%m-%d').dump
2348
- when Time then obj.strftime('%Y-%m-%d').dump
2349
- when Numeric then obj.inspect
2350
- when true, false, nil then obj.inspect
2351
- when Gem::Platform then "Gem::Platform.new(#{obj.to_a.inspect})"
2352
- when Gem::Requirement then
2366
+ when String then obj.dump + ".freeze"
2367
+ when Array then "[" + obj.map {|x| ruby_code x }.join(", ") + "]"
2368
+ when Hash then
2369
+ seg = obj.keys.sort.map {|k| "#{k.to_s.dump} => #{obj[k].to_s.dump}" }
2370
+ "{ #{seg.join(", ")} }"
2371
+ when Gem::Version then ruby_code(obj.to_s)
2372
+ when DateLike then obj.strftime("%Y-%m-%d").dump
2373
+ when Time then obj.strftime("%Y-%m-%d").dump
2374
+ when Numeric then obj.inspect
2375
+ when true, false, nil then obj.inspect
2376
+ when Gem::Platform then "Gem::Platform.new(#{ruby_code obj.to_a})"
2377
+ when Gem::Requirement then
2353
2378
  list = obj.as_list
2354
2379
  "Gem::Requirement.new(#{ruby_code(list.size == 1 ? obj.to_s : list)})"
2355
2380
  else raise Gem::Exception, "ruby_code case not handled: #{obj.class}"
@@ -2368,8 +2393,8 @@ class Gem::Specification < Gem::BasicSpecification
2368
2393
  ##
2369
2394
  # True if this gem has the same attributes as +other+.
2370
2395
 
2371
- def same_attributes? spec
2372
- @@attributes.all? { |name, default| self.send(name) == spec.send(name) }
2396
+ def same_attributes?(spec)
2397
+ @@attributes.all? {|name, _default| send(name) == spec.send(name) }
2373
2398
  end
2374
2399
 
2375
2400
  private :same_attributes?
@@ -2377,8 +2402,8 @@ class Gem::Specification < Gem::BasicSpecification
2377
2402
  ##
2378
2403
  # Checks if this specification meets the requirement of +dependency+.
2379
2404
 
2380
- def satisfies_requirement? dependency
2381
- return @name == dependency.name &&
2405
+ def satisfies_requirement?(dependency)
2406
+ @name == dependency.name &&
2382
2407
  dependency.requirement.satisfied_by?(@version)
2383
2408
  end
2384
2409
 
@@ -2386,7 +2411,7 @@ class Gem::Specification < Gem::BasicSpecification
2386
2411
  # Returns an object you can use to sort specifications in #sort_by.
2387
2412
 
2388
2413
  def sort_obj
2389
- [@name, @version, @new_platform == Gem::Platform::RUBY ? -1 : 1]
2414
+ [@name, @version, Gem::Platform.sort_priority(@new_platform)]
2390
2415
  end
2391
2416
 
2392
2417
  ##
@@ -2424,7 +2449,7 @@ class Gem::Specification < Gem::BasicSpecification
2424
2449
  ##
2425
2450
  # A short summary of this gem's description.
2426
2451
 
2427
- def summary= str
2452
+ def summary=(str)
2428
2453
  @summary = str.to_s.strip.
2429
2454
  gsub(/(\w-)\n[ \t]*(\w)/, '\1\2').gsub(/\n[ \t]*/, " ") # so. weird.
2430
2455
  end
@@ -2433,13 +2458,13 @@ class Gem::Specification < Gem::BasicSpecification
2433
2458
  # Singular accessor for #test_files
2434
2459
 
2435
2460
  def test_file # :nodoc:
2436
- val = test_files and val.first
2461
+ (val = test_files) && val.first
2437
2462
  end
2438
2463
 
2439
2464
  ##
2440
2465
  # Singular mutator for #test_files
2441
2466
 
2442
- def test_file= file # :nodoc:
2467
+ def test_file=(file) # :nodoc:
2443
2468
  self.test_files = [file]
2444
2469
  end
2445
2470
 
@@ -2451,11 +2476,11 @@ class Gem::Specification < Gem::BasicSpecification
2451
2476
  # Handle the possibility that we have @test_suite_file but not
2452
2477
  # @test_files. This will happen when an old gem is loaded via
2453
2478
  # YAML.
2454
- if defined? @test_suite_file then
2479
+ if defined? @test_suite_file
2455
2480
  @test_files = [@test_suite_file].flatten
2456
2481
  @test_suite_file = nil
2457
2482
  end
2458
- if defined?(@test_files) and @test_files then
2483
+ if defined?(@test_files) && @test_files
2459
2484
  @test_files
2460
2485
  else
2461
2486
  @test_files = []
@@ -2479,13 +2504,13 @@ class Gem::Specification < Gem::BasicSpecification
2479
2504
 
2480
2505
  result << " s.name = #{ruby_code name}"
2481
2506
  result << " s.version = #{ruby_code version}"
2482
- unless platform.nil? or platform == Gem::Platform::RUBY then
2507
+ unless platform.nil? || platform == Gem::Platform::RUBY
2483
2508
  result << " s.platform = #{ruby_code original_platform}"
2484
2509
  end
2485
2510
  result << ""
2486
2511
  result << " s.required_rubygems_version = #{ruby_code required_rubygems_version} if s.respond_to? :required_rubygems_version="
2487
2512
 
2488
- if metadata and !metadata.empty?
2513
+ if metadata && !metadata.empty?
2489
2514
  result << " s.metadata = #{ruby_code metadata} if s.respond_to? :metadata="
2490
2515
  end
2491
2516
  result << " s.require_paths = #{ruby_code raw_require_paths}"
@@ -2500,52 +2525,36 @@ class Gem::Specification < Gem::BasicSpecification
2500
2525
  :version,
2501
2526
  :has_rdoc,
2502
2527
  :default_executable,
2503
- :metadata
2528
+ :metadata,
2529
+ :signing_key,
2504
2530
  ]
2505
2531
 
2506
2532
  @@attributes.each do |attr_name|
2507
2533
  next if handled.include? attr_name
2508
- current_value = self.send(attr_name)
2509
- if current_value != default_value(attr_name) or
2510
- self.class.required_attribute? attr_name then
2534
+ current_value = send(attr_name)
2535
+ if current_value != default_value(attr_name) || self.class.required_attribute?(attr_name)
2511
2536
  result << " s.#{attr_name} = #{ruby_code current_value}"
2512
2537
  end
2513
2538
  end
2514
2539
 
2515
- if @installed_by_version then
2540
+ if String === signing_key
2541
+ result << " s.signing_key = #{ruby_code signing_key}"
2542
+ end
2543
+
2544
+ if @installed_by_version
2516
2545
  result << nil
2517
- result << " s.installed_by_version = \"#{Gem::VERSION}\" if s.respond_to? :installed_by_version"
2546
+ result << " s.installed_by_version = #{ruby_code Gem::VERSION} if s.respond_to? :installed_by_version"
2518
2547
  end
2519
2548
 
2520
- unless dependencies.empty? then
2549
+ unless dependencies.empty?
2521
2550
  result << nil
2522
- result << " if s.respond_to? :specification_version then"
2523
- result << " s.specification_version = #{specification_version}"
2551
+ result << " s.specification_version = #{specification_version}"
2524
2552
  result << nil
2525
2553
 
2526
- result << " if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then"
2527
-
2528
2554
  dependencies.each do |dep|
2529
- req = dep.requirements_list.inspect
2530
2555
  dep.instance_variable_set :@type, :runtime if dep.type.nil? # HACK
2531
- result << " s.add_#{dep.type}_dependency(%q<#{dep.name}>.freeze, #{req})"
2532
- end
2533
-
2534
- result << " else"
2535
-
2536
- dependencies.each do |dep|
2537
- version_reqs_param = dep.requirements_list.inspect
2538
- result << " s.add_dependency(%q<#{dep.name}>.freeze, #{version_reqs_param})"
2539
- end
2540
-
2541
- result << ' end'
2542
-
2543
- result << " else"
2544
- dependencies.each do |dep|
2545
- version_reqs_param = dep.requirements_list.inspect
2546
- result << " s.add_dependency(%q<#{dep.name}>.freeze, #{version_reqs_param})"
2556
+ result << " s.add_#{dep.type}_dependency(%q<#{dep.name}>.freeze, #{ruby_code dep.requirements_list})"
2547
2557
  end
2548
- result << " end"
2549
2558
  end
2550
2559
 
2551
2560
  result << "end"
@@ -2576,45 +2585,38 @@ class Gem::Specification < Gem::BasicSpecification
2576
2585
  end
2577
2586
 
2578
2587
  def to_yaml(opts = {}) # :nodoc:
2579
- if (YAML.const_defined?(:ENGINE) && !YAML::ENGINE.syck?) ||
2580
- (defined?(Psych) && YAML == Psych) then
2581
- # Because the user can switch the YAML engine behind our
2582
- # back, we have to check again here to make sure that our
2583
- # psych code was properly loaded, and load it if not.
2584
- unless Gem.const_defined?(:NoAliasYAMLTree)
2585
- require 'rubygems/psych_tree'
2586
- end
2588
+ Gem.load_yaml
2587
2589
 
2588
- builder = Gem::NoAliasYAMLTree.create
2589
- builder << self
2590
- ast = builder.tree
2590
+ # Because the user can switch the YAML engine behind our
2591
+ # back, we have to check again here to make sure that our
2592
+ # psych code was properly loaded, and load it if not.
2593
+ unless Gem.const_defined?(:NoAliasYAMLTree)
2594
+ require_relative "psych_tree"
2595
+ end
2591
2596
 
2592
- io = StringIO.new
2593
- io.set_encoding Encoding::UTF_8 if Object.const_defined? :Encoding
2597
+ builder = Gem::NoAliasYAMLTree.create
2598
+ builder << self
2599
+ ast = builder.tree
2594
2600
 
2595
- Psych::Visitors::Emitter.new(io).accept(ast)
2601
+ require "stringio"
2602
+ io = StringIO.new
2603
+ io.set_encoding Encoding::UTF_8
2596
2604
 
2597
- io.string.gsub(/ !!null \n/, " \n")
2598
- else
2599
- YAML.quick_emit object_id, opts do |out|
2600
- out.map taguri, to_yaml_style do |map|
2601
- encode_with map
2602
- end
2603
- end
2604
- end
2605
+ Psych::Visitors::Emitter.new(io).accept(ast)
2606
+
2607
+ io.string.gsub(/ !!null \n/, " \n")
2605
2608
  end
2606
2609
 
2607
2610
  ##
2608
2611
  # Recursively walk dependencies of this spec, executing the +block+ for each
2609
2612
  # hop.
2610
2613
 
2611
- def traverse trail = [], visited = {}, &block
2614
+ def traverse(trail = [], visited = {}, &block)
2612
2615
  trail.push(self)
2613
2616
  begin
2614
- dependencies.each do |dep|
2615
- next unless dep.runtime?
2616
- dep.to_specs.reverse_each do |dep_spec|
2617
- next if visited.has_key?(dep_spec)
2617
+ runtime_dependencies.each do |dep|
2618
+ dep.matching_specs(true).each do |dep_spec|
2619
+ next if visited.key?(dep_spec)
2618
2620
  visited[dep_spec] = true
2619
2621
  trail.push(dep_spec)
2620
2622
  begin
@@ -2622,11 +2624,10 @@ class Gem::Specification < Gem::BasicSpecification
2622
2624
  ensure
2623
2625
  trail.pop
2624
2626
  end
2625
- unless result == :next
2626
- spec_name = dep_spec.name
2627
- dep_spec.traverse(trail, visited, &block) unless
2628
- trail.any? { |s| s.name == spec_name }
2629
- end
2627
+ next if result == :next
2628
+ spec_name = dep_spec.name
2629
+ dep_spec.traverse(trail, visited, &block) unless
2630
+ trail.any? {|s| s.name == spec_name }
2630
2631
  end
2631
2632
  end
2632
2633
  ensure
@@ -2641,317 +2642,45 @@ class Gem::Specification < Gem::BasicSpecification
2641
2642
  # Raises InvalidSpecificationException if the spec does not pass the
2642
2643
  # checks..
2643
2644
 
2644
- def validate packaging = true
2645
- @warnings = 0
2646
- require 'rubygems/user_interaction'
2647
- extend Gem::UserInteraction
2645
+ def validate(packaging = true, strict = false)
2648
2646
  normalize
2649
2647
 
2650
- nil_attributes = self.class.non_nil_attributes.find_all do |attrname|
2651
- instance_variable_get("@#{attrname}").nil?
2652
- end
2653
-
2654
- unless nil_attributes.empty? then
2655
- raise Gem::InvalidSpecificationException,
2656
- "#{nil_attributes.join ', '} must not be nil"
2657
- end
2658
-
2659
- if packaging and rubygems_version != Gem::VERSION then
2660
- raise Gem::InvalidSpecificationException,
2661
- "expected RubyGems version #{Gem::VERSION}, was #{rubygems_version}"
2662
- end
2663
-
2664
- @@required_attributes.each do |symbol|
2665
- unless self.send symbol then
2666
- raise Gem::InvalidSpecificationException,
2667
- "missing value for attribute #{symbol}"
2668
- end
2669
- end
2670
-
2671
- unless String === name then
2672
- raise Gem::InvalidSpecificationException,
2673
- "invalid value for attribute name: \"#{name.inspect}\""
2674
- end
2675
-
2676
- if raw_require_paths.empty? then
2677
- raise Gem::InvalidSpecificationException,
2678
- 'specification must have at least one require_path'
2679
- end
2680
-
2681
- @files.delete_if { |x| File.directory?(x) && !File.symlink?(x) }
2682
- @test_files.delete_if { |x| File.directory?(x) && !File.symlink?(x) }
2683
- @executables.delete_if { |x| File.directory?(File.join(@bindir, x)) }
2684
- @extra_rdoc_files.delete_if { |x| File.directory?(x) && !File.symlink?(x) }
2685
- @extensions.delete_if { |x| File.directory?(x) && !File.symlink?(x) }
2686
-
2687
- non_files = files.reject { |x| File.file?(x) || File.symlink?(x) }
2688
-
2689
- unless not packaging or non_files.empty? then
2690
- raise Gem::InvalidSpecificationException,
2691
- "[\"#{non_files.join "\", \""}\"] are not files"
2692
- end
2693
-
2694
- if files.include? file_name then
2695
- raise Gem::InvalidSpecificationException,
2696
- "#{full_name} contains itself (#{file_name}), check your files list"
2697
- end
2698
-
2699
- unless specification_version.is_a?(Fixnum)
2700
- raise Gem::InvalidSpecificationException,
2701
- 'specification_version must be a Fixnum (did you mean version?)'
2702
- end
2703
-
2704
- case platform
2705
- when Gem::Platform, Gem::Platform::RUBY then # ok
2706
- else
2707
- raise Gem::InvalidSpecificationException,
2708
- "invalid platform #{platform.inspect}, see Gem::Platform"
2709
- end
2710
-
2711
- self.class.array_attributes.each do |field|
2712
- val = self.send field
2713
- klass = case field
2714
- when :dependencies
2715
- Gem::Dependency
2716
- else
2717
- String
2718
- end
2719
-
2720
- unless Array === val and val.all? { |x| x.kind_of?(klass) } then
2721
- raise(Gem::InvalidSpecificationException,
2722
- "#{field} must be an Array of #{klass}")
2723
- end
2724
- end
2725
-
2726
- [:authors].each do |field|
2727
- val = self.send field
2728
- raise Gem::InvalidSpecificationException, "#{field} may not be empty" if
2729
- val.empty?
2730
- end
2731
-
2732
- unless Hash === metadata
2733
- raise Gem::InvalidSpecificationException,
2734
- 'metadata must be a hash'
2735
- end
2736
-
2737
- metadata.keys.each do |k|
2738
- if !k.kind_of?(String)
2739
- raise Gem::InvalidSpecificationException,
2740
- 'metadata keys must be a String'
2741
- end
2742
-
2743
- if k.size > 128
2744
- raise Gem::InvalidSpecificationException,
2745
- "metadata key too large (#{k.size} > 128)"
2746
- end
2747
- end
2748
-
2749
- metadata.values.each do |k|
2750
- if !k.kind_of?(String)
2751
- raise Gem::InvalidSpecificationException,
2752
- 'metadata values must be a String'
2753
- end
2754
-
2755
- if k.size > 1024
2756
- raise Gem::InvalidSpecificationException,
2757
- "metadata value too large (#{k.size} > 1024)"
2758
- end
2759
- end
2760
-
2761
- licenses.each { |license|
2762
- if license.length > 64
2763
- raise Gem::InvalidSpecificationException,
2764
- "each license must be 64 characters or less"
2765
- end
2766
-
2767
- if !Gem::Licenses.match?(license)
2768
- suggestions = Gem::Licenses.suggestions(license)
2769
- message = <<-warning
2770
- license value '#{license}' is invalid. Use a license identifier from
2771
- http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license.
2772
- warning
2773
- message += "Did you mean #{suggestions.map { |s| "'#{s}'"}.join(', ')}?\n" unless suggestions.nil?
2774
- warning(message)
2775
- end
2776
- }
2777
-
2778
- warning <<-warning if licenses.empty?
2779
- licenses is empty, but is recommended. Use a license identifier from
2780
- http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license.
2781
- warning
2782
-
2783
- validate_permissions
2784
-
2785
- # reject lazy developers:
2786
-
2787
- lazy = '"FIxxxXME" or "TOxxxDO"'.gsub(/xxx/, '')
2788
-
2789
- unless authors.grep(/FI XME|TO DO/x).empty? then
2790
- raise Gem::InvalidSpecificationException, "#{lazy} is not an author"
2791
- end
2792
-
2793
- unless Array(email).grep(/FI XME|TO DO/x).empty? then
2794
- raise Gem::InvalidSpecificationException, "#{lazy} is not an email"
2795
- end
2796
-
2797
- if description =~ /FI XME|TO DO/x then
2798
- raise Gem::InvalidSpecificationException, "#{lazy} is not a description"
2799
- end
2800
-
2801
- if summary =~ /FI XME|TO DO/x then
2802
- raise Gem::InvalidSpecificationException, "#{lazy} is not a summary"
2803
- end
2804
-
2805
- if homepage and not homepage.empty? and
2806
- homepage !~ /\A[a-z][a-z\d+.-]*:/i then
2807
- raise Gem::InvalidSpecificationException,
2808
- "\"#{homepage}\" is not a URI"
2809
- end
2810
-
2811
- # Warnings
2812
-
2813
- %w[author email homepage summary].each do |attribute|
2814
- value = self.send attribute
2815
- warning "no #{attribute} specified" if value.nil? or value.empty?
2816
- end
2817
-
2818
- if description == summary then
2819
- warning 'description and summary are identical'
2820
- end
2821
-
2822
- # TODO: raise at some given date
2823
- warning "deprecated autorequire specified" if autorequire
2824
-
2825
- executables.each do |executable|
2826
- executable_path = File.join(bindir, executable)
2827
- shebang = File.read(executable_path, 2) == '#!'
2828
-
2829
- warning "#{executable_path} is missing #! line" unless shebang
2830
- end
2831
-
2832
- files.each do |file|
2833
- next unless File.symlink?(file)
2834
- warning "#{file} is a symlink, which is not supported on all platforms"
2835
- end
2836
-
2837
- validate_dependencies
2838
-
2839
- true
2840
- ensure
2841
- if $! or @warnings > 0 then
2842
- alert_warning "See http://guides.rubygems.org/specification-reference/ for help"
2843
- end
2648
+ validation_policy = Gem::SpecificationPolicy.new(self)
2649
+ validation_policy.packaging = packaging
2650
+ validation_policy.validate(strict)
2844
2651
  end
2845
2652
 
2846
- ##
2847
- # Checks that dependencies use requirements as we recommend. Warnings are
2848
- # issued when dependencies are open-ended or overly strict for semantic
2849
- # versioning.
2850
-
2851
- def validate_dependencies # :nodoc:
2852
- # NOTE: see REFACTOR note in Gem::Dependency about types - this might be brittle
2853
- seen = Gem::Dependency::TYPES.inject({}) { |types, type| types.merge({ type => {}}) }
2854
-
2855
- error_messages = []
2856
- warning_messages = []
2857
- dependencies.each do |dep|
2858
- if prev = seen[dep.type][dep.name] then
2859
- error_messages << <<-MESSAGE
2860
- duplicate dependency on #{dep}, (#{prev.requirement}) use:
2861
- add_#{dep.type}_dependency '#{dep.name}', '#{dep.requirement}', '#{prev.requirement}'
2862
- MESSAGE
2863
- end
2864
-
2865
- seen[dep.type][dep.name] = dep
2866
-
2867
- prerelease_dep = dep.requirements_list.any? do |req|
2868
- Gem::Requirement.new(req).prerelease?
2869
- end
2870
-
2871
- warning_messages << "prerelease dependency on #{dep} is not recommended" if
2872
- prerelease_dep && !version.prerelease?
2873
-
2874
- overly_strict = dep.requirement.requirements.length == 1 &&
2875
- dep.requirement.requirements.any? do |op, version|
2876
- op == '~>' and
2877
- not version.prerelease? and
2878
- version.segments.length > 2 and
2879
- version.segments.first != 0
2880
- end
2881
-
2882
- if overly_strict then
2883
- _, dep_version = dep.requirement.requirements.first
2884
-
2885
- base = dep_version.segments.first 2
2886
-
2887
- warning_messages << <<-WARNING
2888
- pessimistic dependency on #{dep} may be overly strict
2889
- if #{dep.name} is semantically versioned, use:
2890
- add_#{dep.type}_dependency '#{dep.name}', '~> #{base.join '.'}', '>= #{dep_version}'
2891
- WARNING
2892
- end
2893
-
2894
- open_ended = dep.requirement.requirements.all? do |op, version|
2895
- not version.prerelease? and (op == '>' or op == '>=')
2896
- end
2897
-
2898
- if open_ended then
2899
- op, dep_version = dep.requirement.requirements.first
2900
-
2901
- base = dep_version.segments.first 2
2902
-
2903
- bugfix = if op == '>' then
2904
- ", '> #{dep_version}'"
2905
- elsif op == '>=' and base != dep_version.segments then
2906
- ", '>= #{dep_version}'"
2907
- end
2653
+ def keep_only_files_and_directories
2654
+ @executables.delete_if {|x| File.directory?(File.join(@bindir, x)) }
2655
+ @extensions.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2656
+ @extra_rdoc_files.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2657
+ @files.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2658
+ @test_files.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
2659
+ end
2908
2660
 
2909
- warning_messages << <<-WARNING
2910
- open-ended dependency on #{dep} is not recommended
2911
- if #{dep.name} is semantically versioned, use:
2912
- add_#{dep.type}_dependency '#{dep.name}', '~> #{base.join '.'}'#{bugfix}
2913
- WARNING
2914
- end
2915
- end
2916
- if error_messages.any?
2917
- raise Gem::InvalidSpecificationException, error_messages.join
2918
- end
2919
- if warning_messages.any?
2920
- warning_messages.each { |warning_message| warning warning_message }
2921
- end
2661
+ def validate_metadata
2662
+ Gem::SpecificationPolicy.new(self).validate_metadata
2922
2663
  end
2664
+ rubygems_deprecate :validate_metadata
2923
2665
 
2924
- ##
2925
- # Checks to see if the files to be packaged are world-readable.
2666
+ def validate_dependencies
2667
+ Gem::SpecificationPolicy.new(self).validate_dependencies
2668
+ end
2669
+ rubygems_deprecate :validate_dependencies
2926
2670
 
2927
2671
  def validate_permissions
2928
- return if Gem.win_platform?
2929
-
2930
- files.each do |file|
2931
- next unless File.file?(file)
2932
- next if File.stat(file).mode & 0444 == 0444
2933
- warning "#{file} is not world-readable"
2934
- end
2935
-
2936
- executables.each do |name|
2937
- exec = File.join @bindir, name
2938
- next unless File.file?(exec)
2939
- next if File.stat(exec).executable?
2940
- warning "#{exec} is not executable"
2941
- end
2672
+ Gem::SpecificationPolicy.new(self).validate_permissions
2942
2673
  end
2674
+ rubygems_deprecate :validate_permissions
2943
2675
 
2944
2676
  ##
2945
- # Set the version to +version+, potentially also setting
2946
- # required_rubygems_version if +version+ indicates it is a
2947
- # prerelease.
2677
+ # Set the version to +version+.
2948
2678
 
2949
- def version= version
2679
+ def version=(version)
2950
2680
  @version = Gem::Version.create(version)
2951
- self.required_rubygems_version = '> 1.3.1' if @version.prerelease?
2952
- invalidate_memoized_attributes
2681
+ return if @version.nil?
2953
2682
 
2954
- return @version
2683
+ invalidate_memoized_attributes
2955
2684
  end
2956
2685
 
2957
2686
  def stubbed?
@@ -2963,9 +2692,9 @@ open-ended dependency on #{dep} is not recommended
2963
2692
  case ivar
2964
2693
  when "date"
2965
2694
  # Force Date to go through the extra coerce logic in date=
2966
- self.date = val.untaint
2695
+ self.date = val
2967
2696
  else
2968
- instance_variable_set "@#{ivar}", val.untaint
2697
+ instance_variable_set "@#{ivar}", val
2969
2698
  end
2970
2699
  end
2971
2700
 
@@ -2982,40 +2711,29 @@ open-ended dependency on #{dep} is not recommended
2982
2711
  end
2983
2712
 
2984
2713
  nil_attributes.each do |attribute|
2985
- default = self.default_value attribute
2714
+ default = default_value attribute
2986
2715
 
2987
2716
  value = case default
2988
2717
  when Time, Numeric, Symbol, true, false, nil then default
2989
2718
  else default.dup
2990
- end
2719
+ end
2991
2720
 
2992
2721
  instance_variable_set "@#{attribute}", value
2993
2722
  end
2994
2723
 
2995
2724
  @installed_by_version ||= nil
2725
+
2726
+ nil
2996
2727
  end
2997
2728
 
2998
- def warning statement # :nodoc:
2999
- @warnings += 1
2729
+ def flatten_require_paths # :nodoc:
2730
+ return unless raw_require_paths.first.is_a?(Array)
3000
2731
 
3001
- alert_warning statement
2732
+ 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"
2733
+ raw_require_paths.flatten!
3002
2734
  end
3003
2735
 
3004
2736
  def raw_require_paths # :nodoc:
3005
2737
  @require_paths
3006
2738
  end
3007
-
3008
- extend Gem::Deprecate
3009
-
3010
- # TODO:
3011
- # deprecate :has_rdoc, :none, 2011, 10
3012
- # deprecate :has_rdoc?, :none, 2011, 10
3013
- # deprecate :has_rdoc=, :none, 2011, 10
3014
- # deprecate :default_executable, :none, 2011, 10
3015
- # deprecate :default_executable=, :none, 2011, 10
3016
- # deprecate :file_name, :cache_file, 2011, 10
3017
- # deprecate :full_gem_path, :cache_file, 2011, 10
3018
2739
  end
3019
-
3020
- # DOC: What is this and why is it here, randomly, at the end of this file?
3021
- Gem.clear_paths