class ParallelCalabash::FeatureGrouper

Public Class Methods

concurrent_feature_groups(feature_folder, number_of_groups) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 30
def concurrent_feature_groups(feature_folder, number_of_groups)
  groups = []
  (0...number_of_groups).each{ groups << feature_files_in_folder(feature_folder) }
  groups
end
feature_files_in_folder(feature_dir_or_file) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 86
def feature_files_in_folder(feature_dir_or_file)
  if File.directory?(feature_dir_or_file.first)
    files = Dir[File.join(feature_dir_or_file, "**{,/*/**}/*")].uniq
    files.grep(/\.feature$/)
  elsif feature_folder_has_single_feature?(feature_dir_or_file)
    feature_dir_or_file
  elsif File.file?(feature_dir_or_file.first)
    scenarios = File.open(feature_dir_or_file.first).collect{ |line| line.split(' ') }
    scenarios.flatten
  end
end
feature_folder_has_single_feature?(feature_dir) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 98
def feature_folder_has_single_feature?(feature_dir)
  feature_dir.first.include?('.feature')
end
feature_groups(options, group_size) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 7
def feature_groups(options, group_size)
  return concurrent_feature_groups(options[:feature_folder], group_size) if options[:concurrent]
  return scenario_groups group_size, options if options[:group_by_scenarios]
  return feature_groups_by_weight(options[:feature_folder], group_size,options[:distribution_tag]) if options[:distribution_tag]
  feature_groups_by_feature_files(options[:feature_folder], group_size)
end
feature_groups_by_feature_files(feature_folder, group_size) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 36
def feature_groups_by_feature_files(feature_folder, group_size)
  files = feature_files_in_folder feature_folder
  groups = group_creator group_size,files
  groups.reject(&:empty?)
end
feature_groups_by_scenarios(features_scenarios,group_size) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 14
def feature_groups_by_scenarios(features_scenarios,group_size)
  puts "Scenarios: #{features_scenarios.size}"
  min_number_scenarios_per_group = features_scenarios.size/group_size
  remaining_number_of_scenarios = features_scenarios.size % group_size
  groups = Array.new(group_size) { [] }
  groups.each do |group|
    min_number_scenarios_per_group.times { group << features_scenarios.delete_at(0) }
  end
  unless remaining_number_of_scenarios==0
    groups[0..(remaining_number_of_scenarios-1)].each do |group|
      group << features_scenarios.delete_at(0)
    end
  end
  groups.reject(&:empty?)
end
feature_groups_by_weight(feature_folder, group_size, weighing_factor) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 116
def feature_groups_by_weight(feature_folder, group_size, weighing_factor)
  features = features_with_weights feature_folder, weighing_factor
  feature_groups = Array.new(group_size).map{|e| e = []}
  features.each do |feature|
    feature_groups[index_of_lightest_group(feature_groups)] << feature
  end
  feature_groups.reject!{|group|  group.empty?}
  feature_groups.map{|group| group.map{|feature_hash| feature_hash[:feature]}}
end
features_with_weights(feature_dir, weighing_factor) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 107
def features_with_weights(feature_dir, weighing_factor)
  files = feature_files_in_folder feature_dir
  features_and_weight = []
  files.each do |file|
    features_and_weight << {:feature => file, :weight => weight_of_feature(file, weighing_factor)}
  end
  features_and_weight
end
generate_dry_run_report(options) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 82
def generate_dry_run_report options
  %x( cucumber #{options[:cucumber_options]} --dry-run -f json --out parallel_calabash_dry_run.json #{options[:feature_folder].join(' ')} )
end
group_creator(group_size, files) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 42
def group_creator group_size, files
  min_number_files_per_group = files.size/group_size
  remaining_number_of_files = files.size % group_size
  groups = Array.new(group_size) { [] }
  groups.each do |group|
    min_number_files_per_group.times { group << files.delete_at(0) }
  end
  unless remaining_number_of_files==0
    groups[0..(remaining_number_of_files-1)].each do |group|
      group << files.delete_at(0)
    end
  end
  groups.reject &:empty?
end
index_of_lightest_group(feature_groups) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 126
def index_of_lightest_group feature_groups
  lightest = feature_groups.min { |x, y| weight_of_group(x) <=> weight_of_group(y) }
  index = feature_groups.index(lightest)
end
scenario_groups(group_size, options) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 57
def scenario_groups group_size, options
  generate_dry_run_report options
  raise "Can not create dry run for scenario distribution" unless File.exists?("parallel_calabash_dry_run.json")
  distribution_data = JSON.parse(File.read("parallel_calabash_dry_run.json"))
  # puts "SCENARIO GROUPS #{distribution_data}"
  all_runnable_scenarios = distribution_data.map do |feature|
    unless feature["elements"].nil?
      feature["elements"].map do |scenario|
        if scenario["keyword"] == 'Scenario'
          "#{feature["uri"]}:#{scenario["line"]}"
        elsif scenario['keyword'] == 'Scenario Outline'
          if scenario["examples"]
            scenario["examples"].map { |example|
              "#{feature["uri"]}:#{example["line"]}"
            }
          else
            "#{feature["uri"]}:#{scenario["line"]}" # Cope with --expand
          end
        end
      end
    end
  end.flatten.compact
  groups = group_creator group_size,all_runnable_scenarios
end
weight_of_feature(feature_file, weighing_factor) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 102
def weight_of_feature(feature_file, weighing_factor)
  content = File.read(feature_file)
  content.scan(/#{weighing_factor}\b/).size
end
weight_of_group(group) click to toggle source
# File lib/parallel_calabash/feature_grouper.rb, line 131
def weight_of_group group
  group.inject(0) { |sum, b| sum + b[:weight] }
end