class BenchmarkSpec

Attributes

after_hooks[RW]
before_hooks[RW]
config[RW]
description[RW]
execution[RW]
formatter[RW]
nested_specs[RW]
reports[RW]
tasks[RW]

Public Class Methods

configure(&block) click to toggle source
# File lib/benchmark_spec.rb, line 41
def configure(&block)
  BenchmarkSpec.config_proc = block
end
describe(description, &block) click to toggle source
# File lib/benchmark_spec.rb, line 55
def describe(description, &block)
  $benchmarks ||= []
  $benchmarks << BenchmarkSpec.new(description, execution: block)
end
evaluate_all() click to toggle source
# File lib/benchmark_spec.rb, line 60
def evaluate_all
  return unless $benchmarks

  $benchmarks.each {|b| b.evaluate}
end
load_files_recursively(path) click to toggle source
# File lib/benchmark_spec.rb, line 45
def load_files_recursively(path)
  Dir[path].each do |file|
    if File.directory? file
      load_files_recursively file + "/*"
    else
      require file if File.basename(file).match /benchmark\.rb$/
    end
  end
end
new(description, opts = {}) click to toggle source
# File lib/benchmark_spec.rb, line 23
def initialize(description, opts = {})
  @description = description
  @execution   = opts[:execution]

  @before_hooks = opts[:before_hooks] || {}
  @after_hooks  = opts[:after_hooks]  || {}

  @tasks        = []
  @nested_specs = []
  @reports      = []

  @formatter = opts[:formatter] || OutputFormatter.new

  @config ||= {}
  instance_exec @config, &config_proc if config_proc
end
run(args = []) click to toggle source
# File lib/benchmark_spec.rb, line 66
def run(args = [])
  base_path = Dir.pwd

  files_to_run = args.map{|path| "#{base_path}/#{path}"}
  files_to_run = ["#{base_path}/benchmark"] if files_to_run.empty?

  files_to_run.each do |f|
    load_files_recursively(f)
  end

  OutputFormatter.title("Benchmark Spec")

  evaluate_all

  OutputFormatter.title("Results")
ensure
  ReportPresenter.print_results($benchmarks)
end

Public Instance Methods

after(hook = :each, &block) click to toggle source
# File lib/benchmark_spec.rb, line 91
def after(hook = :each, &block)
  after_hooks[hook] ||= []
  after_hooks[hook] << block
end
before(hook = :each, &block) click to toggle source
# File lib/benchmark_spec.rb, line 86
def before(hook = :each, &block)
  before_hooks[hook] ||= []
  before_hooks[hook] << block
end
benchmark(description, &block) click to toggle source
# File lib/benchmark_spec.rb, line 106
def benchmark(description, &block)
  tasks << { description: description, execution: block }
end
describe(description, &block) click to toggle source
# File lib/benchmark_spec.rb, line 96
def describe(description, &block)
  spec_options = {}
  spec_options[:execution]    = block if block
  spec_options[:before_hooks] = before_hooks.dup
  spec_options[:after_hooks]  = after_hooks.dup
  spec_options[:formatter]    = OutputFormatter.new(indent_level: formatter.indent_level + 1)

  nested_specs << BenchmarkSpec.new(description, spec_options)
end
evaluate() click to toggle source
# File lib/benchmark_spec.rb, line 130
def evaluate
  if execution
    formatter.print "#{description}".colorize(:light_blue)

    instance_eval &execution

    run_all_tasks

    nested_specs.each do |ns|
      ns.evaluate
    end
  else
    pending(description)
  end
end
run_all_tasks() click to toggle source
# File lib/benchmark_spec.rb, line 110
def run_all_tasks
  return if tasks.empty?

  tasks.each do |t|
    begin
      pending t[:description] if t[:execution].nil?

      formatter.print "running #{t[:description]} ..."

      before_each_hooks.each {|b| b.call}
      report = Benchmark.measure(t[:description], &t[:execution])
      after_each_hooks.each {|a| a.call}

      reports << report
    rescue => e
      formatter.print "Error: #{e.message}".colorize(:red)
    end
  end
end

Private Instance Methods

after_each_hooks() click to toggle source
# File lib/benchmark_spec.rb, line 156
def after_each_hooks
  after_hooks[:each] || []
end
before_each_hooks() click to toggle source
# File lib/benchmark_spec.rb, line 152
def before_each_hooks
  before_hooks[:each] || []
end
pending(description) click to toggle source
# File lib/benchmark_spec.rb, line 148
def pending(description)
  formatter.print "Pending: #{description}".colorize(:yellow)
end