rubygems-update 1.6.2 → 1.7.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 (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