rubygems-update 3.4.21 → 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 (564) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +132 -2
  3. data/Manifest.txt +39 -221
  4. data/README.md +1 -3
  5. data/bundler/CHANGELOG.md +74 -0
  6. data/bundler/README.md +1 -2
  7. data/bundler/bundler.gemspec +4 -2
  8. data/bundler/exe/bundle +1 -10
  9. data/bundler/lib/bundler/build_metadata.rb +3 -3
  10. data/bundler/lib/bundler/capistrano.rb +1 -1
  11. data/bundler/lib/bundler/checksum.rb +245 -0
  12. data/bundler/lib/bundler/ci_detector.rb +75 -0
  13. data/bundler/lib/bundler/cli/add.rb +3 -3
  14. data/bundler/lib/bundler/cli/binstubs.rb +4 -4
  15. data/bundler/lib/bundler/cli/cache.rb +1 -1
  16. data/bundler/lib/bundler/cli/check.rb +1 -1
  17. data/bundler/lib/bundler/cli/common.rb +9 -1
  18. data/bundler/lib/bundler/cli/config.rb +8 -7
  19. data/bundler/lib/bundler/cli/console.rb +3 -2
  20. data/bundler/lib/bundler/cli/doctor.rb +2 -2
  21. data/bundler/lib/bundler/cli/exec.rb +1 -1
  22. data/bundler/lib/bundler/cli/gem.rb +31 -23
  23. data/bundler/lib/bundler/cli/info.rb +2 -13
  24. data/bundler/lib/bundler/cli/install.rb +5 -4
  25. data/bundler/lib/bundler/cli/issue.rb +1 -1
  26. data/bundler/lib/bundler/cli/lock.rb +4 -4
  27. data/bundler/lib/bundler/cli/open.rb +1 -1
  28. data/bundler/lib/bundler/cli/outdated.rb +6 -6
  29. data/bundler/lib/bundler/cli/plugin.rb +7 -14
  30. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  31. data/bundler/lib/bundler/cli/show.rb +2 -2
  32. data/bundler/lib/bundler/cli/update.rb +5 -5
  33. data/bundler/lib/bundler/cli.rb +215 -263
  34. data/bundler/lib/bundler/compact_index_client/cache.rb +29 -9
  35. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  36. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  37. data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
  38. data/bundler/lib/bundler/compact_index_client.rb +14 -7
  39. data/bundler/lib/bundler/constants.rb +1 -1
  40. data/bundler/lib/bundler/current_ruby.rb +5 -21
  41. data/bundler/lib/bundler/definition.rb +43 -16
  42. data/bundler/lib/bundler/dependency.rb +16 -12
  43. data/bundler/lib/bundler/digest.rb +2 -2
  44. data/bundler/lib/bundler/dsl.rb +43 -25
  45. data/bundler/lib/bundler/endpoint_specification.rb +6 -2
  46. data/bundler/lib/bundler/env.rb +1 -3
  47. data/bundler/lib/bundler/errors.rb +58 -0
  48. data/bundler/lib/bundler/fetcher/base.rb +3 -1
  49. data/bundler/lib/bundler/fetcher/compact_index.rb +4 -4
  50. data/bundler/lib/bundler/fetcher/downloader.rb +13 -11
  51. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  52. data/bundler/lib/bundler/fetcher/index.rb +1 -1
  53. data/bundler/lib/bundler/fetcher.rb +28 -25
  54. data/bundler/lib/bundler/friendly_errors.rb +5 -5
  55. data/bundler/lib/bundler/gem_helper.rb +1 -1
  56. data/bundler/lib/bundler/gem_helpers.rb +12 -2
  57. data/bundler/lib/bundler/graph.rb +9 -9
  58. data/bundler/lib/bundler/index.rb +1 -2
  59. data/bundler/lib/bundler/injector.rb +1 -1
  60. data/bundler/lib/bundler/inline.rb +3 -3
  61. data/bundler/lib/bundler/installer/gem_installer.rb +10 -10
  62. data/bundler/lib/bundler/installer/parallel_installer.rb +16 -8
  63. data/bundler/lib/bundler/installer/standalone.rb +2 -3
  64. data/bundler/lib/bundler/installer.rb +9 -9
  65. data/bundler/lib/bundler/lazy_specification.rb +28 -17
  66. data/bundler/lib/bundler/lockfile_generator.rb +9 -0
  67. data/bundler/lib/bundler/lockfile_parser.rb +81 -10
  68. data/bundler/lib/bundler/man/bundle-add.1 +3 -26
  69. data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
  70. data/bundler/lib/bundler/man/bundle-cache.1 +3 -24
  71. data/bundler/lib/bundler/man/bundle-check.1 +3 -12
  72. data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
  73. data/bundler/lib/bundler/man/bundle-config.1 +20 -211
  74. data/bundler/lib/bundler/man/bundle-config.1.ronn +6 -0
  75. data/bundler/lib/bundler/man/bundle-console.1 +4 -22
  76. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
  77. data/bundler/lib/bundler/man/bundle-exec.1 +12 -73
  78. data/bundler/lib/bundler/man/bundle-gem.1 +13 -49
  79. data/bundler/lib/bundler/man/bundle-help.1 +3 -7
  80. data/bundler/lib/bundler/man/bundle-info.1 +3 -9
  81. data/bundler/lib/bundler/man/bundle-init.1 +3 -12
  82. data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
  83. data/bundler/lib/bundler/man/bundle-install.1 +27 -125
  84. data/bundler/lib/bundler/man/bundle-install.1.ronn +1 -0
  85. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  86. data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
  87. data/bundler/lib/bundler/man/bundle-open.1 +7 -27
  88. data/bundler/lib/bundler/man/bundle-outdated.1 +3 -55
  89. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +1 -0
  90. data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
  91. data/bundler/lib/bundler/man/bundle-plugin.1 +3 -29
  92. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  93. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  94. data/bundler/lib/bundler/man/bundle-show.1 +3 -10
  95. data/bundler/lib/bundler/man/bundle-update.1 +18 -137
  96. data/bundler/lib/bundler/man/bundle-version.1 +3 -16
  97. data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
  98. data/bundler/lib/bundler/man/bundle.1 +5 -44
  99. data/bundler/lib/bundler/man/gemfile.5 +24 -301
  100. data/bundler/lib/bundler/man/gemfile.5.ronn +4 -0
  101. data/bundler/lib/bundler/match_metadata.rb +4 -0
  102. data/bundler/lib/bundler/match_platform.rb +1 -1
  103. data/bundler/lib/bundler/plugin/api/source.rb +3 -2
  104. data/bundler/lib/bundler/plugin/index.rb +8 -0
  105. data/bundler/lib/bundler/plugin/installer.rb +1 -1
  106. data/bundler/lib/bundler/plugin.rb +12 -5
  107. data/bundler/lib/bundler/resolver/base.rb +1 -1
  108. data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
  109. data/bundler/lib/bundler/resolver/spec_group.rb +1 -4
  110. data/bundler/lib/bundler/resolver.rb +16 -16
  111. data/bundler/lib/bundler/ruby_dsl.rb +20 -12
  112. data/bundler/lib/bundler/ruby_version.rb +1 -1
  113. data/bundler/lib/bundler/rubygems_ext.rb +27 -54
  114. data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -58
  115. data/bundler/lib/bundler/rubygems_integration.rb +25 -94
  116. data/bundler/lib/bundler/runtime.rb +2 -2
  117. data/bundler/lib/bundler/self_manager.rb +23 -7
  118. data/bundler/lib/bundler/settings.rb +27 -7
  119. data/bundler/lib/bundler/setup.rb +4 -1
  120. data/bundler/lib/bundler/shared_helpers.rb +35 -13
  121. data/bundler/lib/bundler/source/git/git_proxy.rb +22 -14
  122. data/bundler/lib/bundler/source/git.rb +4 -3
  123. data/bundler/lib/bundler/source/metadata.rb +16 -16
  124. data/bundler/lib/bundler/source/path.rb +7 -6
  125. data/bundler/lib/bundler/source/rubygems.rb +21 -14
  126. data/bundler/lib/bundler/source.rb +2 -0
  127. data/bundler/lib/bundler/spec_set.rb +43 -12
  128. data/bundler/lib/bundler/stub_specification.rb +1 -0
  129. data/bundler/lib/bundler/templates/Executable.bundler +1 -1
  130. data/bundler/lib/bundler/templates/newgem/README.md.tt +3 -3
  131. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -6
  132. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  133. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  134. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  135. data/bundler/lib/bundler/ui/shell.rb +2 -2
  136. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  137. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  138. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  139. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  140. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  141. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  142. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +36 -36
  143. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  144. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  145. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  146. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +8 -10
  147. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  148. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  149. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  150. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  151. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  152. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  153. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  154. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  155. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  156. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
  157. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  158. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
  159. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +44 -6
  160. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  161. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  162. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +26 -150
  163. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +4 -46
  164. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  165. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -45
  166. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
  167. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  168. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  169. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  170. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  171. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  172. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  173. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +155 -8
  174. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  175. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  176. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  177. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  178. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  179. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  180. data/bundler/lib/bundler/vendored_persistent.rb +0 -4
  181. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  182. data/bundler/lib/bundler/version.rb +1 -1
  183. data/bundler/lib/bundler/vlad.rb +1 -1
  184. data/bundler/lib/bundler/yaml_serializer.rb +9 -4
  185. data/bundler/lib/bundler.rb +38 -35
  186. data/lib/rubygems/available_set.rb +4 -4
  187. data/lib/rubygems/basic_specification.rb +35 -37
  188. data/lib/rubygems/bundler_version_finder.rb +4 -4
  189. data/lib/rubygems/ci_detector.rb +75 -0
  190. data/lib/rubygems/command.rb +15 -17
  191. data/lib/rubygems/command_manager.rb +5 -4
  192. data/lib/rubygems/commands/build_command.rb +2 -2
  193. data/lib/rubygems/commands/cert_command.rb +2 -3
  194. data/lib/rubygems/commands/check_command.rb +4 -4
  195. data/lib/rubygems/commands/cleanup_command.rb +12 -14
  196. data/lib/rubygems/commands/contents_command.rb +5 -5
  197. data/lib/rubygems/commands/dependency_command.rb +4 -5
  198. data/lib/rubygems/commands/environment_command.rb +3 -5
  199. data/lib/rubygems/commands/exec_command.rb +1 -1
  200. data/lib/rubygems/commands/fetch_command.rb +2 -2
  201. data/lib/rubygems/commands/generate_index_command.rb +39 -74
  202. data/lib/rubygems/commands/help_command.rb +4 -4
  203. data/lib/rubygems/commands/info_command.rb +2 -2
  204. data/lib/rubygems/commands/install_command.rb +8 -16
  205. data/lib/rubygems/commands/list_command.rb +2 -2
  206. data/lib/rubygems/commands/lock_command.rb +1 -1
  207. data/lib/rubygems/commands/open_command.rb +1 -1
  208. data/lib/rubygems/commands/owner_command.rb +1 -1
  209. data/lib/rubygems/commands/pristine_command.rb +13 -15
  210. data/lib/rubygems/commands/push_command.rb +2 -2
  211. data/lib/rubygems/commands/query_command.rb +4 -5
  212. data/lib/rubygems/commands/rdoc_command.rb +2 -2
  213. data/lib/rubygems/commands/search_command.rb +2 -2
  214. data/lib/rubygems/commands/setup_command.rb +33 -36
  215. data/lib/rubygems/commands/sources_command.rb +12 -12
  216. data/lib/rubygems/commands/specification_command.rb +10 -10
  217. data/lib/rubygems/commands/stale_command.rb +1 -1
  218. data/lib/rubygems/commands/uninstall_command.rb +13 -14
  219. data/lib/rubygems/commands/unpack_command.rb +7 -7
  220. data/lib/rubygems/commands/update_command.rb +11 -13
  221. data/lib/rubygems/commands/which_command.rb +1 -1
  222. data/lib/rubygems/commands/yank_command.rb +1 -1
  223. data/lib/rubygems/compatibility.rb +5 -6
  224. data/lib/rubygems/config_file.rb +7 -7
  225. data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
  226. data/lib/rubygems/core_ext/kernel_require.rb +20 -49
  227. data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
  228. data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
  229. data/lib/rubygems/defaults.rb +15 -3
  230. data/lib/rubygems/dependency.rb +12 -14
  231. data/lib/rubygems/dependency_installer.rb +30 -31
  232. data/lib/rubygems/dependency_list.rb +1 -1
  233. data/lib/rubygems/deprecate.rb +16 -15
  234. data/lib/rubygems/doctor.rb +6 -6
  235. data/lib/rubygems/errors.rb +2 -6
  236. data/lib/rubygems/exceptions.rb +2 -1
  237. data/lib/rubygems/ext/builder.rb +15 -10
  238. data/lib/rubygems/ext/cargo_builder.rb +5 -5
  239. data/lib/rubygems/ext/ext_conf_builder.rb +2 -4
  240. data/lib/rubygems/ext/rake_builder.rb +1 -1
  241. data/lib/rubygems/gem_runner.rb +4 -4
  242. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
  243. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
  244. data/lib/rubygems/gemcutter_utilities.rb +18 -19
  245. data/lib/rubygems/install_update_options.rb +18 -19
  246. data/lib/rubygems/installer.rb +66 -45
  247. data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
  248. data/lib/rubygems/local_remote_options.rb +8 -11
  249. data/lib/rubygems/name_tuple.rb +7 -9
  250. data/lib/rubygems/net/http.rb +3 -0
  251. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  252. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  253. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  254. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  255. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  256. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  257. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  258. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  259. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  260. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  261. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  262. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  263. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  264. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  265. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  266. data/lib/rubygems/optparse/lib/optparse.rb +39 -17
  267. data/lib/rubygems/package/digest_io.rb +1 -1
  268. data/lib/rubygems/package/old.rb +2 -2
  269. data/lib/rubygems/package/tar_header.rb +45 -39
  270. data/lib/rubygems/package/tar_reader/entry.rb +5 -4
  271. data/lib/rubygems/package/tar_reader.rb +14 -5
  272. data/lib/rubygems/package/tar_writer.rb +20 -18
  273. data/lib/rubygems/package.rb +28 -27
  274. data/lib/rubygems/package_task.rb +2 -2
  275. data/lib/rubygems/path_support.rb +10 -11
  276. data/lib/rubygems/platform.rb +65 -48
  277. data/lib/rubygems/query_utils.rb +7 -9
  278. data/lib/rubygems/remote_fetcher.rb +17 -17
  279. data/lib/rubygems/request/connection_pools.rb +3 -3
  280. data/lib/rubygems/request.rb +20 -17
  281. data/lib/rubygems/request_set/gem_dependency_api.rb +120 -123
  282. data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
  283. data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
  284. data/lib/rubygems/request_set/lockfile.rb +6 -11
  285. data/lib/rubygems/request_set.rb +5 -5
  286. data/lib/rubygems/requirement.rb +7 -7
  287. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  288. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  289. data/lib/rubygems/resolver/activation_request.rb +1 -3
  290. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  291. data/lib/rubygems/resolver/best_set.rb +1 -1
  292. data/lib/rubygems/resolver/composed_set.rb +1 -1
  293. data/lib/rubygems/resolver/conflict.rb +4 -12
  294. data/lib/rubygems/resolver/index_set.rb +4 -4
  295. data/lib/rubygems/resolver/index_specification.rb +2 -2
  296. data/lib/rubygems/resolver/installer_set.rb +5 -6
  297. data/lib/rubygems/resolver/lock_set.rb +1 -1
  298. data/lib/rubygems/resolver.rb +6 -13
  299. data/lib/rubygems/s3_uri_signer.rb +6 -6
  300. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  301. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  302. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  303. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  304. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  305. data/lib/rubygems/safe_marshal.rb +74 -0
  306. data/lib/rubygems/safe_yaml.rb +5 -28
  307. data/lib/rubygems/security/policies.rb +36 -38
  308. data/lib/rubygems/security/policy.rb +7 -11
  309. data/lib/rubygems/security/signer.rb +1 -1
  310. data/lib/rubygems/security/trust_dir.rb +4 -4
  311. data/lib/rubygems/security.rb +8 -22
  312. data/lib/rubygems/source/git.rb +1 -3
  313. data/lib/rubygems/source/installed.rb +0 -2
  314. data/lib/rubygems/source/local.rb +7 -9
  315. data/lib/rubygems/source/lock.rb +1 -3
  316. data/lib/rubygems/source/specific_file.rb +0 -1
  317. data/lib/rubygems/source/vendor.rb +0 -2
  318. data/lib/rubygems/source.rb +12 -12
  319. data/lib/rubygems/source_list.rb +5 -5
  320. data/lib/rubygems/spec_fetcher.rb +31 -31
  321. data/lib/rubygems/specification.rb +145 -150
  322. data/lib/rubygems/specification_policy.rb +61 -31
  323. data/lib/rubygems/stub_specification.rb +4 -5
  324. data/lib/rubygems/text.rb +1 -2
  325. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  326. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  327. data/lib/rubygems/timeout.rb +3 -0
  328. data/lib/rubygems/tsort/lib/tsort.rb +3 -0
  329. data/lib/rubygems/uninstaller.rb +9 -11
  330. data/lib/rubygems/update_suggestion.rb +5 -18
  331. data/lib/rubygems/uri_formatter.rb +1 -1
  332. data/lib/rubygems/user_interaction.rb +17 -23
  333. data/lib/rubygems/util/licenses.rb +113 -35
  334. data/lib/rubygems/util/list.rb +3 -1
  335. data/lib/rubygems/util.rb +2 -4
  336. data/lib/rubygems/validator.rb +6 -4
  337. data/lib/rubygems/version.rb +35 -29
  338. data/lib/rubygems/version_option.rb +2 -5
  339. data/lib/rubygems/yaml_serializer.rb +9 -4
  340. data/lib/rubygems.rb +42 -42
  341. data/rubygems-update.gemspec +4 -4
  342. data/setup.rb +2 -2
  343. metadata +43 -225
  344. data/lib/rubygems/indexer.rb +0 -428
  345. data/lib/rubygems/mock_gem_ui.rb +0 -86
  346. data/test/rubygems/alternate_cert.pem +0 -19
  347. data/test/rubygems/alternate_cert_32.pem +0 -19
  348. data/test/rubygems/alternate_key.pem +0 -27
  349. data/test/rubygems/bad_rake.rb +0 -3
  350. data/test/rubygems/bundler_test_gem.rb +0 -424
  351. data/test/rubygems/ca_cert.pem +0 -77
  352. data/test/rubygems/child_cert.pem +0 -19
  353. data/test/rubygems/child_cert_32.pem +0 -19
  354. data/test/rubygems/child_key.pem +0 -27
  355. data/test/rubygems/client.pem +0 -107
  356. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  357. data/test/rubygems/data/gem-private_key.pem +0 -27
  358. data/test/rubygems/data/gem-public_cert.pem +0 -20
  359. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  360. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  361. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  362. data/test/rubygems/encrypted_private_key.pem +0 -30
  363. data/test/rubygems/expired_cert.pem +0 -19
  364. data/test/rubygems/fake_certlib/openssl.rb +0 -9
  365. data/test/rubygems/foo/discover.rb +0 -1
  366. data/test/rubygems/future_cert.pem +0 -19
  367. data/test/rubygems/future_cert_32.pem +0 -19
  368. data/test/rubygems/good_rake.rb +0 -3
  369. data/test/rubygems/grandchild_cert.pem +0 -19
  370. data/test/rubygems/grandchild_cert_32.pem +0 -19
  371. data/test/rubygems/grandchild_key.pem +0 -27
  372. data/test/rubygems/helper.rb +0 -1649
  373. data/test/rubygems/installer_test_case.rb +0 -248
  374. data/test/rubygems/invalid_client.pem +0 -49
  375. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  376. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  377. data/test/rubygems/invalid_key.pem +0 -27
  378. data/test/rubygems/invalid_signer_cert.pem +0 -19
  379. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  380. data/test/rubygems/invalidchild_cert.pem +0 -19
  381. data/test/rubygems/invalidchild_cert_32.pem +0 -19
  382. data/test/rubygems/invalidchild_key.pem +0 -27
  383. data/test/rubygems/multifactor_auth_utilities.rb +0 -111
  384. data/test/rubygems/package/tar_test_case.rb +0 -175
  385. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  386. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  387. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  388. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
  389. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
  390. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
  391. data/test/rubygems/private3072_key.pem +0 -40
  392. data/test/rubygems/private_ec_key.pem +0 -9
  393. data/test/rubygems/private_key.pem +0 -27
  394. data/test/rubygems/public3072_cert.pem +0 -25
  395. data/test/rubygems/public_cert.pem +0 -20
  396. data/test/rubygems/public_cert_32.pem +0 -19
  397. data/test/rubygems/public_key.pem +0 -9
  398. data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
  399. data/test/rubygems/rubygems_plugin.rb +0 -24
  400. data/test/rubygems/sff/discover.rb +0 -1
  401. data/test/rubygems/simple_gem.rb +0 -68
  402. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  403. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  404. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
  405. data/test/rubygems/ssl_cert.pem +0 -80
  406. data/test/rubygems/ssl_key.pem +0 -27
  407. data/test/rubygems/test_bundled_ca.rb +0 -61
  408. data/test/rubygems/test_config.rb +0 -28
  409. data/test/rubygems/test_deprecate.rb +0 -158
  410. data/test/rubygems/test_exit.rb +0 -17
  411. data/test/rubygems/test_gem.rb +0 -1799
  412. data/test/rubygems/test_gem_available_set.rb +0 -130
  413. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
  414. data/test/rubygems/test_gem_command.rb +0 -403
  415. data/test/rubygems/test_gem_command_manager.rb +0 -400
  416. data/test/rubygems/test_gem_commands_build_command.rb +0 -739
  417. data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
  418. data/test/rubygems/test_gem_commands_check_command.rb +0 -68
  419. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
  420. data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
  421. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
  422. data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
  423. data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
  424. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
  425. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
  426. data/test/rubygems/test_gem_commands_help_command.rb +0 -94
  427. data/test/rubygems/test_gem_commands_info_command.rb +0 -70
  428. data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
  429. data/test/rubygems/test_gem_commands_list_command.rb +0 -33
  430. data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
  431. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  432. data/test/rubygems/test_gem_commands_open_command.rb +0 -101
  433. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
  434. data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
  435. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
  436. data/test/rubygems/test_gem_commands_push_command.rb +0 -603
  437. data/test/rubygems/test_gem_commands_query_command.rb +0 -858
  438. data/test/rubygems/test_gem_commands_search_command.rb +0 -16
  439. data/test/rubygems/test_gem_commands_server_command.rb +0 -20
  440. data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
  441. data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
  442. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  443. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  444. data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
  445. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  446. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -522
  447. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
  448. data/test/rubygems/test_gem_commands_update_command.rb +0 -836
  449. data/test/rubygems/test_gem_commands_which_command.rb +0 -85
  450. data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
  451. data/test/rubygems/test_gem_config_file.rb +0 -551
  452. data/test/rubygems/test_gem_dependency.rb +0 -398
  453. data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
  454. data/test/rubygems/test_gem_dependency_list.rb +0 -265
  455. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
  456. data/test/rubygems/test_gem_doctor.rb +0 -195
  457. data/test/rubygems/test_gem_ext_builder.rb +0 -337
  458. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  459. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  460. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
  461. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
  462. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
  463. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
  464. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  465. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
  466. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  467. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
  468. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
  469. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
  470. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
  471. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
  472. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
  473. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
  474. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
  475. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
  476. data/test/rubygems/test_gem_gem_runner.rb +0 -119
  477. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
  478. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
  479. data/test/rubygems/test_gem_indexer.rb +0 -381
  480. data/test/rubygems/test_gem_install_update_options.rb +0 -208
  481. data/test/rubygems/test_gem_installer.rb +0 -2512
  482. data/test/rubygems/test_gem_local_remote_options.rb +0 -133
  483. data/test/rubygems/test_gem_name_tuple.rb +0 -43
  484. data/test/rubygems/test_gem_package.rb +0 -1306
  485. data/test/rubygems/test_gem_package_old.rb +0 -91
  486. data/test/rubygems/test_gem_package_tar_header.rb +0 -226
  487. data/test/rubygems/test_gem_package_tar_reader.rb +0 -135
  488. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
  489. data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
  490. data/test/rubygems/test_gem_package_task.rb +0 -118
  491. data/test/rubygems/test_gem_path_support.rb +0 -139
  492. data/test/rubygems/test_gem_platform.rb +0 -497
  493. data/test/rubygems/test_gem_rdoc.rb +0 -137
  494. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
  495. data/test/rubygems/test_gem_request.rb +0 -547
  496. data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
  497. data/test/rubygems/test_gem_request_set.rb +0 -672
  498. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
  499. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
  500. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
  501. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
  502. data/test/rubygems/test_gem_requirement.rb +0 -505
  503. data/test/rubygems/test_gem_resolver.rb +0 -859
  504. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
  505. data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
  506. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
  507. data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
  508. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
  509. data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
  510. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
  511. data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
  512. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  513. data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
  514. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
  515. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
  516. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
  517. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
  518. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
  519. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
  520. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
  521. data/test/rubygems/test_gem_resolver_specification.rb +0 -63
  522. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
  523. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
  524. data/test/rubygems/test_gem_security.rb +0 -341
  525. data/test/rubygems/test_gem_security_policy.rb +0 -535
  526. data/test/rubygems/test_gem_security_signer.rb +0 -218
  527. data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
  528. data/test/rubygems/test_gem_silent_ui.rb +0 -123
  529. data/test/rubygems/test_gem_source.rb +0 -254
  530. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
  531. data/test/rubygems/test_gem_source_git.rb +0 -310
  532. data/test/rubygems/test_gem_source_installed.rb +0 -35
  533. data/test/rubygems/test_gem_source_list.rb +0 -119
  534. data/test/rubygems/test_gem_source_local.rb +0 -107
  535. data/test/rubygems/test_gem_source_lock.rb +0 -113
  536. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  537. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
  538. data/test/rubygems/test_gem_source_vendor.rb +0 -30
  539. data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
  540. data/test/rubygems/test_gem_specification.rb +0 -3856
  541. data/test/rubygems/test_gem_stream_ui.rb +0 -255
  542. data/test/rubygems/test_gem_stub_specification.rb +0 -278
  543. data/test/rubygems/test_gem_text.rb +0 -103
  544. data/test/rubygems/test_gem_uninstaller.rb +0 -675
  545. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
  546. data/test/rubygems/test_gem_update_suggestion.rb +0 -209
  547. data/test/rubygems/test_gem_uri.rb +0 -41
  548. data/test/rubygems/test_gem_uri_formatter.rb +0 -27
  549. data/test/rubygems/test_gem_util.rb +0 -91
  550. data/test/rubygems/test_gem_validator.rb +0 -42
  551. data/test/rubygems/test_gem_version.rb +0 -305
  552. data/test/rubygems/test_gem_version_option.rb +0 -165
  553. data/test/rubygems/test_kernel.rb +0 -124
  554. data/test/rubygems/test_project_sanity.rb +0 -49
  555. data/test/rubygems/test_remote_fetch_error.rb +0 -20
  556. data/test/rubygems/test_require.rb +0 -732
  557. data/test/rubygems/test_rubygems.rb +0 -76
  558. data/test/rubygems/test_webauthn_listener.rb +0 -143
  559. data/test/rubygems/test_webauthn_listener_response.rb +0 -93
  560. data/test/rubygems/test_webauthn_poller.rb +0 -124
  561. data/test/rubygems/utilities.rb +0 -436
  562. data/test/rubygems/wrong_key_cert.pem +0 -19
  563. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  564. data/test/test_changelog_generator.rb +0 -17
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ =begin
3
+
4
+ = net/https -- SSL/TLS enhancement for Gem::Net::HTTP.
5
+
6
+ This file has been merged with net/http. There is no longer any need to
7
+ require 'rubygems/net-http/lib/net/https' to use HTTPS.
8
+
9
+ See Gem::Net::HTTP for details on how to make HTTPS connections.
10
+
11
+ == Info
12
+ 'OpenSSL for Ruby 2' project
13
+ Copyright (C) 2001 GOTOU Yuuzou <gotoyuzo@notwork.org>
14
+ All rights reserved.
15
+
16
+ == Licence
17
+ This program is licensed under the same licence as Ruby.
18
+ (See the file 'LICENCE'.)
19
+
20
+ =end
21
+
22
+ require_relative 'http'
23
+ require 'openssl'
@@ -0,0 +1,22 @@
1
+ Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
@@ -0,0 +1,544 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # = net/protocol.rb
4
+ #
5
+ #--
6
+ # Copyright (c) 1999-2004 Yukihiro Matsumoto
7
+ # Copyright (c) 1999-2004 Minero Aoki
8
+ #
9
+ # written and maintained by Minero Aoki <aamine@loveruby.net>
10
+ #
11
+ # This program is free software. You can re-distribute and/or
12
+ # modify this program under the same terms as Ruby itself,
13
+ # Ruby Distribute License or GNU General Public License.
14
+ #
15
+ # $Id$
16
+ #++
17
+ #
18
+ # WARNING: This file is going to remove.
19
+ # Do not rely on the implementation written in this file.
20
+ #
21
+
22
+ require 'socket'
23
+ require_relative '../../../timeout/lib/timeout'
24
+ require 'io/wait'
25
+
26
+ module Gem::Net # :nodoc:
27
+
28
+ class Protocol #:nodoc: internal use only
29
+ VERSION = "0.2.2"
30
+
31
+ private
32
+ def Protocol.protocol_param(name, val)
33
+ module_eval(<<-End, __FILE__, __LINE__ + 1)
34
+ def #{name}
35
+ #{val}
36
+ end
37
+ End
38
+ end
39
+
40
+ def ssl_socket_connect(s, timeout)
41
+ if timeout
42
+ while true
43
+ raise Gem::Net::OpenTimeout if timeout <= 0
44
+ start = Process.clock_gettime Process::CLOCK_MONOTONIC
45
+ # to_io is required because SSLSocket doesn't have wait_readable yet
46
+ case s.connect_nonblock(exception: false)
47
+ when :wait_readable; s.to_io.wait_readable(timeout)
48
+ when :wait_writable; s.to_io.wait_writable(timeout)
49
+ else; break
50
+ end
51
+ timeout -= Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
52
+ end
53
+ else
54
+ s.connect
55
+ end
56
+ end
57
+ end
58
+
59
+
60
+ class ProtocolError < StandardError; end
61
+ class ProtoSyntaxError < ProtocolError; end
62
+ class ProtoFatalError < ProtocolError; end
63
+ class ProtoUnknownError < ProtocolError; end
64
+ class ProtoServerError < ProtocolError; end
65
+ class ProtoAuthError < ProtocolError; end
66
+ class ProtoCommandError < ProtocolError; end
67
+ class ProtoRetriableError < ProtocolError; end
68
+ ProtocRetryError = ProtoRetriableError
69
+
70
+ ##
71
+ # OpenTimeout, a subclass of Gem::Timeout::Error, is raised if a connection cannot
72
+ # be created within the open_timeout.
73
+
74
+ class OpenTimeout < Gem::Timeout::Error; end
75
+
76
+ ##
77
+ # ReadTimeout, a subclass of Gem::Timeout::Error, is raised if a chunk of the
78
+ # response cannot be read within the read_timeout.
79
+
80
+ class ReadTimeout < Gem::Timeout::Error
81
+ def initialize(io = nil)
82
+ @io = io
83
+ end
84
+ attr_reader :io
85
+
86
+ def message
87
+ msg = super
88
+ if @io
89
+ msg = "#{msg} with #{@io.inspect}"
90
+ end
91
+ msg
92
+ end
93
+ end
94
+
95
+ ##
96
+ # WriteTimeout, a subclass of Gem::Timeout::Error, is raised if a chunk of the
97
+ # response cannot be written within the write_timeout. Not raised on Windows.
98
+
99
+ class WriteTimeout < Gem::Timeout::Error
100
+ def initialize(io = nil)
101
+ @io = io
102
+ end
103
+ attr_reader :io
104
+
105
+ def message
106
+ msg = super
107
+ if @io
108
+ msg = "#{msg} with #{@io.inspect}"
109
+ end
110
+ msg
111
+ end
112
+ end
113
+
114
+
115
+ class BufferedIO #:nodoc: internal use only
116
+ def initialize(io, read_timeout: 60, write_timeout: 60, continue_timeout: nil, debug_output: nil)
117
+ @io = io
118
+ @read_timeout = read_timeout
119
+ @write_timeout = write_timeout
120
+ @continue_timeout = continue_timeout
121
+ @debug_output = debug_output
122
+ @rbuf = ''.b
123
+ @rbuf_empty = true
124
+ @rbuf_offset = 0
125
+ end
126
+
127
+ attr_reader :io
128
+ attr_accessor :read_timeout
129
+ attr_accessor :write_timeout
130
+ attr_accessor :continue_timeout
131
+ attr_accessor :debug_output
132
+
133
+ def inspect
134
+ "#<#{self.class} io=#{@io}>"
135
+ end
136
+
137
+ def eof?
138
+ @io.eof?
139
+ end
140
+
141
+ def closed?
142
+ @io.closed?
143
+ end
144
+
145
+ def close
146
+ @io.close
147
+ end
148
+
149
+ #
150
+ # Read
151
+ #
152
+
153
+ public
154
+
155
+ def read(len, dest = ''.b, ignore_eof = false)
156
+ LOG "reading #{len} bytes..."
157
+ read_bytes = 0
158
+ begin
159
+ while read_bytes + rbuf_size < len
160
+ if s = rbuf_consume_all
161
+ read_bytes += s.bytesize
162
+ dest << s
163
+ end
164
+ rbuf_fill
165
+ end
166
+ s = rbuf_consume(len - read_bytes)
167
+ read_bytes += s.bytesize
168
+ dest << s
169
+ rescue EOFError
170
+ raise unless ignore_eof
171
+ end
172
+ LOG "read #{read_bytes} bytes"
173
+ dest
174
+ end
175
+
176
+ def read_all(dest = ''.b)
177
+ LOG 'reading all...'
178
+ read_bytes = 0
179
+ begin
180
+ while true
181
+ if s = rbuf_consume_all
182
+ read_bytes += s.bytesize
183
+ dest << s
184
+ end
185
+ rbuf_fill
186
+ end
187
+ rescue EOFError
188
+ ;
189
+ end
190
+ LOG "read #{read_bytes} bytes"
191
+ dest
192
+ end
193
+
194
+ def readuntil(terminator, ignore_eof = false)
195
+ offset = @rbuf_offset
196
+ begin
197
+ until idx = @rbuf.index(terminator, offset)
198
+ offset = @rbuf.bytesize
199
+ rbuf_fill
200
+ end
201
+ return rbuf_consume(idx + terminator.bytesize - @rbuf_offset)
202
+ rescue EOFError
203
+ raise unless ignore_eof
204
+ return rbuf_consume
205
+ end
206
+ end
207
+
208
+ def readline
209
+ readuntil("\n").chop
210
+ end
211
+
212
+ private
213
+
214
+ BUFSIZE = 1024 * 16
215
+
216
+ def rbuf_fill
217
+ tmp = @rbuf_empty ? @rbuf : nil
218
+ case rv = @io.read_nonblock(BUFSIZE, tmp, exception: false)
219
+ when String
220
+ @rbuf_empty = false
221
+ if rv.equal?(tmp)
222
+ @rbuf_offset = 0
223
+ else
224
+ @rbuf << rv
225
+ rv.clear
226
+ end
227
+ return
228
+ when :wait_readable
229
+ (io = @io.to_io).wait_readable(@read_timeout) or raise Gem::Net::ReadTimeout.new(io)
230
+ # continue looping
231
+ when :wait_writable
232
+ # OpenSSL::Buffering#read_nonblock may fail with IO::WaitWritable.
233
+ # http://www.openssl.org/support/faq.html#PROG10
234
+ (io = @io.to_io).wait_writable(@read_timeout) or raise Gem::Net::ReadTimeout.new(io)
235
+ # continue looping
236
+ when nil
237
+ raise EOFError, 'end of file reached'
238
+ end while true
239
+ end
240
+
241
+ def rbuf_flush
242
+ if @rbuf_empty
243
+ @rbuf.clear
244
+ @rbuf_offset = 0
245
+ end
246
+ nil
247
+ end
248
+
249
+ def rbuf_size
250
+ @rbuf.bytesize - @rbuf_offset
251
+ end
252
+
253
+ def rbuf_consume_all
254
+ rbuf_consume if rbuf_size > 0
255
+ end
256
+
257
+ def rbuf_consume(len = nil)
258
+ if @rbuf_offset == 0 && (len.nil? || len == @rbuf.bytesize)
259
+ s = @rbuf
260
+ @rbuf = ''.b
261
+ @rbuf_offset = 0
262
+ @rbuf_empty = true
263
+ elsif len.nil?
264
+ s = @rbuf.byteslice(@rbuf_offset..-1)
265
+ @rbuf = ''.b
266
+ @rbuf_offset = 0
267
+ @rbuf_empty = true
268
+ else
269
+ s = @rbuf.byteslice(@rbuf_offset, len)
270
+ @rbuf_offset += len
271
+ @rbuf_empty = @rbuf_offset == @rbuf.bytesize
272
+ rbuf_flush
273
+ end
274
+
275
+ @debug_output << %Q[-> #{s.dump}\n] if @debug_output
276
+ s
277
+ end
278
+
279
+ #
280
+ # Write
281
+ #
282
+
283
+ public
284
+
285
+ def write(*strs)
286
+ writing {
287
+ write0(*strs)
288
+ }
289
+ end
290
+
291
+ alias << write
292
+
293
+ def writeline(str)
294
+ writing {
295
+ write0 str + "\r\n"
296
+ }
297
+ end
298
+
299
+ private
300
+
301
+ def writing
302
+ @written_bytes = 0
303
+ @debug_output << '<- ' if @debug_output
304
+ yield
305
+ @debug_output << "\n" if @debug_output
306
+ bytes = @written_bytes
307
+ @written_bytes = nil
308
+ bytes
309
+ end
310
+
311
+ def write0(*strs)
312
+ @debug_output << strs.map(&:dump).join if @debug_output
313
+ orig_written_bytes = @written_bytes
314
+ strs.each_with_index do |str, i|
315
+ need_retry = true
316
+ case len = @io.write_nonblock(str, exception: false)
317
+ when Integer
318
+ @written_bytes += len
319
+ len -= str.bytesize
320
+ if len == 0
321
+ if strs.size == i+1
322
+ return @written_bytes - orig_written_bytes
323
+ else
324
+ need_retry = false
325
+ # next string
326
+ end
327
+ elsif len < 0
328
+ str = str.byteslice(len, -len)
329
+ else # len > 0
330
+ need_retry = false
331
+ # next string
332
+ end
333
+ # continue looping
334
+ when :wait_writable
335
+ (io = @io.to_io).wait_writable(@write_timeout) or raise Gem::Net::WriteTimeout.new(io)
336
+ # continue looping
337
+ end while need_retry
338
+ end
339
+ end
340
+
341
+ #
342
+ # Logging
343
+ #
344
+
345
+ private
346
+
347
+ def LOG_off
348
+ @save_debug_out = @debug_output
349
+ @debug_output = nil
350
+ end
351
+
352
+ def LOG_on
353
+ @debug_output = @save_debug_out
354
+ end
355
+
356
+ def LOG(msg)
357
+ return unless @debug_output
358
+ @debug_output << msg + "\n"
359
+ end
360
+ end
361
+
362
+
363
+ class InternetMessageIO < BufferedIO #:nodoc: internal use only
364
+ def initialize(*, **)
365
+ super
366
+ @wbuf = nil
367
+ end
368
+
369
+ #
370
+ # Read
371
+ #
372
+
373
+ def each_message_chunk
374
+ LOG 'reading message...'
375
+ LOG_off()
376
+ read_bytes = 0
377
+ while (line = readuntil("\r\n")) != ".\r\n"
378
+ read_bytes += line.size
379
+ yield line.delete_prefix('.')
380
+ end
381
+ LOG_on()
382
+ LOG "read message (#{read_bytes} bytes)"
383
+ end
384
+
385
+ # *library private* (cannot handle 'break')
386
+ def each_list_item
387
+ while (str = readuntil("\r\n")) != ".\r\n"
388
+ yield str.chop
389
+ end
390
+ end
391
+
392
+ def write_message_0(src)
393
+ prev = @written_bytes
394
+ each_crlf_line(src) do |line|
395
+ write0 dot_stuff(line)
396
+ end
397
+ @written_bytes - prev
398
+ end
399
+
400
+ #
401
+ # Write
402
+ #
403
+
404
+ def write_message(src)
405
+ LOG "writing message from #{src.class}"
406
+ LOG_off()
407
+ len = writing {
408
+ using_each_crlf_line {
409
+ write_message_0 src
410
+ }
411
+ }
412
+ LOG_on()
413
+ LOG "wrote #{len} bytes"
414
+ len
415
+ end
416
+
417
+ def write_message_by_block(&block)
418
+ LOG 'writing message from block'
419
+ LOG_off()
420
+ len = writing {
421
+ using_each_crlf_line {
422
+ begin
423
+ block.call(WriteAdapter.new(self.method(:write_message_0)))
424
+ rescue LocalJumpError
425
+ # allow `break' from writer block
426
+ end
427
+ }
428
+ }
429
+ LOG_on()
430
+ LOG "wrote #{len} bytes"
431
+ len
432
+ end
433
+
434
+ private
435
+
436
+ def dot_stuff(s)
437
+ s.sub(/\A\./, '..')
438
+ end
439
+
440
+ def using_each_crlf_line
441
+ @wbuf = ''.b
442
+ yield
443
+ if not @wbuf.empty? # unterminated last line
444
+ write0 dot_stuff(@wbuf.chomp) + "\r\n"
445
+ elsif @written_bytes == 0 # empty src
446
+ write0 "\r\n"
447
+ end
448
+ write0 ".\r\n"
449
+ @wbuf = nil
450
+ end
451
+
452
+ def each_crlf_line(src)
453
+ buffer_filling(@wbuf, src) do
454
+ while line = @wbuf.slice!(/\A[^\r\n]*(?:\n|\r(?:\n|(?!\z)))/)
455
+ yield line.chomp("\n") + "\r\n"
456
+ end
457
+ end
458
+ end
459
+
460
+ def buffer_filling(buf, src)
461
+ case src
462
+ when String # for speeding up.
463
+ 0.step(src.size - 1, 1024) do |i|
464
+ buf << src[i, 1024]
465
+ yield
466
+ end
467
+ when File # for speeding up.
468
+ while s = src.read(1024)
469
+ buf << s
470
+ yield
471
+ end
472
+ else # generic reader
473
+ src.each do |str|
474
+ buf << str
475
+ yield if buf.size > 1024
476
+ end
477
+ yield unless buf.empty?
478
+ end
479
+ end
480
+ end
481
+
482
+
483
+ #
484
+ # The writer adapter class
485
+ #
486
+ class WriteAdapter
487
+ def initialize(writer)
488
+ @writer = writer
489
+ end
490
+
491
+ def inspect
492
+ "#<#{self.class} writer=#{@writer.inspect}>"
493
+ end
494
+
495
+ def write(str)
496
+ @writer.call(str)
497
+ end
498
+
499
+ alias print write
500
+
501
+ def <<(str)
502
+ write str
503
+ self
504
+ end
505
+
506
+ def puts(str = '')
507
+ write str.chomp("\n") + "\n"
508
+ end
509
+
510
+ def printf(*args)
511
+ write sprintf(*args)
512
+ end
513
+ end
514
+
515
+
516
+ class ReadAdapter #:nodoc: internal use only
517
+ def initialize(block)
518
+ @block = block
519
+ end
520
+
521
+ def inspect
522
+ "#<#{self.class}>"
523
+ end
524
+
525
+ def <<(str)
526
+ call_block(str, &@block) if @block
527
+ end
528
+
529
+ private
530
+
531
+ # This method is needed because @block must be called by yield,
532
+ # not Proc#call. You can see difference when using `break' in
533
+ # the block.
534
+ def call_block(str)
535
+ yield str
536
+ end
537
+ end
538
+
539
+
540
+ module NetPrivate #:nodoc: obsolete
541
+ Socket = ::Gem::Net::InternetMessageIO
542
+ end
543
+
544
+ end # module Gem::Net
@@ -48,7 +48,7 @@
48
48
  #
49
49
  # == Gem::OptionParser
50
50
  #
51
- # === New to \Gem::OptionParser?
51
+ # === New to +Gem::OptionParser+?
52
52
  #
53
53
  # See the {Tutorial}[optparse/tutorial.rdoc].
54
54
  #
@@ -152,14 +152,14 @@
152
152
  # Gem::OptionParser supports the ability to coerce command line arguments
153
153
  # into objects for us.
154
154
  #
155
- # Gem::OptionParser comes with a few ready-to-use kinds of type
155
+ # Gem::OptionParser comes with a few ready-to-use kinds of type
156
156
  # coercion. They are:
157
157
  #
158
- # - Date -- Anything accepted by +Date.parse+
159
- # - DateTime -- Anything accepted by +DateTime.parse+
160
- # - Time -- Anything accepted by +Time.httpdate+ or +Time.parse+
161
- # - URI -- Anything accepted by +URI.parse+
162
- # - Shellwords -- Anything accepted by +Shellwords.shellwords+
158
+ # - Date -- Anything accepted by +Date.parse+ (need to require +optparse/date+)
159
+ # - DateTime -- Anything accepted by +DateTime.parse+ (need to require +optparse/date+)
160
+ # - Time -- Anything accepted by +Time.httpdate+ or +Time.parse+ (need to require +optparse/time+)
161
+ # - URI -- Anything accepted by +URI.parse+ (need to require +optparse/uri+)
162
+ # - Shellwords -- Anything accepted by +Shellwords.shellwords+ (need to require +optparse/shellwords+)
163
163
  # - String -- Any non-empty string
164
164
  # - Integer -- Any integer. Will convert octal. (e.g. 124, -3, 040)
165
165
  # - Float -- Any float. (e.g. 10, 3.14, -100E+13)
@@ -425,7 +425,7 @@
425
425
  # If you have any questions, file a ticket at http://bugs.ruby-lang.org.
426
426
  #
427
427
  class Gem::OptionParser
428
- Gem::OptionParser::Version = "0.3.0"
428
+ Gem::OptionParser::Version = "0.4.0"
429
429
 
430
430
  # :stopdoc:
431
431
  NoArgument = [NO_ARGUMENT = :NONE, nil].freeze
@@ -1775,7 +1775,16 @@ XXX
1775
1775
  # # params["bar"] = "x" # --bar x
1776
1776
  # # params["zot"] = "z" # --zot Z
1777
1777
  #
1778
- def getopts(*args)
1778
+ # Option +symbolize_names+ (boolean) specifies whether returned Hash keys should be Symbols; defaults to +false+ (use Strings).
1779
+ #
1780
+ # params = ARGV.getopts("ab:", "foo", "bar:", "zot:Z;zot option", symbolize_names: true)
1781
+ # # params[:a] = true # -a
1782
+ # # params[:b] = "1" # -b1
1783
+ # # params[:foo] = "1" # --foo
1784
+ # # params[:bar] = "x" # --bar x
1785
+ # # params[:zot] = "z" # --zot Z
1786
+ #
1787
+ def getopts(*args, symbolize_names: false)
1779
1788
  argv = Array === args.first ? args.shift : default_argv
1780
1789
  single_options, *long_options = *args
1781
1790
 
@@ -1804,14 +1813,14 @@ XXX
1804
1813
  end
1805
1814
 
1806
1815
  parse_in_order(argv, result.method(:[]=))
1807
- result
1816
+ symbolize_names ? result.transform_keys(&:to_sym) : result
1808
1817
  end
1809
1818
 
1810
1819
  #
1811
1820
  # See #getopts.
1812
1821
  #
1813
- def self.getopts(*args)
1814
- new.getopts(*args)
1822
+ def self.getopts(*args, symbolize_names: false)
1823
+ new.getopts(*args, symbolize_names: symbolize_names)
1815
1824
  end
1816
1825
 
1817
1826
  #
@@ -2084,10 +2093,23 @@ XXX
2084
2093
  f |= Regexp::IGNORECASE if /i/ =~ o
2085
2094
  f |= Regexp::MULTILINE if /m/ =~ o
2086
2095
  f |= Regexp::EXTENDED if /x/ =~ o
2087
- k = o.delete("imx")
2088
- k = nil if k.empty?
2096
+ case o = o.delete("imx")
2097
+ when ""
2098
+ when "u"
2099
+ s = s.encode(Encoding::UTF_8)
2100
+ when "e"
2101
+ s = s.encode(Encoding::EUC_JP)
2102
+ when "s"
2103
+ s = s.encode(Encoding::SJIS)
2104
+ when "n"
2105
+ f |= Regexp::NOENCODING
2106
+ else
2107
+ raise Gem::OptionParser::InvalidArgument, "unknown regexp option - #{o}"
2108
+ end
2109
+ else
2110
+ s ||= all
2089
2111
  end
2090
- Regexp.new(s || all, f, k)
2112
+ Regexp.new(s, f)
2091
2113
  end
2092
2114
 
2093
2115
  #
@@ -2276,8 +2298,8 @@ XXX
2276
2298
  # rescue Gem::OptionParser::ParseError
2277
2299
  # end
2278
2300
  #
2279
- def getopts(*args)
2280
- options.getopts(self, *args)
2301
+ def getopts(*args, symbolize_names: false)
2302
+ options.getopts(self, *args, symbolize_names: symbolize_names)
2281
2303
  end
2282
2304
 
2283
2305
  #
@@ -36,7 +36,7 @@ class Gem::Package::DigestIO
36
36
 
37
37
  yield digest_io
38
38
 
39
- return digests
39
+ digests
40
40
  end
41
41
 
42
42
  ##