rubygems-update 3.3.18 → 3.4.19

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 (615) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1429 -1064
  3. data/CONTRIBUTING.md +31 -8
  4. data/Manifest.txt +61 -36
  5. data/POLICIES.md +55 -20
  6. data/README.md +19 -6
  7. data/bundler/CHANGELOG.md +457 -1
  8. data/bundler/README.md +3 -6
  9. data/bundler/UPGRADING.md +11 -4
  10. data/bundler/bundler.gemspec +8 -10
  11. data/bundler/exe/bundle +5 -16
  12. data/bundler/lib/bundler/build_metadata.rb +2 -2
  13. data/bundler/lib/bundler/cli/add.rb +1 -1
  14. data/bundler/lib/bundler/cli/binstubs.rb +6 -2
  15. data/bundler/lib/bundler/cli/check.rb +1 -1
  16. data/bundler/lib/bundler/cli/common.rb +2 -0
  17. data/bundler/lib/bundler/cli/console.rb +2 -2
  18. data/bundler/lib/bundler/cli/doctor.rb +4 -6
  19. data/bundler/lib/bundler/cli/gem.rb +62 -40
  20. data/bundler/lib/bundler/cli/info.rb +1 -1
  21. data/bundler/lib/bundler/cli/init.rb +6 -2
  22. data/bundler/lib/bundler/cli/install.rb +8 -6
  23. data/bundler/lib/bundler/cli/lock.rb +8 -5
  24. data/bundler/lib/bundler/cli/open.rb +6 -4
  25. data/bundler/lib/bundler/cli/outdated.rb +14 -7
  26. data/bundler/lib/bundler/cli/platform.rb +7 -5
  27. data/bundler/lib/bundler/cli/viz.rb +1 -1
  28. data/bundler/lib/bundler/cli.rb +53 -7
  29. data/bundler/lib/bundler/compact_index_client/cache.rb +1 -1
  30. data/bundler/lib/bundler/compact_index_client/updater.rb +40 -39
  31. data/bundler/lib/bundler/constants.rb +1 -1
  32. data/bundler/lib/bundler/current_ruby.rb +16 -5
  33. data/bundler/lib/bundler/definition.rb +262 -133
  34. data/bundler/lib/bundler/dependency.rb +20 -86
  35. data/bundler/lib/bundler/digest.rb +1 -1
  36. data/bundler/lib/bundler/dsl.rb +6 -7
  37. data/bundler/lib/bundler/endpoint_specification.rb +2 -13
  38. data/bundler/lib/bundler/env.rb +2 -2
  39. data/bundler/lib/bundler/environment_preserver.rb +3 -2
  40. data/bundler/lib/bundler/errors.rb +1 -11
  41. data/bundler/lib/bundler/feature_flag.rb +0 -2
  42. data/bundler/lib/bundler/fetcher/compact_index.rb +11 -13
  43. data/bundler/lib/bundler/fetcher/dependency.rb +2 -6
  44. data/bundler/lib/bundler/fetcher/downloader.rb +4 -5
  45. data/bundler/lib/bundler/fetcher/index.rb +1 -2
  46. data/bundler/lib/bundler/fetcher.rb +21 -15
  47. data/bundler/lib/bundler/force_platform.rb +18 -0
  48. data/bundler/lib/bundler/friendly_errors.rb +1 -4
  49. data/bundler/lib/bundler/gem_helper.rb +3 -4
  50. data/bundler/lib/bundler/gem_helpers.rb +7 -2
  51. data/bundler/lib/bundler/gem_version_promoter.rb +53 -98
  52. data/bundler/lib/bundler/graph.rb +3 -3
  53. data/bundler/lib/bundler/index.rb +13 -47
  54. data/bundler/lib/bundler/injector.rb +5 -4
  55. data/bundler/lib/bundler/inline.rb +9 -11
  56. data/bundler/lib/bundler/installer/parallel_installer.rb +4 -34
  57. data/bundler/lib/bundler/installer/standalone.rb +13 -9
  58. data/bundler/lib/bundler/installer.rb +17 -29
  59. data/bundler/lib/bundler/lazy_specification.rb +54 -53
  60. data/bundler/lib/bundler/lockfile_generator.rb +3 -3
  61. data/bundler/lib/bundler/lockfile_parser.rb +17 -16
  62. data/bundler/lib/bundler/man/bundle-add.1 +6 -2
  63. data/bundler/lib/bundler/man/bundle-add.1.ronn +4 -1
  64. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  65. data/bundler/lib/bundler/man/bundle-cache.1 +9 -3
  66. data/bundler/lib/bundler/man/bundle-cache.1.ronn +9 -2
  67. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  68. data/bundler/lib/bundler/man/bundle-clean.1 +2 -2
  69. data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
  70. data/bundler/lib/bundler/man/bundle-config.1 +26 -10
  71. data/bundler/lib/bundler/man/bundle-config.1.ronn +17 -10
  72. data/bundler/lib/bundler/man/bundle-console.1 +53 -0
  73. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  74. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  75. data/bundler/lib/bundler/man/bundle-exec.1 +6 -6
  76. data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -6
  77. data/bundler/lib/bundler/man/bundle-gem.1 +27 -37
  78. data/bundler/lib/bundler/man/bundle-gem.1.ronn +5 -5
  79. data/bundler/lib/bundler/man/bundle-help.1 +13 -0
  80. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  81. data/bundler/lib/bundler/man/bundle-info.1 +3 -3
  82. data/bundler/lib/bundler/man/bundle-info.1.ronn +3 -3
  83. data/bundler/lib/bundler/man/bundle-init.1 +5 -1
  84. data/bundler/lib/bundler/man/bundle-init.1.ronn +2 -0
  85. data/bundler/lib/bundler/man/bundle-inject.1 +5 -2
  86. data/bundler/lib/bundler/man/bundle-inject.1.ronn +3 -1
  87. data/bundler/lib/bundler/man/bundle-install.1 +5 -30
  88. data/bundler/lib/bundler/man/bundle-install.1.ronn +6 -29
  89. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  90. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  91. data/bundler/lib/bundler/man/bundle-open.1 +22 -2
  92. data/bundler/lib/bundler/man/bundle-open.1.ronn +9 -1
  93. data/bundler/lib/bundler/man/bundle-outdated.1 +13 -9
  94. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +12 -9
  95. data/bundler/lib/bundler/man/bundle-platform.1 +16 -6
  96. data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
  97. data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
  98. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  99. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  100. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  101. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  102. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  103. data/bundler/lib/bundler/man/bundle-version.1 +35 -0
  104. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  105. data/bundler/lib/bundler/man/bundle-viz.1 +4 -1
  106. data/bundler/lib/bundler/man/bundle-viz.1.ronn +2 -0
  107. data/bundler/lib/bundler/man/bundle.1 +15 -10
  108. data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
  109. data/bundler/lib/bundler/man/gemfile.5 +55 -55
  110. data/bundler/lib/bundler/man/gemfile.5.ronn +57 -53
  111. data/bundler/lib/bundler/man/index.txt +4 -0
  112. data/bundler/lib/bundler/match_metadata.rb +13 -0
  113. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  114. data/bundler/lib/bundler/mirror.rb +5 -7
  115. data/bundler/lib/bundler/plugin/index.rb +5 -5
  116. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  117. data/bundler/lib/bundler/plugin/installer.rb +5 -2
  118. data/bundler/lib/bundler/plugin.rb +3 -1
  119. data/bundler/lib/bundler/remote_specification.rb +7 -12
  120. data/bundler/lib/bundler/resolver/base.rb +107 -0
  121. data/bundler/lib/bundler/resolver/candidate.rb +94 -0
  122. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  123. data/bundler/lib/bundler/resolver/package.rb +72 -0
  124. data/bundler/lib/bundler/resolver/root.rb +25 -0
  125. data/bundler/lib/bundler/resolver/spec_group.rb +42 -71
  126. data/bundler/lib/bundler/resolver.rb +335 -328
  127. data/bundler/lib/bundler/ruby_dsl.rb +7 -1
  128. data/bundler/lib/bundler/ruby_version.rb +8 -8
  129. data/bundler/lib/bundler/rubygems_ext.rb +100 -9
  130. data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -14
  131. data/bundler/lib/bundler/rubygems_integration.rb +11 -15
  132. data/bundler/lib/bundler/runtime.rb +2 -6
  133. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  134. data/bundler/lib/bundler/settings.rb +5 -11
  135. data/bundler/lib/bundler/setup.rb +4 -1
  136. data/bundler/lib/bundler/shared_helpers.rb +3 -3
  137. data/bundler/lib/bundler/source/git/git_proxy.rb +237 -74
  138. data/bundler/lib/bundler/source/git.rb +55 -30
  139. data/bundler/lib/bundler/source/metadata.rb +1 -2
  140. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  141. data/bundler/lib/bundler/source/path.rb +6 -6
  142. data/bundler/lib/bundler/source/rubygems.rb +26 -81
  143. data/bundler/lib/bundler/source.rb +1 -1
  144. data/bundler/lib/bundler/source_list.rb +8 -2
  145. data/bundler/lib/bundler/spec_set.rb +60 -37
  146. data/bundler/lib/bundler/templates/Executable +1 -1
  147. data/bundler/lib/bundler/templates/Executable.bundler +5 -10
  148. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  149. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  150. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  151. data/bundler/lib/bundler/templates/newgem/README.md.tt +6 -4
  152. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +12 -1
  153. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  154. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  155. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  156. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  157. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  158. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  159. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  160. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  161. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  162. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  163. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +9 -2
  164. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  165. data/bundler/lib/bundler/ui/shell.rb +35 -12
  166. data/bundler/lib/bundler/ui/silent.rb +21 -5
  167. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  168. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  169. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  170. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  171. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1351 -409
  172. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  173. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  174. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  175. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  176. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  177. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  178. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  179. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  180. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  181. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  182. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  183. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  184. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  185. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  186. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  187. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  188. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  189. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  190. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  191. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  192. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  193. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  194. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  195. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  196. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  197. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  198. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  199. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  200. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  201. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +15 -9
  202. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +11 -6
  203. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  204. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  205. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  206. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  207. data/bundler/lib/bundler/vendored_persistent.rb +1 -33
  208. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  209. data/bundler/lib/bundler/version.rb +5 -1
  210. data/bundler/lib/bundler/worker.rb +5 -7
  211. data/bundler/lib/bundler.rb +25 -77
  212. data/{bin → exe}/gem +4 -5
  213. data/{bin → exe}/update_rubygems +12 -10
  214. data/lib/rubygems/available_set.rb +4 -3
  215. data/lib/rubygems/basic_specification.rb +5 -4
  216. data/lib/rubygems/bundler_version_finder.rb +2 -2
  217. data/lib/rubygems/command.rb +41 -32
  218. data/lib/rubygems/command_manager.rb +30 -15
  219. data/lib/rubygems/commands/build_command.rb +12 -8
  220. data/lib/rubygems/commands/cert_command.rb +34 -33
  221. data/lib/rubygems/commands/check_command.rb +21 -20
  222. data/lib/rubygems/commands/cleanup_command.rb +18 -17
  223. data/lib/rubygems/commands/contents_command.rb +14 -13
  224. data/lib/rubygems/commands/dependency_command.rb +17 -16
  225. data/lib/rubygems/commands/environment_command.rb +6 -5
  226. data/lib/rubygems/commands/exec_command.rb +249 -0
  227. data/lib/rubygems/commands/fetch_command.rb +10 -9
  228. data/lib/rubygems/commands/generate_index_command.rb +18 -17
  229. data/lib/rubygems/commands/help_command.rb +7 -6
  230. data/lib/rubygems/commands/info_command.rb +3 -3
  231. data/lib/rubygems/commands/install_command.rb +28 -23
  232. data/lib/rubygems/commands/list_command.rb +4 -3
  233. data/lib/rubygems/commands/lock_command.rb +5 -4
  234. data/lib/rubygems/commands/mirror_command.rb +4 -3
  235. data/lib/rubygems/commands/open_command.rb +10 -9
  236. data/lib/rubygems/commands/outdated_command.rb +6 -5
  237. data/lib/rubygems/commands/owner_command.rb +17 -14
  238. data/lib/rubygems/commands/pristine_command.rb +46 -36
  239. data/lib/rubygems/commands/push_command.rb +9 -8
  240. data/lib/rubygems/commands/query_command.rb +9 -8
  241. data/lib/rubygems/commands/rdoc_command.rb +21 -19
  242. data/lib/rubygems/commands/search_command.rb +4 -3
  243. data/lib/rubygems/commands/server_command.rb +4 -3
  244. data/lib/rubygems/commands/setup_command.rb +97 -106
  245. data/lib/rubygems/commands/signin_command.rb +10 -9
  246. data/lib/rubygems/commands/signout_command.rb +8 -7
  247. data/lib/rubygems/commands/sources_command.rb +22 -21
  248. data/lib/rubygems/commands/specification_command.rb +14 -13
  249. data/lib/rubygems/commands/stale_command.rb +3 -2
  250. data/lib/rubygems/commands/uninstall_command.rb +44 -40
  251. data/lib/rubygems/commands/unpack_command.rb +14 -13
  252. data/lib/rubygems/commands/update_command.rb +42 -63
  253. data/lib/rubygems/commands/which_command.rb +8 -7
  254. data/lib/rubygems/commands/yank_command.rb +12 -11
  255. data/lib/rubygems/config_file.rb +55 -21
  256. data/lib/rubygems/core_ext/kernel_gem.rb +1 -6
  257. data/lib/rubygems/core_ext/kernel_require.rb +109 -115
  258. data/lib/rubygems/core_ext/kernel_warn.rb +33 -37
  259. data/lib/rubygems/core_ext/tcpsocket_init.rb +3 -1
  260. data/lib/rubygems/defaults.rb +33 -18
  261. data/lib/rubygems/dependency.rb +15 -11
  262. data/lib/rubygems/dependency_installer.rb +38 -37
  263. data/lib/rubygems/dependency_list.rb +7 -6
  264. data/lib/rubygems/deprecate.rb +3 -2
  265. data/lib/rubygems/doctor.rb +19 -18
  266. data/lib/rubygems/errors.rb +3 -2
  267. data/lib/rubygems/exceptions.rb +16 -8
  268. data/lib/rubygems/ext/build_error.rb +2 -1
  269. data/lib/rubygems/ext/builder.rb +37 -21
  270. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  271. data/lib/rubygems/ext/cargo_builder.rb +150 -111
  272. data/lib/rubygems/ext/cmake_builder.rb +2 -2
  273. data/lib/rubygems/ext/configure_builder.rb +2 -1
  274. data/lib/rubygems/ext/ext_conf_builder.rb +11 -9
  275. data/lib/rubygems/ext/rake_builder.rb +7 -5
  276. data/lib/rubygems/ext.rb +8 -7
  277. data/lib/rubygems/gem_runner.rb +6 -5
  278. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  279. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  280. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  281. data/lib/rubygems/gemcutter_utilities.rb +90 -34
  282. data/lib/rubygems/indexer.rb +29 -28
  283. data/lib/rubygems/install_default_message.rb +3 -2
  284. data/lib/rubygems/install_message.rb +3 -2
  285. data/lib/rubygems/install_update_options.rb +56 -55
  286. data/lib/rubygems/installer.rb +54 -46
  287. data/lib/rubygems/installer_uninstaller_utils.rb +2 -2
  288. data/lib/rubygems/local_remote_options.rb +19 -20
  289. data/lib/rubygems/mock_gem_ui.rb +3 -2
  290. data/lib/rubygems/name_tuple.rb +5 -4
  291. data/lib/rubygems/optparse/lib/optparse.rb +20 -15
  292. data/lib/rubygems/optparse.rb +1 -1
  293. data/lib/rubygems/package/digest_io.rb +1 -0
  294. data/lib/rubygems/package/file_source.rb +3 -2
  295. data/lib/rubygems/package/io_source.rb +1 -0
  296. data/lib/rubygems/package/old.rb +9 -8
  297. data/lib/rubygems/package/source.rb +1 -0
  298. data/lib/rubygems/package/tar_header.rb +63 -62
  299. data/lib/rubygems/package/tar_reader/entry.rb +91 -9
  300. data/lib/rubygems/package/tar_reader.rb +2 -29
  301. data/lib/rubygems/package/tar_writer.rb +8 -7
  302. data/lib/rubygems/package.rb +64 -48
  303. data/lib/rubygems/package_task.rb +5 -4
  304. data/lib/rubygems/path_support.rb +1 -0
  305. data/lib/rubygems/platform.rb +79 -53
  306. data/lib/rubygems/psych_tree.rb +2 -1
  307. data/lib/rubygems/query_utils.rb +35 -35
  308. data/lib/rubygems/rdoc.rb +3 -2
  309. data/lib/rubygems/remote_fetcher.rb +23 -22
  310. data/lib/rubygems/request/connection_pools.rb +4 -4
  311. data/lib/rubygems/request/http_pool.rb +2 -1
  312. data/lib/rubygems/request/https_pool.rb +1 -0
  313. data/lib/rubygems/request.rb +23 -22
  314. data/lib/rubygems/request_set/gem_dependency_api.rb +123 -123
  315. data/lib/rubygems/request_set/lockfile/parser.rb +28 -27
  316. data/lib/rubygems/request_set/lockfile/tokenizer.rb +5 -3
  317. data/lib/rubygems/request_set/lockfile.rb +6 -5
  318. data/lib/rubygems/request_set.rb +20 -19
  319. data/lib/rubygems/requirement.rb +15 -14
  320. data/lib/rubygems/resolver/activation_request.rb +4 -3
  321. data/lib/rubygems/resolver/api_set.rb +5 -4
  322. data/lib/rubygems/resolver/api_specification.rb +7 -6
  323. data/lib/rubygems/resolver/best_set.rb +6 -5
  324. data/lib/rubygems/resolver/composed_set.rb +1 -0
  325. data/lib/rubygems/resolver/conflict.rb +11 -10
  326. data/lib/rubygems/resolver/current_set.rb +1 -0
  327. data/lib/rubygems/resolver/dependency_request.rb +3 -2
  328. data/lib/rubygems/resolver/git_set.rb +3 -2
  329. data/lib/rubygems/resolver/git_specification.rb +7 -6
  330. data/lib/rubygems/resolver/index_set.rb +4 -3
  331. data/lib/rubygems/resolver/index_specification.rb +7 -5
  332. data/lib/rubygems/resolver/installed_specification.rb +5 -4
  333. data/lib/rubygems/resolver/installer_set.rb +15 -17
  334. data/lib/rubygems/resolver/local_specification.rb +3 -2
  335. data/lib/rubygems/resolver/lock_set.rb +5 -4
  336. data/lib/rubygems/resolver/lock_specification.rb +5 -4
  337. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +1 -1
  338. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +32 -26
  339. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  340. data/lib/rubygems/resolver/molinillo.rb +2 -1
  341. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  342. data/lib/rubygems/resolver/set.rb +1 -0
  343. data/lib/rubygems/resolver/source_set.rb +2 -0
  344. data/lib/rubygems/resolver/spec_specification.rb +1 -0
  345. data/lib/rubygems/resolver/specification.rb +2 -1
  346. data/lib/rubygems/resolver/stats.rb +2 -1
  347. data/lib/rubygems/resolver/vendor_set.rb +2 -1
  348. data/lib/rubygems/resolver/vendor_specification.rb +4 -3
  349. data/lib/rubygems/resolver.rb +41 -40
  350. data/lib/rubygems/s3_uri_signer.rb +10 -8
  351. data/lib/rubygems/safe_yaml.rb +4 -2
  352. data/lib/rubygems/security/policies.rb +48 -47
  353. data/lib/rubygems/security/policy.rb +19 -18
  354. data/lib/rubygems/security/signer.rb +6 -5
  355. data/lib/rubygems/security/trust_dir.rb +5 -4
  356. data/lib/rubygems/security.rb +30 -42
  357. data/lib/rubygems/security_option.rb +6 -5
  358. data/lib/rubygems/shellwords.rb +3 -0
  359. data/lib/rubygems/source/git.rb +22 -22
  360. data/lib/rubygems/source/installed.rb +2 -1
  361. data/lib/rubygems/source/local.rb +3 -2
  362. data/lib/rubygems/source/lock.rb +1 -0
  363. data/lib/rubygems/source/specific_file.rb +2 -1
  364. data/lib/rubygems/source/vendor.rb +1 -0
  365. data/lib/rubygems/source.rb +16 -16
  366. data/lib/rubygems/spec_fetcher.rb +10 -9
  367. data/lib/rubygems/specification.rb +121 -114
  368. data/lib/rubygems/specification_policy.rb +36 -15
  369. data/lib/rubygems/stub_specification.rb +11 -9
  370. data/lib/rubygems/text.rb +2 -2
  371. data/lib/rubygems/tsort/lib/tsort.rb +308 -310
  372. data/lib/rubygems/tsort.rb +1 -1
  373. data/lib/rubygems/uninstaller.rb +19 -18
  374. data/lib/rubygems/update_suggestion.rb +69 -0
  375. data/lib/rubygems/uri.rb +4 -4
  376. data/lib/rubygems/uri_formatter.rb +1 -1
  377. data/lib/rubygems/user_interaction.rb +37 -21
  378. data/lib/rubygems/util/licenses.rb +4 -3
  379. data/lib/rubygems/util/list.rb +1 -0
  380. data/lib/rubygems/util.rb +12 -15
  381. data/lib/rubygems/validator.rb +7 -6
  382. data/lib/rubygems/version.rb +17 -11
  383. data/lib/rubygems/version_option.rb +4 -3
  384. data/lib/rubygems.rb +89 -68
  385. data/rubygems-update.gemspec +10 -8
  386. data/setup.rb +10 -9
  387. data/test/rubygems/alternate_cert.pem +14 -14
  388. data/test/rubygems/alternate_cert_32.pem +15 -15
  389. data/test/rubygems/alternate_key.pem +25 -25
  390. data/test/rubygems/bad_rake.rb +1 -0
  391. data/test/rubygems/bundler_test_gem.rb +421 -0
  392. data/test/rubygems/child_cert.pem +15 -16
  393. data/test/rubygems/child_cert_32.pem +15 -16
  394. data/test/rubygems/child_key.pem +25 -25
  395. data/test/rubygems/encrypted_private_key.pem +26 -26
  396. data/test/rubygems/expired_cert.pem +15 -15
  397. data/test/rubygems/fake_certlib/openssl.rb +1 -0
  398. data/test/rubygems/future_cert.pem +15 -15
  399. data/test/rubygems/future_cert_32.pem +15 -15
  400. data/test/rubygems/good_rake.rb +1 -0
  401. data/test/rubygems/grandchild_cert.pem +15 -16
  402. data/test/rubygems/grandchild_cert_32.pem +15 -16
  403. data/test/rubygems/grandchild_key.pem +25 -25
  404. data/test/rubygems/helper.rb +172 -151
  405. data/test/rubygems/installer_test_case.rb +14 -13
  406. data/test/rubygems/invalid_issuer_cert.pem +16 -16
  407. data/test/rubygems/invalid_issuer_cert_32.pem +16 -16
  408. data/test/rubygems/invalid_key.pem +25 -25
  409. data/test/rubygems/invalid_signer_cert.pem +15 -15
  410. data/test/rubygems/invalid_signer_cert_32.pem +15 -15
  411. data/test/rubygems/invalidchild_cert.pem +15 -16
  412. data/test/rubygems/invalidchild_cert_32.pem +15 -16
  413. data/test/rubygems/invalidchild_key.pem +25 -25
  414. data/test/rubygems/multifactor_auth_utilities.rb +111 -0
  415. data/test/rubygems/package/tar_test_case.rb +53 -17
  416. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  417. data/test/rubygems/plugin/exception/rubygems_plugin.rb +2 -1
  418. data/test/rubygems/plugin/load/rubygems_plugin.rb +1 -0
  419. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +2 -1
  420. data/test/rubygems/private_key.pem +25 -25
  421. data/test/rubygems/public_cert.pem +16 -16
  422. data/test/rubygems/public_cert_32.pem +15 -15
  423. data/test/rubygems/public_key.pem +7 -7
  424. data/test/rubygems/rubygems/commands/crash_command.rb +1 -0
  425. data/test/rubygems/rubygems_plugin.rb +3 -2
  426. data/test/rubygems/simple_gem.rb +2 -1
  427. data/test/rubygems/specifications/bar-0.0.2.gemspec +2 -0
  428. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +6 -4
  429. data/test/rubygems/test_bundled_ca.rb +13 -12
  430. data/test/rubygems/test_config.rb +5 -4
  431. data/test/rubygems/test_deprecate.rb +5 -4
  432. data/test/rubygems/test_exit.rb +9 -3
  433. data/test/rubygems/test_gem.rb +339 -677
  434. data/test/rubygems/test_gem_available_set.rb +22 -21
  435. data/test/rubygems/test_gem_bundler_version_finder.rb +6 -4
  436. data/test/rubygems/test_gem_command.rb +45 -44
  437. data/test/rubygems/test_gem_command_manager.rb +96 -30
  438. data/test/rubygems/test_gem_commands_build_command.rb +74 -63
  439. data/test/rubygems/test_gem_commands_cert_command.rb +98 -99
  440. data/test/rubygems/test_gem_commands_check_command.rb +5 -4
  441. data/test/rubygems/test_gem_commands_cleanup_command.rb +41 -40
  442. data/test/rubygems/test_gem_commands_contents_command.rb +28 -27
  443. data/test/rubygems/test_gem_commands_dependency_command.rb +37 -36
  444. data/test/rubygems/test_gem_commands_environment_command.rb +17 -16
  445. data/test/rubygems/test_gem_commands_exec_command.rb +853 -0
  446. data/test/rubygems/test_gem_commands_fetch_command.rb +38 -37
  447. data/test/rubygems/test_gem_commands_generate_index_command.rb +8 -7
  448. data/test/rubygems/test_gem_commands_help_command.rb +14 -13
  449. data/test/rubygems/test_gem_commands_info_command.rb +29 -2
  450. data/test/rubygems/test_gem_commands_install_command.rb +152 -132
  451. data/test/rubygems/test_gem_commands_list_command.rb +5 -4
  452. data/test/rubygems/test_gem_commands_lock_command.rb +11 -10
  453. data/test/rubygems/test_gem_commands_mirror.rb +3 -2
  454. data/test/rubygems/test_gem_commands_open_command.rb +5 -4
  455. data/test/rubygems/test_gem_commands_outdated_command.rb +10 -9
  456. data/test/rubygems/test_gem_commands_owner_command.rb +227 -50
  457. data/test/rubygems/test_gem_commands_pristine_command.rb +142 -93
  458. data/test/rubygems/test_gem_commands_push_command.rb +189 -64
  459. data/test/rubygems/test_gem_commands_query_command.rb +74 -73
  460. data/test/rubygems/test_gem_commands_search_command.rb +3 -2
  461. data/test/rubygems/test_gem_commands_server_command.rb +3 -2
  462. data/test/rubygems/test_gem_commands_setup_command.rb +123 -96
  463. data/test/rubygems/test_gem_commands_signin_command.rb +71 -31
  464. data/test/rubygems/test_gem_commands_signout_command.rb +3 -3
  465. data/test/rubygems/test_gem_commands_sources_command.rb +29 -29
  466. data/test/rubygems/test_gem_commands_specification_command.rb +33 -32
  467. data/test/rubygems/test_gem_commands_stale_command.rb +5 -4
  468. data/test/rubygems/test_gem_commands_uninstall_command.rb +99 -81
  469. data/test/rubygems/test_gem_commands_unpack_command.rb +32 -31
  470. data/test/rubygems/test_gem_commands_update_command.rb +96 -95
  471. data/test/rubygems/test_gem_commands_which_command.rb +7 -6
  472. data/test/rubygems/test_gem_commands_yank_command.rb +162 -43
  473. data/test/rubygems/test_gem_config_file.rb +94 -81
  474. data/test/rubygems/test_gem_dependency.rb +76 -73
  475. data/test/rubygems/test_gem_dependency_installer.rb +200 -165
  476. data/test/rubygems/test_gem_dependency_list.rb +48 -47
  477. data/test/rubygems/test_gem_dependency_resolution_error.rb +5 -4
  478. data/test/rubygems/test_gem_doctor.rb +27 -26
  479. data/test/rubygems/test_gem_ext_builder.rb +60 -61
  480. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +4 -4
  481. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.lock → ext/custom_name_lib/Cargo.lock} +23 -33
  482. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.toml → ext/custom_name_lib/Cargo.toml} +1 -1
  483. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{src → ext/custom_name_lib/src}/lib.rs +1 -1
  484. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +3 -0
  485. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +37 -33
  486. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
  487. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +2 -0
  488. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +12 -0
  489. data/test/rubygems/test_gem_ext_cargo_builder.rb +48 -59
  490. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +20 -19
  491. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +21 -36
  492. data/test/rubygems/test_gem_ext_cmake_builder.rb +16 -15
  493. data/test/rubygems/test_gem_ext_configure_builder.rb +14 -13
  494. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +51 -52
  495. data/test/rubygems/test_gem_ext_rake_builder.rb +16 -15
  496. data/test/rubygems/test_gem_gem_runner.rb +15 -9
  497. data/test/rubygems/test_gem_gemcutter_utilities.rb +170 -84
  498. data/test/rubygems/test_gem_impossible_dependencies_error.rb +5 -4
  499. data/test/rubygems/test_gem_indexer.rb +87 -67
  500. data/test/rubygems/test_gem_install_update_options.rb +17 -16
  501. data/test/rubygems/test_gem_installer.rb +422 -304
  502. data/test/rubygems/test_gem_local_remote_options.rb +11 -10
  503. data/test/rubygems/test_gem_name_tuple.rb +5 -4
  504. data/test/rubygems/test_gem_package.rb +243 -231
  505. data/test/rubygems/test_gem_package_old.rb +14 -13
  506. data/test/rubygems/test_gem_package_tar_header.rb +48 -47
  507. data/test/rubygems/test_gem_package_tar_reader.rb +56 -8
  508. data/test/rubygems/test_gem_package_tar_reader_entry.rb +162 -16
  509. data/test/rubygems/test_gem_package_tar_writer.rb +77 -76
  510. data/test/rubygems/test_gem_package_task.rb +19 -18
  511. data/test/rubygems/test_gem_path_support.rb +15 -14
  512. data/test/rubygems/test_gem_platform.rb +333 -227
  513. data/test/rubygems/test_gem_rdoc.rb +15 -14
  514. data/test/rubygems/test_gem_remote_fetcher.rb +155 -154
  515. data/test/rubygems/test_gem_request.rb +64 -58
  516. data/test/rubygems/test_gem_request_connection_pools.rb +30 -29
  517. data/test/rubygems/test_gem_request_set.rb +101 -100
  518. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +210 -211
  519. data/test/rubygems/test_gem_request_set_lockfile.rb +87 -86
  520. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +58 -57
  521. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +63 -62
  522. data/test/rubygems/test_gem_requirement.rb +48 -41
  523. data/test/rubygems/test_gem_resolver.rb +167 -99
  524. data/test/rubygems/test_gem_resolver_activation_request.rb +7 -6
  525. data/test/rubygems/test_gem_resolver_api_set.rb +34 -33
  526. data/test/rubygems/test_gem_resolver_api_specification.rb +48 -47
  527. data/test/rubygems/test_gem_resolver_best_set.rb +23 -22
  528. data/test/rubygems/test_gem_resolver_composed_set.rb +2 -1
  529. data/test/rubygems/test_gem_resolver_conflict.rb +13 -12
  530. data/test/rubygems/test_gem_resolver_dependency_request.rb +16 -15
  531. data/test/rubygems/test_gem_resolver_git_set.rb +22 -21
  532. data/test/rubygems/test_gem_resolver_git_specification.rb +22 -21
  533. data/test/rubygems/test_gem_resolver_index_set.rb +13 -12
  534. data/test/rubygems/test_gem_resolver_index_specification.rb +17 -16
  535. data/test/rubygems/test_gem_resolver_installed_specification.rb +6 -5
  536. data/test/rubygems/test_gem_resolver_installer_set.rb +79 -34
  537. data/test/rubygems/test_gem_resolver_local_specification.rb +8 -7
  538. data/test/rubygems/test_gem_resolver_lock_set.rb +13 -12
  539. data/test/rubygems/test_gem_resolver_lock_specification.rb +18 -17
  540. data/test/rubygems/test_gem_resolver_requirement_list.rb +2 -1
  541. data/test/rubygems/test_gem_resolver_specification.rb +9 -8
  542. data/test/rubygems/test_gem_resolver_vendor_set.rb +7 -6
  543. data/test/rubygems/test_gem_resolver_vendor_specification.rb +11 -10
  544. data/test/rubygems/test_gem_security.rb +69 -68
  545. data/test/rubygems/test_gem_security_policy.rb +72 -72
  546. data/test/rubygems/test_gem_security_signer.rb +35 -34
  547. data/test/rubygems/test_gem_security_trust_dir.rb +7 -6
  548. data/test/rubygems/test_gem_silent_ui.rb +39 -32
  549. data/test/rubygems/test_gem_source.rb +45 -44
  550. data/test/rubygems/test_gem_source_fetch_problem.rb +10 -9
  551. data/test/rubygems/test_gem_source_git.rb +69 -62
  552. data/test/rubygems/test_gem_source_installed.rb +17 -16
  553. data/test/rubygems/test_gem_source_list.rb +6 -5
  554. data/test/rubygems/test_gem_source_local.rb +15 -14
  555. data/test/rubygems/test_gem_source_lock.rb +32 -31
  556. data/test/rubygems/test_gem_source_specific_file.rb +18 -17
  557. data/test/rubygems/test_gem_source_subpath_problem.rb +8 -7
  558. data/test/rubygems/test_gem_source_vendor.rb +14 -13
  559. data/test/rubygems/test_gem_spec_fetcher.rb +73 -72
  560. data/test/rubygems/test_gem_specification.rb +533 -469
  561. data/test/rubygems/test_gem_stream_ui.rb +53 -22
  562. data/test/rubygems/test_gem_stub_specification.rb +33 -32
  563. data/test/rubygems/test_gem_text.rb +2 -1
  564. data/test/rubygems/test_gem_uninstaller.rb +118 -117
  565. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +4 -3
  566. data/test/rubygems/test_gem_update_suggestion.rb +209 -0
  567. data/test/rubygems/test_gem_uri.rb +6 -4
  568. data/test/rubygems/test_gem_uri_formatter.rb +15 -14
  569. data/test/rubygems/test_gem_util.rb +24 -23
  570. data/test/rubygems/test_gem_validator.rb +8 -8
  571. data/test/rubygems/test_gem_version.rb +24 -16
  572. data/test/rubygems/test_gem_version_option.rb +16 -15
  573. data/test/rubygems/test_kernel.rb +43 -48
  574. data/test/rubygems/test_project_sanity.rb +32 -3
  575. data/test/rubygems/test_remote_fetch_error.rb +8 -7
  576. data/test/rubygems/test_require.rb +118 -103
  577. data/test/rubygems/test_rubygems.rb +10 -8
  578. data/test/rubygems/test_webauthn_listener.rb +143 -0
  579. data/test/rubygems/test_webauthn_listener_response.rb +93 -0
  580. data/test/rubygems/test_webauthn_poller.rb +124 -0
  581. data/test/rubygems/utilities.rb +98 -34
  582. data/test/rubygems/wrong_key_cert.pem +15 -15
  583. data/test/rubygems/wrong_key_cert_32.pem +15 -15
  584. data/test/test_changelog_generator.rb +1 -1
  585. metadata +99 -46
  586. data/bundler/lib/bundler/dep_proxy.rb +0 -55
  587. data/bundler/lib/bundler/templates/gems.rb +0 -5
  588. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  589. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  590. data/bundler/lib/bundler/vendor/molinillo/LICENSE +0 -9
  591. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  592. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  593. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  594. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  595. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  596. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  597. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  598. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  599. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  600. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  601. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  602. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  603. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  604. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  605. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  606. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  607. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  608. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  609. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  610. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  611. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  612. data/bundler/lib/bundler/vendored_molinillo.rb +0 -4
  613. data/bundler/lib/bundler/version_ranges.rb +0 -122
  614. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  615. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
@@ -1,19 +1,20 @@
1
1
  # frozen_string_literal: true
2
- require_relative 'helper'
2
+
3
+ require_relative "helper"
3
4
 
4
5
  unless Gem.java_platform? # jruby can't require the simple_gem file
5
- require 'rubygems/simple_gem'
6
+ require "rubygems/simple_gem"
6
7
 
7
8
  class TestGemPackageOld < Gem::TestCase
8
9
  def setup
9
10
  super
10
11
 
11
- File.open 'old_format.gem', 'wb' do |io|
12
+ File.open "old_format.gem", "wb" do |io|
12
13
  io.write SIMPLE_GEM
13
14
  end
14
15
 
15
- @package = Gem::Package::Old.new 'old_format.gem'
16
- @destination = File.join @tempdir, 'extract'
16
+ @package = Gem::Package::Old.new "old_format.gem"
17
+ @destination = File.join @tempdir, "extract"
17
18
 
18
19
  FileUtils.mkdir_p @destination
19
20
  end
@@ -23,7 +24,7 @@ unless Gem.java_platform? # jruby can't require the simple_gem file
23
24
  end
24
25
 
25
26
  def test_contents_security_policy
26
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
27
+ pend "openssl is missing" unless Gem::HAVE_OPENSSL
27
28
 
28
29
  @package.security_policy = Gem::Security::AlmostNoSecurity
29
30
 
@@ -35,7 +36,7 @@ unless Gem.java_platform? # jruby can't require the simple_gem file
35
36
  def test_extract_files
36
37
  @package.extract_files @destination
37
38
 
38
- extracted = File.join @destination, 'lib/foo.rb'
39
+ extracted = File.join @destination, "lib/foo.rb"
39
40
  assert_path_exist extracted
40
41
 
41
42
  mask = 0100644 & (~File.umask)
@@ -44,7 +45,7 @@ unless Gem.java_platform? # jruby can't require the simple_gem file
44
45
  end
45
46
 
46
47
  def test_extract_files_security_policy
47
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
48
+ pend "openssl is missing" unless Gem::HAVE_OPENSSL
48
49
 
49
50
  @package.security_policy = Gem::Security::AlmostNoSecurity
50
51
 
@@ -54,11 +55,11 @@ unless Gem.java_platform? # jruby can't require the simple_gem file
54
55
  end
55
56
 
56
57
  def test_spec
57
- assert_equal 'testing', @package.spec.name
58
+ assert_equal "testing", @package.spec.name
58
59
  end
59
60
 
60
61
  def test_spec_security_policy
61
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
62
+ pend "openssl is missing" unless Gem::HAVE_OPENSSL
62
63
 
63
64
  @package.security_policy = Gem::Security::AlmostNoSecurity
64
65
 
@@ -68,7 +69,7 @@ unless Gem.java_platform? # jruby can't require the simple_gem file
68
69
  end
69
70
 
70
71
  def test_verify
71
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
72
+ pend "openssl is missing" unless Gem::HAVE_OPENSSL
72
73
 
73
74
  assert @package.verify
74
75
 
@@ -82,8 +83,8 @@ unless Gem.java_platform? # jruby can't require the simple_gem file
82
83
  @package.verify
83
84
  end
84
85
 
85
- assert_equal 'old format gems do not contain signatures ' +
86
- 'and cannot be verified',
86
+ assert_equal "old format gems do not contain signatures " +
87
+ "and cannot be verified",
87
88
  e.message
88
89
  end
89
90
  end
@@ -1,25 +1,26 @@
1
1
  # frozen_string_literal: true
2
- require_relative 'package/tar_test_case'
3
- require 'rubygems/package'
2
+
3
+ require_relative "package/tar_test_case"
4
+ require "rubygems/package"
4
5
 
5
6
  class TestGemPackageTarHeader < Gem::Package::TarTestCase
6
7
  def setup
7
8
  super
8
9
 
9
10
  header = {
10
- :name => 'x',
11
- :mode => 0644,
12
- :uid => 1000,
13
- :gid => 10000,
14
- :size => 100,
15
- :mtime => 12345,
16
- :typeflag => '0',
17
- :linkname => 'link',
18
- :uname => 'user',
19
- :gname => 'group',
11
+ :name => "x",
12
+ :mode => 0644,
13
+ :uid => 1000,
14
+ :gid => 10000,
15
+ :size => 100,
16
+ :mtime => 12345,
17
+ :typeflag => "0",
18
+ :linkname => "link",
19
+ :uname => "user",
20
+ :gname => "group",
20
21
  :devmajor => 1,
21
22
  :devminor => 2,
22
- :prefix => 'y',
23
+ :prefix => "y",
23
24
  }
24
25
 
25
26
  @tar_header = Gem::Package::TarHeader.new header
@@ -36,62 +37,62 @@ class TestGemPackageTarHeader < Gem::Package::TarTestCase
36
37
  end
37
38
 
38
39
  def test_initialize
39
- assert_equal '', @tar_header.checksum, 'checksum'
40
- assert_equal 1, @tar_header.devmajor, 'devmajor'
41
- assert_equal 2, @tar_header.devminor, 'devminor'
42
- assert_equal 10000, @tar_header.gid, 'gid'
43
- assert_equal 'group', @tar_header.gname, 'gname'
44
- assert_equal 'link', @tar_header.linkname, 'linkname'
45
- assert_equal 'ustar', @tar_header.magic, 'magic'
46
- assert_equal 0644, @tar_header.mode, 'mode'
47
- assert_equal 12345, @tar_header.mtime, 'mtime'
48
- assert_equal 'x', @tar_header.name, 'name'
49
- assert_equal 'y', @tar_header.prefix, 'prefix'
50
- assert_equal 100, @tar_header.size, 'size'
51
- assert_equal '0', @tar_header.typeflag, 'typeflag'
52
- assert_equal 1000, @tar_header.uid, 'uid'
53
- assert_equal 'user', @tar_header.uname, 'uname'
54
- assert_equal '00', @tar_header.version, 'version'
55
-
56
- refute_empty @tar_header, 'empty'
40
+ assert_equal "", @tar_header.checksum, "checksum"
41
+ assert_equal 1, @tar_header.devmajor, "devmajor"
42
+ assert_equal 2, @tar_header.devminor, "devminor"
43
+ assert_equal 10000, @tar_header.gid, "gid"
44
+ assert_equal "group", @tar_header.gname, "gname"
45
+ assert_equal "link", @tar_header.linkname, "linkname"
46
+ assert_equal "ustar", @tar_header.magic, "magic"
47
+ assert_equal 0644, @tar_header.mode, "mode"
48
+ assert_equal 12345, @tar_header.mtime, "mtime"
49
+ assert_equal "x", @tar_header.name, "name"
50
+ assert_equal "y", @tar_header.prefix, "prefix"
51
+ assert_equal 100, @tar_header.size, "size"
52
+ assert_equal "0", @tar_header.typeflag, "typeflag"
53
+ assert_equal 1000, @tar_header.uid, "uid"
54
+ assert_equal "user", @tar_header.uname, "uname"
55
+ assert_equal "00", @tar_header.version, "version"
56
+
57
+ refute_empty @tar_header, "empty"
57
58
  end
58
59
 
59
60
  def test_initialize_bad
60
61
  assert_raise ArgumentError do
61
- Gem::Package::TarHeader.new :name => '', :size => '', :mode => ''
62
+ Gem::Package::TarHeader.new :name => "", :size => "", :mode => ""
62
63
  end
63
64
 
64
65
  assert_raise ArgumentError do
65
- Gem::Package::TarHeader.new :name => '', :size => '', :prefix => ''
66
+ Gem::Package::TarHeader.new :name => "", :size => "", :prefix => ""
66
67
  end
67
68
 
68
69
  assert_raise ArgumentError do
69
- Gem::Package::TarHeader.new :name => '', :prefix => '', :mode => ''
70
+ Gem::Package::TarHeader.new :name => "", :prefix => "", :mode => ""
70
71
  end
71
72
 
72
73
  assert_raise ArgumentError do
73
- Gem::Package::TarHeader.new :prefix => '', :size => '', :mode => ''
74
+ Gem::Package::TarHeader.new :prefix => "", :size => "", :mode => ""
74
75
  end
75
76
  end
76
77
 
77
78
  def test_initialize_typeflag
78
79
  header = {
79
- :mode => '',
80
- :name => '',
81
- :prefix => '',
82
- :size => '',
83
- :typeflag => '',
80
+ :mode => "",
81
+ :name => "",
82
+ :prefix => "",
83
+ :size => "",
84
+ :typeflag => "",
84
85
  }
85
86
 
86
87
  tar_header = Gem::Package::TarHeader.new header
87
88
 
88
- assert_equal '0', tar_header.typeflag
89
+ assert_equal "0", tar_header.typeflag
89
90
  end
90
91
 
91
92
  def test_empty_eh
92
93
  refute_empty @tar_header
93
94
 
94
- @tar_header = Gem::Package::TarHeader.new :name => 'x', :prefix => '',
95
+ @tar_header = Gem::Package::TarHeader.new :name => "x", :prefix => "",
95
96
  :mode => 0, :size => 0,
96
97
  :empty => true
97
98
 
@@ -135,11 +136,11 @@ group\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
135
136
  end
136
137
 
137
138
  def test_update_checksum
138
- assert_equal '', @tar_header.checksum
139
+ assert_equal "", @tar_header.checksum
139
140
 
140
141
  @tar_header.update_checksum
141
142
 
142
- assert_equal '012467', @tar_header.checksum
143
+ assert_equal "012467", @tar_header.checksum
143
144
  end
144
145
 
145
146
  def test_from_bad_octal
@@ -165,7 +166,7 @@ group\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
165
166
 
166
167
  def test_big_uid_gid
167
168
  stream = StringIO.new(
168
- <<-EOF.dup.force_encoding('binary').split("\n").join
169
+ <<-EOF.dup.force_encoding("binary").split("\n").join
169
170
  GeoIP2-City_20190528/
170
171
  \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
171
172
  \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
@@ -197,7 +198,7 @@ tjmather\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
197
198
  assert_equal 1991400094, tar_header.uid
198
199
  assert_equal 1991400094, tar_header.gid
199
200
 
200
- assert_equal 'GeoIP2-City_20190528/', tar_header.name
201
+ assert_equal "GeoIP2-City_20190528/", tar_header.name
201
202
  assert_equal 0755, tar_header.mode
202
203
  assert_equal 0, tar_header.size
203
204
  assert_equal 1559064640, tar_header.mtime
@@ -206,7 +207,7 @@ tjmather\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
206
207
 
207
208
  def test_spaces_in_headers
208
209
  stream = StringIO.new(
209
- <<-EOF.dup.force_encoding('binary').split("\n").join
210
+ <<-EOF.dup.force_encoding("binary").split("\n").join
210
211
  Access_Points_09202018.csv
211
212
  \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
212
213
  \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
- require_relative 'package/tar_test_case'
3
- require 'rubygems/package'
2
+
3
+ require_relative "package/tar_test_case"
4
+ require "rubygems/package"
4
5
 
5
6
  class TestGemPackageTarReader < Gem::Package::TarTestCase
6
7
  def test_each_entry
@@ -25,11 +26,11 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
25
26
  end
26
27
 
27
28
  def test_rewind
28
- content = ('a'..'z').to_a.join(" ")
29
+ content = ("a".."z").to_a.join(" ")
29
30
 
30
31
  str =
31
32
  tar_file_header("lib/foo", "", 010644, content.size, Time.now) +
32
- content + "\0" * (512 - content.size)
33
+ content + "\0" * (512 - content.size)
33
34
  str << "\0" * 1024
34
35
 
35
36
  io = TempIO.new(str)
@@ -56,12 +57,14 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
56
57
  io = TempIO.new tar
57
58
 
58
59
  Gem::Package::TarReader.new io do |tar_reader|
59
- tar_reader.seek 'baz/bar' do |entry|
60
+ retval = tar_reader.seek "baz/bar" do |entry|
60
61
  assert_kind_of Gem::Package::TarReader::Entry, entry
61
62
 
62
- assert_equal 'baz/bar', entry.full_name
63
+ assert_equal "baz/bar", entry.full_name
64
+ entry.read
63
65
  end
64
66
 
67
+ assert_equal "", retval
65
68
  assert_equal 0, io.pos
66
69
  end
67
70
  ensure
@@ -75,8 +78,8 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
75
78
  io = TempIO.new tar
76
79
 
77
80
  Gem::Package::TarReader.new io do |tar_reader|
78
- tar_reader.seek 'nonexistent' do |entry|
79
- flunk 'entry missing but entry-found block was run'
81
+ tar_reader.seek "nonexistent" do |entry|
82
+ flunk "entry missing but entry-found block was run"
80
83
  end
81
84
 
82
85
  assert_equal 0, io.pos
@@ -84,4 +87,49 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
84
87
  ensure
85
88
  io.close!
86
89
  end
90
+
91
+ def test_read_in_gem_data
92
+ gem_tar = util_gem_data_tar do |tar|
93
+ tar.add_file "lib/code.rb", 0444 do |io|
94
+ io.write "# lib/code.rb"
95
+ end
96
+ end
97
+
98
+ count = 0
99
+ Gem::Package::TarReader.new(gem_tar).each do |entry|
100
+ next unless entry.full_name == "data.tar.gz"
101
+
102
+ Zlib::GzipReader.wrap entry do |gzio|
103
+ Gem::Package::TarReader.new(gzio).each do |contents_entry|
104
+ assert_equal "# lib/code.rb", contents_entry.read
105
+ count += 1
106
+ end
107
+ end
108
+ end
109
+
110
+ assert_equal 1, count, "should have found one file"
111
+ end
112
+
113
+ def test_seek_in_gem_data
114
+ gem_tar = util_gem_data_tar do |tar|
115
+ tar.add_file "lib/code.rb", 0444 do |io|
116
+ io.write "# lib/code.rb"
117
+ end
118
+ tar.add_file "lib/foo.rb", 0444 do |io|
119
+ io.write "# lib/foo.rb"
120
+ end
121
+ end
122
+
123
+ count = 0
124
+ Gem::Package::TarReader.new(gem_tar).seek("data.tar.gz") do |entry|
125
+ Zlib::GzipReader.wrap entry do |gzio|
126
+ Gem::Package::TarReader.new(gzio).seek("lib/foo.rb") do |contents_entry|
127
+ assert_equal "# lib/foo.rb", contents_entry.read
128
+ count += 1
129
+ end
130
+ end
131
+ end
132
+
133
+ assert_equal 1, count, "should have found one file"
134
+ end
87
135
  end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
- require_relative 'package/tar_test_case'
3
- require 'rubygems/package'
2
+
3
+ require_relative "package/tar_test_case"
4
+ require "rubygems/package"
4
5
 
5
6
  class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
6
7
  def setup
7
8
  super
8
9
 
9
- @contents = ('a'..'z').to_a.join * 100
10
+ @contents = ("a".."z").to_a.join * 100
10
11
 
11
12
  @tar = String.new
12
13
  @tar << tar_file_header("lib/foo", "", 0, @contents.size, Time.now)
13
- @tar << @contents
14
- @tar << "\0" * (512 - (@tar.size % 512))
14
+ @tar << tar_file_contents(@contents)
15
15
 
16
16
  @entry = util_entry @tar
17
17
  end
@@ -21,8 +21,35 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
21
21
  super
22
22
  end
23
23
 
24
- def close_util_entry(entry)
25
- entry.instance_variable_get(:@io).close!
24
+ def test_open
25
+ io = TempIO.new @tar
26
+ header = Gem::Package::TarHeader.from io
27
+ retval = Gem::Package::TarReader::Entry.open header, io do |entry|
28
+ entry.getc
29
+ end
30
+ assert_equal "a", retval
31
+ assert_equal @tar.size, io.pos, "should have read to end of entry"
32
+ end
33
+
34
+ def test_open_closes_entry
35
+ io = TempIO.new @tar
36
+ header = Gem::Package::TarHeader.from io
37
+ entry = nil
38
+ Gem::Package::TarReader::Entry.open header, io do |e|
39
+ entry = e
40
+ end
41
+ assert entry.closed?
42
+ assert_raise(IOError) { entry.getc }
43
+ end
44
+
45
+ def test_open_returns_entry
46
+ io = TempIO.new @tar
47
+ header = Gem::Package::TarHeader.from io
48
+ entry = Gem::Package::TarReader::Entry.open header, io
49
+ refute entry.closed?
50
+ assert_equal ?a, entry.getc
51
+ assert_nil entry.close
52
+ assert entry.closed?
26
53
  end
27
54
 
28
55
  def test_bytes_read
@@ -43,19 +70,19 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
43
70
  assert @entry.bytes_read
44
71
 
45
72
  e = assert_raise(IOError) { @entry.eof? }
46
- assert_equal 'closed Gem::Package::TarReader::Entry', e.message
73
+ assert_equal "closed Gem::Package::TarReader::Entry", e.message
47
74
 
48
75
  e = assert_raise(IOError) { @entry.getc }
49
- assert_equal 'closed Gem::Package::TarReader::Entry', e.message
76
+ assert_equal "closed Gem::Package::TarReader::Entry", e.message
50
77
 
51
78
  e = assert_raise(IOError) { @entry.pos }
52
- assert_equal 'closed Gem::Package::TarReader::Entry', e.message
79
+ assert_equal "closed Gem::Package::TarReader::Entry", e.message
53
80
 
54
81
  e = assert_raise(IOError) { @entry.read }
55
- assert_equal 'closed Gem::Package::TarReader::Entry', e.message
82
+ assert_equal "closed Gem::Package::TarReader::Entry", e.message
56
83
 
57
84
  e = assert_raise(IOError) { @entry.rewind }
58
- assert_equal 'closed Gem::Package::TarReader::Entry', e.message
85
+ assert_equal "closed Gem::Package::TarReader::Entry", e.message
59
86
  end
60
87
 
61
88
  def test_closed_eh
@@ -71,7 +98,7 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
71
98
  end
72
99
 
73
100
  def test_full_name
74
- assert_equal 'lib/foo', @entry.full_name
101
+ assert_equal "lib/foo", @entry.full_name
75
102
  end
76
103
 
77
104
  def test_full_name_null
@@ -82,7 +109,7 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
82
109
  @entry.full_name
83
110
  end
84
111
 
85
- assert_equal 'tar is corrupt, name contains null byte', e.message
112
+ assert_equal "tar is corrupt, name contains null byte", e.message
86
113
  end
87
114
 
88
115
  def test_getc
@@ -125,6 +152,18 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
125
152
  assert_equal @contents, @entry.read
126
153
  end
127
154
 
155
+ def test_consecutive_read
156
+ expected = StringIO.new(@contents)
157
+ assert_equal expected.read, @entry.read
158
+ assert_equal expected.read, @entry.read
159
+ end
160
+
161
+ def test_consecutive_read_bytes_past_eof
162
+ expected = StringIO.new(@contents)
163
+ assert_equal expected.read, @entry.read
164
+ assert_equal expected.read(1), @entry.read(1)
165
+ end
166
+
128
167
  def test_read_big
129
168
  assert_equal @contents, @entry.read(@contents.size * 2)
130
169
  end
@@ -133,9 +172,24 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
133
172
  assert_equal @contents[0...100], @entry.read(100)
134
173
  end
135
174
 
136
- def test_readpartial
175
+ def test_read_remaining
176
+ @entry.read(100)
177
+ assert_equal @contents[100..-1], @entry.read
178
+ end
179
+
180
+ def test_read_partial
181
+ assert_equal @contents[0...100], @entry.readpartial(100)
182
+ end
183
+
184
+ def test_read_partial_buffer
185
+ buffer = "".b
186
+ @entry.readpartial(100, buffer)
187
+ assert_equal @contents[0...100], buffer
188
+ end
189
+
190
+ def test_readpartial_past_eof
191
+ @entry.readpartial(@contents.size)
137
192
  assert_raise(EOFError) do
138
- @entry.read(@contents.size)
139
193
  @entry.readpartial(1)
140
194
  end
141
195
  end
@@ -149,4 +203,96 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
149
203
 
150
204
  assert_equal char, @entry.getc
151
205
  end
206
+
207
+ def test_seek
208
+ @entry.seek(50)
209
+ assert_equal 50, @entry.pos
210
+ assert_equal @contents[50..-1], @entry.read, "read remaining after seek"
211
+ @entry.seek(-50, IO::SEEK_CUR)
212
+ assert_equal @contents.size - 50, @entry.pos
213
+ assert_equal @contents[-50..-1], @entry.read, "read after stepping back 50 from the end"
214
+ @entry.seek(0, IO::SEEK_SET)
215
+ assert_equal 0, @entry.pos
216
+ assert_equal @contents, @entry.read, "read from beginning"
217
+ @entry.seek(-10, IO::SEEK_END)
218
+ assert_equal @contents.size - 10, @entry.pos
219
+ assert_equal @contents[-10..-1], @entry.read, "read from end"
220
+ end
221
+
222
+ def test_read_zero
223
+ expected = StringIO.new("")
224
+ assert_equal expected.read(0), @entry.read(0)
225
+ end
226
+
227
+ def test_readpartial_zero
228
+ expected = StringIO.new("")
229
+ assert_equal expected.readpartial(0), @entry.readpartial(0)
230
+ end
231
+
232
+ def test_zero_byte_file_read
233
+ zero_entry = util_entry(tar_file_header("foo", "", 0, 0, Time.now))
234
+ expected = StringIO.new("")
235
+ assert_equal expected.read, zero_entry.read
236
+ end
237
+
238
+ def test_zero_byte_file_readpartial
239
+ zero_entry = util_entry(tar_file_header("foo", "", 0, 0, Time.now))
240
+ expected = StringIO.new("")
241
+ assert_equal expected.readpartial(0), zero_entry.readpartial(0)
242
+ end
243
+
244
+ def test_read_from_gzip_io
245
+ tgz = util_gzip(@tar)
246
+
247
+ Zlib::GzipReader.wrap StringIO.new(tgz) do |gzio|
248
+ entry = util_entry(gzio)
249
+ assert_equal @contents, entry.read
250
+ entry.rewind
251
+ assert_equal @contents, entry.read, "second read after rewind should read same contents"
252
+ end
253
+ end
254
+
255
+ def test_read_from_gzip_io_with_non_zero_offset
256
+ contents2 = ("0".."9").to_a.join * 100
257
+ @tar << tar_file_header("lib/bar", "", 0, contents2.size, Time.now)
258
+ @tar << tar_file_contents(contents2)
259
+
260
+ tgz = util_gzip(@tar)
261
+
262
+ Zlib::GzipReader.wrap StringIO.new(tgz) do |gzio|
263
+ util_entry(gzio).close # skip the first entry so io.pos is not 0, preventing easy rewind
264
+ entry = util_entry(gzio)
265
+
266
+ assert_equal contents2, entry.read
267
+ entry.rewind
268
+ assert_equal contents2, entry.read, "second read after rewind should read same contents"
269
+ end
270
+ end
271
+
272
+ def test_seek_in_gzip_io_with_non_zero_offset
273
+ contents2 = ("0".."9").to_a.join * 100
274
+ @tar << tar_file_header("lib/bar", "", 0, contents2.size, Time.now)
275
+ @tar << tar_file_contents(contents2)
276
+
277
+ tgz = util_gzip(@tar)
278
+
279
+ Zlib::GzipReader.wrap StringIO.new(tgz) do |gzio|
280
+ util_entry(gzio).close # skip the first entry so io.pos is not 0
281
+ entry = util_entry(gzio)
282
+
283
+ entry.seek(50)
284
+ assert_equal 50, entry.pos
285
+ assert_equal contents2[50..-1], entry.read, "read remaining after seek"
286
+ entry.seek(-50, IO::SEEK_CUR)
287
+ assert_equal contents2.size - 50, entry.pos
288
+ assert_equal contents2[-50..-1], entry.read, "read after stepping back 50 from the end"
289
+ entry.seek(0, IO::SEEK_SET)
290
+ assert_equal 0, entry.pos
291
+ assert_equal contents2, entry.read, "read from beginning"
292
+ entry.seek(-10, IO::SEEK_END)
293
+ assert_equal contents2.size - 10, entry.pos
294
+ assert_equal contents2[-10..-1], entry.read, "read from end"
295
+ assert_equal contents2.size, entry.pos
296
+ end
297
+ end
152
298
  end