rubygems-update 3.2.2 → 3.2.3

Sign up to get free protection for your applications and to get access to all the features.
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