rubygems-update 2.6.1 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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