rubygems-update 2.7.11 → 3.0.9

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 (359) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +67 -0
  3. data/.travis.yml +24 -18
  4. data/CODE_OF_CONDUCT.md +10 -8
  5. data/CONTRIBUTING.md +148 -0
  6. data/History.txt +458 -8
  7. data/MAINTAINERS.txt +1 -0
  8. data/Manifest.txt +16 -9
  9. data/POLICIES.md +92 -0
  10. data/README.md +53 -26
  11. data/Rakefile +77 -211
  12. data/{UPGRADING.rdoc → UPGRADING.md} +31 -32
  13. data/appveyor.yml +20 -45
  14. data/bin/gem +1 -2
  15. data/bin/update_rubygems +2 -3
  16. data/bundler/CHANGELOG.md +65 -0
  17. data/bundler/bundler.gemspec +7 -1
  18. data/bundler/lib/bundler/build_metadata.rb +1 -1
  19. data/bundler/lib/bundler/cli/add.rb +15 -5
  20. data/bundler/lib/bundler/cli/binstubs.rb +8 -2
  21. data/bundler/lib/bundler/cli/doctor.rb +47 -1
  22. data/bundler/lib/bundler/cli/install.rb +8 -5
  23. data/bundler/lib/bundler/cli/list.rb +41 -5
  24. data/bundler/lib/bundler/cli/outdated.rb +7 -1
  25. data/bundler/lib/bundler/cli/pristine.rb +4 -0
  26. data/bundler/lib/bundler/cli/remove.rb +18 -0
  27. data/bundler/lib/bundler/cli.rb +63 -21
  28. data/bundler/lib/bundler/definition.rb +15 -16
  29. data/bundler/lib/bundler/dependency.rb +2 -2
  30. data/bundler/lib/bundler/dsl.rb +19 -3
  31. data/bundler/lib/bundler/feature_flag.rb +7 -0
  32. data/bundler/lib/bundler/gem_version_promoter.rb +4 -2
  33. data/bundler/lib/bundler/injector.rb +168 -9
  34. data/bundler/lib/bundler/installer/parallel_installer.rb +5 -0
  35. data/bundler/lib/bundler/installer.rb +29 -6
  36. data/bundler/lib/bundler/plugin/events.rb +61 -0
  37. data/bundler/lib/bundler/plugin.rb +10 -3
  38. data/bundler/lib/bundler/resolver.rb +2 -2
  39. data/bundler/lib/bundler/rubygems_gem_installer.rb +7 -0
  40. data/bundler/lib/bundler/runtime.rb +8 -2
  41. data/bundler/lib/bundler/settings/validator.rb +23 -0
  42. data/bundler/lib/bundler/settings.rb +24 -3
  43. data/bundler/lib/bundler/shared_helpers.rb +19 -3
  44. data/bundler/lib/bundler/source/metadata.rb +2 -3
  45. data/bundler/lib/bundler/source.rb +9 -9
  46. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  47. data/bundler/lib/bundler/version.rb +1 -1
  48. data/bundler/lib/bundler.rb +26 -8
  49. data/bundler/man/bundle-add.ronn +13 -2
  50. data/bundler/man/bundle-config.ronn +21 -0
  51. data/bundler/man/bundle-install.ronn +1 -1
  52. data/bundler/man/bundle-list.ronn +19 -1
  53. data/bundler/man/bundle-outdated.ronn +4 -0
  54. data/bundler/man/bundle-remove.ronn +23 -0
  55. data/bundler/man/bundle-update.ronn +1 -1
  56. data/bundler/man/bundle.ronn +3 -0
  57. data/lib/rubygems/available_set.rb +1 -1
  58. data/lib/rubygems/basic_specification.rb +12 -12
  59. data/lib/rubygems/bundler_version_finder.rb +3 -3
  60. data/lib/rubygems/command.rb +22 -15
  61. data/lib/rubygems/command_manager.rb +22 -5
  62. data/lib/rubygems/commands/build_command.rb +41 -7
  63. data/lib/rubygems/commands/cert_command.rb +45 -24
  64. data/lib/rubygems/commands/check_command.rb +1 -1
  65. data/lib/rubygems/commands/cleanup_command.rb +14 -7
  66. data/lib/rubygems/commands/contents_command.rb +14 -15
  67. data/lib/rubygems/commands/dependency_command.rb +17 -17
  68. data/lib/rubygems/commands/environment_command.rb +20 -1
  69. data/lib/rubygems/commands/fetch_command.rb +2 -3
  70. data/lib/rubygems/commands/generate_index_command.rb +2 -3
  71. data/lib/rubygems/commands/help_command.rb +12 -13
  72. data/lib/rubygems/commands/info_command.rb +33 -0
  73. data/lib/rubygems/commands/install_command.rb +21 -17
  74. data/lib/rubygems/commands/list_command.rb +0 -1
  75. data/lib/rubygems/commands/lock_command.rb +3 -4
  76. data/lib/rubygems/commands/open_command.rb +16 -10
  77. data/lib/rubygems/commands/owner_command.rb +21 -7
  78. data/lib/rubygems/commands/pristine_command.rb +23 -16
  79. data/lib/rubygems/commands/push_command.rb +19 -8
  80. data/lib/rubygems/commands/query_command.rb +24 -24
  81. data/lib/rubygems/commands/rdoc_command.rb +3 -4
  82. data/lib/rubygems/commands/search_command.rb +0 -1
  83. data/lib/rubygems/commands/server_command.rb +1 -2
  84. data/lib/rubygems/commands/setup_command.rb +86 -48
  85. data/lib/rubygems/commands/signin_command.rb +2 -1
  86. data/lib/rubygems/commands/signout_command.rb +2 -2
  87. data/lib/rubygems/commands/sources_command.rb +11 -12
  88. data/lib/rubygems/commands/specification_command.rb +7 -7
  89. data/lib/rubygems/commands/uninstall_command.rb +50 -18
  90. data/lib/rubygems/commands/unpack_command.rb +16 -7
  91. data/lib/rubygems/commands/update_command.rb +28 -23
  92. data/lib/rubygems/commands/which_command.rb +5 -8
  93. data/lib/rubygems/commands/yank_command.rb +1 -2
  94. data/lib/rubygems/compatibility.rb +1 -21
  95. data/lib/rubygems/config_file.rb +36 -36
  96. data/lib/rubygems/core_ext/kernel_require.rb +6 -6
  97. data/lib/rubygems/core_ext/kernel_warn.rb +45 -0
  98. data/lib/rubygems/defaults.rb +31 -19
  99. data/lib/rubygems/dependency.rb +15 -15
  100. data/lib/rubygems/dependency_installer.rb +30 -33
  101. data/lib/rubygems/dependency_list.rb +9 -10
  102. data/lib/rubygems/deprecate.rb +2 -3
  103. data/lib/rubygems/doctor.rb +5 -6
  104. data/lib/rubygems/errors.rb +3 -3
  105. data/lib/rubygems/exceptions.rb +11 -8
  106. data/lib/rubygems/ext/build_error.rb +0 -1
  107. data/lib/rubygems/ext/builder.rb +50 -23
  108. data/lib/rubygems/ext/cmake_builder.rb +2 -2
  109. data/lib/rubygems/ext/configure_builder.rb +2 -3
  110. data/lib/rubygems/ext/ext_conf_builder.rb +8 -7
  111. data/lib/rubygems/ext/rake_builder.rb +16 -18
  112. data/lib/rubygems/ext.rb +0 -1
  113. data/lib/rubygems/gem_runner.rb +2 -2
  114. data/lib/rubygems/gemcutter_utilities.rb +46 -12
  115. data/lib/rubygems/indexer.rb +19 -12
  116. data/lib/rubygems/install_default_message.rb +0 -1
  117. data/lib/rubygems/install_message.rb +0 -1
  118. data/lib/rubygems/install_update_options.rb +3 -29
  119. data/lib/rubygems/installer.rb +97 -55
  120. data/lib/rubygems/installer_test_case.rb +2 -16
  121. data/lib/rubygems/local_remote_options.rb +5 -4
  122. data/lib/rubygems/mock_gem_ui.rb +3 -4
  123. data/lib/rubygems/name_tuple.rb +4 -4
  124. data/lib/rubygems/package/digest_io.rb +3 -4
  125. data/lib/rubygems/package/file_source.rb +3 -4
  126. data/lib/rubygems/package/io_source.rb +1 -2
  127. data/lib/rubygems/package/old.rb +8 -16
  128. data/lib/rubygems/package/source.rb +0 -1
  129. data/lib/rubygems/package/tar_header.rb +13 -4
  130. data/lib/rubygems/package/tar_reader/entry.rb +20 -4
  131. data/lib/rubygems/package/tar_reader.rb +2 -4
  132. data/lib/rubygems/package/tar_test_case.rb +2 -8
  133. data/lib/rubygems/package/tar_writer.rb +13 -15
  134. data/lib/rubygems/package.rb +90 -63
  135. data/lib/rubygems/package_task.rb +0 -1
  136. data/lib/rubygems/path_support.rb +16 -6
  137. data/lib/rubygems/platform.rb +4 -5
  138. data/lib/rubygems/psych_tree.rb +1 -1
  139. data/lib/rubygems/rdoc.rb +2 -313
  140. data/lib/rubygems/remote_fetcher.rb +29 -82
  141. data/lib/rubygems/request/connection_pools.rb +24 -13
  142. data/lib/rubygems/request/http_pool.rb +3 -4
  143. data/lib/rubygems/request/https_pool.rb +1 -3
  144. data/lib/rubygems/request.rb +17 -16
  145. data/lib/rubygems/request_set/gem_dependency_api.rb +46 -49
  146. data/lib/rubygems/request_set/lockfile/parser.rb +18 -29
  147. data/lib/rubygems/request_set/lockfile/tokenizer.rb +9 -9
  148. data/lib/rubygems/request_set/lockfile.rb +12 -12
  149. data/lib/rubygems/request_set.rb +52 -25
  150. data/lib/rubygems/requirement.rb +32 -21
  151. data/lib/rubygems/resolver/activation_request.rb +6 -6
  152. data/lib/rubygems/resolver/api_set.rb +5 -6
  153. data/lib/rubygems/resolver/api_specification.rb +2 -3
  154. data/lib/rubygems/resolver/best_set.rb +5 -6
  155. data/lib/rubygems/resolver/composed_set.rb +5 -6
  156. data/lib/rubygems/resolver/conflict.rb +5 -5
  157. data/lib/rubygems/resolver/current_set.rb +1 -2
  158. data/lib/rubygems/resolver/dependency_request.rb +4 -4
  159. data/lib/rubygems/resolver/git_set.rb +5 -6
  160. data/lib/rubygems/resolver/git_specification.rb +4 -5
  161. data/lib/rubygems/resolver/index_set.rb +5 -6
  162. data/lib/rubygems/resolver/index_specification.rb +3 -4
  163. data/lib/rubygems/resolver/installed_specification.rb +3 -4
  164. data/lib/rubygems/resolver/installer_set.rb +12 -12
  165. data/lib/rubygems/resolver/local_specification.rb +1 -2
  166. data/lib/rubygems/resolver/lock_set.rb +5 -6
  167. data/lib/rubygems/resolver/lock_specification.rb +7 -8
  168. data/lib/rubygems/resolver/requirement_list.rb +1 -1
  169. data/lib/rubygems/resolver/set.rb +2 -2
  170. data/lib/rubygems/resolver/source_set.rb +4 -5
  171. data/lib/rubygems/resolver/spec_specification.rb +1 -2
  172. data/lib/rubygems/resolver/specification.rb +10 -7
  173. data/lib/rubygems/resolver/stats.rb +1 -1
  174. data/lib/rubygems/resolver/vendor_set.rb +4 -5
  175. data/lib/rubygems/resolver/vendor_specification.rb +2 -3
  176. data/lib/rubygems/resolver.rb +14 -16
  177. data/lib/rubygems/s3_uri_signer.rb +183 -0
  178. data/lib/rubygems/safe_yaml.rb +18 -10
  179. data/lib/rubygems/security/policies.rb +1 -2
  180. data/lib/rubygems/security/policy.rb +25 -25
  181. data/lib/rubygems/security/signer.rb +72 -24
  182. data/lib/rubygems/security/trust_dir.rb +10 -10
  183. data/lib/rubygems/security.rb +21 -22
  184. data/lib/rubygems/security_option.rb +0 -1
  185. data/lib/rubygems/server.rb +21 -21
  186. data/lib/rubygems/source/git.rb +9 -10
  187. data/lib/rubygems/source/installed.rb +3 -4
  188. data/lib/rubygems/source/local.rb +7 -7
  189. data/lib/rubygems/source/lock.rb +4 -4
  190. data/lib/rubygems/source/specific_file.rb +5 -5
  191. data/lib/rubygems/source/vendor.rb +2 -3
  192. data/lib/rubygems/source.rb +16 -25
  193. data/lib/rubygems/source_list.rb +2 -2
  194. data/lib/rubygems/source_local.rb +0 -1
  195. data/lib/rubygems/spec_fetcher.rb +5 -6
  196. data/lib/rubygems/specification.rb +219 -558
  197. data/lib/rubygems/specification_policy.rb +407 -0
  198. data/lib/rubygems/stub_specification.rb +12 -17
  199. data/lib/rubygems/test_case.rb +161 -75
  200. data/lib/rubygems/test_utilities.rb +20 -35
  201. data/lib/rubygems/text.rb +6 -6
  202. data/lib/rubygems/uninstaller.rb +38 -27
  203. data/lib/rubygems/uri_formatter.rb +1 -2
  204. data/lib/rubygems/user_interaction.rb +37 -89
  205. data/lib/rubygems/util/licenses.rb +27 -1
  206. data/lib/rubygems/util/list.rb +1 -1
  207. data/lib/rubygems/util.rb +32 -14
  208. data/lib/rubygems/validator.rb +4 -5
  209. data/lib/rubygems/version.rb +15 -15
  210. data/lib/rubygems/version_option.rb +2 -3
  211. data/lib/rubygems.rb +71 -102
  212. data/rubygems-update.gemspec +43 -0
  213. data/setup.rb +2 -8
  214. data/test/rubygems/ca_cert.pem +74 -65
  215. data/test/rubygems/client.pem +103 -45
  216. data/test/rubygems/rubygems_plugin.rb +0 -1
  217. data/test/rubygems/simple_gem.rb +1 -1
  218. data/test/rubygems/ssl_cert.pem +78 -17
  219. data/test/rubygems/ssl_key.pem +25 -13
  220. data/test/rubygems/test_bundled_ca.rb +1 -1
  221. data/test/rubygems/test_config.rb +7 -2
  222. data/test/rubygems/test_gem.rb +205 -132
  223. data/test/rubygems/test_gem_bundler_version_finder.rb +4 -0
  224. data/test/rubygems/test_gem_command.rb +0 -1
  225. data/test/rubygems/test_gem_command_manager.rb +18 -3
  226. data/test/rubygems/test_gem_commands_build_command.rb +220 -15
  227. data/test/rubygems/test_gem_commands_cert_command.rb +69 -8
  228. data/test/rubygems/test_gem_commands_check_command.rb +1 -1
  229. data/test/rubygems/test_gem_commands_cleanup_command.rb +27 -1
  230. data/test/rubygems/test_gem_commands_contents_command.rb +1 -2
  231. data/test/rubygems/test_gem_commands_dependency_command.rb +33 -34
  232. data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
  233. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -1
  234. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -1
  235. data/test/rubygems/test_gem_commands_help_command.rb +7 -4
  236. data/test/rubygems/test_gem_commands_info_command.rb +44 -0
  237. data/test/rubygems/test_gem_commands_install_command.rb +79 -12
  238. data/test/rubygems/test_gem_commands_lock_command.rb +0 -1
  239. data/test/rubygems/test_gem_commands_open_command.rb +29 -0
  240. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -1
  241. data/test/rubygems/test_gem_commands_owner_command.rb +93 -57
  242. data/test/rubygems/test_gem_commands_pristine_command.rb +65 -30
  243. data/test/rubygems/test_gem_commands_push_command.rb +54 -0
  244. data/test/rubygems/test_gem_commands_query_command.rb +102 -100
  245. data/test/rubygems/test_gem_commands_search_command.rb +0 -1
  246. data/test/rubygems/test_gem_commands_server_command.rb +0 -1
  247. data/test/rubygems/test_gem_commands_setup_command.rb +50 -15
  248. data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
  249. data/test/rubygems/test_gem_commands_sources_command.rb +0 -1
  250. data/test/rubygems/test_gem_commands_specification_command.rb +2 -3
  251. data/test/rubygems/test_gem_commands_stale_command.rb +3 -2
  252. data/test/rubygems/test_gem_commands_uninstall_command.rb +161 -8
  253. data/test/rubygems/test_gem_commands_unpack_command.rb +17 -1
  254. data/test/rubygems/test_gem_commands_update_command.rb +19 -2
  255. data/test/rubygems/test_gem_commands_which_command.rb +0 -1
  256. data/test/rubygems/test_gem_commands_yank_command.rb +0 -1
  257. data/test/rubygems/test_gem_config_file.rb +4 -2
  258. data/test/rubygems/test_gem_dependency.rb +0 -1
  259. data/test/rubygems/test_gem_dependency_installer.rb +8 -5
  260. data/test/rubygems/test_gem_dependency_list.rb +6 -7
  261. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -1
  262. data/test/rubygems/test_gem_doctor.rb +1 -2
  263. data/test/rubygems/test_gem_ext_builder.rb +10 -23
  264. data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -4
  265. data/test/rubygems/test_gem_ext_configure_builder.rb +3 -3
  266. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +8 -9
  267. data/test/rubygems/test_gem_ext_rake_builder.rb +20 -5
  268. data/test/rubygems/test_gem_gem_runner.rb +0 -1
  269. data/test/rubygems/test_gem_gemcutter_utilities.rb +32 -6
  270. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -1
  271. data/test/rubygems/test_gem_indexer.rb +16 -10
  272. data/test/rubygems/test_gem_install_update_options.rb +1 -20
  273. data/test/rubygems/test_gem_installer.rb +154 -119
  274. data/test/rubygems/test_gem_local_remote_options.rb +3 -3
  275. data/test/rubygems/test_gem_name_tuple.rb +0 -1
  276. data/test/rubygems/test_gem_package.rb +77 -31
  277. data/test/rubygems/test_gem_package_old.rb +0 -1
  278. data/test/rubygems/test_gem_package_tar_header.rb +42 -2
  279. data/test/rubygems/test_gem_package_tar_reader.rb +0 -1
  280. data/test/rubygems/test_gem_package_tar_reader_entry.rb +11 -0
  281. data/test/rubygems/test_gem_package_tar_writer.rb +43 -7
  282. data/test/rubygems/test_gem_package_task.rb +2 -2
  283. data/test/rubygems/test_gem_path_support.rb +28 -11
  284. data/test/rubygems/test_gem_platform.rb +4 -5
  285. data/test/rubygems/test_gem_rdoc.rb +1 -136
  286. data/test/rubygems/test_gem_remote_fetcher.rb +241 -141
  287. data/test/rubygems/test_gem_request.rb +9 -9
  288. data/test/rubygems/test_gem_request_connection_pools.rb +24 -3
  289. data/test/rubygems/test_gem_request_set.rb +5 -5
  290. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +82 -64
  291. data/test/rubygems/test_gem_request_set_lockfile.rb +1 -2
  292. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +4 -9
  293. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
  294. data/test/rubygems/test_gem_requirement.rb +24 -4
  295. data/test/rubygems/test_gem_resolver.rb +13 -17
  296. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -1
  297. data/test/rubygems/test_gem_resolver_api_set.rb +0 -1
  298. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -1
  299. data/test/rubygems/test_gem_resolver_best_set.rb +0 -1
  300. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -1
  301. data/test/rubygems/test_gem_resolver_conflict.rb +0 -1
  302. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -1
  303. data/test/rubygems/test_gem_resolver_git_set.rb +0 -1
  304. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -1
  305. data/test/rubygems/test_gem_resolver_index_set.rb +0 -1
  306. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -1
  307. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -1
  308. data/test/rubygems/test_gem_resolver_installer_set.rb +2 -3
  309. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -1
  310. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -1
  311. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -1
  312. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -1
  313. data/test/rubygems/test_gem_resolver_specification.rb +1 -2
  314. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -1
  315. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -1
  316. data/test/rubygems/test_gem_security.rb +1 -3
  317. data/test/rubygems/test_gem_security_policy.rb +5 -6
  318. data/test/rubygems/test_gem_security_signer.rb +4 -3
  319. data/test/rubygems/test_gem_security_trust_dir.rb +1 -2
  320. data/test/rubygems/test_gem_server.rb +4 -4
  321. data/test/rubygems/test_gem_source.rb +0 -13
  322. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -1
  323. data/test/rubygems/test_gem_source_git.rb +0 -1
  324. data/test/rubygems/test_gem_source_installed.rb +0 -1
  325. data/test/rubygems/test_gem_source_lock.rb +0 -1
  326. data/test/rubygems/test_gem_source_vendor.rb +0 -1
  327. data/test/rubygems/test_gem_spec_fetcher.rb +0 -1
  328. data/test/rubygems/test_gem_specification.rb +366 -198
  329. data/test/rubygems/test_gem_stream_ui.rb +15 -32
  330. data/test/rubygems/test_gem_stub_specification.rb +0 -2
  331. data/test/rubygems/test_gem_text.rb +4 -0
  332. data/test/rubygems/test_gem_uninstaller.rb +42 -3
  333. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -1
  334. data/test/rubygems/test_gem_uri_formatter.rb +0 -1
  335. data/test/rubygems/test_gem_util.rb +31 -11
  336. data/test/rubygems/test_gem_validator.rb +0 -1
  337. data/test/rubygems/test_gem_version.rb +11 -11
  338. data/test/rubygems/test_gem_version_option.rb +0 -1
  339. data/test/rubygems/test_remote_fetch_error.rb +0 -1
  340. data/test/rubygems/test_require.rb +67 -52
  341. data/util/CL2notes +1 -2
  342. data/util/ci +20 -12
  343. data/util/cops/deprecations.rb +52 -0
  344. data/util/create_certs.rb +6 -7
  345. data/util/create_certs.sh +27 -0
  346. data/util/create_encrypted_key.rb +4 -5
  347. data/util/patch_with_prs.rb +1 -1
  348. data/util/rubocop +8 -0
  349. data/util/update_bundled_ca_certificates.rb +12 -13
  350. data/util/update_changelog.rb +1 -1
  351. metadata +61 -51
  352. data/.autotest +0 -71
  353. data/.document +0 -5
  354. data/CONTRIBUTING.rdoc +0 -130
  355. data/CVE-2013-4287.txt +0 -35
  356. data/CVE-2013-4363.txt +0 -45
  357. data/CVE-2015-3900.txt +0 -40
  358. data/POLICIES.rdoc +0 -74
  359. data/test/rubygems/fix_openssl_warnings.rb +0 -13
@@ -3,7 +3,7 @@ class Gem::RequestSet::Lockfile::Parser
3
3
  ###
4
4
  # Parses lockfiles
5
5
 
6
- def initialize tokenizer, set, platforms, filename = nil
6
+ def initialize(tokenizer, set, platforms, filename = nil)
7
7
  @tokens = tokenizer
8
8
  @filename = filename
9
9
  @set = set
@@ -41,10 +41,10 @@ class Gem::RequestSet::Lockfile::Parser
41
41
  ##
42
42
  # Gets the next token for a Lockfile
43
43
 
44
- def get expected_types = nil, expected_value = nil # :nodoc:
44
+ def get(expected_types = nil, expected_value = nil) # :nodoc:
45
45
  token = @tokens.shift
46
46
 
47
- if expected_types and not Array(expected_types).include? token.type then
47
+ if expected_types and not Array(expected_types).include? token.type
48
48
  unget token
49
49
 
50
50
  message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " +
@@ -53,7 +53,7 @@ class Gem::RequestSet::Lockfile::Parser
53
53
  raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename
54
54
  end
55
55
 
56
- if expected_value and expected_value != token.value then
56
+ if expected_value and expected_value != token.value
57
57
  unget token
58
58
 
59
59
  message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " +
@@ -93,7 +93,7 @@ class Gem::RequestSet::Lockfile::Parser
93
93
 
94
94
  get :r_paren
95
95
 
96
- if peek[0] == :bang then
96
+ if peek[0] == :bang
97
97
  requirements.clear
98
98
  requirements << pinned_requirement(token.value)
99
99
 
@@ -144,7 +144,7 @@ class Gem::RequestSet::Lockfile::Parser
144
144
  type = token.type
145
145
  data = token.value
146
146
 
147
- if type == :text and column == 4 then
147
+ if type == :text and column == 4
148
148
  version, platform = data.split '-', 2
149
149
 
150
150
  platform =
@@ -183,7 +183,7 @@ class Gem::RequestSet::Lockfile::Parser
183
183
 
184
184
  type = peek.type
185
185
  value = peek.value
186
- if type == :entry and %w[branch ref tag].include? value then
186
+ if type == :entry and %w[branch ref tag].include? value
187
187
  get
188
188
  get :text
189
189
 
@@ -214,7 +214,7 @@ class Gem::RequestSet::Lockfile::Parser
214
214
  type = token.type
215
215
  data = token.value
216
216
 
217
- if type == :text and column == 4 then
217
+ if type == :text and column == 4
218
218
  last_spec = set.add_git_spec name, data, repository, revision, true
219
219
  else
220
220
  dependency = parse_dependency name, data
@@ -261,7 +261,7 @@ class Gem::RequestSet::Lockfile::Parser
261
261
  type = token.type
262
262
  data = token.value
263
263
 
264
- if type == :text and column == 4 then
264
+ if type == :text and column == 4
265
265
  last_spec = set.add_vendor_gem name, directory
266
266
  else
267
267
  dependency = parse_dependency name, data
@@ -294,7 +294,7 @@ class Gem::RequestSet::Lockfile::Parser
294
294
  # Parses the requirements following the dependency +name+ and the +op+ for
295
295
  # the first token of the requirements and returns a Gem::Dependency object.
296
296
 
297
- def parse_dependency name, op # :nodoc:
297
+ def parse_dependency(name, op) # :nodoc:
298
298
  return Gem::Dependency.new name, op unless peek[0] == :text
299
299
 
300
300
  version = get(:text).value
@@ -314,7 +314,7 @@ class Gem::RequestSet::Lockfile::Parser
314
314
 
315
315
  private
316
316
 
317
- def skip type # :nodoc:
317
+ def skip(type) # :nodoc:
318
318
  @tokens.skip type
319
319
  end
320
320
 
@@ -325,30 +325,19 @@ class Gem::RequestSet::Lockfile::Parser
325
325
  @tokens.peek
326
326
  end
327
327
 
328
- if [].respond_to? :flat_map
329
- def pinned_requirement name # :nodoc:
330
- requirement = Gem::Dependency.new name
331
- specification = @set.sets.flat_map { |set|
332
- set.find_all(requirement)
333
- }.compact.first
328
+ def pinned_requirement(name) # :nodoc:
329
+ requirement = Gem::Dependency.new name
330
+ specification = @set.sets.flat_map { |set|
331
+ set.find_all(requirement)
332
+ }.compact.first
334
333
 
335
- specification && specification.version
336
- end
337
- else # FIXME: remove when 1.8 is dropped
338
- def pinned_requirement name # :nodoc:
339
- requirement = Gem::Dependency.new name
340
- specification = @set.sets.map { |set|
341
- set.find_all(requirement)
342
- }.flatten(1).compact.first
343
-
344
- specification && specification.version
345
- end
334
+ specification && specification.version
346
335
  end
347
336
 
348
337
  ##
349
338
  # Ungets the last token retrieved by #get
350
339
 
351
- def unget token # :nodoc:
340
+ def unget(token) # :nodoc:
352
341
  @tokens.unshift token
353
342
  end
354
343
  end
@@ -5,11 +5,11 @@ class Gem::RequestSet::Lockfile::Tokenizer
5
5
  Token = Struct.new :type, :value, :column, :line
6
6
  EOF = Token.new :EOF
7
7
 
8
- def self.from_file file
8
+ def self.from_file(file)
9
9
  new File.read(file), file
10
10
  end
11
11
 
12
- def initialize input, filename = nil, line = 0, pos = 0
12
+ def initialize(input, filename = nil, line = 0, pos = 0)
13
13
  @line = line
14
14
  @line_pos = pos
15
15
  @tokens = []
@@ -17,7 +17,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
17
17
  tokenize input
18
18
  end
19
19
 
20
- def make_parser set, platforms
20
+ def make_parser(set, platforms)
21
21
  Gem::RequestSet::Lockfile::Parser.new self, set, platforms, @filename
22
22
  end
23
23
 
@@ -25,7 +25,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
25
25
  @tokens.map { |token| [token.type, token.value, token.column, token.line] }
26
26
  end
27
27
 
28
- def skip type
28
+ def skip(type)
29
29
  @tokens.shift while not @tokens.empty? and peek.type == type
30
30
  end
31
31
 
@@ -33,7 +33,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
33
33
  # Calculates the column (by byte) and the line of the current token based on
34
34
  # +byte_offset+.
35
35
 
36
- def token_pos byte_offset # :nodoc:
36
+ def token_pos(byte_offset) # :nodoc:
37
37
  [byte_offset - @line_pos, @line]
38
38
  end
39
39
 
@@ -41,7 +41,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
41
41
  @tokens.empty?
42
42
  end
43
43
 
44
- def unshift token
44
+ def unshift(token)
45
45
  @tokens.unshift token
46
46
  end
47
47
 
@@ -56,7 +56,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
56
56
 
57
57
  private
58
58
 
59
- def tokenize input
59
+ def tokenize(input)
60
60
  require 'strscan'
61
61
  s = StringScanner.new input
62
62
 
@@ -65,7 +65,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
65
65
 
66
66
  pos = s.pos if leading_whitespace = s.scan(/ +/)
67
67
 
68
- if s.scan(/[<|=>]{7}/) then
68
+ if s.scan(/[<|=>]{7}/)
69
69
  message = "your #{@filename} contains merge conflict markers"
70
70
  column, line = token_pos pos
71
71
 
@@ -80,7 +80,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
80
80
  @line += 1
81
81
  token
82
82
  when s.scan(/[A-Z]+/) then
83
- if leading_whitespace then
83
+ if leading_whitespace
84
84
  text = s.matched
85
85
  text += s.scan(/[^\s)]*/).to_s # in case of no match
86
86
  Token.new(:text, text, *token_pos(pos))
@@ -29,7 +29,7 @@ class Gem::RequestSet::Lockfile
29
29
  # Raises a ParseError with the given +message+ which was encountered at a
30
30
  # +line+ and +column+ while parsing.
31
31
 
32
- def initialize message, column, line, path
32
+ def initialize(message, column, line, path)
33
33
  @line = line
34
34
  @column = column
35
35
  @path = path
@@ -41,13 +41,13 @@ class Gem::RequestSet::Lockfile
41
41
  # Creates a new Lockfile for the given +request_set+ and +gem_deps_file+
42
42
  # location.
43
43
 
44
- def self.build request_set, gem_deps_file, dependencies = nil
44
+ def self.build(request_set, gem_deps_file, dependencies = nil)
45
45
  request_set.resolve
46
46
  dependencies ||= requests_to_deps request_set.sorted_requests
47
47
  new request_set, gem_deps_file, dependencies
48
48
  end
49
49
 
50
- def self.requests_to_deps requests # :nodoc:
50
+ def self.requests_to_deps(requests) # :nodoc:
51
51
  deps = {}
52
52
 
53
53
  requests.each do |request|
@@ -56,7 +56,7 @@ class Gem::RequestSet::Lockfile
56
56
  requirement = request.request.dependency.requirement
57
57
 
58
58
  deps[name] = if [Gem::Resolver::VendorSpecification,
59
- Gem::Resolver::GitSpecification].include? spec.class then
59
+ Gem::Resolver::GitSpecification].include? spec.class
60
60
  Gem::Requirement.source_set
61
61
  else
62
62
  requirement
@@ -71,7 +71,7 @@ class Gem::RequestSet::Lockfile
71
71
 
72
72
  attr_reader :platforms
73
73
 
74
- def initialize request_set, gem_deps_file, dependencies
74
+ def initialize(request_set, gem_deps_file, dependencies)
75
75
  @set = request_set
76
76
  @dependencies = dependencies
77
77
  @gem_deps_file = File.expand_path(gem_deps_file)
@@ -82,7 +82,7 @@ class Gem::RequestSet::Lockfile
82
82
  @platforms = []
83
83
  end
84
84
 
85
- def add_DEPENDENCIES out # :nodoc:
85
+ def add_DEPENDENCIES(out) # :nodoc:
86
86
  out << "DEPENDENCIES"
87
87
 
88
88
  out.concat @dependencies.sort_by { |name,| name }.map { |name, requirement|
@@ -92,7 +92,7 @@ class Gem::RequestSet::Lockfile
92
92
  out << nil
93
93
  end
94
94
 
95
- def add_GEM out, spec_groups # :nodoc:
95
+ def add_GEM(out, spec_groups) # :nodoc:
96
96
  return if spec_groups.empty?
97
97
 
98
98
  source_groups = spec_groups.values.flatten.group_by do |request|
@@ -122,7 +122,7 @@ class Gem::RequestSet::Lockfile
122
122
  end
123
123
  end
124
124
 
125
- def add_GIT out, git_requests
125
+ def add_GIT(out, git_requests)
126
126
  return if git_requests.empty?
127
127
 
128
128
  by_repository_revision = git_requests.group_by do |request|
@@ -148,11 +148,11 @@ class Gem::RequestSet::Lockfile
148
148
  end
149
149
  end
150
150
 
151
- def relative_path_from dest, base # :nodoc:
151
+ def relative_path_from(dest, base) # :nodoc:
152
152
  dest = File.expand_path(dest)
153
153
  base = File.expand_path(base)
154
154
 
155
- if dest.index(base) == 0 then
155
+ if dest.index(base) == 0
156
156
  offset = dest[base.size+1..-1]
157
157
 
158
158
  return '.' unless offset
@@ -163,7 +163,7 @@ class Gem::RequestSet::Lockfile
163
163
  end
164
164
  end
165
165
 
166
- def add_PATH out, path_requests # :nodoc:
166
+ def add_PATH(out, path_requests) # :nodoc:
167
167
  return if path_requests.empty?
168
168
 
169
169
  out << "PATH"
@@ -178,7 +178,7 @@ class Gem::RequestSet::Lockfile
178
178
  out << nil
179
179
  end
180
180
 
181
- def add_PLATFORMS out # :nodoc:
181
+ def add_PLATFORMS(out) # :nodoc:
182
182
  out << "PLATFORMS"
183
183
 
184
184
  platforms = requests.map { |request| request.spec.platform }.uniq
@@ -91,7 +91,7 @@ class Gem::RequestSet
91
91
  #
92
92
  # set = Gem::RequestSet.new nokogiri, pg
93
93
 
94
- def initialize *deps
94
+ def initialize(*deps)
95
95
  @dependencies = deps
96
96
 
97
97
  @always_install = []
@@ -119,8 +119,8 @@ class Gem::RequestSet
119
119
  ##
120
120
  # Declare that a gem of name +name+ with +reqs+ requirements is needed.
121
121
 
122
- def gem name, *reqs
123
- if dep = @dependency_names[name] then
122
+ def gem(name, *reqs)
123
+ if dep = @dependency_names[name]
124
124
  dep.requirement.concat reqs
125
125
  else
126
126
  dep = Gem::Dependency.new name, *reqs
@@ -132,7 +132,7 @@ class Gem::RequestSet
132
132
  ##
133
133
  # Add +deps+ Gem::Dependency objects to the set.
134
134
 
135
- def import deps
135
+ def import(deps)
136
136
  @dependencies.concat deps
137
137
  end
138
138
 
@@ -143,7 +143,7 @@ class Gem::RequestSet
143
143
  # The +installer+ will be +nil+ if a gem matching the request was already
144
144
  # installed.
145
145
 
146
- def install options, &block # :yields: request, installer
146
+ def install(options, &block) # :yields: request, installer
147
147
  if dir = options[:install_dir]
148
148
  requests = install_into dir, false, options, &block
149
149
  return requests
@@ -152,12 +152,39 @@ class Gem::RequestSet
152
152
  @prerelease = options[:prerelease]
153
153
 
154
154
  requests = []
155
+ download_queue = Queue.new
155
156
 
157
+ # Create a thread-safe list of gems to download
156
158
  sorted_requests.each do |req|
157
- if req.installed? then
159
+ download_queue << req
160
+ end
161
+
162
+ # Create N threads in a pool, have them download all the gems
163
+ threads = Gem.configuration.concurrent_downloads.times.map do
164
+ # When a thread pops this item, it knows to stop running. The symbol
165
+ # is queued here so that there will be one symbol per thread.
166
+ download_queue << :stop
167
+
168
+ Thread.new do
169
+ # The pop method will block waiting for items, so the only way
170
+ # to stop a thread from running is to provide a final item that
171
+ # means the thread should stop.
172
+ while req = download_queue.pop
173
+ break if req == :stop
174
+ req.spec.download options unless req.installed?
175
+ end
176
+ end
177
+ end
178
+
179
+ # Wait for all the downloads to finish before continuing
180
+ threads.each(&:value)
181
+
182
+ # Install requested gems after they have been downloaded
183
+ sorted_requests.each do |req|
184
+ if req.installed?
158
185
  req.spec.spec.build_extensions
159
186
 
160
- if @always_install.none? { |spec| spec == req.spec.spec } then
187
+ if @always_install.none? { |spec| spec == req.spec.spec }
161
188
  yield req, nil if block_given?
162
189
  next
163
190
  end
@@ -203,7 +230,7 @@ class Gem::RequestSet
203
230
  # If +:without_groups+ is given in the +options+, those groups in the gem
204
231
  # dependencies file are not used. See Gem::Installer for other +options+.
205
232
 
206
- def install_from_gemdeps options, &block
233
+ def install_from_gemdeps(options, &block)
207
234
  gemdeps = options[:gemdeps]
208
235
 
209
236
  @install_dir = options[:install_dir] || Gem.dir
@@ -228,7 +255,7 @@ class Gem::RequestSet
228
255
  else
229
256
  installed = install options, &block
230
257
 
231
- if options.fetch :lock, true then
258
+ if options.fetch :lock, true
232
259
  lockfile =
233
260
  Gem::RequestSet::Lockfile.build self, gemdeps, gem_deps_api.dependencies
234
261
  lockfile.write
@@ -238,7 +265,7 @@ class Gem::RequestSet
238
265
  end
239
266
  end
240
267
 
241
- def install_into dir, force = true, options = {}
268
+ def install_into(dir, force = true, options = {})
242
269
  gem_home, ENV['GEM_HOME'] = ENV['GEM_HOME'], dir
243
270
 
244
271
  existing = force ? [] : specs_in(dir)
@@ -256,7 +283,7 @@ class Gem::RequestSet
256
283
  sorted_requests.each do |request|
257
284
  spec = request.spec
258
285
 
259
- if existing.find { |s| s.full_name == spec.full_name } then
286
+ if existing.find { |s| s.full_name == spec.full_name }
260
287
  yield request, nil if block_given?
261
288
  next
262
289
  end
@@ -278,7 +305,7 @@ class Gem::RequestSet
278
305
  ##
279
306
  # Call hooks on installed gems
280
307
 
281
- def install_hooks requests, options
308
+ def install_hooks(requests, options)
282
309
  specs = requests.map do |request|
283
310
  case request
284
311
  when Gem::Resolver::ActivationRequest then
@@ -300,7 +327,7 @@ class Gem::RequestSet
300
327
  ##
301
328
  # Load a dependency management file.
302
329
 
303
- def load_gemdeps path, without_groups = [], installing = false
330
+ def load_gemdeps(path, without_groups = [], installing = false)
304
331
  @git_set = Gem::Resolver::GitSet.new
305
332
  @vendor_set = Gem::Resolver::VendorSet.new
306
333
  @source_set = Gem::Resolver::SourceSet.new
@@ -321,29 +348,29 @@ class Gem::RequestSet
321
348
  gf.load
322
349
  end
323
350
 
324
- def pretty_print q # :nodoc:
351
+ def pretty_print(q) # :nodoc:
325
352
  q.group 2, '[RequestSet:', ']' do
326
353
  q.breakable
327
354
 
328
- if @remote then
355
+ if @remote
329
356
  q.text 'remote'
330
357
  q.breakable
331
358
  end
332
359
 
333
- if @prerelease then
360
+ if @prerelease
334
361
  q.text 'prerelease'
335
362
  q.breakable
336
363
  end
337
364
 
338
- if @development_shallow then
365
+ if @development_shallow
339
366
  q.text 'shallow development'
340
367
  q.breakable
341
- elsif @development then
368
+ elsif @development
342
369
  q.text 'development'
343
370
  q.breakable
344
371
  end
345
372
 
346
- if @soft_missing then
373
+ if @soft_missing
347
374
  q.text 'soft missing'
348
375
  end
349
376
 
@@ -367,7 +394,7 @@ class Gem::RequestSet
367
394
  # Resolve the requested dependencies and return an Array of Specification
368
395
  # objects to be activated.
369
396
 
370
- def resolve set = Gem::Resolver::BestSet.new
397
+ def resolve(set = Gem::Resolver::BestSet.new)
371
398
  @sets << set
372
399
  @sets << @git_set
373
400
  @sets << @vendor_set
@@ -416,17 +443,17 @@ class Gem::RequestSet
416
443
  @specs ||= @requests.map { |r| r.full_spec }
417
444
  end
418
445
 
419
- def specs_in dir
420
- Dir["#{dir}/specifications/*.gemspec"].map do |g|
446
+ def specs_in(dir)
447
+ Gem::Util.glob_files_in_dir("*.gemspec", File.join(dir, "specifications")).map do |g|
421
448
  Gem::Specification.load g
422
449
  end
423
450
  end
424
451
 
425
- def tsort_each_node &block # :nodoc:
452
+ def tsort_each_node(&block) # :nodoc:
426
453
  @requests.each(&block)
427
454
  end
428
455
 
429
- def tsort_each_child node # :nodoc:
456
+ def tsort_each_child(node) # :nodoc:
430
457
  node.spec.dependencies.each do |dep|
431
458
  next if dep.type == :development and not @development
432
459
 
@@ -434,7 +461,7 @@ class Gem::RequestSet
434
461
  dep.match? r.spec.name, r.spec.version, @prerelease
435
462
  }
436
463
 
437
- unless match then
464
+ unless match
438
465
  next if dep.type == :development and @development_shallow
439
466
  next if @soft_missing
440
467
  raise Gem::DependencyError,
@@ -2,10 +2,6 @@
2
2
  require "rubygems/version"
3
3
  require "rubygems/deprecate"
4
4
 
5
- # If we're being loaded after yaml was already required, then
6
- # load our yaml + workarounds now.
7
- Gem.load_yaml if defined? ::YAML
8
-
9
5
  ##
10
6
  # A Requirement is a set of one or more version restrictions. It supports a
11
7
  # few (<tt>=, !=, >, <, >=, <=, ~></tt>) different restriction operators.
@@ -22,22 +18,22 @@ class Gem::Requirement
22
18
  ">=" => lambda { |v, r| v >= r },
23
19
  "<=" => lambda { |v, r| v <= r },
24
20
  "~>" => lambda { |v, r| v >= r && v.release < r.bump }
25
- }
21
+ }.freeze
26
22
 
27
23
  SOURCE_SET_REQUIREMENT = Struct.new(:for_lockfile).new "!" # :nodoc:
28
24
 
29
25
  quoted = OPS.keys.map { |k| Regexp.quote k }.join "|"
30
- PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*" # :nodoc:
26
+ PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*".freeze # :nodoc:
31
27
 
32
28
  ##
33
29
  # A regular expression that matches a requirement
34
30
 
35
- PATTERN = /\A#{PATTERN_RAW}\z/
31
+ PATTERN = /\A#{PATTERN_RAW}\z/.freeze
36
32
 
37
33
  ##
38
34
  # The default requirement matches any version
39
35
 
40
- DefaultRequirement = [">=", Gem::Version.new(0)]
36
+ DefaultRequirement = [">=", Gem::Version.new(0)].freeze
41
37
 
42
38
  ##
43
39
  # Raised when a bad requirement is encountered
@@ -51,7 +47,7 @@ class Gem::Requirement
51
47
  # If the input is "weird", the default version requirement is
52
48
  # returned.
53
49
 
54
- def self.create *inputs
50
+ def self.create(*inputs)
55
51
  return new inputs if inputs.length > 1
56
52
 
57
53
  input = inputs.shift
@@ -64,7 +60,7 @@ class Gem::Requirement
64
60
  when '!' then
65
61
  source_set
66
62
  else
67
- if input.respond_to? :to_str then
63
+ if input.respond_to? :to_str
68
64
  new [input.to_str]
69
65
  else
70
66
  default
@@ -98,7 +94,7 @@ class Gem::Requirement
98
94
  # parse("1.0") # => ["=", Gem::Version.new("1.0")]
99
95
  # parse(Gem::Version.new("1.0")) # => ["=, Gem::Version.new("1.0")]
100
96
 
101
- def self.parse obj
97
+ def self.parse(obj)
102
98
  return ["=", obj] if Gem::Version === obj
103
99
 
104
100
  unless PATTERN =~ obj.to_s
@@ -124,7 +120,7 @@ class Gem::Requirement
124
120
  # requirements are ignored. An empty set of +requirements+ is the
125
121
  # same as <tt>">= 0"</tt>.
126
122
 
127
- def initialize *requirements
123
+ def initialize(*requirements)
128
124
  requirements = requirements.flatten
129
125
  requirements.compact!
130
126
  requirements.uniq!
@@ -140,7 +136,7 @@ class Gem::Requirement
140
136
  ##
141
137
  # Concatenates the +new+ requirements onto this requirement.
142
138
 
143
- def concat new
139
+ def concat(new)
144
140
  new = new.flatten
145
141
  new.compact!
146
142
  new.uniq!
@@ -198,7 +194,7 @@ class Gem::Requirement
198
194
  [@requirements]
199
195
  end
200
196
 
201
- def marshal_load array # :nodoc:
197
+ def marshal_load(array) # :nodoc:
202
198
  @requirements = array[0]
203
199
 
204
200
  fix_syck_default_key_in_requirements
@@ -213,7 +209,7 @@ class Gem::Requirement
213
209
  fix_syck_default_key_in_requirements
214
210
  end
215
211
 
216
- def init_with coder # :nodoc:
212
+ def init_with(coder) # :nodoc:
217
213
  yaml_initialize coder.tag, coder.map
218
214
  end
219
215
 
@@ -221,7 +217,7 @@ class Gem::Requirement
221
217
  ["@requirements"]
222
218
  end
223
219
 
224
- def encode_with coder # :nodoc:
220
+ def encode_with(coder) # :nodoc:
225
221
  coder.add 'requirements', @requirements
226
222
  end
227
223
 
@@ -233,7 +229,7 @@ class Gem::Requirement
233
229
  requirements.any? { |r| r.last.prerelease? }
234
230
  end
235
231
 
236
- def pretty_print q # :nodoc:
232
+ def pretty_print(q) # :nodoc:
237
233
  q.group 1, 'Gem::Requirement.new(', ')' do
238
234
  q.pp as_list
239
235
  end
@@ -242,7 +238,7 @@ class Gem::Requirement
242
238
  ##
243
239
  # True if +version+ satisfies this Requirement.
244
240
 
245
- def satisfied_by? version
241
+ def satisfied_by?(version)
246
242
  raise ArgumentError, "Need a Gem::Version: #{version.inspect}" unless
247
243
  Gem::Version === version
248
244
  # #28965: syck has a bug with unquoted '=' YAML.loading as YAML::DefaultKey
@@ -265,9 +261,24 @@ class Gem::Requirement
265
261
  as_list.join ", "
266
262
  end
267
263
 
268
- def == other # :nodoc:
264
+ def ==(other) # :nodoc:
269
265
  return unless Gem::Requirement === other
270
- requirements == other.requirements
266
+
267
+ # An == check is always necessary
268
+ return false unless requirements == other.requirements
269
+
270
+ # An == check is sufficient unless any requirements use ~>
271
+ return true unless _tilde_requirements.any?
272
+
273
+ # If any requirements use ~> we use the stricter `#eql?` that also checks
274
+ # that version precision is the same
275
+ _tilde_requirements.eql?(other._tilde_requirements)
276
+ end
277
+
278
+ protected
279
+
280
+ def _tilde_requirements
281
+ requirements.select { |r| r.first == "~>" }
271
282
  end
272
283
 
273
284
  private
@@ -284,7 +295,7 @@ class Gem::Requirement
284
295
  end
285
296
 
286
297
  def sort_requirements! # :nodoc:
287
- @requirements.sort! do |l, r|
298
+ @requirements.sort! do |l, r|
288
299
  comp = l.last <=> r.last # first, sort by the requirement's version
289
300
  next comp unless comp == 0
290
301
  l.first <=> r.first # then, sort by the operator (for stability)