ruby-virtualenv 0.5.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.
- data/.autotest +13 -0
- data/.gitignore +6 -0
- data/CHANGELOG +17 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +28 -0
- data/README.md +120 -0
- data/Rakefile +2 -0
- data/TODO +68 -0
- data/bin/ruby-virtualenv +6 -0
- data/features/development.feature +13 -0
- data/features/steps/common.rb +174 -0
- data/features/steps/env.rb +10 -0
- data/lib/sandbox.rb +41 -0
- data/lib/sandbox/cli.rb +173 -0
- data/lib/sandbox/errors.rb +38 -0
- data/lib/sandbox/installer.rb +175 -0
- data/lib/sandbox/output.rb +25 -0
- data/lib/sandbox/templates/activate.erb +97 -0
- data/lib/sandbox/templates/gemrc.erb +7 -0
- data/lib/sandbox/version.rb +3 -0
- data/ruby-virtualenv.gemspec +20 -0
- data/spec/sandbox/cli_spec.rb +234 -0
- data/spec/sandbox/errors_spec.rb +32 -0
- data/spec/sandbox/installer_spec.rb +303 -0
- data/spec/sandbox/output_spec.rb +145 -0
- data/spec/sandbox_spec.rb +25 -0
- data/spec/spec_helper.rb +46 -0
- metadata +106 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
# This file must be used with "source bin/activate" *from bash*
|
2
|
+
# you cannot run it directly
|
3
|
+
|
4
|
+
forget_cached_commands () {
|
5
|
+
|
6
|
+
# This should detect bash and zsh, which have a hash command that must
|
7
|
+
# be called to get it to forget past commands. Without forgetting
|
8
|
+
# past commands the $PATH changes we made may not be respected
|
9
|
+
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
|
10
|
+
hash -r
|
11
|
+
fi
|
12
|
+
|
13
|
+
}
|
14
|
+
|
15
|
+
deactivate () {
|
16
|
+
|
17
|
+
if [ -n "$_OLD_SANDBOX_GEM_HOME" ] ; then
|
18
|
+
GEM_HOME="$_OLD_SANDBOX_GEM_HOME"
|
19
|
+
export GEM_HOME
|
20
|
+
else
|
21
|
+
unset GEM_HOME
|
22
|
+
fi
|
23
|
+
|
24
|
+
if [ -n "$_OLD_SANDBOX_GEM_PATH" ] ; then
|
25
|
+
GEM_PATH="$_OLD_SANDBOX_GEM_PATH"
|
26
|
+
export GEM_PATH
|
27
|
+
else
|
28
|
+
unset GEM_PATH
|
29
|
+
fi
|
30
|
+
|
31
|
+
if [ -n "$_OLD_SANDBOX_PATH" ] ; then
|
32
|
+
PATH="$_OLD_SANDBOX_PATH"
|
33
|
+
export PATH
|
34
|
+
fi
|
35
|
+
|
36
|
+
if [ -n "$_OLD_SANDBOX_HOME" ] ; then
|
37
|
+
HOME="$_OLD_SANDBOX_HOME"
|
38
|
+
export HOME
|
39
|
+
fi
|
40
|
+
|
41
|
+
if [ -n "$_OLD_SANDBOX_PS1" ] ; then
|
42
|
+
PS1="$_OLD_SANDBOX_PS1"
|
43
|
+
export PS1
|
44
|
+
fi
|
45
|
+
|
46
|
+
unset _OLD_SANDBOX_PATH
|
47
|
+
unset _OLD_SANDBOX_HOME
|
48
|
+
unset _OLD_SANDBOX_GEM_HOME
|
49
|
+
unset _OLD_SANDBOX_GEM_PATH
|
50
|
+
unset _OLD_SANDBOX_PS1
|
51
|
+
unset SANDBOX_ENV
|
52
|
+
|
53
|
+
forget_cached_commands
|
54
|
+
|
55
|
+
if [ ! "$1" = "nondestructive" ] ; then
|
56
|
+
# Self destruct!
|
57
|
+
unset deactivate
|
58
|
+
unset forget_cached_commands
|
59
|
+
fi
|
60
|
+
}
|
61
|
+
|
62
|
+
activate () {
|
63
|
+
|
64
|
+
# unset irrelavent variables
|
65
|
+
deactivate nondestructive
|
66
|
+
|
67
|
+
# preserve current variables
|
68
|
+
_OLD_SANDBOX_GEM_HOME="$GEM_HOME"
|
69
|
+
_OLD_SANDBOX_GEM_PATH="$GEM_PATH"
|
70
|
+
_OLD_SANDBOX_PATH="$PATH"
|
71
|
+
_OLD_SANDBOX_HOME="$HOME"
|
72
|
+
_OLD_SANDBOX_PS1="$PS1"
|
73
|
+
|
74
|
+
# set the sandbox-aware states
|
75
|
+
SANDBOX_ENV="<%= target %>"
|
76
|
+
PATH="$SANDBOX_ENV/bin:$PATH"
|
77
|
+
HOME="$SANDBOX_ENV"
|
78
|
+
GEM_HOME="$SANDBOX_ENV/rubygems"
|
79
|
+
GEM_PATH="$GEM_HOME"
|
80
|
+
if [ "`basename \"$SANDBOX_ENV\"`" = "__" ] ; then
|
81
|
+
# special case for Aspen magic directories
|
82
|
+
# see http://www.zetadev.com/software/aspen/
|
83
|
+
PS1="[ruby-virtualenv:`basename \`dirname \"$SANDBOX_ENV\"\``] $PS1"
|
84
|
+
else
|
85
|
+
PS1="(ruby-virtualenv:`basename \"$SANDBOX_ENV\"`) $PS1"
|
86
|
+
fi
|
87
|
+
|
88
|
+
export SANDBOX_ENV PATH HOME GEM_HOME GEM_PATH PS1
|
89
|
+
|
90
|
+
forget_cached_commands
|
91
|
+
|
92
|
+
unset activate
|
93
|
+
}
|
94
|
+
|
95
|
+
activate
|
96
|
+
|
97
|
+
# Thanks to the virtualenv developers (http://pypi.python.org/pypi/virtualenv)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/sandbox/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Jacob Radford", "Francesc Esplugas"]
|
6
|
+
gem.email = ["nkryptic@gmail.com", "francesc.esplugas@gmail.com"]
|
7
|
+
gem.description = %q{Create virtual ruby/rubygems environments.}
|
8
|
+
gem.summary = %q{Create virtual ruby/rubygems environments.}
|
9
|
+
gem.homepage = "http://github.com/fesplugas/ruby-virtualenv"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "ruby-virtualenv"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Sandbox::VERSION
|
17
|
+
|
18
|
+
gem.add_development_dependency "rspec", "~> 2.6.0"
|
19
|
+
gem.add_development_dependency "mocha", "~> 0.10.0"
|
20
|
+
end
|
@@ -0,0 +1,234 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sandbox/cli'
|
3
|
+
|
4
|
+
describe Sandbox::CLI do
|
5
|
+
|
6
|
+
it "should raise an error when running from a loaded sandbox" do
|
7
|
+
begin
|
8
|
+
ENV[ 'SANDBOX' ] = 'something'
|
9
|
+
lambda { Sandbox::CLI.verify_environment! }.should raise_error( Sandbox::LoadedSandboxError )
|
10
|
+
ensure
|
11
|
+
ENV[ 'SANDBOX' ] = nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "calling execute" do
|
16
|
+
before( :each ) do
|
17
|
+
@instance = stub_everything()
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should handle all errors" do
|
21
|
+
Sandbox::CLI.stubs( :new ).raises( StandardError )
|
22
|
+
Sandbox::CLI.expects( :handle_error ).with( instance_of( StandardError ) )
|
23
|
+
Sandbox::CLI.execute
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should attempt to parse ARGV by default" do
|
27
|
+
Sandbox::CLI.expects( :parse ).with( ARGV ).returns( @instance )
|
28
|
+
Sandbox::CLI.execute
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should create a new instance" do
|
32
|
+
Sandbox::CLI.expects( :new ).returns( @instance )
|
33
|
+
Sandbox::CLI.execute
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should call parse_args! on the new instance" do
|
37
|
+
@instance.expects( :parse_args! )
|
38
|
+
Sandbox::CLI.expects( :new ).returns( @instance )
|
39
|
+
Sandbox::CLI.execute
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should run the instance" do
|
43
|
+
@instance.expects( :execute! )
|
44
|
+
Sandbox::CLI.expects( :parse ).returns( @instance )
|
45
|
+
Sandbox::CLI.execute
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "handling errors" do
|
50
|
+
it "should just print Sandbox::Error message" do
|
51
|
+
err = Sandbox::Error.new( "spec test msg" )
|
52
|
+
Sandbox::CLI.expects( :tell_unless_really_quiet ).once.with( regexp_matches( /^Sandbox error: spec test msg/ ) )
|
53
|
+
Sandbox::CLI.handle_error( err )
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should just print wrapped StandardError message" do
|
57
|
+
err = StandardError.new( "spec test msg" )
|
58
|
+
Sandbox::CLI.expects( :tell_unless_really_quiet ).once.with( regexp_matches( /^Error: spec test msg/ ) )
|
59
|
+
Sandbox::CLI.handle_error( err )
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should have simple message for Interrupt" do
|
63
|
+
err = Interrupt.new( "spec test msg" )
|
64
|
+
Sandbox::CLI.expects( :tell_unless_really_quiet ).once.with( 'Interrupted' )
|
65
|
+
Sandbox::CLI.handle_error( err )
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should reraise other errors" do
|
69
|
+
err = NotImplementedError.new( 'you should have implemented it, dummy' )
|
70
|
+
Sandbox::CLI.expects( :raise ).once.with( err )
|
71
|
+
Sandbox::CLI.handle_error( err )
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "a new instance" do
|
76
|
+
|
77
|
+
before( :each ) do
|
78
|
+
@cli = Sandbox::CLI.new
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should have no default 'gems to install'" do
|
82
|
+
@cli.options[ :gems ].should == []
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "instance calling parse_args!" do
|
86
|
+
def processor( *args ); lambda { @cli.parse_args!( args ) }; end
|
87
|
+
def process( *args ); processor( *args ).call; end
|
88
|
+
|
89
|
+
describe "using NO arguments" do
|
90
|
+
it "should use raise nothing" do
|
91
|
+
process()
|
92
|
+
@cli.options[ :original_args ].should == []
|
93
|
+
@cli.options[ :args ].should == []
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "using VALID arguments" do
|
98
|
+
[ '-V', '--version' ].each do |arg|
|
99
|
+
it "should print the version for switch '#{arg}'" do
|
100
|
+
@cli.expects( :tell_unless_really_quiet ).with( Sandbox::VERSION )
|
101
|
+
processor( arg ).should raise_error( SystemExit ) { |error| error.status.should == 0 }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
[ '-V', '--version' ].each do |arg|
|
106
|
+
it "should ignore additional arguments after '#{arg}'" do
|
107
|
+
# @cli.stubs(:puts)
|
108
|
+
@cli.expects( :tell_unless_really_quiet ).with( Sandbox::VERSION ).times(2)
|
109
|
+
processor( arg, '-x' ).should raise_error( SystemExit ) { |error| error.status.should == 0 }
|
110
|
+
processor( arg, 'unknown' ).should raise_error( SystemExit ) { |error| error.status.should == 0 }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
[ '-h', '--help' ].each do |arg|
|
115
|
+
it "should show help for '#{arg}'" do
|
116
|
+
@cli.expects( :tell_unless_really_quiet ).with( instance_of( OptionParser ) )
|
117
|
+
processor( arg ).should raise_error( SystemExit ) { |error| error.status.should == 0 }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
[ '-h', '--help' ].each do |arg|
|
122
|
+
it "should ignore additional arguments after '#{arg}'" do
|
123
|
+
@cli.expects( :tell_unless_really_quiet ).with( instance_of( OptionParser ) ).times(2)
|
124
|
+
processor( arg, '-x' ).should raise_error( SystemExit ) { |error| error.status.should == 0 }
|
125
|
+
processor( arg, 'unknown' ).should raise_error( SystemExit ) { |error| error.status.should == 0 }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
[ '-H', '--long-help' ].each do |arg|
|
130
|
+
it "should show long help for '#{arg}'" do
|
131
|
+
@cli.expects( :tell_unless_really_quiet )
|
132
|
+
@cli.expects( :long_help )
|
133
|
+
processor( arg ).should raise_error( SystemExit ) { |error| error.status.should == 0 }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
[ '-v', '--verbose' ].each do |arg|
|
138
|
+
it "should increase verbosity with '#{arg}'" do
|
139
|
+
Sandbox.expects( :increase_verbosity )
|
140
|
+
process( arg )
|
141
|
+
@cli.options[ :original_args ].should == [ arg ]
|
142
|
+
@cli.options[ :args ].should == []
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
[ [ '-v', '-v' ], [ '--verbose', '--verbose' ] ].each do |args|
|
147
|
+
it "should increase verbosity twice with '#{args.join(' ')}'" do
|
148
|
+
Sandbox.expects( :increase_verbosity ).times(2)
|
149
|
+
process( *args )
|
150
|
+
@cli.options[ :original_args ].should == args
|
151
|
+
@cli.options[ :args ].should == []
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should require additional arguments with switch '-g'" do
|
156
|
+
processor( '-g' ).should raise_error( Sandbox::ParseError )
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should set 'gems to install' with switch '-g'" do
|
160
|
+
args = [ '-g', 'somegem,anothergem' ]
|
161
|
+
process( *args )
|
162
|
+
@cli.options[ :original_args ].should == args
|
163
|
+
@cli.options[ :args ].should == []
|
164
|
+
@cli.options[ :gems ].should == [ 'somegem', 'anothergem' ]
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should clear 'gems to install' with switch '-n'" do
|
168
|
+
process( '-n' )
|
169
|
+
@cli.options[ :original_args ].should == [ '-n' ]
|
170
|
+
@cli.options[ :args ].should == []
|
171
|
+
@cli.options[ :gems ].should == []
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should store leftover arguments in options for arguments '/path/to/somewhere'" do
|
175
|
+
args = [ '/path/to/somewhere' ]
|
176
|
+
process( *args )
|
177
|
+
@cli.options[ :original_args ].should == args
|
178
|
+
@cli.options[ :args ].should == args
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should store leftover arguments in options for arguments '-v /path/to/somewhere'" do
|
182
|
+
args = [ '-v', '/path/to/somewhere' ]
|
183
|
+
process( *args )
|
184
|
+
@cli.options[ :original_args ].should == args
|
185
|
+
@cli.options[ :args ].should == [ args.last ]
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe "using INVALID arguments" do
|
190
|
+
it "should exit with message for invalid switch '-x'" do
|
191
|
+
processor( '-x' ).
|
192
|
+
should raise_error( Sandbox::ParseError ) { |error| error.message.should =~ /-x\b/ }
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
describe "instance calling execute!" do
|
198
|
+
def processor; lambda { @cli.execute! }; end
|
199
|
+
def process; processor.call; end
|
200
|
+
|
201
|
+
it "should raise error with no target specified" do
|
202
|
+
@cli.options[ :args ] = []
|
203
|
+
processor.should raise_error
|
204
|
+
end
|
205
|
+
|
206
|
+
it "should raise error with more than one target" do
|
207
|
+
@cli.options[ :args ] = [ 'one', 'two' ]
|
208
|
+
processor.should raise_error
|
209
|
+
end
|
210
|
+
|
211
|
+
it "should instantiate an Installer and call populate with one target" do
|
212
|
+
@cli.options.delete( :gems )
|
213
|
+
@cli.options[ :args ] = [ 'one' ]
|
214
|
+
installer = mock( 'Installer', :populate )
|
215
|
+
Sandbox::Installer.expects( :new ).with( { :target => 'one' } ).returns( installer )
|
216
|
+
process
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
describe "instance calling long_help" do
|
222
|
+
it "should return a long descriptive string" do
|
223
|
+
@cli.long_help.split( "\n" ).size.should be > 20
|
224
|
+
@cli.long_help.should =~ /activate/
|
225
|
+
@cli.long_help.should =~ /deactivate/
|
226
|
+
@cli.long_help.should =~ /NOTES:/
|
227
|
+
@cli.long_help.should =~ /WARNINGS:/
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'new', Sandbox::Error do
|
4
|
+
it "should wrap it's message with 'Sandbox error'" do
|
5
|
+
Sandbox::Error.new( 'msg' ).message.should == 'Sandbox error: msg'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'new', Sandbox::LoadedSandboxError do
|
10
|
+
it "should have informative default msg" do
|
11
|
+
Sandbox::LoadedSandboxError.new.message.should =~ /loaded sandbox/
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'new', Sandbox::ParseError do
|
16
|
+
it "should accept reason with array" do
|
17
|
+
Sandbox::ParseError.new( 'testing', [ 1, 2, 3, 4 ] ).
|
18
|
+
message.should =~ /testing => 1 2 3 4/
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should accept reason with string" do
|
22
|
+
Sandbox::ParseError.new( 'testing', "1, 2, 3, 4" ).
|
23
|
+
message.should =~ /testing => 1, 2, 3, 4/
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should fall back to reason alone" do
|
27
|
+
Sandbox::ParseError.new( 'testing', [] ).
|
28
|
+
message.should =~ /testing$/
|
29
|
+
Sandbox::ParseError.new( 'testing', '' ).
|
30
|
+
message.should =~ /testing$/
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,303 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Sandbox::Installer, "(mocked)" do
|
4
|
+
|
5
|
+
before( :each ) do
|
6
|
+
Sandbox.instance_eval { instance_variables.each { |v| remove_instance_variable v } }
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "creating an instance" do
|
10
|
+
# initialize( options={} )
|
11
|
+
it "should set it's options" do
|
12
|
+
opts = { :somewhere => true, :nowhere => false }
|
13
|
+
installer = Sandbox::Installer.new( opts )
|
14
|
+
installer.options[ :somewhere ].should be_true
|
15
|
+
installer.options[ :nowhere ].should be_false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "instance" do
|
20
|
+
# target
|
21
|
+
describe "when target called" do
|
22
|
+
it "should validate target directory once" do
|
23
|
+
path = '/some/new/target'
|
24
|
+
opts = { :target => path }
|
25
|
+
@installer = Sandbox::Installer.new( opts )
|
26
|
+
@installer.expects( :resolve_target ).with( path ).once.then.returns( path )
|
27
|
+
@installer.target.should == path
|
28
|
+
@installer.target.should == path
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# populate
|
33
|
+
describe "when populate called" do
|
34
|
+
it "should call all steps of populate process" do
|
35
|
+
@installer = Sandbox::Installer.new
|
36
|
+
@installer.stubs( :tell )
|
37
|
+
@installer.stubs( :target ).returns( '/tmp/sandbox' )
|
38
|
+
@installer.expects( :create_directories )
|
39
|
+
@installer.expects( :install_scripts )
|
40
|
+
@installer.expects( :install_gemrc )
|
41
|
+
@installer.expects( :install_gems )
|
42
|
+
@installer.populate
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# create_directories
|
47
|
+
describe "when create_directories called" do
|
48
|
+
before( :each ) do
|
49
|
+
@path = '/some/new/target'
|
50
|
+
@installer = Sandbox::Installer.new
|
51
|
+
@installer.stubs( :target ).returns( @path )
|
52
|
+
end
|
53
|
+
it "should create sandbox directory structure" do
|
54
|
+
FileUtils.expects( :mkdir_p ).with( @path + '/rubygems/bin' )
|
55
|
+
FileUtils.stubs( :ln_s )
|
56
|
+
@installer.create_directories
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should symlink gem bin directory" do
|
60
|
+
FileUtils.stubs( :mkdir_p )
|
61
|
+
FileUtils.expects( :ln_s ).with( @path + '/rubygems/bin', @path + '/bin' )
|
62
|
+
@installer.create_directories
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# install_scripts
|
67
|
+
describe "when install_scripts called" do
|
68
|
+
before( :each ) do
|
69
|
+
@path = '/some/new/target'
|
70
|
+
@installer = Sandbox::Installer.new
|
71
|
+
@installer.stubs( :target ).returns( @path )
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should read template file" do
|
75
|
+
File.expects( :read ).with( regexp_matches( /templates\/activate\.erb/ ) ).returns( '<%= target %>' )
|
76
|
+
File.stubs( :open )
|
77
|
+
@installer.install_scripts
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should write out activate script to SANDBOX/bin/activate" do
|
81
|
+
file = StringIO.new
|
82
|
+
File.stubs( :read ).returns( '<%= target %>' )
|
83
|
+
File.expects( :open ).with( @path + '/bin/activate', 'w' ).yields( file )
|
84
|
+
@installer.install_scripts
|
85
|
+
file.string.should == @path
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# install_gemrc
|
90
|
+
describe "when install_gemrc called" do
|
91
|
+
before( :each ) do
|
92
|
+
@path = '/some/new/target'
|
93
|
+
@installer = Sandbox::Installer.new
|
94
|
+
@installer.stubs( :target ).returns( @path )
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should read template file" do
|
98
|
+
File.expects( :read ).with( regexp_matches( /templates\/gemrc\.erb/ ) ).returns( '' )
|
99
|
+
File.stubs( :open )
|
100
|
+
@installer.install_gemrc
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should write out gemrc to SANDBOX/.gemrc" do
|
104
|
+
file = StringIO.new
|
105
|
+
File.stubs( :read ).returns( 'gemrc' )
|
106
|
+
File.expects( :open ).with( @path + '/.gemrc', 'w' ).yields( file )
|
107
|
+
@installer.install_gemrc
|
108
|
+
file.string.should == 'gemrc'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# install_gems
|
113
|
+
describe "when install_gems called" do
|
114
|
+
before( :each ) do
|
115
|
+
@installer = Sandbox::Installer.new( :gems => [ 'mygem' ] )
|
116
|
+
@installer.stubs( :setup_sandbox_env )
|
117
|
+
@installer.stubs( :restore_sandbox_env )
|
118
|
+
@installer.stubs( :tell )
|
119
|
+
@installer.stubs( :tell_unless_really_quiet )
|
120
|
+
end
|
121
|
+
|
122
|
+
# it "should skip install when network is not available" do
|
123
|
+
# Ping.expects( :pingecho ).with( 'gems.rubyforge.org' ).returns( false )
|
124
|
+
# @installer.install_gems.should be_false
|
125
|
+
# end
|
126
|
+
|
127
|
+
it "should install a good gem" do
|
128
|
+
@installer.expects( :shell_out ).with( 'gem install mygem' ).returns( [ true, 'blah' ] )
|
129
|
+
@installer.install_gems
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should gracefully handle a bad gem" do
|
133
|
+
@installer.expects( :shell_out ).with( 'gem install mygem' ).returns( [ false, 'blah' ] )
|
134
|
+
@installer.expects( :tell_unless_really_quiet ).with( regexp_matches( /failed/ ) )
|
135
|
+
@installer.install_gems
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# resolve_target( path )
|
140
|
+
describe "when resolve_target called" do
|
141
|
+
before( :each ) do
|
142
|
+
@path = '/absolute/path/to/parent'
|
143
|
+
@installer = Sandbox::Installer.new
|
144
|
+
@installer.stubs( :fix_path ).returns( @path )
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should raise error when it path exists" do
|
148
|
+
File.expects( :exists? ).with( @path ).returns( true )
|
149
|
+
lambda { @installer.resolve_target( @path ) }.should raise_error( Sandbox::Error )
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should return path when parent directory passes check_path!" do
|
153
|
+
File.expects( :exists? ).with( @path ).returns( false )
|
154
|
+
@installer.expects( :check_path! ).with( '/absolute/path/to' ).returns( true )
|
155
|
+
@installer.resolve_target( @path ).should == @path
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should return path when any parent directory passes check_path!" do
|
159
|
+
File.expects( :exists? ).with( @path ).returns( false )
|
160
|
+
@installer.expects( :check_path! ).with( '/absolute/path/to' ).returns( false )
|
161
|
+
@installer.expects( :check_path! ).with( '/absolute/path' ).returns( false )
|
162
|
+
@installer.expects( :check_path! ).with( '/absolute' ).returns( true )
|
163
|
+
@installer.resolve_target( @path ).should == @path
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should have emergency safeguard for dirname on root" do
|
167
|
+
@installer.stubs( :fix_path ).returns( '/absolute' )
|
168
|
+
@installer.expects( :check_path! ).with( '/' ).returns( false )
|
169
|
+
lambda { @installer.resolve_target( '/absolute' ) }.should raise_error( RuntimeError )
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# check_path!( path )
|
174
|
+
describe "when check_path! called" do
|
175
|
+
before( :each ) do
|
176
|
+
@path = '/absolute/path/to/parent'
|
177
|
+
@installer = Sandbox::Installer.new
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should raise error when it is not writable" do
|
181
|
+
File.expects( :directory? ).with( @path ).returns( true )
|
182
|
+
File.expects( :writable? ).with( @path ).returns( false )
|
183
|
+
lambda { @installer.check_path!( @path ) }.should raise_error( Sandbox::Error )
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should raise error when it is not a directory" do
|
187
|
+
File.expects( :directory? ).with( @path ).returns( false )
|
188
|
+
File.expects( :exists? ).with( @path ).returns( true )
|
189
|
+
lambda { @installer.check_path!( @path ) }.should raise_error( Sandbox::Error )
|
190
|
+
end
|
191
|
+
|
192
|
+
it "should return false when it doesn't exist" do
|
193
|
+
File.expects( :directory? ).with( @path ).returns( false )
|
194
|
+
File.expects( :exists? ).with( @path ).returns( false )
|
195
|
+
@installer.check_path!( @path ).should be_false
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should return true when it can be created" do
|
199
|
+
File.expects( :directory? ).with( @path ).returns( true )
|
200
|
+
File.expects( :writable? ).with( @path ).returns( true )
|
201
|
+
@installer.check_path!( @path ).should == true
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
# fix_path( path )
|
206
|
+
describe "when fix_path called" do
|
207
|
+
it "should not change absolute path" do
|
208
|
+
path = '/absolute/path/to/target'
|
209
|
+
@installer = Sandbox::Installer.new
|
210
|
+
@installer.fix_path( path ).should == path
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should make relative into absolute path" do
|
214
|
+
abs_path = '/absolute/working/directory'
|
215
|
+
path = 'relative/path/to/target'
|
216
|
+
FileUtils.expects( :pwd ).returns( abs_path )
|
217
|
+
@installer = Sandbox::Installer.new
|
218
|
+
@installer.fix_path( path ).should == abs_path + '/' + path
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
# shell_out( cmd )
|
223
|
+
describe "when shell_out called" do
|
224
|
+
it "should record true when successful" do
|
225
|
+
@installer = Sandbox::Installer.new
|
226
|
+
result = @installer.shell_out( 'true' )
|
227
|
+
result.first.should be_true
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should record false when unsuccessful" do
|
231
|
+
@installer = Sandbox::Installer.new
|
232
|
+
result = @installer.shell_out( 'false' )
|
233
|
+
result.first.should_not be_true
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should record std output" do
|
237
|
+
@installer = Sandbox::Installer.new
|
238
|
+
result = @installer.shell_out( 'ls -d /' )
|
239
|
+
result.last.chomp.should == '/'
|
240
|
+
end
|
241
|
+
|
242
|
+
it "should ignore std error" do
|
243
|
+
@installer = Sandbox::Installer.new
|
244
|
+
result = @installer.shell_out( 'ls -d / 1>/dev/null' )
|
245
|
+
result.last.chomp.should == ''
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
describe "setup and restore sandbox env called" do
|
250
|
+
it "should set and restore the environment" do
|
251
|
+
orig_home = ENV[ 'HOME' ]
|
252
|
+
orig_gem_home = ENV[ 'GEM_HOME' ]
|
253
|
+
orig_gem_path = ENV[ 'GEM_PATH' ]
|
254
|
+
@installer = Sandbox::Installer.new
|
255
|
+
@installer.stubs( :target ).returns( 'dummypath' )
|
256
|
+
|
257
|
+
@installer.setup_sandbox_env
|
258
|
+
ENV[ 'HOME' ].should == 'dummypath'
|
259
|
+
ENV[ 'GEM_HOME' ].should == 'dummypath/rubygems'
|
260
|
+
ENV[ 'GEM_PATH' ].should == 'dummypath/rubygems'
|
261
|
+
@installer.restore_sandbox_env
|
262
|
+
ENV[ 'HOME' ].should == orig_home
|
263
|
+
ENV[ 'GEM_HOME' ].should == orig_gem_home
|
264
|
+
ENV[ 'GEM_PATH' ].should == orig_gem_path
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
describe Sandbox::Installer, "(using tmpdir)" do
|
271
|
+
def tmppath() File.join( Dir.tmpdir, "sandbox_testing" ) end
|
272
|
+
def rmtmppath() FileUtils.rm_rf( tmppath ) end
|
273
|
+
def mktmppath() FileUtils.mkdir_p( tmppath ) end
|
274
|
+
|
275
|
+
def in_dir( dir = tmppath )
|
276
|
+
old_pwd = Dir.pwd
|
277
|
+
begin
|
278
|
+
Dir.chdir( dir )
|
279
|
+
yield
|
280
|
+
ensure
|
281
|
+
Dir.chdir( old_pwd )
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
before( :each ) do
|
286
|
+
mktmppath
|
287
|
+
end
|
288
|
+
|
289
|
+
after( :each ) do
|
290
|
+
rmtmppath
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should create target directory structure" do
|
294
|
+
target = tmppath + '/target'
|
295
|
+
@installer = Sandbox::Installer.new( :target => target )
|
296
|
+
@installer.create_directories
|
297
|
+
File.directory?( target + '/rubygems/bin' ).should be_true
|
298
|
+
File.symlink?( target + '/bin' ).should be_true
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
|
303
|
+
|