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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING +14 -2
- data/History.txt +63 -0
- data/Rakefile +68 -91
- data/lib/rubygems.rb +5 -3
- data/lib/rubygems/command_manager.rb +1 -0
- data/lib/rubygems/commands/contents_command.rb +23 -2
- data/lib/rubygems/commands/install_command.rb +8 -0
- data/lib/rubygems/commands/open_command.rb +1 -8
- data/lib/rubygems/commands/uninstall_command.rb +9 -1
- data/lib/rubygems/commands/update_command.rb +1 -1
- data/lib/rubygems/core_ext/kernel_gem.rb +8 -1
- data/lib/rubygems/core_ext/kernel_require.rb +12 -22
- data/lib/rubygems/defaults.rb +17 -5
- data/lib/rubygems/dependency.rb +7 -1
- data/lib/rubygems/dependency_installer.rb +3 -0
- data/lib/rubygems/ext/ext_conf_builder.rb +13 -11
- data/lib/rubygems/install_update_options.rb +13 -0
- data/lib/rubygems/installer.rb +36 -20
- data/lib/rubygems/installer_test_case.rb +2 -0
- data/lib/rubygems/local_remote_options.rb +1 -1
- data/lib/rubygems/name_tuple.rb +1 -1
- data/lib/rubygems/request_set.rb +14 -3
- data/lib/rubygems/request_set/gem_dependency_api.rb +12 -0
- data/lib/rubygems/request_set/lockfile.rb +3 -1
- data/lib/rubygems/resolver.rb +15 -0
- data/lib/rubygems/resolver/best_set.rb +28 -0
- data/lib/rubygems/resolver/conflict.rb +45 -7
- data/lib/rubygems/resolver/git_specification.rb +24 -0
- data/lib/rubygems/resolver/lock_specification.rb +22 -0
- data/lib/rubygems/source.rb +2 -0
- data/lib/rubygems/source/git.rb +1 -1
- data/lib/rubygems/source/installed.rb +2 -1
- data/lib/rubygems/specification.rb +16 -15
- data/lib/rubygems/test_case.rb +9 -5
- data/test/rubygems/test_gem.rb +72 -2
- data/test/rubygems/test_gem_commands_contents_command.rb +46 -3
- data/test/rubygems/test_gem_commands_install_command.rb +32 -0
- data/test/rubygems/test_gem_commands_uninstall_command.rb +18 -0
- data/test/rubygems/test_gem_dependency.rb +23 -0
- data/test/rubygems/test_gem_dependency_installer.rb +17 -0
- data/test/rubygems/test_gem_ext_builder.rb +12 -1
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +2 -2
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +24 -8
- data/test/rubygems/test_gem_install_update_options.rb +16 -0
- data/test/rubygems/test_gem_installer.rb +52 -0
- data/test/rubygems/test_gem_local_remote_options.rb +13 -0
- data/test/rubygems/test_gem_package.rb +3 -1
- data/test/rubygems/test_gem_package_tar_header.rb +2 -0
- data/test/rubygems/test_gem_package_tar_reader.rb +11 -1
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +17 -2
- data/test/rubygems/test_gem_package_tar_writer.rb +1 -0
- data/test/rubygems/test_gem_remote_fetcher.rb +24 -0
- data/test/rubygems/test_gem_request_set.rb +74 -4
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +9 -1
- data/test/rubygems/test_gem_request_set_lockfile.rb +3 -1
- data/test/rubygems/test_gem_requirement.rb +8 -0
- data/test/rubygems/test_gem_resolver.rb +39 -0
- data/test/rubygems/test_gem_resolver_best_set.rb +57 -0
- data/test/rubygems/test_gem_resolver_conflict.rb +22 -10
- data/test/rubygems/test_gem_resolver_git_specification.rb +12 -0
- data/test/rubygems/test_gem_source_git.rb +6 -2
- data/test/rubygems/test_gem_source_installed.rb +8 -0
- data/test/rubygems/test_gem_source_lock.rb +2 -2
- data/test/rubygems/test_gem_source_vendor.rb +4 -0
- data/test/rubygems/test_kernel.rb +6 -0
- data/test/rubygems/test_require.rb +60 -0
- metadata +5 -5
- 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
|
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
@@ -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
|
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')],
|
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"
|