doughboy 0.0.2
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 +6 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +26 -0
- data/LICENSE +19 -0
- data/README.markdown +52 -0
- data/Rakefile +4 -0
- data/autotest/.autotest +10 -0
- data/autotest/discover.rb +1 -0
- data/doughboy.gemspec +24 -0
- data/lib/doughboy/command.rb +55 -0
- data/lib/doughboy/output.rb +18 -0
- data/lib/doughboy/version.rb +3 -0
- data/lib/doughboy.rb +7 -0
- data/spec/doughboy/command_spec.rb +149 -0
- data/spec/doughboy/output_spec.rb +39 -0
- data/spec/doughboy_spec.rb +4 -0
- data/spec/spec.rake +7 -0
- data/spec/spec_helper.rb +5 -0
- metadata +117 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.2@dough_boy
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
dough_boy (0.0.1)
|
5
|
+
open4 (~> 1.0.1)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
diff-lcs (1.1.2)
|
11
|
+
open4 (1.0.1)
|
12
|
+
rspec (2.4.0)
|
13
|
+
rspec-core (~> 2.4.0)
|
14
|
+
rspec-expectations (~> 2.4.0)
|
15
|
+
rspec-mocks (~> 2.4.0)
|
16
|
+
rspec-core (2.4.0)
|
17
|
+
rspec-expectations (2.4.0)
|
18
|
+
diff-lcs (~> 1.1.2)
|
19
|
+
rspec-mocks (2.4.0)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
dough_boy!
|
26
|
+
rspec (~> 2.4.0)
|
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (C) 2011 by Joshua Schairbaum
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE
|
data/README.markdown
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
Doughboy
|
2
|
+
========
|
3
|
+
|
4
|
+
Doughboy is a Ruby library that strives to enable developers to easily make subprocessed shell calls.
|
5
|
+
|
6
|
+
Usage
|
7
|
+
--------
|
8
|
+
|
9
|
+
Doughboy provides a compossible interface to crafting shell commands.
|
10
|
+
|
11
|
+
command = Doughboy::Command.with_exec("ruby").with_options(["-v"])
|
12
|
+
command.run!
|
13
|
+
|
14
|
+
Commands components can be set directly on any object.
|
15
|
+
|
16
|
+
command = Doughboy::Command.new(:executable => "easy_install", :arguments => "some-python-library").run!
|
17
|
+
|
18
|
+
The preferred method is to use the composable chain methods.
|
19
|
+
|
20
|
+
Command Components
|
21
|
+
------------------
|
22
|
+
|
23
|
+
Each command is composed of 3 separate components: executable, options, arguments.
|
24
|
+
|
25
|
+
### Executable
|
26
|
+
|
27
|
+
When this component is set, the full-path is captured. If no path information could be determined, the executable passed will be used.
|
28
|
+
|
29
|
+
### Options
|
30
|
+
|
31
|
+
Options are command line switches that either start w/ "-" or "--".
|
32
|
+
|
33
|
+
### Arguments
|
34
|
+
|
35
|
+
Arguments are items that are passed to the executable. They might be a list of ip addresses or files.
|
36
|
+
|
37
|
+
Origin of the Name
|
38
|
+
------------------
|
39
|
+
|
40
|
+
I wish I could say that it was meant to pay homage to the fighting men of the Lost Generation, but it's not. I was watching Boyz N The Hood.
|
41
|
+
|
42
|
+

|
43
|
+
|
44
|
+
Author
|
45
|
+
------
|
46
|
+
|
47
|
+
Joshua Schairbaum \o\ joshua.schairbaum@gmail.com /o/ @jschairb
|
48
|
+
|
49
|
+
License
|
50
|
+
-------
|
51
|
+
|
52
|
+
See LICENSE file.
|
data/Rakefile
ADDED
data/autotest/.autotest
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Autotest.add_discovery { "rspec2" }
|
data/doughboy.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "doughboy/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "doughboy"
|
7
|
+
s.version = Doughboy::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Joshua Schairbaum"]
|
10
|
+
s.email = ["joshua.schairbaum@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Easily run command-line programs. This }
|
13
|
+
s.description = %q{Doughboy is a Ruby library that strives to enable developers to easily make subprocessed shell calls.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "doughboy"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency('open4', '~>1.0.1')
|
23
|
+
s.add_development_dependency('rspec', "~>2.4.0")
|
24
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Doughboy
|
2
|
+
class Command
|
3
|
+
attr_accessor :arguments, :executable, :options
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
if args.any?
|
7
|
+
local_args = args.first
|
8
|
+
self.arguments = local_args[:arguments]
|
9
|
+
self.executable = local_args[:executable]
|
10
|
+
self.options = local_args[:options]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.with_exec(command)
|
15
|
+
parsed_command = parse_command(command)
|
16
|
+
executable = parsed_command[:executable]
|
17
|
+
arguments = parsed_command[:arguments]
|
18
|
+
options = parsed_command[:options]
|
19
|
+
|
20
|
+
new(:executable => executable, :arguments => arguments, :options => options)
|
21
|
+
end
|
22
|
+
|
23
|
+
def command
|
24
|
+
[executable, options, arguments].join(" ")
|
25
|
+
end
|
26
|
+
|
27
|
+
def executable=(value)
|
28
|
+
return nil if value.nil?
|
29
|
+
full_path = `which #{value}`.strip
|
30
|
+
@executable = full_path != "" ? full_path : value
|
31
|
+
end
|
32
|
+
|
33
|
+
def options=(value)
|
34
|
+
return nil if value.nil?
|
35
|
+
@options = value.is_a?(Array) ? value : value.split(" ")
|
36
|
+
end
|
37
|
+
|
38
|
+
def run!
|
39
|
+
Output.new( Open4::popen4(command) )
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def self.parse_command(command)
|
44
|
+
split_command = command.split(" ")
|
45
|
+
parsed_command = { }
|
46
|
+
args_and_opts = split_command[1..(split_command.size-1)]
|
47
|
+
|
48
|
+
parsed_command[:executable] = split_command[0]
|
49
|
+
parsed_command[:arguments] = args_and_opts.select { |t| !t.include?("-") }.join(" ")
|
50
|
+
parsed_command[:options] = args_and_opts.select { |t| t.include?("-") }
|
51
|
+
parsed_command
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Doughboy
|
2
|
+
class Output
|
3
|
+
attr_accessor :pid, :stdin, :stdout, :stderr
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
local_args = args.first
|
7
|
+
self.pid = local_args[0]
|
8
|
+
self.stdin = local_args[1]
|
9
|
+
self.stdout = local_args[2]
|
10
|
+
self.stderr = local_args[3]
|
11
|
+
end
|
12
|
+
|
13
|
+
def text
|
14
|
+
stdout.read.strip
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/lib/doughboy.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Doughboy
|
4
|
+
describe Command do
|
5
|
+
describe ".new" do
|
6
|
+
context "with a string argument" do
|
7
|
+
it "sets the executable"
|
8
|
+
end
|
9
|
+
|
10
|
+
context "with a hash argument" do
|
11
|
+
it "sets the arguments" do
|
12
|
+
command = Command.new(:arguments => "setup.py develop")
|
13
|
+
command.arguments.should_not be_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "sets the executeable" do
|
17
|
+
command = Command.new(:executable => "python")
|
18
|
+
command.executable.should_not be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it "sets the options" do
|
22
|
+
options = "-r -i"
|
23
|
+
command = Command.new(:options => options)
|
24
|
+
command.options.should_not be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
# Command.with_exec("python setup.py develop).run
|
28
|
+
# Command.with_exec("python").with_option("-r").with_arg("123456").run
|
29
|
+
# Command.with_exec("mi").with_options([]).with_args([]).run
|
30
|
+
# Command.with_exec("python") do |input|
|
31
|
+
# input.puts("exit()")
|
32
|
+
# end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe ".with_exec" do
|
37
|
+
it "returns a Command" do
|
38
|
+
Command.with_exec("ruby").should be_kind_of(Command)
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with a string of executable and argument" do
|
42
|
+
before(:each) do
|
43
|
+
@command_string = "ps aux"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "assigns the executable" do
|
47
|
+
command = Command.with_exec(@command_string)
|
48
|
+
command.executable.should == `which ps`.strip
|
49
|
+
end
|
50
|
+
|
51
|
+
it "assigns the arguments" do
|
52
|
+
command = Command.with_exec(@command_string)
|
53
|
+
command.arguments.should == "aux"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "with a string of executable, arguments, and options" do
|
58
|
+
before(:each) do
|
59
|
+
@command_string = "mi -r 212984"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "assigns the executable" do
|
63
|
+
command = Command.with_exec(@command_string)
|
64
|
+
command.executable.should == `which mi`.strip
|
65
|
+
end
|
66
|
+
|
67
|
+
it "assigns the arguments" do
|
68
|
+
command = Command.with_exec(@command_string)
|
69
|
+
command.arguments.should == "212984"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "assigns the options" do
|
73
|
+
command = Command.with_exec(@command_string)
|
74
|
+
command.options.should == ["-r"]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "with an executable" do
|
79
|
+
it "assigns the executable" do
|
80
|
+
Command.with_exec("ruby").executable.should include("ruby")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "#arguments=" do
|
86
|
+
it 'sets the arguments' do
|
87
|
+
arguments = "setup.py develop"
|
88
|
+
|
89
|
+
command = Command.new(:arguments => arguments)
|
90
|
+
command.arguments.should == arguments
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#command" do
|
95
|
+
it "joins the executable, options, and arguments" do
|
96
|
+
full_command = "/bin/ps aux"
|
97
|
+
command = Command.new(:executable => "ps", :options => "", :arguments => "aux")
|
98
|
+
command.command.should == full_command
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "#executable=" do
|
103
|
+
it "sets the full path of the executable" do
|
104
|
+
ruby = `which ruby`.strip
|
105
|
+
|
106
|
+
command = Command.new(:executable => "ruby")
|
107
|
+
command.executable.should == ruby
|
108
|
+
end
|
109
|
+
|
110
|
+
it "sets the value sent if no path could be determined" do
|
111
|
+
command = Command.new(:executable => "noexist")
|
112
|
+
command.executable.should == "noexist"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#options=" do
|
117
|
+
context "with an array of options" do
|
118
|
+
it "sets the options as an array" do
|
119
|
+
options = ["-r", "-i"]
|
120
|
+
command = Command.new(:options => options)
|
121
|
+
command.options.should == options
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context "with a string of options" do
|
126
|
+
options = "-r -i"
|
127
|
+
command = Command.new(:options => options)
|
128
|
+
command.options.should == ["-r", "-i"]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "#run!" do
|
133
|
+
it "runs the command" do
|
134
|
+
full_command = "/bin/ps aux"
|
135
|
+
command = Command.new()
|
136
|
+
command.stub!(:command).and_return(full_command)
|
137
|
+
|
138
|
+
Open4.should_receive(:popen4).with(full_command).
|
139
|
+
and_return([1234, StringIO.new, StringIO.new, StringIO.new])
|
140
|
+
command.run!
|
141
|
+
end
|
142
|
+
|
143
|
+
it "returns an output object" do
|
144
|
+
command = Command.new(:executable => "ps", :options => "", :arguments => "aux")
|
145
|
+
command.run!.should be_kind_of(Output)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Doughboy
|
4
|
+
describe Output do
|
5
|
+
describe ".new" do
|
6
|
+
before(:each) do
|
7
|
+
#popen [pid, stdin, stdout, stderr]
|
8
|
+
@response = Open4::popen4("ps aux")
|
9
|
+
@output = Output.new(@response)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "sets the pid" do
|
13
|
+
@output.pid.should == @response[0]
|
14
|
+
end
|
15
|
+
|
16
|
+
it "sets the stdin" do
|
17
|
+
@output.stdin.should == @response[1]
|
18
|
+
end
|
19
|
+
|
20
|
+
it "sets the stdout" do
|
21
|
+
@output.stdout.should == @response[2]
|
22
|
+
end
|
23
|
+
|
24
|
+
it "sets the stderr" do
|
25
|
+
@output.stderr.should == @response[3]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#text" do
|
30
|
+
it "returns the stdout" do
|
31
|
+
response = Open4::popen4("ruby -v")
|
32
|
+
output = Output.new(response)
|
33
|
+
|
34
|
+
expected = `ruby -v`.strip
|
35
|
+
output.text.should == expected
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/spec.rake
ADDED
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: doughboy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Joshua Schairbaum
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-02-04 00:00:00 -06:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: open4
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 0
|
31
|
+
- 1
|
32
|
+
version: 1.0.1
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rspec
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 2
|
45
|
+
- 4
|
46
|
+
- 0
|
47
|
+
version: 2.4.0
|
48
|
+
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
description: Doughboy is a Ruby library that strives to enable developers to easily make subprocessed shell calls.
|
51
|
+
email:
|
52
|
+
- joshua.schairbaum@gmail.com
|
53
|
+
executables: []
|
54
|
+
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
extra_rdoc_files: []
|
58
|
+
|
59
|
+
files:
|
60
|
+
- .gitignore
|
61
|
+
- .rspec
|
62
|
+
- .rvmrc
|
63
|
+
- Gemfile
|
64
|
+
- Gemfile.lock
|
65
|
+
- LICENSE
|
66
|
+
- README.markdown
|
67
|
+
- Rakefile
|
68
|
+
- autotest/.autotest
|
69
|
+
- autotest/discover.rb
|
70
|
+
- doughboy.gemspec
|
71
|
+
- lib/doughboy.rb
|
72
|
+
- lib/doughboy/command.rb
|
73
|
+
- lib/doughboy/output.rb
|
74
|
+
- lib/doughboy/version.rb
|
75
|
+
- spec/doughboy/command_spec.rb
|
76
|
+
- spec/doughboy/output_spec.rb
|
77
|
+
- spec/doughboy_spec.rb
|
78
|
+
- spec/spec.rake
|
79
|
+
- spec/spec_helper.rb
|
80
|
+
has_rdoc: true
|
81
|
+
homepage: ""
|
82
|
+
licenses: []
|
83
|
+
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
requirements: []
|
106
|
+
|
107
|
+
rubyforge_project: doughboy
|
108
|
+
rubygems_version: 1.3.7
|
109
|
+
signing_key:
|
110
|
+
specification_version: 3
|
111
|
+
summary: Easily run command-line programs. This
|
112
|
+
test_files:
|
113
|
+
- spec/doughboy/command_spec.rb
|
114
|
+
- spec/doughboy/output_spec.rb
|
115
|
+
- spec/doughboy_spec.rb
|
116
|
+
- spec/spec.rake
|
117
|
+
- spec/spec_helper.rb
|