rubygems-update 3.2.2 → 3.2.3

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +12 -0
  3. data/Manifest.txt +2 -0
  4. data/bundler/CHANGELOG.md +9 -0
  5. data/bundler/lib/bundler.rb +3 -6
  6. data/bundler/lib/bundler/build_metadata.rb +2 -2
  7. data/bundler/lib/bundler/cli/update.rb +1 -1
  8. data/bundler/lib/bundler/compact_index_client/cache.rb +5 -13
  9. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  10. data/bundler/lib/bundler/definition.rb +26 -14
  11. data/bundler/lib/bundler/gem_helpers.rb +30 -24
  12. data/bundler/lib/bundler/lazy_specification.rb +10 -11
  13. data/bundler/lib/bundler/resolver/spec_group.rb +14 -16
  14. data/bundler/lib/bundler/rubygems_integration.rb +0 -5
  15. data/bundler/lib/bundler/spec_set.rb +5 -8
  16. data/bundler/lib/bundler/version.rb +1 -1
  17. data/lib/rubygems.rb +1 -1
  18. data/lib/rubygems/dependency_installer.rb +1 -0
  19. data/lib/rubygems/gemcutter_utilities.rb +2 -2
  20. data/lib/rubygems/installer.rb +0 -23
  21. data/lib/rubygems/remote_fetcher.rb +1 -1
  22. data/lib/rubygems/request_set.rb +2 -13
  23. data/lib/rubygems/resolver.rb +6 -1
  24. data/lib/rubygems/resolver/api_set.rb +28 -19
  25. data/lib/rubygems/resolver/api_set/gem_parser.rb +20 -0
  26. data/lib/rubygems/resolver/api_specification.rb +4 -3
  27. data/lib/rubygems/resolver/best_set.rb +1 -1
  28. data/lib/rubygems/resolver/index_specification.rb +15 -0
  29. data/lib/rubygems/resolver/installer_set.rb +57 -7
  30. data/lib/rubygems/resolver/spec_specification.rb +14 -0
  31. data/lib/rubygems/resolver/specification.rb +12 -0
  32. data/lib/rubygems/source.rb +10 -6
  33. data/rubygems-update.gemspec +1 -1
  34. data/test/rubygems/test_gem_commands_install_command.rb +131 -0
  35. data/test/rubygems/test_gem_installer.rb +6 -60
  36. data/test/rubygems/test_gem_resolver_api_set.rb +26 -52
  37. data/test/rubygems/test_gem_resolver_api_specification.rb +3 -3
  38. data/test/rubygems/test_gem_resolver_best_set.rb +3 -3
  39. data/test/rubygems/test_gem_source.rb +2 -2
  40. data/test/rubygems/test_gem_source_subpath_problem.rb +2 -2
  41. metadata +5 -3
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "rubygems-update"
5
- s.version = "3.2.2"
5
+ s.version = "3.2.3"
6
6
  s.authors = ["Jim Weirich", "Chad Fowler", "Eric Hodel", "Luis Lavena", "Aaron Patterson", "Samuel Giddins", "André Arko", "Evan Phoenix", "Hiroshi SHIBATA"]
7
7
  s.email = ["", "", "drbrain@segment7.net", "luislavena@gmail.com", "aaron@tenderlovemaking.com", "segiddins@segiddins.me", "andre@arko.net", "evan@phx.io", "hsbt@ruby-lang.org"]
8
8
 
@@ -504,6 +504,137 @@ ERROR: Possible alternatives: non_existent_with_hint
504
504
  assert_equal %w[a-2], @cmd.installed_specs.map {|spec| spec.full_name }
505
505
  end
506
506
 
507
+ def test_execute_required_ruby_version
508
+ next_ruby = Gem.ruby_version.segments.map.with_index{|n, i| i == 1 ? n + 1 : n }.join(".")
509
+
510
+ local = Gem::Platform.local
511
+ spec_fetcher do |fetcher|
512
+ fetcher.download 'a', 2
513
+ fetcher.download 'a', 2 do |s|
514
+ s.required_ruby_version = "< #{RUBY_VERSION}.a"
515
+ s.platform = local
516
+ end
517
+ fetcher.download 'a', 3 do |s|
518
+ s.required_ruby_version = ">= #{next_ruby}"
519
+ end
520
+ fetcher.download 'a', 3 do |s|
521
+ s.required_ruby_version = ">= #{next_ruby}"
522
+ s.platform = local
523
+ end
524
+ end
525
+
526
+ @cmd.options[:args] = %w[a]
527
+
528
+ use_ui @ui do
529
+ assert_raises Gem::MockGemUi::SystemExitException, @ui.error do
530
+ @cmd.execute
531
+ end
532
+ end
533
+
534
+ assert_equal %w[a-2], @cmd.installed_specs.map {|spec| spec.full_name }
535
+ end
536
+
537
+ def test_execute_required_ruby_version_upper_bound
538
+ local = Gem::Platform.local
539
+ spec_fetcher do |fetcher|
540
+ fetcher.gem 'a', 2.0
541
+ fetcher.gem 'a', 2.0 do |s|
542
+ s.required_ruby_version = "< #{RUBY_VERSION}.a"
543
+ s.platform = local
544
+ end
545
+ end
546
+
547
+ @cmd.options[:args] = %w[a]
548
+
549
+ use_ui @ui do
550
+ assert_raises Gem::MockGemUi::SystemExitException, @ui.error do
551
+ @cmd.execute
552
+ end
553
+ end
554
+
555
+ assert_equal %w[a-2.0], @cmd.installed_specs.map {|spec| spec.full_name }
556
+ end
557
+
558
+ def test_execute_required_ruby_version_specific_not_met
559
+ spec_fetcher do |fetcher|
560
+ fetcher.gem 'a', '1.0' do |s|
561
+ s.required_ruby_version = '= 1.4.6'
562
+ end
563
+ end
564
+
565
+ @cmd.options[:args] = %w[a]
566
+
567
+ use_ui @ui do
568
+ assert_raises Gem::MockGemUi::TermError do
569
+ @cmd.execute
570
+ end
571
+ end
572
+
573
+ errs = @ui.error.split("\n")
574
+ assert_equal "ERROR: Error installing a:", errs.shift
575
+ assert_equal "\ta-1.0 requires Ruby version = 1.4.6. The current ruby version is #{Gem.ruby_version}.", errs.shift
576
+ end
577
+
578
+ def test_execute_required_ruby_version_specific_prerelease_met
579
+ spec_fetcher do |fetcher|
580
+ fetcher.gem 'a', '1.0' do |s|
581
+ s.required_ruby_version = '>= 1.4.6.preview2'
582
+ end
583
+ end
584
+
585
+ @cmd.options[:args] = %w[a]
586
+
587
+ use_ui @ui do
588
+ assert_raises Gem::MockGemUi::SystemExitException, @ui.error do
589
+ @cmd.execute
590
+ end
591
+ end
592
+
593
+ assert_equal %w[a-1.0], @cmd.installed_specs.map {|spec| spec.full_name }
594
+ end
595
+
596
+ def test_execute_required_ruby_version_specific_prerelease_not_met
597
+ next_ruby_pre = Gem.ruby_version.segments.map.with_index{|n, i| i == 1 ? n + 1 : n }.join(".") + ".a"
598
+
599
+ spec_fetcher do |fetcher|
600
+ fetcher.gem 'a', '1.0' do |s|
601
+ s.required_ruby_version = "> #{next_ruby_pre}"
602
+ end
603
+ end
604
+
605
+ @cmd.options[:args] = %w[a]
606
+
607
+ use_ui @ui do
608
+ assert_raises Gem::MockGemUi::TermError do
609
+ @cmd.execute
610
+ end
611
+ end
612
+
613
+ errs = @ui.error.split("\n")
614
+ assert_equal "ERROR: Error installing a:", errs.shift
615
+ assert_equal "\ta-1.0 requires Ruby version > #{next_ruby_pre}. The current ruby version is #{Gem.ruby_version}.", errs.shift
616
+ end
617
+
618
+ def test_execute_required_rubygems_version_wrong
619
+ spec_fetcher do |fetcher|
620
+ fetcher.gem 'a', '1.0' do |s|
621
+ s.required_rubygems_version = '< 0'
622
+ end
623
+ end
624
+
625
+ @cmd.options[:args] = %w[a]
626
+
627
+ use_ui @ui do
628
+ assert_raises Gem::MockGemUi::TermError do
629
+ @cmd.execute
630
+ end
631
+ end
632
+
633
+ errs = @ui.error.split("\n")
634
+ assert_equal "ERROR: Error installing a:", errs.shift
635
+ assert_equal "\ta-1.0 requires RubyGems version < 0. The current RubyGems version is #{Gem.rubygems_version}. Try 'gem update --system' to update RubyGems itself.", errs.shift
636
+ end
637
+
507
638
  def test_execute_rdoc
508
639
  specs = spec_fetcher do |fetcher|
509
640
  fetcher.gem 'a', 2
@@ -1172,12 +1172,16 @@ gem 'other', version
1172
1172
  end
1173
1173
 
1174
1174
  def test_install_force
1175
+ _, missing_dep_gem = util_gem 'missing_dep', '1' do |s|
1176
+ s.add_dependency 'doesnt_exist', '1'
1177
+ end
1178
+
1175
1179
  use_ui @ui do
1176
- installer = Gem::Installer.at old_ruby_required('= 1.4.6'), :force => true
1180
+ installer = Gem::Installer.at missing_dep_gem, :force => true
1177
1181
  installer.install
1178
1182
  end
1179
1183
 
1180
- gem_dir = File.join(@gemhome, 'gems', 'old_ruby_required-1')
1184
+ gem_dir = File.join(@gemhome, 'gems', 'missing_dep-1')
1181
1185
  assert_path_exists gem_dir
1182
1186
  end
1183
1187
 
@@ -1620,54 +1624,6 @@ gem 'other', version
1620
1624
  end
1621
1625
  end
1622
1626
 
1623
- def test_pre_install_checks_ruby_version
1624
- use_ui @ui do
1625
- installer = Gem::Installer.at old_ruby_required('= 1.4.6')
1626
- e = assert_raises Gem::RuntimeRequirementNotMetError do
1627
- installer.pre_install_checks
1628
- end
1629
- rv = Gem.ruby_version
1630
- assert_equal "old_ruby_required requires Ruby version = 1.4.6. The current ruby version is #{rv}.",
1631
- e.message
1632
- end
1633
- end
1634
-
1635
- def test_pre_install_checks_ruby_version_with_prereleases
1636
- util_set_RUBY_VERSION '2.6.0', -1, '63539', 'ruby 2.6.0preview2 (2018-05-31 trunk 63539) [x86_64-linux]'
1637
-
1638
- installer = Gem::Installer.at old_ruby_required('>= 2.6.0.preview2')
1639
- assert installer.pre_install_checks
1640
-
1641
- installer = Gem::Installer.at old_ruby_required('> 2.6.0.preview2')
1642
- e = assert_raises Gem::RuntimeRequirementNotMetError do
1643
- assert installer.pre_install_checks
1644
- end
1645
- assert_equal "old_ruby_required requires Ruby version > 2.6.0.preview2. The current ruby version is 2.6.0.preview2.",
1646
- e.message
1647
- ensure
1648
- util_restore_RUBY_VERSION
1649
- end
1650
-
1651
- def test_pre_install_checks_wrong_rubygems_version
1652
- spec = util_spec 'old_rubygems_required', '1' do |s|
1653
- s.required_rubygems_version = '< 0'
1654
- end
1655
-
1656
- util_build_gem spec
1657
-
1658
- gem = File.join(@gemhome, 'cache', spec.file_name)
1659
-
1660
- use_ui @ui do
1661
- installer = Gem::Installer.at gem
1662
- e = assert_raises Gem::RuntimeRequirementNotMetError do
1663
- installer.pre_install_checks
1664
- end
1665
- rgv = Gem::VERSION
1666
- assert_equal "old_rubygems_required requires RubyGems version < 0. The current RubyGems version is #{rgv}. " +
1667
- "Try 'gem update --system' to update RubyGems itself.", e.message
1668
- end
1669
- end
1670
-
1671
1627
  def test_pre_install_checks_malicious_name
1672
1628
  spec = util_spec '../malicious', '1'
1673
1629
  def spec.full_name # so the spec is buildable
@@ -2252,16 +2208,6 @@ gem 'other', version
2252
2208
  assert_kind_of(String, installer.gem)
2253
2209
  end
2254
2210
 
2255
- def old_ruby_required(requirement)
2256
- spec = util_spec 'old_ruby_required', '1' do |s|
2257
- s.required_ruby_version = requirement
2258
- end
2259
-
2260
- util_build_gem spec
2261
-
2262
- spec.cache_file
2263
- end
2264
-
2265
2211
  def util_execless
2266
2212
  @spec = util_spec 'z'
2267
2213
  util_build_gem @spec
@@ -6,29 +6,29 @@ class TestGemResolverAPISet < Gem::TestCase
6
6
  super
7
7
 
8
8
  @DR = Gem::Resolver
9
- @dep_uri = URI "#{@gem_repo}api/v1/dependencies"
9
+ @dep_uri = URI "#{@gem_repo}info/"
10
10
  end
11
11
 
12
12
  def test_initialize
13
13
  set = @DR::APISet.new
14
14
 
15
- assert_equal URI('https://rubygems.org/api/v1/dependencies'), set.dep_uri
16
- assert_equal URI('https://rubygems.org'), set.uri
17
- assert_equal Gem::Source.new(URI('https://rubygems.org')), set.source
15
+ assert_equal URI('https://index.rubygems.org/info/'), set.dep_uri
16
+ assert_equal URI('https://index.rubygems.org/'), set.uri
17
+ assert_equal Gem::Source.new(URI('https://index.rubygems.org')), set.source
18
18
  end
19
19
 
20
20
  def test_initialize_deeper_uri
21
- set = @DR::APISet.new 'https://rubygemsserver.com/mygems/api/v1/dependencies'
21
+ set = @DR::APISet.new 'https://rubygemsserver.com/mygems/info'
22
22
 
23
- assert_equal URI('https://rubygemsserver.com/mygems/api/v1/dependencies'), set.dep_uri
24
- assert_equal URI('https://rubygemsserver.com/mygems/'), set.uri
25
- assert_equal Gem::Source.new(URI('https://rubygemsserver.com/mygems/')), set.source
23
+ assert_equal URI('https://rubygemsserver.com/mygems/info'), set.dep_uri
24
+ assert_equal URI('https://rubygemsserver.com/'), set.uri
25
+ assert_equal Gem::Source.new(URI('https://rubygemsserver.com/')), set.source
26
26
  end
27
27
 
28
28
  def test_initialize_uri
29
29
  set = @DR::APISet.new @dep_uri
30
30
 
31
- assert_equal URI("#{@gem_repo}api/v1/dependencies"), set.dep_uri
31
+ assert_equal URI("#{@gem_repo}info/"), set.dep_uri
32
32
  assert_equal URI("#{@gem_repo}"), set.uri
33
33
  end
34
34
 
@@ -42,7 +42,7 @@ class TestGemResolverAPISet < Gem::TestCase
42
42
  :dependencies => [] },
43
43
  ]
44
44
 
45
- @fetcher.data["#{@dep_uri}?gems=a"] = Marshal.dump data
45
+ @fetcher.data["#{@dep_uri}a"] = "---\n1 "
46
46
 
47
47
  set = @DR::APISet.new @dep_uri
48
48
 
@@ -69,7 +69,7 @@ class TestGemResolverAPISet < Gem::TestCase
69
69
  :dependencies => [] },
70
70
  ]
71
71
 
72
- @fetcher.data["#{@dep_uri}?gems=a"] = Marshal.dump data
72
+ @fetcher.data["#{@dep_uri}a"] = "---\n1\n2.a"
73
73
 
74
74
  set = @DR::APISet.new @dep_uri
75
75
  set.prerelease = true
@@ -94,7 +94,7 @@ class TestGemResolverAPISet < Gem::TestCase
94
94
  :dependencies => [] },
95
95
  ]
96
96
 
97
- @fetcher.data["#{@dep_uri}?gems=a"] = Marshal.dump data
97
+ @fetcher.data["#{@dep_uri}a"] = "---\n1 "
98
98
 
99
99
  set = @DR::APISet.new @dep_uri
100
100
 
@@ -108,7 +108,7 @@ class TestGemResolverAPISet < Gem::TestCase
108
108
 
109
109
  assert_equal expected, set.find_all(a_dep)
110
110
 
111
- @fetcher.data.delete "#{@dep_uri}?gems=a"
111
+ @fetcher.data.delete "#{@dep_uri}a"
112
112
  end
113
113
 
114
114
  def test_find_all_local
@@ -123,7 +123,7 @@ class TestGemResolverAPISet < Gem::TestCase
123
123
  def test_find_all_missing
124
124
  spec_fetcher
125
125
 
126
- @fetcher.data["#{@dep_uri}?gems=a"] = Marshal.dump []
126
+ @fetcher.data["#{@dep_uri}a"] = "---"
127
127
 
128
128
  set = @DR::APISet.new @dep_uri
129
129
 
@@ -131,7 +131,7 @@ class TestGemResolverAPISet < Gem::TestCase
131
131
 
132
132
  assert_empty set.find_all(a_dep)
133
133
 
134
- @fetcher.data.delete "#{@dep_uri}?gems=a"
134
+ @fetcher.data.delete "#{@dep_uri}a"
135
135
 
136
136
  assert_empty set.find_all(a_dep)
137
137
  end
@@ -139,15 +139,8 @@ class TestGemResolverAPISet < Gem::TestCase
139
139
  def test_prefetch
140
140
  spec_fetcher
141
141
 
142
- data = [
143
- { :name => 'a',
144
- :number => '1',
145
- :platform => 'ruby',
146
- :dependencies => [] },
147
- ]
148
-
149
- @fetcher.data["#{@dep_uri}?gems=a,b"] = Marshal.dump data
150
- @fetcher.data["#{@dep_uri}?gems=b"] = Marshal.dump []
142
+ @fetcher.data["#{@dep_uri}a"] = "---\n1 \n"
143
+ @fetcher.data["#{@dep_uri}b"] = "---"
151
144
 
152
145
  set = @DR::APISet.new @dep_uri
153
146
 
@@ -163,14 +156,7 @@ class TestGemResolverAPISet < Gem::TestCase
163
156
  def test_prefetch_cache
164
157
  spec_fetcher
165
158
 
166
- data = [
167
- { :name => 'a',
168
- :number => '1',
169
- :platform => 'ruby',
170
- :dependencies => [] },
171
- ]
172
-
173
- @fetcher.data["#{@dep_uri}?gems=a"] = Marshal.dump data
159
+ @fetcher.data["#{@dep_uri}a"] = "---\n1 \n"
174
160
 
175
161
  set = @DR::APISet.new @dep_uri
176
162
 
@@ -179,8 +165,8 @@ class TestGemResolverAPISet < Gem::TestCase
179
165
 
180
166
  set.prefetch [a_dep]
181
167
 
182
- @fetcher.data.delete "#{@dep_uri}?gems=a"
183
- @fetcher.data["#{@dep_uri}?gems=b"] = Marshal.dump []
168
+ @fetcher.data.delete "#{@dep_uri}a"
169
+ @fetcher.data["#{@dep_uri}?b"] = "---"
184
170
 
185
171
  set.prefetch [a_dep, b_dep]
186
172
  end
@@ -188,14 +174,8 @@ class TestGemResolverAPISet < Gem::TestCase
188
174
  def test_prefetch_cache_missing
189
175
  spec_fetcher
190
176
 
191
- data = [
192
- { :name => 'a',
193
- :number => '1',
194
- :platform => 'ruby',
195
- :dependencies => [] },
196
- ]
197
-
198
- @fetcher.data["#{@dep_uri}?gems=a,b"] = Marshal.dump data
177
+ @fetcher.data["#{@dep_uri}a"] = "---\n1 \n"
178
+ @fetcher.data["#{@dep_uri}b"] = "---"
199
179
 
200
180
  set = @DR::APISet.new @dep_uri
201
181
 
@@ -204,7 +184,8 @@ class TestGemResolverAPISet < Gem::TestCase
204
184
 
205
185
  set.prefetch [a_dep, b_dep]
206
186
 
207
- @fetcher.data.delete "#{@dep_uri}?gems=a,b"
187
+ @fetcher.data.delete "#{@dep_uri}a"
188
+ @fetcher.data.delete "#{@dep_uri}b"
208
189
 
209
190
  set.prefetch [a_dep, b_dep]
210
191
  end
@@ -212,15 +193,8 @@ class TestGemResolverAPISet < Gem::TestCase
212
193
  def test_prefetch_local
213
194
  spec_fetcher
214
195
 
215
- data = [
216
- { :name => 'a',
217
- :number => '1',
218
- :platform => 'ruby',
219
- :dependencies => [] },
220
- ]
221
-
222
- @fetcher.data["#{@dep_uri}?gems=a,b"] = Marshal.dump data
223
- @fetcher.data["#{@dep_uri}?gems=b"] = Marshal.dump []
196
+ @fetcher.data["#{@dep_uri}a"] = "---\n1 \n"
197
+ @fetcher.data["#{@dep_uri}b"] = "---"
224
198
 
225
199
  set = @DR::APISet.new @dep_uri
226
200
  set.remote = false
@@ -39,7 +39,7 @@ class TestGemResolverAPISpecification < Gem::TestCase
39
39
 
40
40
  rails = specs['rails-3.0.3']
41
41
 
42
- repo = @gem_repo + 'api/v1/dependencies'
42
+ repo = @gem_repo + 'info'
43
43
 
44
44
  set = Gem::Resolver::APISet.new repo
45
45
 
@@ -123,7 +123,7 @@ class TestGemResolverAPISpecification < Gem::TestCase
123
123
  fetcher.spec 'a', 1
124
124
  end
125
125
 
126
- dep_uri = URI(@gem_repo) + 'api/v1/dependencies'
126
+ dep_uri = URI(@gem_repo) + 'info'
127
127
  set = Gem::Resolver::APISet.new dep_uri
128
128
  data = {
129
129
  :name => 'a',
@@ -147,7 +147,7 @@ class TestGemResolverAPISpecification < Gem::TestCase
147
147
  end
148
148
  end
149
149
 
150
- dep_uri = URI(@gem_repo) + 'api/v1/dependencies'
150
+ dep_uri = URI(@gem_repo) + 'info'
151
151
  set = Gem::Resolver::APISet.new dep_uri
152
152
  data = {
153
153
  :name => 'j',
@@ -39,7 +39,7 @@ class TestGemResolverBestSet < Gem::TestCase
39
39
 
40
40
  set = @DR::BestSet.new
41
41
 
42
- api_uri = URI(@gem_repo) + './api/v1/dependencies'
42
+ api_uri = URI(@gem_repo)
43
43
 
44
44
  set.sets << Gem::Resolver::APISet.new(api_uri)
45
45
 
@@ -99,12 +99,12 @@ class TestGemResolverBestSet < Gem::TestCase
99
99
  def test_replace_failed_api_set
100
100
  set = @DR::BestSet.new
101
101
 
102
- api_uri = URI(@gem_repo) + './api/v1/dependencies'
102
+ api_uri = URI(@gem_repo) + './info/'
103
103
  api_set = Gem::Resolver::APISet.new api_uri
104
104
 
105
105
  set.sets << api_set
106
106
 
107
- error_uri = api_uri + '?gems=a'
107
+ error_uri = api_uri + 'a'
108
108
 
109
109
  error = Gem::RemoteFetcher::FetchError.new 'bogus', error_uri
110
110