rubygems-update 2.2.5 → 2.3.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 (135) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.autotest +4 -1
  5. data/CONTRIBUTING +20 -0
  6. data/History.txt +117 -14
  7. data/Manifest.txt +11 -2
  8. data/README.rdoc +1 -1
  9. data/Rakefile +0 -3
  10. data/lib/rubygems.rb +31 -11
  11. data/lib/rubygems/available_set.rb +1 -1
  12. data/lib/rubygems/basic_specification.rb +20 -10
  13. data/lib/rubygems/command.rb +4 -1
  14. data/lib/rubygems/commands/cert_command.rb +11 -13
  15. data/lib/rubygems/commands/cleanup_command.rb +2 -2
  16. data/lib/rubygems/commands/dependency_command.rb +2 -2
  17. data/lib/rubygems/commands/environment_command.rb +5 -2
  18. data/lib/rubygems/commands/help_command.rb +199 -20
  19. data/lib/rubygems/commands/install_command.rb +40 -10
  20. data/lib/rubygems/commands/list_command.rb +2 -2
  21. data/lib/rubygems/commands/open_command.rb +81 -0
  22. data/lib/rubygems/commands/search_command.rb +5 -5
  23. data/lib/rubygems/commands/setup_command.rb +1 -1
  24. data/lib/rubygems/commands/update_command.rb +8 -5
  25. data/lib/rubygems/commands/yank_command.rb +8 -13
  26. data/lib/rubygems/config_file.rb +13 -2
  27. data/lib/rubygems/dependency.rb +29 -16
  28. data/lib/rubygems/dependency_installer.rb +44 -10
  29. data/lib/rubygems/doctor.rb +1 -1
  30. data/lib/rubygems/errors.rb +30 -0
  31. data/lib/rubygems/exceptions.rb +20 -0
  32. data/lib/rubygems/ext/builder.rb +1 -1
  33. data/lib/rubygems/gemcutter_utilities.rb +1 -1
  34. data/lib/rubygems/installer.rb +4 -4
  35. data/lib/rubygems/name_tuple.rb +3 -1
  36. data/lib/rubygems/package.rb +27 -14
  37. data/lib/rubygems/package/file_source.rb +33 -0
  38. data/lib/rubygems/package/io_source.rb +45 -0
  39. data/lib/rubygems/package/old.rb +5 -5
  40. data/lib/rubygems/package/source.rb +3 -0
  41. data/lib/rubygems/platform.rb +2 -1
  42. data/lib/rubygems/rdoc.rb +1 -1
  43. data/lib/rubygems/remote_fetcher.rb +59 -18
  44. data/lib/rubygems/request.rb +71 -101
  45. data/lib/rubygems/request/connection_pools.rb +77 -0
  46. data/lib/rubygems/request/http_pool.rb +38 -0
  47. data/lib/rubygems/request/https_pool.rb +10 -0
  48. data/lib/rubygems/request_set.rb +65 -20
  49. data/lib/rubygems/request_set/gem_dependency_api.rb +234 -14
  50. data/lib/rubygems/request_set/lockfile.rb +65 -22
  51. data/lib/rubygems/requirement.rb +3 -0
  52. data/lib/rubygems/resolver.rb +33 -16
  53. data/lib/rubygems/resolver/activation_request.rb +7 -0
  54. data/lib/rubygems/resolver/api_set.rb +12 -2
  55. data/lib/rubygems/resolver/api_specification.rb +6 -0
  56. data/lib/rubygems/resolver/composed_set.rb +4 -0
  57. data/lib/rubygems/resolver/dependency_request.rb +20 -1
  58. data/lib/rubygems/resolver/git_set.rb +1 -1
  59. data/lib/rubygems/resolver/git_specification.rb +1 -1
  60. data/lib/rubygems/resolver/index_set.rb +3 -1
  61. data/lib/rubygems/resolver/installed_specification.rb +19 -1
  62. data/lib/rubygems/resolver/installer_set.rb +84 -4
  63. data/lib/rubygems/resolver/local_specification.rb +25 -0
  64. data/lib/rubygems/resolver/lock_set.rb +13 -9
  65. data/lib/rubygems/resolver/lock_specification.rb +1 -1
  66. data/lib/rubygems/resolver/set.rb +6 -0
  67. data/lib/rubygems/resolver/spec_specification.rb +0 -2
  68. data/lib/rubygems/resolver/specification.rb +23 -2
  69. data/lib/rubygems/resolver/vendor_set.rb +1 -1
  70. data/lib/rubygems/resolver/vendor_specification.rb +1 -1
  71. data/lib/rubygems/security/policy.rb +1 -0
  72. data/lib/rubygems/server.rb +36 -1
  73. data/lib/rubygems/source.rb +6 -2
  74. data/lib/rubygems/source/git.rb +1 -1
  75. data/lib/rubygems/source/installed.rb +4 -0
  76. data/lib/rubygems/source/specific_file.rb +6 -1
  77. data/lib/rubygems/spec_fetcher.rb +6 -13
  78. data/lib/rubygems/specification.rb +91 -63
  79. data/lib/rubygems/stub_specification.rb +9 -0
  80. data/lib/rubygems/test_case.rb +4 -2
  81. data/lib/rubygems/text.rb +15 -5
  82. data/lib/rubygems/uninstaller.rb +4 -1
  83. data/lib/rubygems/user_interaction.rb +8 -0
  84. data/lib/rubygems/version.rb +5 -1
  85. data/test/rubygems/test_gem.rb +88 -2
  86. data/test/rubygems/test_gem_available_set.rb +11 -8
  87. data/test/rubygems/test_gem_command.rb +55 -0
  88. data/test/rubygems/test_gem_commands_cert_command.rb +1 -0
  89. data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
  90. data/test/rubygems/test_gem_commands_help_command.rb +7 -0
  91. data/test/rubygems/test_gem_commands_install_command.rb +71 -4
  92. data/test/rubygems/test_gem_commands_open_command.rb +46 -0
  93. data/test/rubygems/test_gem_commands_setup_command.rb +9 -0
  94. data/test/rubygems/test_gem_commands_update_command.rb +48 -0
  95. data/test/rubygems/test_gem_commands_yank_command.rb +2 -2
  96. data/test/rubygems/test_gem_config_file.rb +19 -7
  97. data/test/rubygems/test_gem_dependency.rb +86 -2
  98. data/test/rubygems/test_gem_dependency_installer.rb +36 -164
  99. data/test/rubygems/test_gem_gemcutter_utilities.rb +9 -0
  100. data/test/rubygems/test_gem_installer.rb +6 -1
  101. data/test/rubygems/test_gem_name_tuple.rb +7 -0
  102. data/test/rubygems/test_gem_package.rb +17 -0
  103. data/test/rubygems/test_gem_remote_fetcher.rb +65 -46
  104. data/test/rubygems/test_gem_request.rb +75 -61
  105. data/test/rubygems/test_gem_request_connection_pools.rb +83 -0
  106. data/test/rubygems/test_gem_request_set.rb +156 -1
  107. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +72 -27
  108. data/test/rubygems/test_gem_request_set_lockfile.rb +335 -0
  109. data/test/rubygems/test_gem_requirement.rb +5 -0
  110. data/test/rubygems/test_gem_resolver.rb +91 -2
  111. data/test/rubygems/test_gem_resolver_activation_request.rb +10 -0
  112. data/test/rubygems/test_gem_resolver_api_set.rb +2 -2
  113. data/test/rubygems/test_gem_resolver_api_specification.rb +40 -0
  114. data/test/rubygems/test_gem_resolver_composed_set.rb +14 -0
  115. data/test/rubygems/test_gem_resolver_dependency_request.rb +55 -0
  116. data/test/rubygems/test_gem_resolver_git_set.rb +26 -0
  117. data/test/rubygems/test_gem_resolver_index_set.rb +28 -2
  118. data/test/rubygems/test_gem_resolver_installer_set.rb +143 -0
  119. data/test/rubygems/test_gem_resolver_lock_set.rb +12 -6
  120. data/test/rubygems/test_gem_resolver_lock_specification.rb +1 -1
  121. data/test/rubygems/test_gem_resolver_specification.rb +32 -0
  122. data/test/rubygems/test_gem_resolver_vendor_set.rb +14 -0
  123. data/test/rubygems/test_gem_security_policy.rb +2 -2
  124. data/test/rubygems/test_gem_server.rb +69 -4
  125. data/test/rubygems/test_gem_source.rb +4 -1
  126. data/test/rubygems/test_gem_source_git.rb +15 -0
  127. data/test/rubygems/test_gem_source_specific_file.rb +4 -0
  128. data/test/rubygems/test_gem_specification.rb +82 -27
  129. data/test/rubygems/test_gem_stub_specification.rb +61 -23
  130. data/test/rubygems/test_gem_uninstaller.rb +23 -0
  131. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +32 -0
  132. metadata +187 -33
  133. metadata.gz.sig +0 -0
  134. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  135. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +0 -32
@@ -0,0 +1,46 @@
1
+ require 'rubygems/test_case'
2
+ require 'rubygems/commands/open_command'
3
+
4
+ class TestGemCommandsOpenCommand < Gem::TestCase
5
+
6
+ def setup
7
+ super
8
+
9
+ @cmd = Gem::Commands::OpenCommand.new
10
+ end
11
+
12
+ def gem name
13
+ spec = quick_gem name do |gem|
14
+ gem.files = %W[lib/#{name}.rb Rakefile]
15
+ end
16
+ write_file File.join(*%W[gems #{spec.full_name} lib #{name}.rb])
17
+ write_file File.join(*%W[gems #{spec.full_name} Rakefile])
18
+ end
19
+
20
+ def test_execute
21
+ @cmd.options[:args] = %w[foo]
22
+ @cmd.options[:editor] = "#{Gem.ruby} -e0 --"
23
+
24
+ gem 'foo'
25
+
26
+ use_ui @ui do
27
+ @cmd.execute
28
+ end
29
+
30
+ assert_equal "", @ui.error
31
+ end
32
+
33
+ def test_execute_bad_gem
34
+ @cmd.options[:args] = %w[foo]
35
+
36
+ assert_raises Gem::MockGemUi::TermError do
37
+ use_ui @ui do
38
+ @cmd.execute
39
+ end
40
+ end
41
+
42
+ assert_match %r|Unable to find gem 'foo'|, @ui.output
43
+ assert_equal "", @ui.error
44
+ end
45
+
46
+ end
@@ -111,6 +111,12 @@ class TestGemCommandsSetupCommand < Gem::TestCase
111
111
  end
112
112
 
113
113
  expected = <<-EXPECTED
114
+ === #{Gem::VERSION} / 2013-03-26
115
+
116
+ * Bug fixes:
117
+ * Fixed release note display for LANG=C when installing rubygems
118
+ * π is tasty
119
+
114
120
  === 2.0.2 / 2013-03-06
115
121
 
116
122
  * Bug fixes:
@@ -118,6 +124,9 @@ class TestGemCommandsSetupCommand < Gem::TestCase
118
124
 
119
125
  EXPECTED
120
126
 
127
+ output = @ui.output
128
+ output.force_encoding Encoding::UTF_8 if Object.const_defined? :Encoding
129
+
121
130
  assert_equal expected, @ui.output
122
131
  ensure
123
132
  capture_io do
@@ -52,6 +52,30 @@ class TestGemCommandsUpdateCommand < Gem::TestCase
52
52
  assert_empty out
53
53
  end
54
54
 
55
+ def test_execute_multiple
56
+ spec_fetcher do |fetcher|
57
+ fetcher.gem 'a', 2
58
+ fetcher.gem 'ab', 2
59
+
60
+ fetcher.clear
61
+
62
+ fetcher.spec 'a', 1
63
+ fetcher.spec 'ab', 1
64
+ end
65
+
66
+ @cmd.options[:args] = %w[a]
67
+
68
+ use_ui @ui do
69
+ @cmd.execute
70
+ end
71
+
72
+ out = @ui.output.split "\n"
73
+ assert_equal "Updating installed gems", out.shift
74
+ assert_equal "Updating a", out.shift
75
+ assert_equal "Gems updated: a", out.shift
76
+ assert_empty out
77
+ end
78
+
55
79
  def test_execute_system
56
80
  spec_fetcher do |fetcher|
57
81
  fetcher.gem 'rubygems-update', 9 do |s| s.files = %w[setup.rb] end
@@ -266,6 +290,30 @@ class TestGemCommandsUpdateCommand < Gem::TestCase
266
290
  assert_empty out
267
291
  end
268
292
 
293
+ def test_execute_named_some_up_to_date
294
+ spec_fetcher do |fetcher|
295
+ fetcher.gem 'a', 2
296
+ fetcher.clear
297
+ fetcher.spec 'a', 1
298
+
299
+ fetcher.spec 'b', 2
300
+ end
301
+
302
+ @cmd.options[:args] = %w[a b]
303
+
304
+ use_ui @ui do
305
+ @cmd.execute
306
+ end
307
+
308
+ out = @ui.output.split "\n"
309
+ assert_equal "Updating installed gems", out.shift
310
+ assert_equal "Updating a", out.shift
311
+ assert_equal "Gems updated: a", out.shift
312
+ assert_equal "Gems already up-to-date: b", out.shift
313
+
314
+ assert_empty out
315
+ end
316
+
269
317
  def test_execute_named_up_to_date
270
318
  spec_fetcher do |fetcher|
271
319
  fetcher.spec 'a', 2
@@ -18,7 +18,7 @@ class TestGemCommandsYankCommand < Gem::TestCase
18
18
  @cmd.handle_options %w[a --version 1.0 --platform x86-darwin -k KEY]
19
19
 
20
20
  assert_equal %w[a], @cmd.options[:args]
21
- assert_equal 'KEY', @cmd.options[:key]
21
+ assert_equal :KEY, @cmd.options[:key]
22
22
  assert_nil @cmd.options[:platform]
23
23
  assert_equal req('= 1.0'), @cmd.options[:version]
24
24
  end
@@ -61,7 +61,7 @@ class TestGemCommandsYankCommand < Gem::TestCase
61
61
 
62
62
  @cmd.options[:args] = %w[a]
63
63
  @cmd.options[:version] = req('= 1.0')
64
- @cmd.options[:key] = 'KEY'
64
+ @cmd.options[:key] = :KEY
65
65
 
66
66
  use_ui @ui do
67
67
  @cmd.execute
@@ -234,16 +234,19 @@ if you believe they were disclosed to a third party.
234
234
  end
235
235
 
236
236
  def test_handle_arguments_debug
237
- old_dollar_DEBUG = $DEBUG
238
237
  assert_equal false, $DEBUG
239
238
 
240
239
  args = %w[--debug]
241
240
 
242
- @cfg.handle_arguments args
241
+ _, err = capture_io do
242
+ @cfg.handle_arguments args
243
+ end
244
+
245
+ assert_match 'NOTE', err
243
246
 
244
247
  assert_equal true, $DEBUG
245
248
  ensure
246
- $DEBUG = old_dollar_DEBUG
249
+ $DEBUG = false
247
250
  end
248
251
 
249
252
  def test_handle_arguments_override
@@ -377,6 +380,9 @@ if you believe they were disclosed to a third party.
377
380
  fp.puts ":verbose: false"
378
381
  fp.puts ":sources:"
379
382
  fp.puts " - http://more-gems.example.com"
383
+ fp.puts ":ssl_verify_mode: 2"
384
+ fp.puts ":ssl_ca_cert: /nonexistent/ca_cert.pem"
385
+ fp.puts ":ssl_client_cert: /nonexistent/client_cert.pem"
380
386
  fp.puts "install: --wrappers"
381
387
  end
382
388
 
@@ -399,6 +405,10 @@ if you believe they were disclosed to a third party.
399
405
  assert_equal false, @cfg.update_sources, 'update_sources'
400
406
  assert_equal false, @cfg.verbose, 'verbose'
401
407
 
408
+ assert_equal 2, @cfg.ssl_verify_mode
409
+ assert_equal '/nonexistent/ca_cert.pem', @cfg.ssl_ca_cert
410
+ assert_equal '/nonexistent/client_cert.pem', @cfg.ssl_client_cert
411
+
402
412
  assert_equal '--wrappers --no-rdoc', @cfg[:install], 'install'
403
413
 
404
414
  assert_equal %w[http://even-more-gems.example.com], Gem.sources
@@ -409,11 +419,13 @@ if you believe they were disclosed to a third party.
409
419
  fp.puts "some-non-yaml-hash-string"
410
420
  end
411
421
 
412
- # Avoid writing stuff to output when running tests
413
- Gem::ConfigFile.class_eval { def warn(args); end }
422
+ begin
423
+ verbose, $VERBOSE = $VERBOSE, nil
414
424
 
415
- # This should not raise exception
416
- util_config_file
425
+ util_config_file
426
+ ensure
427
+ $VERBOSE = verbose
428
+ end
417
429
  end
418
430
 
419
431
  def test_load_ssl_verify_mode_from_config
@@ -2,6 +2,7 @@ require 'rubygems/test_case'
2
2
  require 'rubygems/dependency'
3
3
 
4
4
  class TestGemDependency < Gem::TestCase
5
+
5
6
  def test_initialize
6
7
  d = dep "pkg", "> 1.0"
7
8
 
@@ -28,6 +29,16 @@ class TestGemDependency < Gem::TestCase
28
29
  assert_equal req(">= 0"), d.requirement
29
30
  end
30
31
 
32
+ def test_initialize_prerelease
33
+ d = dep 'd', '1.a'
34
+
35
+ assert d.prerelease?
36
+
37
+ d = dep 'd', '= 1.a'
38
+
39
+ assert d.prerelease?
40
+ end
41
+
31
42
  def test_initialize_type
32
43
  assert_equal :runtime, dep("pkg").type
33
44
  assert_equal :development, dep("pkg", [], :development).type
@@ -115,6 +126,79 @@ class TestGemDependency < Gem::TestCase
115
126
  refute_equal dep("pkg", :development), dep("pkg", :runtime), "type"
116
127
  end
117
128
 
129
+ def test_match_eh_name_tuple
130
+ a_dep = dep 'a'
131
+
132
+ a_tup = Gem::NameTuple.new 'a', 1
133
+ b_tup = Gem::NameTuple.new 'b', 2
134
+ c_tup = Gem::NameTuple.new 'c', '2.a'
135
+
136
+ assert a_dep.match? a_tup
137
+ refute a_dep.match? b_tup
138
+
139
+ b_dep = dep 'b', '>= 3'
140
+
141
+ refute b_dep.match? b_tup
142
+
143
+ c_dep = dep 'c', '>= 1'
144
+
145
+ refute c_dep.match? c_tup
146
+
147
+ c_dep = dep 'c'
148
+
149
+ refute c_dep.match? c_tup
150
+
151
+ c_dep = dep 'c', '2.a'
152
+
153
+ assert c_dep.match? c_tup
154
+ end
155
+
156
+ def test_match_eh_specification
157
+ a_dep = dep 'a'
158
+
159
+ a_spec = util_spec 'a', 1
160
+ b_spec = util_spec 'b', 2
161
+ c_spec = util_spec 'c', '2.a'
162
+
163
+ assert a_dep.match? a_spec
164
+ refute a_dep.match? b_spec
165
+
166
+ b_dep = dep 'b', '>= 3'
167
+
168
+ refute b_dep.match? b_spec
169
+
170
+ c_dep = dep 'c', '>= 1'
171
+
172
+ refute c_dep.match? c_spec
173
+
174
+ c_dep = dep 'c'
175
+
176
+ refute c_dep.match? c_spec
177
+
178
+ c_dep = dep 'c', '2.a'
179
+
180
+ assert c_dep.match? c_spec
181
+ end
182
+
183
+ def test_matches_spec_eh
184
+ spec = util_spec 'b', 2
185
+
186
+ refute dep('a') .matches_spec?(spec), 'name mismatch'
187
+ assert dep('b') .matches_spec?(spec), 'name match'
188
+ refute dep('b', '= 1') .matches_spec?(spec), 'requirement mismatch'
189
+ assert dep('b', '~> 2').matches_spec?(spec), 'requirement match'
190
+ end
191
+
192
+ def test_matches_spec_eh_prerelease
193
+ spec = util_spec 'b', '2.1.a'
194
+
195
+ refute dep('a') .matches_spec?(spec), 'name mismatch'
196
+ assert dep('b') .matches_spec?(spec), 'name match'
197
+ refute dep('b', '= 1') .matches_spec?(spec), 'requirement mismatch'
198
+ assert dep('b', '~> 2') .matches_spec?(spec), 'requirement match'
199
+ assert dep('b', '~> 2.a').matches_spec?(spec), 'prerelease requirement'
200
+ end
201
+
118
202
  def test_merge
119
203
  a1 = dep 'a', '~> 1.0'
120
204
  a2 = dep 'a', '= 1.0'
@@ -197,7 +281,7 @@ class TestGemDependency < Gem::TestCase
197
281
  dep.to_specs
198
282
  end
199
283
 
200
- assert_equal "Could not find 'a' (= 2.0) - did find: [a-1.0]", e.message
284
+ assert_match "Could not find 'a' (= 2.0) - did find: [a-1.0]", e.message
201
285
  end
202
286
 
203
287
  def test_to_specs_indicates_total_gem_set_size
@@ -215,7 +299,7 @@ class TestGemDependency < Gem::TestCase
215
299
  dep.to_specs
216
300
  end
217
301
 
218
- assert_equal "Could not find 'b' (= 2.0) among 1 total gem(s)", e.message
302
+ assert_match "Could not find 'b' (= 2.0) among 1 total gem(s)", e.message
219
303
  end
220
304
 
221
305
 
@@ -138,7 +138,9 @@ class TestGemDependencyInstaller < Gem::TestCase
138
138
 
139
139
  dep = Gem::Dependency.new "p"
140
140
  inst = Gem::DependencyInstaller.new
141
- inst.install dep
141
+ assert_raises Gem::UnsatisfiableDependencyError do
142
+ inst.install dep
143
+ end
142
144
 
143
145
  assert_equal %w[], Gem::Specification.map(&:full_name)
144
146
  assert_equal [], inst.installed_gems
@@ -291,7 +293,7 @@ class TestGemDependencyInstaller < Gem::TestCase
291
293
 
292
294
  Gem.done_installing do |installer, specs|
293
295
  done_installing_ran = true
294
- assert_equal inst, installer
296
+ refute_nil installer
295
297
  assert_equal [@a1, @b1], specs
296
298
  end
297
299
 
@@ -455,6 +457,20 @@ class TestGemDependencyInstaller < Gem::TestCase
455
457
  assert_equal %w[a-1], inst.installed_gems.map { |s| s.full_name }
456
458
  end
457
459
 
460
+ def test_install_local_prerelease
461
+ util_setup_gems
462
+
463
+ FileUtils.mv @a1_pre_gem, @tempdir
464
+ inst = nil
465
+
466
+ Dir.chdir @tempdir do
467
+ inst = Gem::DependencyInstaller.new :domain => :local
468
+ inst.install 'a-1.a.gem'
469
+ end
470
+
471
+ assert_equal %w[a-1.a], inst.installed_gems.map { |s| s.full_name }
472
+ end
473
+
458
474
  def test_install_local_dependency
459
475
  util_setup_gems
460
476
 
@@ -682,7 +698,7 @@ class TestGemDependencyInstaller < Gem::TestCase
682
698
  inst.install 'b'
683
699
  end
684
700
 
685
- expected = "Unable to resolve dependency: 'b (= 1)' requires 'a (>= 0)'"
701
+ expected = "Unable to resolve dependency: 'b (>= 0)' requires 'a (>= 0)'"
686
702
  assert_equal expected, e.message
687
703
  end
688
704
 
@@ -796,10 +812,10 @@ class TestGemDependencyInstaller < Gem::TestCase
796
812
  s.platform = Gem::Platform.new %w[cpu other_platform 1]
797
813
  end
798
814
 
799
- util_clear_gems
800
-
801
815
  si = util_setup_spec_fetcher @a1, a2_o
802
816
 
817
+ util_clear_gems
818
+
803
819
  @fetcher.data['http://gems.example.com/gems/yaml'] = si.to_yaml
804
820
 
805
821
  a1_data = nil
@@ -1043,165 +1059,6 @@ class TestGemDependencyInstaller < Gem::TestCase
1043
1059
  assert_kind_of Gem::SourceFetchProblem, installer.errors.first
1044
1060
  end
1045
1061
 
1046
- def assert_resolve expected, *specs
1047
- util_clear_gems
1048
- util_setup_spec_fetcher(*specs)
1049
- Gem::Specification.reset
1050
-
1051
- inst = Gem::DependencyInstaller.new
1052
- inst.find_spec_by_name_and_version specs.first.name
1053
- inst.gather_dependencies
1054
-
1055
- actual = inst.gems_to_install.map { |s| s.full_name }
1056
- assert_equal expected, actual
1057
- end
1058
-
1059
- def assert_resolve_pre expected, *specs
1060
- util_clear_gems
1061
-
1062
- util_setup_spec_fetcher(*specs)
1063
- Gem::Specification.reset
1064
-
1065
- spec = specs.first
1066
-
1067
- inst = Gem::DependencyInstaller.new :prerelease => true
1068
- inst.find_spec_by_name_and_version spec.name, spec.version
1069
- inst.gather_dependencies
1070
-
1071
- actual = inst.gems_to_install.map { |s| s.full_name }
1072
- assert_equal expected, actual
1073
- end
1074
-
1075
- def test_gather_dependencies
1076
- util_setup_gems
1077
- util_reset_gems
1078
-
1079
- inst = Gem::DependencyInstaller.new
1080
- inst.find_spec_by_name_and_version 'b'
1081
- inst.gather_dependencies
1082
-
1083
- assert_equal %w[a-1 b-1], inst.gems_to_install.map { |s| s.full_name }
1084
- end
1085
-
1086
- ##
1087
- # [A1] depends on
1088
- # [B] > 0 (satisfied by 2.0)
1089
- # [B1] depends on
1090
- # [C] > 0 (satisfied by 1.0)
1091
- # [B2] depends on nothing!
1092
- # [C1] depends on nothing
1093
-
1094
- def test_gather_dependencies_dropped
1095
- a1, = util_spec 'a', '1', 'b' => nil
1096
- b1, = util_spec 'b', '1', 'c' => nil
1097
- b2, = util_spec 'b', '2'
1098
- c1, = util_spec 'c', '1'
1099
-
1100
- assert_resolve %w[b-2 a-1], a1, b1, b2, c1
1101
- end
1102
-
1103
- ##
1104
- # [A] depends on
1105
- # [B] >= 1.0 (satisfied by 1.1) depends on
1106
- # [Z]
1107
- # [C] >= 1.0 depends on
1108
- # [B] = 1.0
1109
- #
1110
- # and should backtrack to resolve using b-1.0, pruning Z from the
1111
- # resolve.
1112
-
1113
- def test_gather_dependencies_raggi_the_edgecase_generator
1114
- a, _ = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '>= 1.0'
1115
- b1, _ = util_spec 'b', '1.0'
1116
- b2, _ = util_spec 'b', '1.1', 'z' => '>= 1.0'
1117
- c, _ = util_spec 'c', '1.0', 'b' => '= 1.0'
1118
-
1119
- assert_resolve %w[b-1.0 c-1.0 a-1.0], a, b1, b2, c
1120
- end
1121
-
1122
- ##
1123
- # [A] depends on
1124
- # [B] >= 1.0 (satisfied by 2.0)
1125
- # [C] = 1.0 depends on
1126
- # [B] ~> 1.0
1127
- #
1128
- # and should resolve using b-1.0
1129
-
1130
- def test_gather_dependencies_over
1131
- a, _ = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '= 1.0'
1132
- b1, _ = util_spec 'b', '1.0'
1133
- b2, _ = util_spec 'b', '2.0'
1134
- c, _ = util_spec 'c', '1.0', 'b' => '~> 1.0'
1135
-
1136
- assert_resolve %w[b-1.0 c-1.0 a-1.0], a, b1, b2, c
1137
- end
1138
-
1139
- ##
1140
- # [A] depends on
1141
- # [B] ~> 1.0 (satisfied by 1.1)
1142
- # [C] = 1.0 depends on
1143
- # [B] = 1.0
1144
- #
1145
- # and should resolve using b-1.0
1146
- #
1147
- # TODO: this is not under, but over... under would require depth
1148
- # first resolve through a dependency that is later pruned.
1149
-
1150
- def test_gather_dependencies_under
1151
- a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
1152
- b10, _ = util_spec 'b', '1.0'
1153
- b11, _ = util_spec 'b', '1.1'
1154
- c, _ = util_spec 'c', '1.0', 'b' => '= 1.0'
1155
-
1156
- assert_resolve %w[b-1.0 c-1.0 a-1.0], a, b10, b11, c
1157
- end
1158
-
1159
- # under
1160
- #
1161
- # [A] depends on
1162
- # [B] ~> 1.0 (satisfied by 1.0)
1163
- # [C] = 1.0 depends on
1164
- # [B] = 2.0
1165
-
1166
- def test_gather_dependencies_divergent
1167
- a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
1168
- b1, _ = util_spec 'b', '1.0'
1169
- b2, _ = util_spec 'b', '2.0'
1170
- c, _ = util_spec 'c', '1.0', 'b' => '= 2.0'
1171
-
1172
- assert_raises Gem::DependencyError do
1173
- assert_resolve :ignored, a, b1, b2, c
1174
- end
1175
- end
1176
-
1177
- def test_gather_dependencies_platform_alternate
1178
- util_setup_wxyz
1179
- util_set_arch 'cpu-my_platform1'
1180
-
1181
- assert_resolve %w[x-1-cpu-my_platform-1 w-1], @w1, @x1_m
1182
- end
1183
-
1184
- def test_gather_dependencies_platform_bump
1185
- util_setup_wxyz
1186
-
1187
- assert_resolve %w[y-1 z-1], @z1, @y1
1188
- end
1189
-
1190
- def test_gather_dependencies_prerelease
1191
- util_setup_gems
1192
- util_setup_c1_pre
1193
-
1194
- assert_resolve_pre %w[a-1.a b-1 c-1.a], @c1_pre, @a1_pre, @b1
1195
- end
1196
-
1197
- def test_gather_dependencies_old_required
1198
- util_setup_d
1199
- e1, = util_spec 'e', '1', 'd' => '= 1'
1200
- util_clear_gems
1201
-
1202
- assert_resolve %w[d-1 e-1], e1, @d1, @d2
1203
- end
1204
-
1205
1062
  def test_resolve_dependencies
1206
1063
  util_setup_gems
1207
1064
 
@@ -1232,6 +1089,21 @@ class TestGemDependencyInstaller < Gem::TestCase
1232
1089
  assert_equal %w[b-1], requests
1233
1090
  end
1234
1091
 
1092
+ def test_resolve_dependencies_local
1093
+ util_setup_gems
1094
+
1095
+ @a2, @a2_gem = util_gem 'a', '2'
1096
+ FileUtils.mv @a1_gem, @tempdir
1097
+ FileUtils.mv @a2_gem, @tempdir
1098
+
1099
+ inst = Gem::DependencyInstaller.new
1100
+ request_set = inst.resolve_dependencies 'a-1.gem', req('>= 0')
1101
+
1102
+ requests = request_set.sorted_requests.map { |req| req.full_name }
1103
+
1104
+ assert_equal %w[a-1], requests
1105
+ end
1106
+
1235
1107
  def util_write_a1_bin
1236
1108
  write_file File.join('gems', 'a-1', 'bin', 'a_bin') do |fp|
1237
1109
  fp.puts "#!/usr/bin/ruby"