Module: FactoryGirl::DependencyTree

Defined in:
lib/factory_girl/dependency_tree.rb,
lib/factory_girl/dependency_tree/version.rb

Constant Summary collapse

VERSION =
"0.0.1"

Class Method Summary collapse

Class Method Details

.analyze!Object

Example method for kicking off a sample dependency analysis You should load your environment before calling this (e.g. use ‘rails runner`)



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/factory_girl/dependency_tree.rb', line 18

def analyze!
  # Install
  FactoryGirl.singleton_class.prepend(FactoryGirl::DependencyTree)

  # Run
  FactoryGirl.find_definitions if FactoryGirl.factories.none?
  FactoryGirl.factories.map(&:name).each do |f|
    begin
      FactoryGirl.create(f)
    rescue => e
      puts "Couldn't analyze factory #{f} due to #{e}"
    end
  end

  # Report
  puts "Printing the dependency tree of each FactoryGirl factory..."
  FactoryGirl::DependencyTree.forest.each do |t| 
    t.print_tree(t.node_depth, nil, -> (n, pre) { puts "#{pre} #{n.content}" }) 
  end

  puts '***'

  puts "Printing the FactoryGirl factories with more than one call to another single factory..."
  FactoryGirl::DependencyTree.forest.each do |tree|
    children = tree.each.to_a[1..-1]
    child_counts = children.map(&:content).reduce(Hash.new(0)) {|c,n| c[n] += 1; c} 
    puts "===\n#{tree.content}\n#{child_counts}" if child_counts.values.any? {|v| v > 1}
  end
end

.forestObject



63
64
65
# File 'lib/factory_girl/dependency_tree.rb', line 63

def forest
  @forest ||= []
end

.record(name) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/factory_girl/dependency_tree.rb', line 48

def record(name)
  if @node
    node = Tree::TreeNode.new(SecureRandom.uuid, name)
    @node << node
    @node = node
  else
    @node = Tree::TreeNode.new(SecureRandom.uuid, name)
    forest << @node
  end
  yield.tap { @node = @node.parent }
rescue => e
  @node = nil
  raise e
end