rubygems-update 2.4.8 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CODE_OF_CONDUCT.md +40 -0
  5. data/CVE-2015-3900.txt +40 -0
  6. data/History.txt +173 -2
  7. data/Manifest.txt +14 -1
  8. data/Rakefile +36 -1
  9. data/lib/rubygems.rb +32 -14
  10. data/lib/rubygems/basic_specification.rb +31 -9
  11. data/lib/rubygems/commands/dependency_command.rb +25 -15
  12. data/lib/rubygems/commands/environment_command.rb +2 -0
  13. data/lib/rubygems/commands/help_command.rb +0 -10
  14. data/lib/rubygems/commands/install_command.rb +1 -1
  15. data/lib/rubygems/commands/list_command.rb +1 -1
  16. data/lib/rubygems/commands/pristine_command.rb +11 -1
  17. data/lib/rubygems/commands/query_command.rb +1 -1
  18. data/lib/rubygems/commands/sources_command.rb +1 -1
  19. data/lib/rubygems/commands/update_command.rb +2 -2
  20. data/lib/rubygems/config_file.rb +4 -4
  21. data/lib/rubygems/core_ext/kernel_require.rb +2 -2
  22. data/lib/rubygems/dependency.rb +9 -6
  23. data/lib/rubygems/dependency_list.rb +3 -0
  24. data/lib/rubygems/ext/builder.rb +2 -0
  25. data/lib/rubygems/ext/ext_conf_builder.rb +6 -1
  26. data/lib/rubygems/indexer.rb +26 -91
  27. data/lib/rubygems/installer.rb +58 -26
  28. data/lib/rubygems/installer_test_case.rb +2 -2
  29. data/lib/rubygems/package.rb +18 -6
  30. data/lib/rubygems/package/old.rb +2 -2
  31. data/lib/rubygems/package/tar_reader/entry.rb +7 -1
  32. data/lib/rubygems/package/tar_test_case.rb +12 -3
  33. data/lib/rubygems/package/tar_writer.rb +19 -1
  34. data/lib/rubygems/platform.rb +3 -2
  35. data/lib/rubygems/rdoc.rb +1 -2
  36. data/lib/rubygems/remote_fetcher.rb +25 -6
  37. data/lib/rubygems/request/connection_pools.rb +8 -4
  38. data/lib/rubygems/request_set.rb +3 -4
  39. data/lib/rubygems/request_set/gem_dependency_api.rb +2 -2
  40. data/lib/rubygems/request_set/lockfile.rb +1 -1
  41. data/lib/rubygems/request_set/lockfile/parser.rb +54 -43
  42. data/lib/rubygems/request_set/lockfile/tokenizer.rb +16 -13
  43. data/lib/rubygems/resolver.rb +47 -242
  44. data/lib/rubygems/resolver/activation_request.rb +2 -1
  45. data/lib/rubygems/resolver/conflict.rb +0 -1
  46. data/lib/rubygems/resolver/dependency_request.rb +4 -1
  47. data/lib/rubygems/resolver/git_specification.rb +1 -2
  48. data/lib/rubygems/resolver/molinillo.rb +1 -0
  49. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +5 -0
  50. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +266 -0
  51. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +69 -0
  52. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +3 -0
  53. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +99 -0
  54. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +63 -0
  55. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +430 -0
  56. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +43 -0
  57. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +51 -0
  58. data/lib/rubygems/resolver/specification.rb +1 -1
  59. data/lib/rubygems/specification.rb +256 -86
  60. data/lib/rubygems/stub_specification.rb +37 -29
  61. data/lib/rubygems/test_case.rb +65 -28
  62. data/lib/rubygems/test_utilities.rb +18 -18
  63. data/lib/rubygems/text.rb +0 -2
  64. data/lib/rubygems/uninstaller.rb +1 -1
  65. data/lib/rubygems/util.rb +4 -4
  66. data/lib/rubygems/util/licenses.rb +309 -0
  67. data/lib/rubygems/util/list.rb +9 -21
  68. data/lib/rubygems/version.rb +24 -14
  69. data/test/rubygems/simple_gem.rb +1 -1
  70. data/test/rubygems/test_config.rb +10 -1
  71. data/test/rubygems/test_gem.rb +58 -11
  72. data/test/rubygems/test_gem_available_set.rb +2 -1
  73. data/test/rubygems/test_gem_commands_cleanup_command.rb +6 -5
  74. data/test/rubygems/test_gem_commands_dependency_command.rb +9 -1
  75. data/test/rubygems/test_gem_commands_install_command.rb +17 -28
  76. data/test/rubygems/test_gem_commands_mirror.rb +0 -13
  77. data/test/rubygems/test_gem_commands_outdated_command.rb +2 -3
  78. data/test/rubygems/test_gem_commands_pristine_command.rb +33 -5
  79. data/test/rubygems/test_gem_commands_query_command.rb +123 -158
  80. data/test/rubygems/test_gem_commands_server_command.rb +2 -2
  81. data/test/rubygems/test_gem_commands_specification_command.rb +4 -4
  82. data/test/rubygems/test_gem_commands_stale_command.rb +2 -0
  83. data/test/rubygems/test_gem_commands_uninstall_command.rb +5 -4
  84. data/test/rubygems/test_gem_commands_unpack_command.rb +4 -6
  85. data/test/rubygems/test_gem_commands_update_command.rb +22 -52
  86. data/test/rubygems/test_gem_commands_which_command.rb +1 -0
  87. data/test/rubygems/test_gem_config_file.rb +1 -1
  88. data/test/rubygems/test_gem_dependency.rb +7 -3
  89. data/test/rubygems/test_gem_dependency_installer.rb +5 -5
  90. data/test/rubygems/test_gem_doctor.rb +1 -1
  91. data/test/rubygems/test_gem_ext_builder.rb +2 -0
  92. data/test/rubygems/test_gem_ext_configure_builder.rb +8 -4
  93. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +25 -21
  94. data/test/rubygems/test_gem_indexer.rb +4 -4
  95. data/test/rubygems/test_gem_install_update_options.rb +2 -2
  96. data/test/rubygems/test_gem_installer.rb +32 -26
  97. data/test/rubygems/test_gem_package.rb +46 -1
  98. data/test/rubygems/test_gem_package_tar_reader_entry.rb +8 -1
  99. data/test/rubygems/test_gem_package_tar_writer.rb +10 -1
  100. data/test/rubygems/test_gem_package_task.rb +5 -2
  101. data/test/rubygems/test_gem_platform.rb +11 -0
  102. data/test/rubygems/test_gem_remote_fetcher.rb +64 -3
  103. data/test/rubygems/test_gem_request.rb +1 -1
  104. data/test/rubygems/test_gem_request_connection_pools.rb +10 -1
  105. data/test/rubygems/test_gem_request_set.rb +5 -8
  106. data/test/rubygems/test_gem_request_set_lockfile.rb +2 -4
  107. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
  108. data/test/rubygems/test_gem_resolver.rb +12 -31
  109. data/test/rubygems/test_gem_resolver_git_specification.rb +1 -0
  110. data/test/rubygems/test_gem_resolver_installer_set.rb +7 -11
  111. data/test/rubygems/test_gem_resolver_lock_specification.rb +3 -2
  112. data/test/rubygems/test_gem_security_trust_dir.rb +2 -0
  113. data/test/rubygems/test_gem_server.rb +4 -0
  114. data/test/rubygems/test_gem_specification.rb +344 -61
  115. data/test/rubygems/test_gem_stream_ui.rb +6 -6
  116. data/test/rubygems/test_gem_stub_specification.rb +21 -6
  117. data/test/rubygems/test_gem_text.rb +2 -0
  118. data/test/rubygems/test_gem_uninstaller.rb +2 -1
  119. data/test/rubygems/test_gem_util.rb +8 -0
  120. data/test/rubygems/test_require.rb +156 -125
  121. data/util/generate_spdx_license_list.rb +21 -0
  122. data/util/update_bundled_ca_certificates.rb +2 -1
  123. metadata +42 -6
  124. metadata.gz.sig +0 -0
  125. data/lib/rubygems/util/stringio.rb +0 -34
@@ -15,35 +15,34 @@ class Gem::StubSpecification < Gem::BasicSpecification
15
15
  end
16
16
 
17
17
  class StubLine # :nodoc: all
18
- attr_reader :parts
18
+ attr_reader :name, :version, :platform, :require_paths
19
19
 
20
20
  def initialize(data)
21
- @parts = data[PREFIX.length..-1].split(" ")
22
- end
23
-
24
- def name
25
- @parts[0]
26
- end
27
-
28
- def version
29
- Gem::Version.new @parts[1]
21
+ parts = data[PREFIX.length..-1].split(" ")
22
+ @name = parts[0].freeze
23
+ @version = Gem::Version.new parts[1]
24
+ @platform = Gem::Platform.new parts[2]
25
+ @require_paths = parts.drop(3).join(" ").split("\0")
30
26
  end
27
+ end
31
28
 
32
- def platform
33
- Gem::Platform.new @parts[2]
34
- end
29
+ def self.default_gemspec_stub filename
30
+ new filename, true
31
+ end
35
32
 
36
- def require_paths
37
- @parts[3..-1].join(" ").split("\0")
38
- end
33
+ def self.gemspec_stub filename
34
+ new filename, false
39
35
  end
40
36
 
41
- def initialize(filename)
37
+ def initialize filename, default_gem
38
+ filename.untaint
39
+
42
40
  self.loaded_from = filename
43
41
  @data = nil
44
42
  @extensions = nil
45
43
  @name = nil
46
44
  @spec = nil
45
+ @default_gem = default_gem
47
46
  end
48
47
 
49
48
  ##
@@ -57,6 +56,10 @@ class Gem::StubSpecification < Gem::BasicSpecification
57
56
  end
58
57
  end
59
58
 
59
+ def default_gem?
60
+ @default_gem
61
+ end
62
+
60
63
  def build_extensions # :nodoc:
61
64
  return if default_gem?
62
65
  return if extensions.empty?
@@ -72,18 +75,23 @@ class Gem::StubSpecification < Gem::BasicSpecification
72
75
  unless @data
73
76
  @extensions = []
74
77
 
75
- open loaded_from, OPEN_MODE do |file|
76
- begin
77
- file.readline # discard encoding line
78
- stubline = file.readline.chomp
79
- if stubline.start_with?(PREFIX) then
80
- @data = StubLine.new stubline
81
-
82
- @extensions = $'.split "\0" if
83
- /\A#{PREFIX}/ =~ file.readline.chomp
78
+ begin
79
+ saved_lineno = $.
80
+ open loaded_from, OPEN_MODE do |file|
81
+ begin
82
+ file.readline # discard encoding line
83
+ stubline = file.readline.chomp
84
+ if stubline.start_with?(PREFIX) then
85
+ @data = StubLine.new stubline
86
+
87
+ @extensions = $'.split "\0" if
88
+ /\A#{PREFIX}/ =~ file.readline.chomp
89
+ end
90
+ rescue EOFError
84
91
  end
85
- rescue EOFError
86
92
  end
93
+ ensure
94
+ $. = saved_lineno
87
95
  end
88
96
  end
89
97
 
@@ -135,14 +143,14 @@ class Gem::StubSpecification < Gem::BasicSpecification
135
143
  # Name of the gem
136
144
 
137
145
  def name
138
- @name ||= data.name
146
+ data.name
139
147
  end
140
148
 
141
149
  ##
142
150
  # Platform of the gem
143
151
 
144
152
  def platform
145
- @platform ||= data.platform
153
+ data.platform
146
154
  end
147
155
 
148
156
  ##
@@ -36,9 +36,7 @@ require 'shellwords'
36
36
  require 'tmpdir'
37
37
  require 'uri'
38
38
  require 'zlib'
39
-
40
- Gem.load_yaml
41
-
39
+ require 'benchmark' # stdlib
42
40
  require 'rubygems/mock_gem_ui'
43
41
 
44
42
  module Gem
@@ -221,6 +219,9 @@ class Gem::TestCase < MiniTest::Unit::TestCase
221
219
  @orig_gem_home = ENV['GEM_HOME']
222
220
  @orig_gem_path = ENV['GEM_PATH']
223
221
  @orig_gem_vendor = ENV['GEM_VENDOR']
222
+ @orig_gem_spec_cache = ENV['GEM_SPEC_CACHE']
223
+ @orig_rubygems_gemdeps = ENV['RUBYGEMS_GEMDEPS']
224
+ @orig_rubygems_host = ENV['RUBYGEMS_HOST']
224
225
 
225
226
  ENV['GEM_VENDOR'] = nil
226
227
 
@@ -265,13 +266,16 @@ class Gem::TestCase < MiniTest::Unit::TestCase
265
266
  Gem.ensure_gem_subdirectories @gemhome
266
267
 
267
268
  @orig_LOAD_PATH = $LOAD_PATH.dup
268
- $LOAD_PATH.map! { |s| File.expand_path(s).untaint }
269
+ $LOAD_PATH.map! { |s|
270
+ (expand_path = File.expand_path(s)) == s ? s : expand_path.untaint
271
+ }
269
272
 
270
273
  Dir.chdir @tempdir
271
274
 
272
275
  @orig_ENV_HOME = ENV['HOME']
273
276
  ENV['HOME'] = @userhome
274
277
  Gem.instance_variable_set :@user_home, nil
278
+ Gem.instance_variable_set :@gemdeps, nil
275
279
  Gem.send :remove_instance_variable, :@ruby_version if
276
280
  Gem.instance_variables.include? :@ruby_version
277
281
 
@@ -326,6 +330,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
326
330
  end
327
331
 
328
332
  @marshal_version = "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
333
+ @orig_LOADED_FEATURES = $LOADED_FEATURES.dup
329
334
  end
330
335
 
331
336
  ##
@@ -334,6 +339,18 @@ class Gem::TestCase < MiniTest::Unit::TestCase
334
339
 
335
340
  def teardown
336
341
  $LOAD_PATH.replace @orig_LOAD_PATH if @orig_LOAD_PATH
342
+ if @orig_LOADED_FEATURES
343
+ if @orig_LOAD_PATH
344
+ paths = @orig_LOAD_PATH.map {|path| File.join(File.expand_path(path), "/")}
345
+ ($LOADED_FEATURES - @orig_LOADED_FEATURES).each do |feat|
346
+ unless paths.any? {|path| feat.start_with?(path)}
347
+ $LOADED_FEATURES.delete(feat)
348
+ end
349
+ end
350
+ else
351
+ $LOADED_FEATURES.replace @orig_LOADED_FEATURES
352
+ end
353
+ end
337
354
 
338
355
  if @orig_BASERUBY
339
356
  RbConfig::CONFIG['BASERUBY'] = @orig_BASERUBY
@@ -353,6 +370,9 @@ class Gem::TestCase < MiniTest::Unit::TestCase
353
370
  ENV['GEM_HOME'] = @orig_gem_home
354
371
  ENV['GEM_PATH'] = @orig_gem_path
355
372
  ENV['GEM_VENDOR'] = @orig_gem_vendor
373
+ ENV['GEM_SPEC_CACHE'] = @orig_gem_spec_cache
374
+ ENV['RUBYGEMS_GEMDEPS'] = @orig_rubygems_gemdeps
375
+ ENV['RUBYGEMS_HOST'] = @orig_rubygems_host
356
376
 
357
377
  Gem.ruby = @orig_ruby if @orig_ruby
358
378
 
@@ -367,6 +387,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
367
387
  ENV['GEM_PRIVATE_KEY_PASSPHRASE'] = @orig_gem_private_key_passphrase
368
388
 
369
389
  Gem::Specification._clear_load_cache
390
+ Gem::Specification.unresolved_deps.clear
370
391
  end
371
392
 
372
393
  def common_installer_setup
@@ -482,7 +503,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
482
503
  gem = File.join(@tempdir, File.basename(spec.cache_file)).untaint
483
504
  end
484
505
 
485
- Gem::Installer.new(gem, options.merge({:wrappers => true})).install
506
+ Gem::Installer.at(gem, options.merge({:wrappers => true})).install
486
507
  end
487
508
 
488
509
  ##
@@ -497,8 +518,11 @@ class Gem::TestCase < MiniTest::Unit::TestCase
497
518
  def uninstall_gem spec
498
519
  require 'rubygems/uninstaller'
499
520
 
500
- Gem::Uninstaller.new(spec.name,
501
- :executables => true, :user_install => true).uninstall
521
+ Class.new(Gem::Uninstaller) {
522
+ def ask_if_ok spec
523
+ true
524
+ end
525
+ }.new(spec.name, :executables => true, :user_install => true).uninstall
502
526
  end
503
527
 
504
528
  ##
@@ -592,7 +616,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
592
616
 
593
617
  spec.loaded_from = spec.loaded_from = written_path
594
618
 
595
- Gem::Specification.add_spec spec.for_cache
619
+ Gem::Specification.reset
596
620
 
597
621
  return spec
598
622
  end
@@ -648,7 +672,10 @@ class Gem::TestCase < MiniTest::Unit::TestCase
648
672
  # Install the provided specs
649
673
 
650
674
  def install_specs(*specs)
651
- Gem::Specification.add_specs(*specs)
675
+ specs.each do |spec|
676
+ Gem::Installer.for_spec(spec).install
677
+ end
678
+
652
679
  Gem.searcher = nil
653
680
  end
654
681
 
@@ -669,8 +696,9 @@ class Gem::TestCase < MiniTest::Unit::TestCase
669
696
  # Install the provided default specs
670
697
 
671
698
  def install_default_specs(*specs)
672
- install_specs(*specs)
673
699
  specs.each do |spec|
700
+ installer = Gem::Installer.for_spec(spec, :install_as_default => true)
701
+ installer.install
674
702
  Gem.register_default_spec(spec)
675
703
  end
676
704
  end
@@ -782,9 +810,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
782
810
  end
783
811
  end
784
812
 
785
- spec.loaded_from = spec.spec_file
786
-
787
- Gem::Specification.add_spec spec
813
+ Gem::Specification.reset
788
814
 
789
815
  return spec
790
816
  end
@@ -971,14 +997,13 @@ Also, a list:
971
997
  # Best used with +@all_gems+ from #util_setup_fake_fetcher.
972
998
 
973
999
  def util_setup_spec_fetcher(*specs)
974
- specs -= Gem::Specification._all
975
- Gem::Specification.add_specs(*specs)
1000
+ all_specs = Gem::Specification.to_a + specs
1001
+ Gem::Specification._resort! all_specs
976
1002
 
977
1003
  spec_fetcher = Gem::SpecFetcher.fetcher
978
1004
 
979
- prerelease, all = Gem::Specification.partition { |spec|
980
- spec.version.prerelease?
981
- }
1005
+ prerelease, all = all_specs.partition { |spec| spec.version.prerelease? }
1006
+ latest = Gem::Specification._latest_specs all_specs
982
1007
 
983
1008
  spec_fetcher.specs[@uri] = []
984
1009
  all.each do |spec|
@@ -986,7 +1011,7 @@ Also, a list:
986
1011
  end
987
1012
 
988
1013
  spec_fetcher.latest_specs[@uri] = []
989
- Gem::Specification.latest_specs.each do |spec|
1014
+ latest.each do |spec|
990
1015
  spec_fetcher.latest_specs[@uri] << spec.name_tuple
991
1016
  end
992
1017
 
@@ -1002,7 +1027,7 @@ Also, a list:
1002
1027
  specs = all.map { |spec| spec.name_tuple }
1003
1028
  s_zip = util_gzip Marshal.dump Gem::NameTuple.to_basic specs
1004
1029
 
1005
- latest_specs = Gem::Specification.latest_specs.map do |spec|
1030
+ latest_specs = latest.map do |spec|
1006
1031
  spec.name_tuple
1007
1032
  end
1008
1033
 
@@ -1017,7 +1042,7 @@ Also, a list:
1017
1042
 
1018
1043
  v = Gem.marshal_version
1019
1044
 
1020
- Gem::Specification.each do |spec|
1045
+ all_specs.each do |spec|
1021
1046
  path = "#{@gem_repo}quick/Marshal.#{v}/#{spec.original_name}.gemspec.rz"
1022
1047
  data = Marshal.dump spec
1023
1048
  data_deflate = Zlib::Deflate.deflate data
@@ -1102,7 +1127,7 @@ Also, a list:
1102
1127
  # other platforms, including Cygwin, it will return 'make'.
1103
1128
 
1104
1129
  def self.make_command
1105
- ENV["make"] || (vc_windows? ? 'nmake' : 'make')
1130
+ ENV["make"] || ENV["MAKE"] || (vc_windows? ? 'nmake' : 'make')
1106
1131
  end
1107
1132
 
1108
1133
  ##
@@ -1111,7 +1136,7 @@ Also, a list:
1111
1136
  # other platforms, including Cygwin, it will return 'make'.
1112
1137
 
1113
1138
  def make_command
1114
- ENV["make"] || (vc_windows? ? 'nmake' : 'make')
1139
+ ENV["make"] || ENV["MAKE"] || (vc_windows? ? 'nmake' : 'make')
1115
1140
  end
1116
1141
 
1117
1142
  ##
@@ -1194,8 +1219,8 @@ Also, a list:
1194
1219
  end
1195
1220
 
1196
1221
  @@ruby = rubybin
1197
- @@good_rake = "#{rubybin} #{File.expand_path('../../../test/rubygems/good_rake.rb', __FILE__)}"
1198
- @@bad_rake = "#{rubybin} #{File.expand_path('../../../test/rubygems/bad_rake.rb', __FILE__)}"
1222
+ @@good_rake = "#{rubybin} \"#{File.expand_path('../../../test/rubygems/good_rake.rb', __FILE__)}\""
1223
+ @@bad_rake = "#{rubybin} \"#{File.expand_path('../../../test/rubygems/bad_rake.rb', __FILE__)}\""
1199
1224
 
1200
1225
  ##
1201
1226
  # Construct a new Gem::Dependency.
@@ -1433,7 +1458,10 @@ begin
1433
1458
  rescue Gem::LoadError
1434
1459
  end
1435
1460
 
1436
- require 'rake/packagetask'
1461
+ begin
1462
+ require 'rake/packagetask'
1463
+ rescue LoadError
1464
+ end
1437
1465
 
1438
1466
  begin
1439
1467
  gem 'rdoc'
@@ -1441,7 +1469,16 @@ begin
1441
1469
  rescue LoadError, Gem::LoadError
1442
1470
  end
1443
1471
 
1472
+ begin
1473
+ gem 'builder'
1474
+ require 'builder/xchar'
1475
+ rescue LoadError, Gem::LoadError
1476
+ end
1477
+
1444
1478
  require 'rubygems/test_utilities'
1445
- ENV['GEM_HOME'] = Dir.mktmpdir "home"
1446
- ENV['GEM_PATH'] = Dir.mktmpdir "path"
1479
+ tmpdirs = []
1480
+ tmpdirs << (ENV['GEM_HOME'] = Dir.mktmpdir("home"))
1481
+ tmpdirs << (ENV['GEM_PATH'] = Dir.mktmpdir("path"))
1482
+ pid = $$
1483
+ END {tmpdirs.each {|dir| Dir.rmdir(dir)} if $$ == pid}
1447
1484
  Gem.clear_paths
@@ -186,7 +186,6 @@ end
186
186
  # f.gem 'a', 1
187
187
  # f.spec 'a', 2
188
188
  # f.gem 'b', 1' 'a' => '~> 1.0'
189
- # f.clear
190
189
  # end
191
190
  #
192
191
  # The above declaration creates two gems, a-1 and b-1, with a dependency from
@@ -214,18 +213,11 @@ class Gem::TestCase::SpecFetcherSetup
214
213
  @repository = repository
215
214
 
216
215
  @gems = {}
216
+ @downloaded = []
217
217
  @installed = []
218
218
  @operations = []
219
219
  end
220
220
 
221
- ##
222
- # Removes any created gems or specifications from Gem.dir (the default
223
- # install location).
224
-
225
- def clear
226
- @operations << [:clear]
227
- end
228
-
229
221
  ##
230
222
  # Returns a Hash of created Specification full names and the corresponding
231
223
  # Specification.
@@ -254,9 +246,6 @@ class Gem::TestCase::SpecFetcherSetup
254
246
  def execute_operations # :nodoc:
255
247
  @operations.each do |operation, *arguments|
256
248
  case operation
257
- when :clear then
258
- @test.util_clear_gems
259
- @installed.clear
260
249
  when :gem then
261
250
  spec, gem = @test.util_gem(*arguments, &arguments.pop)
262
251
 
@@ -264,6 +253,11 @@ class Gem::TestCase::SpecFetcherSetup
264
253
 
265
254
  @gems[spec] = gem
266
255
  @installed << spec
256
+ when :download then
257
+ spec, gem = @test.util_gem(*arguments, &arguments.pop)
258
+
259
+ @gems[spec] = gem
260
+ @downloaded << spec
267
261
  when :spec then
268
262
  spec = @test.util_spec(*arguments, &arguments.pop)
269
263
 
@@ -286,6 +280,17 @@ class Gem::TestCase::SpecFetcherSetup
286
280
  @operations << [:gem, name, version, dependencies, block]
287
281
  end
288
282
 
283
+ ##
284
+ # Creates a gem with +name+, +version+ and +deps+. The created gem is
285
+ # downloaded in to the cache directory but is not installed
286
+ #
287
+ # The specification will be yielded before gem creation for customization,
288
+ # but only the block or the dependencies may be set, not both.
289
+
290
+ def download name, version, dependencies = nil, &block
291
+ @operations << [:download, name, version, dependencies, block]
292
+ end
293
+
289
294
  ##
290
295
  # Creates a legacy platform spec with the name 'pl' and version 1
291
296
 
@@ -312,17 +317,12 @@ class Gem::TestCase::SpecFetcherSetup
312
317
  gem_repo, @test.gem_repo = @test.gem_repo, @repository
313
318
  @test.uri = URI @repository
314
319
 
315
- @test.util_setup_spec_fetcher(*@gems.keys)
320
+ @test.util_setup_spec_fetcher(*@downloaded)
316
321
  ensure
317
322
  @test.gem_repo = gem_repo
318
323
  @test.uri = URI gem_repo
319
324
  end
320
325
 
321
- # This works around util_setup_spec_fetcher adding all created gems to the
322
- # installed set.
323
- Gem::Specification.reset
324
- Gem::Specification.add_specs(*@installed)
325
-
326
326
  @gems.each do |spec, gem|
327
327
  next unless gem
328
328
 
@@ -43,11 +43,9 @@ module Gem::Text
43
43
  t = str2
44
44
  n = s.length
45
45
  m = t.length
46
- max = n/2
47
46
 
48
47
  return m if (0 == n)
49
48
  return n if (0 == m)
50
- return n if (n - m).abs > max
51
49
 
52
50
  d = (0..m).to_a
53
51
  x = nil