Sha256: dfb3fca4001f4197a53b997a244d7ac695932fc9d11672ef4565112066e43b3a

Contents?: true

Size: 1.27 KB

Versions: 14

Compression:

Stored size: 1.27 KB

Contents

module Boxes
  # Standardise handling the stdout and stderr from Open3.
  #
  # @example Print the values returned to stdout and stderr
  #   Boxes::Utils::Subprocess.run 'ls' do |stdout, stderr, thread|
  #     puts stdout unless stdout == nil
  #     puts stderr unless stderr == nil
  #   end
  #
  class Subprocess
    # Create a new subprocess with a command, with a block for the response.
    #
    # @param cmd [String] the command to run
    # @yield [stdout, stderr, thread] Gives the stdout, stderr and process
    #   thread to the block.
    def self.run(command) # rubocop:disable Metrics/MethodLength
      # see: http://stackoverflow.com/a/1162850/83386
      Open3.popen3(command) do |_stdin, stdout, stderr, thread|
        # read each stream from a new thread
        { out: stdout, err: stderr }.each do |key, stream|
          Thread.new do
            stream.each_line do |line|
              # yield the block depending on the stream
              if key == :out
                yield line, nil, thread if block_given?
              else
                yield nil, line, thread if block_given?
              end
            end
          end
        end

        thread.join # don't exit until the external process is done

        thread.value
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
boxes-3.3.1 lib/boxes/subprocess.rb
boxes-3.3.0 lib/boxes/subprocess.rb
boxes-3.2.0 lib/boxes/subprocess.rb
boxes-3.1.0 lib/boxes/subprocess.rb
boxes-3.0.0 lib/boxes/subprocess.rb
boxes-2.5.0 lib/boxes/subprocess.rb
boxes-2.4.0 lib/boxes/subprocess.rb
boxes-2.3.0 lib/boxes/subprocess.rb
boxes-2.2.0 lib/boxes/subprocess.rb
boxes-2.1.1 lib/boxes/subprocess.rb
boxes-2.1.0 lib/boxes/subprocess.rb
boxes-2.0.2 lib/boxes/subprocess.rb
boxes-2.0.1 lib/boxes/subprocess.rb
boxes-2.0.0 lib/boxes/subprocess.rb