ruby-virtualenv 0.5.0 → 0.5.1
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/README.md +32 -63
- data/Rakefile +8 -0
- data/lib/sandbox/cli.rb +9 -13
- data/lib/sandbox/errors.rb +2 -2
- data/lib/sandbox/installer.rb +46 -72
- data/lib/sandbox/templates/activate.erb +2 -16
- data/lib/sandbox/version.rb +1 -1
- data/ruby-virtualenv.gemspec +1 -1
- data/spec/sandbox/cli_spec.rb +114 -116
- data/spec/sandbox/errors_spec.rb +5 -9
- data/spec/sandbox/installer_spec.rb +131 -133
- data/spec/sandbox/output_spec.rb +39 -39
- data/spec/sandbox_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +6 -12
- data/features/development.feature +0 -13
- data/features/steps/common.rb +0 -174
- data/features/steps/env.rb +0 -10
data/README.md
CHANGED
@@ -1,10 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
* http://github.com/nkryptic/sandbox
|
5
|
-
|
6
|
-
DESCRIPTION:
|
7
|
-
------------
|
1
|
+
Ruby Virtualenv
|
2
|
+
===============
|
8
3
|
|
9
4
|
Inspired by Python's [virtualenv](http://pypi.python.org/pypi/virtualenv)
|
10
5
|
project, Ruby-Virtualenv is a utility to create sandboxed Ruby/Rubygems
|
@@ -31,90 +26,64 @@ When you want to leave the environment:
|
|
31
26
|
|
32
27
|
$ deactivate
|
33
28
|
|
34
|
-
|
35
|
-
|
29
|
+
Notes
|
30
|
+
-----
|
36
31
|
|
37
32
|
* It creates an environment that has its own installation directory for Gems.
|
38
33
|
* It doesn't share gems with other sandbox environments.
|
39
34
|
* It (optionally) doesn't use the globally installed gems either.
|
40
35
|
* It will use a local to the sandbox .gemrc file
|
41
36
|
|
42
|
-
|
43
|
-
|
37
|
+
Install
|
38
|
+
-------
|
44
39
|
|
45
|
-
|
46
|
-
temporarily to the sandbox directory. Other environment variables are
|
47
|
-
set to enable this funtionality, so if you may experience odd behavior.
|
48
|
-
Everything should be reset when you deactivate the sandbox.
|
40
|
+
$ gem install ruby-virtualenv
|
49
41
|
|
50
|
-
|
51
|
-
|
42
|
+
Usage
|
43
|
+
-----
|
52
44
|
|
53
45
|
Create a new virtualenv (verbose output by default):
|
54
46
|
|
55
47
|
$ ruby-virtualenv ~/.ruby-virtualenvs/my-new-sandbox
|
56
|
-
creating new sandbox in
|
48
|
+
creating new sandbox in ~/.ruby-virtualenvs/my-new-sandbox
|
57
49
|
installing activation script
|
58
50
|
installing .gemrc
|
59
51
|
installing gems:
|
60
52
|
nothing to do
|
61
53
|
|
62
|
-
Create a new sandbox with no output:
|
63
|
-
|
64
|
-
$ ruby-virtualenv ~/.ruby-virtualenvs/my-new-sandbox -q
|
65
|
-
|
66
54
|
Create a new sandbox with specific gems:
|
67
55
|
|
68
56
|
$ ruby-virtualenv ~/.ruby-virtualenvs/my-new-sandbox -g rake,rails
|
69
|
-
creating new sandbox in
|
57
|
+
creating new sandbox in ~/.ruby-virtualenvs/my-new-sandbox
|
70
58
|
installing activation script
|
71
59
|
installing .gemrc
|
72
60
|
installing gems:
|
73
61
|
gem: rake
|
74
62
|
gem: rails
|
75
63
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
I hope to expand the full version branch to allow for installing both
|
80
|
-
rubygems and ruby as part of the sandbox. This would enable experimentation
|
81
|
-
with different versions of both and exclude the requirement on needing
|
82
|
-
rubygems in the first place.
|
83
|
-
|
84
|
-
REQUIREMENTS:
|
85
|
-
-------------
|
86
|
-
|
87
|
-
* ruby
|
88
|
-
* rubygems
|
89
|
-
|
90
|
-
INSTALL:
|
91
|
-
--------
|
92
|
-
|
93
|
-
$ gem install ruby-virtualenv
|
94
|
-
|
95
|
-
LICENSE:
|
96
|
-
--------
|
64
|
+
License
|
65
|
+
-------
|
97
66
|
|
98
|
-
(The MIT License)
|
67
|
+
(The MIT License)
|
99
68
|
|
100
|
-
Copyright (c) 2011 Francesc Esplugas
|
101
|
-
Copyright (c) 2008 Jacob Radford
|
69
|
+
Copyright (c) 2011 Francesc Esplugas
|
70
|
+
Copyright (c) 2008 Jacob Radford
|
102
71
|
|
103
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
104
|
-
a copy of this software and associated documentation files (the
|
105
|
-
'Software'), to deal in the Software without restriction, including
|
106
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
107
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
108
|
-
permit persons to whom the Software is furnished to do so, subject to
|
109
|
-
the following conditions:
|
72
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
73
|
+
a copy of this software and associated documentation files (the
|
74
|
+
'Software'), to deal in the Software without restriction, including
|
75
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
76
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
77
|
+
permit persons to whom the Software is furnished to do so, subject to
|
78
|
+
the following conditions:
|
110
79
|
|
111
|
-
The above copyright notice and this permission notice shall be
|
112
|
-
included in all copies or substantial portions of the Software.
|
80
|
+
The above copyright notice and this permission notice shall be
|
81
|
+
included in all copies or substantial portions of the Software.
|
113
82
|
|
114
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
115
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
116
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
117
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
118
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
119
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
120
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
83
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
84
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
85
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
86
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
87
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
88
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
89
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
data/lib/sandbox/cli.rb
CHANGED
@@ -41,7 +41,7 @@ module Sandbox
|
|
41
41
|
tell_unless_really_quiet(error.message)
|
42
42
|
when StandardError #, Timeout::Error
|
43
43
|
tell_unless_really_quiet("Error: #{error.message}")
|
44
|
-
tell_when_really_verbose(error.backtrace.collect { |bt| " #{bt}" }.join(
|
44
|
+
tell_when_really_verbose(error.backtrace.collect { |bt| " #{bt}" }.join("\n")) if error.backtrace
|
45
45
|
when Interrupt
|
46
46
|
tell_unless_really_quiet("Interrupted")
|
47
47
|
else
|
@@ -52,9 +52,6 @@ module Sandbox
|
|
52
52
|
end
|
53
53
|
## END CLASS METHODS
|
54
54
|
|
55
|
-
## PUBLIC INSTANCE METHODS
|
56
|
-
public
|
57
|
-
|
58
55
|
# The options for this execution.
|
59
56
|
attr_reader :options
|
60
57
|
|
@@ -69,12 +66,12 @@ module Sandbox
|
|
69
66
|
targets = options.delete(:args)
|
70
67
|
|
71
68
|
if targets.size < 1
|
72
|
-
raise Sandbox::Error.new('
|
69
|
+
raise Sandbox::Error.new('No target specified. See `ruby-virtualenv -h` for assistance.')
|
73
70
|
elsif targets.size > 1
|
74
|
-
raise Sandbox::Error.new('
|
71
|
+
raise Sandbox::Error.new('Multiple targets specified. See `ruby-virtualenv -h` for assistance.')
|
75
72
|
end
|
76
73
|
|
77
|
-
options[
|
74
|
+
options[:target] = targets[0]
|
78
75
|
|
79
76
|
Sandbox::Installer.new(options).populate
|
80
77
|
end
|
@@ -85,7 +82,7 @@ module Sandbox
|
|
85
82
|
# * determine command name to lookup in CommandManager
|
86
83
|
# * load command and have it process any add't options
|
87
84
|
# * catches exceptions for unknown switches or commands
|
88
|
-
def parse_args!(
|
85
|
+
def parse_args!(args)
|
89
86
|
options[:original_args] = args.dup
|
90
87
|
parser.parse!(args)
|
91
88
|
rescue OptionParser::ParseError => ex
|
@@ -114,9 +111,9 @@ module Sandbox
|
|
114
111
|
o.on('-n', '--no-gems', 'Do not install any gems after virtualenv is created.') { @options[:gems] = [] }
|
115
112
|
o.on('-q', '--quiet', 'Show less output. (multiple allowed)') { |f| Sandbox.decrease_verbosity }
|
116
113
|
o.on('-v', '--verbose', 'Show more output. (multiple allowed)') { |f| Sandbox.increase_verbosity }
|
117
|
-
o.on_tail('-h', '--help', 'Show this help message and exit.') { tell_unless_really_quiet(
|
118
|
-
o.on_tail('-H', '--long-help', 'Show the full description about the program.') { tell_unless_really_quiet(
|
119
|
-
o.on_tail('-V', '--version', 'Display the program version and exit.'
|
114
|
+
o.on_tail('-h', '--help', 'Show this help message and exit.') { tell_unless_really_quiet(o); exit }
|
115
|
+
o.on_tail('-H', '--long-help', 'Show the full description about the program.') { tell_unless_really_quiet(long_help); exit }
|
116
|
+
o.on_tail('-V', '--version', 'Display the program version and exit.') { tell_unless_really_quiet(Sandbox::VERSION); exit }
|
120
117
|
o.separator ""
|
121
118
|
end
|
122
119
|
end
|
@@ -163,11 +160,10 @@ WARNINGS:
|
|
163
160
|
HELP
|
164
161
|
end
|
165
162
|
|
166
|
-
private
|
167
|
-
|
168
163
|
def raise_parse_error(reason, args=[])
|
169
164
|
raise Sandbox::ParseError.new(reason, args)
|
170
165
|
end
|
166
|
+
private :raise_parse_error
|
171
167
|
|
172
168
|
end
|
173
169
|
end
|
data/lib/sandbox/errors.rb
CHANGED
@@ -6,7 +6,7 @@ module Sandbox
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def message
|
9
|
-
out = [
|
9
|
+
out = [super]
|
10
10
|
out.concat(backtrace.collect { |bt| " #{bt}" }) if Sandbox.really_verbose?
|
11
11
|
out.join("\n")
|
12
12
|
end
|
@@ -23,7 +23,7 @@ module Sandbox
|
|
23
23
|
|
24
24
|
def initialize(reason=nil, args=[])
|
25
25
|
msg = if args.is_a?(Array) && args.size > 0
|
26
|
-
"#{reason} => #{args.join(
|
26
|
+
"#{reason} => #{args.join(' ')}"
|
27
27
|
elsif args.is_a?(String) && args.length > 0
|
28
28
|
"#{reason} => #{args}"
|
29
29
|
else
|
data/lib/sandbox/installer.rb
CHANGED
@@ -47,129 +47,103 @@ module Sandbox
|
|
47
47
|
FileUtils.mkdir_p(gembin)
|
48
48
|
|
49
49
|
bin = File.join(target, 'bin')
|
50
|
-
FileUtils.ln_s(
|
50
|
+
FileUtils.ln_s(gembin, bin)
|
51
51
|
end
|
52
52
|
|
53
53
|
def install_gemrc
|
54
54
|
filename = File.join(target, '.gemrc')
|
55
|
-
template = File.read(File.dirname(
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
File.open(filename, 'w') do |f|
|
60
|
-
f.write output
|
61
|
-
end
|
55
|
+
template = File.read(File.dirname(__FILE__) + '/templates/gemrc.erb')
|
56
|
+
output = ERB.new(template).result(binding)
|
57
|
+
File.open(filename, 'w') { |f| f.write(output) }
|
62
58
|
end
|
63
59
|
|
64
60
|
def install_scripts
|
65
61
|
filename = File.join(target, 'bin', 'activate')
|
66
|
-
template = File.read(File.dirname(
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
File.open(filename, 'w') do |f|
|
71
|
-
f.write output
|
72
|
-
end
|
62
|
+
template = File.read(File.dirname(__FILE__) + '/templates/activate.erb')
|
63
|
+
output = ERB.new(template).result(binding)
|
64
|
+
File.open(filename, 'w') { |f| f.write(output) }
|
73
65
|
end
|
74
66
|
|
75
67
|
def install_gems
|
76
|
-
|
77
|
-
# return if gem.empty?
|
78
|
-
gems = options[ :gems ] || []
|
68
|
+
gems = options[:gems] || []
|
79
69
|
if gems.size == 0
|
80
|
-
tell(
|
70
|
+
tell(" nothing to install")
|
81
71
|
return
|
82
72
|
end
|
83
|
-
|
73
|
+
|
84
74
|
begin
|
85
75
|
setup_sandbox_env
|
86
76
|
gems.each do |gem|
|
87
|
-
tell_unless_really_quiet(
|
77
|
+
tell_unless_really_quiet(" gem: #{gem}")
|
88
78
|
cmd = "gem install #{gem}"
|
89
|
-
|
90
|
-
status, output = shell_out( cmd )
|
79
|
+
status, output = shell_out(cmd)
|
91
80
|
unless status
|
92
|
-
tell_unless_really_quiet(
|
81
|
+
tell_unless_really_quiet(" failed to install gem: #{gem}")
|
93
82
|
end
|
94
83
|
end
|
95
84
|
ensure
|
96
85
|
restore_sandbox_env
|
97
86
|
end
|
98
87
|
end
|
99
|
-
|
100
|
-
def shell_out(
|
101
|
-
# err_capture = Sandbox.really_verbose? '2>&1' : '2>/dev/null'
|
102
|
-
# out = `#{cmd} #{err_capture}`
|
88
|
+
|
89
|
+
def shell_out(cmd)
|
103
90
|
out = `#{cmd} 2>/dev/null`
|
104
91
|
result = $?.exitstatus == 0
|
105
|
-
[
|
92
|
+
[result, out]
|
106
93
|
end
|
107
|
-
|
94
|
+
|
108
95
|
def setup_sandbox_env
|
109
|
-
@old_env = Hash[ *ENV.select { |k,v| ['HOME','GEM_HOME','GEM_PATH'].include?(
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
ENV[ 'HOME' ] = target
|
116
|
-
ENV[ 'GEM_HOME' ] = "#{target}/rubygems"
|
117
|
-
ENV[ 'GEM_PATH' ] = "#{target}/rubygems"
|
96
|
+
@old_env = Hash[ *ENV.select { |k,v| ['HOME','GEM_HOME','GEM_PATH'].include?(k) }.flatten ]
|
97
|
+
|
98
|
+
ENV['HOME'] = target
|
99
|
+
ENV['GEM_HOME'] = "#{target}/rubygems"
|
100
|
+
ENV['GEM_PATH'] = "#{target}/rubygems"
|
118
101
|
end
|
119
|
-
|
102
|
+
|
120
103
|
def restore_sandbox_env
|
121
|
-
|
122
|
-
ENV[
|
123
|
-
ENV[
|
124
|
-
ENV[ 'GEM_PATH' ] = @old_env[ 'GEM_PATH' ]
|
104
|
+
ENV['HOME'] = @old_env['HOME']
|
105
|
+
ENV['GEM_HOME'] = @old_env['GEM_HOME']
|
106
|
+
ENV['GEM_PATH'] = @old_env['GEM_PATH']
|
125
107
|
end
|
126
|
-
|
127
|
-
def resolve_target(
|
128
|
-
|
129
|
-
|
130
|
-
if File.exists?( path )
|
108
|
+
|
109
|
+
def resolve_target(path)
|
110
|
+
path = fix_path(path)
|
111
|
+
if File.exists?(path)
|
131
112
|
raise Sandbox::Error, "target '#{path}' exists"
|
132
113
|
end
|
133
|
-
|
114
|
+
|
134
115
|
base = path
|
135
|
-
while base = File.dirname(
|
136
|
-
if check_path!(
|
116
|
+
while base = File.dirname(base)
|
117
|
+
if check_path!(base)
|
137
118
|
break
|
138
119
|
elsif base == '/'
|
139
120
|
raise "something is seriously wrong; we should never get here"
|
140
121
|
end
|
141
122
|
end
|
142
|
-
|
123
|
+
|
124
|
+
path
|
143
125
|
end
|
144
|
-
|
145
|
-
def check_path!(
|
146
|
-
if File.directory?(
|
147
|
-
if File.writable?(
|
126
|
+
|
127
|
+
def check_path!(path)
|
128
|
+
if File.directory?(path)
|
129
|
+
if File.writable?(path)
|
148
130
|
return true
|
149
131
|
else
|
150
132
|
raise Sandbox::Error, "path '#{path}' has a permission problem"
|
151
133
|
end
|
152
|
-
elsif File.exists?(
|
134
|
+
elsif File.exists?(path)
|
153
135
|
raise Sandbox::Error, "path '#{path}' is not a directory"
|
154
136
|
end
|
155
137
|
false
|
156
138
|
end
|
157
|
-
|
158
|
-
def fix_path(
|
159
|
-
unless path.index(
|
160
|
-
path = File.join(
|
139
|
+
|
140
|
+
def fix_path(path)
|
141
|
+
unless path.index('/') == 0
|
142
|
+
path = File.join(FileUtils.pwd, path)
|
161
143
|
end
|
162
144
|
path
|
163
145
|
end
|
164
146
|
|
165
|
-
## END PUBLIC INSTANCE METHODS
|
166
|
-
|
167
|
-
|
168
|
-
## PRIVATE INSTANCE METHODS
|
169
|
-
private
|
170
|
-
|
171
|
-
## END PRIVATE INSTANCE METHODS
|
172
|
-
|
173
147
|
end
|
174
|
-
|
175
|
-
end
|
148
|
+
|
149
|
+
end
|
@@ -33,18 +33,12 @@ deactivate () {
|
|
33
33
|
export PATH
|
34
34
|
fi
|
35
35
|
|
36
|
-
if [ -n "$_OLD_SANDBOX_HOME" ] ; then
|
37
|
-
HOME="$_OLD_SANDBOX_HOME"
|
38
|
-
export HOME
|
39
|
-
fi
|
40
|
-
|
41
36
|
if [ -n "$_OLD_SANDBOX_PS1" ] ; then
|
42
37
|
PS1="$_OLD_SANDBOX_PS1"
|
43
38
|
export PS1
|
44
39
|
fi
|
45
40
|
|
46
41
|
unset _OLD_SANDBOX_PATH
|
47
|
-
unset _OLD_SANDBOX_HOME
|
48
42
|
unset _OLD_SANDBOX_GEM_HOME
|
49
43
|
unset _OLD_SANDBOX_GEM_PATH
|
50
44
|
unset _OLD_SANDBOX_PS1
|
@@ -68,24 +62,16 @@ activate () {
|
|
68
62
|
_OLD_SANDBOX_GEM_HOME="$GEM_HOME"
|
69
63
|
_OLD_SANDBOX_GEM_PATH="$GEM_PATH"
|
70
64
|
_OLD_SANDBOX_PATH="$PATH"
|
71
|
-
_OLD_SANDBOX_HOME="$HOME"
|
72
65
|
_OLD_SANDBOX_PS1="$PS1"
|
73
66
|
|
74
67
|
# set the sandbox-aware states
|
75
68
|
SANDBOX_ENV="<%= target %>"
|
76
69
|
PATH="$SANDBOX_ENV/bin:$PATH"
|
77
|
-
HOME="$SANDBOX_ENV"
|
78
70
|
GEM_HOME="$SANDBOX_ENV/rubygems"
|
79
71
|
GEM_PATH="$GEM_HOME"
|
80
|
-
|
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
|
72
|
+
PS1="(`basename \"$SANDBOX_ENV\"`) $PS1"
|
87
73
|
|
88
|
-
export SANDBOX_ENV PATH
|
74
|
+
export SANDBOX_ENV PATH GEM_HOME GEM_PATH PS1
|
89
75
|
|
90
76
|
forget_cached_commands
|
91
77
|
|