subcontractor 0.7.0 → 0.8.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/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ /vendor/bundle
data/README.md CHANGED
@@ -18,7 +18,7 @@ gem install subcontractor
18
18
  or with bundler
19
19
 
20
20
  ```ruby
21
- gem 'subcontractor', '0.7.0'
21
+ gem 'subcontractor', '0.8.0'
22
22
  ```
23
23
 
24
24
  The gem provides an executable called ```subcontract``` that you will use from your Procfile. You can see what it does by running ```subcontract --help```
@@ -26,7 +26,8 @@ The gem provides an executable called ```subcontract``` that you will use from y
26
26
  ```
27
27
  USAGE: subcontract [options] -- executable
28
28
  -r, --rvm RVM run in a specific RVM (use `.` for ruby from `PATH`)
29
- -b, --rbenv RBENV run in a specific RBENV
29
+ -b, --rbenv RBENV run in a specific RBENV (use `.` for local rbenv)
30
+ -c, --choose-env ENV run in either a specified RBENV or RVM, whichever is present
30
31
  -d, --chdir PATH chdir to PATH before starting process
31
32
  -s, --signal SIGNAL signal to send to process to kill it, default TERM
32
33
  ```
@@ -40,25 +41,32 @@ another_app: subcontract --rvm ruby-1.8.7-p249@another_app --chdir ../another_ap
40
41
 
41
42
  Here another_app will be launch from the sibling directory another_app and will use the rvm ruby-1.8.7-p249@another_app. As you can see, the command that we wish to use to launch our application follows the double dashes (--).
42
43
 
43
- You can also allow another_app to use its existing .rvmrc file
44
+ You can also allow another_app to use its existing .rvmrc file. This will load the .rvmrc file out of the current folder once it has been changed to the folder specified by --chdir
44
45
 
45
46
  ```
46
47
  rails: rails s
47
- another_app: subcontract --rvm "--with-rubies rvmrc" --chdir ../another_app --signal INT -- rails s -p 3001
48
+ another_app: subcontract --rvm . --chdir ../another_app --signal INT -- rails s -p 3001
48
49
  ```
49
50
 
50
- Newer versions of RVM use a slightly different syntax for referencing the app .rvmrc file.
51
+ You can use specific rbenv version.
51
52
 
52
53
  ```
53
- new_rvm_app: push: subcontract --rvm --with-rubies default-with-rvmrc do --chdir ../push --signal INT -- bundle exec rails server
54
+ rbenv_app: bundle exec subcontract --rbenv 'ree-1.8.7-2012.02' --chdir ~/rbenv_app -- bundle exec rails server -p 3001
54
55
  ```
55
56
 
56
- You can use specific rbenv version.
57
+ Or you can use whatever the local rbenv settings are for a project. This will load whatever `rbenv local` returns out of the current folder once it has been changed to the folder specified by --chdir
57
58
 
58
59
  ```
59
- rbenv_app: bundle exec subcontract --rbenv 'ree-1.8.7-2012.02' --chdir ~/rbenv_app -- bundle exec rails server -p 3001
60
+ rbenv_app: bundle exec subcontract --rbenv . --chdir ~/rbenv_app -- bundle exec rails server -p 3001
60
61
  ```
61
62
 
63
+ If you have team members using both rvm and rbenv on a project then use --choose-env to use whatever version manager is present on the system. If both are present rbenv is chosen.
64
+
65
+ ```
66
+ mixed_env_manager_app: bundle exec subcontract --choose-env . --chdir ~/mixed_env_manager_app -- bundle exec rails server -p 3001
67
+ ```
68
+
69
+
62
70
  ### Contributions
63
71
  * Fork the project
64
72
  * Make your change
@@ -71,3 +79,4 @@ rbenv_app: bundle exec subcontract --rbenv 'ree-1.8.7-2012.02' --chdir ~/rbenv_a
71
79
  * Paul Gross [github](http://github.com/pgr0ss) [blog](http://www.pgrs.net) [twitter](http://twitter.com/pgr0ss)
72
80
  * Rune Skjoldborg Madsen [github](https://github.com/runemadsen)
73
81
  * Masahiro Ihara [github](http://github.com/ihara2525) [twitter](http://twitter.com/ihara2525)
82
+ * Michael Nussbaum [github](https://github.com/mnussbaum)
@@ -1,11 +1,12 @@
1
- require 'optparse'
2
- require 'pty'
1
+ require "optparse"
2
+ require "pty"
3
+ require "subcontractor/command"
3
4
 
4
5
  $stdout.sync = true
5
6
 
6
7
  module SafePty
7
8
  def self.spawn command, &block
8
- if Object.const_defined?('Bundler')
9
+ if Object.const_defined?("Bundler")
9
10
  Bundler.with_clean_env do
10
11
  self.clear_more_env
11
12
  self.spawn_internal command, &block
@@ -29,16 +30,15 @@ module SafePty
29
30
  end
30
31
 
31
32
  def self.clear_more_env
32
- ['GEM_HOME', 'GEM_PATH', 'RUBYOPT', 'RBENV_DIR'].each { |e| ENV.delete(e) }
33
+ ["GEM_HOME", "GEM_PATH", "RUBYOPT", "RBENV_DIR"].each { |e| ENV.delete(e) }
33
34
  end
34
35
  end
35
36
 
36
37
  module Subcontractor
37
38
  class CLI
38
-
39
39
  def run
40
40
  options = parse_options(ARGV)
41
- command = build_command(ARGV.dup, options)
41
+ command = Subcontractor::Command.build(ARGV, options)
42
42
  Dir.chdir(options[:chdir]) if options[:chdir]
43
43
  signal = options[:signal] || "TERM"
44
44
  SafePty.spawn(command) do |stdin, stdout, pid|
@@ -74,26 +74,23 @@ module Subcontractor
74
74
  end.map(&:first).map(&:to_i)
75
75
  end
76
76
 
77
- def build_command(parts, options)
78
- parts.unshift("rvm #{options[:rvm]} exec") if options.has_key?(:rvm)
79
- parts.unshift("env RBENV_VERSION=#{options[:rbenv]} rbenv exec") if options.has_key?(:rbenv)
80
- parts.join(' ')
81
- end
82
-
83
77
  def parse_options(argv)
84
78
  options = {}
85
79
  parser = OptionParser.new do |opt|
86
80
  opt.banner = "USAGE: subcontract [options] -- executable"
87
- opt.on('-r', '--rvm RVM', 'run in a specific RVM') do |rvm|
81
+ opt.on("-r", "--rvm RVM", "run in a specific RVM") do |rvm|
88
82
  options[:rvm] = rvm
89
83
  end
90
- opt.on('-b', '--rbenv RBENV', 'run in a specific RBENV') do |rbenv|
84
+ opt.on("-b", "--rbenv RBENV", "run in a specific RBENV") do |rbenv|
91
85
  options[:rbenv] = rbenv
92
86
  end
93
- opt.on('-d', '--chdir PATH', 'chdir to PATH before starting process') do |path|
87
+ opt.on("-c", "--choose-env ENV", "run in either specified RBENV or RVM, whichever is present") do |env|
88
+ options[:choose_env] = env
89
+ end
90
+ opt.on("-d", "--chdir PATH", "chdir to PATH before starting process") do |path|
94
91
  options[:chdir] = path
95
92
  end
96
- opt.on('-s', '--signal SIGNAL', 'signal to send to process to kill it, default TERM') do |signal|
93
+ opt.on("-s", "--signal SIGNAL", "signal to send to process to kill it, default TERM") do |signal|
97
94
  options[:signal] = signal
98
95
  end
99
96
  end
@@ -101,6 +98,5 @@ module Subcontractor
101
98
  parser.parse! argv
102
99
  options
103
100
  end
104
-
105
101
  end
106
102
  end
@@ -0,0 +1,40 @@
1
+ module Subcontractor
2
+ class Command
3
+ def self.build(parts, options)
4
+ new(parts.dup, options).build
5
+ end
6
+
7
+ def initialize(parts, options)
8
+ @parts = parts
9
+ @options = options
10
+ end
11
+
12
+ def build
13
+ if _use_command?(:rbenv)
14
+ @parts.unshift("#{_set_rbenv_version} rbenv exec")
15
+ elsif _use_command?(:rvm)
16
+ @parts.unshift("rvm #{_env_specifier(:rvm)} exec")
17
+ end
18
+
19
+ @parts.join(" ")
20
+ end
21
+
22
+ def _use_command?(command)
23
+ @options.has_key?(command) || _choose_env_and_command_present?(command)
24
+ end
25
+
26
+ def _choose_env_and_command_present?(command)
27
+ @options.has_key?(:choose_env) && system("which #{command} > /dev/null 2>&1")
28
+ end
29
+
30
+ def _set_rbenv_version
31
+ env_specifier = _env_specifier(:rbenv)
32
+ env_specifier = "`rbenv local`" if env_specifier == "."
33
+ "env RBENV_VERSION=#{env_specifier}"
34
+ end
35
+
36
+ def _env_specifier(command)
37
+ @options[command] || @options[:choose_env]
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module Subcontractor
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -0,0 +1,6 @@
1
+ require "subcontractor"
2
+ require "subcontractor/cli"
3
+
4
+ RSpec.configure do |config|
5
+ config.color = true
6
+ end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+
3
+ describe Subcontractor::CLI do
4
+ before(:each) do
5
+ Object.instance_eval{ remove_const(:ARGV) }
6
+ end
7
+
8
+ describe "#run" do
9
+ it "uses rvm with --rvm" do
10
+ ARGV = ["--rvm", ".", "test"]
11
+ SafePty.should_receive(:spawn).with("rvm . exec test")
12
+ Subcontractor::CLI.new.run
13
+ end
14
+
15
+ context "with --rbenv" do
16
+ it "specifies a rbenv" do
17
+ ARGV = ["--rbenv", "1.9.3", "test"]
18
+ SafePty.should_receive(:spawn).with("env RBENV_VERSION=1.9.3 rbenv exec test")
19
+ Subcontractor::CLI.new.run
20
+ end
21
+
22
+ it "uses 'rbenv local' if a '.' is given as the rbenv version" do
23
+ ARGV = ["--rbenv", ".", "test"]
24
+ SafePty.should_receive(:spawn).with("env RBENV_VERSION=`rbenv local` rbenv exec test")
25
+ Subcontractor::CLI.new.run
26
+ end
27
+ end
28
+
29
+ it "creates a valid command if no environment manager is specifed" do
30
+ ARGV = ["test"]
31
+ SafePty.should_receive(:spawn).with("test")
32
+ Subcontractor::CLI.new.run
33
+ end
34
+
35
+ context "with --choose-env" do
36
+ it "uses rbenv when rbenv is present" do
37
+ ARGV = ["--choose-env", "1.9.3", "test"]
38
+ SafePty.should_receive(:spawn).with("env RBENV_VERSION=1.9.3 rbenv exec test")
39
+ command = Subcontractor::Command.any_instance
40
+ command.should_receive(:system).with("which rbenv > /dev/null 2>&1").and_return(true)
41
+ Subcontractor::CLI.new.run
42
+ end
43
+
44
+ it "uses rvm when rvm is present and rbenv isn't" do
45
+ ARGV = ["--choose-env", ".", "test"]
46
+ SafePty.should_receive(:spawn).with("rvm . exec test")
47
+ command = Subcontractor::Command.any_instance
48
+ command.should_receive(:system).with("which rbenv > /dev/null 2>&1").and_return(false)
49
+ command.should_receive(:system).with("which rvm > /dev/null 2>&1").and_return(true)
50
+ Subcontractor::CLI.new.run
51
+ end
52
+ end
53
+ end
54
+ end
@@ -14,6 +14,8 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.rubyforge_project = "subcontractor"
16
16
 
17
+ s.add_development_dependency("rspec")
18
+
17
19
  s.files = `git ls-files`.split("\n")
18
20
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
21
  s.require_paths = ["lib"]
metadata CHANGED
@@ -1,34 +1,40 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: subcontractor
3
- version: !ruby/object:Gem::Version
4
- hash: 3
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 7
9
- - 0
10
- version: 0.7.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Tony Pitluga
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2013-03-04 00:00:00 -08:00
19
- default_executable:
20
- dependencies: []
21
-
12
+ date: 2013-10-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
22
30
  description: rvm aware process launcher for foreman
23
- email:
31
+ email:
24
32
  - tony.pitluga@gmail.com
25
- executables:
33
+ executables:
26
34
  - subcontract
27
35
  extensions: []
28
-
29
36
  extra_rdoc_files: []
30
-
31
- files:
37
+ files:
32
38
  - .gitignore
33
39
  - .rvmrc
34
40
  - Gemfile
@@ -45,41 +51,33 @@ files:
45
51
  - examples/webapp/config.ru
46
52
  - lib/subcontractor.rb
47
53
  - lib/subcontractor/cli.rb
54
+ - lib/subcontractor/command.rb
48
55
  - lib/subcontractor/version.rb
56
+ - spec/spec_helper.rb
57
+ - spec/subcontractor/cli_spec.rb
49
58
  - subcontractor.gemspec
50
- has_rdoc: true
51
59
  homepage: https://github.com/pitluga/subcontractor
52
60
  licenses: []
53
-
54
61
  post_install_message:
55
62
  rdoc_options: []
56
-
57
- require_paths:
63
+ require_paths:
58
64
  - lib
59
- required_ruby_version: !ruby/object:Gem::Requirement
65
+ required_ruby_version: !ruby/object:Gem::Requirement
60
66
  none: false
61
- requirements:
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- hash: 3
65
- segments:
66
- - 0
67
- version: "0"
68
- required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
72
  none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
77
  requirements: []
78
-
79
78
  rubyforge_project: subcontractor
80
- rubygems_version: 1.3.7
79
+ rubygems_version: 1.8.23
81
80
  signing_key:
82
81
  specification_version: 3
83
82
  summary: rvm aware process launcher for foreman
84
83
  test_files: []
85
-