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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CODE_OF_CONDUCT.md +40 -0
- data/CVE-2015-3900.txt +40 -0
- data/History.txt +173 -2
- data/Manifest.txt +14 -1
- data/Rakefile +36 -1
- data/lib/rubygems.rb +32 -14
- data/lib/rubygems/basic_specification.rb +31 -9
- data/lib/rubygems/commands/dependency_command.rb +25 -15
- data/lib/rubygems/commands/environment_command.rb +2 -0
- data/lib/rubygems/commands/help_command.rb +0 -10
- data/lib/rubygems/commands/install_command.rb +1 -1
- data/lib/rubygems/commands/list_command.rb +1 -1
- data/lib/rubygems/commands/pristine_command.rb +11 -1
- data/lib/rubygems/commands/query_command.rb +1 -1
- data/lib/rubygems/commands/sources_command.rb +1 -1
- data/lib/rubygems/commands/update_command.rb +2 -2
- data/lib/rubygems/config_file.rb +4 -4
- data/lib/rubygems/core_ext/kernel_require.rb +2 -2
- data/lib/rubygems/dependency.rb +9 -6
- data/lib/rubygems/dependency_list.rb +3 -0
- data/lib/rubygems/ext/builder.rb +2 -0
- data/lib/rubygems/ext/ext_conf_builder.rb +6 -1
- data/lib/rubygems/indexer.rb +26 -91
- data/lib/rubygems/installer.rb +58 -26
- data/lib/rubygems/installer_test_case.rb +2 -2
- data/lib/rubygems/package.rb +18 -6
- data/lib/rubygems/package/old.rb +2 -2
- data/lib/rubygems/package/tar_reader/entry.rb +7 -1
- data/lib/rubygems/package/tar_test_case.rb +12 -3
- data/lib/rubygems/package/tar_writer.rb +19 -1
- data/lib/rubygems/platform.rb +3 -2
- data/lib/rubygems/rdoc.rb +1 -2
- data/lib/rubygems/remote_fetcher.rb +25 -6
- data/lib/rubygems/request/connection_pools.rb +8 -4
- data/lib/rubygems/request_set.rb +3 -4
- data/lib/rubygems/request_set/gem_dependency_api.rb +2 -2
- data/lib/rubygems/request_set/lockfile.rb +1 -1
- data/lib/rubygems/request_set/lockfile/parser.rb +54 -43
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +16 -13
- data/lib/rubygems/resolver.rb +47 -242
- data/lib/rubygems/resolver/activation_request.rb +2 -1
- data/lib/rubygems/resolver/conflict.rb +0 -1
- data/lib/rubygems/resolver/dependency_request.rb +4 -1
- data/lib/rubygems/resolver/git_specification.rb +1 -2
- data/lib/rubygems/resolver/molinillo.rb +1 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +5 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +266 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +69 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +3 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +99 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +63 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +430 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +43 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +51 -0
- data/lib/rubygems/resolver/specification.rb +1 -1
- data/lib/rubygems/specification.rb +256 -86
- data/lib/rubygems/stub_specification.rb +37 -29
- data/lib/rubygems/test_case.rb +65 -28
- data/lib/rubygems/test_utilities.rb +18 -18
- data/lib/rubygems/text.rb +0 -2
- data/lib/rubygems/uninstaller.rb +1 -1
- data/lib/rubygems/util.rb +4 -4
- data/lib/rubygems/util/licenses.rb +309 -0
- data/lib/rubygems/util/list.rb +9 -21
- data/lib/rubygems/version.rb +24 -14
- data/test/rubygems/simple_gem.rb +1 -1
- data/test/rubygems/test_config.rb +10 -1
- data/test/rubygems/test_gem.rb +58 -11
- data/test/rubygems/test_gem_available_set.rb +2 -1
- data/test/rubygems/test_gem_commands_cleanup_command.rb +6 -5
- data/test/rubygems/test_gem_commands_dependency_command.rb +9 -1
- data/test/rubygems/test_gem_commands_install_command.rb +17 -28
- data/test/rubygems/test_gem_commands_mirror.rb +0 -13
- data/test/rubygems/test_gem_commands_outdated_command.rb +2 -3
- data/test/rubygems/test_gem_commands_pristine_command.rb +33 -5
- data/test/rubygems/test_gem_commands_query_command.rb +123 -158
- data/test/rubygems/test_gem_commands_server_command.rb +2 -2
- data/test/rubygems/test_gem_commands_specification_command.rb +4 -4
- data/test/rubygems/test_gem_commands_stale_command.rb +2 -0
- data/test/rubygems/test_gem_commands_uninstall_command.rb +5 -4
- data/test/rubygems/test_gem_commands_unpack_command.rb +4 -6
- data/test/rubygems/test_gem_commands_update_command.rb +22 -52
- data/test/rubygems/test_gem_commands_which_command.rb +1 -0
- data/test/rubygems/test_gem_config_file.rb +1 -1
- data/test/rubygems/test_gem_dependency.rb +7 -3
- data/test/rubygems/test_gem_dependency_installer.rb +5 -5
- data/test/rubygems/test_gem_doctor.rb +1 -1
- data/test/rubygems/test_gem_ext_builder.rb +2 -0
- data/test/rubygems/test_gem_ext_configure_builder.rb +8 -4
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +25 -21
- data/test/rubygems/test_gem_indexer.rb +4 -4
- data/test/rubygems/test_gem_install_update_options.rb +2 -2
- data/test/rubygems/test_gem_installer.rb +32 -26
- data/test/rubygems/test_gem_package.rb +46 -1
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +8 -1
- data/test/rubygems/test_gem_package_tar_writer.rb +10 -1
- data/test/rubygems/test_gem_package_task.rb +5 -2
- data/test/rubygems/test_gem_platform.rb +11 -0
- data/test/rubygems/test_gem_remote_fetcher.rb +64 -3
- data/test/rubygems/test_gem_request.rb +1 -1
- data/test/rubygems/test_gem_request_connection_pools.rb +10 -1
- data/test/rubygems/test_gem_request_set.rb +5 -8
- data/test/rubygems/test_gem_request_set_lockfile.rb +2 -4
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
- data/test/rubygems/test_gem_resolver.rb +12 -31
- data/test/rubygems/test_gem_resolver_git_specification.rb +1 -0
- data/test/rubygems/test_gem_resolver_installer_set.rb +7 -11
- data/test/rubygems/test_gem_resolver_lock_specification.rb +3 -2
- data/test/rubygems/test_gem_security_trust_dir.rb +2 -0
- data/test/rubygems/test_gem_server.rb +4 -0
- data/test/rubygems/test_gem_specification.rb +344 -61
- data/test/rubygems/test_gem_stream_ui.rb +6 -6
- data/test/rubygems/test_gem_stub_specification.rb +21 -6
- data/test/rubygems/test_gem_text.rb +2 -0
- data/test/rubygems/test_gem_uninstaller.rb +2 -1
- data/test/rubygems/test_gem_util.rb +8 -0
- data/test/rubygems/test_require.rb +156 -125
- data/util/generate_spdx_license_list.rb +21 -0
- data/util/update_bundled_ca_certificates.rb +2 -1
- metadata +42 -6
- metadata.gz.sig +0 -0
- data/lib/rubygems/util/stringio.rb +0 -34
@@ -38,7 +38,7 @@ class TestGemStreamUI < Gem::TestCase
|
|
38
38
|
skip 'TTY detection broken on windows' if
|
39
39
|
Gem.win_platform? unless RUBY_VERSION > '1.9.2'
|
40
40
|
|
41
|
-
timeout(1) do
|
41
|
+
Timeout.timeout(1) do
|
42
42
|
expected_answer = "Arthur, King of the Britons"
|
43
43
|
@in.string = "#{expected_answer}\n"
|
44
44
|
actual_answer = @sui.ask("What is your name?")
|
@@ -52,7 +52,7 @@ class TestGemStreamUI < Gem::TestCase
|
|
52
52
|
|
53
53
|
@in.tty = false
|
54
54
|
|
55
|
-
timeout(0.1) do
|
55
|
+
Timeout.timeout(0.1) do
|
56
56
|
answer = @sui.ask("what is your favorite color?")
|
57
57
|
assert_equal nil, answer
|
58
58
|
end
|
@@ -62,7 +62,7 @@ class TestGemStreamUI < Gem::TestCase
|
|
62
62
|
skip 'Always uses $stdin on windows' if
|
63
63
|
Gem.win_platform? unless RUBY_VERSION > '1.9.2'
|
64
64
|
|
65
|
-
timeout(1) do
|
65
|
+
Timeout.timeout(1) do
|
66
66
|
expected_answer = "Arthur, King of the Britons"
|
67
67
|
@in.string = "#{expected_answer}\n"
|
68
68
|
actual_answer = @sui.ask_for_password("What is your name?")
|
@@ -76,7 +76,7 @@ class TestGemStreamUI < Gem::TestCase
|
|
76
76
|
|
77
77
|
@in.tty = false
|
78
78
|
|
79
|
-
timeout(0.1) do
|
79
|
+
Timeout.timeout(0.1) do
|
80
80
|
answer = @sui.ask_for_password("what is the airspeed velocity of an unladen swallow?")
|
81
81
|
assert_equal nil, answer
|
82
82
|
end
|
@@ -88,7 +88,7 @@ class TestGemStreamUI < Gem::TestCase
|
|
88
88
|
|
89
89
|
@in.tty = false
|
90
90
|
|
91
|
-
timeout(0.1) do
|
91
|
+
Timeout.timeout(0.1) do
|
92
92
|
answer = @sui.ask_yes_no("do coconuts migrate?", false)
|
93
93
|
assert_equal false, answer
|
94
94
|
|
@@ -103,7 +103,7 @@ class TestGemStreamUI < Gem::TestCase
|
|
103
103
|
|
104
104
|
@in.tty = false
|
105
105
|
|
106
|
-
timeout(0.1) do
|
106
|
+
Timeout.timeout(0.1) do
|
107
107
|
assert_raises(Gem::OperationNotSupportedError) do
|
108
108
|
@sui.ask_yes_no("do coconuts migrate?")
|
109
109
|
end
|
@@ -9,7 +9,7 @@ class TestStubSpecification < Gem::TestCase
|
|
9
9
|
def setup
|
10
10
|
super
|
11
11
|
|
12
|
-
@foo = Gem::StubSpecification.
|
12
|
+
@foo = Gem::StubSpecification.gemspec_stub FOO
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_initialize
|
@@ -31,7 +31,7 @@ class TestStubSpecification < Gem::TestCase
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_initialize_missing_stubline
|
34
|
-
stub = Gem::StubSpecification.
|
34
|
+
stub = Gem::StubSpecification.gemspec_stub(BAR)
|
35
35
|
assert_equal "bar", stub.name
|
36
36
|
assert_equal Gem::Version.new("0.0.2"), stub.version
|
37
37
|
assert_equal Gem::Platform.new("ruby"), stub.platform
|
@@ -72,6 +72,21 @@ class TestStubSpecification < Gem::TestCase
|
|
72
72
|
assert_equal expected, stub.full_require_paths
|
73
73
|
end
|
74
74
|
|
75
|
+
def test_lib_dirs_glob
|
76
|
+
stub = stub_without_extension
|
77
|
+
|
78
|
+
assert_equal File.join(stub.full_gem_path, 'lib'), stub.lib_dirs_glob
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_matches_for_glob
|
82
|
+
stub = stub_without_extension
|
83
|
+
code_rb = File.join stub.gem_dir, 'lib', 'code.rb'
|
84
|
+
FileUtils.mkdir_p File.dirname code_rb
|
85
|
+
FileUtils.touch code_rb
|
86
|
+
|
87
|
+
assert_equal code_rb, stub.matches_for_glob('code*').first
|
88
|
+
end
|
89
|
+
|
75
90
|
def test_missing_extensions_eh
|
76
91
|
stub = stub_with_extension do |s|
|
77
92
|
extconf_rb = File.join s.gem_dir, s.extensions.first
|
@@ -103,7 +118,7 @@ class TestStubSpecification < Gem::TestCase
|
|
103
118
|
io.write spec.to_ruby_for_cache
|
104
119
|
end
|
105
120
|
|
106
|
-
default_spec = Gem::StubSpecification.
|
121
|
+
default_spec = Gem::StubSpecification.gemspec_stub spec.loaded_from
|
107
122
|
|
108
123
|
refute default_spec.missing_extensions?
|
109
124
|
end
|
@@ -125,7 +140,7 @@ class TestStubSpecification < Gem::TestCase
|
|
125
140
|
def test_to_spec_with_other_specs_loaded_does_not_warn
|
126
141
|
real_foo = util_spec @foo.name, @foo.version
|
127
142
|
real_foo.activate
|
128
|
-
bar = Gem::StubSpecification.
|
143
|
+
bar = Gem::StubSpecification.gemspec_stub BAR
|
129
144
|
refute_predicate Gem.loaded_specs, :empty?
|
130
145
|
assert bar.to_spec
|
131
146
|
end
|
@@ -164,7 +179,7 @@ end
|
|
164
179
|
|
165
180
|
io.flush
|
166
181
|
|
167
|
-
stub = Gem::StubSpecification.
|
182
|
+
stub = Gem::StubSpecification.gemspec_stub io.path
|
168
183
|
|
169
184
|
yield stub if block_given?
|
170
185
|
|
@@ -187,7 +202,7 @@ end
|
|
187
202
|
|
188
203
|
io.flush
|
189
204
|
|
190
|
-
stub = Gem::StubSpecification.
|
205
|
+
stub = Gem::StubSpecification.gemspec_stub io.path
|
191
206
|
|
192
207
|
yield stub if block_given?
|
193
208
|
|
@@ -64,6 +64,8 @@ Without the wrapping, the text might not look good in the RSS feed.
|
|
64
64
|
def test_levenshtein_distance_remove
|
65
65
|
assert_equal 3, levenshtein_distance("zentest", "zentestxxx")
|
66
66
|
assert_equal 3, levenshtein_distance("zentestxxx", "zentest")
|
67
|
+
assert_equal 13, levenshtein_distance("cat", "thundercatsarego")
|
68
|
+
assert_equal 13, levenshtein_distance("thundercatsarego", "cat")
|
67
69
|
end
|
68
70
|
|
69
71
|
def test_levenshtein_distance_replace
|
@@ -158,6 +158,7 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
158
158
|
uninstaller = Gem::Uninstaller.new nil
|
159
159
|
|
160
160
|
@spec.loaded_from = @spec.loaded_from.gsub @spec.full_name, '\&-legacy'
|
161
|
+
@spec.internal_init # blow out cache. but why did ^^ depend on cache?
|
161
162
|
@spec.platform = 'legacy'
|
162
163
|
|
163
164
|
assert_equal true, uninstaller.path_ok?(@gemhome, @spec)
|
@@ -236,7 +237,7 @@ create_makefile '#{@spec.name}'
|
|
236
237
|
use_ui @ui do
|
237
238
|
path = Gem::Package.build @spec
|
238
239
|
|
239
|
-
installer = Gem::Installer.
|
240
|
+
installer = Gem::Installer.at path
|
240
241
|
installer.install
|
241
242
|
end
|
242
243
|
|
@@ -27,5 +27,13 @@ class TestGemUtil < Gem::TestCase
|
|
27
27
|
assert_equal File.join(@tempdir, 'a'), enum.next
|
28
28
|
end
|
29
29
|
|
30
|
+
def test_linked_list_find
|
31
|
+
list = [1,2,3,4,5].inject(Gem::List.new(0)) { |m,o|
|
32
|
+
Gem::List.new o, m
|
33
|
+
}
|
34
|
+
assert_equal 5, list.find { |x| x == 5 }
|
35
|
+
assert_equal 4, list.find { |x| x == 4 }
|
36
|
+
end
|
37
|
+
|
30
38
|
end
|
31
39
|
|
@@ -26,11 +26,11 @@ class TestGemRequire < Gem::TestCase
|
|
26
26
|
def setup
|
27
27
|
super
|
28
28
|
|
29
|
+
@old_loaded_features = $LOADED_FEATURES.dup
|
29
30
|
assert_raises LoadError do
|
30
|
-
|
31
|
-
require 'test_gem_require_a'
|
32
|
-
end
|
31
|
+
require 'test_gem_require_a'
|
33
32
|
end
|
33
|
+
$LOADED_FEATURES.replace @old_loaded_features
|
34
34
|
end
|
35
35
|
|
36
36
|
def assert_require(path)
|
@@ -49,7 +49,39 @@ class TestGemRequire < Gem::TestCase
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
# Providing -I on the commandline should always beat gems
|
53
|
+
def test_dash_i_beats_gems
|
54
|
+
a1 = new_spec "a", "1", {"b" => "= 1"}, "lib/test_gem_require_a.rb"
|
55
|
+
b1 = new_spec "b", "1", {"c" => "> 0"}, "lib/b/c.rb"
|
56
|
+
c1 = new_spec "c", "1", nil, "lib/c/c.rb"
|
57
|
+
c2 = new_spec "c", "2", nil, "lib/c/c.rb"
|
58
|
+
|
59
|
+
install_specs c1, c2, b1, a1
|
60
|
+
|
61
|
+
dir = Dir.mktmpdir
|
62
|
+
dash_i_arg = File.join dir, 'lib'
|
63
|
+
|
64
|
+
c_rb = File.join dash_i_arg, 'b', 'c.rb'
|
65
|
+
|
66
|
+
FileUtils.mkdir_p File.dirname c_rb
|
67
|
+
File.open(c_rb, 'w') { |f| f.write "class Object; HELLO = 'world' end" }
|
68
|
+
|
69
|
+
lp = $LOAD_PATH.dup
|
70
|
+
|
71
|
+
# Pretend to provide a commandline argument that overrides a file in gem b
|
72
|
+
$LOAD_PATH.unshift dash_i_arg
|
73
|
+
|
74
|
+
assert_require 'test_gem_require_a'
|
75
|
+
assert_require 'b/c' # this should be required from -I
|
76
|
+
assert_equal "world", ::Object::HELLO
|
77
|
+
ensure
|
78
|
+
$LOAD_PATH.replace lp
|
79
|
+
Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
|
80
|
+
end
|
81
|
+
|
52
82
|
def test_concurrent_require
|
83
|
+
skip 'deadlock' if /^1\.8\./ =~ RUBY_VERSION
|
84
|
+
|
53
85
|
Object.const_set :FILE_ENTERED_LATCH, Latch.new(2)
|
54
86
|
Object.const_set :FILE_EXIT_LATCH, Latch.new(1)
|
55
87
|
|
@@ -73,6 +105,8 @@ class TestGemRequire < Gem::TestCase
|
|
73
105
|
assert t1.join, "thread 1 should exit"
|
74
106
|
assert t2.join, "thread 2 should exit"
|
75
107
|
ensure
|
108
|
+
return if $! # skipping
|
109
|
+
|
76
110
|
Object.send :remove_const, :FILE_ENTERED_LATCH
|
77
111
|
Object.send :remove_const, :FILE_EXIT_LATCH
|
78
112
|
end
|
@@ -82,16 +116,14 @@ class TestGemRequire < Gem::TestCase
|
|
82
116
|
b1 = new_spec "b", "1", nil, "lib/b/c.rb"
|
83
117
|
b2 = new_spec "b", "2", nil, "lib/b/c.rb"
|
84
118
|
|
85
|
-
install_specs
|
119
|
+
install_specs b1, b2, a1
|
86
120
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
assert_equal unresolved_names, []
|
121
|
+
assert_require 'test_gem_require_a'
|
122
|
+
assert_equal %w(a-1 b-1), loaded_spec_names
|
123
|
+
assert_equal unresolved_names, []
|
91
124
|
|
92
|
-
|
93
|
-
|
94
|
-
end
|
125
|
+
assert_require "b/c"
|
126
|
+
assert_equal %w(a-1 b-1), loaded_spec_names
|
95
127
|
end
|
96
128
|
|
97
129
|
def test_require_is_lazy_with_inexact_req
|
@@ -99,32 +131,28 @@ class TestGemRequire < Gem::TestCase
|
|
99
131
|
b1 = new_spec "b", "1", nil, "lib/b/c.rb"
|
100
132
|
b2 = new_spec "b", "2", nil, "lib/b/c.rb"
|
101
133
|
|
102
|
-
install_specs
|
134
|
+
install_specs b1, b2, a1
|
103
135
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
assert_equal unresolved_names, ["b (>= 1)"]
|
136
|
+
assert_require 'test_gem_require_a'
|
137
|
+
assert_equal %w(a-1), loaded_spec_names
|
138
|
+
assert_equal unresolved_names, ["b (>= 1)"]
|
108
139
|
|
109
|
-
|
110
|
-
|
111
|
-
end
|
140
|
+
assert_require "b/c"
|
141
|
+
assert_equal %w(a-1 b-2), loaded_spec_names
|
112
142
|
end
|
113
143
|
|
114
144
|
def test_require_is_not_lazy_with_one_possible
|
115
145
|
a1 = new_spec "a", "1", {"b" => ">= 1"}, "lib/test_gem_require_a.rb"
|
116
146
|
b1 = new_spec "b", "1", nil, "lib/b/c.rb"
|
117
147
|
|
118
|
-
install_specs
|
148
|
+
install_specs b1, a1
|
119
149
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
assert_equal unresolved_names, []
|
150
|
+
assert_require 'test_gem_require_a'
|
151
|
+
assert_equal %w(a-1 b-1), loaded_spec_names
|
152
|
+
assert_equal unresolved_names, []
|
124
153
|
|
125
|
-
|
126
|
-
|
127
|
-
end
|
154
|
+
assert_require "b/c"
|
155
|
+
assert_equal %w(a-1 b-1), loaded_spec_names
|
128
156
|
end
|
129
157
|
|
130
158
|
def test_require_can_use_a_pathname_object
|
@@ -132,129 +160,140 @@ class TestGemRequire < Gem::TestCase
|
|
132
160
|
|
133
161
|
install_specs a1
|
134
162
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
assert_equal unresolved_names, []
|
139
|
-
end
|
163
|
+
assert_require Pathname.new 'test_gem_require_a'
|
164
|
+
assert_equal %w(a-1), loaded_spec_names
|
165
|
+
assert_equal unresolved_names, []
|
140
166
|
end
|
141
167
|
|
142
168
|
def test_activate_via_require_respects_loaded_files
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
b1 = new_spec "b", "1", nil, "lib/benchmark.rb"
|
147
|
-
b2 = new_spec "b", "2", nil, "lib/benchmark.rb"
|
169
|
+
a1 = new_spec "a", "1", {"b" => ">= 1"}, "lib/test_gem_require_a.rb"
|
170
|
+
b1 = new_spec "b", "1", nil, "lib/benchmark.rb"
|
171
|
+
b2 = new_spec "b", "2", nil, "lib/benchmark.rb"
|
148
172
|
|
149
|
-
|
173
|
+
install_specs b1, b2, a1
|
150
174
|
|
151
|
-
|
152
|
-
|
175
|
+
require 'test_gem_require_a'
|
176
|
+
assert_equal unresolved_names, ["b (>= 1)"]
|
153
177
|
|
154
|
-
|
178
|
+
refute require('benchmark'), "benchmark should have already been loaded"
|
155
179
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
180
|
+
# We detected that we should activate b-2, so we did so, but
|
181
|
+
# then original_require decided "I've already got benchmark.rb" loaded.
|
182
|
+
# This case is fine because our lazy loading is provided exactly
|
183
|
+
# the same behavior as eager loading would have.
|
160
184
|
|
161
|
-
|
162
|
-
end
|
185
|
+
assert_equal %w(a-1 b-2), loaded_spec_names
|
163
186
|
end
|
164
187
|
|
165
188
|
def test_already_activated_direct_conflict
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
c2 = new_spec("c", "2", nil, "lib/d.rb")
|
189
|
+
a1 = new_spec "a", "1", { "b" => "> 0" }
|
190
|
+
b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb"
|
191
|
+
b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb"
|
192
|
+
c1 = new_spec "c", "1", nil, "lib/d.rb"
|
193
|
+
c2 = new_spec("c", "2", nil, "lib/d.rb")
|
172
194
|
|
173
|
-
|
195
|
+
install_specs c1, c2, b1, b2, a1
|
174
196
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
197
|
+
a1.activate
|
198
|
+
c1.activate
|
199
|
+
assert_equal %w(a-1 c-1), loaded_spec_names
|
200
|
+
assert_equal ["b (> 0)"], unresolved_names
|
179
201
|
|
180
|
-
|
202
|
+
assert require("ib")
|
181
203
|
|
182
|
-
|
183
|
-
|
184
|
-
end
|
204
|
+
assert_equal %w(a-1 b-1 c-1), loaded_spec_names
|
205
|
+
assert_equal [], unresolved_names
|
185
206
|
end
|
186
207
|
|
187
208
|
def test_multiple_gems_with_the_same_path
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
require("ib")
|
206
|
-
end
|
207
|
-
|
208
|
-
assert_equal "ib found in multiple gems: b, x", e.message
|
209
|
+
a1 = new_spec "a", "1", { "b" => "> 0", "x" => "> 0" }
|
210
|
+
b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb"
|
211
|
+
b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb"
|
212
|
+
x1 = new_spec "x", "1", nil, "lib/ib.rb"
|
213
|
+
x2 = new_spec "x", "2", nil, "lib/ib.rb"
|
214
|
+
c1 = new_spec "c", "1", nil, "lib/d.rb"
|
215
|
+
c2 = new_spec("c", "2", nil, "lib/d.rb")
|
216
|
+
|
217
|
+
install_specs c1, c2, x1, x2, b1, b2, a1
|
218
|
+
|
219
|
+
a1.activate
|
220
|
+
c1.activate
|
221
|
+
assert_equal %w(a-1 c-1), loaded_spec_names
|
222
|
+
assert_equal ["b (> 0)", "x (> 0)"], unresolved_names
|
223
|
+
|
224
|
+
e = assert_raises(Gem::LoadError) do
|
225
|
+
require("ib")
|
209
226
|
end
|
227
|
+
|
228
|
+
assert_equal "ib found in multiple gems: b, x", e.message
|
210
229
|
end
|
211
230
|
|
212
231
|
def test_unable_to_find_good_unresolved_version
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
b2 = new_spec "b", "2", { "c" => ">= 3" }, "lib/ib.rb"
|
232
|
+
a1 = new_spec "a", "1", { "b" => "> 0" }
|
233
|
+
b1 = new_spec "b", "1", { "c" => ">= 2" }, "lib/ib.rb"
|
234
|
+
b2 = new_spec "b", "2", { "c" => ">= 3" }, "lib/ib.rb"
|
217
235
|
|
218
|
-
|
219
|
-
|
220
|
-
|
236
|
+
c1 = new_spec "c", "1", nil, "lib/d.rb"
|
237
|
+
c2 = new_spec "c", "2", nil, "lib/d.rb"
|
238
|
+
c3 = new_spec "c", "3", nil, "lib/d.rb"
|
221
239
|
|
222
|
-
|
240
|
+
install_specs c1, c2, c3, b1, b2, a1
|
223
241
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
e = assert_raises(Gem::LoadError) do
|
230
|
-
require("ib")
|
231
|
-
end
|
242
|
+
a1.activate
|
243
|
+
c1.activate
|
244
|
+
assert_equal %w(a-1 c-1), loaded_spec_names
|
245
|
+
assert_equal ["b (> 0)"], unresolved_names
|
232
246
|
|
233
|
-
|
247
|
+
e = assert_raises(Gem::LoadError) do
|
248
|
+
require("ib")
|
234
249
|
end
|
250
|
+
|
251
|
+
assert_equal "unable to find a version of 'b' to activate", e.message
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_require_works_after_cleanup
|
255
|
+
a1 = new_default_spec "a", "1.0", nil, "a/b.rb"
|
256
|
+
b1 = new_default_spec "b", "1.0", nil, "b/c.rb"
|
257
|
+
b2 = new_default_spec "b", "2.0", nil, "b/d.rb"
|
258
|
+
|
259
|
+
install_default_gems a1
|
260
|
+
install_default_gems b1
|
261
|
+
install_default_gems b2
|
262
|
+
|
263
|
+
# Load default ruby gems fresh as if we've just started a ruby script.
|
264
|
+
Gem::Specification.reset
|
265
|
+
require 'rubygems'
|
266
|
+
Gem::Specification.stubs
|
267
|
+
|
268
|
+
# Remove an old default gem version directly from disk as if someone ran
|
269
|
+
# gem cleanup.
|
270
|
+
FileUtils.rm_rf(File.join @default_dir, "#{b1.full_name}")
|
271
|
+
FileUtils.rm_rf(File.join @default_spec_dir, "#{b1.full_name}.gemspec")
|
272
|
+
|
273
|
+
# Require gems that have not been removed.
|
274
|
+
assert_require 'a/b'
|
275
|
+
assert_equal %w(a-1.0), loaded_spec_names
|
276
|
+
assert_require 'b/d'
|
277
|
+
assert_equal %w(a-1.0 b-2.0), loaded_spec_names
|
235
278
|
end
|
236
279
|
|
237
280
|
def test_default_gem_only
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
assert_equal %w(default-2.0.0.0), loaded_spec_names
|
244
|
-
end
|
281
|
+
default_gem_spec = new_default_spec("default", "2.0.0.0",
|
282
|
+
nil, "default/gem.rb")
|
283
|
+
install_default_specs(default_gem_spec)
|
284
|
+
assert_require "default/gem"
|
285
|
+
assert_equal %w(default-2.0.0.0), loaded_spec_names
|
245
286
|
end
|
246
287
|
|
247
288
|
def test_default_gem_and_normal_gem
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
assert_equal %w(default-3.0), loaded_spec_names
|
257
|
-
end
|
289
|
+
default_gem_spec = new_default_spec("default", "2.0.0.0",
|
290
|
+
nil, "default/gem.rb")
|
291
|
+
install_default_specs(default_gem_spec)
|
292
|
+
normal_gem_spec = new_spec("default", "3.0", nil,
|
293
|
+
"lib/default/gem.rb")
|
294
|
+
install_specs(normal_gem_spec)
|
295
|
+
assert_require "default/gem"
|
296
|
+
assert_equal %w(default-3.0), loaded_spec_names
|
258
297
|
end
|
259
298
|
|
260
299
|
def loaded_spec_names
|
@@ -264,12 +303,4 @@ class TestGemRequire < Gem::TestCase
|
|
264
303
|
def unresolved_names
|
265
304
|
Gem::Specification.unresolved_deps.values.map(&:to_s).sort
|
266
305
|
end
|
267
|
-
|
268
|
-
def save_loaded_features
|
269
|
-
old_loaded_features = $LOADED_FEATURES.dup
|
270
|
-
yield
|
271
|
-
ensure
|
272
|
-
$LOADED_FEATURES.replace old_loaded_features
|
273
|
-
end
|
274
|
-
|
275
306
|
end
|