capistrano-pyenv 1.0.0rc1 → 1.0.0rc2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module PyEnv
3
- VERSION = "1.0.0rc1"
3
+ VERSION = "1.0.0rc2"
4
4
  end
5
5
  end
@@ -17,8 +17,22 @@ module Capistrano
17
17
  _cset(:pyenv_bin) {
18
18
  File.join(pyenv_bin_path, "pyenv")
19
19
  }
20
- _cset(:pyenv_cmd) {
21
- "env PYENV_VERSION=#{pyenv_python_version.dump} #{pyenv_bin}"
20
+ def pyenv_command(options={})
21
+ environment = pyenv_environment.merge(options.fetch(:env, {}))
22
+ environment["PYENV_VERSION"] = options[:version] if options.key?(:version)
23
+ if environment.empty?
24
+ pyenv_bin
25
+ else
26
+ env = (["env"] + environment.map { |k, v| "#{k}=#{v.dump}" }).join(" ")
27
+ "#{env} #{pyenv_bin}"
28
+ end
29
+ end
30
+ _cset(:pyenv_cmd) { pyenv_command(:version => pyenv_python_version) } # this declares PYENV_VERSION.
31
+ _cset(:pyenv_environment) {
32
+ {
33
+ "PYENV_ROOT" => pyenv_path,
34
+ "PATH" => [ pyenv_shims_path, pyenv_bin_path, "$PATH" ].join(":"),
35
+ }
22
36
  }
23
37
  _cset(:pyenv_repository, 'git://github.com/yyuu/pyenv.git')
24
38
  _cset(:pyenv_branch, 'master')
@@ -52,12 +66,24 @@ module Capistrano
52
66
 
53
67
  desc("Setup pyenv.")
54
68
  task(:setup, :except => { :no_release => true }) {
69
+ #
70
+ # skip installation if the requested version has been installed.
71
+ #
72
+ begin
73
+ installed = pyenv_python_versions.include?(pyenv_python_version)
74
+ rescue
75
+ installed = false
76
+ end
77
+ _setup unless installed
78
+ configure if pyenv_setup_shell
79
+ }
80
+ after "deploy:setup", "pyenv:setup"
81
+
82
+ task(:_setup, :except => { :no_release => true }) {
55
83
  dependencies if pyenv_install_dependencies
56
84
  update
57
- configure if pyenv_setup_shell
58
85
  build
59
86
  }
60
- after 'deploy:setup', 'pyenv:setup'
61
87
 
62
88
  def _update_repository(destination, options={})
63
89
  configuration = Capistrano::Configuration.new()
@@ -97,10 +123,7 @@ module Capistrano
97
123
  }
98
124
 
99
125
  def _setup_default_environment
100
- env = fetch(:default_environment, {}).dup
101
- env["PYENV_ROOT"] = pyenv_path
102
- env["PATH"] = [ pyenv_shims_path, pyenv_bin_path, env.fetch("PATH", "$PATH") ].join(":")
103
- set(:default_environment, env)
126
+ set(:default_environment, default_environment.merge(pyenv_environment))
104
127
  end
105
128
 
106
129
  _cset(:pyenv_setup_default_environment) {
@@ -111,7 +134,7 @@ module Capistrano
111
134
  true
112
135
  end
113
136
  }
114
- # workaround for `multistage` of capistrano-ext.
137
+ # workaround for loading `capistrano-rbenv` later than `capistrano/ext/multistage`.
115
138
  # https://github.com/yyuu/capistrano-rbenv/pull/5
116
139
  if top.namespaces.key?(:multistage)
117
140
  after "multistage:ensure" do
@@ -119,7 +142,15 @@ module Capistrano
119
142
  end
120
143
  else
121
144
  on :start do
122
- _setup_default_environment if pyenv_setup_default_environment
145
+ if top.namespaces.key?(:multistage)
146
+ # workaround for loading `capistrano-rbenv` earlier than `capistrano/ext/multistage`.
147
+ # https://github.com/yyuu/capistrano-rbenv/issues/7
148
+ after "multistage:ensure" do
149
+ _setup_default_environment if pyenv_setup_default_environment
150
+ end
151
+ else
152
+ _setup_default_environment if pyenv_setup_default_environment
153
+ end
123
154
  end
124
155
  end
125
156
 
@@ -270,52 +301,51 @@ module Capistrano
270
301
  end
271
302
  end
272
303
  pyenv.exec("#{python} --version") # chck if python is executable
273
- pyenv.global(pyenv_python_version)
304
+ pyenv.global(pyenv_python_version) if fetch(:pyenv_setup_global_version, true)
274
305
  }
275
306
 
276
307
  # call `pyenv rehash` to update shims.
277
308
  def rehash(options={})
278
- run("#{pyenv_cmd} rehash", options)
309
+ invoke_command("#{pyenv_command} rehash", options)
279
310
  end
280
311
 
281
312
  def global(version, options={})
282
- run("#{pyenv_cmd} global #{version.dump}", options)
313
+ invoke_command("#{pyenv_command} global #{version.dump}", options)
283
314
  end
284
315
 
285
316
  def local(version, options={})
286
317
  path = options.delete(:path)
287
- if path
288
- run("cd #{path.dump} && #{pyenv_cmd} local #{version.dump}", options)
289
- else
290
- run("#{pyenv_cmd} local #{version.dump}", options)
291
- end
318
+ execute = []
319
+ execute << "cd #{path.dump}" if path
320
+ execute << "#{pyenv_command} local #{version.dump}"
321
+ invoke_command(execute.join(" && "), options)
292
322
  end
293
323
 
294
324
  def which(command, options={})
295
325
  path = options.delete(:path)
296
- if path
297
- capture("cd #{path.dump} && #{pyenv_cmd} which #{command.dump}", options).strip
298
- else
299
- capture("#{pyenv_cmd} which #{command.dump}", options).strip
300
- end
326
+ version = ( options.delete(:version) || pyenv_python_version )
327
+ execute = []
328
+ execute << "cd #{path.dump}" if path
329
+ execute << "#{pyenv_command(:version => version)} which #{command.dump}"
330
+ capture(execute.join(" && "), options).strip
301
331
  end
302
332
 
303
333
  def exec(command, options={})
304
334
  # users of pyenv.exec must sanitize their command line.
305
335
  path = options.delete(:path)
306
- if path
307
- run("cd #{path.dump} && #{pyenv_cmd} exec #{command}", options)
308
- else
309
- run("#{pyenv_cmd} exec #{command}", options)
310
- end
336
+ version = ( options.delete(:version) || pyenv_python_version )
337
+ execute = []
338
+ execute << "cd #{path.dump}" if path
339
+ execute << "#{pyenv_command(:version => version)} exec #{command}"
340
+ invoke_command(execute.join(" && "), options)
311
341
  end
312
342
 
313
343
  def versions(options={})
314
- capture("#{pyenv_cmd} versions --bare", options).split(/(?:\r?\n)+/)
344
+ capture("#{pyenv_command} versions --bare", options).split(/(?:\r?\n)+/)
315
345
  end
316
346
 
317
347
  def available_versions(options={})
318
- capture("#{pyenv_cmd} install --complete", options).split(/(?:\r?\n)+/)
348
+ capture("#{pyenv_command} install --complete", options).split(/(?:\r?\n)+/)
319
349
  end
320
350
 
321
351
  _cset(:pyenv_install_python_threads) {
@@ -323,15 +353,16 @@ module Capistrano
323
353
  }
324
354
  # create build processes as many as processor count
325
355
  _cset(:pyenv_make_options) { "-j #{pyenv_install_python_threads}" }
356
+ _cset(:pyenv_configure_options, nil)
326
357
  def install(version, options={})
327
- execute = []
328
- execute << "export MAKE_OPTS=#{pyenv_make_options.dump}" if pyenv_make_options
329
- execute << "#{pyenv_cmd} install #{version.dump}"
330
- run(execute.join(" && "), options)
358
+ environment = {}
359
+ environment["CONFIGURE_OPTS"] = pyenv_configure_options.to_s if pyenv_configure_options
360
+ environment["MAKE_OPTS"] = pyenv_make_options.to_s if pyenv_make_options
361
+ invoke_command("#{pyenv_command(:env => environment)} install #{version.dump}", options)
331
362
  end
332
363
 
333
364
  def uninstall(version, options={})
334
- run("#{pyenv_cmd} uninstall -f #{version.dump}", options)
365
+ invoke_command("#{pyenv_command} uninstall -f #{version.dump}", options)
335
366
  end
336
367
 
337
368
  def virtualenv(version, venv, options={})
@@ -20,40 +20,136 @@ role :db, "192.168.33.10", :primary => true
20
20
  $LOAD_PATH.push(File.expand_path("../../lib", File.dirname(__FILE__)))
21
21
  require "capistrano-pyenv"
22
22
 
23
- namespace(:test_all) {
23
+ task(:test_all) {
24
+ find_and_execute_task("test_default")
25
+ find_and_execute_task("test_with_virtualenv")
26
+ find_and_execute_task("test_without_global")
27
+ }
28
+
29
+ namespace(:test_default) {
24
30
  task(:default) {
25
- find_and_execute_task("pyenv:setup")
26
31
  methods.grep(/^test_/).each do |m|
27
32
  send(m)
28
33
  end
29
- find_and_execute_task("pyenv:purge")
34
+ }
35
+ before "test_default", "test_default:setup"
36
+ after "test_default", "test_default:teardown"
37
+
38
+ task(:setup) {
39
+ find_and_execute_task("pyenv:setup")
30
40
  }
31
41
 
32
- task(:test_pyenv_is_installed) {
42
+ task(:teardown) {
43
+ }
44
+
45
+ task(:test_pyenv) {
33
46
  run("pyenv --version")
34
47
  }
35
48
 
36
- task(:test_python_is_installed) {
49
+ ## standard
50
+ task(:test_pyenv_exec) {
51
+ pyenv.exec("python --version")
52
+ }
53
+
54
+ task(:test_run_pyenv_exec) {
37
55
  run("pyenv exec python --version")
38
56
  }
39
57
 
40
- task(:test_pip_is_installed) {
58
+ ## with path
59
+ task(:test_pyenv_exec_with_path) {
60
+ pyenv.exec("python -c 'import os;assert os.getcwd()==\"/\"'", :path => "/")
61
+ }
62
+
63
+ # task(:test_pyenv_exec_python_via_sudo_with_path) {
64
+ # # capistrano does not provide safer way to invoke multiple commands via sudo.
65
+ # pyenv.exec("python -c 'import os;assert os.getcwd()==\"/\" and os.getuid()==0'", :path => "/", :via => :sudo )
66
+ # }
67
+
68
+ ## via sudo
69
+ task(:test_pyenv_exec_via_sudo) {
70
+ pyenv.exec("python -c 'import os;assert os.getuid()==0'", :via => :sudo)
71
+ }
72
+
73
+ task(:test_run_sudo_pyenv_exec) {
74
+ # we may not be able to invoke pyenv since sudo may reset $PATH.
75
+ # if you prefer to invoke pyenv via sudo, call it with absolute path.
76
+ # run("#{sudo} pyenv exec python -c 'import os;assert os.getuid()==0'")
77
+ run("#{sudo} #{pyenv_cmd} exec python -c 'import os;assert os.getuid()==0'")
78
+ }
79
+
80
+ task(:test_sudo_pyenv_exec) {
81
+ sudo("#{pyenv_cmd} exec python -c 'import os;assert os.getuid()==0'")
82
+ }
83
+
84
+ ## pip
85
+ task(:test_pyenv_exec_pip) {
41
86
  run("pyenv exec pip --version")
42
87
  }
88
+ }
89
+
90
+ namespace(:test_with_virtualenv) {
91
+ task(:default) {
92
+ methods.grep(/^test_/).each do |m|
93
+ send(m)
94
+ end
95
+ }
96
+ before "test_with_virtualenv", "test_with_virtualenv:setup"
97
+ after "test_with_virtualenv", "test_with_virtualenv:teardown"
43
98
 
44
- task(:test_virtualenv) {
45
- python_version = pyenv_python_version
99
+ task(:setup) {
46
100
  set(:pyenv_use_virtualenv, true)
101
+ set(:pyenv_virtualenv_python_version, pyenv_python_version)
47
102
  set(:pyenv_python_version, "venv")
48
- set(:pyenv_virtualenv_python_version, python_version)
49
-
50
103
  find_and_execute_task("pyenv:setup")
51
- run("pyenv exec python --version")
104
+ }
52
105
 
106
+ task(:teardown) {
53
107
  set(:pyenv_use_virtualenv, false)
54
- set(:pyenv_python_version, python_version)
108
+ set(:pyenv_python_version, pyenv_virtualenv_python_version)
55
109
  set(:pyenv_virtualenv_python_version, nil)
56
110
  }
111
+
112
+ task(:test_pyenv_exec) {
113
+ pyenv.exec("python --version")
114
+ }
115
+ }
116
+
117
+ namespace(:test_without_global) {
118
+ task(:default) {
119
+ methods.grep(/^test_/).each do |m|
120
+ send(m)
121
+ end
122
+ }
123
+ before "test_without_global", "test_without_global:setup"
124
+ after "test_without_global", "test_without_global:teardown"
125
+
126
+ task(:setup) {
127
+ version_file = File.join(pyenv_path, "version")
128
+ run("mv -f #{version_file} #{version_file}.orig")
129
+ set(:pyenv_setup_global_version, false)
130
+ find_and_execute_task("pyenv:setup")
131
+ run("test \! -f #{version_file.dump}")
132
+ }
133
+
134
+ task(:teardown) {
135
+ version_file = File.join(pyenv_path, "version")
136
+ run("mv -f #{version_file}.orig #{version_file}")
137
+ }
138
+
139
+ ## standard
140
+ task(:test_pyenv_exec_python) {
141
+ pyenv.exec("python --version")
142
+ }
143
+
144
+ ## with path
145
+ task(:test_pyenv_exec_python_with_path) {
146
+ pyenv.exec("python -c 'import os;assert os.getcwd()==\"/\"'", :path => "/")
147
+ }
148
+
149
+ ## via sudo
150
+ task(:test_pyenv_exec_python_via_sudo) {
151
+ pyenv.exec("python -c 'import os;assert os.getuid()==0'", :via => :sudo)
152
+ }
57
153
  }
58
154
 
59
155
  # vim:set ft=ruby sw=2 ts=2 :
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-pyenv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0rc1
4
+ version: 1.0.0rc2
5
5
  prerelease: 5
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-11 00:00:00.000000000 Z
12
+ date: 2013-03-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: capistrano