rubygems-update 2.3.0 → 2.4.0

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.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING +14 -2
  5. data/History.txt +63 -0
  6. data/Rakefile +68 -91
  7. data/lib/rubygems.rb +5 -3
  8. data/lib/rubygems/command_manager.rb +1 -0
  9. data/lib/rubygems/commands/contents_command.rb +23 -2
  10. data/lib/rubygems/commands/install_command.rb +8 -0
  11. data/lib/rubygems/commands/open_command.rb +1 -8
  12. data/lib/rubygems/commands/uninstall_command.rb +9 -1
  13. data/lib/rubygems/commands/update_command.rb +1 -1
  14. data/lib/rubygems/core_ext/kernel_gem.rb +8 -1
  15. data/lib/rubygems/core_ext/kernel_require.rb +12 -22
  16. data/lib/rubygems/defaults.rb +17 -5
  17. data/lib/rubygems/dependency.rb +7 -1
  18. data/lib/rubygems/dependency_installer.rb +3 -0
  19. data/lib/rubygems/ext/ext_conf_builder.rb +13 -11
  20. data/lib/rubygems/install_update_options.rb +13 -0
  21. data/lib/rubygems/installer.rb +36 -20
  22. data/lib/rubygems/installer_test_case.rb +2 -0
  23. data/lib/rubygems/local_remote_options.rb +1 -1
  24. data/lib/rubygems/name_tuple.rb +1 -1
  25. data/lib/rubygems/request_set.rb +14 -3
  26. data/lib/rubygems/request_set/gem_dependency_api.rb +12 -0
  27. data/lib/rubygems/request_set/lockfile.rb +3 -1
  28. data/lib/rubygems/resolver.rb +15 -0
  29. data/lib/rubygems/resolver/best_set.rb +28 -0
  30. data/lib/rubygems/resolver/conflict.rb +45 -7
  31. data/lib/rubygems/resolver/git_specification.rb +24 -0
  32. data/lib/rubygems/resolver/lock_specification.rb +22 -0
  33. data/lib/rubygems/source.rb +2 -0
  34. data/lib/rubygems/source/git.rb +1 -1
  35. data/lib/rubygems/source/installed.rb +2 -1
  36. data/lib/rubygems/specification.rb +16 -15
  37. data/lib/rubygems/test_case.rb +9 -5
  38. data/test/rubygems/test_gem.rb +72 -2
  39. data/test/rubygems/test_gem_commands_contents_command.rb +46 -3
  40. data/test/rubygems/test_gem_commands_install_command.rb +32 -0
  41. data/test/rubygems/test_gem_commands_uninstall_command.rb +18 -0
  42. data/test/rubygems/test_gem_dependency.rb +23 -0
  43. data/test/rubygems/test_gem_dependency_installer.rb +17 -0
  44. data/test/rubygems/test_gem_ext_builder.rb +12 -1
  45. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +2 -2
  46. data/test/rubygems/test_gem_impossible_dependencies_error.rb +24 -8
  47. data/test/rubygems/test_gem_install_update_options.rb +16 -0
  48. data/test/rubygems/test_gem_installer.rb +52 -0
  49. data/test/rubygems/test_gem_local_remote_options.rb +13 -0
  50. data/test/rubygems/test_gem_package.rb +3 -1
  51. data/test/rubygems/test_gem_package_tar_header.rb +2 -0
  52. data/test/rubygems/test_gem_package_tar_reader.rb +11 -1
  53. data/test/rubygems/test_gem_package_tar_reader_entry.rb +17 -2
  54. data/test/rubygems/test_gem_package_tar_writer.rb +1 -0
  55. data/test/rubygems/test_gem_remote_fetcher.rb +24 -0
  56. data/test/rubygems/test_gem_request_set.rb +74 -4
  57. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +9 -1
  58. data/test/rubygems/test_gem_request_set_lockfile.rb +3 -1
  59. data/test/rubygems/test_gem_requirement.rb +8 -0
  60. data/test/rubygems/test_gem_resolver.rb +39 -0
  61. data/test/rubygems/test_gem_resolver_best_set.rb +57 -0
  62. data/test/rubygems/test_gem_resolver_conflict.rb +22 -10
  63. data/test/rubygems/test_gem_resolver_git_specification.rb +12 -0
  64. data/test/rubygems/test_gem_source_git.rb +6 -2
  65. data/test/rubygems/test_gem_source_installed.rb +8 -0
  66. data/test/rubygems/test_gem_source_lock.rb +2 -2
  67. data/test/rubygems/test_gem_source_vendor.rb +4 -0
  68. data/test/rubygems/test_kernel.rb +6 -0
  69. data/test/rubygems/test_require.rb +60 -0
  70. metadata +5 -5
  71. metadata.gz.sig +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  begin
4
4
  gem 'minitest', '~> 4.0'
5
- rescue NoMethodError
5
+ rescue NoMethodError, Gem::LoadError
6
6
  # for ruby tests
7
7
  end
8
8
 
@@ -218,8 +218,11 @@ class Gem::TestCase < MiniTest::Unit::TestCase
218
218
  def setup
219
219
  super
220
220
 
221
- @orig_gem_home = ENV['GEM_HOME']
222
- @orig_gem_path = ENV['GEM_PATH']
221
+ @orig_gem_home = ENV['GEM_HOME']
222
+ @orig_gem_path = ENV['GEM_PATH']
223
+ @orig_gem_vendor = ENV['GEM_VENDOR']
224
+
225
+ ENV['GEM_VENDOR'] = nil
223
226
 
224
227
  @current_dir = Dir.pwd
225
228
  @fetcher = nil
@@ -347,8 +350,9 @@ class Gem::TestCase < MiniTest::Unit::TestCase
347
350
 
348
351
  FileUtils.rm_rf @tempdir unless ENV['KEEP_FILES']
349
352
 
350
- ENV['GEM_HOME'] = @orig_gem_home
351
- ENV['GEM_PATH'] = @orig_gem_path
353
+ ENV['GEM_HOME'] = @orig_gem_home
354
+ ENV['GEM_PATH'] = @orig_gem_path
355
+ ENV['GEM_VENDOR'] = @orig_gem_vendor
352
356
 
353
357
  Gem.ruby = @orig_ruby if @orig_ruby
354
358
 
@@ -75,6 +75,21 @@ class TestGem < Gem::TestCase
75
75
  end
76
76
  end
77
77
 
78
+ def test_self_install
79
+ spec_fetcher do |f|
80
+ f.gem 'a', 1
81
+ f.spec 'a', 2
82
+ end
83
+
84
+ gemhome2 = "#{@gemhome}2"
85
+
86
+ installed = Gem.install 'a', '= 1', :install_dir => gemhome2
87
+
88
+ assert_equal %w[a-1], installed.map { |spec| spec.full_name }
89
+
90
+ assert_path_exists File.join(gemhome2, 'gems', 'a-1')
91
+ end
92
+
78
93
  def test_require_missing
79
94
  save_loaded_features do
80
95
  assert_raises ::LoadError do
@@ -216,6 +231,45 @@ class TestGem < Gem::TestCase
216
231
  end
217
232
  end
218
233
 
234
+ def test_default_path
235
+ orig_vendordir = RbConfig::CONFIG['vendordir']
236
+ RbConfig::CONFIG['vendordir'] = File.join @tempdir, 'vendor'
237
+
238
+ FileUtils.rm_rf Gem.user_home
239
+
240
+ expected = [Gem.default_dir]
241
+
242
+ assert_equal expected, Gem.default_path
243
+ ensure
244
+ RbConfig::CONFIG['vendordir'] = orig_vendordir
245
+ end
246
+
247
+ def test_default_path_user_home
248
+ orig_vendordir = RbConfig::CONFIG['vendordir']
249
+ RbConfig::CONFIG['vendordir'] = File.join @tempdir, 'vendor'
250
+
251
+ expected = [Gem.user_dir, Gem.default_dir]
252
+
253
+ assert_equal expected, Gem.default_path
254
+ ensure
255
+ RbConfig::CONFIG['vendordir'] = orig_vendordir
256
+ end
257
+
258
+ def test_default_path_vendor_dir
259
+ orig_vendordir = RbConfig::CONFIG['vendordir']
260
+ RbConfig::CONFIG['vendordir'] = File.join @tempdir, 'vendor'
261
+
262
+ FileUtils.mkdir_p Gem.vendor_dir
263
+
264
+ FileUtils.rm_rf Gem.user_home
265
+
266
+ expected = [Gem.default_dir, Gem.vendor_dir]
267
+
268
+ assert_equal expected, Gem.default_path
269
+ ensure
270
+ RbConfig::CONFIG['vendordir'] = orig_vendordir
271
+ end
272
+
219
273
  def test_self_default_sources
220
274
  assert_equal %w[https://rubygems.org/], Gem.default_sources
221
275
  end
@@ -968,6 +1022,21 @@ class TestGem < Gem::TestCase
968
1022
  end
969
1023
  end
970
1024
 
1025
+ def test_self_vendor_dir
1026
+ expected =
1027
+ File.join RbConfig::CONFIG['vendordir'], 'gems',
1028
+ RbConfig::CONFIG['ruby_version']
1029
+
1030
+ assert_equal expected, Gem.vendor_dir
1031
+ end
1032
+
1033
+ def test_self_vendor_dir_ENV_GEM_VENDOR
1034
+ ENV['GEM_VENDOR'] = File.join @tempdir, 'vendor', 'gems'
1035
+
1036
+ assert_equal ENV['GEM_VENDOR'], Gem.vendor_dir
1037
+ refute Gem.vendor_dir.frozen?
1038
+ end
1039
+
971
1040
  def test_load_plugins
972
1041
  skip 'Insecure operation - chdir' if RUBY_VERSION <= "1.8.7"
973
1042
  plugin_path = File.join "lib", "rubygems_plugin.rb"
@@ -1268,15 +1337,16 @@ class TestGem < Gem::TestCase
1268
1337
  end
1269
1338
 
1270
1339
  def test_use_gemdeps
1340
+ gem_deps_file = 'gem.deps.rb'.untaint
1271
1341
  spec = util_spec 'a', 1
1272
1342
 
1273
1343
  refute spec.activated?
1274
1344
 
1275
- open 'gem.deps.rb', 'w' do |io|
1345
+ open gem_deps_file, 'w' do |io|
1276
1346
  io.write 'gem "a"'
1277
1347
  end
1278
1348
 
1279
- Gem.use_gemdeps 'gem.deps.rb'
1349
+ Gem.use_gemdeps gem_deps_file
1280
1350
 
1281
1351
  assert spec.activated?
1282
1352
  end
@@ -9,8 +9,8 @@ class TestGemCommandsContentsCommand < Gem::TestCase
9
9
  @cmd = Gem::Commands::ContentsCommand.new
10
10
  end
11
11
 
12
- def gem name
13
- spec = quick_gem name do |gem|
12
+ def gem name, version = 2
13
+ spec = quick_gem name, version do |gem|
14
14
  gem.files = %W[lib/#{name}.rb Rakefile]
15
15
  end
16
16
  write_file File.join(*%W[gems #{spec.full_name} lib #{name}.rb])
@@ -135,6 +135,40 @@ class TestGemCommandsContentsCommand < Gem::TestCase
135
135
  assert_equal "", @ui.error
136
136
  end
137
137
 
138
+ def test_execute_show_install_dir
139
+ @cmd.options[:args] = %w[foo]
140
+ @cmd.options[:show_install_dir] = true
141
+
142
+ gem 'foo'
143
+
144
+ use_ui @ui do
145
+ @cmd.execute
146
+ end
147
+
148
+ expected = File.join @gemhome, 'gems', 'foo-2'
149
+
150
+ assert_equal "#{expected}\n", @ui.output
151
+ assert_equal "", @ui.error
152
+ end
153
+
154
+ def test_execute_show_install_dir_version
155
+ @cmd.options[:args] = %w[foo]
156
+ @cmd.options[:show_install_dir] = true
157
+ @cmd.options[:version] = Gem::Requirement.new '= 1'
158
+
159
+ gem 'foo', 1
160
+ gem 'foo', 2
161
+
162
+ use_ui @ui do
163
+ @cmd.execute
164
+ end
165
+
166
+ expected = File.join @gemhome, 'gems', 'foo-1'
167
+
168
+ assert_equal "#{expected}\n", @ui.output
169
+ assert_equal "", @ui.error
170
+ end
171
+
138
172
  def test_execute_no_prefix
139
173
  @cmd.options[:args] = %w[foo]
140
174
  @cmd.options[:prefix] = false
@@ -183,13 +217,22 @@ lib/foo.rb
183
217
  assert @cmd.options[:prefix]
184
218
  assert_empty @cmd.options[:specdirs]
185
219
  assert_nil @cmd.options[:version]
220
+ refute @cmd.options[:show_install_dir]
186
221
 
187
- @cmd.send :handle_options, %w[-l -s foo --version 0.0.2 --no-prefix]
222
+ @cmd.send :handle_options, %w[
223
+ -l
224
+ -s
225
+ foo
226
+ --version 0.0.2
227
+ --no-prefix
228
+ --show-install-dir
229
+ ]
188
230
 
189
231
  assert @cmd.options[:lib_only]
190
232
  refute @cmd.options[:prefix]
191
233
  assert_equal %w[foo], @cmd.options[:specdirs]
192
234
  assert_equal Gem::Requirement.new('0.0.2'), @cmd.options[:version]
235
+ assert @cmd.options[:show_install_dir]
193
236
  end
194
237
 
195
238
  end
@@ -565,6 +565,11 @@ ERROR: Possible alternatives: non_existent_with_hint
565
565
  end
566
566
 
567
567
  def test_install_gem_ignore_dependencies_both
568
+ done_installing = false
569
+ Gem.done_installing do
570
+ done_installing = true
571
+ end
572
+
568
573
  spec = quick_spec 'a', 2
569
574
 
570
575
  util_build_gem spec
@@ -576,6 +581,8 @@ ERROR: Possible alternatives: non_existent_with_hint
576
581
  @cmd.install_gem 'a', '>= 0'
577
582
 
578
583
  assert_equal %w[a-2], @cmd.installed_specs.map { |s| s.full_name }
584
+
585
+ assert done_installing, 'documentation was not generated'
579
586
  end
580
587
 
581
588
  def test_install_gem_ignore_dependencies_remote
@@ -729,6 +736,31 @@ ERROR: Possible alternatives: non_existent_with_hint
729
736
  assert !File.exist?("#{@gemdeps}.lock")
730
737
  end
731
738
 
739
+ def test_execute_installs_from_a_gemdeps_with_conservative
740
+ spec_fetcher do |fetcher|
741
+ fetcher.gem 'a', 2
742
+ fetcher.clear
743
+ fetcher.gem 'a', 1
744
+ end
745
+
746
+ File.open @gemdeps, "w" do |f|
747
+ f << "gem 'a'"
748
+ end
749
+
750
+ @cmd.handle_options %w[--conservative]
751
+ @cmd.options[:gemdeps] = @gemdeps
752
+
753
+ use_ui @ui do
754
+ assert_raises Gem::MockGemUi::SystemExitException, @ui.error do
755
+ @cmd.execute
756
+ end
757
+ end
758
+
759
+ assert_equal %w[], @cmd.installed_specs.map { |spec| spec.full_name }
760
+
761
+ assert_match "Using a (1)", @ui.output
762
+ end
763
+
732
764
  def test_execute_installs_from_a_gemdeps
733
765
  spec_fetcher do |fetcher|
734
766
  fetcher.gem 'a', 2
@@ -239,6 +239,24 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase
239
239
  assert_equal nil, @cmd.options[:install_dir]
240
240
  assert_equal true, @cmd.options[:user_install]
241
241
  assert_equal Gem::Requirement.default, @cmd.options[:version]
242
+ assert_equal false, @cmd.options[:vendor]
243
+ end
244
+
245
+ def test_handle_options_vendor
246
+ use_ui @ui do
247
+ @cmd.handle_options %w[--vendor]
248
+ end
249
+
250
+ assert @cmd.options[:vendor]
251
+ assert_equal Gem.vendor_dir, @cmd.options[:install_dir]
252
+
253
+ assert_empty @ui.output
254
+
255
+ expected = <<-EXPECTED
256
+ WARNING: Use your OS package manager to uninstall vendor gems
257
+ EXPECTED
258
+
259
+ assert_equal expected, @ui.error
242
260
  end
243
261
 
244
262
  end
@@ -266,6 +266,29 @@ class TestGemDependency < Gem::TestCase
266
266
  assert dep('a', '= 1').specific?
267
267
  end
268
268
 
269
+ def test_to_spec
270
+ util_spec 'a', '1'
271
+ a_2 = util_spec 'a', '2'
272
+
273
+ a_dep = dep 'a', '>= 0'
274
+
275
+ assert_equal a_2, a_dep.to_spec
276
+ end
277
+
278
+ def test_to_spec_prerelease
279
+ a_1 = util_spec 'a', '1'
280
+ a_1_1_a = util_spec 'a', '1.1.a'
281
+
282
+ a_dep = dep 'a', '>= 0'
283
+
284
+ assert_equal a_1, a_dep.to_spec
285
+
286
+ a_pre_dep = dep 'a', '>= 0'
287
+ a_pre_dep.prerelease = true
288
+
289
+ assert_equal a_1_1_a, a_pre_dep.to_spec
290
+ end
291
+
269
292
  def test_to_specs_suggests_other_versions
270
293
  a = util_spec 'a', '1.0', 'b' => '>= 1.0'
271
294
 
@@ -554,6 +554,23 @@ class TestGemDependencyInstaller < Gem::TestCase
554
554
  assert_equal %w[a-1 e-1], inst.installed_gems.map { |s| s.full_name }
555
555
  end
556
556
 
557
+ def test_install_no_document
558
+ util_setup_gems
559
+
560
+ done_installing_called = false
561
+
562
+ Gem.done_installing do |dep_installer, specs|
563
+ done_installing_called = true
564
+ assert_empty dep_installer.document
565
+ end
566
+
567
+ inst = Gem::DependencyInstaller.new :domain => :local, :document => []
568
+
569
+ inst.install @a1_gem
570
+
571
+ assert done_installing_called
572
+ end
573
+
557
574
  def test_install_env_shebang
558
575
  util_setup_gems
559
576
 
@@ -132,6 +132,17 @@ install:
132
132
  assert_path_exists File.join @spec.gem_dir, 'lib', 'a', 'b.rb'
133
133
  end
134
134
 
135
+ def test_build_extensions_with_gemhome_with_space
136
+ new_gemhome = File.join @tempdir, 'gem home'
137
+ File.rename(@gemhome, new_gemhome)
138
+ @gemhome = new_gemhome
139
+ Gem.use_paths(@gemhome)
140
+ @spec = util_spec 'a'
141
+ @builder = Gem::Ext::Builder.new @spec, ''
142
+
143
+ test_build_extensions
144
+ end
145
+
135
146
  def test_build_extensions_install_ext_only
136
147
  class << Gem
137
148
  alias orig_install_extension_in_lib install_extension_in_lib
@@ -226,7 +237,7 @@ install:
226
237
 
227
238
  gem_make_out = File.join @spec.extension_dir, 'gem_make.out'
228
239
 
229
- assert_match %r%#{Regexp.escape Gem.ruby} extconf\.rb%,
240
+ assert_match %r%#{Regexp.escape Gem.ruby}.* extconf\.rb%,
230
241
  File.read(gem_make_out)
231
242
  assert_match %r%: No such file%,
232
243
  File.read(gem_make_out)
@@ -33,7 +33,7 @@ class TestGemExtExtConfBuilder < Gem::TestCase
33
33
  assert_same result, output
34
34
  end
35
35
 
36
- assert_match(/^#{Gem.ruby} extconf.rb/, output[0])
36
+ assert_match(/^#{Gem.ruby}.* extconf.rb/, output[0])
37
37
  assert_equal "creating Makefile\n", output[1]
38
38
  assert_contains_make_command 'clean', output[2]
39
39
  assert_contains_make_command '', output[4]
@@ -106,7 +106,7 @@ class TestGemExtExtConfBuilder < Gem::TestCase
106
106
 
107
107
  assert_equal 'extconf failed, exit code 1', error.message
108
108
 
109
- assert_equal("#{Gem.ruby} extconf.rb", output[0])
109
+ assert_match(/^#{Gem.ruby}.* extconf.rb/, output[0])
110
110
  assert_path_exists File.join @dest_path, 'mkmf.log'
111
111
  end
112
112
 
@@ -28,14 +28,30 @@ class TestGemImpossibleDependenciesError < Gem::TestCase
28
28
 
29
29
  expected = <<-EXPECTED
30
30
  rye-0.9.8 requires net-ssh (>= 2.0.13) but it conflicted:
31
- Activated net-ssh-2.6.5 via:
32
- net-ssh-2.6.5 (>= 2.0.13), rye-0.9.8 (= 0.9.8)
33
- instead of (~> 2.2.2) via:
34
- net-ssh-2.6.5 (>= 2.0.13), rye-0.9.8 (= 0.9.8)
35
- Activated net-ssh-2.2.2 via:
36
- net-ssh-2.2.2 (>= 2.0.13), rye-0.9.8 (= 0.9.8)
37
- instead of (>= 2.6.5) via:
38
- net-ssh-2.2.2 (>= 2.0.13), rye-0.9.8 (= 0.9.8)
31
+ Activated net-ssh-2.6.5
32
+ which does not match conflicting dependency (~> 2.2.2)
33
+
34
+ Conflicting dependency chains:
35
+ rye (= 0.9.8), 0.9.8 activated depends on
36
+ net-ssh (>= 2.0.13), 2.6.5 activated
37
+
38
+ versus:
39
+ rye (= 0.9.8), 0.9.8 activated depends on
40
+ net-ssh (>= 2.0.13), 2.6.5 activated depends on
41
+ net-ssh (~> 2.2.2)
42
+
43
+ Activated net-ssh-2.2.2
44
+ which does not match conflicting dependency (>= 2.6.5)
45
+
46
+ Conflicting dependency chains:
47
+ rye (= 0.9.8), 0.9.8 activated depends on
48
+ net-ssh (>= 2.0.13), 2.2.2 activated
49
+
50
+ versus:
51
+ rye (= 0.9.8), 0.9.8 activated depends on
52
+ net-ssh (>= 2.0.13), 2.2.2 activated depends on
53
+ net-ssh (>= 2.6.5)
54
+
39
55
  EXPECTED
40
56
 
41
57
  assert_equal expected, error.message
@@ -17,6 +17,7 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase
17
17
  def test_add_install_update_options
18
18
  args = %w[
19
19
  --document
20
+ --build-root build_root
20
21
  --format-exec
21
22
  --ignore-dependencies
22
23
  --rdoc
@@ -25,6 +26,7 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase
25
26
  -f
26
27
  -i /install_to
27
28
  -w
29
+ --vendor
28
30
  ]
29
31
 
30
32
  args.concat %w[-P HighSecurity] if defined?(OpenSSL::SSL)
@@ -32,6 +34,12 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase
32
34
  assert @cmd.handles?(args)
33
35
  end
34
36
 
37
+ def test_build_root
38
+ @cmd.handle_options %w[--build-root build_root]
39
+
40
+ assert_equal File.expand_path('build_root'), @cmd.options[:build_root]
41
+ end
42
+
35
43
  def test_doc
36
44
  @cmd.handle_options %w[--doc]
37
45
 
@@ -147,4 +155,12 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase
147
155
  ensure
148
156
  FileUtils.chmod 0755, @gemhome
149
157
  end
158
+
159
+ def test_vendor
160
+ @cmd.handle_options %w[--vendor]
161
+
162
+ assert @cmd.options[:vendor]
163
+ assert_equal Gem.vendor_dir, @cmd.options[:install_dir]
164
+ end
165
+
150
166
  end