Sha256: dc9a6d118d2ab3ea2a5ffbc557b0ef3c00189059db9e261008d0f00150dbc8e9

Contents?: true

Size: 1.49 KB

Versions: 3

Compression:

Stored size: 1.49 KB

Contents

module Paraduct
  require "open3"

  class ProcessError < StandardError
    attr_reader :status

    # @param message [String] stdout and stderr
    # @param status  [Process::Status]
    def initialize(message, status)
      super(message)
      @status = status
    end
  end

  class Runner
    # run script with params
    # @param script [String, Array<String>] script file, script(s)
    # @param params [Hash{String => String}] key is capitalized and value is quoted (ex. foo=1 => FOO="1" )
    # @return [String] stdout
    # @raise [Paraduct::ProcessError] command exited error status
    def self.perform(script, params)
      variable_string = capitalize_keys(params).map{ |key, value| %(export #{key}="#{value}";) }.join(" ")

      Array.wrap(script).inject("") do |stdout, command|
        stdout << run_command("#{variable_string} #{command}")
        stdout
      end
    end

    def self.parameterized_job_dir(base_job_dir, params)
      dir_name = capitalize_keys(params).map{ |key, value| "#{key}_#{value}" }.join("_")
      Pathname(base_job_dir).join(dir_name)
    end

    def self.run_command(command)
      stdout, stderr, status = Open3.capture3(command)
      raise ProcessError.new("#{stdout}\n#{stderr}", status) unless status.success?
      stdout
    end
    private_class_method :run_command

    def self.capitalize_keys(params)
      params.inject({}) do |res, (key, value)|
        res[key.upcase] = value
        res
      end
    end
    private_class_method :capitalize_keys
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
paraduct-0.0.1.beta3 lib/paraduct/runner.rb
paraduct-0.0.1.beta2 lib/paraduct/runner.rb
paraduct-0.0.1.beta1 lib/paraduct/runner.rb