rubygems-update 2.1.11 → 2.2.0.rc.1

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 (190) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.autotest +37 -12
  5. data/History.txt +99 -2
  6. data/MIT.txt +1 -0
  7. data/Manifest.txt +59 -19
  8. data/Rakefile +4 -6
  9. data/lib/gauntlet_rubygems.rb +1 -1
  10. data/lib/rubygems.rb +102 -80
  11. data/lib/rubygems/available_set.rb +2 -2
  12. data/lib/rubygems/basic_specification.rb +97 -8
  13. data/lib/rubygems/commands/install_command.rb +58 -15
  14. data/lib/rubygems/commands/list_command.rb +1 -7
  15. data/lib/rubygems/commands/outdated_command.rb +1 -1
  16. data/lib/rubygems/commands/pristine_command.rb +14 -1
  17. data/lib/rubygems/commands/push_command.rb +9 -4
  18. data/lib/rubygems/commands/query_command.rb +33 -17
  19. data/lib/rubygems/commands/search_command.rb +0 -6
  20. data/lib/rubygems/commands/specification_command.rb +1 -1
  21. data/lib/rubygems/commands/unpack_command.rb +1 -1
  22. data/lib/rubygems/commands/update_command.rb +4 -1
  23. data/lib/rubygems/commands/which_command.rb +5 -8
  24. data/lib/rubygems/compatibility.rb +3 -0
  25. data/lib/rubygems/core_ext/kernel_gem.rb +6 -0
  26. data/lib/rubygems/defaults.rb +19 -0
  27. data/lib/rubygems/dependency_installer.rb +28 -9
  28. data/lib/rubygems/doctor.rb +17 -11
  29. data/lib/rubygems/errors.rb +16 -3
  30. data/lib/rubygems/exceptions.rb +52 -5
  31. data/lib/rubygems/ext.rb +1 -2
  32. data/lib/rubygems/ext/build_error.rb +6 -0
  33. data/lib/rubygems/ext/builder.rb +50 -17
  34. data/lib/rubygems/ext/cmake_builder.rb +1 -1
  35. data/lib/rubygems/ext/configure_builder.rb +1 -3
  36. data/lib/rubygems/ext/ext_conf_builder.rb +9 -3
  37. data/lib/rubygems/ext/rake_builder.rb +2 -5
  38. data/lib/rubygems/gemcutter_utilities.rb +8 -1
  39. data/lib/rubygems/installer.rb +14 -4
  40. data/lib/rubygems/installer_test_case.rb +0 -5
  41. data/lib/rubygems/package.rb +11 -2
  42. data/lib/rubygems/psych_additions.rb +1 -1
  43. data/lib/rubygems/rdoc.rb +1 -1
  44. data/lib/rubygems/remote_fetcher.rb +3 -3
  45. data/lib/rubygems/request.rb +16 -8
  46. data/lib/rubygems/request_set.rb +133 -42
  47. data/lib/rubygems/request_set/gem_dependency_api.rb +493 -11
  48. data/lib/rubygems/request_set/lockfile.rb +579 -0
  49. data/lib/rubygems/requirement.rb +58 -30
  50. data/lib/rubygems/resolver.rb +471 -0
  51. data/lib/rubygems/resolver/activation_request.rb +165 -0
  52. data/lib/rubygems/resolver/api_set.rb +110 -0
  53. data/lib/rubygems/resolver/api_specification.rb +79 -0
  54. data/lib/rubygems/resolver/best_set.rb +31 -0
  55. data/lib/rubygems/resolver/composed_set.rb +39 -0
  56. data/lib/rubygems/resolver/conflict.rb +122 -0
  57. data/lib/rubygems/{dependency_resolver → resolver}/current_set.rb +1 -4
  58. data/lib/rubygems/{dependency_resolver → resolver}/dependency_request.rb +37 -7
  59. data/lib/rubygems/resolver/git_set.rb +119 -0
  60. data/lib/rubygems/resolver/git_specification.rb +35 -0
  61. data/lib/rubygems/resolver/index_set.rb +74 -0
  62. data/lib/rubygems/resolver/index_specification.rb +69 -0
  63. data/lib/rubygems/resolver/installed_specification.rb +40 -0
  64. data/lib/rubygems/{dependency_resolver → resolver}/installer_set.rb +18 -17
  65. data/lib/rubygems/resolver/local_specification.rb +16 -0
  66. data/lib/rubygems/resolver/lock_set.rb +78 -0
  67. data/lib/rubygems/resolver/lock_specification.rb +58 -0
  68. data/lib/rubygems/resolver/requirement_list.rb +81 -0
  69. data/lib/rubygems/resolver/set.rb +27 -0
  70. data/lib/rubygems/resolver/spec_specification.rb +58 -0
  71. data/lib/rubygems/resolver/specification.rb +89 -0
  72. data/lib/rubygems/resolver/stats.rb +44 -0
  73. data/lib/rubygems/resolver/vendor_set.rb +83 -0
  74. data/lib/rubygems/resolver/vendor_specification.rb +24 -0
  75. data/lib/rubygems/security/trust_dir.rb +16 -2
  76. data/lib/rubygems/source.rb +71 -18
  77. data/lib/rubygems/source/git.rb +218 -0
  78. data/lib/rubygems/source/installed.rb +8 -1
  79. data/lib/rubygems/source/local.rb +14 -8
  80. data/lib/rubygems/source/lock.rb +48 -0
  81. data/lib/rubygems/source/specific_file.rb +14 -3
  82. data/lib/rubygems/source/vendor.rb +27 -0
  83. data/lib/rubygems/source_list.rb +74 -12
  84. data/lib/rubygems/spec_fetcher.rb +36 -4
  85. data/lib/rubygems/specification.rb +214 -65
  86. data/lib/rubygems/stub_specification.rb +57 -1
  87. data/lib/rubygems/syck_hack.rb +3 -3
  88. data/lib/rubygems/test_case.rb +226 -59
  89. data/lib/rubygems/test_utilities.rb +198 -0
  90. data/lib/rubygems/uninstaller.rb +22 -10
  91. data/lib/rubygems/uri_formatter.rb +20 -0
  92. data/lib/rubygems/user_interaction.rb +193 -71
  93. data/lib/rubygems/util.rb +121 -0
  94. data/lib/rubygems/util/list.rb +4 -0
  95. data/lib/rubygems/util/stringio.rb +34 -0
  96. data/lib/rubygems/validator.rb +6 -2
  97. data/lib/rubygems/version.rb +4 -8
  98. data/test/rubygems/test_bundled_ca.rb +1 -1
  99. data/test/rubygems/test_gem.rb +137 -29
  100. data/test/rubygems/test_gem_available_set.rb +19 -0
  101. data/test/rubygems/test_gem_commands_build_command.rb +1 -1
  102. data/test/rubygems/test_gem_commands_cert_command.rb +2 -2
  103. data/test/rubygems/test_gem_commands_cleanup_command.rb +13 -13
  104. data/test/rubygems/test_gem_commands_dependency_command.rb +24 -34
  105. data/test/rubygems/test_gem_commands_fetch_command.rb +43 -48
  106. data/test/rubygems/test_gem_commands_install_command.rb +244 -279
  107. data/test/rubygems/test_gem_commands_list_command.rb +3 -3
  108. data/test/rubygems/test_gem_commands_outdated_command.rb +7 -12
  109. data/test/rubygems/test_gem_commands_pristine_command.rb +73 -27
  110. data/test/rubygems/test_gem_commands_push_command.rb +76 -8
  111. data/test/rubygems/test_gem_commands_query_command.rb +239 -49
  112. data/test/rubygems/test_gem_commands_sources_command.rb +10 -43
  113. data/test/rubygems/test_gem_commands_specification_command.rb +24 -47
  114. data/test/rubygems/test_gem_commands_stale_command.rb +2 -2
  115. data/test/rubygems/test_gem_commands_uninstall_command.rb +3 -3
  116. data/test/rubygems/test_gem_commands_unpack_command.rb +16 -30
  117. data/test/rubygems/test_gem_commands_update_command.rb +149 -134
  118. data/test/rubygems/test_gem_commands_which_command.rb +4 -2
  119. data/test/rubygems/test_gem_dependency_installer.rb +68 -0
  120. data/test/rubygems/test_gem_dependency_list.rb +17 -17
  121. data/test/rubygems/test_gem_dependency_resolution_error.rb +28 -0
  122. data/test/rubygems/test_gem_doctor.rb +1 -1
  123. data/test/rubygems/test_gem_ext_builder.rb +178 -8
  124. data/test/rubygems/test_gem_ext_cmake_builder.rb +1 -7
  125. data/test/rubygems/test_gem_ext_configure_builder.rb +8 -10
  126. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +18 -21
  127. data/test/rubygems/test_gem_ext_rake_builder.rb +1 -3
  128. data/test/rubygems/test_gem_impossible_dependencies_error.rb +10 -6
  129. data/test/rubygems/test_gem_indexer.rb +6 -6
  130. data/test/rubygems/test_gem_installer.rb +29 -10
  131. data/test/rubygems/test_gem_local_remote_options.rb +1 -1
  132. data/test/rubygems/test_gem_package.rb +18 -0
  133. data/test/rubygems/test_gem_rdoc.rb +1 -1
  134. data/test/rubygems/test_gem_remote_fetcher.rb +1 -1
  135. data/test/rubygems/test_gem_request.rb +37 -10
  136. data/test/rubygems/test_gem_request_set.rb +271 -9
  137. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +684 -0
  138. data/test/rubygems/test_gem_request_set_lockfile.rb +849 -0
  139. data/test/rubygems/test_gem_requirement.rb +21 -0
  140. data/test/rubygems/{test_gem_dependency_resolver.rb → test_gem_resolver.rb} +231 -70
  141. data/test/rubygems/test_gem_resolver_activation_request.rb +63 -0
  142. data/test/rubygems/test_gem_resolver_api_set.rb +167 -0
  143. data/test/rubygems/test_gem_resolver_api_specification.rb +104 -0
  144. data/test/rubygems/test_gem_resolver_best_set.rb +30 -0
  145. data/test/rubygems/test_gem_resolver_conflict.rb +75 -0
  146. data/test/rubygems/test_gem_resolver_dependency_request.rb +20 -0
  147. data/test/rubygems/test_gem_resolver_git_set.rb +148 -0
  148. data/test/rubygems/test_gem_resolver_git_specification.rb +100 -0
  149. data/test/rubygems/test_gem_resolver_index_set.rb +28 -0
  150. data/test/rubygems/test_gem_resolver_index_specification.rb +89 -0
  151. data/test/rubygems/test_gem_resolver_installed_specification.rb +49 -0
  152. data/test/rubygems/test_gem_resolver_installer_set.rb +22 -0
  153. data/test/rubygems/test_gem_resolver_local_specification.rb +45 -0
  154. data/test/rubygems/test_gem_resolver_lock_set.rb +57 -0
  155. data/test/rubygems/test_gem_resolver_lock_specification.rb +87 -0
  156. data/test/rubygems/test_gem_resolver_requirement_list.rb +20 -0
  157. data/test/rubygems/test_gem_resolver_specification.rb +32 -0
  158. data/test/rubygems/test_gem_resolver_vendor_set.rb +67 -0
  159. data/test/rubygems/test_gem_resolver_vendor_specification.rb +83 -0
  160. data/test/rubygems/test_gem_server.rb +4 -4
  161. data/test/rubygems/test_gem_source.rb +54 -64
  162. data/test/rubygems/test_gem_source_git.rb +231 -0
  163. data/test/rubygems/test_gem_source_list.rb +24 -0
  164. data/test/rubygems/test_gem_source_local.rb +1 -1
  165. data/test/rubygems/test_gem_source_lock.rb +114 -0
  166. data/test/rubygems/test_gem_source_vendor.rb +27 -0
  167. data/test/rubygems/test_gem_spec_fetcher.rb +116 -61
  168. data/test/rubygems/test_gem_specification.rb +526 -94
  169. data/test/rubygems/test_gem_stub_specification.rb +123 -10
  170. data/test/rubygems/test_gem_uninstaller.rb +28 -2
  171. data/test/rubygems/test_gem_util.rb +31 -0
  172. data/test/rubygems/test_gem_validator.rb +9 -0
  173. data/util/update_bundled_ca_certificates.rb +8 -1
  174. metadata +89 -29
  175. metadata.gz.sig +2 -4
  176. data/lib/rubygems/dependency_resolver.rb +0 -254
  177. data/lib/rubygems/dependency_resolver/activation_request.rb +0 -109
  178. data/lib/rubygems/dependency_resolver/api_set.rb +0 -65
  179. data/lib/rubygems/dependency_resolver/api_specification.rb +0 -39
  180. data/lib/rubygems/dependency_resolver/composed_set.rb +0 -18
  181. data/lib/rubygems/dependency_resolver/dependency_conflict.rb +0 -85
  182. data/lib/rubygems/dependency_resolver/index_set.rb +0 -64
  183. data/lib/rubygems/dependency_resolver/index_specification.rb +0 -60
  184. data/lib/rubygems/dependency_resolver/installed_specification.rb +0 -52
  185. data/test/rubygems/test_gem_dependency_resolver_api_specification.rb +0 -33
  186. data/test/rubygems/test_gem_dependency_resolver_dependency_conflict.rb +0 -36
  187. data/test/rubygems/test_gem_dependency_resolver_index_set.rb +0 -53
  188. data/test/rubygems/test_gem_dependency_resolver_index_specification.rb +0 -73
  189. data/test/rubygems/test_gem_dependency_resolver_installed_specification.rb +0 -19
  190. data/test/rubygems/test_gem_dependency_resolver_installer_set.rb +0 -28
@@ -3,6 +3,14 @@ require "rubygems/requirement"
3
3
 
4
4
  class TestGemRequirement < Gem::TestCase
5
5
 
6
+ def test_concat
7
+ r = req '>= 1'
8
+
9
+ r.concat ['< 2']
10
+
11
+ assert_equal [['>=', v(1)], ['<', v(2)]], r.requirements
12
+ end
13
+
6
14
  def test_equals2
7
15
  r = req "= 1.2"
8
16
  assert_equal r, r.dup
@@ -36,6 +44,19 @@ class TestGemRequirement < Gem::TestCase
36
44
  assert_equal false, r.none?
37
45
  end
38
46
 
47
+ def test_for_lockfile
48
+ assert_equal ' (~> 1.0)', req('~> 1.0').for_lockfile
49
+
50
+ assert_equal ' (~> 1.0, >= 1.0.1)', req('>= 1.0.1', '~> 1.0').for_lockfile
51
+
52
+ duped = req '= 1.0'
53
+ duped.requirements << ['=', v('1.0')]
54
+
55
+ assert_equal ' (= 1.0)', duped.for_lockfile
56
+
57
+ assert_nil Gem::Requirement.default.for_lockfile
58
+ end
59
+
39
60
  def test_parse
40
61
  assert_equal ['=', Gem::Version.new(1)], Gem::Requirement.parse(' 1')
41
62
  assert_equal ['=', Gem::Version.new(1)], Gem::Requirement.parse('= 1')
@@ -1,7 +1,12 @@
1
1
  require 'rubygems/test_case'
2
- require 'rubygems/dependency_resolver'
3
2
 
4
- class TestGemDependencyResolver < Gem::TestCase
3
+ class TestGemResolver < Gem::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ @DR = Gem::Resolver
9
+ end
5
10
 
6
11
  def make_dep(name, *req)
7
12
  Gem::Dependency.new(name, *req)
@@ -11,13 +16,120 @@ class TestGemDependencyResolver < Gem::TestCase
11
16
  StaticSet.new(specs)
12
17
  end
13
18
 
14
- def assert_set(expected, actual)
19
+ def assert_resolves_to expected, resolver
20
+ actual = resolver.resolve
21
+
15
22
  exp = expected.sort_by { |s| s.full_name }
16
23
  act = actual.map { |a| a.spec }.sort_by { |s| s.full_name }
17
24
 
18
25
  msg = "Set of gems was not the same: #{exp.map { |x| x.full_name}.inspect} != #{act.map { |x| x.full_name}.inspect}"
19
26
 
20
27
  assert_equal exp, act, msg
28
+ rescue Gem::DependencyResolutionError => e
29
+ flunk e.message
30
+ end
31
+
32
+ def test_self_compatibility
33
+ assert_same Gem::Resolver, Gem::DependencyResolver
34
+ end
35
+
36
+ def test_self_compose_sets_multiple
37
+ index_set = @DR::IndexSet.new
38
+ vendor_set = @DR::VendorSet.new
39
+
40
+ composed = @DR.compose_sets index_set, vendor_set
41
+
42
+ assert_kind_of Gem::Resolver::ComposedSet, composed
43
+
44
+ assert_equal [index_set, vendor_set], composed.sets
45
+ end
46
+
47
+ def test_self_compose_sets_nest
48
+ index_set = @DR::IndexSet.new
49
+ vendor_set = @DR::VendorSet.new
50
+
51
+ inner = @DR.compose_sets index_set, vendor_set
52
+
53
+ current_set = @DR::CurrentSet.new
54
+
55
+ composed = @DR.compose_sets inner, current_set
56
+
57
+ assert_kind_of Gem::Resolver::ComposedSet, composed
58
+
59
+ assert_equal [index_set, vendor_set, current_set], composed.sets
60
+ end
61
+
62
+ def test_self_compose_sets_nil
63
+ index_set = @DR::IndexSet.new
64
+
65
+ composed = @DR.compose_sets index_set, nil
66
+
67
+ assert_same index_set, composed
68
+
69
+ e = assert_raises ArgumentError do
70
+ @DR.compose_sets nil
71
+ end
72
+
73
+ assert_equal 'one set in the composition must be non-nil', e.message
74
+ end
75
+
76
+ def test_self_compose_sets_single
77
+ index_set = @DR::IndexSet.new
78
+
79
+ composed = @DR.compose_sets index_set
80
+
81
+ assert_same index_set, composed
82
+ end
83
+
84
+ def test_handle_conflict
85
+ a1 = util_spec 'a', 1
86
+
87
+ r1 = Gem::Resolver::DependencyRequest.new dep('a', '= 1'), nil
88
+ r2 = Gem::Resolver::DependencyRequest.new dep('a', '= 2'), nil
89
+ r3 = Gem::Resolver::DependencyRequest.new dep('a', '= 3'), nil
90
+
91
+ existing = Gem::Resolver::ActivationRequest.new a1, r1, false
92
+
93
+ res = Gem::Resolver.new [a1]
94
+
95
+ res.handle_conflict r2, existing
96
+ res.handle_conflict r2, existing
97
+ res.handle_conflict r3, existing
98
+
99
+ assert_equal 2, res.conflicts.length
100
+ end
101
+
102
+ def test_requests
103
+ a1 = util_spec 'a', 1, 'b' => 2
104
+
105
+ r1 = Gem::Resolver::DependencyRequest.new dep('a', '= 1'), nil
106
+
107
+ act = Gem::Resolver::ActivationRequest.new a1, r1, false
108
+
109
+ res = Gem::Resolver.new [a1]
110
+
111
+ reqs = Gem::Resolver::RequirementList.new
112
+
113
+ res.requests a1, act, reqs
114
+
115
+ assert_equal ['b (= 2)'], reqs.to_a.map { |req| req.to_s }
116
+ end
117
+
118
+ def test_requests_ignore_dependencies
119
+ a1 = util_spec 'a', 1, 'b' => 2
120
+
121
+ r1 = Gem::Resolver::DependencyRequest.new dep('a', '= 1'), nil
122
+
123
+ act = Gem::Resolver::ActivationRequest.new a1, r1, false
124
+
125
+ res = Gem::Resolver.new [a1]
126
+ res.ignore_dependencies = true
127
+
128
+ reqs = Gem::Resolver::RequirementList.new
129
+
130
+ res.requests a1, act, reqs
131
+
132
+ assert_empty reqs
21
133
  end
22
134
 
23
135
  def test_no_overlap_specificly
@@ -31,9 +143,9 @@ class TestGemDependencyResolver < Gem::TestCase
31
143
 
32
144
  s = set(a, b)
33
145
 
34
- res = Gem::DependencyResolver.new(deps, s)
146
+ res = Gem::Resolver.new(deps, s)
35
147
 
36
- assert_set [a, b], res.resolve
148
+ assert_resolves_to [a, b], res
37
149
  end
38
150
 
39
151
  def test_pulls_in_dependencies
@@ -48,9 +160,9 @@ class TestGemDependencyResolver < Gem::TestCase
48
160
 
49
161
  s = set(a, b, c)
50
162
 
51
- res = Gem::DependencyResolver.new(deps, s)
163
+ res = Gem::Resolver.new(deps, s)
52
164
 
53
- assert_set [a, b, c], res.resolve
165
+ assert_resolves_to [a, b, c], res
54
166
  end
55
167
 
56
168
  def test_picks_highest_version
@@ -61,16 +173,22 @@ class TestGemDependencyResolver < Gem::TestCase
61
173
 
62
174
  ad = make_dep "a"
63
175
 
64
- res = Gem::DependencyResolver.new([ad], s)
176
+ res = Gem::Resolver.new([ad], s)
65
177
 
66
- assert_set [a2], res.resolve
178
+ assert_resolves_to [a2], res
67
179
  end
68
180
 
69
181
  def test_picks_best_platform
70
- is = Gem::DependencyResolver::IndexSpecification
182
+ is = Gem::Resolver::IndexSpecification
71
183
  unknown = Gem::Platform.new 'unknown'
72
- a2_p1 = quick_spec 'a', 2 do |s| s.platform = Gem::Platform.local end
73
- a3_p2 = quick_spec 'a', 3 do |s| s.platform = unknown end
184
+ a2_p1 = a3_p2 = nil
185
+
186
+ spec_fetcher do |fetcher|
187
+ fetcher.spec 'a', 2
188
+ a2_p1 = fetcher.spec 'a', 2 do |s| s.platform = Gem::Platform.local end
189
+ a3_p2 = fetcher.spec 'a', 3 do |s| s.platform = unknown end
190
+ end
191
+
74
192
  v2 = v(2)
75
193
  v3 = v(3)
76
194
  source = Gem::Source.new @gem_repo
@@ -87,9 +205,9 @@ class TestGemDependencyResolver < Gem::TestCase
87
205
 
88
206
  ad = make_dep "a"
89
207
 
90
- res = Gem::DependencyResolver.new([ad], s)
208
+ res = Gem::Resolver.new([ad], s)
91
209
 
92
- assert_set [a2_p1], res.resolve
210
+ assert_resolves_to [a2_p1], res
93
211
  end
94
212
 
95
213
  def test_only_returns_spec_once
@@ -103,9 +221,9 @@ class TestGemDependencyResolver < Gem::TestCase
103
221
 
104
222
  s = set(a1, b1, c1)
105
223
 
106
- res = Gem::DependencyResolver.new([ad, bd], s)
224
+ res = Gem::Resolver.new([ad, bd], s)
107
225
 
108
- assert_set [a1, b1, c1], res.resolve
226
+ assert_resolves_to [a1, b1, c1], res
109
227
  end
110
228
 
111
229
  def test_picks_lower_version_when_needed
@@ -120,17 +238,9 @@ class TestGemDependencyResolver < Gem::TestCase
120
238
 
121
239
  s = set(a1, b1, c1, c2)
122
240
 
123
- res = Gem::DependencyResolver.new([ad, bd], s)
124
-
125
- assert_set [a1, b1, c1], res.resolve
241
+ res = Gem::Resolver.new([ad, bd], s)
126
242
 
127
- cons = res.conflicts
128
-
129
- assert_equal 1, cons.size
130
- con = cons.first
131
-
132
- assert_equal "c (= 1)", con.dependency.to_s
133
- assert_equal "c-2", con.activated.full_name
243
+ assert_resolves_to [a1, b1, c1], res
134
244
  end
135
245
 
136
246
  def test_conflict_resolution_only_effects_correct_spec
@@ -148,17 +258,30 @@ class TestGemDependencyResolver < Gem::TestCase
148
258
 
149
259
  s = set(a1, b1, d3, d4, c1, c2)
150
260
 
151
- res = Gem::DependencyResolver.new([ad, bd], s)
261
+ res = Gem::Resolver.new([ad, bd], s)
262
+
263
+ assert_resolves_to [a1, b1, c1, d4], res
264
+ end
265
+
266
+ def test_backoff_higher_version_to_satisfy_dep
267
+ t3 = util_spec "railties", "3.2"
268
+ t4 = util_spec "railties", "4.0"
269
+
270
+ r3 = util_spec "rails", "3.2", "railties" => "= 3.2"
271
+ r4 = util_spec "rails", "4.0", "railties" => "= 4.0"
152
272
 
153
- assert_set [a1, b1, c1, d4], res.resolve
273
+ rd = make_dep "rails", "3.2"
154
274
 
155
- cons = res.conflicts
275
+ c3 = util_spec "coffee", "3.0", "railties" => "~> 3.0"
276
+ c4 = util_spec "coffee", "4.0", "railties" => "~> 4.0"
156
277
 
157
- assert_equal 1, cons.size
158
- con = cons.first
278
+ cd = make_dep "coffee"
159
279
 
160
- assert_equal "c (= 1)", con.dependency.to_s
161
- assert_equal "c-2", con.activated.full_name
280
+ s = set(t3, t4, r3, r4, c3, c4)
281
+
282
+ res = Gem::Resolver.new([rd, cd], s)
283
+
284
+ assert_resolves_to [r3, t3, c3], res
162
285
  end
163
286
 
164
287
  def test_raises_dependency_error
@@ -173,33 +296,31 @@ class TestGemDependencyResolver < Gem::TestCase
173
296
 
174
297
  s = set(a1, b1, c1, c2)
175
298
 
176
- r = Gem::DependencyResolver.new([ad, bd], s)
299
+ r = Gem::Resolver.new([ad, bd], s)
177
300
 
178
301
  e = assert_raises Gem::DependencyResolutionError do
179
302
  r.resolve
180
303
  end
181
304
 
182
- assert_equal "unable to resolve conflicting dependencies 'c (= 2)' and 'c (= 1)'", e.message
183
-
184
- deps = [make_dep("c", "= 2"), make_dep("c", "= 1")]
305
+ deps = [make_dep("c", "= 1"), make_dep("c", "= 2")]
185
306
  assert_equal deps, e.conflicting_dependencies
186
307
 
187
308
  con = e.conflict
188
309
 
189
310
  act = con.activated
190
- assert_equal "c-1", act.spec.full_name
311
+ assert_equal "c-2", act.spec.full_name
191
312
 
192
313
  parent = act.parent
193
- assert_equal "a-1", parent.spec.full_name
314
+ assert_equal "b-1", parent.spec.full_name
194
315
 
195
316
  act = con.requester
196
- assert_equal "b-1", act.spec.full_name
317
+ assert_equal "a-1", act.spec.full_name
197
318
  end
198
319
 
199
320
  def test_raises_when_a_gem_is_missing
200
321
  ad = make_dep "a"
201
322
 
202
- r = Gem::DependencyResolver.new([ad], set)
323
+ r = Gem::Resolver.new([ad], set)
203
324
 
204
325
  e = assert_raises Gem::UnsatisfiableDepedencyError do
205
326
  r.resolve
@@ -216,7 +337,7 @@ class TestGemDependencyResolver < Gem::TestCase
216
337
 
217
338
  ad = make_dep "a", "= 3"
218
339
 
219
- r = Gem::DependencyResolver.new([ad], set(a1))
340
+ r = Gem::Resolver.new([ad], set(a1))
220
341
 
221
342
  e = assert_raises Gem::UnsatisfiableDepedencyError do
222
343
  r.resolve
@@ -229,7 +350,7 @@ class TestGemDependencyResolver < Gem::TestCase
229
350
  a1 = util_spec "a", "1"
230
351
  ad = make_dep "a", "= 3"
231
352
 
232
- r = Gem::DependencyResolver.new([ad], set(a1))
353
+ r = Gem::Resolver.new([ad], set(a1))
233
354
 
234
355
  e = assert_raises Gem::UnsatisfiableDepedencyError do
235
356
  r.resolve
@@ -246,7 +367,7 @@ class TestGemDependencyResolver < Gem::TestCase
246
367
 
247
368
  ad = make_dep "a", "= 1"
248
369
 
249
- r = Gem::DependencyResolver.new([ad], set(a1))
370
+ r = Gem::Resolver.new([ad], set(a1))
250
371
 
251
372
  e = assert_raises Gem::UnsatisfiableDepedencyError do
252
373
  r.resolve
@@ -269,20 +390,24 @@ class TestGemDependencyResolver < Gem::TestCase
269
390
  ad = make_dep "a"
270
391
  bd = make_dep "b"
271
392
 
272
- r = Gem::DependencyResolver.new([ad, bd], s)
393
+ r = Gem::Resolver.new([ad, bd], s)
273
394
 
274
- e = assert_raises Gem::ImpossibleDependenciesError do
395
+ e = assert_raises Gem::DependencyResolutionError do
275
396
  r.resolve
276
397
  end
277
398
 
278
- assert_match "a-1 requires c (>= 2) but it conflicted", e.message
399
+ dependency = e.conflict.dependency
400
+
401
+ assert_equal 'a', dependency.name
402
+ assert_equal req('>= 0'), dependency.requirement
279
403
 
280
- assert_equal "c (>= 2)", e.dependency.to_s
404
+ activated = e.conflict.activated
405
+ assert_equal 'c-1', activated.full_name
281
406
 
282
- s, con = e.conflicts[0]
283
- assert_equal "c-3", s.full_name
284
- assert_equal "c (= 1)", con.dependency.to_s
285
- assert_equal "b-1", con.requester.full_name
407
+ assert_equal dep('c', '= 1'), activated.request.dependency
408
+
409
+ assert_equal [dep('c', '>= 2'), dep('c', '= 1')],
410
+ e.conflict.conflicting_dependencies
286
411
  end
287
412
 
288
413
  def test_keeps_resolving_after_seeing_satisfied_dep
@@ -295,9 +420,9 @@ class TestGemDependencyResolver < Gem::TestCase
295
420
 
296
421
  s = set(a1, b1, c1)
297
422
 
298
- r = Gem::DependencyResolver.new([ad, bd], s)
423
+ r = Gem::Resolver.new([ad, bd], s)
299
424
 
300
- assert_set [a1, b1, c1], r.resolve
425
+ assert_resolves_to [a1, b1, c1], r
301
426
  end
302
427
 
303
428
  def test_common_rack_activation_scenario
@@ -314,15 +439,15 @@ class TestGemDependencyResolver < Gem::TestCase
314
439
 
315
440
  s = set(lib1, rails, ap, rack100, rack101)
316
441
 
317
- r = Gem::DependencyResolver.new([d1, d2], s)
442
+ r = Gem::Resolver.new([d1, d2], s)
318
443
 
319
- assert_set [rails, ap, rack101, lib1], r.resolve
444
+ assert_resolves_to [rails, ap, rack101, lib1], r
320
445
 
321
446
  # check it with the deps reverse too
322
447
 
323
- r = Gem::DependencyResolver.new([d2, d1], s)
448
+ r = Gem::Resolver.new([d2, d1], s)
324
449
 
325
- assert_set [lib1, rack101, rails, ap], r.resolve
450
+ assert_resolves_to [lib1, rack101, rails, ap], r
326
451
  end
327
452
 
328
453
  def test_backtracks_to_the_first_conflict
@@ -337,9 +462,9 @@ class TestGemDependencyResolver < Gem::TestCase
337
462
 
338
463
  s = set(a1, a2, a3, a4)
339
464
 
340
- r = Gem::DependencyResolver.new([d1, d2, d3], s)
465
+ r = Gem::Resolver.new([d1, d2, d3], s)
341
466
 
342
- assert_raises Gem::ImpossibleDependenciesError do
467
+ assert_raises Gem::DependencyResolutionError do
343
468
  r.resolve
344
469
  end
345
470
  end
@@ -355,13 +480,49 @@ class TestGemDependencyResolver < Gem::TestCase
355
480
  a_dep = dep 'a', '~> 1.0'
356
481
  b_dep = dep 'b'
357
482
 
358
- r = Gem::DependencyResolver.new [a_dep, b_dep], s
483
+ r = Gem::Resolver.new [a_dep, b_dep], s
359
484
 
360
485
  assert_raises Gem::DependencyResolutionError do
361
486
  r.resolve
362
487
  end
363
488
  end
364
489
 
490
+ def test_resolve_bug_699
491
+ a1 = util_spec 'a', '1', 'b' => '= 2',
492
+ 'c' => '~> 1.0.3'
493
+
494
+ b1 = util_spec 'b', '2', 'c' => '~> 1.0'
495
+
496
+ c1 = util_spec 'c', '1.0.9'
497
+ c2 = util_spec 'c', '1.1.0'
498
+ c3 = util_spec 'c', '1.2.0'
499
+
500
+ s = set a1, b1, c1, c2, c3
501
+
502
+ a_dep = dep 'a', '= 1'
503
+
504
+ r = Gem::Resolver.new [a_dep], s
505
+
506
+ assert_resolves_to [a1, b1, c1], r
507
+ end
508
+
509
+ def test_resolve_rollback
510
+ a1 = util_spec 'a', 1
511
+ a2 = util_spec 'a', 2
512
+
513
+ b1 = util_spec 'b', 1, 'a' => '~> 1.0'
514
+ b2 = util_spec 'b', 2, 'a' => '~> 2.0'
515
+
516
+ s = set a1, a2, b1, b2
517
+
518
+ a_dep = dep 'a', '~> 1.0'
519
+ b_dep = dep 'b'
520
+
521
+ r = Gem::Resolver.new [a_dep, b_dep], s
522
+
523
+ assert_resolves_to [a1, b1], r
524
+ end
525
+
365
526
  # actionmailer 2.3.4
366
527
  # activemerchant 1.5.0
367
528
  # activesupport 2.3.5, 2.3.4
@@ -380,9 +541,9 @@ class TestGemDependencyResolver < Gem::TestCase
380
541
  d1 = make_dep "activemerchant"
381
542
  d2 = make_dep "actionmailer"
382
543
 
383
- r = Gem::DependencyResolver.new([d1, d2], s)
544
+ r = Gem::Resolver.new([d1, d2], s)
384
545
 
385
- assert_set [merch, mail, sup1], r.resolve
546
+ assert_resolves_to [merch, mail, sup1], r
386
547
  end
387
548
 
388
549
  def test_second_level_backout
@@ -398,17 +559,17 @@ class TestGemDependencyResolver < Gem::TestCase
398
559
  p1 = make_dep "b", "> 0"
399
560
  p2 = make_dep "d", "> 0"
400
561
 
401
- r = Gem::DependencyResolver.new([p1, p2], s)
562
+ r = Gem::Resolver.new([p1, p2], s)
402
563
 
403
- assert_set [b1, c1, d2], r.resolve
564
+ assert_resolves_to [b1, c1, d2], r
404
565
  end
405
566
 
406
567
  def test_select_local_platforms
407
- r = Gem::DependencyResolver.new nil, nil
568
+ r = Gem::Resolver.new nil, nil
408
569
 
409
- a1 = quick_spec 'a', 1
410
- a1_p1 = quick_spec 'a', 1 do |s| s.platform = Gem::Platform.local end
411
- a1_p2 = quick_spec 'a', 1 do |s| s.platform = 'unknown' end
570
+ a1 = util_spec 'a', 1
571
+ a1_p1 = util_spec 'a', 1 do |s| s.platform = Gem::Platform.local end
572
+ a1_p2 = util_spec 'a', 1 do |s| s.platform = 'unknown' end
412
573
 
413
574
  selected = r.select_local_platforms [a1, a1_p1, a1_p2]
414
575
 
@@ -422,7 +583,7 @@ class TestGemDependencyResolver < Gem::TestCase
422
583
 
423
584
  ad = make_dep "a", "= 1"
424
585
 
425
- r = Gem::DependencyResolver.new([ad], set(a1))
586
+ r = Gem::Resolver.new([ad], set(a1))
426
587
 
427
588
  e = assert_raises Gem::UnsatisfiableDepedencyError do
428
589
  r.resolve