rubygems-update 1.6.2 → 1.7.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 (40) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.autotest +0 -1
  3. data/History.txt +70 -4
  4. data/README.rdoc +3 -0
  5. data/Rakefile +76 -0
  6. data/lib/rubygems.rb +57 -27
  7. data/lib/rubygems/command.rb +6 -4
  8. data/lib/rubygems/commands/contents_command.rb +14 -11
  9. data/lib/rubygems/commands/fetch_command.rb +6 -3
  10. data/lib/rubygems/commands/outdated_command.rb +2 -1
  11. data/lib/rubygems/commands/pristine_command.rb +4 -3
  12. data/lib/rubygems/commands/unpack_command.rb +46 -4
  13. data/lib/rubygems/commands/update_command.rb +24 -10
  14. data/lib/rubygems/custom_require.rb +1 -2
  15. data/lib/rubygems/dependency_installer.rb +1 -1
  16. data/lib/rubygems/ext/rake_builder.rb +1 -1
  17. data/lib/rubygems/gem_runner.rb +1 -0
  18. data/lib/rubygems/mock_gem_ui.rb +2 -1
  19. data/lib/rubygems/package/tar_input.rb +1 -0
  20. data/lib/rubygems/remote_fetcher.rb +62 -39
  21. data/lib/rubygems/server.rb +1 -1
  22. data/lib/rubygems/source_index.rb +64 -43
  23. data/lib/rubygems/spec_fetcher.rb +5 -6
  24. data/lib/rubygems/specification.rb +375 -402
  25. data/lib/rubygems/test_case.rb +7 -8
  26. data/lib/rubygems/uninstaller.rb +2 -2
  27. data/lib/rubygems/user_interaction.rb +27 -31
  28. data/test/rubygems/test_gem.rb +2 -44
  29. data/test/rubygems/test_gem_commands_contents_command.rb +19 -30
  30. data/test/rubygems/test_gem_commands_unpack_command.rb +24 -0
  31. data/test/rubygems/test_gem_commands_update_command.rb +26 -1
  32. data/test/rubygems/test_gem_dependency_installer.rb +9 -5
  33. data/test/rubygems/test_gem_dependency_list.rb +2 -6
  34. data/test/rubygems/test_gem_gem_runner.rb +1 -4
  35. data/test/rubygems/test_gem_installer.rb +1 -2
  36. data/test/rubygems/test_gem_remote_fetcher.rb +131 -24
  37. data/test/rubygems/test_gem_source_index.rb +7 -192
  38. data/test/rubygems/test_gem_specification.rb +132 -103
  39. metadata +9 -9
  40. metadata.gz.sig +0 -0
@@ -33,10 +33,7 @@ class TestGemGemRunner < Gem::TestCase
33
33
  def test_build_args__are_handled
34
34
  Gem.clear_paths
35
35
 
36
- gr = Gem::GemRunner.new
37
- assert_raises(Gem::SystemExitException) do
38
- gr.run(%W[--help -- --build_arg1 --build_arg2])
39
- end
36
+ Gem::GemRunner.new.run(%W[help -- --build_arg1 --build_arg2])
40
37
 
41
38
  assert_equal %w[--build_arg1 --build_arg2], Gem::Command.build_args
42
39
  end
@@ -654,8 +654,7 @@ load Gem.bin_path('a', 'executable', version)
654
654
 
655
655
  FileUtils.mv @gemhome, gemhome2
656
656
  Gem.source_index.gems.delete b2.full_name
657
- source_index = Gem::SourceIndex.from_gems_in File.join(gemhome2,
658
- 'specifications')
657
+ source_index = Gem::SourceIndex.new [File.join(gemhome2, 'specifications')]
659
658
 
660
659
  util_setup_gem
661
660
 
@@ -146,7 +146,7 @@ gems:
146
146
  fetcher.fetch_size 'gems.example.com/yaml'
147
147
  end
148
148
 
149
- assert_equal 'uri scheme is invalid', e.message
149
+ assert_equal 'uri scheme is invalid: nil', e.message
150
150
  end
151
151
 
152
152
  def test_fetch_size_socket_error
@@ -416,7 +416,7 @@ gems:
416
416
  def test_fetch_path_gzip
417
417
  fetcher = Gem::RemoteFetcher.new nil
418
418
 
419
- def fetcher.open_uri_or_path(uri, mtime, head = nil)
419
+ def fetcher.fetch_http(uri, mtime, head = nil)
420
420
  Gem.gzip 'foo'
421
421
  end
422
422
 
@@ -426,7 +426,7 @@ gems:
426
426
  def test_fetch_path_gzip_unmodified
427
427
  fetcher = Gem::RemoteFetcher.new nil
428
428
 
429
- def fetcher.open_uri_or_path(uri, mtime, head = nil)
429
+ def fetcher.fetch_http(uri, mtime, head = nil)
430
430
  nil
431
431
  end
432
432
 
@@ -436,53 +436,59 @@ gems:
436
436
  def test_fetch_path_io_error
437
437
  fetcher = Gem::RemoteFetcher.new nil
438
438
 
439
- def fetcher.open_uri_or_path(uri, mtime, head = nil)
439
+ def fetcher.fetch_http(*)
440
440
  raise EOFError
441
441
  end
442
442
 
443
+ url = 'http://example.com/uri'
444
+
443
445
  e = assert_raises Gem::RemoteFetcher::FetchError do
444
- fetcher.fetch_path 'uri'
446
+ fetcher.fetch_path url
445
447
  end
446
448
 
447
- assert_equal 'EOFError: EOFError (uri)', e.message
448
- assert_equal 'uri', e.uri
449
+ assert_equal "EOFError: EOFError (#{url})", e.message
450
+ assert_equal url, e.uri
449
451
  end
450
452
 
451
453
  def test_fetch_path_socket_error
452
454
  fetcher = Gem::RemoteFetcher.new nil
453
455
 
454
- def fetcher.open_uri_or_path(uri, mtime, head = nil)
456
+ def fetcher.fetch_http(uri, mtime, head = nil)
455
457
  raise SocketError
456
458
  end
457
459
 
460
+ url = 'http://example.com/uri'
461
+
458
462
  e = assert_raises Gem::RemoteFetcher::FetchError do
459
- fetcher.fetch_path 'uri'
463
+ fetcher.fetch_path url
460
464
  end
461
465
 
462
- assert_equal 'SocketError: SocketError (uri)', e.message
463
- assert_equal 'uri', e.uri
466
+ assert_equal "SocketError: SocketError (#{url})", e.message
467
+ assert_equal url, e.uri
464
468
  end
465
469
 
466
470
  def test_fetch_path_system_call_error
467
471
  fetcher = Gem::RemoteFetcher.new nil
468
472
 
469
- def fetcher.open_uri_or_path(uri, mtime = nil, head = nil)
473
+ def fetcher.fetch_http(uri, mtime = nil, head = nil)
470
474
  raise Errno::ECONNREFUSED, 'connect(2)'
471
475
  end
472
476
 
477
+ url = 'http://example.com/uri'
478
+
473
479
  e = assert_raises Gem::RemoteFetcher::FetchError do
474
- fetcher.fetch_path 'uri'
480
+ fetcher.fetch_path url
475
481
  end
476
482
 
477
- assert_match %r|ECONNREFUSED:.*connect\(2\) \(uri\)\z|,
483
+ assert_match %r|ECONNREFUSED:.*connect\(2\) \(#{Regexp.escape url}\)\z|,
478
484
  e.message
479
- assert_equal 'uri', e.uri
485
+ assert_equal url, e.uri
480
486
  end
481
487
 
482
488
  def test_fetch_path_unmodified
483
489
  fetcher = Gem::RemoteFetcher.new nil
484
490
 
485
- def fetcher.open_uri_or_path(uri, mtime, head = nil)
491
+ def fetcher.fetch_http(uri, mtime, head = nil)
486
492
  nil
487
493
  end
488
494
 
@@ -545,16 +551,18 @@ gems:
545
551
  end
546
552
  end
547
553
 
548
- def test_open_uri_or_path
554
+ def test_fetch_http
549
555
  fetcher = Gem::RemoteFetcher.new nil
556
+ url = 'http://gems.example.com/redirect'
550
557
 
551
558
  conn = Object.new
552
559
  def conn.started?() true end
553
560
  def conn.request(req)
561
+ url = 'http://gems.example.com/redirect'
554
562
  unless defined? @requested then
555
563
  @requested = true
556
564
  res = Net::HTTPMovedPermanently.new nil, 301, nil
557
- res.add_field 'Location', 'http://gems.example.com/real_path'
565
+ res.add_field 'Location', url
558
566
  res
559
567
  else
560
568
  res = Net::HTTPOK.new nil, 200, nil
@@ -566,19 +574,21 @@ gems:
566
574
  conn = { "#{Thread.current.object_id}:gems.example.com:80" => conn }
567
575
  fetcher.instance_variable_set :@connections, conn
568
576
 
569
- data = fetcher.open_uri_or_path 'http://gems.example.com/redirect'
577
+ data = fetcher.fetch_http URI.parse(url)
570
578
 
571
579
  assert_equal 'real_path', data
572
580
  end
573
581
 
574
- def test_open_uri_or_path_limited_redirects
582
+ def test_fetch_http_redirects
575
583
  fetcher = Gem::RemoteFetcher.new nil
584
+ url = 'http://gems.example.com/redirect'
576
585
 
577
586
  conn = Object.new
578
587
  def conn.started?() true end
579
588
  def conn.request(req)
589
+ url = 'http://gems.example.com/redirect'
580
590
  res = Net::HTTPMovedPermanently.new nil, 301, nil
581
- res.add_field 'Location', 'http://gems.example.com/redirect'
591
+ res.add_field 'Location', url
582
592
  res
583
593
  end
584
594
 
@@ -586,11 +596,10 @@ gems:
586
596
  fetcher.instance_variable_set :@connections, conn
587
597
 
588
598
  e = assert_raises Gem::RemoteFetcher::FetchError do
589
- fetcher.open_uri_or_path 'http://gems.example.com/redirect'
599
+ fetcher.fetch_http URI.parse(url)
590
600
  end
591
601
 
592
- assert_equal 'too many redirects (http://gems.example.com/redirect)',
593
- e.message
602
+ assert_equal "too many redirects (#{url})", e.message
594
603
  end
595
604
 
596
605
  def test_request
@@ -625,6 +634,85 @@ gems:
625
634
  assert_equal t.rfc2822, conn.payload['if-modified-since']
626
635
  end
627
636
 
637
+ def test_user_agent
638
+ ua = @fetcher.user_agent
639
+
640
+ assert_match %r%^RubyGems/\S+ \S+ Ruby/\S+ \(.*?\)%, ua
641
+ assert_match %r%RubyGems/#{Regexp.escape Gem::VERSION}%, ua
642
+ assert_match %r% #{Regexp.escape Gem::Platform.local.to_s} %, ua
643
+ assert_match %r%Ruby/#{Regexp.escape RUBY_VERSION}%, ua
644
+ assert_match %r%\(#{Regexp.escape RUBY_RELEASE_DATE} %, ua
645
+ end
646
+
647
+ def test_user_agent_engine
648
+ util_save_version
649
+
650
+ Object.send :remove_const, :RUBY_ENGINE if defined?(RUBY_ENGINE)
651
+ Object.send :const_set, :RUBY_ENGINE, 'vroom'
652
+
653
+ ua = @fetcher.user_agent
654
+
655
+ assert_match %r%\) vroom%, ua
656
+ ensure
657
+ util_restore_version
658
+ end
659
+
660
+ def test_user_agent_engine_ruby
661
+ util_save_version
662
+
663
+ Object.send :remove_const, :RUBY_ENGINE if defined?(RUBY_ENGINE)
664
+ Object.send :const_set, :RUBY_ENGINE, 'ruby'
665
+
666
+ ua = @fetcher.user_agent
667
+
668
+ assert_match %r%\)%, ua
669
+ ensure
670
+ util_restore_version
671
+ end
672
+
673
+ def test_user_agent_patchlevel
674
+ util_save_version
675
+
676
+ Object.send :remove_const, :RUBY_PATCHLEVEL
677
+ Object.send :const_set, :RUBY_PATCHLEVEL, 5
678
+
679
+ ua = @fetcher.user_agent
680
+
681
+ assert_match %r% patchlevel 5\)%, ua
682
+ ensure
683
+ util_restore_version
684
+ end
685
+
686
+ def test_user_agent_revision
687
+ util_save_version
688
+
689
+ Object.send :remove_const, :RUBY_PATCHLEVEL
690
+ Object.send :const_set, :RUBY_PATCHLEVEL, -1
691
+ Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION)
692
+ Object.send :const_set, :RUBY_REVISION, 6
693
+
694
+ ua = @fetcher.user_agent
695
+
696
+ assert_match %r% revision 6\)%, ua
697
+ assert_match %r%Ruby/#{Regexp.escape RUBY_VERSION}dev%, ua
698
+ ensure
699
+ util_restore_version
700
+ end
701
+
702
+ def test_user_agent_revision_missing
703
+ util_save_version
704
+
705
+ Object.send :remove_const, :RUBY_PATCHLEVEL
706
+ Object.send :const_set, :RUBY_PATCHLEVEL, -1
707
+ Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION)
708
+
709
+ ua = @fetcher.user_agent
710
+
711
+ assert_match %r%\(#{Regexp.escape RUBY_RELEASE_DATE}\)%, ua
712
+ ensure
713
+ util_restore_version
714
+ end
715
+
628
716
  def test_yaml_error_on_size
629
717
  use_ui @ui do
630
718
  self.class.enable_yaml = false
@@ -747,5 +835,24 @@ gems:
747
835
  assert_equal "/home/skillet", @fetcher.correct_for_windows_path(path)
748
836
  end
749
837
 
838
+ def util_save_version
839
+ @orig_RUBY_ENGINE = RUBY_ENGINE if defined? RUBY_ENGINE
840
+ @orig_RUBY_PATCHLEVEL = RUBY_PATCHLEVEL
841
+ @orig_RUBY_REVISION = RUBY_REVISION if defined? RUBY_REVISION
842
+ end
843
+
844
+ def util_restore_version
845
+ Object.send :remove_const, :RUBY_ENGINE if defined?(RUBY_ENGINE)
846
+ Object.send :const_set, :RUBY_ENGINE, @orig_RUBY_ENGINE if
847
+ defined?(@orig_RUBY_ENGINE)
848
+
849
+ Object.send :remove_const, :RUBY_PATCHLEVEL
850
+ Object.send :const_set, :RUBY_PATCHLEVEL, @orig_RUBY_PATCHLEVEL
851
+
852
+ Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION)
853
+ Object.send :const_set, :RUBY_REVISION, @orig_RUBY_REVISION if
854
+ defined?(@orig_RUBY_REVISION)
855
+ end
856
+
750
857
  end
751
858
 
@@ -1,6 +1,7 @@
1
1
  require 'rubygems/test_case'
2
2
  require 'rubygems/source_index'
3
3
  require 'rubygems/config_file'
4
+ require 'rubygems/deprecate'
4
5
 
5
6
  class TestGemSourceIndex < Gem::TestCase
6
7
 
@@ -10,182 +11,6 @@ class TestGemSourceIndex < Gem::TestCase
10
11
  util_setup_fake_fetcher
11
12
  end
12
13
 
13
- def test_self_from_gems_in
14
- spec_dir = File.join @gemhome, 'specifications'
15
-
16
- FileUtils.rm_r spec_dir
17
-
18
- FileUtils.mkdir_p spec_dir
19
-
20
- a1 = quick_spec 'a', '1' do |spec| spec.author = 'author 1' end
21
-
22
- spec_file = File.join spec_dir, a1.spec_name
23
-
24
- File.open spec_file, 'w' do |fp|
25
- fp.write a1.to_ruby
26
- end
27
-
28
- si = Gem::SourceIndex.from_gems_in spec_dir
29
-
30
- assert_equal [spec_dir], si.spec_dirs
31
- assert_equal [a1.full_name], si.gems.keys
32
- end
33
-
34
- def test_self_load_specification
35
- spec_dir = File.join @gemhome, 'specifications'
36
-
37
- FileUtils.rm_r spec_dir
38
-
39
- FileUtils.mkdir_p spec_dir
40
-
41
- a1 = quick_spec 'a', '1' do |spec| spec.author = 'author 1' end
42
-
43
- spec_file = File.join spec_dir, a1.spec_name
44
-
45
- File.open spec_file, 'w' do |fp|
46
- fp.write a1.to_ruby
47
- end
48
-
49
- spec = Gem::SourceIndex.load_specification spec_file
50
-
51
- assert_equal a1.author, spec.author
52
- end
53
-
54
- def test_self_load_specification_utf_8
55
- spec_dir = File.join @gemhome, 'specifications'
56
-
57
- FileUtils.rm_r spec_dir
58
-
59
- FileUtils.mkdir_p spec_dir
60
-
61
- spec_file = File.join spec_dir, "utf-8.gemspec"
62
- spec_data = <<-SPEC
63
- Gem::Specification.new do |s|
64
- s.name = %q{utf}
65
- s.version = "8"
66
-
67
- s.required_rubygems_version = Gem::Requirement.new(">= 0")
68
- s.authors = ["\317\200"]
69
- s.date = %q{2008-09-10}
70
- s.description = %q{This is a test description}
71
- s.email = %q{example@example.com}
72
- s.has_rdoc = true
73
- s.homepage = %q{http://example.com}
74
- s.require_paths = ["lib"]
75
- s.rubygems_version = %q{1.2.0}
76
- s.summary = %q{this is a summary}
77
-
78
- if s.respond_to? :specification_version then
79
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
80
- s.specification_version = 2
81
-
82
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
83
- else
84
- end
85
- else
86
- end
87
- end
88
- SPEC
89
-
90
- spec_data.force_encoding 'UTF-8'
91
-
92
- File.open spec_file, 'w' do |io| io.write spec_data end
93
-
94
- spec = Gem::SourceIndex.load_specification spec_file
95
-
96
- pi = "\317\200"
97
- pi.force_encoding 'UTF-8' if pi.respond_to? :force_encoding
98
-
99
- assert_equal pi, spec.author
100
- end if Gem.ruby_version > Gem::Version.new('1.9')
101
-
102
- def test_self_load_specification_exception
103
- spec_dir = File.join @gemhome, 'specifications'
104
-
105
- FileUtils.mkdir_p spec_dir
106
-
107
- spec_file = File.join spec_dir, 'a-1.gemspec'
108
-
109
- File.open spec_file, 'w' do |fp|
110
- fp.write 'raise Exception, "epic fail"'
111
- end
112
-
113
- out, err = capture_io do
114
- assert_equal nil, Gem::SourceIndex.load_specification(spec_file)
115
- end
116
-
117
- assert_equal '', out
118
-
119
- expected = "Invalid gemspec in [#{spec_file}]: epic fail\n"
120
- assert_equal expected, err
121
- end
122
-
123
- def test_self_load_specification_interrupt
124
- spec_dir = File.join @gemhome, 'specifications'
125
-
126
- FileUtils.mkdir_p spec_dir
127
-
128
- spec_file = File.join spec_dir, 'a-1.gemspec'
129
-
130
- File.open spec_file, 'w' do |fp|
131
- fp.write 'raise Interrupt, "^C"'
132
- end
133
-
134
- use_ui @ui do
135
- assert_raises Interrupt do
136
- Gem::SourceIndex.load_specification(spec_file)
137
- end
138
- end
139
-
140
- assert_equal '', @ui.output
141
- assert_equal '', @ui.error
142
- end
143
-
144
- def test_self_load_specification_syntax_error
145
- spec_dir = File.join @gemhome, 'specifications'
146
-
147
- FileUtils.mkdir_p spec_dir
148
-
149
- spec_file = File.join spec_dir, 'a-1.gemspec'
150
-
151
- File.open spec_file, 'w' do |fp|
152
- fp.write '1 +'
153
- end
154
-
155
- out, err = capture_io do
156
- assert_equal nil, Gem::SourceIndex.load_specification(spec_file)
157
- end
158
-
159
- assert_equal '', out
160
-
161
- assert_match(/syntax error/, err)
162
- end
163
-
164
- def test_self_load_specification_system_exit
165
- spec_dir = File.join @gemhome, 'specifications'
166
-
167
- FileUtils.mkdir_p spec_dir
168
-
169
- spec_file = File.join spec_dir, 'a-1.gemspec'
170
-
171
- File.open spec_file, 'w' do |fp|
172
- fp.write 'raise SystemExit, "bye-bye"'
173
- end
174
-
175
- use_ui @ui do
176
- assert_raises SystemExit do
177
- Gem::SourceIndex.load_specification(spec_file)
178
- end
179
- end
180
-
181
- assert_equal '', @ui.output
182
- assert_equal '', @ui.error
183
- end
184
-
185
- def test_create_from_directory
186
- # TODO
187
- end
188
-
189
14
  def test_find_name
190
15
  assert_equal [@a1, @a2, @a3a], @source_index.find_name('a')
191
16
  assert_equal [@a2], @source_index.find_name('a', '= 2')
@@ -203,7 +28,7 @@ end
203
28
  end
204
29
 
205
30
  def test_find_name_empty_cache
206
- empty_source_index = Gem::SourceIndex.new({})
31
+ empty_source_index = Gem::SourceIndex.new
207
32
  assert_equal [], empty_source_index.find_name("foo")
208
33
  end
209
34
 
@@ -310,7 +135,7 @@ end
310
135
 
311
136
  FileUtils.mv a1_spec, @tempdir
312
137
 
313
- source_index = Gem::SourceIndex.from_installed_gems
138
+ source_index = Gem.source_index
314
139
 
315
140
  refute source_index.gems.include?(@a1.full_name)
316
141
 
@@ -321,26 +146,16 @@ end
321
146
  assert source_index.gems.include?(@a1.full_name)
322
147
  end
323
148
 
324
- def test_refresh_bang_not_from_dir
325
- source_index = Gem::SourceIndex.new
326
-
327
- e = assert_raises RuntimeError do
328
- source_index.refresh!
329
- end
330
-
331
- assert_equal 'source index not created from disk', e.message
332
- end
333
-
334
149
  def test_remove_spec
335
150
  deleted = @source_index.remove_spec 'a-1'
336
151
 
337
152
  assert_equal %w[a-2 a-3.a a_evil-9 c-1.2],
338
- @source_index.all_gems.values.map { |s| s.full_name }.sort
153
+ @source_index.gems.values.map { |s| s.full_name }.sort
339
154
 
340
155
  deleted = @source_index.remove_spec 'a-3.a'
341
156
 
342
157
  assert_equal %w[a-2 a_evil-9 c-1.2],
343
- @source_index.all_gems.values.map { |s| s.full_name }.sort
158
+ @source_index.gems.values.map { |s| s.full_name }.sort
344
159
  end
345
160
 
346
161
  def test_search
@@ -366,8 +181,8 @@ end
366
181
  s.platform = Gem::Platform.new 'x86-other_platform1'
367
182
  end
368
183
 
369
- si = Gem::SourceIndex.new(a1.full_name => a1, a1_mine.full_name => a1_mine,
370
- a1_other.full_name => a1_other)
184
+ si = Gem::SourceIndex.new
185
+ si.add_specs a1, a1_mine, a1_other
371
186
 
372
187
  dep = Gem::Dependency.new 'a', Gem::Requirement.new('1')
373
188