rubygems-update 3.2.0.rc.2 → 3.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (254) hide show
  1. checksums.yaml +4 -4
  2. data/{History.txt → CHANGELOG.md} +520 -501
  3. data/Manifest.txt +62 -55
  4. data/POLICIES.md +4 -3
  5. data/Rakefile +23 -7
  6. data/bundler/CHANGELOG.md +84 -19
  7. data/bundler/UPGRADING.md +1 -1
  8. data/bundler/bundler.gemspec +1 -1
  9. data/bundler/lib/bundler.rb +11 -0
  10. data/bundler/lib/bundler/build_metadata.rb +2 -2
  11. data/bundler/lib/bundler/cli.rb +5 -5
  12. data/bundler/lib/bundler/cli/binstubs.rb +6 -2
  13. data/bundler/lib/bundler/cli/exec.rb +3 -3
  14. data/bundler/lib/bundler/cli/install.rb +14 -5
  15. data/bundler/lib/bundler/cli/outdated.rb +0 -2
  16. data/bundler/lib/bundler/cli/update.rb +1 -1
  17. data/bundler/lib/bundler/compact_index_client/cache.rb +5 -13
  18. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  19. data/bundler/lib/bundler/compact_index_client/updater.rb +5 -5
  20. data/bundler/lib/bundler/definition.rb +23 -25
  21. data/bundler/lib/bundler/dependency.rb +3 -1
  22. data/bundler/lib/bundler/env.rb +1 -1
  23. data/bundler/lib/bundler/feature_flag.rb +0 -1
  24. data/bundler/lib/bundler/fetcher/index.rb +2 -3
  25. data/bundler/lib/bundler/friendly_errors.rb +15 -0
  26. data/bundler/lib/bundler/gem_helpers.rb +30 -24
  27. data/bundler/lib/bundler/index.rb +5 -1
  28. data/bundler/lib/bundler/injector.rb +9 -2
  29. data/bundler/lib/bundler/installer.rb +7 -5
  30. data/bundler/lib/bundler/lazy_specification.rb +20 -9
  31. data/bundler/lib/bundler/man/.document +1 -0
  32. data/bundler/{man → lib/bundler/man}/bundle-add.1 +1 -1
  33. data/bundler/{man → lib/bundler/man}/bundle-add.1.ronn +0 -0
  34. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +1 -1
  35. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1.ronn +0 -0
  36. data/bundler/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  37. data/bundler/{man → lib/bundler/man}/bundle-cache.1.ronn +0 -0
  38. data/bundler/{man → lib/bundler/man}/bundle-check.1 +1 -1
  39. data/bundler/{man → lib/bundler/man}/bundle-check.1.ronn +0 -0
  40. data/bundler/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  41. data/bundler/{man → lib/bundler/man}/bundle-clean.1.ronn +0 -0
  42. data/bundler/{man → lib/bundler/man}/bundle-config.1 +2 -5
  43. data/bundler/{man → lib/bundler/man}/bundle-config.1.ronn +1 -9
  44. data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  45. data/bundler/{man → lib/bundler/man}/bundle-doctor.1.ronn +0 -0
  46. data/bundler/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  47. data/bundler/{man → lib/bundler/man}/bundle-exec.1.ronn +0 -0
  48. data/bundler/{man → lib/bundler/man}/bundle-gem.1 +1 -1
  49. data/bundler/{man → lib/bundler/man}/bundle-gem.1.ronn +0 -0
  50. data/bundler/{man → lib/bundler/man}/bundle-info.1 +1 -1
  51. data/bundler/{man → lib/bundler/man}/bundle-info.1.ronn +0 -0
  52. data/bundler/{man → lib/bundler/man}/bundle-init.1 +1 -1
  53. data/bundler/{man → lib/bundler/man}/bundle-init.1.ronn +0 -0
  54. data/bundler/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  55. data/bundler/{man → lib/bundler/man}/bundle-inject.1.ronn +0 -0
  56. data/bundler/{man → lib/bundler/man}/bundle-install.1 +2 -2
  57. data/bundler/{man → lib/bundler/man}/bundle-install.1.ronn +1 -1
  58. data/bundler/{man → lib/bundler/man}/bundle-list.1 +1 -1
  59. data/bundler/{man → lib/bundler/man}/bundle-list.1.ronn +0 -0
  60. data/bundler/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  61. data/bundler/{man → lib/bundler/man}/bundle-lock.1.ronn +0 -0
  62. data/bundler/{man → lib/bundler/man}/bundle-open.1 +1 -1
  63. data/bundler/{man → lib/bundler/man}/bundle-open.1.ronn +0 -0
  64. data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  65. data/bundler/{man → lib/bundler/man}/bundle-outdated.1.ronn +0 -0
  66. data/bundler/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  67. data/bundler/{man → lib/bundler/man}/bundle-platform.1.ronn +0 -0
  68. data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  69. data/bundler/{man → lib/bundler/man}/bundle-pristine.1.ronn +0 -0
  70. data/bundler/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  71. data/bundler/{man → lib/bundler/man}/bundle-remove.1.ronn +0 -0
  72. data/bundler/{man → lib/bundler/man}/bundle-show.1 +1 -1
  73. data/bundler/{man → lib/bundler/man}/bundle-show.1.ronn +0 -0
  74. data/bundler/{man → lib/bundler/man}/bundle-update.1 +1 -1
  75. data/bundler/{man → lib/bundler/man}/bundle-update.1.ronn +0 -0
  76. data/bundler/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  77. data/bundler/{man → lib/bundler/man}/bundle-viz.1.ronn +0 -0
  78. data/bundler/{man → lib/bundler/man}/bundle.1 +1 -1
  79. data/bundler/{man → lib/bundler/man}/bundle.1.ronn +0 -0
  80. data/bundler/{man → lib/bundler/man}/gemfile.5 +1 -1
  81. data/bundler/{man → lib/bundler/man}/gemfile.5.ronn +0 -0
  82. data/bundler/lib/bundler/man/index.txt +25 -0
  83. data/bundler/lib/bundler/plugin/api/source.rb +1 -1
  84. data/bundler/lib/bundler/plugin/dsl.rb +1 -1
  85. data/bundler/lib/bundler/resolver.rb +25 -29
  86. data/bundler/lib/bundler/resolver/spec_group.rb +19 -25
  87. data/bundler/lib/bundler/rubygems_integration.rb +4 -6
  88. data/bundler/lib/bundler/settings.rb +0 -1
  89. data/bundler/lib/bundler/source/git/git_proxy.rb +28 -41
  90. data/bundler/lib/bundler/spec_set.rb +6 -8
  91. data/bundler/lib/bundler/stub_specification.rb +0 -2
  92. data/bundler/lib/bundler/templates/newgem/README.md.tt +0 -1
  93. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +2 -2
  94. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -0
  95. data/bundler/lib/bundler/uri_credentials_filter.rb +2 -0
  96. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  97. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  98. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  99. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  100. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  101. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +38 -40
  102. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +12 -8
  103. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  104. data/bundler/lib/bundler/vendored_tmpdir.rb +4 -0
  105. data/bundler/lib/bundler/version.rb +1 -1
  106. data/lib/rubygems.rb +6 -2
  107. data/lib/rubygems/available_set.rb +1 -1
  108. data/lib/rubygems/command_manager.rb +2 -2
  109. data/lib/rubygems/commands/build_command.rb +37 -20
  110. data/lib/rubygems/commands/cert_command.rb +1 -1
  111. data/lib/rubygems/commands/help_command.rb +2 -0
  112. data/lib/rubygems/commands/owner_command.rb +10 -3
  113. data/lib/rubygems/commands/pristine_command.rb +1 -1
  114. data/lib/rubygems/commands/push_command.rb +7 -4
  115. data/lib/rubygems/commands/query_command.rb +17 -0
  116. data/lib/rubygems/commands/server_command.rb +4 -0
  117. data/lib/rubygems/commands/setup_command.rb +26 -90
  118. data/lib/rubygems/commands/sources_command.rb +6 -2
  119. data/lib/rubygems/commands/specification_command.rb +6 -0
  120. data/lib/rubygems/commands/yank_command.rb +4 -5
  121. data/lib/rubygems/core_ext/kernel_require.rb +3 -0
  122. data/lib/rubygems/core_ext/kernel_warn.rb +6 -7
  123. data/lib/rubygems/defaults.rb +2 -2
  124. data/lib/rubygems/dependency.rb +1 -1
  125. data/lib/rubygems/dependency_installer.rb +5 -3
  126. data/lib/rubygems/ext/builder.rb +16 -35
  127. data/lib/rubygems/ext/cmake_builder.rb +5 -6
  128. data/lib/rubygems/ext/configure_builder.rb +5 -6
  129. data/lib/rubygems/ext/ext_conf_builder.rb +19 -14
  130. data/lib/rubygems/ext/rake_builder.rb +4 -4
  131. data/lib/rubygems/gemcutter_utilities.rb +101 -20
  132. data/lib/rubygems/indexer.rb +0 -1
  133. data/lib/rubygems/install_update_options.rb +2 -2
  134. data/lib/rubygems/installer.rb +12 -32
  135. data/lib/rubygems/installer_test_case.rb +7 -6
  136. data/lib/rubygems/name_tuple.rb +1 -1
  137. data/lib/rubygems/openssl.rb +4 -4
  138. data/lib/rubygems/package.rb +3 -2
  139. data/lib/rubygems/package/tar_header.rb +1 -1
  140. data/lib/rubygems/package/tar_test_case.rb +1 -1
  141. data/lib/rubygems/platform.rb +18 -7
  142. data/lib/rubygems/query_utils.rb +0 -9
  143. data/lib/rubygems/remote_fetcher.rb +5 -4
  144. data/lib/rubygems/request.rb +4 -3
  145. data/lib/rubygems/request_set.rb +2 -13
  146. data/lib/rubygems/request_set/gem_dependency_api.rb +4 -4
  147. data/lib/rubygems/requirement.rb +1 -1
  148. data/lib/rubygems/resolver.rb +7 -2
  149. data/lib/rubygems/resolver/activation_request.rb +9 -1
  150. data/lib/rubygems/resolver/api_set.rb +29 -20
  151. data/lib/rubygems/resolver/api_set/gem_parser.rb +20 -0
  152. data/lib/rubygems/resolver/api_specification.rb +8 -3
  153. data/lib/rubygems/resolver/best_set.rb +2 -2
  154. data/lib/rubygems/resolver/conflict.rb +1 -1
  155. data/lib/rubygems/resolver/dependency_request.rb +1 -1
  156. data/lib/rubygems/resolver/index_specification.rb +29 -0
  157. data/lib/rubygems/resolver/installer_set.rb +58 -9
  158. data/lib/rubygems/resolver/lock_set.rb +1 -1
  159. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
  160. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  161. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  162. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +39 -5
  163. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  164. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +2 -1
  165. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +2 -1
  166. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +2 -1
  167. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +2 -1
  168. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +7 -6
  169. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +2 -1
  170. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +4 -3
  171. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +43 -10
  172. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +75 -7
  173. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  174. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  175. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
  176. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +506 -165
  177. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
  178. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +8 -4
  179. data/lib/rubygems/resolver/spec_specification.rb +14 -0
  180. data/lib/rubygems/resolver/specification.rb +13 -1
  181. data/lib/rubygems/s3_uri_signer.rb +1 -1
  182. data/lib/rubygems/security.rb +1 -2
  183. data/lib/rubygems/security/policy.rb +1 -1
  184. data/lib/rubygems/security/signer.rb +1 -1
  185. data/lib/rubygems/server.rb +7 -2
  186. data/lib/rubygems/source.rb +20 -9
  187. data/lib/rubygems/spec_fetcher.rb +1 -1
  188. data/lib/rubygems/specification.rb +8 -8
  189. data/lib/rubygems/ssl_certs/{index.rubygems.org → rubygems.org}/GlobalSignRootCA.pem +0 -0
  190. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
  191. data/lib/rubygems/stub_specification.rb +1 -1
  192. data/lib/rubygems/test_case.rb +14 -27
  193. data/lib/rubygems/test_utilities.rb +6 -5
  194. data/lib/rubygems/uri_formatter.rb +2 -1
  195. data/lib/rubygems/version_option.rb +6 -0
  196. data/rubygems-update.gemspec +2 -2
  197. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  198. data/test/rubygems/test_bundled_ca.rb +9 -5
  199. data/test/rubygems/test_gem.rb +3 -3
  200. data/test/rubygems/test_gem_commands_build_command.rb +197 -5
  201. data/test/rubygems/test_gem_commands_cert_command.rb +2 -2
  202. data/test/rubygems/test_gem_commands_cleanup_command.rb +1 -1
  203. data/test/rubygems/test_gem_commands_contents_command.rb +2 -2
  204. data/test/rubygems/test_gem_commands_help_command.rb +15 -2
  205. data/test/rubygems/test_gem_commands_install_command.rb +132 -1
  206. data/test/rubygems/test_gem_commands_owner_command.rb +49 -1
  207. data/test/rubygems/test_gem_commands_pristine_command.rb +2 -2
  208. data/test/rubygems/test_gem_commands_push_command.rb +70 -5
  209. data/test/rubygems/test_gem_commands_query_command.rb +3 -3
  210. data/test/rubygems/test_gem_commands_setup_command.rb +20 -48
  211. data/test/rubygems/test_gem_commands_signin_command.rb +27 -3
  212. data/test/rubygems/test_gem_commands_sources_command.rb +60 -0
  213. data/test/rubygems/test_gem_commands_specification_command.rb +28 -0
  214. data/test/rubygems/test_gem_commands_update_command.rb +2 -2
  215. data/test/rubygems/test_gem_commands_yank_command.rb +31 -1
  216. data/test/rubygems/test_gem_dependency_installer.rb +63 -49
  217. data/test/rubygems/test_gem_dependency_list.rb +2 -2
  218. data/test/rubygems/test_gem_ext_builder.rb +16 -20
  219. data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -13
  220. data/test/rubygems/test_gem_ext_configure_builder.rb +5 -11
  221. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +9 -26
  222. data/test/rubygems/test_gem_ext_rake_builder.rb +30 -13
  223. data/test/rubygems/test_gem_gem_runner.rb +5 -4
  224. data/test/rubygems/test_gem_gemcutter_utilities.rb +3 -3
  225. data/test/rubygems/test_gem_install_update_options.rb +15 -3
  226. data/test/rubygems/test_gem_installer.rb +80 -71
  227. data/test/rubygems/test_gem_package.rb +8 -8
  228. data/test/rubygems/test_gem_package_old.rb +4 -4
  229. data/test/rubygems/test_gem_package_tar_writer.rb +1 -1
  230. data/test/rubygems/test_gem_platform.rb +63 -4
  231. data/test/rubygems/test_gem_remote_fetcher.rb +15 -19
  232. data/test/rubygems/test_gem_request.rb +2 -2
  233. data/test/rubygems/test_gem_request_set_lockfile.rb +4 -4
  234. data/test/rubygems/test_gem_resolver_api_set.rb +58 -55
  235. data/test/rubygems/test_gem_resolver_api_specification.rb +3 -3
  236. data/test/rubygems/test_gem_resolver_best_set.rb +26 -3
  237. data/test/rubygems/test_gem_resolver_conflict.rb +1 -1
  238. data/test/rubygems/test_gem_resolver_vendor_set.rb +1 -1
  239. data/test/rubygems/test_gem_security.rb +2 -2
  240. data/test/rubygems/test_gem_security_policy.rb +2 -2
  241. data/test/rubygems/test_gem_security_signer.rb +2 -2
  242. data/test/rubygems/test_gem_security_trust_dir.rb +2 -2
  243. data/test/rubygems/test_gem_source.rb +7 -2
  244. data/test/rubygems/test_gem_source_subpath_problem.rb +49 -0
  245. data/test/rubygems/test_gem_specification.rb +6 -7
  246. data/test/rubygems/test_gem_uninstaller.rb +7 -7
  247. data/test/rubygems/test_gem_validator.rb +1 -1
  248. data/test/rubygems/test_gem_version_option.rb +1 -1
  249. data/test/rubygems/test_require.rb +50 -9
  250. data/test/test_changelog_generator.rb +17 -0
  251. metadata +69 -86
  252. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  253. data/lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  254. data/lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
@@ -8,10 +8,12 @@ require 'rubygems/text'
8
8
  module Gem::GemcutterUtilities
9
9
 
10
10
  ERROR_CODE = 1
11
+ API_SCOPES = %i[index_rubygems push_rubygem yank_rubygem add_owner remove_owner access_webhooks show_dashboard].freeze
11
12
 
12
13
  include Gem::Text
13
14
 
14
15
  attr_writer :host
16
+ attr_writer :scope
15
17
 
16
18
  ##
17
19
  # Add the --key option
@@ -72,7 +74,7 @@ module Gem::GemcutterUtilities
72
74
  #
73
75
  # If +allowed_push_host+ metadata is present, then it will only allow that host.
74
76
 
75
- def rubygems_api_request(method, path, host = nil, allowed_push_host = nil, &block)
77
+ def rubygems_api_request(method, path, host = nil, allowed_push_host = nil, scope: nil, &block)
76
78
  require 'net/http'
77
79
 
78
80
  self.host = host if host
@@ -92,14 +94,18 @@ module Gem::GemcutterUtilities
92
94
  end
93
95
 
94
96
  uri = URI.parse "#{self.host}/#{path}"
97
+ response = request_with_otp(method, uri, &block)
95
98
 
96
- request_method = Net::HTTP.const_get method.to_s.capitalize
97
- response = Gem::RemoteFetcher.fetcher.request(uri, request_method, &block)
98
- return response unless mfa_unauthorized?(response)
99
+ if mfa_unauthorized?(response)
100
+ ask_otp
101
+ response = request_with_otp(method, uri, &block)
102
+ end
99
103
 
100
- Gem::RemoteFetcher.fetcher.request(uri, request_method) do |req|
101
- req.add_field "OTP", get_otp
102
- block.call(req)
104
+ if api_key_forbidden?(response)
105
+ update_scope(scope)
106
+ request_with_otp(method, uri, &block)
107
+ else
108
+ response
103
109
  end
104
110
  end
105
111
 
@@ -107,24 +113,37 @@ module Gem::GemcutterUtilities
107
113
  response.kind_of?(Net::HTTPUnauthorized) && response.body.start_with?('You have enabled multifactor authentication')
108
114
  end
109
115
 
110
- def get_otp
111
- say 'You have enabled multi-factor authentication. Please enter OTP code.'
112
- ask 'Code: '
116
+ def update_scope(scope)
117
+ sign_in_host = self.host
118
+ pretty_host = pretty_host(sign_in_host)
119
+ update_scope_params = { scope => true }
120
+
121
+ say "The existing key doesn't have access of #{scope} on #{pretty_host}. Please sign in to update access."
122
+
123
+ email = ask " Email: "
124
+ password = ask_for_password "Password: "
125
+
126
+ response = rubygems_api_request(:put, "api/v1/api_key",
127
+ sign_in_host, scope: scope) do |request|
128
+ request.basic_auth email, password
129
+ request["OTP"] = options[:otp] if options[:otp]
130
+ request.body = URI.encode_www_form({:api_key => api_key }.merge(update_scope_params))
131
+ end
132
+
133
+ with_response response do |resp|
134
+ say "Added #{scope} scope to the existing API key"
135
+ end
113
136
  end
114
137
 
115
138
  ##
116
139
  # Signs in with the RubyGems API at +sign_in_host+ and sets the rubygems API
117
140
  # key.
118
141
 
119
- def sign_in(sign_in_host = nil)
142
+ def sign_in(sign_in_host = nil, scope: nil)
120
143
  sign_in_host ||= self.host
121
144
  return if api_key
122
145
 
123
- pretty_host = if Gem::DEFAULT_HOST == sign_in_host
124
- 'RubyGems.org'
125
- else
126
- sign_in_host
127
- end
146
+ pretty_host = pretty_host(sign_in_host)
128
147
 
129
148
  say "Enter your #{pretty_host} credentials."
130
149
  say "Don't have an account yet? " +
@@ -134,14 +153,18 @@ module Gem::GemcutterUtilities
134
153
  password = ask_for_password "Password: "
135
154
  say "\n"
136
155
 
137
- response = rubygems_api_request(:get, "api/v1/api_key",
138
- sign_in_host) do |request|
156
+ key_name = get_key_name(scope)
157
+ scope_params = get_scope_params(scope)
158
+
159
+ response = rubygems_api_request(:post, "api/v1/api_key",
160
+ sign_in_host, scope: scope) do |request|
139
161
  request.basic_auth email, password
140
- request.add_field "OTP", options[:otp] if options[:otp]
162
+ request["OTP"] = options[:otp] if options[:otp]
163
+ request.body = URI.encode_www_form({ name: key_name }.merge(scope_params))
141
164
  end
142
165
 
143
166
  with_response response do |resp|
144
- say "Signed in."
167
+ say "Signed in with API key: #{key_name}."
145
168
  set_api_key host, resp.body
146
169
  end
147
170
  end
@@ -195,4 +218,62 @@ module Gem::GemcutterUtilities
195
218
  end
196
219
  end
197
220
 
221
+ private
222
+
223
+ def request_with_otp(method, uri, &block)
224
+ request_method = Net::HTTP.const_get method.to_s.capitalize
225
+
226
+ Gem::RemoteFetcher.fetcher.request(uri, request_method) do |req|
227
+ req["OTP"] = options[:otp] if options[:otp]
228
+ block.call(req)
229
+ end
230
+ end
231
+
232
+ def ask_otp
233
+ say 'You have enabled multi-factor authentication. Please enter OTP code.'
234
+ options[:otp] = ask 'Code: '
235
+ end
236
+
237
+ def pretty_host(host)
238
+ if Gem::DEFAULT_HOST == host
239
+ 'RubyGems.org'
240
+ else
241
+ host
242
+ end
243
+ end
244
+
245
+ def get_scope_params(scope)
246
+ scope_params = {}
247
+
248
+ if scope
249
+ scope_params = { scope => true }
250
+ else
251
+ say "Please select scopes you want to enable for the API key (y/n)"
252
+ API_SCOPES.each do |scope|
253
+ selected = ask "#{scope} [y/N]: "
254
+ scope_params[scope] = true if selected =~ /^[yY](es)?$/
255
+ end
256
+ say "\n"
257
+ end
258
+
259
+ scope_params
260
+ end
261
+
262
+ def get_key_name(scope)
263
+ hostname = Socket.gethostname || "unknown-host"
264
+ user = ENV["USER"] || ENV["USERNAME"] || "unknown-user"
265
+ ts = Time.now.strftime("%Y%m%d%H%M%S")
266
+ default_key_name = "#{hostname}-#{user}-#{ts}"
267
+
268
+ key_name = ask "API Key name [#{default_key_name}]: " unless scope
269
+ if key_name.nil? || key_name.empty?
270
+ default_key_name
271
+ else
272
+ key_name
273
+ end
274
+ end
275
+
276
+ def api_key_forbidden?(response)
277
+ response.kind_of?(Net::HTTPForbidden) && response.body.start_with?("The API key doesn't have access")
278
+ end
198
279
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rubygems'
3
3
  require 'rubygems/package'
4
- require 'time'
5
4
  require 'tmpdir'
6
5
 
7
6
  ##
@@ -122,10 +122,10 @@ module Gem::InstallUpdateOptions
122
122
  options[:minimal_deps] = true
123
123
  end
124
124
 
125
- add_option(:"Install/Update", "--minimal-deps",
125
+ add_option(:"Install/Update", "--[no-]minimal-deps",
126
126
  "Don't upgrade any dependencies that already",
127
127
  "meet version requirements") do |value, options|
128
- options[:minimal_deps] = true
128
+ options[:minimal_deps] = value
129
129
  end
130
130
 
131
131
  add_option(:"Install/Update", "--[no-]post-install-message",
@@ -12,7 +12,6 @@ require 'rubygems/deprecate'
12
12
  require 'rubygems/package'
13
13
  require 'rubygems/ext'
14
14
  require 'rubygems/user_interaction'
15
- require 'fileutils'
16
15
 
17
16
  ##
18
17
  # The installer installs the files contained in the .gem into the Gem.home.
@@ -433,7 +432,7 @@ class Gem::Installer
433
432
  #
434
433
 
435
434
  def default_spec_file
436
- File.join Gem.default_specifications_dir, "#{spec.full_name}.gemspec"
435
+ File.join gem_home, "specifications", "default", "#{spec.full_name}.gemspec"
437
436
  end
438
437
 
439
438
  ##
@@ -492,7 +491,11 @@ class Gem::Installer
492
491
 
493
492
  mode = File.stat(bin_path).mode
494
493
  dir_mode = options[:prog_mode] || (mode | 0111)
495
- FileUtils.chmod dir_mode, bin_path unless dir_mode == mode
494
+
495
+ unless dir_mode == mode
496
+ require 'fileutils'
497
+ FileUtils.chmod dir_mode, bin_path
498
+ end
496
499
 
497
500
  check_executable_overwrite filename
498
501
 
@@ -527,6 +530,7 @@ class Gem::Installer
527
530
  def generate_bin_script(filename, bindir)
528
531
  bin_script_path = File.join bindir, formatted_program_filename(filename)
529
532
 
533
+ require 'fileutils'
530
534
  FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers
531
535
 
532
536
  File.open bin_script_path, 'wb', 0755 do |file|
@@ -634,27 +638,6 @@ class Gem::Installer
634
638
  end
635
639
  end
636
640
 
637
- def ensure_required_ruby_version_met # :nodoc:
638
- if rrv = spec.required_ruby_version
639
- ruby_version = Gem.ruby_version
640
- unless rrv.satisfied_by? ruby_version
641
- raise Gem::RuntimeRequirementNotMetError,
642
- "#{spec.name} requires Ruby version #{rrv}. The current ruby version is #{ruby_version}."
643
- end
644
- end
645
- end
646
-
647
- def ensure_required_rubygems_version_met # :nodoc:
648
- if rrgv = spec.required_rubygems_version
649
- unless rrgv.satisfied_by? Gem.rubygems_version
650
- rg_version = Gem::VERSION
651
- raise Gem::RuntimeRequirementNotMetError,
652
- "#{spec.name} requires RubyGems version #{rrgv}. The current RubyGems version is #{rg_version}. " +
653
- "Try 'gem update --system' to update RubyGems itself."
654
- end
655
- end
656
- end
657
-
658
641
  def ensure_dependencies_met # :nodoc:
659
642
  deps = spec.runtime_dependencies
660
643
  deps |= spec.development_dependencies if @development
@@ -670,7 +653,7 @@ class Gem::Installer
670
653
  :env_shebang => false,
671
654
  :force => false,
672
655
  :only_install_dir => false,
673
- :post_install_message => true
656
+ :post_install_message => true,
674
657
  }.merge options
675
658
 
676
659
  @env_shebang = options[:env_shebang]
@@ -693,11 +676,10 @@ class Gem::Installer
693
676
  @build_args = options[:build_args] || Gem::Command.build_args
694
677
 
695
678
  unless @build_root.nil?
696
- require 'pathname'
697
- @build_root = Pathname.new(@build_root).expand_path
698
- @bin_dir = File.join(@build_root, options[:bin_dir] || Gem.bindir(@gem_home))
699
- @gem_home = File.join(@build_root, @gem_home)
700
- alert_warning "You build with buildroot.\n Build root: #{@build_root}\n Bin dir: #{@bin_dir}\n Gem home: #{@gem_home}"
679
+ @bin_dir = File.join(@build_root, @bin_dir.gsub(/^[a-zA-Z]:/, ''))
680
+ @gem_home = File.join(@build_root, @gem_home.gsub(/^[a-zA-Z]:/, ''))
681
+ @plugins_dir = File.join(@build_root, @plugins_dir.gsub(/^[a-zA-Z]:/, ''))
682
+ alert_warning "You build with buildroot.\n Build root: #{@build_root}\n Bin dir: #{@bin_dir}\n Gem home: #{@gem_home}\n Plugins dir: #{@plugins_dir}"
701
683
  end
702
684
  end
703
685
 
@@ -911,8 +893,6 @@ TEXT
911
893
 
912
894
  return true if @force
913
895
 
914
- ensure_required_ruby_version_met
915
- ensure_required_rubygems_version_met
916
896
  ensure_dependencies_met unless @ignore_dependencies
917
897
 
918
898
  true
@@ -108,9 +108,9 @@ class Gem::InstallerTestCase < Gem::TestCase
108
108
  #
109
109
  # And returns a Gem::Installer for the @spec that installs into @gemhome
110
110
 
111
- def setup_base_installer
111
+ def setup_base_installer(force = true)
112
112
  @gem = setup_base_gem
113
- util_installer @spec, @gemhome
113
+ util_installer @spec, @gemhome, false, force
114
114
  end
115
115
 
116
116
  ##
@@ -182,7 +182,7 @@ class Gem::InstallerTestCase < Gem::TestCase
182
182
  # lib/code.rb
183
183
  # ext/a/mkrf_conf.rb
184
184
 
185
- def util_setup_gem(ui = @ui)
185
+ def util_setup_gem(ui = @ui, force = true)
186
186
  @spec.files << File.join('lib', 'code.rb')
187
187
  @spec.extensions << File.join('ext', 'a', 'mkrf_conf.rb')
188
188
 
@@ -214,17 +214,18 @@ class Gem::InstallerTestCase < Gem::TestCase
214
214
  end
215
215
  end
216
216
 
217
- Gem::Installer.at @gem
217
+ Gem::Installer.at @gem, :force => force
218
218
  end
219
219
 
220
220
  ##
221
221
  # Creates an installer for +spec+ that will install into +gem_home+. If
222
222
  # +user+ is true a user-install will be performed.
223
223
 
224
- def util_installer(spec, gem_home, user=false)
224
+ def util_installer(spec, gem_home, user=false, force=true)
225
225
  Gem::Installer.at(spec.cache_file,
226
226
  :install_dir => gem_home,
227
- :user_install => user)
227
+ :user_install => user,
228
+ :force => force)
228
229
  end
229
230
 
230
231
  @@symlink_supported = nil
@@ -59,7 +59,7 @@ class Gem::NameTuple
59
59
  # Indicate if this NameTuple matches the current platform.
60
60
 
61
61
  def match_platform?
62
- Gem::Platform.match @platform
62
+ Gem::Platform.match_gem? @platform, @name
63
63
  end
64
64
 
65
65
  ##
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- begin
4
- require "openssl"
5
- rescue LoadError => e
6
- raise unless e.path == 'openssl'
3
+ autoload :OpenSSL, "openssl"
4
+
5
+ module Gem
6
+ HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:
7
7
  end
@@ -44,7 +44,6 @@
44
44
  require "rubygems"
45
45
  require 'rubygems/security'
46
46
  require 'rubygems/user_interaction'
47
- require 'zlib'
48
47
 
49
48
  class Gem::Package
50
49
  include Gem::UserInteraction
@@ -186,6 +185,8 @@ class Gem::Package
186
185
  # Creates a new package that will read or write to the file +gem+.
187
186
 
188
187
  def initialize(gem, security_policy) # :notnew:
188
+ require 'zlib'
189
+
189
190
  @gem = gem
190
191
 
191
192
  @build_time = Gem.source_date_epoch
@@ -297,7 +298,7 @@ class Gem::Package
297
298
 
298
299
  setup_signer(
299
300
  signer_options: {
300
- expiration_length_days: Gem.configuration.cert_expiration_length_days
301
+ expiration_length_days: Gem.configuration.cert_expiration_length_days,
301
302
  }
302
303
  )
303
304
 
@@ -229,7 +229,7 @@ class Gem::Package::TarHeader
229
229
  gname,
230
230
  oct(devmajor, 7),
231
231
  oct(devminor, 7),
232
- prefix
232
+ prefix,
233
233
  ]
234
234
 
235
235
  header = header.pack PACK_FORMAT
@@ -90,7 +90,7 @@ class Gem::Package::TarTestCase < Gem::TestCase
90
90
  ASCIIZ("wheel", 32), # char gname[32]; ASCIIZ
91
91
  Z(to_oct(0, 7)), # char devmajor[8]; 0 padded, octal, null
92
92
  Z(to_oct(0, 7)), # char devminor[8]; 0 padded, octal, null
93
- ASCIIZ(dname, 155) # char prefix[155]; ASCII + (Z unless filled)
93
+ ASCIIZ(dname, 155), # char prefix[155]; ASCII + (Z unless filled)
94
94
  ]
95
95
 
96
96
  h = arr.join
@@ -9,11 +9,7 @@ require "rubygems/deprecate"
9
9
  class Gem::Platform
10
10
  @local = nil
11
11
 
12
- attr_accessor :cpu
13
-
14
- attr_accessor :os
15
-
16
- attr_accessor :version
12
+ attr_accessor :cpu, :os, :version
17
13
 
18
14
  def self.local
19
15
  arch = RbConfig::CONFIG['arch']
@@ -22,18 +18,33 @@ class Gem::Platform
22
18
  end
23
19
 
24
20
  def self.match(platform)
25
- Gem.platforms.any? do |local_platform|
21
+ match_platforms?(platform, Gem.platforms)
22
+ end
23
+
24
+ def self.match_platforms?(platform, platforms)
25
+ platforms.any? do |local_platform|
26
26
  platform.nil? or
27
27
  local_platform == platform or
28
28
  (local_platform != Gem::Platform::RUBY and local_platform =~ platform)
29
29
  end
30
30
  end
31
+ private_class_method :match_platforms?
32
+
33
+ def self.match_spec?(spec)
34
+ match_gem?(spec.platform, spec.name)
35
+ end
36
+
37
+ def self.match_gem?(platform, gem_name)
38
+ # Note: this method might be redefined by Ruby implementations to
39
+ # customize behavior per RUBY_ENGINE, gem_name or other criteria.
40
+ match_platforms?(platform, Gem.platforms)
41
+ end
31
42
 
32
43
  def self.installable?(spec)
33
44
  if spec.respond_to? :installable_platform?
34
45
  spec.installable_platform?
35
46
  else
36
- match spec.platform
47
+ match_spec? spec
37
48
  end
38
49
  end
39
50