cocaine 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,5 @@ rvm:
2
2
  - 1.8.7
3
3
  - 1.9.2
4
4
  - 1.9.3
5
- - rbx-18mode
6
- - rbx-19mode
7
5
  - ree
8
6
  - jruby
data/LICENSE CHANGED
@@ -3,7 +3,7 @@ LICENSE
3
3
 
4
4
  The MIT License
5
5
 
6
- Copyright (c) 2008 Jon Yurek and thoughtbot, inc.
6
+ Copyright (c) 2011-2012 Jon Yurek and thoughtbot, inc.
7
7
 
8
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
9
  of this software and associated documentation files (the "Software"), to deal
data/NEWS.md CHANGED
@@ -1,3 +1,9 @@
1
+ New for 0.3.1:
2
+
3
+ * Made the `Runner` manually swappable, in case `ProcessRunner` doesn't work
4
+ for some reason.
5
+ * Fixed copyright years.
6
+
1
7
  New for 0.3.0:
2
8
 
3
9
  * Support blank arguments.
@@ -5,6 +11,5 @@ New for 0.3.0:
5
11
  * Add `CommandLine#exit_status`.
6
12
  * Automatically use `POSIX::Spawn` if available.
7
13
  * Add `CommandLine#environment` as a hash of extra `ENV` data..
8
- * Add `CommandLine#environment=` to set that hash.
9
14
  * Add `CommandLine#runner` which produces an object that responds to `#call`.
10
15
  * Fix a race condition but only on Ruby 1.9.
data/README.md CHANGED
@@ -125,6 +125,30 @@ processes. For applications with large heaps the gain can be
125
125
  significant. To include `posix-spawn`, simply add it to your `Gemfile` or,
126
126
  if you don't use bundler, install the gem.
127
127
 
128
+ ## Runners
129
+
130
+ Cocaine will attempt to choose from among 3 different ways of running commands.
131
+ The simplest is using backticks, and is the default in 1.8. In Ruby 1.9, it
132
+ will attempt to use `Process.spawn`. And, as mentioned above, if the
133
+ `posix-spawn` gem is installed, it will attempt to use that. If for some reason
134
+ one of the `.spawn` runners don't work for you, you can override them manually
135
+ by setting a new runner, like so:
136
+
137
+ ```ruby
138
+ Cocaine::CommandLine.runner = Cocaine::BackticksRunner.new
139
+ ```
140
+
141
+ And if you really want to, you can define your own Runner, though I can't
142
+ imagine why you would.
143
+
144
+ ### JRuby Caveat
145
+
146
+ If you get `Error::ECHILD` errors and are using JRuby, there is a very good
147
+ chance that the error is actually in JRuby. This was brought to our attention
148
+ in https://github.com/thoughtbot/cocaine/issues/24 and probably fixed in
149
+ http://jira.codehaus.org/browse/JRUBY-6162. You *will* want to use the
150
+ `BackticksRunner` if you are unable to update JRuby.
151
+
128
152
  ## Feedback
129
153
 
130
154
  *Security* concerns must be privately emailed to
@@ -136,7 +160,7 @@ Question? Idea? Problem? Bug? Comment? Concern? Like using question marks?
136
160
 
137
161
  ## License
138
162
 
139
- Copyright 2011 Jon Yurek and thoughtbot, inc. This is free software, and
163
+ Copyright 2011-2012 Jon Yurek and thoughtbot, inc. This is free software, and
140
164
  may be redistributed under the terms specified in the
141
165
  [LICENSE](https://github.com/thoughtbot/cocaine/blob/master/LICENSE)
142
166
  file.
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.author = "Jon Yurek"
9
9
  s.email = "jyurek@thoughtbot.com"
10
- s.homepage = "http://www.thoughtbot.com/projects/cocaine"
10
+ s.homepage = "http://github.com/thoughtbot/cocaine"
11
11
  s.summary = "A small library for doing (command) lines"
12
12
  s.description = "A small library for doing (command) lines"
13
13
 
@@ -1,7 +1,7 @@
1
1
  module Cocaine
2
2
  class CommandLine
3
3
  class << self
4
- attr_accessor :logger
4
+ attr_accessor :logger, :runner
5
5
 
6
6
  def path
7
7
  @supplemental_path
@@ -24,6 +24,18 @@ module Cocaine
24
24
  def environment
25
25
  @supplemental_environment ||= {}
26
26
  end
27
+
28
+ def runner
29
+ @runner || best_runner
30
+ end
31
+
32
+ private
33
+
34
+ def best_runner
35
+ return PosixRunner.new if posix_spawn_available?
36
+ return ProcessRunner.new if Process.respond_to?(:spawn)
37
+ BackticksRunner.new
38
+ end
27
39
  end
28
40
  @environment = {}
29
41
 
@@ -33,11 +45,11 @@ module Cocaine
33
45
  @binary = binary.dup
34
46
  @params = params.dup
35
47
  @options = options.dup
48
+ @runner = @options.delete(:runner) || self.class.runner
36
49
  @logger = @options.delete(:logger) || self.class.logger
37
50
  @swallow_stderr = @options.delete(:swallow_stderr)
38
- @expected_outcodes = @options.delete(:expected_outcodes)
39
- @expected_outcodes ||= [0]
40
- @runner = best_runner
51
+ @expected_outcodes = @options.delete(:expected_outcodes) || [0]
52
+ @environment = @options.delete(:environment) || {}
41
53
  end
42
54
 
43
55
  def command
@@ -68,19 +80,17 @@ module Cocaine
68
80
  end
69
81
 
70
82
  def unix?
71
- (RbConfig::CONFIG['host_os'] =~ /mswin|mingw/).nil?
83
+ RbConfig::CONFIG['host_os'] !~ /mswin|mingw/
72
84
  end
73
85
 
74
86
  private
75
87
 
76
88
  def execute(command)
77
- runner.call(command, self.class.environment)
89
+ runner.call(command, environment)
78
90
  end
79
91
 
80
- def best_runner
81
- return PosixRunner.new if self.class.posix_spawn_available?
82
- return ProcessRunner.new if Process.respond_to?(:spawn)
83
- BackticksRunner.new
92
+ def environment
93
+ self.class.environment.merge(@environment)
84
94
  end
85
95
 
86
96
  def interpolate(pattern, vars)
@@ -97,7 +107,7 @@ module Cocaine
97
107
  end
98
108
 
99
109
  def invalid_variables
100
- %w(expected_outcodes swallow_stderr logger)
110
+ %w(expected_outcodes swallow_stderr logger environment)
101
111
  end
102
112
 
103
113
  def interpolation(vars, key)
@@ -1,3 +1,3 @@
1
1
  module Cocaine
2
- VERSION = "0.3.0".freeze
2
+ VERSION = "0.3.1".freeze
3
3
  end
@@ -26,7 +26,7 @@ describe Cocaine::CommandLine do
26
26
  output.should match(%r{/path/to/command/dir})
27
27
  output.should match(%r{/some/other/path})
28
28
  end
29
-
29
+
30
30
  it "temporarily changes specified environment variables" do
31
31
  Cocaine::CommandLine.environment['TEST'] = 'Hello, world!'
32
32
  cmd = Cocaine::CommandLine.new("ruby", "-e 'puts ENV[%{TEST}]'")
@@ -34,6 +34,21 @@ describe Cocaine::CommandLine do
34
34
  output.should match(%r{Hello, world!})
35
35
  end
36
36
 
37
+ it 'changes environment variables for the command line' do
38
+ Cocaine::CommandLine.environment['TEST'] = 'Hello, world!'
39
+ cmd = Cocaine::CommandLine.new("ruby",
40
+ "-e 'puts ENV[%{TEST}]'",
41
+ :environment => {'TEST' => 'Hej hej'})
42
+ output = cmd.run
43
+ output.should match(%r{Hej hej})
44
+ end
45
+
46
+ it 'passes the existing environment variables through to the runner' do
47
+ command = Cocaine::CommandLine.new('echo', '$HOME')
48
+ output = command.run
49
+ output.chomp.should_not == ''
50
+ end
51
+
37
52
  it "can interpolate quoted variables into the command line's parameters" do
38
53
  cmd = Cocaine::CommandLine.new("convert",
39
54
  ":one :{two}",
@@ -215,5 +230,21 @@ describe Cocaine::CommandLine do
215
230
  cmd = Cocaine::CommandLine.new("echo", "hello")
216
231
  cmd.runner.class.should == Cocaine::CommandLine::PosixRunner
217
232
  end
233
+
234
+ it "uses the BackticksRunner if the posix-spawn gem is available, but we told it to use Backticks all the time" do
235
+ Cocaine::CommandLine.stubs(:posix_spawn_available?).returns(true)
236
+ Cocaine::CommandLine.runner = Cocaine::CommandLine::BackticksRunner.new
237
+
238
+ cmd = Cocaine::CommandLine.new("echo", "hello")
239
+ cmd.runner.class.should == Cocaine::CommandLine::BackticksRunner
240
+ end
241
+
242
+ it "uses the BackticksRunner if the posix-spawn gem is available, but we told it to use Backticks" do
243
+ Cocaine::CommandLine.stubs(:posix_spawn_available?).returns(true)
244
+
245
+ cmd = Cocaine::CommandLine.new("echo", "hello", :runner => Cocaine::CommandLine::BackticksRunner.new)
246
+ cmd.runner.class.should == Cocaine::CommandLine::BackticksRunner
247
+ end
248
+
218
249
  end
219
250
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocaine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
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: 2012-08-29 00:00:00.000000000 Z
12
+ date: 2012-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -121,7 +121,7 @@ files:
121
121
  - spec/spec_helper.rb
122
122
  - spec/support/stub_os.rb
123
123
  - spec/support/with_exitstatus.rb
124
- homepage: http://www.thoughtbot.com/projects/cocaine
124
+ homepage: http://github.com/thoughtbot/cocaine
125
125
  licenses: []
126
126
  post_install_message:
127
127
  rdoc_options: []
@@ -133,22 +133,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
133
133
  - - ! '>='
134
134
  - !ruby/object:Gem::Version
135
135
  version: '0'
136
- segments:
137
- - 0
138
- hash: 2124621343266974199
139
136
  required_rubygems_version: !ruby/object:Gem::Requirement
140
137
  none: false
141
138
  requirements:
142
139
  - - ! '>='
143
140
  - !ruby/object:Gem::Version
144
141
  version: '0'
145
- segments:
146
- - 0
147
- hash: 2124621343266974199
148
142
  requirements: []
149
143
  rubyforge_project:
150
144
  rubygems_version: 1.8.24
151
145
  signing_key:
152
146
  specification_version: 3
153
147
  summary: A small library for doing (command) lines
154
- test_files: []
148
+ test_files:
149
+ - spec/cocaine/command_line/runners/backticks_runner_spec.rb
150
+ - spec/cocaine/command_line/runners/posix_runner_spec.rb
151
+ - spec/cocaine/command_line/runners/process_runner_spec.rb
152
+ - spec/cocaine/command_line_spec.rb
153
+ - spec/spec_helper.rb
154
+ - spec/support/stub_os.rb
155
+ - spec/support/with_exitstatus.rb
156
+ has_rdoc: