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.
- 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"
|