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
@@ -23,12 +23,14 @@ class Gem::PathSupport
23
23
  # hashtable, or defaults to ENV, the system environment.
24
24
  #
25
25
  def initialize(env)
26
- @home = env["GEM_HOME"] || Gem.default_dir
26
+ @home = env["GEM_HOME"] || Gem.default_dir
27
27
 
28
- if File::ALT_SEPARATOR then
29
- @home = @home.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
28
+ if File::ALT_SEPARATOR
29
+ @home = @home.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
30
30
  end
31
31
 
32
+ @home = expand(@home)
33
+
32
34
  @path = split_gem_path env["GEM_PATH"], @home
33
35
 
34
36
  @spec_cache_dir = env["GEM_SPEC_CACHE"] || Gem.default_spec_cache_dir
@@ -41,7 +43,7 @@ class Gem::PathSupport
41
43
  ##
42
44
  # Split the Gem search path (as reported by Gem.path).
43
45
 
44
- def split_gem_path gpaths, home
46
+ def split_gem_path(gpaths, home)
45
47
  # FIX: it should be [home, *path], not [*path, home]
46
48
 
47
49
  gem_path = []
@@ -54,7 +56,7 @@ class Gem::PathSupport
54
56
  gem_path += default_path
55
57
  end
56
58
 
57
- if File::ALT_SEPARATOR then
59
+ if File::ALT_SEPARATOR
58
60
  gem_path.map! do |this_path|
59
61
  this_path.gsub File::ALT_SEPARATOR, File::SEPARATOR
60
62
  end
@@ -65,7 +67,7 @@ class Gem::PathSupport
65
67
  gem_path = default_path
66
68
  end
67
69
 
68
- gem_path.uniq
70
+ gem_path.map { |path| expand(path) }.uniq
69
71
  end
70
72
 
71
73
  # Return the default Gem path
@@ -77,4 +79,12 @@ class Gem::PathSupport
77
79
  end
78
80
  gem_path
79
81
  end
82
+
83
+ def expand(path)
84
+ if File.directory?(path)
85
+ File.realpath(path)
86
+ else
87
+ path
88
+ end
89
+ end
80
90
  end
@@ -56,7 +56,7 @@ class Gem::Platform
56
56
  when String then
57
57
  arch = arch.split '-'
58
58
 
59
- if arch.length > 2 and arch.last !~ /\d/ then # reassemble x86-linux-gnu
59
+ if arch.length > 2 and arch.last !~ /\d/ # reassemble x86-linux-gnu
60
60
  extra = arch.pop
61
61
  arch.last << "-#{extra}"
62
62
  end
@@ -68,7 +68,7 @@ class Gem::Platform
68
68
  else cpu
69
69
  end
70
70
 
71
- if arch.length == 2 and arch.last =~ /^\d+(\.\d+)?$/ then # for command-line
71
+ if arch.length == 2 and arch.last =~ /^\d+(\.\d+)?$/ # for command-line
72
72
  @os, @version = arch
73
73
  return
74
74
  end
@@ -195,12 +195,11 @@ class Gem::Platform
195
195
  # A pure-Ruby gem that may use Gem::Specification#extensions to build
196
196
  # binary files.
197
197
 
198
- RUBY = 'ruby'
198
+ RUBY = 'ruby'.freeze
199
199
 
200
200
  ##
201
201
  # A platform-specific gem that is built for the packaging Ruby's platform.
202
202
  # This will be replaced with Gem::Platform::local.
203
203
 
204
- CURRENT = 'current'
204
+ CURRENT = 'current'.freeze
205
205
  end
206
-
@@ -18,7 +18,7 @@ module Gem
18
18
  end
19
19
 
20
20
  # This is ported over from the yaml_tree in 1.9.3
21
- def format_time time
21
+ def format_time(time)
22
22
  if time.utc?
23
23
  time.strftime("%Y-%m-%d %H:%M:%S.%9N Z")
24
24
  else
data/lib/rubygems/rdoc.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rubygems'
3
- require 'rubygems/user_interaction'
4
- require 'fileutils'
5
3
 
6
4
  begin
7
5
  gem 'rdoc'
@@ -15,321 +13,12 @@ else
15
13
  Gem.finish_resolve
16
14
  end
17
15
 
18
- loaded_hook = false
19
-
20
16
  begin
21
17
  require 'rdoc/rubygems_hook'
22
- loaded_hook = true
23
18
  module Gem
24
19
  RDoc = ::RDoc::RubygemsHook
25
20
  end
21
+
22
+ Gem.done_installing(&Gem::RDoc.method(:generation_hook))
26
23
  rescue LoadError
27
24
  end
28
-
29
- ##
30
- # Gem::RDoc provides methods to generate RDoc and ri data for installed gems.
31
- # It works for RDoc 1.0.1 (in Ruby 1.8) up to RDoc 3.6.
32
- #
33
- # This implementation is considered obsolete. The RDoc project is the
34
- # appropriate location to find this functionality. This file provides the
35
- # hooks to load RDoc generation code from the "rdoc" gem and a fallback in
36
- # case the installed version of RDoc does not have them.
37
-
38
- class Gem::RDoc # :nodoc: all
39
-
40
- include Gem::UserInteraction
41
- extend Gem::UserInteraction
42
-
43
- @rdoc_version = nil
44
- @specs = []
45
-
46
- ##
47
- # Force installation of documentation?
48
-
49
- attr_accessor :force
50
-
51
- ##
52
- # Generate rdoc?
53
-
54
- attr_accessor :generate_rdoc
55
-
56
- ##
57
- # Generate ri data?
58
-
59
- attr_accessor :generate_ri
60
-
61
- class << self
62
-
63
- ##
64
- # Loaded version of RDoc. Set by ::load_rdoc
65
-
66
- attr_reader :rdoc_version
67
-
68
- end
69
-
70
- ##
71
- # Post installs hook that generates documentation for each specification in
72
- # +specs+
73
-
74
- def self.generation_hook installer, specs
75
- start = Time.now
76
- types = installer.document
77
-
78
- generate_rdoc = types.include? 'rdoc'
79
- generate_ri = types.include? 'ri'
80
-
81
- specs.each do |spec|
82
- new(spec, generate_rdoc, generate_ri).generate
83
- end
84
-
85
- return unless generate_rdoc or generate_ri
86
-
87
- duration = (Time.now - start).to_i
88
- names = specs.map(&:name).join ', '
89
-
90
- say "Done installing documentation for #{names} after #{duration} seconds"
91
- end
92
-
93
- ##
94
- # Loads the RDoc generator
95
-
96
- def self.load_rdoc
97
- return if @rdoc_version
98
-
99
- require 'rdoc/rdoc'
100
-
101
- @rdoc_version = if ::RDoc.const_defined? :VERSION then
102
- Gem::Version.new ::RDoc::VERSION
103
- else
104
- Gem::Version.new '1.0.1'
105
- end
106
-
107
- rescue LoadError => e
108
- raise Gem::DocumentError, "RDoc is not installed: #{e}"
109
- end
110
-
111
- ##
112
- # Creates a new documentation generator for +spec+. RDoc and ri data
113
- # generation can be enabled or disabled through +generate_rdoc+ and
114
- # +generate_ri+ respectively.
115
- #
116
- # Only +generate_ri+ is enabled by default.
117
-
118
- def initialize spec, generate_rdoc = true, generate_ri = true
119
- @doc_dir = spec.doc_dir
120
- @file_info = nil
121
- @force = false
122
- @rdoc = nil
123
- @spec = spec
124
-
125
- @generate_rdoc = generate_rdoc
126
- @generate_ri = generate_ri
127
-
128
- @rdoc_dir = spec.doc_dir 'rdoc'
129
- @ri_dir = spec.doc_dir 'ri'
130
- end
131
-
132
- ##
133
- # Removes legacy rdoc arguments from +args+
134
- #--
135
- # TODO move to RDoc::Options
136
-
137
- def delete_legacy_args args
138
- args.delete '--inline-source'
139
- args.delete '--promiscuous'
140
- args.delete '-p'
141
- args.delete '--one-file'
142
- end
143
-
144
- ##
145
- # Generates documentation using the named +generator+ ("darkfish" or "ri")
146
- # and following the given +options+.
147
- #
148
- # Documentation will be generated into +destination+
149
-
150
- def document generator, options, destination
151
- generator_name = generator
152
-
153
- options = options.dup
154
- options.exclude ||= [] # TODO maybe move to RDoc::Options#finish
155
- options.setup_generator generator
156
- options.op_dir = destination
157
- options.finish
158
-
159
- generator = options.generator.new @rdoc.store, options
160
-
161
- @rdoc.options = options
162
- @rdoc.generator = generator
163
-
164
- say "Installing #{generator_name} documentation for #{@spec.full_name}"
165
-
166
- FileUtils.mkdir_p options.op_dir
167
-
168
- Dir.chdir options.op_dir do
169
- begin
170
- @rdoc.class.current = @rdoc
171
- @rdoc.generator.generate @file_info
172
- ensure
173
- @rdoc.class.current = nil
174
- end
175
- end
176
- end
177
-
178
- ##
179
- # Generates RDoc and ri data
180
-
181
- def generate
182
- return unless @generate_ri or @generate_rdoc
183
-
184
- setup
185
-
186
- options = nil
187
-
188
- if Gem::Requirement.new('< 3').satisfied_by? self.class.rdoc_version then
189
- generate_legacy
190
- return
191
- end
192
-
193
- ::RDoc::TopLevel.reset # TODO ::RDoc::RDoc.reset
194
- ::RDoc::Parser::C.reset
195
-
196
- args = @spec.rdoc_options
197
- args.concat @spec.source_paths
198
- args.concat @spec.extra_rdoc_files
199
-
200
- case config_args = Gem.configuration[:rdoc]
201
- when String then
202
- args = args.concat config_args.split
203
- when Array then
204
- args = args.concat config_args
205
- end
206
-
207
- delete_legacy_args args
208
-
209
- Dir.chdir @spec.full_gem_path do
210
- options = ::RDoc::Options.new
211
- options.default_title = "#{@spec.full_name} Documentation"
212
- options.parse args
213
- end
214
-
215
- options.quiet = !Gem.configuration.really_verbose
216
-
217
- @rdoc = new_rdoc
218
- @rdoc.options = options
219
-
220
- say "Parsing documentation for #{@spec.full_name}"
221
-
222
- Dir.chdir @spec.full_gem_path do
223
- @file_info = @rdoc.parse_files options.files
224
- end
225
-
226
- document 'ri', options, @ri_dir if
227
- @generate_ri and (@force or not File.exist? @ri_dir)
228
-
229
- document 'darkfish', options, @rdoc_dir if
230
- @generate_rdoc and (@force or not File.exist? @rdoc_dir)
231
- end
232
-
233
- ##
234
- # Generates RDoc and ri data for legacy RDoc versions. This method will not
235
- # exist in future versions.
236
-
237
- def generate_legacy
238
- if @generate_rdoc then
239
- FileUtils.rm_rf @rdoc_dir
240
- say "Installing RDoc documentation for #{@spec.full_name}"
241
- legacy_rdoc '--op', @rdoc_dir
242
- end
243
-
244
- if @generate_ri then
245
- FileUtils.rm_rf @ri_dir
246
- say "Installing ri documentation for #{@spec.full_name}"
247
- legacy_rdoc '--ri', '--op', @ri_dir
248
- end
249
- end
250
-
251
- ##
252
- # Generates RDoc using a legacy version of RDoc from the ARGV-like +args+.
253
- # This method will not exist in future versions.
254
-
255
- def legacy_rdoc *args
256
- args << @spec.rdoc_options
257
- args << '--quiet'
258
- args << @spec.require_paths.clone
259
- args << @spec.extra_rdoc_files
260
- args << '--title' << "#{@spec.full_name} Documentation"
261
- args = args.flatten.map do |arg| arg.to_s end
262
-
263
- delete_legacy_args args if
264
- Gem::Requirement.new('>= 2.4.0') =~ self.class.rdoc_version
265
-
266
- r = new_rdoc
267
- verbose { "rdoc #{args.join ' '}" }
268
-
269
- Dir.chdir @spec.full_gem_path do
270
- begin
271
- r.document args
272
- rescue Errno::EACCES => e
273
- dirname = File.dirname e.message.split("-")[1].strip
274
- raise Gem::FilePermissionError, dirname
275
- rescue Interrupt => e
276
- raise e
277
- rescue Exception => ex
278
- alert_error "While generating documentation for #{@spec.full_name}"
279
- ui.errs.puts "... MESSAGE: #{ex}"
280
- ui.errs.puts "... RDOC args: #{args.join(' ')}"
281
- ui.backtrace ex
282
- ui.errs.puts "(continuing with the rest of the installation)"
283
- end
284
- end
285
- end
286
-
287
- ##
288
- # #new_rdoc creates a new RDoc instance. This method is provided only to
289
- # make testing easier.
290
-
291
- def new_rdoc # :nodoc:
292
- ::RDoc::RDoc.new
293
- end
294
-
295
- ##
296
- # Is rdoc documentation installed?
297
-
298
- def rdoc_installed?
299
- File.exist? @rdoc_dir
300
- end
301
-
302
- ##
303
- # Removes generated RDoc and ri data
304
-
305
- def remove
306
- base_dir = @spec.base_dir
307
-
308
- raise Gem::FilePermissionError, base_dir unless File.writable? base_dir
309
-
310
- FileUtils.rm_rf @rdoc_dir
311
- FileUtils.rm_rf @ri_dir
312
- end
313
-
314
- ##
315
- # Is ri data installed?
316
-
317
- def ri_installed?
318
- File.exist? @ri_dir
319
- end
320
-
321
- ##
322
- # Prepares the spec for documentation generation
323
-
324
- def setup
325
- self.class.load_rdoc
326
-
327
- raise Gem::FilePermissionError, @doc_dir if
328
- File.exist?(@doc_dir) and not File.writable?(@doc_dir)
329
-
330
- FileUtils.mkdir_p @doc_dir unless File.exist? @doc_dir
331
- end
332
-
333
- end unless loaded_hook
334
-
335
- Gem.done_installing(&Gem::RDoc.method(:generation_hook))
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rubygems'
3
3
  require 'rubygems/request'
4
+ require 'rubygems/request/connection_pools'
5
+ require 'rubygems/s3_uri_signer'
4
6
  require 'rubygems/uri_formatter'
5
7
  require 'rubygems/user_interaction'
6
- require 'rubygems/request/connection_pools'
7
8
  require 'resolv'
8
9
 
9
10
  ##
@@ -71,13 +72,10 @@ class Gem::RemoteFetcher
71
72
  # HTTP_PROXY_PASS)
72
73
  # * <tt>:no_proxy</tt>: ignore environment variables and _don't_ use a proxy
73
74
  #
74
- # +dns+: An object to use for DNS resolution of the API endpoint.
75
- # By default, use Resolv::DNS.
76
- #
77
75
  # +headers+: A set of additional HTTP headers to be sent to the server when
78
76
  # fetching the gem.
79
77
 
80
- def initialize(proxy=nil, dns=Resolv::DNS.new, headers={})
78
+ def initialize(proxy=nil, dns=nil, headers={})
81
79
  require 'net/http'
82
80
  require 'stringio'
83
81
  require 'time'
@@ -90,34 +88,9 @@ class Gem::RemoteFetcher
90
88
  @pool_lock = Mutex.new
91
89
  @cert_files = Gem::Request.get_cert_files
92
90
 
93
- @dns = dns
94
91
  @headers = headers
95
92
  end
96
93
 
97
- ##
98
- # Given a source at +uri+, calculate what hostname to actually
99
- # connect to query the data for it.
100
-
101
- def api_endpoint(uri)
102
- host = uri.host
103
-
104
- begin
105
- res = @dns.getresource "_rubygems._tcp.#{host}",
106
- Resolv::DNS::Resource::IN::SRV
107
- rescue Resolv::ResolvError => e
108
- verbose "Getting SRV record failed: #{e}"
109
- uri
110
- else
111
- target = res.target.to_s.strip
112
-
113
- if URI("http://" + target).host.end_with?(".#{host}")
114
- return URI.parse "#{uri.scheme}://#{target}#{uri.path}"
115
- end
116
-
117
- uri
118
- end
119
- end
120
-
121
94
  ##
122
95
  # Given a name and requirement, downloads this gem into cache and returns the
123
96
  # filename. Returns nil if the gem cannot be located.
@@ -125,7 +98,7 @@ class Gem::RemoteFetcher
125
98
  # Should probably be integrated with #download below, but that will be a
126
99
  # larger, more encompassing effort. -erikh
127
100
 
128
- def download_to_cache dependency
101
+ def download_to_cache(dependency)
129
102
  found, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dependency
130
103
 
131
104
  return if found.empty?
@@ -142,9 +115,9 @@ class Gem::RemoteFetcher
142
115
 
143
116
  def download(spec, source_uri, install_dir = Gem.dir)
144
117
  cache_dir =
145
- if Dir.pwd == install_dir then # see fetch_command
118
+ if Dir.pwd == install_dir # see fetch_command
146
119
  install_dir
147
- elsif File.writable? install_dir then
120
+ elsif File.writable? install_dir
148
121
  File.join install_dir, "cache"
149
122
  else
150
123
  File.join Gem.user_dir, "cache"
@@ -164,9 +137,7 @@ class Gem::RemoteFetcher
164
137
  begin
165
138
  source_uri = URI.parse(source_uri)
166
139
  rescue
167
- source_uri = URI.parse(URI.const_defined?(:DEFAULT_PARSER) ?
168
- URI::DEFAULT_PARSER.escape(source_uri.to_s) :
169
- URI.escape(source_uri.to_s))
140
+ source_uri = URI.parse(URI::DEFAULT_PARSER.escape(source_uri.to_s))
170
141
  end
171
142
  end
172
143
 
@@ -179,7 +150,7 @@ class Gem::RemoteFetcher
179
150
  # REFACTOR: be sure to clean up fake fetcher when you do this... cleaner
180
151
  case scheme
181
152
  when 'http', 'https', 's3' then
182
- unless File.exist? local_gem_path then
153
+ unless File.exist? local_gem_path
183
154
  begin
184
155
  verbose "Downloading gem #{gem_file_name}"
185
156
 
@@ -203,7 +174,7 @@ class Gem::RemoteFetcher
203
174
  path = source_uri.path
204
175
  path = File.dirname(path) if File.extname(path) == '.gem'
205
176
 
206
- remote_gem_path = correct_for_windows_path(File.join(path, 'gems', gem_file_name))
177
+ remote_gem_path = Gem::Util.correct_for_windows_path(File.join(path, 'gems', gem_file_name))
207
178
 
208
179
  FileUtils.cp(remote_gem_path, local_gem_path)
209
180
  rescue Errno::EACCES
@@ -213,7 +184,7 @@ class Gem::RemoteFetcher
213
184
  verbose "Using local gem #{local_gem_path}"
214
185
  when nil then # TODO test for local overriding cache
215
186
  source_path = if Gem.win_platform? && source_uri.scheme &&
216
- !source_uri.path.include?(':') then
187
+ !source_uri.path.include?(':')
217
188
  "#{source_uri.scheme}:#{source_uri.path}"
218
189
  else
219
190
  source_uri.path
@@ -239,14 +210,14 @@ class Gem::RemoteFetcher
239
210
  ##
240
211
  # File Fetcher. Dispatched by +fetch_path+. Use it instead.
241
212
 
242
- def fetch_file uri, *_
243
- Gem.read_binary correct_for_windows_path uri.path
213
+ def fetch_file(uri, *_)
214
+ Gem.read_binary Gem::Util.correct_for_windows_path uri.path
244
215
  end
245
216
 
246
217
  ##
247
218
  # HTTP Fetcher. Dispatched by +fetch_path+. Use it instead.
248
219
 
249
- def fetch_http uri, last_modified = nil, head = false, depth = 0
220
+ def fetch_http(uri, last_modified = nil, head = false, depth = 0)
250
221
  fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get
251
222
  response = request uri, fetch_type, last_modified do |req|
252
223
  headers.each { |k,v| req.add_field(k,v) }
@@ -304,7 +275,8 @@ class Gem::RemoteFetcher
304
275
  raise
305
276
  rescue Timeout::Error
306
277
  raise UnknownHostError.new('timed out', uri.to_s)
307
- rescue IOError, SocketError, SystemCallError => e
278
+ rescue IOError, SocketError, SystemCallError,
279
+ *(OpenSSL::SSL::SSLError if defined?(OpenSSL)) => e
308
280
  if e.message =~ /getaddrinfo/
309
281
  raise UnknownHostError.new('no such name', uri.to_s)
310
282
  else
@@ -313,15 +285,24 @@ class Gem::RemoteFetcher
313
285
  end
314
286
 
315
287
  def fetch_s3(uri, mtime = nil, head = false)
316
- public_uri = sign_s3_url(uri)
288
+ begin
289
+ public_uri = s3_uri_signer(uri).sign
290
+ rescue Gem::S3URISigner::ConfigurationError, Gem::S3URISigner::InstanceProfileError => e
291
+ raise FetchError.new(e.message, "s3://#{uri.host}")
292
+ end
317
293
  fetch_https public_uri, mtime, head
318
294
  end
319
295
 
296
+ # we have our own signing code here to avoid a dependency on the aws-sdk gem
297
+ def s3_uri_signer(uri)
298
+ Gem::S3URISigner.new(uri)
299
+ end
300
+
320
301
  ##
321
302
  # Downloads +uri+ to +path+ if necessary. If no path is given, it just
322
303
  # passes the data.
323
304
 
324
- def cache_update_path uri, path = nil, update = true
305
+ def cache_update_path(uri, path = nil, update = true)
325
306
  mtime = path && File.stat(path).mtime rescue nil
326
307
 
327
308
  data = fetch_path(uri, mtime)
@@ -346,14 +327,6 @@ class Gem::RemoteFetcher
346
327
  response['content-length'].to_i
347
328
  end
348
329
 
349
- def correct_for_windows_path(path)
350
- if path[0].chr == '/' && path[1].chr =~ /[a-z]/i && path[2].chr == ':'
351
- path[1..-1]
352
- else
353
- path
354
- end
355
- end
356
-
357
330
  ##
358
331
  # Performs a Net::HTTP request of type +request_class+ on +uri+ returning
359
332
  # a Net::HTTP response object. request maintains a table of persistent
@@ -378,42 +351,16 @@ class Gem::RemoteFetcher
378
351
  @pools.each_value {|pool| pool.close_all}
379
352
  end
380
353
 
381
- protected
382
-
383
- # we have our own signing code here to avoid a dependency on the aws-sdk gem
384
- # fortunately, a simple GET request isn't too complex to sign properly
385
- def sign_s3_url(uri, expiration = nil)
386
- require 'base64'
387
- require 'openssl'
388
-
389
- unless uri.user && uri.password
390
- raise FetchError.new("credentials needed in s3 source, like s3://key:secret@bucket-name/", uri.to_s)
391
- end
392
-
393
- expiration ||= s3_expiration
394
- canonical_path = "/#{uri.host}#{uri.path}"
395
- payload = "GET\n\n\n#{expiration}\n#{canonical_path}"
396
- digest = OpenSSL::HMAC.digest('sha1', uri.password, payload)
397
- # URI.escape is deprecated, and there isn't yet a replacement that does quite what we want
398
- signature = Base64.encode64(digest).gsub("\n", '').gsub(/[\+\/=]/) { |c| BASE64_URI_TRANSLATE[c] }
399
- URI.parse("https://#{uri.host}.s3.amazonaws.com#{uri.path}?AWSAccessKeyId=#{uri.user}&Expires=#{expiration}&Signature=#{signature}")
400
- end
401
-
402
- def s3_expiration
403
- (Time.now + 3600).to_i # one hour from now
404
- end
405
-
406
- BASE64_URI_TRANSLATE = { '+' => '%2B', '/' => '%2F', '=' => '%3D' }.freeze
407
-
408
354
  private
409
355
 
410
- def proxy_for proxy, uri
356
+ def proxy_for(proxy, uri)
411
357
  Gem::Request.proxy_uri(proxy || Gem::Request.get_proxy_from_env(uri.scheme))
412
358
  end
413
359
 
414
- def pools_for proxy
360
+ def pools_for(proxy)
415
361
  @pool_lock.synchronize do
416
362
  @pools[proxy] ||= Gem::Request::ConnectionPools.new proxy, @cert_files
417
363
  end
418
364
  end
365
+
419
366
  end