module BenchmarkDriver::JobParser

Public Class Methods

parse(config, default_params: {}) click to toggle source

@param [Hash] config @param [Hash] default_params - Special default values not written in job definition

# File lib/benchmark_driver/job_parser.rb, line 7
def parse(config, default_params: {})
  config = symbolize_keys(config)
  type = config.fetch(:type)
  if !type.is_a?(String)
    raise ArgumentError.new("Invalid type: #{config[:type].inspect} (expected String)")
  elsif !type.match(/\A[A-Za-z0-9_]+\z/)
    raise ArgumentError.new("Invalid type: #{config[:type].inspect} (expected to include only [A-Za-z0-9_])")
  end
  config.delete(:type)

  # Dynamic dispatch for plugin support
  require "benchmark_driver/runner/#{type}"
  job = ::BenchmarkDriver.const_get("Runner::#{camelize(type)}::JobParser", false).parse(config)
  default_params.each do |key, value|
    if job.respond_to?(key) && job.respond_to?("#{key}=") && job.public_send(key).nil?
      job.public_send("#{key}=", value)
    end
  end
  job
end

Private Class Methods

camelize(str) click to toggle source
# File lib/benchmark_driver/job_parser.rb, line 30
def camelize(str)
  str.split('_').map(&:capitalize).join
end
symbolize_keys(config) click to toggle source

@param [Object] config

# File lib/benchmark_driver/job_parser.rb, line 35
def symbolize_keys(config)
  case config
  when Hash
    config.dup.tap do |hash|
      hash.keys.each do |key|
        case key
        when String, Symbol
          hash[key.to_sym] = symbolize_keys(hash.delete(key))
        else # Struct
          hash[key] = symbolize_keys(hash.delete(key))
        end
      end
    end
  when Array
    config.map { |c| symbolize_keys(c) }
  else
    config
  end
end