rubygems-update 3.4.19 → 3.4.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/Manifest.txt +1 -0
  4. data/bundler/CHANGELOG.md +62 -2
  5. data/bundler/lib/bundler/build_metadata.rb +3 -3
  6. data/bundler/lib/bundler/cli/check.rb +1 -1
  7. data/bundler/lib/bundler/cli/gem.rb +1 -3
  8. data/bundler/lib/bundler/cli/info.rb +1 -1
  9. data/bundler/lib/bundler/cli/install.rb +2 -2
  10. data/bundler/lib/bundler/cli/lock.rb +26 -23
  11. data/bundler/lib/bundler/cli/open.rb +5 -7
  12. data/bundler/lib/bundler/cli/update.rb +1 -0
  13. data/bundler/lib/bundler/definition.rb +42 -25
  14. data/bundler/lib/bundler/env.rb +2 -2
  15. data/bundler/lib/bundler/fetcher/base.rb +2 -2
  16. data/bundler/lib/bundler/fetcher/compact_index.rb +1 -5
  17. data/bundler/lib/bundler/fetcher/dependency.rb +1 -1
  18. data/bundler/lib/bundler/fetcher.rb +31 -30
  19. data/bundler/lib/bundler/gem_version_promoter.rb +2 -2
  20. data/bundler/lib/bundler/index.rb +62 -31
  21. data/bundler/lib/bundler/injector.rb +1 -1
  22. data/bundler/lib/bundler/installer/parallel_installer.rb +0 -26
  23. data/bundler/lib/bundler/installer/standalone.rb +15 -1
  24. data/bundler/lib/bundler/lockfile_parser.rb +32 -39
  25. data/bundler/lib/bundler/man/bundle-add.1 +1 -1
  26. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  27. data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
  28. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  29. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  30. data/bundler/lib/bundler/man/bundle-config.1 +1 -1
  31. data/bundler/lib/bundler/man/bundle-console.1 +1 -1
  32. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  33. data/bundler/lib/bundler/man/bundle-exec.1 +2 -2
  34. data/bundler/lib/bundler/man/bundle-exec.1.ronn +2 -3
  35. data/bundler/lib/bundler/man/bundle-gem.1 +1 -1
  36. data/bundler/lib/bundler/man/bundle-help.1 +1 -1
  37. data/bundler/lib/bundler/man/bundle-info.1 +1 -1
  38. data/bundler/lib/bundler/man/bundle-init.1 +1 -1
  39. data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
  40. data/bundler/lib/bundler/man/bundle-install.1 +1 -1
  41. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  42. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  43. data/bundler/lib/bundler/man/bundle-open.1 +1 -1
  44. data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
  45. data/bundler/lib/bundler/man/bundle-platform.1 +1 -1
  46. data/bundler/lib/bundler/man/bundle-plugin.1 +17 -17
  47. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +5 -5
  48. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  49. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  50. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  51. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  52. data/bundler/lib/bundler/man/bundle-version.1 +1 -1
  53. data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
  54. data/bundler/lib/bundler/man/bundle.1 +1 -1
  55. data/bundler/lib/bundler/man/gemfile.5 +12 -1
  56. data/bundler/lib/bundler/man/gemfile.5.ronn +5 -0
  57. data/bundler/lib/bundler/plugin.rb +1 -1
  58. data/bundler/lib/bundler/resolver/package.rb +5 -0
  59. data/bundler/lib/bundler/resolver.rb +45 -10
  60. data/bundler/lib/bundler/retry.rb +1 -1
  61. data/bundler/lib/bundler/ruby_dsl.rb +23 -2
  62. data/bundler/lib/bundler/ruby_version.rb +8 -1
  63. data/bundler/lib/bundler/self_manager.rb +2 -0
  64. data/bundler/lib/bundler/settings.rb +86 -25
  65. data/bundler/lib/bundler/shared_helpers.rb +16 -1
  66. data/bundler/lib/bundler/source/git/git_proxy.rb +27 -6
  67. data/bundler/lib/bundler/source/rubygems.rb +22 -25
  68. data/bundler/lib/bundler/spec_set.rb +2 -2
  69. data/bundler/lib/bundler/stub_specification.rb +4 -2
  70. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +6 -2
  71. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +1 -1
  72. data/bundler/lib/bundler/version.rb +1 -1
  73. data/bundler/lib/bundler/yaml_serializer.rb +6 -7
  74. data/lib/rubygems/available_set.rb +1 -1
  75. data/lib/rubygems/basic_specification.rb +3 -3
  76. data/lib/rubygems/command.rb +17 -20
  77. data/lib/rubygems/command_manager.rb +1 -1
  78. data/lib/rubygems/commands/cert_command.rb +3 -3
  79. data/lib/rubygems/commands/check_command.rb +5 -1
  80. data/lib/rubygems/commands/cleanup_command.rb +1 -1
  81. data/lib/rubygems/commands/contents_command.rb +1 -1
  82. data/lib/rubygems/commands/dependency_command.rb +3 -4
  83. data/lib/rubygems/commands/help_command.rb +2 -2
  84. data/lib/rubygems/commands/open_command.rb +1 -3
  85. data/lib/rubygems/commands/owner_command.rb +9 -11
  86. data/lib/rubygems/commands/setup_command.rb +8 -8
  87. data/lib/rubygems/commands/specification_command.rb +5 -1
  88. data/lib/rubygems/commands/stale_command.rb +1 -1
  89. data/lib/rubygems/commands/uninstall_command.rb +6 -7
  90. data/lib/rubygems/commands/unpack_command.rb +4 -6
  91. data/lib/rubygems/commands/update_command.rb +3 -3
  92. data/lib/rubygems/commands/yank_command.rb +1 -1
  93. data/lib/rubygems/config_file.rb +60 -13
  94. data/lib/rubygems/core_ext/kernel_gem.rb +2 -2
  95. data/lib/rubygems/core_ext/kernel_require.rb +1 -1
  96. data/lib/rubygems/core_ext/kernel_warn.rb +4 -5
  97. data/lib/rubygems/defaults.rb +6 -2
  98. data/lib/rubygems/dependency_installer.rb +8 -12
  99. data/lib/rubygems/deprecate.rb +4 -3
  100. data/lib/rubygems/doctor.rb +1 -1
  101. data/lib/rubygems/errors.rb +1 -1
  102. data/lib/rubygems/exceptions.rb +1 -1
  103. data/lib/rubygems/ext/builder.rb +5 -4
  104. data/lib/rubygems/ext/cargo_builder.rb +2 -2
  105. data/lib/rubygems/gem_runner.rb +5 -1
  106. data/lib/rubygems/gemcutter_utilities.rb +4 -4
  107. data/lib/rubygems/indexer.rb +1 -1
  108. data/lib/rubygems/install_update_options.rb +1 -1
  109. data/lib/rubygems/installer.rb +17 -19
  110. data/lib/rubygems/name_tuple.rb +1 -1
  111. data/lib/rubygems/package/old.rb +1 -1
  112. data/lib/rubygems/package/tar_reader/entry.rb +18 -20
  113. data/lib/rubygems/package/tar_reader.rb +0 -5
  114. data/lib/rubygems/package/tar_writer.rb +1 -1
  115. data/lib/rubygems/package.rb +18 -12
  116. data/lib/rubygems/platform.rb +6 -2
  117. data/lib/rubygems/query_utils.rb +5 -5
  118. data/lib/rubygems/remote_fetcher.rb +10 -2
  119. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
  120. data/lib/rubygems/request_set.rb +2 -1
  121. data/lib/rubygems/requirement.rb +1 -1
  122. data/lib/rubygems/resolver/activation_request.rb +2 -4
  123. data/lib/rubygems/resolver/api_set.rb +2 -1
  124. data/lib/rubygems/resolver/api_specification.rb +1 -1
  125. data/lib/rubygems/resolver/installed_specification.rb +1 -1
  126. data/lib/rubygems/resolver/local_specification.rb +1 -1
  127. data/lib/rubygems/s3_uri_signer.rb +1 -1
  128. data/lib/rubygems/security/signer.rb +10 -2
  129. data/lib/rubygems/security/trust_dir.rb +8 -10
  130. data/lib/rubygems/security.rb +2 -2
  131. data/lib/rubygems/security_option.rb +1 -1
  132. data/lib/rubygems/source/local.rb +34 -37
  133. data/lib/rubygems/source.rb +7 -3
  134. data/lib/rubygems/source_list.rb +2 -2
  135. data/lib/rubygems/spec_fetcher.rb +29 -33
  136. data/lib/rubygems/specification.rb +43 -36
  137. data/lib/rubygems/specification_policy.rb +36 -35
  138. data/lib/rubygems/stub_specification.rb +13 -10
  139. data/lib/rubygems/uninstaller.rb +2 -2
  140. data/lib/rubygems/update_suggestion.rb +1 -1
  141. data/lib/rubygems/user_interaction.rb +2 -2
  142. data/lib/rubygems/util/licenses.rb +115 -0
  143. data/lib/rubygems/util.rb +5 -1
  144. data/lib/rubygems/validator.rb +5 -7
  145. data/lib/rubygems/version.rb +3 -2
  146. data/lib/rubygems/yaml_serializer.rb +88 -0
  147. data/lib/rubygems.rb +8 -10
  148. data/rubygems-update.gemspec +1 -1
  149. data/setup.rb +2 -0
  150. data/test/rubygems/bundler_test_gem.rb +6 -3
  151. data/test/rubygems/helper.rb +38 -32
  152. data/test/rubygems/package/tar_test_case.rb +2 -2
  153. data/test/rubygems/test_gem.rb +55 -30
  154. data/test/rubygems/test_gem_command.rb +3 -1
  155. data/test/rubygems/test_gem_commands_build_command.rb +2 -1
  156. data/test/rubygems/test_gem_commands_cert_command.rb +22 -22
  157. data/test/rubygems/test_gem_commands_cleanup_command.rb +2 -2
  158. data/test/rubygems/test_gem_commands_environment_command.rb +2 -1
  159. data/test/rubygems/test_gem_commands_exec_command.rb +5 -1
  160. data/test/rubygems/test_gem_commands_install_command.rb +3 -3
  161. data/test/rubygems/test_gem_commands_open_command.rb +5 -2
  162. data/test/rubygems/test_gem_commands_pristine_command.rb +2 -2
  163. data/test/rubygems/test_gem_commands_push_command.rb +7 -6
  164. data/test/rubygems/test_gem_commands_signin_command.rb +8 -8
  165. data/test/rubygems/test_gem_commands_stale_command.rb +1 -1
  166. data/test/rubygems/test_gem_commands_uninstall_command.rb +1 -1
  167. data/test/rubygems/test_gem_commands_unpack_command.rb +2 -2
  168. data/test/rubygems/test_gem_config_file.rb +46 -12
  169. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +28 -12
  170. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +1 -1
  171. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +16 -14
  172. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
  173. data/test/rubygems/test_gem_ext_cargo_builder.rb +2 -2
  174. data/test/rubygems/test_gem_gemcutter_utilities.rb +8 -5
  175. data/test/rubygems/test_gem_indexer.rb +1 -1
  176. data/test/rubygems/test_gem_install_update_options.rb +3 -3
  177. data/test/rubygems/test_gem_installer.rb +15 -15
  178. data/test/rubygems/test_gem_package.rb +152 -36
  179. data/test/rubygems/test_gem_package_old.rb +1 -1
  180. data/test/rubygems/test_gem_package_tar_header.rb +10 -10
  181. data/test/rubygems/test_gem_package_tar_reader.rb +4 -4
  182. data/test/rubygems/test_gem_package_tar_reader_entry.rb +53 -1
  183. data/test/rubygems/test_gem_package_tar_writer.rb +41 -41
  184. data/test/rubygems/test_gem_rdoc.rb +2 -2
  185. data/test/rubygems/test_gem_remote_fetcher.rb +34 -34
  186. data/test/rubygems/test_gem_request.rb +5 -5
  187. data/test/rubygems/test_gem_request_connection_pools.rb +2 -1
  188. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +14 -7
  189. data/test/rubygems/test_gem_requirement.rb +1 -1
  190. data/test/rubygems/test_gem_security.rb +2 -2
  191. data/test/rubygems/test_gem_security_signer.rb +2 -2
  192. data/test/rubygems/test_gem_security_trust_dir.rb +6 -6
  193. data/test/rubygems/test_gem_spec_fetcher.rb +2 -2
  194. data/test/rubygems/test_gem_specification.rb +71 -35
  195. data/test/rubygems/test_gem_update_suggestion.rb +23 -23
  196. data/test/rubygems/test_gem_util.rb +2 -2
  197. data/test/rubygems/test_gem_version.rb +4 -2
  198. data/test/rubygems/test_require.rb +4 -6
  199. data/test/rubygems/utilities.rb +4 -3
  200. metadata +4 -3
@@ -427,11 +427,11 @@ class Gem::Specification < Gem::BasicSpecification
427
427
  end
428
428
 
429
429
  ##
430
- # The path in the gem for executable scripts. Usually 'bin'
430
+ # The path in the gem for executable scripts. Usually 'exe'
431
431
  #
432
432
  # Usage:
433
433
  #
434
- # spec.bindir = 'bin'
434
+ # spec.bindir = 'exe'
435
435
 
436
436
  attr_accessor :bindir
437
437
 
@@ -1301,10 +1301,20 @@ class Gem::Specification < Gem::BasicSpecification
1301
1301
  Gem.load_yaml
1302
1302
 
1303
1303
  yaml_set = false
1304
+ retry_count = 0
1304
1305
 
1305
1306
  array = begin
1306
1307
  Marshal.load str
1307
1308
  rescue ArgumentError => e
1309
+ # Avoid an infinite retry loop when the argument error has nothing to do
1310
+ # with the classes not being defined.
1311
+ # 1 retry each allowed in case all 3 of
1312
+ # - YAML
1313
+ # - YAML::Syck::DefaultKey
1314
+ # - YAML::PrivateType
1315
+ # need to be defined
1316
+ raise if retry_count >= 3
1317
+
1308
1318
  #
1309
1319
  # Some very old marshaled specs included references to `YAML::PrivateType`
1310
1320
  # and `YAML::Syck::DefaultKey` constants due to bugs in the old emitter
@@ -1322,11 +1332,12 @@ class Gem::Specification < Gem::BasicSpecification
1322
1332
  if message.include?("YAML::Syck::")
1323
1333
  YAML.const_set "Syck", YAML unless YAML.const_defined?(:Syck)
1324
1334
 
1325
- YAML::Syck.const_set "DefaultKey", Class.new if message.include?("YAML::Syck::DefaultKey")
1326
- elsif message.include?("YAML::PrivateType")
1335
+ YAML::Syck.const_set "DefaultKey", Class.new if message.include?("YAML::Syck::DefaultKey") && !YAML::Syck.const_defined?(:DefaultKey)
1336
+ elsif message.include?("YAML::PrivateType") && !YAML.const_defined?(:PrivateType)
1327
1337
  YAML.const_set "PrivateType", Class.new
1328
1338
  end
1329
1339
 
1340
+ retry_count += 1
1330
1341
  retry
1331
1342
  ensure
1332
1343
  Object.__send__(:remove_const, "YAML") if yaml_set
@@ -1527,7 +1538,7 @@ class Gem::Specification < Gem::BasicSpecification
1527
1538
  else
1528
1539
  executables
1529
1540
  end
1530
- rescue
1541
+ rescue StandardError
1531
1542
  return nil
1532
1543
  end
1533
1544
 
@@ -1623,8 +1634,8 @@ class Gem::Specification < Gem::BasicSpecification
1623
1634
  # we need to fresh build when same name and version of default gems
1624
1635
  return if self.class.find_by_full_name(full_name)&.default_gem?
1625
1636
  return if File.exist? gem_build_complete_path
1626
- return if !File.writable?(base_dir)
1627
- return if !File.exist?(File.join(base_dir, "extensions"))
1637
+ return unless File.writable?(base_dir)
1638
+ return unless File.exist?(File.join(base_dir, "extensions"))
1628
1639
 
1629
1640
  begin
1630
1641
  # We need to require things in $LOAD_PATH without looking for the
@@ -1811,13 +1822,12 @@ class Gem::Specification < Gem::BasicSpecification
1811
1822
  Gem::Specification.each do |spec|
1812
1823
  deps = check_dev ? spec.dependencies : spec.runtime_dependencies
1813
1824
  deps.each do |dep|
1814
- if self.satisfies_requirement?(dep)
1815
- sats = []
1816
- find_all_satisfiers(dep) do |sat|
1817
- sats << sat
1818
- end
1819
- out << [spec, dep, sats]
1825
+ next unless self.satisfies_requirement?(dep)
1826
+ sats = []
1827
+ find_all_satisfiers(dep) do |sat|
1828
+ sats << sat
1820
1829
  end
1830
+ out << [spec, dep, sats]
1821
1831
  end
1822
1832
  end
1823
1833
  out
@@ -2256,21 +2266,20 @@ class Gem::Specification < Gem::BasicSpecification
2256
2266
  attributes.each do |attr_name|
2257
2267
  current_value = self.send attr_name
2258
2268
  current_value = current_value.sort if %i[files test_files].include? attr_name
2259
- if current_value != default_value(attr_name) ||
2260
- self.class.required_attribute?(attr_name)
2269
+ next unless current_value != default_value(attr_name) ||
2270
+ self.class.required_attribute?(attr_name)
2261
2271
 
2262
- q.text "s.#{attr_name} = "
2272
+ q.text "s.#{attr_name} = "
2263
2273
 
2264
- if attr_name == :date
2265
- current_value = current_value.utc
2266
-
2267
- q.text "Time.utc(#{current_value.year}, #{current_value.month}, #{current_value.day})"
2268
- else
2269
- q.pp current_value
2270
- end
2274
+ if attr_name == :date
2275
+ current_value = current_value.utc
2271
2276
 
2272
- q.breakable
2277
+ q.text "Time.utc(#{current_value.year}, #{current_value.month}, #{current_value.day})"
2278
+ else
2279
+ q.pp current_value
2273
2280
  end
2281
+
2282
+ q.breakable
2274
2283
  end
2275
2284
  end
2276
2285
  end
@@ -2353,13 +2362,13 @@ class Gem::Specification < Gem::BasicSpecification
2353
2362
  when Array then "[" + obj.map {|x| ruby_code x }.join(", ") + "]"
2354
2363
  when Hash then
2355
2364
  seg = obj.keys.sort.map {|k| "#{k.to_s.dump} => #{obj[k].to_s.dump}" }
2356
- "{ #{seg.join(', ')} }"
2357
- when Gem::Version then obj.to_s.dump
2365
+ "{ #{seg.join(", ")} }"
2366
+ when Gem::Version then ruby_code(obj.to_s)
2358
2367
  when DateLike then obj.strftime("%Y-%m-%d").dump
2359
2368
  when Time then obj.strftime("%Y-%m-%d").dump
2360
2369
  when Numeric then obj.inspect
2361
2370
  when true, false, nil then obj.inspect
2362
- when Gem::Platform then "Gem::Platform.new(#{obj.to_a.inspect})"
2371
+ when Gem::Platform then "Gem::Platform.new(#{ruby_code obj.to_a})"
2363
2372
  when Gem::Requirement then
2364
2373
  list = obj.as_list
2365
2374
  "Gem::Requirement.new(#{ruby_code(list.size == 1 ? obj.to_s : list)})"
@@ -2524,12 +2533,12 @@ class Gem::Specification < Gem::BasicSpecification
2524
2533
  end
2525
2534
 
2526
2535
  if String === signing_key
2527
- result << " s.signing_key = #{signing_key.dump}.freeze"
2536
+ result << " s.signing_key = #{ruby_code signing_key}"
2528
2537
  end
2529
2538
 
2530
2539
  if @installed_by_version
2531
2540
  result << nil
2532
- result << " s.installed_by_version = \"#{Gem::VERSION}\" if s.respond_to? :installed_by_version"
2541
+ result << " s.installed_by_version = #{ruby_code Gem::VERSION} if s.respond_to? :installed_by_version"
2533
2542
  end
2534
2543
 
2535
2544
  unless dependencies.empty?
@@ -2538,9 +2547,8 @@ class Gem::Specification < Gem::BasicSpecification
2538
2547
  result << nil
2539
2548
 
2540
2549
  dependencies.each do |dep|
2541
- req = dep.requirements_list.inspect
2542
2550
  dep.instance_variable_set :@type, :runtime if dep.type.nil? # HACK
2543
- result << " s.add_#{dep.type}_dependency(%q<#{dep.name}>.freeze, #{req})"
2551
+ result << " s.add_#{dep.type}_dependency(%q<#{dep.name}>.freeze, #{ruby_code dep.requirements_list})"
2544
2552
  end
2545
2553
  end
2546
2554
 
@@ -2612,11 +2620,10 @@ class Gem::Specification < Gem::BasicSpecification
2612
2620
  ensure
2613
2621
  trail.pop
2614
2622
  end
2615
- unless result == :next
2616
- spec_name = dep_spec.name
2617
- dep_spec.traverse(trail, visited, &block) unless
2618
- trail.any? {|s| s.name == spec_name }
2619
- end
2623
+ next if result == :next
2624
+ spec_name = dep_spec.name
2625
+ dep_spec.traverse(trail, visited, &block) unless
2626
+ trail.any? {|s| s.name == spec_name }
2620
2627
  end
2621
2628
  end
2622
2629
  ensure
@@ -127,7 +127,7 @@ class Gem::SpecificationPolicy
127
127
 
128
128
  metadata.each do |key, value|
129
129
  entry = "metadata['#{key}']"
130
- if !key.kind_of?(String)
130
+ unless key.is_a?(String)
131
131
  error "metadata keys must be a String"
132
132
  end
133
133
 
@@ -135,7 +135,7 @@ class Gem::SpecificationPolicy
135
135
  error "metadata key is too large (#{key.size} > 128)"
136
136
  end
137
137
 
138
- if !value.kind_of?(String)
138
+ unless value.is_a?(String)
139
139
  error "#{entry} value must be a String"
140
140
  end
141
141
 
@@ -143,10 +143,9 @@ class Gem::SpecificationPolicy
143
143
  error "#{entry} value is too large (#{value.size} > 1024)"
144
144
  end
145
145
 
146
- if METADATA_LINK_KEYS.include? key
147
- if value !~ VALID_URI_PATTERN
148
- error "#{entry} has invalid link: #{value.inspect}"
149
- end
146
+ next unless METADATA_LINK_KEYS.include? key
147
+ if value !~ VALID_URI_PATTERN
148
+ error "#{entry} has invalid link: #{value.inspect}"
150
149
  end
151
150
  end
152
151
  end
@@ -198,28 +197,27 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
198
197
  !version.prerelease? && (op == ">" || op == ">=")
199
198
  end
200
199
 
201
- if open_ended
202
- op, dep_version = dep.requirement.requirements.first
203
-
204
- segments = dep_version.segments
200
+ next unless open_ended
201
+ op, dep_version = dep.requirement.requirements.first
205
202
 
206
- base = segments.first 2
203
+ segments = dep_version.segments
207
204
 
208
- recommendation = if (op == ">" || op == ">=") && segments == [0]
209
- " use a bounded requirement, such as '~> x.y'"
210
- else
211
- bugfix = if op == ">"
212
- ", '> #{dep_version}'"
213
- elsif op == ">=" && base != segments
214
- ", '>= #{dep_version}'"
215
- end
205
+ base = segments.first 2
216
206
 
217
- " if #{dep.name} is semantically versioned, use:\n" \
218
- " add_#{dep.type}_dependency '#{dep.name}', '~> #{base.join '.'}'#{bugfix}"
207
+ recommendation = if (op == ">" || op == ">=") && segments == [0]
208
+ " use a bounded requirement, such as '~> x.y'"
209
+ else
210
+ bugfix = if op == ">"
211
+ ", '> #{dep_version}'"
212
+ elsif op == ">=" && base != segments
213
+ ", '>= #{dep_version}'"
219
214
  end
220
215
 
221
- warning_messages << ["open-ended dependency on #{dep} is not recommended", recommendation].join("\n") + "\n"
216
+ " if #{dep.name} is semantically versioned, use:\n" \
217
+ " add_#{dep.type}_dependency '#{dep.name}', '~> #{base.join "."}'#{bugfix}"
222
218
  end
219
+
220
+ warning_messages << ["open-ended dependency on #{dep} is not recommended", recommendation].join("\n") + "\n"
223
221
  end
224
222
  if warning_messages.any?
225
223
  warning_messages.each {|warning_message| warning warning_message }
@@ -236,7 +234,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
236
234
 
237
235
  @specification.files.each do |file|
238
236
  next unless File.file?(file)
239
- next if File.stat(file).mode & 0444 == 0444
237
+ next if File.stat(file).mode & 0o444 == 0o444
240
238
  warning "#{file} is not world-readable"
241
239
  end
242
240
 
@@ -255,7 +253,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
255
253
  @specification.instance_variable_get("@#{attrname}").nil?
256
254
  end
257
255
  return if nil_attributes.empty?
258
- error "#{nil_attributes.join ', '} must not be nil"
256
+ error "#{nil_attributes.join ", "} must not be nil"
259
257
  end
260
258
 
261
259
  def validate_rubygems_version
@@ -302,7 +300,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
302
300
  non_files = @specification.files.reject {|x| File.file?(x) || File.symlink?(x) }
303
301
 
304
302
  unless non_files.empty?
305
- error "[\"#{non_files.join "\", \""}\"] are not files"
303
+ error "[\"#{non_files.join '", "'}\"] are not files"
306
304
  end
307
305
  end
308
306
 
@@ -345,7 +343,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
345
343
  String
346
344
  end
347
345
 
348
- unless Array === val && val.all? {|x| x.kind_of?(klass) }
346
+ unless Array === val && val.all? {|x| x.is_a?(klass) || (field == :licenses && x.nil?) }
349
347
  error "#{field} must be an Array of #{klass}"
350
348
  end
351
349
  end
@@ -360,6 +358,8 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
360
358
  licenses = @specification.licenses
361
359
 
362
360
  licenses.each do |license|
361
+ next if license.nil?
362
+
363
363
  if license.length > 64
364
364
  error "each license must be 64 characters or less"
365
365
  end
@@ -370,20 +370,21 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
370
370
  licenses = @specification.licenses
371
371
 
372
372
  licenses.each do |license|
373
- if !Gem::Licenses.match?(license)
374
- suggestions = Gem::Licenses.suggestions(license)
375
- message = <<-WARNING
373
+ next if Gem::Licenses.match?(license) || license.nil?
374
+ suggestions = Gem::Licenses.suggestions(license)
375
+ message = <<-WARNING
376
376
  license value '#{license}' is invalid. Use a license identifier from
377
- http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license.
378
- WARNING
379
- message += "Did you mean #{suggestions.map {|s| "'#{s}'" }.join(', ')}?\n" unless suggestions.nil?
380
- warning(message)
381
- end
377
+ http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license,
378
+ or set it to nil if you don't want to specify a license.
379
+ WARNING
380
+ message += "Did you mean #{suggestions.map {|s| "'#{s}'" }.join(", ")}?\n" unless suggestions.nil?
381
+ warning(message)
382
382
  end
383
383
 
384
384
  warning <<-WARNING if licenses.empty?
385
385
  licenses is empty, but is recommended. Use a license identifier from
386
- http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license.
386
+ http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license,
387
+ or set it to nil if you don't want to specify a license.
387
388
  WARNING
388
389
  end
389
390
 
@@ -35,7 +35,7 @@ class Gem::StubSpecification < Gem::BasicSpecification
35
35
 
36
36
  def initialize(data, extensions)
37
37
  parts = data[PREFIX.length..-1].split(" ", 4)
38
- @name = parts[0].freeze
38
+ @name = -parts[0]
39
39
  @version = if Gem::Version.correct?(parts[1])
40
40
  Gem::Version.new(parts[1])
41
41
  else
@@ -112,20 +112,23 @@ class Gem::StubSpecification < Gem::BasicSpecification
112
112
  saved_lineno = $.
113
113
 
114
114
  Gem.open_file loaded_from, OPEN_MODE do |file|
115
- begin
116
- file.readline # discard encoding line
117
- stubline = file.readline.chomp
118
- if stubline.start_with?(PREFIX)
119
- extensions = if /\A#{PREFIX}/ =~ file.readline.chomp
120
- $'.split "\0"
115
+ file.readline # discard encoding line
116
+ stubline = file.readline
117
+ if stubline.start_with?(PREFIX)
118
+ extline = file.readline
119
+
120
+ extensions =
121
+ if extline.delete_prefix!(PREFIX)
122
+ extline.chomp!
123
+ extline.split "\0"
121
124
  else
122
125
  StubLine::NO_EXTENSIONS
123
126
  end
124
127
 
125
- @data = StubLine.new stubline, extensions
126
- end
127
- rescue EOFError
128
+ stubline.chomp! # readline(chomp: true) allocates 3x as much as .readline.chomp!
129
+ @data = StubLine.new stubline, extensions
128
130
  end
131
+ rescue EOFError
129
132
  end
130
133
  ensure
131
134
  $. = saved_lineno
@@ -135,7 +135,7 @@ class Gem::Uninstaller
135
135
 
136
136
  if index == list.size
137
137
  remove_all list
138
- elsif index >= 0 && index < list.size
138
+ elsif index && index >= 0 && index < list.size
139
139
  uninstall_gem list[index]
140
140
  else
141
141
  say "Error: must enter a number [1-#{list.size + 1}]"
@@ -202,7 +202,7 @@ class Gem::Uninstaller
202
202
 
203
203
  remove = if @force_executables.nil?
204
204
  ask_yes_no("Remove executables:\n" +
205
- "\t#{executables.join ', '}\n\n" +
205
+ "\t#{executables.join ", "}\n\n" +
206
206
  "in addition to the gem?",
207
207
  true)
208
208
  else
@@ -59,7 +59,7 @@ Run `gem update --system #{Gem.latest_rubygems_version}` to update your installa
59
59
 
60
60
  return eglible
61
61
  end
62
- rescue # don't block install command on any problem
62
+ rescue StandardError # don't block install command on any problem
63
63
  false
64
64
  end
65
65
 
@@ -286,7 +286,7 @@ class Gem::StreamUI
286
286
  # Ask a question. Returns an answer if connected to a tty, nil otherwise.
287
287
 
288
288
  def ask(question)
289
- return nil if !tty?
289
+ return nil unless tty?
290
290
 
291
291
  @outs.print(question + " ")
292
292
  @outs.flush
@@ -300,7 +300,7 @@ class Gem::StreamUI
300
300
  # Ask for a password. Does not echo response to terminal.
301
301
 
302
302
  def ask_for_password(question)
303
- return nil if !tty?
303
+ return nil unless tty?
304
304
 
305
305
  @outs.print(question, " ")
306
306
  @outs.flush