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,739 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require "rubygems/commands/build_command"
5
- require "rubygems/package"
6
-
7
- class TestGemCommandsBuildCommand < Gem::TestCase
8
- CERT_FILE = cert_path "public3072"
9
- SIGNING_KEY = key_path "private3072"
10
-
11
- EXPIRED_CERT_FILE = cert_path "expired"
12
- PRIVATE_KEY_FILE = key_path "private"
13
-
14
- def setup
15
- super
16
-
17
- readme_file = File.join(@tempdir, "README.md")
18
-
19
- begin
20
- umask_orig = File.umask(2)
21
- File.open readme_file, "w" do |f|
22
- f.write "My awesome gem"
23
- end
24
- ensure
25
- File.umask(umask_orig)
26
- end
27
-
28
- @gem = util_spec "some_gem" do |s|
29
- s.license = "AGPL-3.0"
30
- s.files = ["README.md"]
31
- end
32
-
33
- @cmd = Gem::Commands::BuildCommand.new
34
- end
35
-
36
- def test_handle_options
37
- @cmd.handle_options %w[--force --strict]
38
-
39
- assert @cmd.options[:force]
40
- assert @cmd.options[:strict]
41
- assert @cmd.handles?(%W[--platform #{Gem::Platform.local}])
42
- assert_includes Gem.platforms, Gem::Platform.local
43
- end
44
-
45
- def test_handle_deprecated_options
46
- use_ui @ui do
47
- @cmd.handle_options %w[-C ./test/dir]
48
- end
49
-
50
- assert_equal "WARNING: The \"-C\" option has been deprecated and will be removed in Rubygems 4.0. " \
51
- "-C is a global flag now. Use `gem -C PATH build GEMSPEC_FILE [options]` instead\n",
52
- @ui.error
53
- end
54
-
55
- def test_options_filename
56
- gemspec_file = File.join(@tempdir, @gem.spec_name)
57
-
58
- File.open gemspec_file, "w" do |gs|
59
- gs.write @gem.to_ruby
60
- end
61
-
62
- @cmd.options[:args] = [gemspec_file]
63
- @cmd.options[:output] = "test.gem"
64
-
65
- use_ui @ui do
66
- Dir.chdir @tempdir do
67
- @cmd.execute
68
- end
69
- end
70
-
71
- file = File.join(@tempdir, File::SEPARATOR, "test.gem")
72
- assert File.exist?(file)
73
-
74
- output = @ui.output.split "\n"
75
- assert_equal " Successfully built RubyGem", output.shift
76
- assert_equal " Name: some_gem", output.shift
77
- assert_equal " Version: 2", output.shift
78
- assert_equal " File: test.gem", output.shift
79
- assert_equal [], output
80
- end
81
-
82
- def test_handle_options_defaults
83
- @cmd.handle_options []
84
-
85
- refute @cmd.options[:force]
86
- refute @cmd.options[:strict]
87
- assert_nil @cmd.options[:output]
88
- end
89
-
90
- def test_execute
91
- gemspec_file = File.join(@tempdir, @gem.spec_name)
92
-
93
- File.open gemspec_file, "w" do |gs|
94
- gs.write @gem.to_ruby
95
- end
96
-
97
- @cmd.options[:args] = [gemspec_file]
98
-
99
- util_test_build_gem @gem
100
- end
101
-
102
- def test_execute_platform
103
- gemspec_file = File.join(@tempdir, @gem.spec_name)
104
-
105
- File.open gemspec_file, "w" do |gs|
106
- gs.write @gem.to_ruby
107
- end
108
-
109
- @cmd.options[:args] = [gemspec_file]
110
-
111
- platforms = Gem.platforms.dup
112
- begin
113
- Gem.platforms << Gem::Platform.new("java")
114
-
115
- spec = util_test_build_gem @gem, suffix: "java"
116
- ensure
117
- Gem.platforms.replace(platforms)
118
- end
119
- assert_match spec.platform, "java"
120
- end
121
-
122
- def test_execute_bad_name
123
- [".", "-", "_"].each do |special_char|
124
- gem = util_spec "some_gem_with_bad_name" do |s|
125
- s.name = "#{special_char}bad_gem_name"
126
- s.license = "AGPL-3.0"
127
- s.files = ["README.md"]
128
- end
129
-
130
- gemspec_file = File.join(@tempdir, gem.spec_name)
131
-
132
- File.open gemspec_file, "w" do |gs|
133
- gs.write gem.to_ruby
134
- end
135
-
136
- @cmd.options[:args] = [gemspec_file]
137
-
138
- use_ui @ui do
139
- Dir.chdir @tempdir do
140
- assert_raise Gem::InvalidSpecificationException do
141
- @cmd.execute
142
- end
143
- end
144
- end
145
- end
146
- end
147
-
148
- def test_execute_strict_without_warnings
149
- gemspec_file = File.join(@tempdir, @gem.spec_name)
150
-
151
- File.open gemspec_file, "w" do |gs|
152
- gs.write @gem.to_ruby
153
- end
154
-
155
- @cmd.options[:strict] = true
156
- @cmd.options[:args] = [gemspec_file]
157
-
158
- util_test_build_gem @gem
159
- end
160
-
161
- def test_execute_rubyforge_project_warning
162
- rubyforge_gemspec = File.expand_path File.join("specifications", "rubyforge-0.0.1.gemspec"), __dir__
163
-
164
- @cmd.options[:args] = [rubyforge_gemspec]
165
-
166
- use_ui @ui do
167
- Dir.chdir @tempdir do
168
- @cmd.execute
169
- end
170
- end
171
-
172
- error = @ui.error.split("\n")
173
- assert_equal "WARNING: rubyforge_project= is deprecated and ignored. Please remove this from your gemspec to ensure that your gem continues to build in the future.", error.shift
174
- assert_equal "WARNING: See https://guides.rubygems.org/specification-reference/ for help", error.shift
175
- assert_equal [], error
176
- end
177
-
178
- def test_execute_strict_with_warnings
179
- bad_gem = util_spec "some_bad_gem" do |s|
180
- s.files = ["README.md"]
181
- end
182
-
183
- gemspec_file = File.join(@tempdir, bad_gem.spec_name)
184
-
185
- File.open gemspec_file, "w" do |gs|
186
- gs.write bad_gem.to_ruby
187
- end
188
-
189
- @cmd.options[:args] = [gemspec_file]
190
- @cmd.options[:strict] = true
191
-
192
- use_ui @ui do
193
- Dir.chdir @tempdir do
194
- assert_raise Gem::InvalidSpecificationException do
195
- @cmd.execute
196
- end
197
- end
198
- end
199
-
200
- error = @ui.error.split "\n"
201
- assert_equal "WARNING: licenses is empty, but is recommended. Use a license identifier from", error.shift
202
- assert_equal "http://spdx.org/licenses or 'Nonstandard' for a nonstandard license,", error.shift
203
- assert_equal "or set it to nil if you don't want to specify a license.", error.shift
204
- assert_equal "WARNING: See https://guides.rubygems.org/specification-reference/ for help", error.shift
205
- assert_equal [], error
206
-
207
- gem_file = File.join @tempdir, File.basename(@gem.cache_file)
208
- refute File.exist?(gem_file)
209
- end
210
-
211
- def test_execute_bad_spec
212
- @gem.date = "2010-11-08"
213
-
214
- gemspec_file = File.join(@tempdir, @gem.spec_name)
215
-
216
- File.open gemspec_file, "w" do |gs|
217
- gs.write @gem.to_ruby.sub(/11-08/, "11-8")
218
- end
219
-
220
- @cmd.options[:args] = [gemspec_file]
221
-
222
- out, err = use_ui @ui do
223
- capture_output do
224
- assert_raise Gem::MockGemUi::TermError do
225
- @cmd.execute
226
- end
227
- end
228
- end
229
-
230
- assert_equal "", out
231
- assert_match(/invalid date format in specification/, err)
232
-
233
- assert_equal "", @ui.output
234
- assert_equal "ERROR: Error loading gemspec. Aborting.\n", @ui.error
235
- end
236
-
237
- def test_execute_missing_file
238
- @cmd.options[:args] = %w[some_gem]
239
- use_ui @ui do
240
- assert_raise Gem::MockGemUi::TermError do
241
- @cmd.execute
242
- end
243
- end
244
-
245
- assert_equal "", @ui.output
246
- assert_equal "ERROR: Couldn't find a gemspec file matching 'some_gem' in #{@tempdir}\n", @ui.error
247
- end
248
-
249
- def test_execute_outside_dir
250
- gemspec_dir = File.join @tempdir, "build_command_gem"
251
- gemspec_file = File.join gemspec_dir, @gem.spec_name
252
- readme_file = File.join gemspec_dir, "README.md"
253
-
254
- FileUtils.mkdir_p gemspec_dir
255
-
256
- File.open readme_file, "w" do |f|
257
- f.write "My awesome gem"
258
- end
259
-
260
- File.open gemspec_file, "w" do |gs|
261
- gs.write @gem.to_ruby
262
- end
263
-
264
- @cmd.options[:build_path] = gemspec_dir
265
- @cmd.options[:args] = [gemspec_file]
266
-
267
- use_ui @ui do
268
- @cmd.execute
269
- end
270
-
271
- output = @ui.output.split "\n"
272
- assert_equal " Successfully built RubyGem", output.shift
273
- assert_equal " Name: some_gem", output.shift
274
- assert_equal " Version: 2", output.shift
275
- assert_equal " File: some_gem-2.gem", output.shift
276
- assert_equal [], output
277
-
278
- gem_file = File.join gemspec_dir, File.basename(@gem.cache_file)
279
- assert File.exist?(gem_file)
280
-
281
- spec = Gem::Package.new(gem_file).spec
282
-
283
- assert_equal "some_gem", spec.name
284
- assert_equal "this is a summary", spec.summary
285
- end
286
-
287
- def test_execute_outside_dir_with_glob_argument
288
- gemspec_dir = File.join @tempdir, "build_command_gem"
289
- gemspec_file = File.join gemspec_dir, @gem.spec_name
290
- readme_file = File.join gemspec_dir, "README.md"
291
-
292
- FileUtils.mkdir_p gemspec_dir
293
-
294
- File.open readme_file, "w" do |f|
295
- f.write "My awesome gem"
296
- end
297
-
298
- File.open gemspec_file, "w" do |gs|
299
- gs.write @gem.to_ruby
300
- end
301
-
302
- @cmd.options[:build_path] = gemspec_dir
303
- @cmd.options[:args] = ["*.gemspec"]
304
-
305
- use_ui @ui do
306
- @cmd.execute
307
- end
308
-
309
- output = @ui.output.split "\n"
310
- assert_equal " Successfully built RubyGem", output.shift
311
- assert_equal " Name: some_gem", output.shift
312
- assert_equal " Version: 2", output.shift
313
- assert_equal " File: some_gem-2.gem", output.shift
314
- assert_equal [], output
315
-
316
- gem_file = File.join gemspec_dir, File.basename(@gem.cache_file)
317
- assert File.exist?(gem_file)
318
-
319
- spec = Gem::Package.new(gem_file).spec
320
-
321
- assert_equal "some_gem", spec.name
322
- assert_equal "this is a summary", spec.summary
323
- end
324
-
325
- def test_execute_outside_dir_no_gemspec_present
326
- gemspec_dir = File.join @tempdir, "build_command_gem"
327
- gemspec_file = File.join @tempdir, @gem.spec_name
328
- readme_file = File.join gemspec_dir, "README.md"
329
-
330
- FileUtils.mkdir_p gemspec_dir
331
-
332
- File.open readme_file, "w" do |f|
333
- f.write "My awesome gem"
334
- end
335
-
336
- File.open gemspec_file, "w" do |gs|
337
- gs.write @gem.to_ruby
338
- end
339
-
340
- @cmd.options[:build_path] = gemspec_dir
341
- @cmd.options[:args] = ["*.gemspec"]
342
-
343
- use_ui @ui do
344
- assert_raise Gem::MockGemUi::TermError do
345
- @cmd.execute
346
- end
347
- end
348
-
349
- assert_equal "", @ui.output
350
- assert_equal "ERROR: Couldn't find a gemspec file matching '*.gemspec' in #{gemspec_dir}\n", @ui.error
351
-
352
- gem_file = File.join gemspec_dir, File.basename(@gem.cache_file)
353
- refute File.exist?(gem_file)
354
- end
355
-
356
- def test_execute_outside_dir_without_gem_name
357
- gemspec_dir = File.join(@tempdir, "build_command_gem")
358
- gemspec_file = File.join(gemspec_dir, @gem.spec_name)
359
-
360
- readme_file = File.join gemspec_dir, "README.md"
361
-
362
- FileUtils.mkdir_p(gemspec_dir)
363
-
364
- File.open readme_file, "w" do |f|
365
- f.write "My awesome gem"
366
- end
367
-
368
- File.open(gemspec_file, "w") do |gs|
369
- gs.write(@gem.to_ruby)
370
- end
371
-
372
- @cmd.options[:build_path] = gemspec_dir
373
- @cmd.options[:args] = []
374
-
375
- use_ui @ui do
376
- Dir.chdir(gemspec_dir) do
377
- @cmd.execute
378
- end
379
- end
380
-
381
- output = @ui.output.split("\n")
382
- assert_equal " Successfully built RubyGem", output.shift
383
- assert_equal " Name: some_gem", output.shift
384
- assert_equal " Version: 2", output.shift
385
- assert_equal " File: some_gem-2.gem", output.shift
386
- assert_equal [], output
387
-
388
- gem_file = File.join gemspec_dir, File.basename(@gem.cache_file)
389
- assert File.exist?(gem_file)
390
-
391
- spec = Gem::Package.new(gem_file).spec
392
-
393
- assert_equal "some_gem", spec.name
394
- assert_equal "this is a summary", spec.summary
395
- end
396
-
397
- def test_execute_outside_dir_with_external_gemspec
398
- gemspec_dir = File.join @tempdir, "gemspec_dir"
399
- gemspec_file = File.join gemspec_dir, @gem.spec_name
400
-
401
- gemcode_dir = File.join @tempdir, "build_command_gem"
402
- readme_file = File.join gemcode_dir, "README.md"
403
-
404
- FileUtils.mkdir_p gemspec_dir
405
- FileUtils.mkdir_p gemcode_dir
406
-
407
- File.open readme_file, "w" do |f|
408
- f.write "My awesome gem in nested directory"
409
- end
410
-
411
- File.open gemspec_file, "w" do |gs|
412
- gs.write @gem.to_ruby
413
- end
414
-
415
- @cmd.options[:build_path] = gemcode_dir
416
- @cmd.options[:args] = [gemspec_file]
417
-
418
- use_ui @ui do
419
- @cmd.execute
420
- end
421
-
422
- output = @ui.output.split "\n"
423
- assert_equal " Successfully built RubyGem", output.shift
424
- assert_equal " Name: some_gem", output.shift
425
- assert_equal " Version: 2", output.shift
426
- assert_equal " File: some_gem-2.gem", output.shift
427
- assert_equal [], output
428
-
429
- gem_file = File.join gemcode_dir, File.basename(@gem.cache_file)
430
- assert File.exist?(gem_file)
431
-
432
- spec = Gem::Package.new(gem_file).spec
433
-
434
- assert_equal "some_gem", spec.name
435
- assert_equal "this is a summary", spec.summary
436
- end
437
-
438
- def test_execute_outside_dir_with_external_relative_gemspec
439
- gemspec_dir = File.join @tempdir, "gemspec_dir"
440
- gemspec_file = File.join gemspec_dir, @gem.spec_name
441
-
442
- gemcode_dir = File.join @tempdir, "build_command_gem"
443
- readme_file = File.join gemcode_dir, "README.md"
444
-
445
- FileUtils.mkdir_p gemspec_dir
446
- FileUtils.mkdir_p gemcode_dir
447
-
448
- File.open readme_file, "w" do |f|
449
- f.write "My awesome gem in nested directory"
450
- end
451
-
452
- File.open gemspec_file, "w" do |gs|
453
- gs.write @gem.to_ruby
454
- end
455
-
456
- @cmd.options[:build_path] = gemcode_dir
457
- @cmd.options[:args] = [File.join("..", "gemspec_dir", @gem.spec_name)]
458
-
459
- use_ui @ui do
460
- @cmd.execute
461
- end
462
-
463
- output = @ui.output.split "\n"
464
- assert_equal " Successfully built RubyGem", output.shift
465
- assert_equal " Name: some_gem", output.shift
466
- assert_equal " Version: 2", output.shift
467
- assert_equal " File: some_gem-2.gem", output.shift
468
- assert_equal [], output
469
-
470
- gem_file = File.join gemcode_dir, File.basename(@gem.cache_file)
471
- assert File.exist?(gem_file)
472
-
473
- spec = Gem::Package.new(gem_file).spec
474
-
475
- assert_equal "some_gem", spec.name
476
- assert_equal "this is a summary", spec.summary
477
- end
478
-
479
- def test_can_find_gemspecs_without_dot_gemspec
480
- gemspec_file = File.join(@tempdir, @gem.name)
481
-
482
- File.open gemspec_file + ".gemspec", "w" do |gs|
483
- gs.write @gem.to_ruby
484
- end
485
-
486
- @cmd.options[:args] = [gemspec_file]
487
-
488
- util_test_build_gem @gem
489
- end
490
-
491
- def test_execute_without_gem_name
492
- some_gem = util_spec "some_gem"
493
- gemspec_dir = File.join(@tempdir, "build_command_gem")
494
- gemspec_file = File.join(gemspec_dir, some_gem.spec_name)
495
-
496
- FileUtils.mkdir_p(gemspec_dir)
497
-
498
- File.open(gemspec_file, "w") do |gs|
499
- gs.write(some_gem.to_ruby)
500
- end
501
-
502
- @cmd.options[:args] = []
503
-
504
- use_ui @ui do
505
- Dir.chdir(gemspec_dir) do
506
- @cmd.execute
507
- end
508
- end
509
-
510
- output = @ui.output.split("\n")
511
- assert_equal " Successfully built RubyGem", output.shift
512
- assert_equal " Name: some_gem", output.shift
513
- assert_equal " Version: 2", output.shift
514
- assert_equal " File: some_gem-2.gem", output.shift
515
- assert_equal [], output
516
-
517
- some_gem = File.join(gemspec_dir, File.basename(some_gem.cache_file))
518
- assert File.exist?(some_gem)
519
- end
520
-
521
- def test_execute_multiple_gemspec_without_gem_name
522
- some_gem = util_spec "some_gem"
523
- another_gem = util_spec "another_gem"
524
- gemspec_dir = File.join(@tempdir, "build_command_gem")
525
- gemspec_file = File.join(gemspec_dir, some_gem.spec_name)
526
- another_gemspec_file = File.join(gemspec_dir, another_gem.spec_name)
527
-
528
- FileUtils.mkdir_p(gemspec_dir)
529
-
530
- File.open(gemspec_file, "w") do |gs|
531
- gs.write(some_gem.to_ruby)
532
- end
533
-
534
- File.open(another_gemspec_file, "w") do |gs|
535
- gs.write(another_gem.to_ruby)
536
- end
537
-
538
- @cmd.options[:args] = []
539
-
540
- use_ui @ui do
541
- Dir.chdir(gemspec_dir) do
542
- assert_raise Gem::MockGemUi::TermError do
543
- @cmd.execute
544
- end
545
- end
546
- end
547
-
548
- gemspecs = ["another_gem-2.gemspec", "some_gem-2.gemspec"]
549
- assert_equal "", @ui.output
550
- assert_equal @ui.error, "ERROR: Multiple gemspecs found: #{gemspecs}, please specify one\n"
551
-
552
- expected_gem = File.join(gemspec_dir, File.basename(another_gem.cache_file))
553
- refute File.exist?(expected_gem)
554
- end
555
-
556
- def util_test_build_gem(gem, suffix: nil)
557
- use_ui @ui do
558
- Dir.chdir @tempdir do
559
- @cmd.execute
560
- end
561
- end
562
- suffix &&= "-#{suffix}"
563
- gem_file = "some_gem-2#{suffix}.gem"
564
- output = @ui.output.split "\n"
565
- assert_equal " Successfully built RubyGem", output.shift
566
- assert_equal " Name: some_gem", output.shift
567
- assert_equal " Version: 2", output.shift
568
- assert_equal " File: #{gem_file}", output.shift
569
- assert_equal [], output
570
-
571
- gem_file = File.join(@tempdir, gem_file)
572
- assert File.exist?(gem_file)
573
-
574
- spec = Gem::Package.new(gem_file).spec
575
-
576
- assert_equal "some_gem", spec.name
577
- assert_equal "this is a summary", spec.summary
578
- spec
579
- end
580
-
581
- def test_execute_force
582
- gemspec_file = File.join(@tempdir, @gem.spec_name)
583
-
584
- @gem.send :remove_instance_variable, :@rubygems_version
585
-
586
- File.open gemspec_file, "w" do |gs|
587
- gs.write @gem.to_ruby
588
- end
589
-
590
- @cmd.options[:args] = [gemspec_file]
591
- @cmd.options[:force] = true
592
-
593
- util_test_build_gem @gem
594
- end
595
-
596
- def test_build_signed_gem
597
- pend "openssl is missing" unless Gem::HAVE_OPENSSL && !java_platform?
598
-
599
- trust_dir = Gem::Security.trust_dir
600
-
601
- spec = util_spec "some_gem" do |s|
602
- s.signing_key = SIGNING_KEY
603
- s.cert_chain = [CERT_FILE]
604
- end
605
-
606
- gemspec_file = File.join(@tempdir, spec.spec_name)
607
-
608
- File.open gemspec_file, "w" do |gs|
609
- gs.write spec.to_ruby
610
- end
611
-
612
- @cmd.options[:args] = [gemspec_file]
613
-
614
- util_test_build_gem spec
615
-
616
- trust_dir.trust_cert OpenSSL::X509::Certificate.new(File.read(CERT_FILE))
617
-
618
- gem = Gem::Package.new(File.join(@tempdir, spec.file_name),
619
- Gem::Security::HighSecurity)
620
- assert gem.verify
621
- end
622
-
623
- def test_build_signed_gem_with_cert_expiration_length_days
624
- pend "openssl is missing" unless Gem::HAVE_OPENSSL && !java_platform?
625
-
626
- gem_path = File.join Gem.user_home, ".gem"
627
- Dir.mkdir gem_path
628
-
629
- Gem::Security.trust_dir
630
-
631
- tmp_expired_cert_file = File.join gem_path, "gem-public_cert.pem"
632
- File.write(tmp_expired_cert_file, File.read(EXPIRED_CERT_FILE))
633
-
634
- tmp_private_key_file = File.join gem_path, "gem-private_key.pem"
635
- File.write(tmp_private_key_file, File.read(PRIVATE_KEY_FILE))
636
-
637
- spec = util_spec "some_gem" do |s|
638
- s.signing_key = tmp_private_key_file
639
- s.cert_chain = [tmp_expired_cert_file]
640
- end
641
-
642
- gemspec_file = File.join(@tempdir, spec.spec_name)
643
-
644
- File.open gemspec_file, "w" do |gs|
645
- gs.write spec.to_ruby
646
- end
647
-
648
- @cmd.options[:args] = [gemspec_file]
649
-
650
- Gem.configuration.cert_expiration_length_days = 28
651
-
652
- use_ui @ui do
653
- Dir.chdir @tempdir do
654
- @cmd.execute
655
- end
656
- end
657
-
658
- re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file))
659
- cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60)
660
-
661
- gem_file = File.join @tempdir, File.basename(spec.cache_file)
662
-
663
- assert File.exist?(gem_file)
664
- assert_equal(28, cert_days_to_expire)
665
- end
666
-
667
- def test_build_auto_resign_cert
668
- pend "openssl is missing" unless Gem::HAVE_OPENSSL && !java_platform?
669
-
670
- gem_path = File.join Gem.user_home, ".gem"
671
- Dir.mkdir gem_path
672
-
673
- Gem::Security.trust_dir
674
-
675
- tmp_expired_cert_file = File.join gem_path, "gem-public_cert.pem"
676
- File.write(tmp_expired_cert_file, File.read(EXPIRED_CERT_FILE))
677
-
678
- tmp_private_key_file = File.join gem_path, "gem-private_key.pem"
679
- File.write(tmp_private_key_file, File.read(PRIVATE_KEY_FILE))
680
-
681
- spec = util_spec "some_gem" do |s|
682
- s.signing_key = tmp_private_key_file
683
- s.cert_chain = [tmp_expired_cert_file]
684
- end
685
-
686
- gemspec_file = File.join(@tempdir, spec.spec_name)
687
-
688
- File.open gemspec_file, "w" do |gs|
689
- gs.write spec.to_ruby
690
- end
691
-
692
- @cmd.options[:args] = [gemspec_file]
693
-
694
- Gem.configuration.cert_expiration_length_days = 28
695
-
696
- use_ui @ui do
697
- Dir.chdir @tempdir do
698
- @cmd.execute
699
- end
700
- end
701
-
702
- output = @ui.output.split "\n"
703
- assert_equal "INFO: Your certificate has expired, trying to re-sign it...", output.shift
704
- assert_equal "INFO: Your cert: #{tmp_expired_cert_file } has been auto re-signed with the key: #{tmp_private_key_file}", output.shift
705
- assert_match(/INFO: Your expired cert will be located at: .+\Wgem-public_cert\.pem\.expired\.[0-9]+/, output.shift)
706
- end
707
-
708
- def test_build_is_reproducible
709
- epoch = ENV["SOURCE_DATE_EPOCH"]
710
- new_epoch = Time.now.to_i.to_s
711
- ENV["SOURCE_DATE_EPOCH"] = new_epoch
712
-
713
- gem_file = File.basename(@gem.cache_file)
714
-
715
- gemspec_file = File.join(@tempdir, @gem.spec_name)
716
- File.write(gemspec_file, @gem.to_ruby)
717
- @cmd.options[:args] = [gemspec_file]
718
-
719
- util_test_build_gem @gem
720
-
721
- build1_contents = File.read(gem_file)
722
-
723
- # Guarantee the time has changed.
724
- sleep 1 if Time.now.to_i == new_epoch
725
-
726
- ENV["SOURCE_DATE_EPOCH"] = new_epoch
727
-
728
- @ui = Gem::MockGemUi.new
729
- @cmd.options[:args] = [gemspec_file]
730
-
731
- util_test_build_gem @gem
732
-
733
- build2_contents = File.read(gem_file)
734
-
735
- assert_equal build1_contents, build2_contents
736
- ensure
737
- ENV["SOURCE_DATE_EPOCH"] = epoch
738
- end
739
- end