rubygems-update 1.2.0 → 1.3.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.
- data.tar.gz.sig +2 -4
- data/ChangeLog +155 -0
- data/Rakefile +20 -5
- data/doc/release_notes/rel_1_3_0.rdoc +125 -0
- data/lib/rubygems.rb +107 -15
- data/lib/rubygems/commands/contents_command.rb +1 -1
- data/lib/rubygems/commands/environment_command.rb +40 -0
- data/lib/rubygems/commands/help_command.rb +2 -2
- data/lib/rubygems/commands/install_command.rb +15 -0
- data/lib/rubygems/commands/lock_command.rb +15 -6
- data/lib/rubygems/commands/outdated_command.rb +1 -1
- data/lib/rubygems/commands/pristine_command.rb +1 -1
- data/lib/rubygems/commands/query_command.rb +14 -9
- data/lib/rubygems/commands/rdoc_command.rb +5 -1
- data/lib/rubygems/commands/specification_command.rb +2 -2
- data/lib/rubygems/commands/unpack_command.rb +1 -1
- data/lib/rubygems/commands/update_command.rb +23 -14
- data/lib/rubygems/commands/which_command.rb +4 -3
- data/lib/rubygems/config_file.rb +25 -3
- data/lib/rubygems/defaults.rb +42 -11
- data/lib/rubygems/dependency_installer.rb +19 -15
- data/lib/rubygems/doc_manager.rb +162 -115
- data/lib/rubygems/ext/builder.rb +2 -2
- data/lib/rubygems/ext/rake_builder.rb +1 -1
- data/lib/rubygems/gem_path_searcher.rb +35 -19
- data/lib/rubygems/indexer.rb +15 -6
- data/lib/rubygems/install_update_options.rb +7 -0
- data/lib/rubygems/installer.rb +85 -9
- data/lib/rubygems/local_remote_options.rb +7 -0
- data/lib/rubygems/package/tar_reader.rb +7 -7
- data/lib/rubygems/platform.rb +1 -18
- data/lib/rubygems/remote_fetcher.rb +45 -54
- data/lib/rubygems/rubygems_version.rb +1 -1
- data/lib/rubygems/source_index.rb +22 -7
- data/lib/rubygems/source_info_cache.rb +9 -0
- data/lib/rubygems/spec_fetcher.rb +18 -20
- data/lib/rubygems/specification.rb +502 -293
- data/lib/rubygems/test_utilities.rb +19 -8
- data/lib/rubygems/uninstaller.rb +60 -26
- data/setup.rb +15 -7
- data/test/gemutilities.rb +84 -0
- data/test/mockgemui.rb +22 -2
- data/test/test_gem.rb +118 -13
- data/test/test_gem_commands_dependency_command.rb +1 -1
- data/test/test_gem_commands_list_command.rb +37 -0
- data/test/test_gem_commands_lock_command.rb +69 -0
- data/test/test_gem_commands_query_command.rb +40 -1
- data/test/test_gem_commands_uninstall_command.rb +60 -0
- data/test/test_gem_config_file.rb +51 -17
- data/test/test_gem_ext_configure_builder.rb +9 -9
- data/test/test_gem_ext_rake_builder.rb +21 -12
- data/test/test_gem_gem_path_searcher.rb +15 -7
- data/test/test_gem_indexer.rb +35 -1
- data/test/test_gem_install_update_options.rb +26 -5
- data/test/test_gem_installer.rb +93 -21
- data/test/test_gem_local_remote_options.rb +12 -0
- data/test/test_gem_platform.rb +6 -13
- data/test/test_gem_remote_fetcher.rb +121 -31
- data/test/test_gem_source_index.rb +74 -21
- data/test/test_gem_source_info_cache.rb +2 -1
- data/test/test_gem_spec_fetcher.rb +13 -3
- data/test/test_gem_specification.rb +13 -7
- data/test/test_gem_uninstaller.rb +25 -2
- metadata +6 -2
- metadata.gz.sig +0 -0
@@ -5,10 +5,6 @@ require 'rubygems/gem_path_searcher'
|
|
5
5
|
class Gem::GemPathSearcher
|
6
6
|
attr_accessor :gemspecs
|
7
7
|
attr_accessor :lib_dirs
|
8
|
-
|
9
|
-
public :init_gemspecs
|
10
|
-
public :matching_file
|
11
|
-
public :lib_dirs_for
|
12
8
|
end
|
13
9
|
|
14
10
|
class TestGemGemPathSearcher < RubyGemTestCase
|
@@ -40,6 +36,10 @@ class TestGemGemPathSearcher < RubyGemTestCase
|
|
40
36
|
assert_equal @foo1, @gps.find('foo')
|
41
37
|
end
|
42
38
|
|
39
|
+
def test_find_all
|
40
|
+
assert_equal [@foo1], @gps.find_all('foo')
|
41
|
+
end
|
42
|
+
|
43
43
|
def test_init_gemspecs
|
44
44
|
assert_equal [@bar2, @bar1, @foo2, @foo1], @gps.init_gemspecs
|
45
45
|
end
|
@@ -51,9 +51,17 @@ class TestGemGemPathSearcher < RubyGemTestCase
|
|
51
51
|
assert_equal expected, lib_dirs
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
55
|
-
assert !@gps.matching_file(@foo1, 'bar')
|
56
|
-
assert @gps.matching_file(@foo1, 'foo')
|
54
|
+
def test_matching_file_eh
|
55
|
+
assert !@gps.matching_file?(@foo1, 'bar')
|
56
|
+
assert @gps.matching_file?(@foo1, 'foo')
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_matching_files
|
60
|
+
assert_equal [], @gps.matching_files(@foo1, 'bar')
|
61
|
+
|
62
|
+
expected = File.join @foo1.full_gem_path, 'lib', 'foo.rb'
|
63
|
+
|
64
|
+
assert_equal [expected], @gps.matching_files(@foo1, 'foo')
|
57
65
|
end
|
58
66
|
|
59
67
|
end
|
data/test/test_gem_indexer.rb
CHANGED
@@ -21,7 +21,6 @@ class TestGemIndexer < RubyGemTestCase
|
|
21
21
|
util_make_gems
|
22
22
|
|
23
23
|
@d2_0 = quick_gem 'd', '2.0'
|
24
|
-
write_file File.join(*%W[gems #{@d2_0.original_name} lib code.rb]) do end
|
25
24
|
util_build_gem @d2_0
|
26
25
|
|
27
26
|
gems = File.join(@tempdir, 'gems')
|
@@ -38,6 +37,41 @@ class TestGemIndexer < RubyGemTestCase
|
|
38
37
|
@indexer.directory
|
39
38
|
end
|
40
39
|
|
40
|
+
def test_build_indicies
|
41
|
+
spec = quick_gem 'd', '2.0'
|
42
|
+
spec.instance_variable_set :@original_platform, ''
|
43
|
+
|
44
|
+
@indexer.make_temp_directories
|
45
|
+
|
46
|
+
index = Gem::SourceIndex.new
|
47
|
+
index.add_spec spec
|
48
|
+
|
49
|
+
use_ui @ui do
|
50
|
+
@indexer.build_indicies index
|
51
|
+
end
|
52
|
+
|
53
|
+
specs_path = File.join @indexer.directory, "specs.#{@marshal_version}"
|
54
|
+
specs_dump = Gem.read_binary specs_path
|
55
|
+
specs = Marshal.load specs_dump
|
56
|
+
|
57
|
+
expected = [
|
58
|
+
['d', Gem::Version.new('2.0'), 'ruby'],
|
59
|
+
]
|
60
|
+
|
61
|
+
assert_equal expected, specs, 'specs'
|
62
|
+
|
63
|
+
latest_specs_path = File.join @indexer.directory,
|
64
|
+
"latest_specs.#{@marshal_version}"
|
65
|
+
latest_specs_dump = Gem.read_binary latest_specs_path
|
66
|
+
latest_specs = Marshal.load latest_specs_dump
|
67
|
+
|
68
|
+
expected = [
|
69
|
+
['d', Gem::Version.new('2.0'), 'ruby'],
|
70
|
+
]
|
71
|
+
|
72
|
+
assert_equal expected, latest_specs, 'latest_specs'
|
73
|
+
end
|
74
|
+
|
41
75
|
def test_generate_index
|
42
76
|
use_ui @ui do
|
43
77
|
@indexer.generate_index
|
@@ -1,20 +1,21 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
|
3
|
+
require File.join(File.expand_path(File.dirname(__FILE__)),
|
4
|
+
'gem_installer_test_case')
|
3
5
|
require 'rubygems/install_update_options'
|
4
6
|
require 'rubygems/command'
|
5
7
|
|
6
|
-
class TestGemInstallUpdateOptions <
|
8
|
+
class TestGemInstallUpdateOptions < GemInstallerTestCase
|
7
9
|
|
8
10
|
def setup
|
9
11
|
super
|
10
12
|
|
11
13
|
@cmd = Gem::Command.new 'dummy', 'dummy'
|
12
14
|
@cmd.extend Gem::InstallUpdateOptions
|
15
|
+
@cmd.add_install_update_options
|
13
16
|
end
|
14
17
|
|
15
18
|
def test_add_install_update_options
|
16
|
-
@cmd.add_install_update_options
|
17
|
-
|
18
19
|
args = %w[-i /install_to --rdoc --ri -E -f -t -w -P HighSecurity
|
19
20
|
--ignore-dependencies --format-exec --include-dependencies]
|
20
21
|
|
@@ -22,8 +23,6 @@ class TestGemInstallUpdateOptions < RubyGemTestCase
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def test_security_policy
|
25
|
-
@cmd.add_install_update_options
|
26
|
-
|
27
26
|
@cmd.handle_options %w[-P HighSecurity]
|
28
27
|
|
29
28
|
assert_equal Gem::Security::HighSecurity, @cmd.options[:security_policy]
|
@@ -37,4 +36,26 @@ class TestGemInstallUpdateOptions < RubyGemTestCase
|
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
39
|
+
def test_user_install_enabled
|
40
|
+
@cmd.handle_options %w[--user-install]
|
41
|
+
|
42
|
+
@installer = Gem::Installer.new @gem, @cmd.options
|
43
|
+
@installer.install
|
44
|
+
assert File.exist?(File.join(Gem.user_dir, 'gems'))
|
45
|
+
assert File.exist?(File.join(Gem.user_dir, 'gems',
|
46
|
+
@spec.full_name))
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_user_install_disabled_read_only
|
50
|
+
@cmd.handle_options %w[--no-user-install]
|
51
|
+
|
52
|
+
File.chmod 0755, @userhome
|
53
|
+
FileUtils.chmod 0000, @gemhome
|
54
|
+
|
55
|
+
assert_raises(Gem::FilePermissionError) do
|
56
|
+
@installer = Gem::Installer.new @gem, @cmd.options
|
57
|
+
end
|
58
|
+
ensure
|
59
|
+
FileUtils.chmod 0755, @gemhome
|
60
|
+
end
|
40
61
|
end
|
data/test/test_gem_installer.rb
CHANGED
@@ -70,7 +70,10 @@ load 'my_exec'
|
|
70
70
|
#{Gem.ruby}: No such file or directory -- extconf.rb (LoadError)
|
71
71
|
EOF
|
72
72
|
|
73
|
-
|
73
|
+
assert_match %r%#{Regexp.escape Gem.ruby} extconf.rb%,
|
74
|
+
File.read(gem_make_out)
|
75
|
+
assert_match %r%#{Regexp.escape Gem.ruby}: No such file%,
|
76
|
+
File.read(gem_make_out)
|
74
77
|
end
|
75
78
|
|
76
79
|
def test_build_extensions_unsupported
|
@@ -515,6 +518,7 @@ load 'my_exec'
|
|
515
518
|
spec = quick_gem 'a' do |s| s.platform = Gem::Platform.new 'mswin32' end
|
516
519
|
gem = File.join @tempdir, "#{spec.full_name}.gem"
|
517
520
|
|
521
|
+
Dir.mkdir util_inst_bindir
|
518
522
|
util_build_gem spec
|
519
523
|
FileUtils.mv File.join(@gemhome, 'cache', "#{spec.full_name}.gem"),
|
520
524
|
@tempdir
|
@@ -525,10 +529,23 @@ load 'my_exec'
|
|
525
529
|
end
|
526
530
|
|
527
531
|
def test_install
|
532
|
+
Dir.mkdir util_inst_bindir
|
528
533
|
util_setup_gem
|
529
534
|
|
530
|
-
|
531
|
-
|
535
|
+
cache_file = File.join @gemhome, 'cache', "#{@spec.full_name}.gem"
|
536
|
+
|
537
|
+
Gem.pre_install do |installer|
|
538
|
+
assert !File.exist?(cache_file), 'cache file should not exist yet'
|
539
|
+
end
|
540
|
+
|
541
|
+
Gem.post_install do |installer|
|
542
|
+
assert File.exist?(cache_file), 'cache file should exist'
|
543
|
+
end
|
544
|
+
|
545
|
+
build_rake_in do
|
546
|
+
use_ui @ui do
|
547
|
+
assert_equal @spec, @installer.install
|
548
|
+
end
|
532
549
|
end
|
533
550
|
|
534
551
|
gemdir = File.join @gemhome, 'gems', @spec.full_name
|
@@ -548,6 +565,9 @@ load 'my_exec'
|
|
548
565
|
|
549
566
|
assert_equal spec_file, @spec.loaded_from
|
550
567
|
assert File.exist?(spec_file)
|
568
|
+
|
569
|
+
assert_same @installer, @pre_install_hook_arg
|
570
|
+
assert_same @installer, @post_install_hook_arg
|
551
571
|
end
|
552
572
|
|
553
573
|
def test_install_bad_gem
|
@@ -582,6 +602,29 @@ load 'my_exec'
|
|
582
602
|
end
|
583
603
|
end
|
584
604
|
|
605
|
+
def test_install_check_dependencies_install_dir
|
606
|
+
gemhome2 = "#{@gemhome}2"
|
607
|
+
@spec.add_dependency 'b'
|
608
|
+
|
609
|
+
b2 = quick_gem 'b', 2
|
610
|
+
|
611
|
+
FileUtils.mv @gemhome, gemhome2
|
612
|
+
Gem.source_index.gems.delete b2.full_name
|
613
|
+
source_index = Gem::SourceIndex.from_gems_in File.join(gemhome2,
|
614
|
+
'specifications')
|
615
|
+
|
616
|
+
util_setup_gem
|
617
|
+
|
618
|
+
@installer = Gem::Installer.new @gem, :install_dir => gemhome2,
|
619
|
+
:source_index => source_index
|
620
|
+
|
621
|
+
use_ui @ui do
|
622
|
+
@installer.install
|
623
|
+
end
|
624
|
+
|
625
|
+
assert File.exist?(File.join(gemhome2, 'gems', @spec.full_name))
|
626
|
+
end
|
627
|
+
|
585
628
|
def test_install_force
|
586
629
|
use_ui @ui do
|
587
630
|
installer = Gem::Installer.new old_ruby_required, :force => true
|
@@ -593,12 +636,15 @@ load 'my_exec'
|
|
593
636
|
end
|
594
637
|
|
595
638
|
def test_install_ignore_dependencies
|
639
|
+
Dir.mkdir util_inst_bindir
|
596
640
|
@spec.add_dependency 'b', '> 5'
|
597
641
|
util_setup_gem
|
598
642
|
@installer.ignore_dependencies = true
|
599
643
|
|
600
|
-
|
601
|
-
|
644
|
+
build_rake_in do
|
645
|
+
use_ui @ui do
|
646
|
+
assert_equal @spec, @installer.install
|
647
|
+
end
|
602
648
|
end
|
603
649
|
|
604
650
|
gemdir = File.join @gemhome, 'gems', @spec.full_name
|
@@ -635,32 +681,58 @@ load 'my_exec'
|
|
635
681
|
"#{@spec.full_name}.gemspec"))
|
636
682
|
end
|
637
683
|
|
638
|
-
|
639
|
-
|
684
|
+
unless win_platform? # File.chmod doesn't work
|
685
|
+
def test_install_user_local_fallback
|
686
|
+
Dir.mkdir util_inst_bindir
|
687
|
+
File.chmod 0755, @userhome
|
688
|
+
File.chmod 0000, util_inst_bindir
|
689
|
+
File.chmod 0000, Gem.dir
|
690
|
+
@spec.executables = ["executable"]
|
640
691
|
|
641
|
-
|
642
|
-
|
692
|
+
build_rake_in do
|
693
|
+
use_ui @ui do
|
694
|
+
util_setup_gem
|
695
|
+
@installer.install
|
696
|
+
end
|
697
|
+
end
|
643
698
|
|
644
|
-
|
645
|
-
|
699
|
+
assert File.exist?(File.join(Gem.user_dir, 'gems',
|
700
|
+
@spec.full_name, 'lib', 'code.rb'))
|
701
|
+
assert File.exist?(File.join(Gem.user_dir, 'bin', 'executable'))
|
702
|
+
ensure
|
703
|
+
File.chmod 0755, Gem.dir
|
704
|
+
File.chmod 0755, util_inst_bindir
|
705
|
+
end
|
706
|
+
|
707
|
+
def test_install_bindir_read_only
|
708
|
+
Dir.mkdir util_inst_bindir
|
709
|
+
File.chmod 0755, @userhome
|
710
|
+
File.chmod 0000, util_inst_bindir
|
711
|
+
|
712
|
+
build_rake_in do
|
713
|
+
use_ui @ui do
|
714
|
+
setup
|
715
|
+
util_setup_gem
|
716
|
+
@installer.install
|
717
|
+
end
|
718
|
+
end
|
646
719
|
|
647
|
-
|
720
|
+
assert File.exist?(File.join(Gem.user_dir, 'bin', 'executable'))
|
721
|
+
ensure
|
722
|
+
File.chmod 0755, util_inst_bindir
|
723
|
+
end
|
648
724
|
end
|
649
725
|
|
650
|
-
def
|
651
|
-
|
726
|
+
def test_install_with_message
|
727
|
+
@spec.post_install_message = 'I am a shiny gem!'
|
652
728
|
|
653
|
-
|
654
|
-
|
729
|
+
use_ui @ui do
|
730
|
+
Dir.chdir @tempdir do Gem::Builder.new(@spec).build end
|
655
731
|
|
656
|
-
e = assert_raise Gem::FilePermissionError do
|
657
732
|
@installer.install
|
658
733
|
end
|
659
734
|
|
660
|
-
|
661
|
-
e.message
|
662
|
-
ensure
|
663
|
-
File.chmod orig_mode, Gem.dir
|
735
|
+
assert_match %r|I am a shiny gem!|, @ui.output
|
664
736
|
end
|
665
737
|
|
666
738
|
def test_install_wrong_ruby_version
|
@@ -19,6 +19,18 @@ class TestGemLocalRemoteOptions < RubyGemTestCase
|
|
19
19
|
assert @cmd.handles?(args)
|
20
20
|
end
|
21
21
|
|
22
|
+
def test_both_eh
|
23
|
+
assert_equal false, @cmd.both?
|
24
|
+
|
25
|
+
@cmd.options[:domain] = :local
|
26
|
+
|
27
|
+
assert_equal false, @cmd.both?
|
28
|
+
|
29
|
+
@cmd.options[:domain] = :both
|
30
|
+
|
31
|
+
assert_equal true, @cmd.both?
|
32
|
+
end
|
33
|
+
|
22
34
|
def test_local_eh
|
23
35
|
assert_equal false, @cmd.local?
|
24
36
|
|
data/test/test_gem_platform.rb
CHANGED
@@ -5,19 +5,6 @@ require 'rbconfig'
|
|
5
5
|
|
6
6
|
class TestGemPlatform < RubyGemTestCase
|
7
7
|
|
8
|
-
def test_self_const_missing
|
9
|
-
consts = [:DARWIN, :LINUX_586, :MSWIN32, :PPC_DARWIN, :WIN32, :X86_LINUX]
|
10
|
-
|
11
|
-
consts.each do |const|
|
12
|
-
e = assert_raise NameError do
|
13
|
-
Gem::Platform.const_missing const
|
14
|
-
end
|
15
|
-
|
16
|
-
assert_equal "#{const} has been removed, use CURRENT instead",
|
17
|
-
e.message
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
8
|
def test_self_local
|
22
9
|
util_set_arch 'i686-darwin8.10.1'
|
23
10
|
|
@@ -105,6 +92,12 @@ class TestGemPlatform < RubyGemTestCase
|
|
105
92
|
platform = Gem::Platform.new 'i386-mswin32-80'
|
106
93
|
|
107
94
|
assert_equal expected, platform.to_a, 'i386-mswin32-80'
|
95
|
+
|
96
|
+
expected = ['x86', 'solaris', '2.10']
|
97
|
+
|
98
|
+
platform = Gem::Platform.new 'i386-solaris-2.10'
|
99
|
+
|
100
|
+
assert_equal expected, platform.to_a, 'i386-solaris-2.10'
|
108
101
|
end
|
109
102
|
|
110
103
|
def test_initialize_mswin32_vc6
|
@@ -10,6 +10,7 @@ require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
|
|
10
10
|
require 'webrick'
|
11
11
|
require 'zlib'
|
12
12
|
require 'rubygems/remote_fetcher'
|
13
|
+
require 'ostruct'
|
13
14
|
|
14
15
|
# = Testing Proxy Settings
|
15
16
|
#
|
@@ -106,6 +107,8 @@ gems:
|
|
106
107
|
@a1, @a1_gem = util_gem 'a', '1' do |s| s.executables << 'a_bin' end
|
107
108
|
|
108
109
|
Gem::RemoteFetcher.fetcher = nil
|
110
|
+
|
111
|
+
@fetcher = Gem::RemoteFetcher.fetcher
|
109
112
|
end
|
110
113
|
|
111
114
|
def test_self_fetcher
|
@@ -117,7 +120,10 @@ gems:
|
|
117
120
|
def test_self_fetcher_with_proxy
|
118
121
|
proxy_uri = 'http://proxy.example.com'
|
119
122
|
Gem.configuration[:http_proxy] = proxy_uri
|
123
|
+
Gem::RemoteFetcher.fetcher = nil
|
124
|
+
|
120
125
|
fetcher = Gem::RemoteFetcher.fetcher
|
126
|
+
|
121
127
|
assert_not_nil fetcher
|
122
128
|
assert_kind_of Gem::RemoteFetcher, fetcher
|
123
129
|
assert_equal proxy_uri, fetcher.instance_variable_get(:@proxy_uri).to_s
|
@@ -145,7 +151,7 @@ gems:
|
|
145
151
|
def test_fetch_size_socket_error
|
146
152
|
fetcher = Gem::RemoteFetcher.new nil
|
147
153
|
def fetcher.connection_for(uri)
|
148
|
-
raise SocketError
|
154
|
+
raise SocketError, "tarded"
|
149
155
|
end
|
150
156
|
|
151
157
|
uri = 'http://gems.example.com/yaml'
|
@@ -153,15 +159,13 @@ gems:
|
|
153
159
|
fetcher.fetch_size uri
|
154
160
|
end
|
155
161
|
|
156
|
-
assert_equal "SocketError
|
157
|
-
e.message
|
162
|
+
assert_equal "SocketError: tarded (#{uri})", e.message
|
158
163
|
end
|
159
164
|
|
160
165
|
def test_no_proxy
|
161
166
|
use_ui @ui do
|
162
|
-
fetcher
|
163
|
-
|
164
|
-
assert_equal SERVER_DATA.size, fetcher.fetch_size(@server_uri)
|
167
|
+
assert_data_from_server @fetcher.fetch_path(@server_uri)
|
168
|
+
assert_equal SERVER_DATA.size, @fetcher.fetch_size(@server_uri)
|
165
169
|
end
|
166
170
|
end
|
167
171
|
|
@@ -238,6 +242,7 @@ gems:
|
|
238
242
|
install_dir = File.join @tempdir, 'more_gems'
|
239
243
|
|
240
244
|
a1_cache_gem = File.join install_dir, 'cache', "#{@a1.full_name}.gem"
|
245
|
+
FileUtils.mkdir_p(File.dirname(a1_cache_gem))
|
241
246
|
actual = fetcher.download(@a1, 'http://gems.example.com', install_dir)
|
242
247
|
|
243
248
|
assert_equal a1_cache_gem, actual
|
@@ -247,7 +252,7 @@ gems:
|
|
247
252
|
assert File.exist?(a1_cache_gem)
|
248
253
|
end
|
249
254
|
|
250
|
-
unless win_platform?
|
255
|
+
unless win_platform? # File.chmod doesn't work
|
251
256
|
def test_download_local_read_only
|
252
257
|
FileUtils.mv @a1_gem, @tempdir
|
253
258
|
local_path = File.join @tempdir, "#{@a1.full_name}.gem"
|
@@ -263,6 +268,19 @@ gems:
|
|
263
268
|
ensure
|
264
269
|
File.chmod 0755, File.join(@gemhome, 'cache')
|
265
270
|
end
|
271
|
+
|
272
|
+
def test_download_read_only
|
273
|
+
File.chmod 0555, File.join(@gemhome, 'cache')
|
274
|
+
File.chmod 0555, File.join(@gemhome)
|
275
|
+
|
276
|
+
fetcher = util_fuck_with_fetcher File.read(@a1_gem)
|
277
|
+
fetcher.download(@a1, 'http://gems.example.com')
|
278
|
+
assert File.exist?(File.join(Gem.user_dir, 'cache',
|
279
|
+
"#{@a1.full_name}.gem"))
|
280
|
+
ensure
|
281
|
+
File.chmod 0755, File.join(@gemhome)
|
282
|
+
File.chmod 0755, File.join(@gemhome, 'cache')
|
283
|
+
end
|
266
284
|
end
|
267
285
|
|
268
286
|
def test_download_platform_legacy
|
@@ -363,10 +381,32 @@ gems:
|
|
363
381
|
end
|
364
382
|
end
|
365
383
|
|
384
|
+
def test_fetch_path_gzip
|
385
|
+
fetcher = Gem::RemoteFetcher.new nil
|
386
|
+
|
387
|
+
def fetcher.open_uri_or_path(uri, mtime, head = nil)
|
388
|
+
Gem.gzip 'foo'
|
389
|
+
end
|
390
|
+
|
391
|
+
assert_equal 'foo', fetcher.fetch_path(@uri + 'foo.gz')
|
392
|
+
end
|
393
|
+
|
394
|
+
def test_fetch_path_gzip_unmodified
|
395
|
+
fetcher = Gem::RemoteFetcher.new nil
|
396
|
+
|
397
|
+
def fetcher.open_uri_or_path(uri, mtime, head = nil)
|
398
|
+
nil
|
399
|
+
end
|
400
|
+
|
401
|
+
assert_equal nil, fetcher.fetch_path(@uri + 'foo.gz', Time.at(0))
|
402
|
+
end
|
403
|
+
|
366
404
|
def test_fetch_path_io_error
|
367
405
|
fetcher = Gem::RemoteFetcher.new nil
|
368
406
|
|
369
|
-
def fetcher.open_uri_or_path(uri
|
407
|
+
def fetcher.open_uri_or_path(uri, mtime, head = nil)
|
408
|
+
raise EOFError
|
409
|
+
end
|
370
410
|
|
371
411
|
e = assert_raise Gem::RemoteFetcher::FetchError do
|
372
412
|
fetcher.fetch_path 'uri'
|
@@ -379,7 +419,9 @@ gems:
|
|
379
419
|
def test_fetch_path_socket_error
|
380
420
|
fetcher = Gem::RemoteFetcher.new nil
|
381
421
|
|
382
|
-
def fetcher.open_uri_or_path(uri
|
422
|
+
def fetcher.open_uri_or_path(uri, mtime, head = nil)
|
423
|
+
raise SocketError
|
424
|
+
end
|
383
425
|
|
384
426
|
e = assert_raise Gem::RemoteFetcher::FetchError do
|
385
427
|
fetcher.fetch_path 'uri'
|
@@ -392,7 +434,7 @@ gems:
|
|
392
434
|
def test_fetch_path_system_call_error
|
393
435
|
fetcher = Gem::RemoteFetcher.new nil
|
394
436
|
|
395
|
-
def fetcher.open_uri_or_path(uri)
|
437
|
+
def fetcher.open_uri_or_path(uri, mtime = nil, head = nil)
|
396
438
|
raise Errno::ECONNREFUSED, 'connect(2)'
|
397
439
|
end
|
398
440
|
|
@@ -405,6 +447,16 @@ gems:
|
|
405
447
|
assert_equal 'uri', e.uri
|
406
448
|
end
|
407
449
|
|
450
|
+
def test_fetch_path_unmodified
|
451
|
+
fetcher = Gem::RemoteFetcher.new nil
|
452
|
+
|
453
|
+
def fetcher.open_uri_or_path(uri, mtime, head = nil)
|
454
|
+
nil
|
455
|
+
end
|
456
|
+
|
457
|
+
assert_equal nil, fetcher.fetch_path(URI.parse(@gem_repo), Time.at(0))
|
458
|
+
end
|
459
|
+
|
408
460
|
def test_get_proxy_from_env_empty
|
409
461
|
orig_env_HTTP_PROXY = ENV['HTTP_PROXY']
|
410
462
|
orig_env_http_proxy = ENV['http_proxy']
|
@@ -462,7 +514,7 @@ gems:
|
|
462
514
|
def conn.request(req)
|
463
515
|
unless defined? @requested then
|
464
516
|
@requested = true
|
465
|
-
res = Net::
|
517
|
+
res = Net::HTTPMovedPermanently.new nil, 301, nil
|
466
518
|
res.add_field 'Location', 'http://gems.example.com/real_path'
|
467
519
|
res
|
468
520
|
else
|
@@ -475,9 +527,9 @@ gems:
|
|
475
527
|
conn = { 'gems.example.com:80' => conn }
|
476
528
|
fetcher.instance_variable_set :@connections, conn
|
477
529
|
|
478
|
-
fetcher.
|
479
|
-
|
480
|
-
|
530
|
+
data = fetcher.open_uri_or_path 'http://gems.example.com/redirect'
|
531
|
+
|
532
|
+
assert_equal 'real_path', data
|
481
533
|
end
|
482
534
|
|
483
535
|
def test_open_uri_or_path_limited_redirects
|
@@ -486,7 +538,7 @@ gems:
|
|
486
538
|
conn = Object.new
|
487
539
|
def conn.started?() true end
|
488
540
|
def conn.request(req)
|
489
|
-
res = Net::
|
541
|
+
res = Net::HTTPMovedPermanently.new nil, 301, nil
|
490
542
|
res.add_field 'Location', 'http://gems.example.com/redirect'
|
491
543
|
res
|
492
544
|
end
|
@@ -495,29 +547,43 @@ gems:
|
|
495
547
|
fetcher.instance_variable_set :@connections, conn
|
496
548
|
|
497
549
|
e = assert_raise Gem::RemoteFetcher::FetchError do
|
498
|
-
fetcher.
|
550
|
+
fetcher.open_uri_or_path 'http://gems.example.com/redirect'
|
499
551
|
end
|
500
552
|
|
501
553
|
assert_equal 'too many redirects (http://gems.example.com/redirect)',
|
502
554
|
e.message
|
503
555
|
end
|
504
556
|
|
505
|
-
def
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
557
|
+
def test_request
|
558
|
+
uri = URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}"
|
559
|
+
util_stub_connection_for :body => :junk, :code => 200
|
560
|
+
|
561
|
+
response = @fetcher.request uri, Net::HTTP::Get
|
562
|
+
|
563
|
+
assert_equal 200, response.code
|
564
|
+
assert_equal :junk, response.body
|
513
565
|
end
|
514
566
|
|
515
|
-
def
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
567
|
+
def test_request_head
|
568
|
+
uri = URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}"
|
569
|
+
util_stub_connection_for :body => '', :code => 200
|
570
|
+
response = @fetcher.request uri, Net::HTTP::Head
|
571
|
+
|
572
|
+
assert_equal 200, response.code
|
573
|
+
assert_equal '', response.body
|
574
|
+
end
|
575
|
+
|
576
|
+
def test_request_unmodifed
|
577
|
+
uri = URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}"
|
578
|
+
conn = util_stub_connection_for :body => '', :code => 304
|
579
|
+
|
580
|
+
t = Time.now
|
581
|
+
response = @fetcher.request uri, Net::HTTP::Head, t
|
582
|
+
|
583
|
+
assert_equal 304, response.code
|
584
|
+
assert_equal '', response.body
|
585
|
+
|
586
|
+
assert_equal t.rfc2822, conn.payload['if-modified-since']
|
521
587
|
end
|
522
588
|
|
523
589
|
def test_yaml_error_on_size
|
@@ -528,7 +594,17 @@ gems:
|
|
528
594
|
end
|
529
595
|
end
|
530
596
|
|
531
|
-
|
597
|
+
def util_stub_connection_for hash
|
598
|
+
def @fetcher.connection= conn
|
599
|
+
@conn = conn
|
600
|
+
end
|
601
|
+
|
602
|
+
def @fetcher.connection_for uri
|
603
|
+
@conn
|
604
|
+
end
|
605
|
+
|
606
|
+
@fetcher.connection = Conn.new OpenStruct.new(hash)
|
607
|
+
end
|
532
608
|
|
533
609
|
def assert_error(exception_class=Exception)
|
534
610
|
got_exception = false
|
@@ -548,6 +624,20 @@ gems:
|
|
548
624
|
assert_block("Data is not from proxy") { data =~ /0\.4\.2/ }
|
549
625
|
end
|
550
626
|
|
627
|
+
class Conn
|
628
|
+
attr_accessor :payload
|
629
|
+
|
630
|
+
def initialize(response)
|
631
|
+
@response = response
|
632
|
+
self.payload = nil
|
633
|
+
end
|
634
|
+
|
635
|
+
def request(req)
|
636
|
+
self.payload = req
|
637
|
+
@response
|
638
|
+
end
|
639
|
+
end
|
640
|
+
|
551
641
|
class NilLog < WEBrick::Log
|
552
642
|
def log(level, data) #Do nothing
|
553
643
|
end
|