doughboy 0.0.4 → 0.1.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/Gemfile.lock +1 -1
- data/README.markdown +13 -13
- data/lib/doughboy.rb +6 -2
- data/lib/doughboy/command.rb +25 -30
- data/lib/doughboy/version.rb +1 -1
- data/spec/doughboy/command_spec.rb +51 -70
- data/spec/doughboy_spec.rb +9 -3
- metadata +2 -2
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/README.markdown
    CHANGED
    
    | @@ -1,35 +1,35 @@ | |
| 1 1 | 
             
            Doughboy
         | 
| 2 2 | 
             
            ========
         | 
| 3 3 |  | 
| 4 | 
            -
            Doughboy is a Ruby library that strives to enable developers to  | 
| 4 | 
            +
            Doughboy is a Ruby library that strives to enable developers to simply make subprocessed shell calls. 
         | 
| 5 5 |  | 
| 6 6 | 
             
            Usage
         | 
| 7 7 | 
             
            --------
         | 
| 8 8 |  | 
| 9 | 
            -
            Doughboy provides a  | 
| 9 | 
            +
            Doughboy provides a composable interface to crafting shell commands. The following composition methods are available:
         | 
| 10 10 |  | 
| 11 | 
            -
                 | 
| 12 | 
            -
                 | 
| 11 | 
            +
                Doughboy.new("ruby -v")
         | 
| 12 | 
            +
                Doughboy.new("python", "setup.py")
         | 
| 13 | 
            +
                Doughboy.new(:executable => "python", :arguments => "setup.py")
         | 
| 13 14 |  | 
| 14 | 
            -
             | 
| 15 | 
            +
            Doing any of these things will return a command object that can be told to run:
         | 
| 15 16 |  | 
| 16 | 
            -
                command = Doughboy | 
| 17 | 
            +
                command = Doughboy.new("ruby -v")
         | 
| 18 | 
            +
                command.run #=> returns and Output object
         | 
| 17 19 |  | 
| 18 | 
            -
            The  | 
| 20 | 
            +
            The Output object includes the output methods: pid, stdin, stdout, stderr. For a shortcut, use the .text method. To create and run a new command, use the .with_exec shortcut:
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                output = Doughboy.with_exec("ruby -v") #=> returns an Output object
         | 
| 19 23 |  | 
| 20 24 | 
             
            Command Components
         | 
| 21 25 | 
             
            ------------------
         | 
| 22 26 |  | 
| 23 | 
            -
            Each command is composed of  | 
| 27 | 
            +
            Each command is composed of 2 components, executable and arguments.
         | 
| 24 28 |  | 
| 25 29 | 
             
            ### Executable
         | 
| 26 30 |  | 
| 27 31 | 
             
            When this component is set, the full-path is captured. If no path information could be determined, the executable passed will be used.
         | 
| 28 32 |  | 
| 29 | 
            -
            ### Options
         | 
| 30 | 
            -
             | 
| 31 | 
            -
            Options are command line switches that either start w/ "-" or "--". 
         | 
| 32 | 
            -
             | 
| 33 33 | 
             
            ### Arguments
         | 
| 34 34 |  | 
| 35 35 | 
             
            Arguments are items that are passed to the executable. They might be a list of ip addresses or files.
         | 
| @@ -37,7 +37,7 @@ Arguments are items that are passed to the executable. They might be a list of i | |
| 37 37 | 
             
            Origin of the Name
         | 
| 38 38 | 
             
            ------------------
         | 
| 39 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. 
         | 
| 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. We got a problem here?
         | 
| 41 41 |  | 
| 42 42 | 
             
            
         | 
| 43 43 |  | 
    
        data/lib/doughboy.rb
    CHANGED
    
    
    
        data/lib/doughboy/command.rb
    CHANGED
    
    | @@ -1,61 +1,56 @@ | |
| 1 1 | 
             
            module Doughboy
         | 
| 2 2 | 
             
              class Command
         | 
| 3 | 
            -
                attr_accessor :arguments, :executable | 
| 3 | 
            +
                attr_accessor :arguments, :executable
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                # Command.new
         | 
| 6 | 
            +
                # Command.new("python setup.py develop")
         | 
| 7 | 
            +
                # Command.new("python", "setup.py develop")
         | 
| 8 | 
            +
                # Command.new(:executable => "python", :arguments => "setup.py develop")
         | 
| 4 9 |  | 
| 5 10 | 
             
                def initialize(*args)
         | 
| 6 | 
            -
                  if args. | 
| 7 | 
            -
             | 
| 11 | 
            +
                  return self if args.empty?
         | 
| 12 | 
            +
                  parsed_args = args.first.is_a?(Hash) ? args.first : parse_string_args(args)
         | 
| 8 13 |  | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
                    end
         | 
| 12 | 
            -
                  end
         | 
| 14 | 
            +
                  self.executable = parsed_args[:executable]
         | 
| 15 | 
            +
                  self.arguments  = parsed_args[:arguments]
         | 
| 13 16 | 
             
                end
         | 
| 14 17 |  | 
| 15 | 
            -
                def self.with_exec( | 
| 16 | 
            -
                   | 
| 17 | 
            -
             | 
| 18 | 
            -
                  new( :executable     => parsed_command[:executable],
         | 
| 19 | 
            -
                       :arguments      => parsed_command[:arguments],
         | 
| 20 | 
            -
                       :options        => parsed_command[:options],
         | 
| 21 | 
            -
                       :full_arguments => parsed_command[:full_arguments])
         | 
| 18 | 
            +
                def self.with_exec(*args)
         | 
| 19 | 
            +
                  command = new(*args)
         | 
| 20 | 
            +
                  command.run
         | 
| 22 21 | 
             
                end
         | 
| 23 22 |  | 
| 24 23 | 
             
                def command
         | 
| 25 | 
            -
                   | 
| 26 | 
            -
                    [executable, full_arguments].join(" ")
         | 
| 27 | 
            -
                  else
         | 
| 28 | 
            -
                    [executable, options, arguments].join(" ")
         | 
| 29 | 
            -
                  end
         | 
| 24 | 
            +
                  [executable, arguments].join(" ")
         | 
| 30 25 | 
             
                end
         | 
| 31 26 |  | 
| 32 27 | 
             
                def executable=(value)
         | 
| 33 28 | 
             
                  return nil if value.nil?
         | 
| 29 | 
            +
             | 
| 34 30 | 
             
                  full_path = `which #{value}`.strip
         | 
| 35 31 | 
             
                  @executable = full_path != "" ? full_path : value
         | 
| 36 32 | 
             
                end
         | 
| 37 33 |  | 
| 38 | 
            -
                def  | 
| 39 | 
            -
                  return nil if value.nil?
         | 
| 40 | 
            -
                  @options = value.is_a?(Array) ? value : value.split(" ")
         | 
| 41 | 
            -
                end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                def run!
         | 
| 34 | 
            +
                def run
         | 
| 44 35 | 
             
                  Output.new( Open4::popen4(command) )
         | 
| 45 36 | 
             
                end
         | 
| 46 37 |  | 
| 47 38 | 
             
                private
         | 
| 48 | 
            -
                def self. | 
| 39 | 
            +
                def self.parse_executable(command)
         | 
| 49 40 | 
             
                  split_command = command.split(" ")
         | 
| 50 41 | 
             
                  parsed_command = { }
         | 
| 51 | 
            -
                  args_and_opts = split_command[1..(split_command.size-1)]
         | 
| 52 42 |  | 
| 53 | 
            -
                  parsed_command[:full_arguments] = args_and_opts
         | 
| 54 43 | 
             
                  parsed_command[:executable] = split_command[0]
         | 
| 55 | 
            -
                  parsed_command[:arguments] | 
| 56 | 
            -
                  parsed_command[:options]   = args_and_opts.select { |t| t.include?("-") }
         | 
| 44 | 
            +
                  parsed_command[:arguments]  = split_command[1..(split_command.size-1)]
         | 
| 57 45 | 
             
                  parsed_command
         | 
| 58 46 | 
             
                end
         | 
| 59 47 |  | 
| 48 | 
            +
                def parse_string_args(args)
         | 
| 49 | 
            +
                  if args.size == 1
         | 
| 50 | 
            +
                    self.class.parse_executable(args.first)
         | 
| 51 | 
            +
                  else
         | 
| 52 | 
            +
                    { :executable => args.first, :arguments => args[1]}
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
                end
         | 
| 60 55 | 
             
              end
         | 
| 61 56 | 
             
            end
         | 
    
        data/lib/doughboy/version.rb
    CHANGED
    
    
| @@ -3,30 +3,51 @@ require 'spec_helper' | |
| 3 3 | 
             
            module Doughboy
         | 
| 4 4 | 
             
              describe Command do
         | 
| 5 5 | 
             
                describe ".new" do
         | 
| 6 | 
            -
                  context "with  | 
| 7 | 
            -
                    it " | 
| 6 | 
            +
                  context "with no arugments" do
         | 
| 7 | 
            +
                    it "does not error" do
         | 
| 8 | 
            +
                      lambda { Command.new }.should_not raise_exception
         | 
| 9 | 
            +
                    end
         | 
| 8 10 | 
             
                  end
         | 
| 9 11 |  | 
| 10 | 
            -
                  context "with a  | 
| 12 | 
            +
                  context "with a single string argument" do
         | 
| 13 | 
            +
                    it "sets the executable" do
         | 
| 14 | 
            +
                      command = Command.new("python setup.py develop")
         | 
| 15 | 
            +
                      command.executable.should_not be_nil
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 11 18 | 
             
                    it "sets the arguments" do
         | 
| 12 | 
            -
                      command = Command.new( | 
| 19 | 
            +
                      command = Command.new("python setup.py develop")
         | 
| 20 | 
            +
                      command.arguments.should_not be_nil
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  context "with a double string argument" do
         | 
| 25 | 
            +
                    it "sets the executable" do
         | 
| 26 | 
            +
                      command = Command.new("python", "setup.py develop")
         | 
| 27 | 
            +
                      command.executable.should_not be_nil
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    it "sets the arguments" do
         | 
| 31 | 
            +
                      command = Command.new("python", "setup.py develop")
         | 
| 13 32 | 
             
                      command.arguments.should_not be_nil
         | 
| 14 33 | 
             
                    end
         | 
| 15 34 |  | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  context "with a hash argument" do
         | 
| 16 38 | 
             
                    it "sets the executeable" do
         | 
| 17 39 | 
             
                      command = Command.new(:executable => "python")
         | 
| 18 40 | 
             
                      command.executable.should_not be_nil
         | 
| 19 41 | 
             
                    end
         | 
| 20 42 |  | 
| 21 | 
            -
                    it "sets the  | 
| 22 | 
            -
                       | 
| 23 | 
            -
                      command | 
| 24 | 
            -
                      command.options.should_not be_nil
         | 
| 43 | 
            +
                    it "sets the arguments" do
         | 
| 44 | 
            +
                      command = Command.new(:arguments => "setup.py develop")
         | 
| 45 | 
            +
                      command.arguments.should_not be_nil
         | 
| 25 46 | 
             
                    end
         | 
| 26 47 |  | 
| 27 48 | 
             
                    # Command.with_exec("python setup.py develop).run
         | 
| 28 | 
            -
                    # Command.with_exec("python"). | 
| 29 | 
            -
                    # Command.with_exec("mi"). | 
| 49 | 
            +
                    # Command.with_exec("python").with_arg("123456").run
         | 
| 50 | 
            +
                    # Command.with_exec("mi").with_args([]).run
         | 
| 30 51 | 
             
                    # Command.with_exec("python") do |input|
         | 
| 31 52 | 
             
                    #   input.puts("exit()")
         | 
| 32 53 | 
             
                    # end
         | 
| @@ -34,52 +55,11 @@ module Doughboy | |
| 34 55 | 
             
                end
         | 
| 35 56 |  | 
| 36 57 | 
             
                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 58 |  | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 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
         | 
| 59 | 
            +
                  it "returns a Output" do
         | 
| 60 | 
            +
                    Command.with_exec("ruby").should be_kind_of(Output)
         | 
| 76 61 | 
             
                  end
         | 
| 77 62 |  | 
| 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 63 | 
             
                end
         | 
| 84 64 |  | 
| 85 65 | 
             
                describe "#arguments=" do
         | 
| @@ -92,15 +72,15 @@ module Doughboy | |
| 92 72 | 
             
                end
         | 
| 93 73 |  | 
| 94 74 | 
             
                describe "#command" do
         | 
| 95 | 
            -
                  it "joins the executable | 
| 96 | 
            -
                    full_command = "/bin/ps | 
| 75 | 
            +
                  it "joins the executable and arguments" do
         | 
| 76 | 
            +
                    full_command = "/bin/ps aux"
         | 
| 97 77 | 
             
                    command = Command.new(:executable => "ps", :options => "", :arguments => "aux")
         | 
| 98 78 | 
             
                    command.command.should == full_command
         | 
| 99 79 | 
             
                  end
         | 
| 100 80 |  | 
| 101 81 | 
             
                  it "returns them in the proper order" do
         | 
| 102 82 | 
             
                    python = `which python`.strip
         | 
| 103 | 
            -
                    command = Command. | 
| 83 | 
            +
                    command = Command.new("python mbu_information.py -r 218298")
         | 
| 104 84 | 
             
                    command.command.should == "#{python} mbu_information.py -r 218298"
         | 
| 105 85 | 
             
                  end
         | 
| 106 86 | 
             
                end
         | 
| @@ -119,19 +99,20 @@ module Doughboy | |
| 119 99 | 
             
                  end
         | 
| 120 100 | 
             
                end
         | 
| 121 101 |  | 
| 122 | 
            -
                describe "# | 
| 123 | 
            -
                   | 
| 124 | 
            -
                     | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
                     | 
| 102 | 
            +
                describe "#run" do
         | 
| 103 | 
            +
                  it "runs the command" do
         | 
| 104 | 
            +
                    full_command = "/bin/ps  aux"
         | 
| 105 | 
            +
                    command = Command.new()
         | 
| 106 | 
            +
                    command.stub!(:command).and_return(full_command)
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                    Open4.should_receive(:popen4).with(full_command).
         | 
| 109 | 
            +
                      and_return([1234, StringIO.new, StringIO.new, StringIO.new])
         | 
| 110 | 
            +
                    command.run
         | 
| 129 111 | 
             
                  end
         | 
| 130 112 |  | 
| 131 | 
            -
                   | 
| 132 | 
            -
                     | 
| 133 | 
            -
                    command  | 
| 134 | 
            -
                    command.options.should == ["-r", "-i"]
         | 
| 113 | 
            +
                  it "returns an output object" do
         | 
| 114 | 
            +
                    command = Command.new(:executable => "ps", :arguments => "aux")
         | 
| 115 | 
            +
                    command.run.should be_kind_of(Output)
         | 
| 135 116 | 
             
                  end
         | 
| 136 117 | 
             
                end
         | 
| 137 118 |  | 
| @@ -143,12 +124,12 @@ module Doughboy | |
| 143 124 |  | 
| 144 125 | 
             
                    Open4.should_receive(:popen4).with(full_command).
         | 
| 145 126 | 
             
                      and_return([1234, StringIO.new, StringIO.new, StringIO.new])
         | 
| 146 | 
            -
                    command.run | 
| 127 | 
            +
                    command.run
         | 
| 147 128 | 
             
                  end
         | 
| 148 129 |  | 
| 149 130 | 
             
                  it "returns an output object" do
         | 
| 150 | 
            -
                    command = Command.new(:executable => "ps", : | 
| 151 | 
            -
                    command.run | 
| 131 | 
            +
                    command = Command.new(:executable => "ps", :arguments => "aux")
         | 
| 132 | 
            +
                    command.run.should be_kind_of(Output)
         | 
| 152 133 | 
             
                  end
         | 
| 153 134 | 
             
                end
         | 
| 154 135 | 
             
              end
         | 
    
        data/spec/doughboy_spec.rb
    CHANGED
    
    | @@ -2,9 +2,15 @@ require 'spec_helper' | |
| 2 2 |  | 
| 3 3 | 
             
            describe Doughboy do
         | 
| 4 4 |  | 
| 5 | 
            -
              describe " | 
| 6 | 
            -
                it "returns a  | 
| 7 | 
            -
                  Doughboy. | 
| 5 | 
            +
              describe ".new" do
         | 
| 6 | 
            +
                it "returns a Command" do
         | 
| 7 | 
            +
                  Doughboy.new("ruby -v").should be_kind_of(Doughboy::Command)
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              describe ".with_exec" do
         | 
| 12 | 
            +
                it "returns returns the output from a command" do
         | 
| 13 | 
            +
                  Doughboy.with_exec("ruby -v").should be_kind_of(Doughboy::Output)
         | 
| 8 14 | 
             
                end
         | 
| 9 15 | 
             
              end
         | 
| 10 16 | 
             
            end
         |