rubygems-update 2.3.0 → 2.4.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 (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