rubygems-update 2.7.11 → 3.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +67 -0
  3. data/.travis.yml +24 -18
  4. data/CODE_OF_CONDUCT.md +10 -8
  5. data/CONTRIBUTING.md +148 -0
  6. data/History.txt +458 -8
  7. data/MAINTAINERS.txt +1 -0
  8. data/Manifest.txt +16 -9
  9. data/POLICIES.md +92 -0
  10. data/README.md +53 -26
  11. data/Rakefile +77 -211
  12. data/{UPGRADING.rdoc → UPGRADING.md} +31 -32
  13. data/appveyor.yml +20 -45
  14. data/bin/gem +1 -2
  15. data/bin/update_rubygems +2 -3
  16. data/bundler/CHANGELOG.md +65 -0
  17. data/bundler/bundler.gemspec +7 -1
  18. data/bundler/lib/bundler/build_metadata.rb +1 -1
  19. data/bundler/lib/bundler/cli/add.rb +15 -5
  20. data/bundler/lib/bundler/cli/binstubs.rb +8 -2
  21. data/bundler/lib/bundler/cli/doctor.rb +47 -1
  22. data/bundler/lib/bundler/cli/install.rb +8 -5
  23. data/bundler/lib/bundler/cli/list.rb +41 -5
  24. data/bundler/lib/bundler/cli/outdated.rb +7 -1
  25. data/bundler/lib/bundler/cli/pristine.rb +4 -0
  26. data/bundler/lib/bundler/cli/remove.rb +18 -0
  27. data/bundler/lib/bundler/cli.rb +63 -21
  28. data/bundler/lib/bundler/definition.rb +15 -16
  29. data/bundler/lib/bundler/dependency.rb +2 -2
  30. data/bundler/lib/bundler/dsl.rb +19 -3
  31. data/bundler/lib/bundler/feature_flag.rb +7 -0
  32. data/bundler/lib/bundler/gem_version_promoter.rb +4 -2
  33. data/bundler/lib/bundler/injector.rb +168 -9
  34. data/bundler/lib/bundler/installer/parallel_installer.rb +5 -0
  35. data/bundler/lib/bundler/installer.rb +29 -6
  36. data/bundler/lib/bundler/plugin/events.rb +61 -0
  37. data/bundler/lib/bundler/plugin.rb +10 -3
  38. data/bundler/lib/bundler/resolver.rb +2 -2
  39. data/bundler/lib/bundler/rubygems_gem_installer.rb +7 -0
  40. data/bundler/lib/bundler/runtime.rb +8 -2
  41. data/bundler/lib/bundler/settings/validator.rb +23 -0
  42. data/bundler/lib/bundler/settings.rb +24 -3
  43. data/bundler/lib/bundler/shared_helpers.rb +19 -3
  44. data/bundler/lib/bundler/source/metadata.rb +2 -3
  45. data/bundler/lib/bundler/source.rb +9 -9
  46. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  47. data/bundler/lib/bundler/version.rb +1 -1
  48. data/bundler/lib/bundler.rb +26 -8
  49. data/bundler/man/bundle-add.ronn +13 -2
  50. data/bundler/man/bundle-config.ronn +21 -0
  51. data/bundler/man/bundle-install.ronn +1 -1
  52. data/bundler/man/bundle-list.ronn +19 -1
  53. data/bundler/man/bundle-outdated.ronn +4 -0
  54. data/bundler/man/bundle-remove.ronn +23 -0
  55. data/bundler/man/bundle-update.ronn +1 -1
  56. data/bundler/man/bundle.ronn +3 -0
  57. data/lib/rubygems/available_set.rb +1 -1
  58. data/lib/rubygems/basic_specification.rb +12 -12
  59. data/lib/rubygems/bundler_version_finder.rb +3 -3
  60. data/lib/rubygems/command.rb +22 -15
  61. data/lib/rubygems/command_manager.rb +22 -5
  62. data/lib/rubygems/commands/build_command.rb +41 -7
  63. data/lib/rubygems/commands/cert_command.rb +45 -24
  64. data/lib/rubygems/commands/check_command.rb +1 -1
  65. data/lib/rubygems/commands/cleanup_command.rb +14 -7
  66. data/lib/rubygems/commands/contents_command.rb +14 -15
  67. data/lib/rubygems/commands/dependency_command.rb +17 -17
  68. data/lib/rubygems/commands/environment_command.rb +20 -1
  69. data/lib/rubygems/commands/fetch_command.rb +2 -3
  70. data/lib/rubygems/commands/generate_index_command.rb +2 -3
  71. data/lib/rubygems/commands/help_command.rb +12 -13
  72. data/lib/rubygems/commands/info_command.rb +33 -0
  73. data/lib/rubygems/commands/install_command.rb +21 -17
  74. data/lib/rubygems/commands/list_command.rb +0 -1
  75. data/lib/rubygems/commands/lock_command.rb +3 -4
  76. data/lib/rubygems/commands/open_command.rb +16 -10
  77. data/lib/rubygems/commands/owner_command.rb +21 -7
  78. data/lib/rubygems/commands/pristine_command.rb +23 -16
  79. data/lib/rubygems/commands/push_command.rb +19 -8
  80. data/lib/rubygems/commands/query_command.rb +24 -24
  81. data/lib/rubygems/commands/rdoc_command.rb +3 -4
  82. data/lib/rubygems/commands/search_command.rb +0 -1
  83. data/lib/rubygems/commands/server_command.rb +1 -2
  84. data/lib/rubygems/commands/setup_command.rb +86 -48
  85. data/lib/rubygems/commands/signin_command.rb +2 -1
  86. data/lib/rubygems/commands/signout_command.rb +2 -2
  87. data/lib/rubygems/commands/sources_command.rb +11 -12
  88. data/lib/rubygems/commands/specification_command.rb +7 -7
  89. data/lib/rubygems/commands/uninstall_command.rb +50 -18
  90. data/lib/rubygems/commands/unpack_command.rb +16 -7
  91. data/lib/rubygems/commands/update_command.rb +28 -23
  92. data/lib/rubygems/commands/which_command.rb +5 -8
  93. data/lib/rubygems/commands/yank_command.rb +1 -2
  94. data/lib/rubygems/compatibility.rb +1 -21
  95. data/lib/rubygems/config_file.rb +36 -36
  96. data/lib/rubygems/core_ext/kernel_require.rb +6 -6
  97. data/lib/rubygems/core_ext/kernel_warn.rb +45 -0
  98. data/lib/rubygems/defaults.rb +31 -19
  99. data/lib/rubygems/dependency.rb +15 -15
  100. data/lib/rubygems/dependency_installer.rb +30 -33
  101. data/lib/rubygems/dependency_list.rb +9 -10
  102. data/lib/rubygems/deprecate.rb +2 -3
  103. data/lib/rubygems/doctor.rb +5 -6
  104. data/lib/rubygems/errors.rb +3 -3
  105. data/lib/rubygems/exceptions.rb +11 -8
  106. data/lib/rubygems/ext/build_error.rb +0 -1
  107. data/lib/rubygems/ext/builder.rb +50 -23
  108. data/lib/rubygems/ext/cmake_builder.rb +2 -2
  109. data/lib/rubygems/ext/configure_builder.rb +2 -3
  110. data/lib/rubygems/ext/ext_conf_builder.rb +8 -7
  111. data/lib/rubygems/ext/rake_builder.rb +16 -18
  112. data/lib/rubygems/ext.rb +0 -1
  113. data/lib/rubygems/gem_runner.rb +2 -2
  114. data/lib/rubygems/gemcutter_utilities.rb +46 -12
  115. data/lib/rubygems/indexer.rb +19 -12
  116. data/lib/rubygems/install_default_message.rb +0 -1
  117. data/lib/rubygems/install_message.rb +0 -1
  118. data/lib/rubygems/install_update_options.rb +3 -29
  119. data/lib/rubygems/installer.rb +97 -55
  120. data/lib/rubygems/installer_test_case.rb +2 -16
  121. data/lib/rubygems/local_remote_options.rb +5 -4
  122. data/lib/rubygems/mock_gem_ui.rb +3 -4
  123. data/lib/rubygems/name_tuple.rb +4 -4
  124. data/lib/rubygems/package/digest_io.rb +3 -4
  125. data/lib/rubygems/package/file_source.rb +3 -4
  126. data/lib/rubygems/package/io_source.rb +1 -2
  127. data/lib/rubygems/package/old.rb +8 -16
  128. data/lib/rubygems/package/source.rb +0 -1
  129. data/lib/rubygems/package/tar_header.rb +13 -4
  130. data/lib/rubygems/package/tar_reader/entry.rb +20 -4
  131. data/lib/rubygems/package/tar_reader.rb +2 -4
  132. data/lib/rubygems/package/tar_test_case.rb +2 -8
  133. data/lib/rubygems/package/tar_writer.rb +13 -15
  134. data/lib/rubygems/package.rb +90 -63
  135. data/lib/rubygems/package_task.rb +0 -1
  136. data/lib/rubygems/path_support.rb +16 -6
  137. data/lib/rubygems/platform.rb +4 -5
  138. data/lib/rubygems/psych_tree.rb +1 -1
  139. data/lib/rubygems/rdoc.rb +2 -313
  140. data/lib/rubygems/remote_fetcher.rb +29 -82
  141. data/lib/rubygems/request/connection_pools.rb +24 -13
  142. data/lib/rubygems/request/http_pool.rb +3 -4
  143. data/lib/rubygems/request/https_pool.rb +1 -3
  144. data/lib/rubygems/request.rb +17 -16
  145. data/lib/rubygems/request_set/gem_dependency_api.rb +46 -49
  146. data/lib/rubygems/request_set/lockfile/parser.rb +18 -29
  147. data/lib/rubygems/request_set/lockfile/tokenizer.rb +9 -9
  148. data/lib/rubygems/request_set/lockfile.rb +12 -12
  149. data/lib/rubygems/request_set.rb +52 -25
  150. data/lib/rubygems/requirement.rb +32 -21
  151. data/lib/rubygems/resolver/activation_request.rb +6 -6
  152. data/lib/rubygems/resolver/api_set.rb +5 -6
  153. data/lib/rubygems/resolver/api_specification.rb +2 -3
  154. data/lib/rubygems/resolver/best_set.rb +5 -6
  155. data/lib/rubygems/resolver/composed_set.rb +5 -6
  156. data/lib/rubygems/resolver/conflict.rb +5 -5
  157. data/lib/rubygems/resolver/current_set.rb +1 -2
  158. data/lib/rubygems/resolver/dependency_request.rb +4 -4
  159. data/lib/rubygems/resolver/git_set.rb +5 -6
  160. data/lib/rubygems/resolver/git_specification.rb +4 -5
  161. data/lib/rubygems/resolver/index_set.rb +5 -6
  162. data/lib/rubygems/resolver/index_specification.rb +3 -4
  163. data/lib/rubygems/resolver/installed_specification.rb +3 -4
  164. data/lib/rubygems/resolver/installer_set.rb +12 -12
  165. data/lib/rubygems/resolver/local_specification.rb +1 -2
  166. data/lib/rubygems/resolver/lock_set.rb +5 -6
  167. data/lib/rubygems/resolver/lock_specification.rb +7 -8
  168. data/lib/rubygems/resolver/requirement_list.rb +1 -1
  169. data/lib/rubygems/resolver/set.rb +2 -2
  170. data/lib/rubygems/resolver/source_set.rb +4 -5
  171. data/lib/rubygems/resolver/spec_specification.rb +1 -2
  172. data/lib/rubygems/resolver/specification.rb +10 -7
  173. data/lib/rubygems/resolver/stats.rb +1 -1
  174. data/lib/rubygems/resolver/vendor_set.rb +4 -5
  175. data/lib/rubygems/resolver/vendor_specification.rb +2 -3
  176. data/lib/rubygems/resolver.rb +14 -16
  177. data/lib/rubygems/s3_uri_signer.rb +183 -0
  178. data/lib/rubygems/safe_yaml.rb +18 -10
  179. data/lib/rubygems/security/policies.rb +1 -2
  180. data/lib/rubygems/security/policy.rb +25 -25
  181. data/lib/rubygems/security/signer.rb +72 -24
  182. data/lib/rubygems/security/trust_dir.rb +10 -10
  183. data/lib/rubygems/security.rb +21 -22
  184. data/lib/rubygems/security_option.rb +0 -1
  185. data/lib/rubygems/server.rb +21 -21
  186. data/lib/rubygems/source/git.rb +9 -10
  187. data/lib/rubygems/source/installed.rb +3 -4
  188. data/lib/rubygems/source/local.rb +7 -7
  189. data/lib/rubygems/source/lock.rb +4 -4
  190. data/lib/rubygems/source/specific_file.rb +5 -5
  191. data/lib/rubygems/source/vendor.rb +2 -3
  192. data/lib/rubygems/source.rb +16 -25
  193. data/lib/rubygems/source_list.rb +2 -2
  194. data/lib/rubygems/source_local.rb +0 -1
  195. data/lib/rubygems/spec_fetcher.rb +5 -6
  196. data/lib/rubygems/specification.rb +219 -558
  197. data/lib/rubygems/specification_policy.rb +407 -0
  198. data/lib/rubygems/stub_specification.rb +12 -17
  199. data/lib/rubygems/test_case.rb +161 -75
  200. data/lib/rubygems/test_utilities.rb +20 -35
  201. data/lib/rubygems/text.rb +6 -6
  202. data/lib/rubygems/uninstaller.rb +38 -27
  203. data/lib/rubygems/uri_formatter.rb +1 -2
  204. data/lib/rubygems/user_interaction.rb +37 -89
  205. data/lib/rubygems/util/licenses.rb +27 -1
  206. data/lib/rubygems/util/list.rb +1 -1
  207. data/lib/rubygems/util.rb +32 -14
  208. data/lib/rubygems/validator.rb +4 -5
  209. data/lib/rubygems/version.rb +15 -15
  210. data/lib/rubygems/version_option.rb +2 -3
  211. data/lib/rubygems.rb +71 -102
  212. data/rubygems-update.gemspec +43 -0
  213. data/setup.rb +2 -8
  214. data/test/rubygems/ca_cert.pem +74 -65
  215. data/test/rubygems/client.pem +103 -45
  216. data/test/rubygems/rubygems_plugin.rb +0 -1
  217. data/test/rubygems/simple_gem.rb +1 -1
  218. data/test/rubygems/ssl_cert.pem +78 -17
  219. data/test/rubygems/ssl_key.pem +25 -13
  220. data/test/rubygems/test_bundled_ca.rb +1 -1
  221. data/test/rubygems/test_config.rb +7 -2
  222. data/test/rubygems/test_gem.rb +205 -132
  223. data/test/rubygems/test_gem_bundler_version_finder.rb +4 -0
  224. data/test/rubygems/test_gem_command.rb +0 -1
  225. data/test/rubygems/test_gem_command_manager.rb +18 -3
  226. data/test/rubygems/test_gem_commands_build_command.rb +220 -15
  227. data/test/rubygems/test_gem_commands_cert_command.rb +69 -8
  228. data/test/rubygems/test_gem_commands_check_command.rb +1 -1
  229. data/test/rubygems/test_gem_commands_cleanup_command.rb +27 -1
  230. data/test/rubygems/test_gem_commands_contents_command.rb +1 -2
  231. data/test/rubygems/test_gem_commands_dependency_command.rb +33 -34
  232. data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
  233. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -1
  234. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -1
  235. data/test/rubygems/test_gem_commands_help_command.rb +7 -4
  236. data/test/rubygems/test_gem_commands_info_command.rb +44 -0
  237. data/test/rubygems/test_gem_commands_install_command.rb +79 -12
  238. data/test/rubygems/test_gem_commands_lock_command.rb +0 -1
  239. data/test/rubygems/test_gem_commands_open_command.rb +29 -0
  240. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -1
  241. data/test/rubygems/test_gem_commands_owner_command.rb +93 -57
  242. data/test/rubygems/test_gem_commands_pristine_command.rb +65 -30
  243. data/test/rubygems/test_gem_commands_push_command.rb +54 -0
  244. data/test/rubygems/test_gem_commands_query_command.rb +102 -100
  245. data/test/rubygems/test_gem_commands_search_command.rb +0 -1
  246. data/test/rubygems/test_gem_commands_server_command.rb +0 -1
  247. data/test/rubygems/test_gem_commands_setup_command.rb +50 -15
  248. data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
  249. data/test/rubygems/test_gem_commands_sources_command.rb +0 -1
  250. data/test/rubygems/test_gem_commands_specification_command.rb +2 -3
  251. data/test/rubygems/test_gem_commands_stale_command.rb +3 -2
  252. data/test/rubygems/test_gem_commands_uninstall_command.rb +161 -8
  253. data/test/rubygems/test_gem_commands_unpack_command.rb +17 -1
  254. data/test/rubygems/test_gem_commands_update_command.rb +19 -2
  255. data/test/rubygems/test_gem_commands_which_command.rb +0 -1
  256. data/test/rubygems/test_gem_commands_yank_command.rb +0 -1
  257. data/test/rubygems/test_gem_config_file.rb +4 -2
  258. data/test/rubygems/test_gem_dependency.rb +0 -1
  259. data/test/rubygems/test_gem_dependency_installer.rb +8 -5
  260. data/test/rubygems/test_gem_dependency_list.rb +6 -7
  261. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -1
  262. data/test/rubygems/test_gem_doctor.rb +1 -2
  263. data/test/rubygems/test_gem_ext_builder.rb +10 -23
  264. data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -4
  265. data/test/rubygems/test_gem_ext_configure_builder.rb +3 -3
  266. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +8 -9
  267. data/test/rubygems/test_gem_ext_rake_builder.rb +20 -5
  268. data/test/rubygems/test_gem_gem_runner.rb +0 -1
  269. data/test/rubygems/test_gem_gemcutter_utilities.rb +32 -6
  270. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -1
  271. data/test/rubygems/test_gem_indexer.rb +16 -10
  272. data/test/rubygems/test_gem_install_update_options.rb +1 -20
  273. data/test/rubygems/test_gem_installer.rb +154 -119
  274. data/test/rubygems/test_gem_local_remote_options.rb +3 -3
  275. data/test/rubygems/test_gem_name_tuple.rb +0 -1
  276. data/test/rubygems/test_gem_package.rb +77 -31
  277. data/test/rubygems/test_gem_package_old.rb +0 -1
  278. data/test/rubygems/test_gem_package_tar_header.rb +42 -2
  279. data/test/rubygems/test_gem_package_tar_reader.rb +0 -1
  280. data/test/rubygems/test_gem_package_tar_reader_entry.rb +11 -0
  281. data/test/rubygems/test_gem_package_tar_writer.rb +43 -7
  282. data/test/rubygems/test_gem_package_task.rb +2 -2
  283. data/test/rubygems/test_gem_path_support.rb +28 -11
  284. data/test/rubygems/test_gem_platform.rb +4 -5
  285. data/test/rubygems/test_gem_rdoc.rb +1 -136
  286. data/test/rubygems/test_gem_remote_fetcher.rb +241 -141
  287. data/test/rubygems/test_gem_request.rb +9 -9
  288. data/test/rubygems/test_gem_request_connection_pools.rb +24 -3
  289. data/test/rubygems/test_gem_request_set.rb +5 -5
  290. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +82 -64
  291. data/test/rubygems/test_gem_request_set_lockfile.rb +1 -2
  292. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +4 -9
  293. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
  294. data/test/rubygems/test_gem_requirement.rb +24 -4
  295. data/test/rubygems/test_gem_resolver.rb +13 -17
  296. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -1
  297. data/test/rubygems/test_gem_resolver_api_set.rb +0 -1
  298. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -1
  299. data/test/rubygems/test_gem_resolver_best_set.rb +0 -1
  300. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -1
  301. data/test/rubygems/test_gem_resolver_conflict.rb +0 -1
  302. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -1
  303. data/test/rubygems/test_gem_resolver_git_set.rb +0 -1
  304. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -1
  305. data/test/rubygems/test_gem_resolver_index_set.rb +0 -1
  306. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -1
  307. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -1
  308. data/test/rubygems/test_gem_resolver_installer_set.rb +2 -3
  309. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -1
  310. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -1
  311. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -1
  312. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -1
  313. data/test/rubygems/test_gem_resolver_specification.rb +1 -2
  314. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -1
  315. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -1
  316. data/test/rubygems/test_gem_security.rb +1 -3
  317. data/test/rubygems/test_gem_security_policy.rb +5 -6
  318. data/test/rubygems/test_gem_security_signer.rb +4 -3
  319. data/test/rubygems/test_gem_security_trust_dir.rb +1 -2
  320. data/test/rubygems/test_gem_server.rb +4 -4
  321. data/test/rubygems/test_gem_source.rb +0 -13
  322. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -1
  323. data/test/rubygems/test_gem_source_git.rb +0 -1
  324. data/test/rubygems/test_gem_source_installed.rb +0 -1
  325. data/test/rubygems/test_gem_source_lock.rb +0 -1
  326. data/test/rubygems/test_gem_source_vendor.rb +0 -1
  327. data/test/rubygems/test_gem_spec_fetcher.rb +0 -1
  328. data/test/rubygems/test_gem_specification.rb +366 -198
  329. data/test/rubygems/test_gem_stream_ui.rb +15 -32
  330. data/test/rubygems/test_gem_stub_specification.rb +0 -2
  331. data/test/rubygems/test_gem_text.rb +4 -0
  332. data/test/rubygems/test_gem_uninstaller.rb +42 -3
  333. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -1
  334. data/test/rubygems/test_gem_uri_formatter.rb +0 -1
  335. data/test/rubygems/test_gem_util.rb +31 -11
  336. data/test/rubygems/test_gem_validator.rb +0 -1
  337. data/test/rubygems/test_gem_version.rb +11 -11
  338. data/test/rubygems/test_gem_version_option.rb +0 -1
  339. data/test/rubygems/test_remote_fetch_error.rb +0 -1
  340. data/test/rubygems/test_require.rb +67 -52
  341. data/util/CL2notes +1 -2
  342. data/util/ci +20 -12
  343. data/util/cops/deprecations.rb +52 -0
  344. data/util/create_certs.rb +6 -7
  345. data/util/create_certs.sh +27 -0
  346. data/util/create_encrypted_key.rb +4 -5
  347. data/util/patch_with_prs.rb +1 -1
  348. data/util/rubocop +8 -0
  349. data/util/update_bundled_ca_certificates.rb +12 -13
  350. data/util/update_changelog.rb +1 -1
  351. metadata +61 -51
  352. data/.autotest +0 -71
  353. data/.document +0 -5
  354. data/CONTRIBUTING.rdoc +0 -130
  355. data/CVE-2013-4287.txt +0 -35
  356. data/CVE-2013-4363.txt +0 -45
  357. data/CVE-2015-3900.txt +0 -40
  358. data/POLICIES.rdoc +0 -74
  359. data/test/rubygems/fix_openssl_warnings.rb +0 -13
@@ -29,6 +29,12 @@ class TestGemCommandManager < Gem::TestCase
29
29
  e.message
30
30
  end
31
31
 
32
+ def test_find_alias_command
33
+ command = @command_manager.find_command 'i'
34
+
35
+ assert_kind_of Gem::Commands::InstallCommand, command
36
+ end
37
+
32
38
  def test_find_command_ambiguous_exact
33
39
  ins_command = Class.new
34
40
  Gem::Commands.send :const_set, :InsCommand, ins_command
@@ -97,6 +103,16 @@ class TestGemCommandManager < Gem::TestCase
97
103
  assert_match(/invalid option: --bad-arg/i, @ui.error)
98
104
  end
99
105
 
106
+ def test_process_args_bad_no_ri
107
+ use_ui @ui do
108
+ assert_raises Gem::MockGemUi::TermError do
109
+ @command_manager.process_args %w[--no-ri]
110
+ end
111
+ end
112
+
113
+ assert_match(/invalid option: --no-ri. Use --no-document instead./i, @ui.error)
114
+ end
115
+
100
116
  # HACK move to install command test
101
117
  def test_process_args_install
102
118
  #capture all install options
@@ -120,7 +136,7 @@ class TestGemCommandManager < Gem::TestCase
120
136
  #check settings
121
137
  check_options = nil
122
138
  @command_manager.process_args %w[
123
- install --force --local --rdoc --install-dir .
139
+ install --force --local --document=ri,rdoc --install-dir .
124
140
  --version 3.0 --no-wrapper --bindir .
125
141
  ]
126
142
  assert_equal %w[rdoc ri], check_options[:document].sort
@@ -254,11 +270,10 @@ class TestGemCommandManager < Gem::TestCase
254
270
 
255
271
  #check settings
256
272
  check_options = nil
257
- @command_manager.process_args %w[update --force --rdoc --install-dir .]
273
+ @command_manager.process_args %w[update --force --document=ri --install-dir .]
258
274
  assert_includes check_options[:document], 'ri'
259
275
  assert_equal true, check_options[:force]
260
276
  assert_equal Dir.pwd, check_options[:install_dir]
261
277
  end
262
278
 
263
279
  end
264
-
@@ -6,16 +6,71 @@ require 'rubygems/package'
6
6
 
7
7
  class TestGemCommandsBuildCommand < Gem::TestCase
8
8
 
9
+ CERT_FILE = cert_path 'public3072'
10
+ SIGNING_KEY = key_path 'private3072'
11
+
12
+ EXPIRED_CERT_FILE = cert_path 'expired'
13
+ PRIVATE_KEY_FILE = key_path 'private'
14
+
9
15
  def setup
10
16
  super
11
17
 
18
+ readme_file = File.join(@tempdir, 'README.md')
19
+
20
+ File.open readme_file, 'w' do |f|
21
+ f.write 'My awesome gem'
22
+ end
23
+
12
24
  @gem = util_spec 'some_gem' do |s|
13
- s.rubyforge_project = 'example'
25
+ s.license = 'AGPL-3.0'
26
+ s.files = ['README.md']
14
27
  end
15
28
 
16
29
  @cmd = Gem::Commands::BuildCommand.new
17
30
  end
18
31
 
32
+ def test_handle_options
33
+ @cmd.handle_options %w[--force --strict]
34
+
35
+ assert @cmd.options[:force]
36
+ assert @cmd.options[:strict]
37
+ end
38
+
39
+ def test_options_filename
40
+ gemspec_file = File.join(@tempdir, @gem.spec_name)
41
+
42
+ File.open gemspec_file, 'w' do |gs|
43
+ gs.write @gem.to_ruby
44
+ end
45
+
46
+ @cmd.options[:args] = [gemspec_file]
47
+ @cmd.options[:output] = "test.gem"
48
+
49
+ use_ui @ui do
50
+ Dir.chdir @tempdir do
51
+ @cmd.execute
52
+ end
53
+ end
54
+
55
+ file = File.join(@tempdir, File::SEPARATOR, "test.gem")
56
+ assert File.exist?(file)
57
+
58
+ output = @ui.output.split "\n"
59
+ assert_equal " Successfully built RubyGem", output.shift
60
+ assert_equal " Name: some_gem", output.shift
61
+ assert_equal " Version: 2", output.shift
62
+ assert_equal " File: test.gem", output.shift
63
+ assert_equal [], output
64
+ end
65
+
66
+ def test_handle_options_defaults
67
+ @cmd.handle_options []
68
+
69
+ refute @cmd.options[:force]
70
+ refute @cmd.options[:strict]
71
+ assert_nil @cmd.options[:output]
72
+ end
73
+
19
74
  def test_execute
20
75
  gemspec_file = File.join(@tempdir, @gem.spec_name)
21
76
 
@@ -23,7 +78,80 @@ class TestGemCommandsBuildCommand < Gem::TestCase
23
78
  gs.write @gem.to_ruby
24
79
  end
25
80
 
26
- util_test_build_gem @gem, gemspec_file
81
+ @cmd.options[:args] = [gemspec_file]
82
+
83
+ util_test_build_gem @gem
84
+ end
85
+
86
+ def test_execute_bad_name
87
+ [".", "-", "_"].each do |special_char|
88
+ gem = util_spec 'some_gem_with_bad_name' do |s|
89
+ s.name = "#{special_char}bad_gem_name"
90
+ s.license = 'AGPL-3.0'
91
+ s.files = ['README.md']
92
+ end
93
+
94
+ gemspec_file = File.join(@tempdir, gem.spec_name)
95
+
96
+ File.open gemspec_file, 'w' do |gs|
97
+ gs.write gem.to_ruby
98
+ end
99
+
100
+ @cmd.options[:args] = [gemspec_file]
101
+
102
+ use_ui @ui do
103
+ Dir.chdir @tempdir do
104
+ assert_raises Gem::InvalidSpecificationException do
105
+ @cmd.execute
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ def test_execute_strict_without_warnings
113
+ gemspec_file = File.join(@tempdir, @gem.spec_name)
114
+
115
+ File.open gemspec_file, 'w' do |gs|
116
+ gs.write @gem.to_ruby
117
+ end
118
+
119
+ @cmd.options[:strict] = true
120
+ @cmd.options[:args] = [gemspec_file]
121
+
122
+ util_test_build_gem @gem
123
+ end
124
+
125
+ def test_execute_strict_with_warnings
126
+ bad_gem = util_spec 'some_bad_gem' do |s|
127
+ s.files = ['README.md']
128
+ end
129
+
130
+ gemspec_file = File.join(@tempdir, bad_gem.spec_name)
131
+
132
+ File.open gemspec_file, 'w' do |gs|
133
+ gs.write bad_gem.to_ruby
134
+ end
135
+
136
+ @cmd.options[:args] = [gemspec_file]
137
+ @cmd.options[:strict] = true
138
+
139
+ use_ui @ui do
140
+ Dir.chdir @tempdir do
141
+ assert_raises Gem::InvalidSpecificationException do
142
+ @cmd.execute
143
+ end
144
+ end
145
+ end
146
+
147
+ error = @ui.error.split "\n"
148
+ assert_equal "WARNING: licenses is empty, but is recommended. Use a license identifier from", error.shift
149
+ assert_equal "http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.", error.shift
150
+ assert_equal "WARNING: See http://guides.rubygems.org/specification-reference/ for help", error.shift
151
+ assert_equal [], error
152
+
153
+ gem_file = File.join @tempdir, File.basename(@gem.cache_file)
154
+ refute File.exist?(gem_file)
27
155
  end
28
156
 
29
157
  def test_execute_bad_spec
@@ -64,6 +192,44 @@ class TestGemCommandsBuildCommand < Gem::TestCase
64
192
  assert_equal "ERROR: Gemspec file not found: some_gem\n", @ui.error
65
193
  end
66
194
 
195
+ def test_execute_outside_dir
196
+ gemspec_dir = File.join @tempdir, 'build_command_gem'
197
+ gemspec_file = File.join gemspec_dir, @gem.spec_name
198
+ readme_file = File.join gemspec_dir, 'README.md'
199
+
200
+ FileUtils.mkdir_p gemspec_dir
201
+
202
+ File.open readme_file, 'w' do |f|
203
+ f.write "My awesome gem"
204
+ end
205
+
206
+ File.open gemspec_file, 'w' do |gs|
207
+ gs.write @gem.to_ruby
208
+ end
209
+
210
+ @cmd.options[:build_path] = gemspec_dir
211
+ @cmd.options[:args] = [gemspec_file]
212
+
213
+ use_ui @ui do
214
+ @cmd.execute
215
+ end
216
+
217
+ output = @ui.output.split "\n"
218
+ assert_equal " Successfully built RubyGem", output.shift
219
+ assert_equal " Name: some_gem", output.shift
220
+ assert_equal " Version: 2", output.shift
221
+ assert_equal " File: some_gem-2.gem", output.shift
222
+ assert_equal [], output
223
+
224
+ gem_file = File.join gemspec_dir, File.basename(@gem.cache_file)
225
+ assert File.exist?(gem_file)
226
+
227
+ spec = Gem::Package.new(gem_file).spec
228
+
229
+ assert_equal "some_gem", spec.name
230
+ assert_equal "this is a summary", spec.summary
231
+ end
232
+
67
233
  def test_can_find_gemspecs_without_dot_gemspec
68
234
  gemspec_file = File.join(@tempdir, @gem.spec_name)
69
235
 
@@ -71,12 +237,12 @@ class TestGemCommandsBuildCommand < Gem::TestCase
71
237
  gs.write @gem.to_ruby
72
238
  end
73
239
 
74
- util_test_build_gem @gem, gemspec_file
75
- end
76
-
77
- def util_test_build_gem(gem, gemspec_file, check_licenses=true)
78
240
  @cmd.options[:args] = [gemspec_file]
79
241
 
242
+ util_test_build_gem @gem
243
+ end
244
+
245
+ def util_test_build_gem(gem)
80
246
  use_ui @ui do
81
247
  Dir.chdir @tempdir do
82
248
  @cmd.execute
@@ -90,10 +256,6 @@ class TestGemCommandsBuildCommand < Gem::TestCase
90
256
  assert_equal " File: some_gem-2.gem", output.shift
91
257
  assert_equal [], output
92
258
 
93
- if check_licenses
94
- assert_match "WARNING: licenses is empty", @ui.error
95
- end
96
-
97
259
  gem_file = File.join @tempdir, File.basename(gem.cache_file)
98
260
  assert File.exist?(gem_file)
99
261
 
@@ -115,12 +277,9 @@ class TestGemCommandsBuildCommand < Gem::TestCase
115
277
  @cmd.options[:args] = [gemspec_file]
116
278
  @cmd.options[:force] = true
117
279
 
118
- util_test_build_gem @gem, gemspec_file, false
280
+ util_test_build_gem @gem
119
281
  end
120
282
 
121
- CERT_FILE = cert_path 'public3072'
122
- SIGNING_KEY = key_path 'private3072'
123
-
124
283
  def test_build_signed_gem
125
284
  skip 'openssl is missing' unless defined?(OpenSSL::SSL)
126
285
 
@@ -137,7 +296,9 @@ class TestGemCommandsBuildCommand < Gem::TestCase
137
296
  gs.write spec.to_ruby
138
297
  end
139
298
 
140
- util_test_build_gem spec, gemspec_file
299
+ @cmd.options[:args] = [gemspec_file]
300
+
301
+ util_test_build_gem spec
141
302
 
142
303
  trust_dir.trust_cert OpenSSL::X509::Certificate.new(File.read(CERT_FILE))
143
304
 
@@ -146,4 +307,48 @@ class TestGemCommandsBuildCommand < Gem::TestCase
146
307
  assert gem.verify
147
308
  end
148
309
 
310
+ def test_build_signed_gem_with_cert_expiration_length_days
311
+ skip 'openssl is missing' unless defined?(OpenSSL::SSL)
312
+
313
+ gem_path = File.join Gem.user_home, ".gem"
314
+ Dir.mkdir gem_path
315
+
316
+ Gem::Security.trust_dir
317
+
318
+ tmp_expired_cert_file = File.join gem_path, "gem-public_cert.pem"
319
+ File.write(tmp_expired_cert_file, File.read(EXPIRED_CERT_FILE))
320
+
321
+ tmp_private_key_file = File.join gem_path, "gem-private_key.pem"
322
+ File.write(tmp_private_key_file, File.read(PRIVATE_KEY_FILE))
323
+
324
+ spec = util_spec 'some_gem' do |s|
325
+ s.signing_key = tmp_private_key_file
326
+ s.cert_chain = [tmp_expired_cert_file]
327
+ end
328
+
329
+ gemspec_file = File.join(@tempdir, spec.spec_name)
330
+
331
+ File.open gemspec_file, 'w' do |gs|
332
+ gs.write spec.to_ruby
333
+ end
334
+
335
+ @cmd.options[:args] = [gemspec_file]
336
+
337
+ Gem.configuration.cert_expiration_length_days = 28
338
+
339
+ use_ui @ui do
340
+ Dir.chdir @tempdir do
341
+ @cmd.execute
342
+ end
343
+ end
344
+
345
+ re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file))
346
+ cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60)
347
+
348
+ gem_file = File.join @tempdir, File.basename(spec.cache_file)
349
+
350
+ assert File.exist?(gem_file)
351
+ assert_equal(28, cert_days_to_expire)
352
+ end
353
+
149
354
  end
@@ -1,23 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rubygems/test_case'
3
3
  require 'rubygems/commands/cert_command'
4
- require 'rubygems/fix_openssl_warnings' if RUBY_VERSION < "1.9"
5
4
 
6
- unless defined?(OpenSSL::SSL) then
5
+ unless defined?(OpenSSL::SSL)
7
6
  warn 'Skipping `gem cert` tests. openssl not found.'
8
7
  end
9
8
 
10
9
  class TestGemCommandsCertCommand < Gem::TestCase
11
10
 
12
11
  ALTERNATE_CERT = load_cert 'alternate'
12
+ EXPIRED_PUBLIC_CERT = load_cert 'expired'
13
13
 
14
14
  ALTERNATE_KEY_FILE = key_path 'alternate'
15
15
  PRIVATE_KEY_FILE = key_path 'private'
16
16
  PUBLIC_KEY_FILE = key_path 'public'
17
17
 
18
- ALTERNATE_CERT_FILE = cert_path 'alternate'
19
- CHILD_CERT_FILE = cert_path 'child'
20
- PUBLIC_CERT_FILE = cert_path 'public'
18
+ ALTERNATE_CERT_FILE = cert_path 'alternate'
19
+ CHILD_CERT_FILE = cert_path 'child'
20
+ PUBLIC_CERT_FILE = cert_path 'public'
21
+ EXPIRED_PUBLIC_CERT_FILE = cert_path 'expired'
21
22
 
22
23
  def setup
23
24
  super
@@ -158,7 +159,7 @@ Added '/CN=alternate/DC=example'
158
159
  @cmd.handle_options %W[
159
160
  --build nobody@example.com
160
161
  --days 26
161
- ]
162
+ ]
162
163
 
163
164
  @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
164
165
 
@@ -191,7 +192,6 @@ Added '/CN=alternate/DC=example'
191
192
 
192
193
  test = (cert.not_after - cert.not_before).to_i / (24 * 60 * 60)
193
194
  assert_equal(test, 26)
194
-
195
195
  end
196
196
 
197
197
  def test_execute_build_bad_passphrase_confirmation
@@ -583,6 +583,68 @@ ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exis
583
583
  assert_equal expected, @ui.error
584
584
  end
585
585
 
586
+ def test_execute_re_sign
587
+ gem_path = File.join Gem.user_home, ".gem"
588
+ Dir.mkdir gem_path
589
+
590
+ path = File.join @tempdir, 'cert.pem'
591
+ Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0600
592
+
593
+ assert_equal '/CN=nobody/DC=example', EXPIRED_PUBLIC_CERT.issuer.to_s
594
+
595
+ tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE))
596
+ File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE))
597
+
598
+ @cmd.handle_options %W[
599
+ --private-key #{PRIVATE_KEY_FILE}
600
+ --certificate #{tmp_expired_cert_file}
601
+ --re-sign
602
+ ]
603
+
604
+ use_ui @ui do
605
+ @cmd.execute
606
+ end
607
+
608
+ expected_path = File.join(gem_path, "#{File.basename(tmp_expired_cert_file)}.expired")
609
+
610
+ assert_match(
611
+ /INFO: Your certificate #{tmp_expired_cert_file} has been re-signed\nINFO: Your expired certificate will be located at: #{expected_path}\.[0-9]+/,
612
+ @ui.output
613
+ )
614
+ assert_equal '', @ui.error
615
+ end
616
+
617
+ def test_execute_re_sign_with_cert_expiration_length_days
618
+ gem_path = File.join Gem.user_home, ".gem"
619
+ Dir.mkdir gem_path
620
+
621
+ path = File.join @tempdir, 'cert.pem'
622
+ Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0600
623
+
624
+ assert_equal '/CN=nobody/DC=example', EXPIRED_PUBLIC_CERT.issuer.to_s
625
+
626
+ tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE))
627
+ File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE))
628
+
629
+ @cmd.handle_options %W[
630
+ --private-key #{PRIVATE_KEY_FILE}
631
+ --certificate #{tmp_expired_cert_file}
632
+ --re-sign
633
+ ]
634
+
635
+ Gem.configuration.cert_expiration_length_days = 28
636
+
637
+ use_ui @ui do
638
+ @cmd.execute
639
+ end
640
+
641
+ re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file))
642
+ cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60)
643
+
644
+ assert_equal(28, cert_days_to_expire)
645
+ assert_equal '', @ui.error
646
+ end
647
+
586
648
  def test_handle_options
587
649
  @cmd.handle_options %W[
588
650
  --add #{PUBLIC_CERT_FILE}
@@ -732,4 +794,3 @@ ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exis
732
794
  end
733
795
 
734
796
  end if defined?(OpenSSL::SSL)
735
-
@@ -10,7 +10,7 @@ class TestGemCommandsCheckCommand < Gem::TestCase
10
10
  @cmd = Gem::Commands::CheckCommand.new
11
11
  end
12
12
 
13
- def gem name
13
+ def gem(name)
14
14
  spec = quick_gem name do |gem|
15
15
  gem.files = %W[lib/#{name}.rb Rakefile]
16
16
  end
@@ -236,5 +236,31 @@ class TestGemCommandsCleanupCommand < Gem::TestCase
236
236
  refute_path_exists d_1.gem_dir
237
237
  refute_path_exists e_1.gem_dir
238
238
  end
239
- end
240
239
 
240
+ def test_execute_user_install
241
+ c_1, = util_gem 'c', '1.0'
242
+ c_2, = util_gem 'c', '1.1'
243
+
244
+ d_1, = util_gem 'd', '1.0'
245
+ d_2, = util_gem 'd', '1.1'
246
+
247
+ c_1 = install_gem c_1, :user_install => true # pick up user install path
248
+ c_2 = install_gem c_2, :user_install => true # pick up user install path
249
+
250
+ d_1 = install_gem d_1
251
+ d_2 = install_gem d_2
252
+
253
+ Gem::Specification.dirs = [Gem.dir, Gem.user_dir]
254
+
255
+ @cmd.handle_options %w[--user-install]
256
+ @cmd.options[:args] = []
257
+
258
+ @cmd.execute
259
+
260
+ refute_path_exists c_1.gem_dir
261
+ assert_path_exists c_2.gem_dir
262
+
263
+ assert_path_exists d_1.gem_dir
264
+ assert_path_exists d_2.gem_dir
265
+ end
266
+ end
@@ -10,7 +10,7 @@ class TestGemCommandsContentsCommand < Gem::TestCase
10
10
  @cmd = Gem::Commands::ContentsCommand.new
11
11
  end
12
12
 
13
- def gem name, version = 2
13
+ def gem(name, version = 2)
14
14
  spec = quick_gem name, version do |gem|
15
15
  gem.files = %W[lib/#{name}.rb Rakefile]
16
16
  end
@@ -237,4 +237,3 @@ lib/foo.rb
237
237
  end
238
238
 
239
239
  end
240
-