scmd 2.3.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -94,6 +94,33 @@ Raise an exception if not successful with `run!`:
94
94
  Scmd.new("cd /path/that/does/not/exist").run! #=> Scmd::Command::Failure
95
95
  ```
96
96
 
97
+ ### Environment variables
98
+
99
+ Pass environment variables:
100
+
101
+ ```ruby
102
+ cmd = Scmd.new("echo $TEST_VAR", {
103
+ :env => {
104
+ 'TEST_VAR' => 'hi'
105
+ }
106
+ })
107
+ ```
108
+
109
+ ### Process spawn options
110
+
111
+ Pass options:
112
+
113
+ ```ruby
114
+ reader, writer = IO.pipe
115
+ # this is an example that uses file descriptor redirection options
116
+ cmd = Scmd.new("echo test 1>&#{writer.fileno}", {
117
+ :options => { writer => writer }
118
+ })
119
+ reader.gets # => "test\n"
120
+ ```
121
+
122
+ For all the possible options see [posix-spawn](https://github.com/rtomayko/posix-spawn#status).
123
+
97
124
  ## Installation
98
125
 
99
126
  Add this line to your application's Gemfile:
@@ -14,12 +14,14 @@ module Scmd
14
14
  READ_CHECK_TIMEOUT = 0.001 # seconds
15
15
  DEFAULT_STOP_TIMEOUT = 3 # seconds
16
16
 
17
- attr_reader :cmd_str, :env
17
+ attr_reader :cmd_str, :env, :options
18
18
  attr_reader :pid, :exitstatus, :stdout, :stderr
19
19
 
20
- def initialize(cmd_str, env = nil)
20
+ def initialize(cmd_str, opts = nil)
21
+ opts ||= {}
21
22
  @cmd_str = cmd_str
22
- @env = stringify_hash(env || {})
23
+ @env = stringify_hash(opts[:env] || {})
24
+ @options = opts[:options] || {}
23
25
  reset_attrs
24
26
  end
25
27
 
@@ -131,7 +133,7 @@ module Scmd
131
133
  reset_attrs
132
134
  @stop_r, @stop_w = IO.pipe
133
135
  @read_output_thread = nil
134
- @child_process = ChildProcess.new(@cmd_str, @env)
136
+ @child_process = ChildProcess.new(@cmd_str, @env, @options)
135
137
  end
136
138
 
137
139
  def teardown_run
@@ -165,8 +167,12 @@ module Scmd
165
167
 
166
168
  attr_reader :pid, :stdin, :stdout, :stderr
167
169
 
168
- def initialize(cmd_str, env)
169
- @pid, @stdin, @stdout, @stderr = *::POSIX::Spawn::popen4(env, cmd_str)
170
+ def initialize(cmd_str, env, options)
171
+ @pid, @stdin, @stdout, @stderr = *::POSIX::Spawn::popen4(
172
+ env,
173
+ cmd_str,
174
+ options
175
+ )
170
176
  @wait_pid, @wait_status = nil, nil
171
177
  end
172
178
 
@@ -1,3 +1,3 @@
1
1
  module Scmd
2
- VERSION = "2.3.1"
2
+ VERSION = "3.0.0"
3
3
  end
@@ -18,6 +18,6 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
- gem.add_development_dependency("assert", ["~> 2.3"])
22
- gem.add_dependency("posix-spawn", ["= 0.3.8"])
21
+ gem.add_development_dependency("assert", ["~> 2.15"])
22
+ gem.add_dependency("posix-spawn", ["~> 0.3.11"])
23
23
  end
@@ -159,15 +159,36 @@ class Scmd::Command
159
159
  desc "with environment variables"
160
160
  setup do
161
161
  @cmd = Scmd::Command.new("echo $SCMD_TEST_VAR", {
162
- 'SCMD_TEST_VAR' => 'test'
162
+ :env => { 'SCMD_TEST_VAR' => 'test' }
163
163
  })
164
164
  end
165
165
 
166
166
  should "use them when running the command" do
167
167
  @cmd.run
168
+ assert @cmd.success?
168
169
  assert_equal "test\n", @cmd.stdout
169
170
  end
170
171
 
171
172
  end
172
173
 
174
+ class WithOptionsTests < SystemTests
175
+ desc "with options"
176
+ setup do
177
+ @path = "/"
178
+ # `chdir` is the only one that reliably worked
179
+ @cmd = Scmd::Command.new("pwd", {
180
+ :options => { :chdir => @path }
181
+ })
182
+ end
183
+
184
+ should "use them when running the command" do
185
+ @cmd.run
186
+ assert @cmd.success?
187
+ # if the option didn't work or was ignored it would use this process' dir
188
+ assert_not_equal "#{Dir.pwd}\n", @cmd.stdout
189
+ assert_equal "#{@path}\n", @cmd.stdout
190
+ end
191
+
192
+ end
193
+
173
194
  end
@@ -10,7 +10,7 @@ class Scmd::Command
10
10
  end
11
11
  subject { @cmd }
12
12
 
13
- should have_readers :cmd_str, :env
13
+ should have_readers :cmd_str, :env, :options
14
14
  should have_readers :pid, :exitstatus, :stdout, :stderr
15
15
  should have_imeths :run, :run!
16
16
  should have_imeths :start, :wait, :stop, :kill
@@ -27,12 +27,16 @@ class Scmd::Command
27
27
 
28
28
  should "stringify its env hash" do
29
29
  cmd = Scmd::Command.new("echo $SCMD_TEST_VAR", {
30
- :SCMD_TEST_VAR => 1
30
+ :env => { :SCMD_TEST_VAR => 1 }
31
31
  })
32
32
  expected = { 'SCMD_TEST_VAR' => '1' }
33
33
  assert_equal expected, cmd.env
34
34
  end
35
35
 
36
+ should "default its options to an empty hash" do
37
+ assert_equal({}, subject.options)
38
+ end
39
+
36
40
  should "default its result values" do
37
41
  assert_nil subject.pid
38
42
  assert_nil subject.exitstatus
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scmd
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
4
+ hash: 7
5
5
  prerelease:
6
6
  segments:
7
- - 2
8
7
  - 3
9
- - 1
10
- version: 2.3.1
8
+ - 0
9
+ - 0
10
+ version: 3.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2014-08-01 00:00:00 Z
19
+ date: 2015-10-12 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  requirement: &id001 !ruby/object:Gem::Requirement
@@ -24,30 +24,30 @@ dependencies:
24
24
  requirements:
25
25
  - - ~>
26
26
  - !ruby/object:Gem::Version
27
- hash: 5
27
+ hash: 29
28
28
  segments:
29
29
  - 2
30
- - 3
31
- version: "2.3"
32
- version_requirements: *id001
30
+ - 15
31
+ version: "2.15"
33
32
  type: :development
34
33
  name: assert
34
+ version_requirements: *id001
35
35
  prerelease: false
36
36
  - !ruby/object:Gem::Dependency
37
37
  requirement: &id002 !ruby/object:Gem::Requirement
38
38
  none: false
39
39
  requirements:
40
- - - "="
40
+ - - ~>
41
41
  - !ruby/object:Gem::Version
42
- hash: 3
42
+ hash: 5
43
43
  segments:
44
44
  - 0
45
45
  - 3
46
- - 8
47
- version: 0.3.8
48
- version_requirements: *id002
46
+ - 11
47
+ version: 0.3.11
49
48
  type: :runtime
50
49
  name: posix-spawn
50
+ version_requirements: *id002
51
51
  prerelease: false
52
52
  description: Build and run system commands.
53
53
  email:
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  requirements: []
110
110
 
111
111
  rubyforge_project:
112
- rubygems_version: 1.8.29
112
+ rubygems_version: 1.8.25
113
113
  signing_key:
114
114
  specification_version: 3
115
115
  summary: Build and run system commands.