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
@@ -1,866 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require "rubygems/commands/cert_command"
5
-
6
- unless Gem::HAVE_OPENSSL
7
- warn "Skipping `gem cert` tests. openssl not found."
8
- end
9
-
10
- if Gem.java_platform?
11
- warn "Skipping `gem cert` tests on jruby."
12
- end
13
-
14
- class TestGemCommandsCertCommand < Gem::TestCase
15
- ALTERNATE_CERT = load_cert "alternate"
16
- EXPIRED_PUBLIC_CERT = load_cert "expired"
17
-
18
- ALTERNATE_KEY_FILE = key_path "alternate"
19
- PRIVATE_KEY_FILE = key_path "private"
20
- PRIVATE_EC_KEY_FILE = key_path "private_ec"
21
- PUBLIC_KEY_FILE = key_path "public"
22
-
23
- ALTERNATE_CERT_FILE = cert_path "alternate"
24
- CHILD_CERT_FILE = cert_path "child"
25
- PUBLIC_CERT_FILE = cert_path "public"
26
- EXPIRED_PUBLIC_CERT_FILE = cert_path "expired"
27
-
28
- def setup
29
- super
30
-
31
- @cmd = Gem::Commands::CertCommand.new
32
-
33
- @trust_dir = Gem::Security.trust_dir
34
-
35
- @cleanup = []
36
- end
37
-
38
- def teardown
39
- FileUtils.rm_f(@cleanup)
40
-
41
- super
42
- end
43
-
44
- def test_certificates_matching
45
- @trust_dir.trust_cert PUBLIC_CERT
46
- @trust_dir.trust_cert ALTERNATE_CERT
47
-
48
- matches = @cmd.certificates_matching ""
49
-
50
- # HACK OpenSSL::X509::Certificate#== is Object#==, so do this the hard way
51
- match = matches.next
52
- assert_equal ALTERNATE_CERT.to_pem, match.first.to_pem
53
- assert_equal @trust_dir.cert_path(ALTERNATE_CERT), match.last
54
-
55
- match = matches.next
56
- assert_equal PUBLIC_CERT.to_pem, match.first.to_pem
57
- assert_equal @trust_dir.cert_path(PUBLIC_CERT), match.last
58
-
59
- assert_raise StopIteration do
60
- matches.next
61
- end
62
- end
63
-
64
- def test_certificates_matching_filter
65
- @trust_dir.trust_cert PUBLIC_CERT
66
- @trust_dir.trust_cert ALTERNATE_CERT
67
-
68
- matches = @cmd.certificates_matching "alternate"
69
-
70
- match = matches.next
71
- assert_equal ALTERNATE_CERT.to_pem, match.first.to_pem
72
- assert_equal @trust_dir.cert_path(ALTERNATE_CERT), match.last
73
-
74
- assert_raise StopIteration do
75
- matches.next
76
- end
77
- end
78
-
79
- def test_execute_add
80
- @cmd.handle_options %W[--add #{PUBLIC_CERT_FILE}]
81
-
82
- use_ui @ui do
83
- @cmd.execute
84
- end
85
-
86
- cert_path = @trust_dir.cert_path PUBLIC_CERT
87
-
88
- assert_path_exist cert_path
89
-
90
- assert_equal "Added '/CN=nobody/DC=example'\n", @ui.output
91
- assert_empty @ui.error
92
- end
93
-
94
- def test_execute_add_twice
95
- self.class.cert_path "alternate"
96
-
97
- @cmd.handle_options %W[
98
- --add #{PUBLIC_CERT_FILE}
99
- --add #{ALTERNATE_CERT_FILE}
100
- ]
101
-
102
- use_ui @ui do
103
- @cmd.execute
104
- end
105
-
106
- expected = <<-EXPECTED
107
- Added '/CN=nobody/DC=example'
108
- Added '/CN=alternate/DC=example'
109
- EXPECTED
110
-
111
- assert_equal expected, @ui.output
112
- assert_empty @ui.error
113
- end
114
-
115
- def test_execute_build
116
- passphrase = "Foo bar"
117
-
118
- @cmd.handle_options %W[--build nobody@example.com]
119
-
120
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
121
-
122
- use_ui @build_ui do
123
- @cmd.execute
124
- end
125
-
126
- output = @build_ui.output.squeeze("\n").split "\n"
127
-
128
- assert_equal "Passphrase for your Private Key: ",
129
- output.shift
130
- assert_equal "Please repeat the passphrase for your Private Key: ",
131
- output.shift
132
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
133
- output.shift
134
- assert_equal "Private Key: #{File.join @tempdir, "gem-private_key.pem"}",
135
- output.shift
136
-
137
- assert_equal "Don't forget to move the key file to somewhere private!",
138
- output.shift
139
-
140
- assert_empty output
141
- assert_empty @build_ui.error
142
-
143
- assert_path_exist File.join(@tempdir, "gem-private_key.pem")
144
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
145
- end
146
-
147
- def test_execute_build_key_algorithm_ec_key
148
- passphrase = "Foo bar"
149
-
150
- @cmd.handle_options %W[--build nobody@example.com --key-algorithm ec]
151
-
152
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
153
-
154
- use_ui @build_ui do
155
- @cmd.execute
156
- end
157
-
158
- output = @build_ui.output.squeeze("\n").split "\n"
159
-
160
- assert_equal "Passphrase for your Private Key: ",
161
- output.shift
162
- assert_equal "Please repeat the passphrase for your Private Key: ",
163
- output.shift
164
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
165
- output.shift
166
- assert_equal "Private Key: #{File.join @tempdir, "gem-private_key.pem"}",
167
- output.shift
168
-
169
- assert_equal "Don't forget to move the key file to somewhere private!",
170
- output.shift
171
-
172
- assert_empty output
173
- assert_empty @build_ui.error
174
-
175
- assert_path_exist File.join(@tempdir, "gem-private_key.pem")
176
-
177
- cert_path = File.join(@tempdir, "gem-public_cert.pem")
178
- assert_path_exist cert_path
179
- cert = OpenSSL::X509::Certificate.new(File.read(cert_path))
180
- assert cert.public_key.is_a? OpenSSL::PKey::EC
181
- end
182
-
183
- def test_execute_build_bad_email_address
184
- passphrase = "Foo bar"
185
- email = "nobody@"
186
-
187
- @cmd.handle_options %W[--build #{email}]
188
-
189
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
190
-
191
- use_ui @build_ui do
192
- e = assert_raise Gem::CommandLineError do
193
- @cmd.execute
194
- end
195
-
196
- assert_equal "Invalid email address #{email}",
197
- e.message
198
-
199
- assert_path_not_exist File.join(@tempdir, "gem-private_key.pem")
200
- assert_path_not_exist File.join(@tempdir, "gem-public_cert.pem")
201
- end
202
- end
203
-
204
- def test_execute_build_expiration_days
205
- passphrase = "Foo bar"
206
-
207
- @cmd.handle_options %W[
208
- --build nobody@example.com
209
- --days 26
210
- ]
211
-
212
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
213
-
214
- use_ui @build_ui do
215
- @cmd.execute
216
- end
217
-
218
- output = @build_ui.output.squeeze("\n").split "\n"
219
-
220
- assert_equal "Passphrase for your Private Key: ",
221
- output.shift
222
- assert_equal "Please repeat the passphrase for your Private Key: ",
223
- output.shift
224
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
225
- output.shift
226
- assert_equal "Private Key: #{File.join @tempdir, "gem-private_key.pem"}",
227
- output.shift
228
-
229
- assert_equal "Don't forget to move the key file to somewhere private!",
230
- output.shift
231
-
232
- assert_empty output
233
- assert_empty @build_ui.error
234
-
235
- assert_path_exist File.join(@tempdir, "gem-private_key.pem")
236
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
237
-
238
- pem = File.read("#{@tempdir}/gem-public_cert.pem")
239
- cert = OpenSSL::X509::Certificate.new(pem)
240
-
241
- test = (cert.not_after - cert.not_before).to_i / (24 * 60 * 60)
242
- assert_equal(test, 26)
243
- end
244
-
245
- def test_execute_build_bad_passphrase_confirmation
246
- passphrase = "Foo bar"
247
- passphrase_confirmation = "Fu bar"
248
-
249
- @cmd.handle_options %W[--build nobody@example.com]
250
-
251
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase_confirmation}"
252
-
253
- use_ui @build_ui do
254
- e = assert_raise Gem::CommandLineError do
255
- @cmd.execute
256
- end
257
-
258
- output = @build_ui.output.squeeze("\n").split "\n"
259
-
260
- assert_equal "Passphrase for your Private Key: ",
261
- output.shift
262
- assert_equal "Please repeat the passphrase for your Private Key: ",
263
- output.shift
264
-
265
- assert_empty output
266
-
267
- assert_equal "Passphrase and passphrase confirmation don't match",
268
- e.message
269
- end
270
-
271
- assert_path_not_exist File.join(@tempdir, "gem-private_key.pem")
272
- assert_path_not_exist File.join(@tempdir, "gem-public_cert.pem")
273
- end
274
-
275
- def test_execute_build_key
276
- @cmd.handle_options %W[
277
- --build nobody@example.com
278
- --private-key #{PRIVATE_KEY_FILE}
279
- ]
280
-
281
- use_ui @ui do
282
- @cmd.execute
283
- end
284
-
285
- output = @ui.output.split "\n"
286
-
287
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
288
- output.shift
289
-
290
- assert_empty output
291
- assert_empty @ui.error
292
-
293
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
294
- assert_path_not_exist File.join(@tempdir, "gem-private_key.pem")
295
- end
296
-
297
- def test_execute_build_encrypted_key
298
- @cmd.handle_options %W[
299
- --build nobody@example.com
300
- --private-key #{ENCRYPTED_PRIVATE_KEY_PATH}
301
- ]
302
-
303
- use_ui @ui do
304
- @cmd.execute
305
- end
306
-
307
- output = @ui.output.split "\n"
308
-
309
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
310
- output.shift
311
-
312
- assert_empty output
313
- assert_empty @ui.error
314
-
315
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
316
- end
317
-
318
- def test_execute_build_ec_key
319
- @cmd.handle_options %W[
320
- --build nobody@example.com
321
- --private-key #{PRIVATE_EC_KEY_FILE}
322
- ]
323
-
324
- use_ui @ui do
325
- @cmd.execute
326
- end
327
-
328
- output = @ui.output.split "\n"
329
-
330
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
331
- output.shift
332
-
333
- assert_empty output
334
- assert_empty @ui.error
335
-
336
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
337
- assert_path_not_exist File.join(@tempdir, "gem-private_key.pem")
338
- end
339
-
340
- def test_execute_certificate
341
- use_ui @ui do
342
- @cmd.handle_options %W[--certificate #{PUBLIC_CERT_FILE}]
343
- end
344
-
345
- assert_equal "", @ui.output
346
- assert_equal "", @ui.error
347
-
348
- assert_equal PUBLIC_CERT.to_pem, @cmd.options[:issuer_cert].to_pem
349
- end
350
-
351
- def test_execute_list
352
- @trust_dir.trust_cert PUBLIC_CERT
353
- @trust_dir.trust_cert ALTERNATE_CERT
354
-
355
- @cmd.handle_options %W[--list]
356
-
357
- use_ui @ui do
358
- @cmd.execute
359
- end
360
-
361
- assert_equal "/CN=alternate/DC=example\n/CN=nobody/DC=example\n",
362
- @ui.output
363
- assert_empty @ui.error
364
- end
365
-
366
- def test_execute_list_filter
367
- @trust_dir.trust_cert PUBLIC_CERT
368
- @trust_dir.trust_cert ALTERNATE_CERT
369
-
370
- @cmd.handle_options %W[--list nobody]
371
-
372
- use_ui @ui do
373
- @cmd.execute
374
- end
375
-
376
- assert_equal "/CN=nobody/DC=example\n", @ui.output
377
- assert_empty @ui.error
378
- end
379
-
380
- def test_execute_private_key
381
- use_ui @ui do
382
- @cmd.send :handle_options, %W[--private-key #{PRIVATE_KEY_FILE}]
383
- end
384
-
385
- assert_equal "", @ui.output
386
- assert_equal "", @ui.error
387
-
388
- assert_equal PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem
389
- end
390
-
391
- def test_execute_encrypted_private_key
392
- use_ui @ui do
393
- @cmd.send :handle_options, %W[--private-key #{ENCRYPTED_PRIVATE_KEY_PATH}]
394
- end
395
-
396
- assert_equal "", @ui.output
397
- assert_equal "", @ui.error
398
-
399
- assert_equal ENCRYPTED_PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem
400
- end
401
-
402
- def test_execute_remove
403
- @trust_dir.trust_cert PUBLIC_CERT
404
-
405
- cert_path = @trust_dir.cert_path PUBLIC_CERT
406
-
407
- assert_path_exist cert_path
408
-
409
- @cmd.handle_options %W[--remove nobody]
410
-
411
- use_ui @ui do
412
- @cmd.execute
413
- end
414
-
415
- assert_equal "Removed '/CN=nobody/DC=example'\n", @ui.output
416
- assert_equal "", @ui.error
417
-
418
- assert_path_not_exist cert_path
419
- end
420
-
421
- def test_execute_remove_multiple
422
- @trust_dir.trust_cert PUBLIC_CERT
423
- @trust_dir.trust_cert ALTERNATE_CERT
424
-
425
- public_path = @trust_dir.cert_path PUBLIC_CERT
426
- alternate_path = @trust_dir.cert_path ALTERNATE_CERT
427
-
428
- assert_path_exist public_path
429
- assert_path_exist alternate_path
430
-
431
- @cmd.handle_options %W[--remove example]
432
-
433
- use_ui @ui do
434
- @cmd.execute
435
- end
436
-
437
- expected = <<-EXPECTED
438
- Removed '/CN=alternate/DC=example'
439
- Removed '/CN=nobody/DC=example'
440
- EXPECTED
441
-
442
- assert_equal expected, @ui.output
443
- assert_equal "", @ui.error
444
-
445
- assert_path_not_exist public_path
446
- assert_path_not_exist alternate_path
447
- end
448
-
449
- def test_execute_remove_twice
450
- @trust_dir.trust_cert PUBLIC_CERT
451
- @trust_dir.trust_cert ALTERNATE_CERT
452
-
453
- public_path = @trust_dir.cert_path PUBLIC_CERT
454
- alternate_path = @trust_dir.cert_path ALTERNATE_CERT
455
-
456
- assert_path_exist public_path
457
- assert_path_exist alternate_path
458
-
459
- @cmd.handle_options %W[--remove nobody --remove alternate]
460
-
461
- use_ui @ui do
462
- @cmd.execute
463
- end
464
-
465
- expected = <<-EXPECTED
466
- Removed '/CN=nobody/DC=example'
467
- Removed '/CN=alternate/DC=example'
468
- EXPECTED
469
-
470
- assert_equal expected, @ui.output
471
- assert_equal "", @ui.error
472
-
473
- assert_path_not_exist public_path
474
- assert_path_not_exist alternate_path
475
- end
476
-
477
- def test_execute_sign
478
- path = File.join @tempdir, "cert.pem"
479
- Gem::Security.write ALTERNATE_CERT, path, 0o600
480
-
481
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
482
-
483
- @cmd.handle_options %W[
484
- --private-key #{PRIVATE_KEY_FILE}
485
- --certificate #{PUBLIC_CERT_FILE}
486
-
487
- --sign #{path}
488
- ]
489
-
490
- use_ui @ui do
491
- @cmd.execute
492
- end
493
-
494
- assert_equal "", @ui.output
495
- assert_equal "", @ui.error
496
-
497
- cert = OpenSSL::X509::Certificate.new File.read path
498
-
499
- assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
500
-
501
- mask = 0o100600 & (~File.umask)
502
-
503
- assert_equal mask, File.stat(path).mode unless win_platform?
504
- end
505
-
506
- def test_execute_sign_encrypted_key
507
- path = File.join @tempdir, "cert.pem"
508
- Gem::Security.write ALTERNATE_CERT, path, 0o600
509
-
510
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
511
-
512
- @cmd.handle_options %W[
513
- --private-key #{ENCRYPTED_PRIVATE_KEY_PATH}
514
- --certificate #{PUBLIC_CERT_FILE}
515
-
516
- --sign #{path}
517
- ]
518
-
519
- use_ui @ui do
520
- @cmd.execute
521
- end
522
-
523
- assert_equal "", @ui.output
524
- assert_equal "", @ui.error
525
-
526
- cert = OpenSSL::X509::Certificate.new File.read path
527
-
528
- assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
529
-
530
- mask = 0o100600 & (~File.umask)
531
-
532
- assert_equal mask, File.stat(path).mode unless win_platform?
533
- end
534
-
535
- def test_execute_sign_default
536
- FileUtils.mkdir_p File.join Gem.user_home, ".gem"
537
-
538
- private_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem"
539
- Gem::Security.write PRIVATE_KEY, private_key_path
540
-
541
- public_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"
542
- Gem::Security.write PUBLIC_CERT, public_cert_path
543
-
544
- path = File.join @tempdir, "cert.pem"
545
- Gem::Security.write ALTERNATE_CERT, path, 0o600
546
-
547
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
548
-
549
- @cmd.handle_options %W[--sign #{path}]
550
-
551
- use_ui @ui do
552
- @cmd.execute
553
- end
554
-
555
- assert_equal "", @ui.output
556
- assert_equal "", @ui.error
557
-
558
- cert = OpenSSL::X509::Certificate.new File.read path
559
-
560
- assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
561
-
562
- mask = 0o100600 & (~File.umask)
563
-
564
- assert_equal mask, File.stat(path).mode unless win_platform?
565
- end
566
-
567
- def test_execute_sign_default_encrypted_key
568
- FileUtils.mkdir_p File.join(Gem.user_home, ".gem")
569
-
570
- private_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem"
571
- Gem::Security.write ENCRYPTED_PRIVATE_KEY, private_key_path, 0o600, PRIVATE_KEY_PASSPHRASE
572
-
573
- public_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"
574
- Gem::Security.write PUBLIC_CERT, public_cert_path
575
-
576
- path = File.join @tempdir, "cert.pem"
577
- Gem::Security.write ALTERNATE_CERT, path, 0o600
578
-
579
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
580
-
581
- @cmd.handle_options %W[--sign #{path}]
582
-
583
- use_ui @ui do
584
- @cmd.execute
585
- end
586
-
587
- assert_equal "", @ui.output
588
- assert_equal "", @ui.error
589
-
590
- cert = OpenSSL::X509::Certificate.new File.read path
591
-
592
- assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
593
-
594
- mask = 0o100600 & (~File.umask)
595
-
596
- assert_equal mask, File.stat(path).mode unless win_platform?
597
- end
598
-
599
- def test_execute_sign_no_cert
600
- FileUtils.mkdir_p File.join Gem.user_home, ".gem"
601
-
602
- private_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem"
603
- Gem::Security.write PRIVATE_KEY, private_key_path
604
-
605
- path = File.join @tempdir, "cert.pem"
606
- Gem::Security.write ALTERNATE_CERT, path, 0o600
607
-
608
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
609
-
610
- @cmd.handle_options %W[--sign #{path}]
611
-
612
- use_ui @ui do
613
- assert_raise Gem::MockGemUi::TermError do
614
- @cmd.execute
615
- end
616
- end
617
-
618
- assert_equal "", @ui.output
619
-
620
- expected = <<-EXPECTED
621
- ERROR: --certificate not specified and ~/.gem/gem-public_cert.pem does not exist
622
- EXPECTED
623
-
624
- assert_equal expected, @ui.error
625
- end
626
-
627
- def test_execute_sign_no_key
628
- FileUtils.mkdir_p File.join Gem.user_home, ".gem"
629
-
630
- public_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"
631
- Gem::Security.write PUBLIC_CERT, public_cert_path
632
-
633
- path = File.join @tempdir, "cert.pem"
634
- Gem::Security.write ALTERNATE_CERT, path, 0o600
635
-
636
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
637
-
638
- @cmd.handle_options %W[--sign #{path}]
639
-
640
- use_ui @ui do
641
- assert_raise Gem::MockGemUi::TermError do
642
- @cmd.execute
643
- end
644
- end
645
-
646
- assert_equal "", @ui.output
647
-
648
- expected = <<-EXPECTED
649
- ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exist
650
- EXPECTED
651
-
652
- assert_equal expected, @ui.error
653
- end
654
-
655
- def test_execute_re_sign
656
- gem_path = File.join Gem.user_home, ".gem"
657
- Dir.mkdir gem_path
658
-
659
- path = File.join @tempdir, "cert.pem"
660
- Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0o600
661
-
662
- assert_equal "/CN=nobody/DC=example", EXPIRED_PUBLIC_CERT.issuer.to_s
663
-
664
- tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE))
665
- @cleanup << tmp_expired_cert_file
666
- File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE))
667
-
668
- @cmd.handle_options %W[
669
- --private-key #{PRIVATE_KEY_FILE}
670
- --certificate #{tmp_expired_cert_file}
671
- --re-sign
672
- ]
673
-
674
- use_ui @ui do
675
- @cmd.execute
676
- end
677
-
678
- expected_path = File.join(gem_path, "#{File.basename(tmp_expired_cert_file)}.expired")
679
-
680
- assert_match(
681
- /INFO: Your certificate #{tmp_expired_cert_file} has been re-signed\nINFO: Your expired certificate will be located at: #{expected_path}\.[0-9]+/,
682
- @ui.output
683
- )
684
- assert_equal "", @ui.error
685
- end
686
-
687
- def test_execute_re_sign_with_cert_expiration_length_days
688
- gem_path = File.join Gem.user_home, ".gem"
689
- Dir.mkdir gem_path
690
-
691
- path = File.join @tempdir, "cert.pem"
692
- Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0o600
693
-
694
- assert_equal "/CN=nobody/DC=example", EXPIRED_PUBLIC_CERT.issuer.to_s
695
-
696
- tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE))
697
- @cleanup << tmp_expired_cert_file
698
- File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE))
699
-
700
- @cmd.handle_options %W[
701
- --private-key #{PRIVATE_KEY_FILE}
702
- --certificate #{tmp_expired_cert_file}
703
- --re-sign
704
- ]
705
-
706
- Gem.configuration.cert_expiration_length_days = 28
707
-
708
- use_ui @ui do
709
- @cmd.execute
710
- end
711
-
712
- re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file))
713
- cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60)
714
-
715
- assert_equal(28, cert_days_to_expire)
716
- assert_equal "", @ui.error
717
- end
718
-
719
- def test_handle_options
720
- @cmd.handle_options %W[
721
- --add #{PUBLIC_CERT_FILE}
722
- --add #{ALTERNATE_CERT_FILE}
723
-
724
- --remove nobody
725
- --remove example
726
-
727
- --list
728
- --list example
729
-
730
- --build nobody@example
731
- --build other@example
732
- ]
733
-
734
- assert_equal [PUBLIC_CERT.to_pem, ALTERNATE_CERT.to_pem],
735
- @cmd.options[:add].map {|cert| cert.to_pem }
736
-
737
- assert_equal %w[nobody example], @cmd.options[:remove]
738
-
739
- assert_equal %w[nobody@example other@example],
740
- @cmd.options[:build].map {|name| name.to_s }
741
-
742
- assert_equal ["", "example"], @cmd.options[:list]
743
- end
744
-
745
- def test_handle_options_add_bad
746
- nonexistent = File.join @tempdir, "nonexistent"
747
- e = assert_raise Gem::OptionParser::InvalidArgument do
748
- @cmd.handle_options %W[--add #{nonexistent}]
749
- end
750
-
751
- assert_equal "invalid argument: --add #{nonexistent}: does not exist",
752
- e.message
753
-
754
- bad = File.join @tempdir, "bad"
755
- FileUtils.touch bad
756
-
757
- e = assert_raise Gem::OptionParser::InvalidArgument do
758
- @cmd.handle_options %W[--add #{bad}]
759
- end
760
-
761
- assert_equal "invalid argument: --add #{bad}: invalid X509 certificate",
762
- e.message
763
- end
764
-
765
- def test_handle_options_certificate
766
- nonexistent = File.join @tempdir, "nonexistent"
767
- e = assert_raise Gem::OptionParser::InvalidArgument do
768
- @cmd.handle_options %W[--certificate #{nonexistent}]
769
- end
770
-
771
- assert_equal "invalid argument: --certificate #{nonexistent}: does not exist",
772
- e.message
773
-
774
- bad = File.join @tempdir, "bad"
775
- FileUtils.touch bad
776
-
777
- e = assert_raise Gem::OptionParser::InvalidArgument do
778
- @cmd.handle_options %W[--certificate #{bad}]
779
- end
780
-
781
- assert_equal "invalid argument: " +
782
- "--certificate #{bad}: invalid X509 certificate",
783
- e.message
784
- end
785
-
786
- def test_handle_options_key_bad
787
- nonexistent = File.join @tempdir, "nonexistent"
788
- e = assert_raise Gem::OptionParser::InvalidArgument do
789
- @cmd.handle_options %W[--private-key #{nonexistent}]
790
- end
791
-
792
- assert_equal "invalid argument: " +
793
- "--private-key #{nonexistent}: does not exist",
794
- e.message
795
-
796
- bad = File.join @tempdir, "bad"
797
- FileUtils.touch bad
798
-
799
- e = assert_raise Gem::OptionParser::InvalidArgument do
800
- @cmd.handle_options %W[--private-key #{bad}]
801
- end
802
-
803
- assert_equal "invalid argument: --private-key #{bad}: invalid RSA, DSA, or EC key",
804
- e.message
805
-
806
- e = assert_raise Gem::OptionParser::InvalidArgument do
807
- @cmd.handle_options %W[--private-key #{PUBLIC_KEY_FILE}]
808
- end
809
-
810
- assert_equal "invalid argument: " +
811
- "--private-key #{PUBLIC_KEY_FILE}: private key not found",
812
- e.message
813
- end
814
-
815
- def test_handle_options_sign
816
- @cmd.handle_options %W[
817
- --private-key #{ALTERNATE_KEY_FILE}
818
- --private-key #{PRIVATE_KEY_FILE}
819
-
820
- --certificate #{ALTERNATE_CERT_FILE}
821
- --certificate #{PUBLIC_CERT_FILE}
822
-
823
- --sign #{ALTERNATE_CERT_FILE}
824
- --sign #{CHILD_CERT_FILE}
825
- ]
826
-
827
- assert_equal PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem
828
- assert_equal PUBLIC_CERT.to_pem, @cmd.options[:issuer_cert].to_pem
829
-
830
- assert_equal [ALTERNATE_CERT_FILE, CHILD_CERT_FILE], @cmd.options[:sign]
831
- end
832
-
833
- def test_handle_options_sign_encrypted_key
834
- @cmd.handle_options %W[
835
- --private-key #{ALTERNATE_KEY_FILE}
836
- --private-key #{ENCRYPTED_PRIVATE_KEY_PATH}
837
-
838
- --certificate #{ALTERNATE_CERT_FILE}
839
- --certificate #{PUBLIC_CERT_FILE}
840
-
841
- --sign #{ALTERNATE_CERT_FILE}
842
- --sign #{CHILD_CERT_FILE}
843
- ]
844
-
845
- assert_equal ENCRYPTED_PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem
846
- assert_equal PUBLIC_CERT.to_pem, @cmd.options[:issuer_cert].to_pem
847
-
848
- assert_equal [ALTERNATE_CERT_FILE, CHILD_CERT_FILE], @cmd.options[:sign]
849
- end
850
-
851
- def test_handle_options_sign_nonexistent
852
- nonexistent = File.join @tempdir, "nonexistent"
853
- e = assert_raise Gem::OptionParser::InvalidArgument do
854
- @cmd.handle_options %W[
855
- --private-key #{ALTERNATE_KEY_FILE}
856
-
857
- --certificate #{ALTERNATE_CERT_FILE}
858
-
859
- --sign #{nonexistent}
860
- ]
861
- end
862
-
863
- assert_equal "invalid argument: --sign #{nonexistent}: does not exist",
864
- e.message
865
- end
866
- end if Gem::HAVE_OPENSSL && !Gem.java_platform?