rubygems-update 1.5.3 → 1.6.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 (79) hide show
  1. data.tar.gz.sig +2 -1
  2. data/History.txt +60 -9
  3. data/Manifest.txt +1 -1
  4. data/Rakefile +0 -2
  5. data/lib/rubygems.rb +142 -65
  6. data/lib/rubygems/commands/owner_command.rb +3 -2
  7. data/lib/rubygems/commands/pristine_command.rb +5 -3
  8. data/lib/rubygems/commands/push_command.rb +8 -4
  9. data/lib/rubygems/commands/setup_command.rb +1 -2
  10. data/lib/rubygems/commands/uninstall_command.rb +5 -0
  11. data/lib/rubygems/commands/unpack_command.rb +10 -16
  12. data/lib/rubygems/config_file.rb +12 -5
  13. data/lib/rubygems/custom_require.rb +27 -7
  14. data/lib/rubygems/dependency.rb +33 -8
  15. data/lib/rubygems/dependency_installer.rb +21 -6
  16. data/lib/rubygems/dependency_list.rb +35 -3
  17. data/lib/rubygems/doc_manager.rb +6 -4
  18. data/lib/rubygems/gem_path_searcher.rb +45 -1
  19. data/lib/rubygems/gemcutter_utilities.rb +33 -0
  20. data/lib/rubygems/indexer.rb +1 -0
  21. data/lib/rubygems/installer.rb +11 -7
  22. data/lib/rubygems/installer_test_case.rb +23 -15
  23. data/lib/rubygems/mock_gem_ui.rb +1 -1
  24. data/lib/rubygems/remote_fetcher.rb +29 -10
  25. data/lib/rubygems/requirement.rb +1 -1
  26. data/lib/rubygems/security.rb +1 -0
  27. data/lib/rubygems/source_index.rb +3 -2
  28. data/lib/rubygems/spec_fetcher.rb +3 -1
  29. data/lib/rubygems/specification.rb +54 -12
  30. data/lib/rubygems/test_case.rb +99 -28
  31. data/lib/rubygems/test_utilities.rb +11 -1
  32. data/lib/rubygems/uninstaller.rb +22 -11
  33. data/lib/rubygems/user_interaction.rb +50 -29
  34. data/lib/rubygems/validator.rb +1 -1
  35. data/test/rubygems/fix_openssl_warnings.rb +12 -0
  36. data/test/rubygems/plugin/load/rubygems_plugin.rb +3 -1
  37. data/test/rubygems/test_gem.rb +384 -38
  38. data/test/rubygems/test_gem_builder.rb +1 -1
  39. data/test/rubygems/test_gem_command_manager.rb +2 -2
  40. data/test/rubygems/test_gem_commands_build_command.rb +1 -1
  41. data/test/rubygems/test_gem_commands_cert_command.rb +2 -1
  42. data/test/rubygems/test_gem_commands_dependency_command.rb +6 -5
  43. data/test/rubygems/test_gem_commands_fetch_command.rb +4 -4
  44. data/test/rubygems/test_gem_commands_install_command.rb +21 -18
  45. data/test/rubygems/test_gem_commands_lock_command.rb +1 -1
  46. data/test/rubygems/test_gem_commands_outdated_command.rb +2 -5
  47. data/test/rubygems/test_gem_commands_owner_command.rb +42 -0
  48. data/test/rubygems/test_gem_commands_pristine_command.rb +28 -8
  49. data/test/rubygems/test_gem_commands_push_command.rb +31 -5
  50. data/test/rubygems/test_gem_commands_specification_command.rb +8 -8
  51. data/test/rubygems/test_gem_commands_stale_command.rb +4 -2
  52. data/test/rubygems/test_gem_commands_uninstall_command.rb +23 -4
  53. data/test/rubygems/test_gem_commands_unpack_command.rb +10 -8
  54. data/test/rubygems/test_gem_commands_update_command.rb +16 -13
  55. data/test/rubygems/test_gem_commands_which_command.rb +1 -1
  56. data/test/rubygems/test_gem_config_file.rb +14 -0
  57. data/test/rubygems/test_gem_dependency.rb +39 -0
  58. data/test/rubygems/test_gem_dependency_installer.rb +213 -92
  59. data/test/rubygems/test_gem_dependency_list.rb +37 -17
  60. data/test/rubygems/test_gem_doc_manager.rb +5 -4
  61. data/test/rubygems/test_gem_format.rb +2 -2
  62. data/test/rubygems/test_gem_gemcutter_utilities.rb +48 -0
  63. data/test/rubygems/test_gem_indexer.rb +11 -10
  64. data/test/rubygems/test_gem_install_update_options.rb +0 -2
  65. data/test/rubygems/test_gem_installer.rb +151 -78
  66. data/test/rubygems/test_gem_package_tar_output.rb +3 -0
  67. data/test/rubygems/test_gem_remote_fetcher.rb +23 -14
  68. data/test/rubygems/test_gem_requirement.rb +4 -0
  69. data/test/rubygems/test_gem_security.rb +1 -0
  70. data/test/rubygems/test_gem_source_index.rb +17 -16
  71. data/test/rubygems/test_gem_spec_fetcher.rb +6 -1
  72. data/test/rubygems/test_gem_specification.rb +81 -31
  73. data/test/rubygems/test_gem_stream_ui.rb +11 -1
  74. data/test/rubygems/test_gem_uninstaller.rb +70 -10
  75. data/test/rubygems/test_gem_validator.rb +1 -1
  76. data/test/rubygems/test_kernel.rb +1 -1
  77. metadata +7 -7
  78. metadata.gz.sig +0 -0
  79. data/ChangeLog +0 -5811
@@ -8,17 +8,17 @@ class TestGemDependencyList < Gem::TestCase
8
8
 
9
9
  @deplist = Gem::DependencyList.new
10
10
 
11
- @a1 = quick_gem 'a', '1'
12
- @a2 = quick_gem 'a', '2'
13
- @a3 = quick_gem 'a', '3'
11
+ @a1 = quick_spec 'a', '1'
12
+ @a2 = quick_spec 'a', '2'
13
+ @a3 = quick_spec 'a', '3'
14
14
 
15
- @b1 = quick_gem 'b', '1' do |s| s.add_dependency 'a', '>= 1' end
16
- @b2 = quick_gem 'b', '2' do |s| s.add_dependency 'a', '>= 1' end
15
+ @b1 = quick_spec 'b', '1' do |s| s.add_dependency 'a', '>= 1' end
16
+ @b2 = quick_spec 'b', '2' do |s| s.add_dependency 'a', '>= 1' end
17
17
 
18
- @c1 = quick_gem 'c', '1' do |s| s.add_dependency 'b', '>= 1' end
19
- @c2 = quick_gem 'c', '2'
18
+ @c1 = quick_spec 'c', '1' do |s| s.add_dependency 'b', '>= 1' end
19
+ @c2 = quick_spec 'c', '2'
20
20
 
21
- @d1 = quick_gem 'd', '1' do |s| s.add_dependency 'c', '>= 1' end
21
+ @d1 = quick_spec 'd', '1' do |s| s.add_dependency 'c', '>= 1' end
22
22
  end
23
23
 
24
24
  def test_self_from_source_index
@@ -66,9 +66,9 @@ class TestGemDependencyList < Gem::TestCase
66
66
  end
67
67
 
68
68
  def test_dependency_order_development
69
- e1 = quick_gem 'e', '1'
70
- f1 = quick_gem 'f', '1'
71
- g1 = quick_gem 'g', '1'
69
+ e1 = quick_spec 'e', '1'
70
+ f1 = quick_spec 'f', '1'
71
+ g1 = quick_spec 'g', '1'
72
72
 
73
73
  @a1.add_dependency 'e'
74
74
  @a1.add_dependency 'f'
@@ -94,7 +94,7 @@ class TestGemDependencyList < Gem::TestCase
94
94
 
95
95
  def test_dependency_order_diamond
96
96
  util_diamond
97
- e1 = quick_gem 'e', '1'
97
+ e1 = quick_spec 'e', '1'
98
98
  @deplist.add e1
99
99
  @a1.add_dependency 'e', '>= 1'
100
100
 
@@ -122,6 +122,8 @@ class TestGemDependencyList < Gem::TestCase
122
122
  end
123
123
 
124
124
  def test_ok_eh
125
+ util_clear_gems
126
+
125
127
  assert @deplist.ok?, 'no dependencies'
126
128
 
127
129
  @deplist.add @b2
@@ -133,14 +135,30 @@ class TestGemDependencyList < Gem::TestCase
133
135
  assert @deplist.ok?, 'satisfied dependency'
134
136
  end
135
137
 
138
+ def test_why_not_ok_eh
139
+ util_clear_gems
140
+
141
+ assert_equal({}, @deplist.why_not_ok?)
142
+
143
+ @deplist.add @b2
144
+
145
+ exp = {
146
+ "b" => [
147
+ Gem::Dependency.new("a", ">= 1")
148
+ ]
149
+ }
150
+
151
+ assert_equal exp, @deplist.why_not_ok?
152
+ end
153
+
136
154
  def test_ok_eh_mismatch
137
- a1 = quick_gem 'a', '1'
138
- a2 = quick_gem 'a', '2'
155
+ a1 = quick_spec 'a', '1'
156
+ a2 = quick_spec 'a', '2'
139
157
 
140
- b = quick_gem 'b', '1' do |s| s.add_dependency 'a', '= 1' end
141
- c = quick_gem 'c', '1' do |s| s.add_dependency 'a', '= 2' end
158
+ b = quick_spec 'b', '1' do |s| s.add_dependency 'a', '= 1' end
159
+ c = quick_spec 'c', '1' do |s| s.add_dependency 'a', '= 2' end
142
160
 
143
- d = quick_gem 'd', '1' do |s|
161
+ d = quick_spec 'd', '1' do |s|
144
162
  s.add_dependency 'b'
145
163
  s.add_dependency 'c'
146
164
  end
@@ -186,6 +204,8 @@ class TestGemDependencyList < Gem::TestCase
186
204
  end
187
205
 
188
206
  def test_remove_by_name
207
+ util_clear_gems
208
+
189
209
  @deplist.add @a1, @b2
190
210
 
191
211
  @deplist.remove_by_name "a-1"
@@ -6,25 +6,26 @@ class TestGemDocManager < Gem::TestCase
6
6
  def setup
7
7
  super
8
8
 
9
- @spec = quick_gem 'a'
9
+ @spec = quick_gem 'a', 2
10
10
  @manager = Gem::DocManager.new(@spec)
11
11
  end
12
12
 
13
13
  def test_uninstall_doc_unwritable
14
- orig_mode = File.stat(@spec.installation_path).mode
14
+ path = @spec.installation_path
15
+ orig_mode = File.stat(path).mode
15
16
 
16
17
  # File.chmod has no effect on MS Windows directories (it needs ACL).
17
18
  if win_platform?
18
19
  skip("test_uninstall_doc_unwritable skipped on MS Windows")
19
20
  else
20
- File.chmod(0, @spec.installation_path)
21
+ File.chmod 0000, path
21
22
  end
22
23
 
23
24
  assert_raises Gem::FilePermissionError do
24
25
  @manager.uninstall_doc
25
26
  end
26
27
  ensure
27
- File.chmod orig_mode, @spec.installation_path
28
+ File.chmod orig_mode, path
28
29
  end
29
30
 
30
31
  end
@@ -1,5 +1,5 @@
1
1
  require 'rubygems/package/tar_test_case'
2
- require 'test/rubygems/simple_gem'
2
+ require 'rubygems/simple_gem'
3
3
  require 'rubygems/format'
4
4
 
5
5
  class TestGemFormat < Gem::Package::TarTestCase
@@ -14,7 +14,7 @@ class TestGemFormat < Gem::Package::TarTestCase
14
14
  def test_class_from_file_by_path
15
15
  util_make_gems
16
16
 
17
- gems = Dir[File.join(@gemhome, 'cache', '*.gem')]
17
+ gems = Dir[Gem.cache_gem('*.gem', @gemhome)]
18
18
 
19
19
  names = [@a1, @a2, @a3a, @a_evil9, @b2, @c1_2, @pl1].map do |spec|
20
20
  spec.original_name
@@ -1,5 +1,6 @@
1
1
  require 'rubygems/test_case'
2
2
  require 'rubygems'
3
+ require 'rubygems/command'
3
4
  require 'rubygems/gemcutter_utilities'
4
5
 
5
6
  class TestGemGemcutterUtilities < Gem::TestCase
@@ -14,6 +15,35 @@ class TestGemGemcutterUtilities < Gem::TestCase
14
15
  @cmd.extend Gem::GemcutterUtilities
15
16
  end
16
17
 
18
+ def test_api_key
19
+ keys = { :rubygems_api_key => 'KEY' }
20
+ FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
21
+
22
+ open Gem.configuration.credentials_path, 'w' do |f|
23
+ f.write keys.to_yaml
24
+ end
25
+
26
+ Gem.configuration.load_api_keys
27
+
28
+ assert_equal 'KEY', @cmd.api_key
29
+ end
30
+
31
+ def test_api_key_override
32
+ keys = { :rubygems_api_key => 'KEY', :other => 'OTHER' }
33
+ FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
34
+
35
+ open Gem.configuration.credentials_path, 'w' do |f|
36
+ f.write keys.to_yaml
37
+ end
38
+
39
+ Gem.configuration.load_api_keys
40
+
41
+ @cmd.add_key_option
42
+ @cmd.handle_options %w[--key other]
43
+
44
+ assert_equal 'OTHER', @cmd.api_key
45
+ end
46
+
17
47
  def test_sign_in
18
48
  api_key = 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903'
19
49
  util_sign_in [api_key, 200, 'OK']
@@ -99,5 +129,23 @@ class TestGemGemcutterUtilities < Gem::TestCase
99
129
  end
100
130
  end
101
131
 
132
+ def test_verify_api_key
133
+ keys = {:other => 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903'}
134
+ FileUtils.mkdir_p File.dirname(Gem.configuration.credentials_path)
135
+ File.open Gem.configuration.credentials_path, 'w' do |f|
136
+ f.write keys.to_yaml
137
+ end
138
+ Gem.configuration.load_api_keys
139
+
140
+ assert_equal 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903',
141
+ @cmd.verify_api_key(:other)
142
+ end
143
+
144
+ def test_verify_missing_api_key
145
+ assert_raises Gem::MockGemUi::TermError do
146
+ @cmd.verify_api_key :missing
147
+ end
148
+ end
149
+
102
150
  end
103
151
 
@@ -12,21 +12,22 @@ class TestGemIndexer < Gem::TestCase
12
12
 
13
13
  util_make_gems
14
14
 
15
- @d2_0 = quick_gem 'd', '2.0' do |s|
15
+ @d2_0 = quick_spec 'd', '2.0' do |s|
16
16
  s.date = Gem::Specification::TODAY - 86400 * 3
17
17
  end
18
18
  util_build_gem @d2_0
19
19
 
20
- @d2_0_a = quick_gem 'd', '2.0.a'
20
+ @d2_0_a = quick_spec 'd', '2.0.a'
21
21
  util_build_gem @d2_0_a
22
22
 
23
- @d2_0_b = quick_gem 'd', '2.0.b'
23
+ @d2_0_b = quick_spec 'd', '2.0.b'
24
24
  util_build_gem @d2_0_b
25
25
 
26
+ @tempdir = File.join(@tempdir, 'indexer')
27
+
26
28
  gems = File.join(@tempdir, 'gems')
27
29
  FileUtils.mkdir_p gems
28
- cache_gems = File.join @gemhome, 'cache', '*.gem'
29
- FileUtils.mv Dir[cache_gems], gems
30
+ FileUtils.mv Dir[Gem.cache_gem('*.gem', @gemhome)], gems
30
31
 
31
32
  @indexer = Gem::Indexer.new @tempdir, :rss_title => 'ExampleForge gems',
32
33
  :rss_host => 'example.com',
@@ -54,7 +55,7 @@ class TestGemIndexer < Gem::TestCase
54
55
  end
55
56
 
56
57
  def test_build_indicies
57
- spec = quick_gem 'd', '2.0'
58
+ spec = quick_spec 'd', '2.0'
58
59
  spec.instance_variable_set :@original_platform, ''
59
60
 
60
61
  @indexer.make_temp_directories
@@ -504,17 +505,17 @@ eighty characters.&lt;/pre&gt;
504
505
  assert File.directory?(quickdir)
505
506
  assert File.directory?(marshal_quickdir)
506
507
 
507
- @d2_1 = quick_gem 'd', '2.1'
508
+ @d2_1 = quick_spec 'd', '2.1'
508
509
  util_build_gem @d2_1
509
510
  @d2_1_tuple = [@d2_1.name, @d2_1.version, @d2_1.original_platform]
510
511
 
511
- @d2_1_a = quick_gem 'd', '2.2.a'
512
+ @d2_1_a = quick_spec 'd', '2.2.a'
512
513
  util_build_gem @d2_1_a
513
514
  @d2_1_a_tuple = [@d2_1_a.name, @d2_1_a.version, @d2_1_a.original_platform]
514
515
 
515
516
  gems = File.join @tempdir, 'gems'
516
- FileUtils.mv File.join(@gemhome, 'cache', @d2_1.file_name), gems
517
- FileUtils.mv File.join(@gemhome, 'cache', @d2_1_a.file_name), gems
517
+ FileUtils.mv Gem.cache_gem(@d2_1.file_name, @gemhome), gems
518
+ FileUtils.mv Gem.cache_gem(@d2_1_a.file_name, @gemhome), gems
518
519
 
519
520
  use_ui @ui do
520
521
  @indexer.update_index
@@ -63,6 +63,4 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase
63
63
  ensure
64
64
  FileUtils.chmod 0755, @gemhome
65
65
  end
66
-
67
66
  end
68
-
@@ -3,7 +3,8 @@ require 'rubygems/installer_test_case'
3
3
  class TestGemInstaller < Gem::InstallerTestCase
4
4
 
5
5
  def test_app_script_text
6
- util_make_exec '2', ''
6
+ @spec.version = 2
7
+ util_make_exec @spec, ''
7
8
 
8
9
  expected = <<-EOF
9
10
  #!#{Gem.ruby}
@@ -24,10 +25,10 @@ if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
24
25
  end
25
26
 
26
27
  gem 'a', version
27
- load Gem.bin_path('a', 'my_exec', version)
28
+ load Gem.bin_path('a', 'executable', version)
28
29
  EOF
29
30
 
30
- wrapper = @installer.app_script_text 'my_exec'
31
+ wrapper = @installer.app_script_text 'executable'
31
32
  assert_equal expected, wrapper
32
33
  end
33
34
 
@@ -95,7 +96,7 @@ load Gem.bin_path('a', 'my_exec', version)
95
96
  @installer.ensure_dependency @spec, dep
96
97
  end
97
98
 
98
- assert_equal 'a requires b (> 2, runtime)', e.message
99
+ assert_equal 'a requires b (> 2)', e.message
99
100
  end
100
101
 
101
102
  def test_extract_files
@@ -164,11 +165,11 @@ load Gem.bin_path('a', 'my_exec', version)
164
165
  def test_generate_bin_bindir
165
166
  @installer.wrappers = true
166
167
 
167
- @spec.executables = ["my_exec"]
168
+ @spec.executables = %w[executable]
168
169
  @spec.bindir = '.'
169
170
 
170
- exec_file = @installer.formatted_program_filename "my_exec"
171
- exec_path = File.join util_gem_dir(@spec.version), exec_file
171
+ exec_file = @installer.formatted_program_filename 'executable'
172
+ exec_path = File.join util_gem_dir(@spec), exec_file
172
173
  File.open exec_path, 'w' do |f|
173
174
  f.puts '#!/usr/bin/ruby'
174
175
  end
@@ -178,7 +179,7 @@ load Gem.bin_path('a', 'my_exec', version)
178
179
  @installer.generate_bin
179
180
 
180
181
  assert_equal true, File.directory?(util_inst_bindir)
181
- installed_exec = File.join(util_inst_bindir, "my_exec")
182
+ installed_exec = File.join(util_inst_bindir, 'executable')
182
183
  assert_equal true, File.exist?(installed_exec)
183
184
  assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
184
185
 
@@ -193,7 +194,7 @@ load Gem.bin_path('a', 'my_exec', version)
193
194
 
194
195
  @installer.generate_bin
195
196
  assert_equal true, File.directory?(util_inst_bindir)
196
- installed_exec = File.join(util_inst_bindir, "my_exec")
197
+ installed_exec = File.join(util_inst_bindir, 'executable')
197
198
  assert_equal true, File.exist?(installed_exec)
198
199
  assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
199
200
 
@@ -210,7 +211,7 @@ load Gem.bin_path('a', 'my_exec', version)
210
211
  Gem::Installer.exec_format = 'foo-%s-bar'
211
212
  @installer.generate_bin
212
213
  assert_equal true, File.directory?(util_inst_bindir)
213
- installed_exec = File.join util_inst_bindir, 'foo-my_exec-bar'
214
+ installed_exec = File.join util_inst_bindir, 'foo-executable-bar'
214
215
  assert_equal true, File.exist?(installed_exec)
215
216
  ensure
216
217
  Gem::Installer.exec_format = nil
@@ -224,7 +225,7 @@ load Gem.bin_path('a', 'my_exec', version)
224
225
  Gem::Installer.exec_format = 'foo-%s-bar'
225
226
  @installer.generate_bin
226
227
  assert_equal true, File.directory?(util_inst_bindir)
227
- installed_exec = File.join util_inst_bindir, 'my_exec'
228
+ installed_exec = File.join util_inst_bindir, 'executable'
228
229
  assert_equal true, File.exist?(installed_exec)
229
230
  ensure
230
231
  Gem::Installer.exec_format = nil
@@ -232,12 +233,12 @@ load Gem.bin_path('a', 'my_exec', version)
232
233
 
233
234
  def test_generate_bin_script_install_dir
234
235
  @installer.wrappers = true
235
- @spec.executables = ["my_exec"]
236
+ @spec.executables = %w[executable]
236
237
 
237
238
  gem_dir = File.join "#{@gemhome}2", 'gems', @spec.full_name
238
239
  gem_bindir = File.join gem_dir, 'bin'
239
240
  FileUtils.mkdir_p gem_bindir
240
- File.open File.join(gem_bindir, "my_exec"), 'w' do |f|
241
+ File.open File.join(gem_bindir, 'executable'), 'w' do |f|
241
242
  f.puts "#!/bin/ruby"
242
243
  end
243
244
 
@@ -246,7 +247,7 @@ load Gem.bin_path('a', 'my_exec', version)
246
247
 
247
248
  @installer.generate_bin
248
249
 
249
- installed_exec = File.join("#{@gemhome}2", 'bin', 'my_exec')
250
+ installed_exec = File.join("#{@gemhome}2", 'bin', 'executable')
250
251
  assert_equal true, File.exist?(installed_exec)
251
252
  assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
252
253
 
@@ -255,9 +256,12 @@ load Gem.bin_path('a', 'my_exec', version)
255
256
  end
256
257
 
257
258
  def test_generate_bin_script_no_execs
259
+ util_execless
260
+
258
261
  @installer.wrappers = true
259
262
  @installer.generate_bin
260
- assert_equal false, File.exist?(util_inst_bindir)
263
+
264
+ refute File.exist?(util_inst_bindir), 'bin dir was created when not needed'
261
265
  end
262
266
 
263
267
  def test_generate_bin_script_no_perms
@@ -281,18 +285,18 @@ load Gem.bin_path('a', 'my_exec', version)
281
285
 
282
286
  def test_generate_bin_script_no_shebang
283
287
  @installer.wrappers = true
284
- @spec.executables = ["my_exec"]
288
+ @spec.executables = %w[executable]
285
289
 
286
290
  gem_dir = File.join @gemhome, 'gems', @spec.full_name
287
291
  gem_bindir = File.join gem_dir, 'bin'
288
292
  FileUtils.mkdir_p gem_bindir
289
- File.open File.join(gem_bindir, "my_exec"), 'w' do |f|
293
+ File.open File.join(gem_bindir, 'executable'), 'w' do |f|
290
294
  f.puts "blah blah blah"
291
295
  end
292
296
 
293
297
  @installer.generate_bin
294
298
 
295
- installed_exec = File.join @gemhome, 'bin', 'my_exec'
299
+ installed_exec = File.join @gemhome, 'bin', 'executable'
296
300
  assert_equal true, File.exist?(installed_exec)
297
301
  assert_equal 0100755, File.stat(installed_exec).mode unless win_platform?
298
302
 
@@ -306,9 +310,9 @@ load Gem.bin_path('a', 'my_exec', version)
306
310
  @installer.wrappers = true
307
311
  util_make_exec
308
312
  @installer.gem_dir = util_gem_dir
309
- installed_exec = File.join(util_inst_bindir, "my_exec")
313
+ installed_exec = File.join(util_inst_bindir, 'executable')
310
314
 
311
- real_exec = File.join util_gem_dir, 'bin', 'my_exec'
315
+ real_exec = File.join util_gem_dir, 'bin', 'executable'
312
316
 
313
317
  # fake --no-wrappers for previous install
314
318
  unless Gem.win_platform? then
@@ -336,16 +340,19 @@ load Gem.bin_path('a', 'my_exec', version)
336
340
 
337
341
  @installer.generate_bin
338
342
  assert_equal true, File.directory?(util_inst_bindir)
339
- installed_exec = File.join(util_inst_bindir, "my_exec")
343
+ installed_exec = File.join(util_inst_bindir, 'executable')
340
344
  assert_equal true, File.symlink?(installed_exec)
341
- assert_equal(File.join(util_gem_dir, "bin", "my_exec"),
345
+ assert_equal(File.join(util_gem_dir, 'bin', 'executable'),
342
346
  File.readlink(installed_exec))
343
347
  end
344
348
 
345
349
  def test_generate_bin_symlink_no_execs
350
+ util_execless
351
+
346
352
  @installer.wrappers = false
347
353
  @installer.generate_bin
348
- assert_equal false, File.exist?(util_inst_bindir)
354
+
355
+ refute File.exist?(util_inst_bindir)
349
356
  end
350
357
 
351
358
  def test_generate_bin_symlink_no_perms
@@ -376,8 +383,8 @@ load Gem.bin_path('a', 'my_exec', version)
376
383
  @installer.gem_dir = util_gem_dir
377
384
 
378
385
  @installer.generate_bin
379
- installed_exec = File.join(util_inst_bindir, "my_exec")
380
- assert_equal(File.join(util_gem_dir, "bin", "my_exec"),
386
+ installed_exec = File.join(util_inst_bindir, 'executable')
387
+ assert_equal(File.join(util_gem_dir, 'bin', 'executable'),
381
388
  File.readlink(installed_exec))
382
389
 
383
390
  @spec = Gem::Specification.new do |s|
@@ -389,11 +396,12 @@ load Gem.bin_path('a', 'my_exec', version)
389
396
  s.require_path = 'lib'
390
397
  end
391
398
 
392
- util_make_exec '3'
393
- @installer.gem_dir = File.join util_gem_dir('3')
399
+ @spec.version = 3
400
+ util_make_exec
401
+ @installer.gem_dir = File.join util_gem_dir @spec
394
402
  @installer.generate_bin
395
- installed_exec = File.join(util_inst_bindir, "my_exec")
396
- assert_equal(File.join(util_gem_bindir('3'), "my_exec"),
403
+ installed_exec = File.join(util_inst_bindir, 'executable')
404
+ assert_equal(File.join(util_gem_bindir(@spec), 'executable'),
397
405
  File.readlink(installed_exec),
398
406
  "Ensure symlink moved to latest version")
399
407
  end
@@ -406,8 +414,8 @@ load Gem.bin_path('a', 'my_exec', version)
406
414
  @installer.gem_dir = util_gem_dir
407
415
 
408
416
  @installer.generate_bin
409
- installed_exec = File.join(util_inst_bindir, "my_exec")
410
- assert_equal(File.join(util_gem_dir, "bin", "my_exec"),
417
+ installed_exec = File.join(util_inst_bindir, 'executable')
418
+ assert_equal(File.join(util_gem_dir, 'bin', 'executable'),
411
419
  File.readlink(installed_exec))
412
420
 
413
421
  spec = Gem::Specification.new do |s|
@@ -419,14 +427,16 @@ load Gem.bin_path('a', 'my_exec', version)
419
427
  s.require_path = 'lib'
420
428
  end
421
429
 
422
- util_make_exec '1'
423
- @installer.gem_dir = util_gem_dir('1')
430
+ util_make_exec
431
+ one = @spec.dup
432
+ one.version = 1
433
+ @installer.gem_dir = util_gem_dir one
424
434
  @installer.spec = spec
425
435
 
426
436
  @installer.generate_bin
427
437
 
428
- installed_exec = File.join(util_inst_bindir, "my_exec")
429
- assert_equal(File.join(util_gem_dir('2'), "bin", "my_exec"),
438
+ installed_exec = File.join(util_inst_bindir, 'executable')
439
+ assert_equal(File.join(util_gem_dir, 'bin', 'executable'),
430
440
  File.readlink(installed_exec),
431
441
  "Ensure symlink not moved")
432
442
  end
@@ -439,7 +449,7 @@ load Gem.bin_path('a', 'my_exec', version)
439
449
  @installer.gem_dir = util_gem_dir
440
450
 
441
451
  @installer.generate_bin
442
- installed_exec = File.join(util_inst_bindir, "my_exec")
452
+ installed_exec = File.join(util_inst_bindir, 'executable')
443
453
  assert_equal true, File.exist?(installed_exec)
444
454
 
445
455
  @spec = Gem::Specification.new do |s|
@@ -452,11 +462,12 @@ load Gem.bin_path('a', 'my_exec', version)
452
462
  end
453
463
 
454
464
  @installer.wrappers = false
455
- util_make_exec '3'
456
- @installer.gem_dir = util_gem_dir '3'
465
+ @spec.version = 3
466
+ util_make_exec
467
+ @installer.gem_dir = util_gem_dir
457
468
  @installer.generate_bin
458
- installed_exec = File.join(util_inst_bindir, "my_exec")
459
- assert_equal(File.join(util_gem_dir('3'), "bin", "my_exec"),
469
+ installed_exec = File.join(util_inst_bindir, 'executable')
470
+ assert_equal(File.join(util_gem_dir, 'bin', 'executable'),
460
471
  File.readlink(installed_exec),
461
472
  "Ensure symlink moved to latest version")
462
473
  end
@@ -473,7 +484,7 @@ load Gem.bin_path('a', 'my_exec', version)
473
484
  end
474
485
 
475
486
  assert_equal true, File.directory?(util_inst_bindir)
476
- installed_exec = File.join(util_inst_bindir, "my_exec")
487
+ installed_exec = File.join(util_inst_bindir, 'executable')
477
488
  assert_equal true, File.exist?(installed_exec)
478
489
 
479
490
  assert_match(/Unable to use symlinks on Windows, installing wrapper/i,
@@ -494,19 +505,18 @@ load Gem.bin_path('a', 'my_exec', version)
494
505
  @installer.generate_bin
495
506
 
496
507
  default_shebang = Gem.ruby
497
- shebang_line = open("#{@gemhome}/bin/my_exec") { |f| f.readlines.first }
508
+ shebang_line = open("#{@gemhome}/bin/executable") { |f| f.readlines.first }
498
509
  assert_match(/\A#!/, shebang_line)
499
510
  assert_match(/#{default_shebang}/, shebang_line)
500
511
  end
501
512
 
502
513
  def test_initialize
503
- spec = quick_gem 'a' do |s| s.platform = Gem::Platform.new 'mswin32' end
514
+ spec = quick_spec 'a' do |s| s.platform = Gem::Platform.new 'mswin32' end
504
515
  gem = File.join @tempdir, spec.file_name
505
516
 
506
517
  Dir.mkdir util_inst_bindir
507
518
  util_build_gem spec
508
- FileUtils.mv File.join(@gemhome, 'cache', spec.file_name),
509
- @tempdir
519
+ FileUtils.mv Gem.cache_gem(spec.file_name, @gemhome), @tempdir
510
520
 
511
521
  installer = Gem::Installer.new gem
512
522
 
@@ -519,7 +529,7 @@ load Gem.bin_path('a', 'my_exec', version)
519
529
  util_clear_gems
520
530
 
521
531
  gemdir = File.join @gemhome, 'gems', @spec.full_name
522
- cache_file = File.join @gemhome, 'cache', @spec.file_name
532
+ cache_file = Gem.cache_gem(@spec.file_name, @gemhome)
523
533
  stub_exe = File.join @gemhome, 'bin', 'executable'
524
534
  rakefile = File.join gemdir, 'ext', 'a', 'Rakefile'
525
535
 
@@ -568,6 +578,42 @@ load Gem.bin_path('a', 'my_exec', version)
568
578
  assert_same @installer, @pre_install_hook_arg
569
579
  end
570
580
 
581
+ def test_install_with_no_prior_files
582
+ Dir.mkdir util_inst_bindir
583
+ util_clear_gems
584
+
585
+ util_setup_gem
586
+ build_rake_in do
587
+ use_ui @ui do
588
+ assert_equal @spec, @installer.install
589
+ end
590
+ end
591
+
592
+ gemdir = File.join(@gemhome, 'gems', @spec.full_name)
593
+ assert File.exist?(File.join(gemdir, 'lib', 'code.rb'))
594
+
595
+ util_setup_gem
596
+ # Morph spec to have lib/other.rb instead of code.rb and recreate
597
+ @spec.files = File.join('lib', 'other.rb')
598
+ Dir.chdir @tempdir do
599
+ File.open File.join('lib', 'other.rb'), 'w' do |f| f.puts '1' end
600
+ use_ui ui do
601
+ FileUtils.rm @gem
602
+ Gem::Builder.new(@spec).build
603
+ end
604
+ end
605
+ @installer = Gem::Installer.new @gem
606
+ build_rake_in do
607
+ use_ui @ui do
608
+ assert_equal @spec, @installer.install
609
+ end
610
+ end
611
+
612
+ assert File.exist?(File.join(gemdir, 'lib', 'other.rb'))
613
+ refute(File.exist?(File.join(gemdir, 'lib', 'code.rb')),
614
+ "code.rb from prior install of same gem shouldn't remain here")
615
+ end
616
+
571
617
  def test_install_bad_gem
572
618
  gem = nil
573
619
 
@@ -604,7 +650,7 @@ load Gem.bin_path('a', 'my_exec', version)
604
650
  gemhome2 = "#{@gemhome}2"
605
651
  @spec.add_dependency 'b'
606
652
 
607
- b2 = quick_gem 'b', 2
653
+ b2 = quick_spec 'b', 2
608
654
 
609
655
  FileUtils.mv @gemhome, gemhome2
610
656
  Gem.source_index.gems.delete b2.full_name
@@ -660,7 +706,7 @@ load Gem.bin_path('a', 'my_exec', version)
660
706
  end
661
707
 
662
708
  def test_install_missing_dirs
663
- FileUtils.rm_f File.join(Gem.dir, 'cache')
709
+ FileUtils.rm_f Gem.cache_dir
664
710
  FileUtils.rm_f File.join(Gem.dir, 'docs')
665
711
  FileUtils.rm_f File.join(Gem.dir, 'specifications')
666
712
 
@@ -670,11 +716,11 @@ load Gem.bin_path('a', 'my_exec', version)
670
716
  @installer.install
671
717
  end
672
718
 
673
- File.directory? File.join(Gem.dir, 'cache')
719
+ File.directory? Gem.cache_dir
674
720
  File.directory? File.join(Gem.dir, 'docs')
675
721
  File.directory? File.join(Gem.dir, 'specifications')
676
722
 
677
- assert File.exist?(File.join(@gemhome, 'cache', @spec.file_name))
723
+ assert File.exist?(Gem.cache_gem(@spec.file_name, @gemhome))
678
724
  assert File.exist?(File.join(@gemhome, 'specifications', @spec.spec_name))
679
725
  end
680
726
 
@@ -780,13 +826,13 @@ load Gem.bin_path('a', 'my_exec', version)
780
826
  end
781
827
 
782
828
  def test_install_wrong_rubygems_version
783
- spec = quick_gem 'old_rubygems_required', '1' do |s|
829
+ spec = quick_spec 'old_rubygems_required', '1' do |s|
784
830
  s.required_rubygems_version = '< 0'
785
831
  end
786
832
 
787
833
  util_build_gem spec
788
834
 
789
- gem = File.join @gemhome, 'cache', spec.file_name
835
+ gem = Gem.cache_gem(spec.file_name, @gemhome)
790
836
 
791
837
  use_ui @ui do
792
838
  @installer = Gem::Installer.new gem
@@ -807,49 +853,49 @@ load Gem.bin_path('a', 'my_exec', version)
807
853
  end
808
854
 
809
855
  def test_shebang
810
- util_make_exec '2', "#!/usr/bin/ruby"
856
+ util_make_exec @spec, "#!/usr/bin/ruby"
811
857
 
812
- shebang = @installer.shebang 'my_exec'
858
+ shebang = @installer.shebang 'executable'
813
859
 
814
860
  assert_equal "#!#{Gem.ruby}", shebang
815
861
  end
816
862
 
817
863
  def test_shebang_arguments
818
- util_make_exec '2', "#!/usr/bin/ruby -ws"
864
+ util_make_exec @spec, "#!/usr/bin/ruby -ws"
819
865
 
820
- shebang = @installer.shebang 'my_exec'
866
+ shebang = @installer.shebang 'executable'
821
867
 
822
868
  assert_equal "#!#{Gem.ruby} -ws", shebang
823
869
  end
824
870
 
825
871
  def test_shebang_empty
826
- util_make_exec '2', ''
872
+ util_make_exec @spec, ''
827
873
 
828
- shebang = @installer.shebang 'my_exec'
874
+ shebang = @installer.shebang 'executable'
829
875
  assert_equal "#!#{Gem.ruby}", shebang
830
876
  end
831
877
 
832
878
  def test_shebang_env
833
- util_make_exec '2', "#!/usr/bin/env ruby"
879
+ util_make_exec @spec, "#!/usr/bin/env ruby"
834
880
 
835
- shebang = @installer.shebang 'my_exec'
881
+ shebang = @installer.shebang 'executable'
836
882
 
837
883
  assert_equal "#!#{Gem.ruby}", shebang
838
884
  end
839
885
 
840
886
  def test_shebang_env_arguments
841
- util_make_exec '2', "#!/usr/bin/env ruby -ws"
887
+ util_make_exec @spec, "#!/usr/bin/env ruby -ws"
842
888
 
843
- shebang = @installer.shebang 'my_exec'
889
+ shebang = @installer.shebang 'executable'
844
890
 
845
891
  assert_equal "#!#{Gem.ruby} -ws", shebang
846
892
  end
847
893
 
848
894
  def test_shebang_env_shebang
849
- util_make_exec '2', ''
895
+ util_make_exec @spec, ''
850
896
  @installer.env_shebang = true
851
897
 
852
- shebang = @installer.shebang 'my_exec'
898
+ shebang = @installer.shebang 'executable'
853
899
 
854
900
  env_shebang = "/usr/bin/env" unless Gem.win_platform?
855
901
 
@@ -858,49 +904,49 @@ load Gem.bin_path('a', 'my_exec', version)
858
904
  end
859
905
 
860
906
  def test_shebang_nested
861
- util_make_exec '2', "#!/opt/local/ruby/bin/ruby"
907
+ util_make_exec @spec, "#!/opt/local/ruby/bin/ruby"
862
908
 
863
- shebang = @installer.shebang 'my_exec'
909
+ shebang = @installer.shebang 'executable'
864
910
 
865
911
  assert_equal "#!#{Gem.ruby}", shebang
866
912
  end
867
913
 
868
914
  def test_shebang_nested_arguments
869
- util_make_exec '2', "#!/opt/local/ruby/bin/ruby -ws"
915
+ util_make_exec @spec, "#!/opt/local/ruby/bin/ruby -ws"
870
916
 
871
- shebang = @installer.shebang 'my_exec'
917
+ shebang = @installer.shebang 'executable'
872
918
 
873
919
  assert_equal "#!#{Gem.ruby} -ws", shebang
874
920
  end
875
921
 
876
922
  def test_shebang_version
877
- util_make_exec '2', "#!/usr/bin/ruby18"
923
+ util_make_exec @spec, "#!/usr/bin/ruby18"
878
924
 
879
- shebang = @installer.shebang 'my_exec'
925
+ shebang = @installer.shebang 'executable'
880
926
 
881
927
  assert_equal "#!#{Gem.ruby}", shebang
882
928
  end
883
929
 
884
930
  def test_shebang_version_arguments
885
- util_make_exec '2', "#!/usr/bin/ruby18 -ws"
931
+ util_make_exec @spec, "#!/usr/bin/ruby18 -ws"
886
932
 
887
- shebang = @installer.shebang 'my_exec'
933
+ shebang = @installer.shebang 'executable'
888
934
 
889
935
  assert_equal "#!#{Gem.ruby} -ws", shebang
890
936
  end
891
937
 
892
938
  def test_shebang_version_env
893
- util_make_exec '2', "#!/usr/bin/env ruby18"
939
+ util_make_exec @spec, "#!/usr/bin/env ruby18"
894
940
 
895
- shebang = @installer.shebang 'my_exec'
941
+ shebang = @installer.shebang 'executable'
896
942
 
897
943
  assert_equal "#!#{Gem.ruby}", shebang
898
944
  end
899
945
 
900
946
  def test_shebang_version_env_arguments
901
- util_make_exec '2', "#!/usr/bin/env ruby18 -ws"
947
+ util_make_exec @spec, "#!/usr/bin/env ruby18 -ws"
902
948
 
903
- shebang = @installer.shebang 'my_exec'
949
+ shebang = @installer.shebang 'executable'
904
950
 
905
951
  assert_equal "#!#{Gem.ruby} -ws", shebang
906
952
  end
@@ -931,14 +977,41 @@ load Gem.bin_path('a', 'my_exec', version)
931
977
  assert_equal @spec, eval(File.read(spec_file))
932
978
  end
933
979
 
980
+ def test_write_spec_writes_cached_spec
981
+ spec_dir = File.join @gemhome, 'specifications'
982
+ spec_file = File.join spec_dir, @spec.spec_name
983
+ FileUtils.rm spec_file
984
+ refute File.exist?(spec_file)
985
+
986
+ @spec.files = %w[a.rb b.rb c.rb]
987
+
988
+ @installer.spec = @spec
989
+ @installer.gem_home = @gemhome
990
+
991
+ @installer.write_spec
992
+
993
+ # cached specs have no file manifest:
994
+ @spec.files = []
995
+
996
+ assert_equal @spec, eval(File.read(spec_file))
997
+ end
998
+
934
999
  def old_ruby_required
935
- spec = quick_gem 'old_ruby_required', '1' do |s|
1000
+ spec = quick_spec 'old_ruby_required', '1' do |s|
936
1001
  s.required_ruby_version = '= 1.4.6'
937
1002
  end
938
1003
 
939
1004
  util_build_gem spec
940
1005
 
941
- File.join @gemhome, 'cache', spec.file_name
1006
+ Gem.cache_gem(spec.file_name, @gemhome)
1007
+ end
1008
+
1009
+ def util_execless
1010
+ @spec = quick_spec 'z'
1011
+
1012
+ gem = File.join @tempdir, @spec.file_name
1013
+
1014
+ @installer = util_installer @spec, gem, @gemhome
942
1015
  end
943
1016
 
944
1017
  end