Sha256: ef9e914001ff6e5c60b7d2a3d2f7cb9e3e19d96d847f511f4204a216b7298e10

Contents?: true

Size: 1.99 KB

Versions: 1

Compression:

Stored size: 1.99 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 = ''
      captured_errors = ''
      Open3.popen3("#{library_name}", *arguments) do |stdin, stdout, stderr, wait_thr|
        captured_output << stdout.read.chomp
        captured_errors << stderr.read.chomp
      end
      STDERR.puts MetricFu::AnalysisError.new(captured_errors) unless captured_errors.empty?
    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

1 entries across 1 versions & 1 rubygems

Version Path
metric_fu-4.10.0 lib/metric_fu/gem_run.rb