Sha256: a77ba44b3691b1192bdb5679ad940756b7e3f9f53899a3a286082cb062c80c77

Contents?: true

Size: 1.83 KB

Versions: 10

Compression:

Stored size: 1.83 KB

Contents

# encoding: utf-8
require 'open3'
require 'shellwords'
require 'metric_fu'
MetricFu.lib_require { 'logging/mf_debugger' }
MetricFu.lib_require { 'gem_version' }
module MetricFu
  class GemRun

    attr_reader :output, :gem_name, :library_name, :version, :arguments
    def initialize(arguments={})
      @gem_name    = arguments.fetch(:gem_name)
      @library_name = arguments.fetch(:metric_name)
      @version = arguments.fetch(:version) { MetricFu::GemVersion.for(library_name) }
      args = arguments.fetch(:args)
      @arguments = args.respond_to?(:scan) ? Shellwords.shellwords(args) : args
      @output = ''
      @errors = []
    end

    def summary
      "RubyGem #{gem_name}, library #{library_name}, version #{version}, arguments #{arguments}"
    end

    def run
      @output = execute
    end

    def execute
      mf_debug "Running #{summary}"
      captured_output = ''
      Open3.popen3("#{library_name}", *arguments) do |stdin, stdout, stderr, wait_thr|
        captured_output << stdout.read.chomp
      end
    rescue StandardError => run_error
      handle_run_error(run_error)
    rescue SystemExit => system_exit
      handle_system_exit(system_exit)
    ensure
      print_errors
      return captured_output
    end

    def handle_run_error(run_error)
      @errors << "ERROR: #{run_error.inspect}"
    end

    def handle_system_exit(system_exit)
      status =  system_exit.success? ? "SUCCESS" : "FAILURE"
      message = "#{status} with code #{system_exit.status}: " <<
        "#{system_exit.message}: #{system_exit.backtrace.inspect}"
      if status == 'SUCCESS'
        mf_debug message
      else
        @errors << message
      end
    end

    def print_errors
      return if @errors.empty?
      STDERR.puts "ERRORS running #{summary}"
      @errors.each do |error|
        STDERR.puts "\t" << error
      end
    end

  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
metric_fu-4.9.0 lib/metric_fu/gem_run.rb
metric_fu-4.8.0 lib/metric_fu/gem_run.rb
metric_fu-4.7.4 lib/metric_fu/gem_run.rb
metric_fu-4.7.3 lib/metric_fu/gem_run.rb
metric_fu-4.7.2 lib/metric_fu/gem_run.rb
metric_fu-4.7.1 lib/metric_fu/gem_run.rb
metric_fu-4.7.0 lib/metric_fu/gem_run.rb
metric_fu-4.6.0 lib/metric_fu/gem_run.rb
metric_fu-4.5.2 lib/metric_fu/gem_run.rb
metric_fu-4.5.1 lib/metric_fu/gem_run.rb