module BenchmarkDriver::DefaultJobParser

Public Class Methods

for(klass:, metrics:) click to toggle source

Build default JobParser for given job klass

# File lib/benchmark_driver/default_job_parser.rb, line 4
def self.for(klass:, metrics:)
  Module.new.tap do |parser|
    class << parser
      include DefaultJobParser
    end
    parser.define_singleton_method(:job_class) { klass }
    parser.define_singleton_method(:job_metrics) { metrics }
  end
end

Public Instance Methods

parse(contexts: [], prelude: nil, benchmark:, teardown: nil, loop_count: nil, required_ruby_version: nil) click to toggle source

This method is dynamically called by `BenchmarkDriver::JobParser.parse` @param [String] prelude @param [String,Array<String,Hash{ Symbol => String }>,Hash{ Symbol => String }] benchmark @param [String] teardown @param [Integer] loop_count @param [String] required_ruby_version @return [Array<BenchmarkDriver::Default::Job>]

# File lib/benchmark_driver/default_job_parser.rb, line 21
def parse(contexts: [], prelude: nil, benchmark:, teardown: nil, loop_count: nil, required_ruby_version: nil)
  parse_benchmark(benchmark).each do |job|
    job.contexts = parse_contexts(contexts)
    job.metrics = job_metrics
    job.prelude.prepend("#{prelude}\n") if prelude
    job.teardown.prepend("#{teardown}\n") if teardown
    job.loop_count ||= loop_count
    job.required_ruby_version ||= required_ruby_version
  end
end

Private Instance Methods

job_class() click to toggle source
# File lib/benchmark_driver/default_job_parser.rb, line 67
def job_class
  raise NotImplementedError # override this
end
parse_benchmark(benchmark) click to toggle source

@param [String,Array<String,Hash{ Symbol => String }>,Hash{ Symbol => String }] benchmark

# File lib/benchmark_driver/default_job_parser.rb, line 35
def parse_benchmark(benchmark)
  case benchmark
  when String
    [parse_job(benchmark)]
  when Array
    benchmark.map { |b| parse_job(b) }
  when Hash
    benchmark.map do |key, value|
      job_class.new(name: key.to_s, script: value)
    end
  else
    raise ArgumentError.new("benchmark must be String, Array or Hash, but got: #{benchmark.inspect}")
  end
end
parse_context(name: nil, prelude: '', gems: {}, require: true) click to toggle source
# File lib/benchmark_driver/default_job_parser.rb, line 79
def parse_context(name: nil, prelude: '', gems: {}, require: true)
  gems.each do |gem, version|
    prelude = "gem '#{gem}', '#{version}'\n#{("require '#{gem}'\n" if require)}#{prelude}"
  end

  BenchmarkDriver::Context.new(
    name: name,
    gems: gems,
    prelude: prelude,
  )
end
parse_contexts(contexts) click to toggle source
# File lib/benchmark_driver/default_job_parser.rb, line 71
def parse_contexts(contexts)
  if contexts.is_a?(Array)
    contexts.map { |context| parse_context(**context) }
  else
    raise ArgumentError.new("contexts must be Array, but got: #{contexts.inspect}")
  end
end
parse_job(benchmark) click to toggle source

@param [String,Hash{ Symbol => String }>] bench

# File lib/benchmark_driver/default_job_parser.rb, line 51
def parse_job(benchmark)
  case benchmark
  when String
    job_class.new(name: benchmark, script: benchmark)
  when Hash
    parse_job_hash(**benchmark)
  else
    raise ArgumentError.new("Expected String or Hash in element of benchmark, but got: #{benchmark.inspect}")
  end
end
parse_job_hash(name: nil, prelude: '', script:, teardown: '', loop_count: nil, required_ruby_version: nil) click to toggle source
# File lib/benchmark_driver/default_job_parser.rb, line 62
def parse_job_hash(name: nil, prelude: '', script:, teardown: '', loop_count: nil, required_ruby_version: nil)
  name ||= script
  job_class.new(name: name, prelude: prelude, script: script, teardown: teardown, loop_count: loop_count, required_ruby_version: required_ruby_version)
end