rubygems-update 2.3.0 → 2.4.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 (71) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING +14 -2
  5. data/History.txt +63 -0
  6. data/Rakefile +68 -91
  7. data/lib/rubygems.rb +5 -3
  8. data/lib/rubygems/command_manager.rb +1 -0
  9. data/lib/rubygems/commands/contents_command.rb +23 -2
  10. data/lib/rubygems/commands/install_command.rb +8 -0
  11. data/lib/rubygems/commands/open_command.rb +1 -8
  12. data/lib/rubygems/commands/uninstall_command.rb +9 -1
  13. data/lib/rubygems/commands/update_command.rb +1 -1
  14. data/lib/rubygems/core_ext/kernel_gem.rb +8 -1
  15. data/lib/rubygems/core_ext/kernel_require.rb +12 -22
  16. data/lib/rubygems/defaults.rb +17 -5
  17. data/lib/rubygems/dependency.rb +7 -1
  18. data/lib/rubygems/dependency_installer.rb +3 -0
  19. data/lib/rubygems/ext/ext_conf_builder.rb +13 -11
  20. data/lib/rubygems/install_update_options.rb +13 -0
  21. data/lib/rubygems/installer.rb +36 -20
  22. data/lib/rubygems/installer_test_case.rb +2 -0
  23. data/lib/rubygems/local_remote_options.rb +1 -1
  24. data/lib/rubygems/name_tuple.rb +1 -1
  25. data/lib/rubygems/request_set.rb +14 -3
  26. data/lib/rubygems/request_set/gem_dependency_api.rb +12 -0
  27. data/lib/rubygems/request_set/lockfile.rb +3 -1
  28. data/lib/rubygems/resolver.rb +15 -0
  29. data/lib/rubygems/resolver/best_set.rb +28 -0
  30. data/lib/rubygems/resolver/conflict.rb +45 -7
  31. data/lib/rubygems/resolver/git_specification.rb +24 -0
  32. data/lib/rubygems/resolver/lock_specification.rb +22 -0
  33. data/lib/rubygems/source.rb +2 -0
  34. data/lib/rubygems/source/git.rb +1 -1
  35. data/lib/rubygems/source/installed.rb +2 -1
  36. data/lib/rubygems/specification.rb +16 -15
  37. data/lib/rubygems/test_case.rb +9 -5
  38. data/test/rubygems/test_gem.rb +72 -2
  39. data/test/rubygems/test_gem_commands_contents_command.rb +46 -3
  40. data/test/rubygems/test_gem_commands_install_command.rb +32 -0
  41. data/test/rubygems/test_gem_commands_uninstall_command.rb +18 -0
  42. data/test/rubygems/test_gem_dependency.rb +23 -0
  43. data/test/rubygems/test_gem_dependency_installer.rb +17 -0
  44. data/test/rubygems/test_gem_ext_builder.rb +12 -1
  45. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +2 -2
  46. data/test/rubygems/test_gem_impossible_dependencies_error.rb +24 -8
  47. data/test/rubygems/test_gem_install_update_options.rb +16 -0
  48. data/test/rubygems/test_gem_installer.rb +52 -0
  49. data/test/rubygems/test_gem_local_remote_options.rb +13 -0
  50. data/test/rubygems/test_gem_package.rb +3 -1
  51. data/test/rubygems/test_gem_package_tar_header.rb +2 -0
  52. data/test/rubygems/test_gem_package_tar_reader.rb +11 -1
  53. data/test/rubygems/test_gem_package_tar_reader_entry.rb +17 -2
  54. data/test/rubygems/test_gem_package_tar_writer.rb +1 -0
  55. data/test/rubygems/test_gem_remote_fetcher.rb +24 -0
  56. data/test/rubygems/test_gem_request_set.rb +74 -4
  57. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +9 -1
  58. data/test/rubygems/test_gem_request_set_lockfile.rb +3 -1
  59. data/test/rubygems/test_gem_requirement.rb +8 -0
  60. data/test/rubygems/test_gem_resolver.rb +39 -0
  61. data/test/rubygems/test_gem_resolver_best_set.rb +57 -0
  62. data/test/rubygems/test_gem_resolver_conflict.rb +22 -10
  63. data/test/rubygems/test_gem_resolver_git_specification.rb +12 -0
  64. data/test/rubygems/test_gem_source_git.rb +6 -2
  65. data/test/rubygems/test_gem_source_installed.rb +8 -0
  66. data/test/rubygems/test_gem_source_lock.rb +2 -2
  67. data/test/rubygems/test_gem_source_vendor.rb +4 -0
  68. data/test/rubygems/test_kernel.rb +6 -0
  69. data/test/rubygems/test_require.rb +60 -0
  70. metadata +5 -5
  71. metadata.gz.sig +0 -0
@@ -188,6 +188,42 @@ gem 'other', version
188
188
  assert_match %r|generated by RubyGems|, wrapper
189
189
  end unless Gem.win_platform?
190
190
 
191
+ def test_check_that_user_bin_dir_is_in_path
192
+ orig_PATH, ENV['PATH'] =
193
+ ENV['PATH'], [ENV['PATH'], @installer.bin_dir].join(File::PATH_SEPARATOR)
194
+
195
+ use_ui @ui do
196
+ @installer.check_that_user_bin_dir_is_in_path
197
+ end
198
+
199
+ assert_empty @ui.error
200
+ ensure
201
+ ENV['PATH'] = orig_PATH
202
+ end
203
+
204
+ def test_check_that_user_bin_dir_is_in_path_tilde
205
+ orig_PATH, ENV['PATH'] =
206
+ ENV['PATH'], [ENV['PATH'], '~/bin'].join(File::PATH_SEPARATOR)
207
+
208
+ @installer.bin_dir.replace File.join @userhome, 'bin'
209
+
210
+ use_ui @ui do
211
+ @installer.check_that_user_bin_dir_is_in_path
212
+ end
213
+
214
+ assert_empty @ui.error
215
+ ensure
216
+ ENV['PATH'] = orig_PATH
217
+ end
218
+
219
+ def test_check_that_user_bin_dir_is_in_path_not_in_path
220
+ use_ui @ui do
221
+ @installer.check_that_user_bin_dir_is_in_path
222
+ end
223
+
224
+ assert_match @installer.bin_dir, @ui.error
225
+ end
226
+
191
227
  def test_ensure_dependency
192
228
  util_spec 'a'
193
229
 
@@ -1162,6 +1198,22 @@ gem 'other', version
1162
1198
  assert_equal "#!#{Gem.ruby}", shebang
1163
1199
  end
1164
1200
 
1201
+ def test_process_options
1202
+ assert_nil @installer.build_root
1203
+ assert_equal File.join(@gemhome, 'bin'), @installer.bin_dir
1204
+ assert_equal @gemhome, @installer.gem_home
1205
+ end
1206
+
1207
+ def test_process_options_build_root
1208
+ build_root = File.join @tempdir, 'build_root'
1209
+
1210
+ @installer = Gem::Installer.new @gem, :build_root => build_root
1211
+
1212
+ assert_equal Pathname(build_root), @installer.build_root
1213
+ assert_equal File.join(build_root, @gemhome, 'bin'), @installer.bin_dir
1214
+ assert_equal File.join(build_root, @gemhome), @installer.gem_home
1215
+ end
1216
+
1165
1217
  def test_shebang_arguments
1166
1218
  util_make_exec @spec, "#!/usr/bin/ruby -ws"
1167
1219
 
@@ -90,6 +90,19 @@ class TestGemLocalRemoteOptions < Gem::TestCase
90
90
  assert_equal original_sources, Gem.sources
91
91
  end
92
92
 
93
+ def test_short_source_option
94
+ @cmd.add_source_option
95
+
96
+ original_sources = Gem.sources.dup
97
+
98
+ source = URI.parse 'http://more-gems.example.com/'
99
+ @cmd.handle_options %W[-s #{source}]
100
+
101
+ original_sources << source
102
+
103
+ assert_equal original_sources, Gem.sources
104
+ end
105
+
93
106
  def test_update_sources_option
94
107
  @cmd.add_update_sources_option
95
108
 
@@ -621,7 +621,7 @@ class TestGemPackage < Gem::Package::TarTestCase
621
621
  end
622
622
 
623
623
  def test_verify_corrupt
624
- Tempfile.open 'corrupt' do |io|
624
+ tf = Tempfile.open 'corrupt' do |io|
625
625
  data = Gem.gzip 'a' * 10
626
626
  io.write \
627
627
  tar_file_header('metadata.gz', "\000x", 0644, data.length, Time.now)
@@ -636,7 +636,9 @@ class TestGemPackage < Gem::Package::TarTestCase
636
636
 
637
637
  assert_equal "tar is corrupt, name contains null byte in #{io.path}",
638
638
  e.message
639
+ io
639
640
  end
641
+ tf.close! if tf.respond_to? :close!
640
642
  end
641
643
 
642
644
  def test_verify_empty
@@ -31,6 +31,8 @@ class TestGemPackageTarHeader < Gem::Package::TarTestCase
31
31
  new_header = Gem::Package::TarHeader.from io
32
32
 
33
33
  assert_headers_equal @tar_header, new_header
34
+ ensure
35
+ io.close!
34
36
  end
35
37
 
36
38
  def test_initialize
@@ -20,6 +20,8 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
20
20
  end
21
21
 
22
22
  assert_equal 2, entries
23
+ ensure
24
+ io.close!
23
25
  end
24
26
 
25
27
  def test_rewind
@@ -30,7 +32,9 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
30
32
  content + "\0" * (512 - content.size)
31
33
  str << "\0" * 1024
32
34
 
33
- Gem::Package::TarReader.new(TempIO.new(str)) do |tar_reader|
35
+ io = TempIO.new(str)
36
+
37
+ Gem::Package::TarReader.new(io) do |tar_reader|
34
38
  3.times do
35
39
  tar_reader.rewind
36
40
  i = 0
@@ -41,6 +45,8 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
41
45
  assert_equal(1, i)
42
46
  end
43
47
  end
48
+ ensure
49
+ io.close!
44
50
  end
45
51
 
46
52
  def test_seek
@@ -58,6 +64,8 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
58
64
 
59
65
  assert_equal 0, io.pos
60
66
  end
67
+ ensure
68
+ io.close!
61
69
  end
62
70
 
63
71
  def test_seek_missing
@@ -73,6 +81,8 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
73
81
 
74
82
  assert_equal 0, io.pos
75
83
  end
84
+ ensure
85
+ io.close!
76
86
  end
77
87
 
78
88
  end
@@ -16,6 +16,15 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
16
16
  @entry = util_entry @tar
17
17
  end
18
18
 
19
+ def teardown
20
+ close_util_entry(@entry)
21
+ super
22
+ end
23
+
24
+ def close_util_entry(entry)
25
+ entry.instance_variable_get(:@io).close!
26
+ end
27
+
19
28
  def test_bytes_read
20
29
  assert_equal 0, @entry.bytes_read
21
30
 
@@ -77,12 +86,18 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
77
86
 
78
87
  def test_directory_eh
79
88
  assert_equal false, @entry.directory?
80
- assert_equal true, util_dir_entry.directory?
89
+ dir_ent = util_dir_entry
90
+ assert_equal true, dir_ent.directory?
91
+ ensure
92
+ close_util_entry(dir_ent) if dir_ent
81
93
  end
82
94
 
83
95
  def test_file_eh
84
96
  assert_equal true, @entry.file?
85
- assert_equal false, util_dir_entry.file?
97
+ dir_ent = util_dir_entry
98
+ assert_equal false, dir_ent.file?
99
+ ensure
100
+ close_util_entry(dir_ent) if dir_ent
86
101
  end
87
102
 
88
103
  def test_pos
@@ -14,6 +14,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
14
14
 
15
15
  def teardown
16
16
  @tar_writer.close unless @tar_writer.closed?
17
+ @io.close!
17
18
 
18
19
  super
19
20
  end
@@ -108,6 +108,7 @@ gems:
108
108
  end
109
109
 
110
110
  def teardown
111
+ self.class.stop_servers
111
112
  super
112
113
  Gem.configuration[:http_proxy] = nil
113
114
  @proxies.each_with_index {|k, i| ENV[k] = @old_proxies[i] }
@@ -774,6 +775,27 @@ gems:
774
775
  @proxy_server ||= start_server(PROXY_DATA)
775
776
  @enable_yaml = true
776
777
  @enable_zip = false
778
+ @ssl_server = nil
779
+ @ssl_server_thread = nil
780
+ end
781
+
782
+ def stop_servers
783
+ if @normal_server
784
+ @normal_server.kill.join
785
+ @normal_server = nil
786
+ end
787
+ if @proxy_server
788
+ @proxy_server.kill.join
789
+ @proxy_server = nil
790
+ end
791
+ if @ssl_server
792
+ @ssl_server.stop
793
+ @ssl_server = nil
794
+ end
795
+ if @ssl_server_thread
796
+ @ssl_server_thread.kill.join
797
+ @ssl_server_thread = nil
798
+ end
777
799
  end
778
800
 
779
801
  def normal_server_port
@@ -824,6 +846,8 @@ gems:
824
846
  raise
825
847
  end
826
848
  end
849
+ @ssl_server = server
850
+ @ssl_server_thread = t
827
851
  server
828
852
  end
829
853
 
@@ -70,6 +70,28 @@ class TestGemRequestSet < Gem::TestCase
70
70
  refute done_installing_ran
71
71
  end
72
72
 
73
+ def test_install_from_gemdeps_explain
74
+ spec_fetcher do |fetcher|
75
+ fetcher.gem 'a', 2
76
+ end
77
+
78
+ rs = Gem::RequestSet.new
79
+
80
+ open 'gem.deps.rb', 'w' do |io|
81
+ io.puts 'gem "a"'
82
+ io.flush
83
+
84
+ expected = <<-EXPECTED
85
+ Gems to install:
86
+ a-2
87
+ EXPECTED
88
+
89
+ assert_output expected do
90
+ rs.install_from_gemdeps :gemdeps => io.path, :explain => true
91
+ end
92
+ end
93
+ end
94
+
73
95
  def test_install_from_gemdeps_install_dir
74
96
  spec_fetcher do |fetcher|
75
97
  fetcher.gem 'a', 2
@@ -160,17 +182,43 @@ DEPENDENCIES
160
182
  assert_path_exists File.join @gemhome, 'specifications', 'b-1.gemspec'
161
183
  end
162
184
 
185
+ def test_install_from_gemdeps_version_mismatch
186
+ spec_fetcher do |fetcher|
187
+ fetcher.gem 'a', 2
188
+ end
189
+
190
+ rs = Gem::RequestSet.new
191
+ installed = []
192
+
193
+ open 'gem.deps.rb', 'w' do |io|
194
+ io.puts <<-GEM_DEPS
195
+ gem "a"
196
+ ruby "0"
197
+ GEM_DEPS
198
+
199
+ io.flush
200
+
201
+ rs.install_from_gemdeps :gemdeps => io.path do |req, installer|
202
+ installed << req.full_name
203
+ end
204
+ end
205
+
206
+ assert_includes installed, 'a-2'
207
+ end
208
+
163
209
  def test_load_gemdeps
164
210
  rs = Gem::RequestSet.new
165
211
 
166
- Tempfile.open 'gem.deps.rb' do |io|
212
+ tf = Tempfile.open 'gem.deps.rb' do |io|
167
213
  io.puts 'gem "a"'
168
214
  io.flush
169
215
 
170
216
  gem_deps = rs.load_gemdeps io.path
171
217
 
172
218
  assert_kind_of Gem::RequestSet::GemDependencyAPI, gem_deps
219
+ io
173
220
  end
221
+ tf.close! if tf.respond_to? :close!
174
222
 
175
223
  assert_equal [dep('a')], rs.dependencies
176
224
 
@@ -178,15 +226,33 @@ DEPENDENCIES
178
226
  assert rs.vendor_set
179
227
  end
180
228
 
181
- def test_load_gemdeps_without_groups
229
+ def test_load_gemdeps_installing
182
230
  rs = Gem::RequestSet.new
183
231
 
184
232
  Tempfile.open 'gem.deps.rb' do |io|
233
+ io.puts 'ruby "0"'
234
+ io.puts 'gem "a"'
235
+ io.flush
236
+
237
+ gem_deps = rs.load_gemdeps io.path, [], true
238
+
239
+ assert_kind_of Gem::RequestSet::GemDependencyAPI, gem_deps
240
+ end
241
+
242
+ assert_equal [dep('a')], rs.dependencies
243
+ end
244
+
245
+ def test_load_gemdeps_without_groups
246
+ rs = Gem::RequestSet.new
247
+
248
+ tf = Tempfile.open 'gem.deps.rb' do |io|
185
249
  io.puts 'gem "a", :group => :test'
186
250
  io.flush
187
251
 
188
252
  rs.load_gemdeps io.path, [:test]
253
+ io
189
254
  end
255
+ tf.close! if tf.respond_to? :close!
190
256
 
191
257
  assert_empty rs.dependencies
192
258
  end
@@ -251,7 +317,7 @@ DEPENDENCIES
251
317
 
252
318
  rs = Gem::RequestSet.new
253
319
 
254
- Tempfile.open 'gem.deps.rb' do |io|
320
+ tf = Tempfile.open 'gem.deps.rb' do |io|
255
321
  io.puts <<-gems_deps_rb
256
322
  gem "#{name}", :git => "#{repository}"
257
323
  gems_deps_rb
@@ -259,7 +325,9 @@ DEPENDENCIES
259
325
  io.flush
260
326
 
261
327
  rs.load_gemdeps io.path
328
+ io
262
329
  end
330
+ tf.close! if tf.respond_to? :close!
263
331
 
264
332
  res = rs.resolve
265
333
  assert_equal 1, res.size
@@ -312,7 +380,7 @@ DEPENDENCIES
312
380
 
313
381
  rs = Gem::RequestSet.new
314
382
 
315
- Tempfile.open 'gem.deps.rb' do |io|
383
+ tf = Tempfile.open 'gem.deps.rb' do |io|
316
384
  io.puts <<-gems_deps_rb
317
385
  gem "#{a_name}", :path => "#{a_directory}"
318
386
  gem "#{b_name}", :path => "#{b_directory}"
@@ -321,7 +389,9 @@ DEPENDENCIES
321
389
  io.flush
322
390
 
323
391
  rs.load_gemdeps io.path
392
+ io
324
393
  end
394
+ tf.close! if tf.respond_to? :close!
325
395
 
326
396
  res = rs.resolve
327
397
  assert_equal 2, res.size
@@ -520,7 +520,7 @@ class TestGemRequestSetGemDependencyAPI < Gem::TestCase
520
520
  end
521
521
 
522
522
  def test_load
523
- Tempfile.open 'gem.deps.rb' do |io|
523
+ tf = Tempfile.open 'gem.deps.rb' do |io|
524
524
  io.write <<-GEM_DEPS
525
525
  gem 'a'
526
526
 
@@ -535,7 +535,9 @@ end
535
535
  assert_equal gda, gda.load
536
536
 
537
537
  assert_equal [dep('a'), dep('b')], @set.dependencies
538
+ io
538
539
  end
540
+ tf.close! if tf.respond_to? :close!
539
541
  end
540
542
 
541
543
  def test_name_typo
@@ -690,6 +692,12 @@ end
690
692
  assert_equal "Your Ruby version is #{RUBY_VERSION}, but your gem.deps.rb requires 1.8.0", e.message
691
693
  end
692
694
 
695
+ def test_ruby_mismatch_installing
696
+ @gda.installing = true
697
+
698
+ assert @gda.ruby '1.8.0'
699
+ end
700
+
693
701
  def test_source
694
702
  sources = Gem.sources
695
703
 
@@ -368,6 +368,7 @@ GIT
368
368
  specs:
369
369
  a (2)
370
370
  b (>= 3)
371
+ c
371
372
 
372
373
  DEPENDENCIES
373
374
  a!
@@ -391,7 +392,8 @@ DEPENDENCIES
391
392
 
392
393
  assert_equal %w[a-2], git_set.specs.values.map { |s| s.full_name }
393
394
 
394
- assert_equal [dep('b', '>= 3')], git_set.specs.values.first.dependencies
395
+ assert_equal [dep('b', '>= 3'), dep('c')],
396
+ git_set.specs.values.first.dependencies
395
397
 
396
398
  expected = {
397
399
  'a' => %w[git://example/a.git master],
@@ -207,6 +207,14 @@ class TestGemRequirement < Gem::TestCase
207
207
  end
208
208
  end
209
209
 
210
+ def test_satisfied_by_eh_tilde_gt_v0
211
+ r = req "~> 0.0.1"
212
+
213
+ refute_satisfied_by "0.1.1", r
214
+ assert_satisfied_by "0.0.2", r
215
+ assert_satisfied_by "0.0.1", r
216
+ end
217
+
210
218
  def test_satisfied_by_eh_good
211
219
  assert_satisfied_by "0.2.33", "= 0.2.33"
212
220
  assert_satisfied_by "0.2.34", "> 0.2.33"