rubygems-update 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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"