Module: SnowyOwl::Plays

Defined in:
lib/snowy_owl/plays.rb

Defined Under Namespace

Classes: PlotNodeHash

Class Method Summary collapse

Class Method Details

.build_plays(candidate_play_books) ⇒ Object



22
23
24
25
26
27
# File 'lib/snowy_owl/plays.rb', line 22

def build_plays(candidate_play_books)
  @play_hash = {}
  @starting_node = nil
  candidate_play_books.each { |play_book| generate_digest_for_play_book play_book }
  generate_deep_first_plays
end

.create_node(plot) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/snowy_owl/plays.rb', line 60

def create_node plot
  plot_node = @play_hash[plot['digest']] || PlotNodeHash.new
  plot_node.name = plot['plot_name']
  plot_node.parent = plot['parent']
  plot_node.digest = plot['digest']
  @play_hash[plot['digest']] = plot_node
  if !plot['parent'].nil?
    parent_node = @play_hash[plot['parent']] || PlotNodeHash.new
    plot_node.parent = plot['parent']
    parent_node.append_child plot['digest']
    @play_hash[plot['parent']] = parent_node
  end
  @play_hash[plot['digest']]
end

.generate_deep_first_playsObject



35
36
37
38
39
40
41
42
43
44
# File 'lib/snowy_owl/plays.rb', line 35

def generate_deep_first_plays
  plays = []
  deep_stack = [@starting_node.digest]
  while !deep_stack.empty?
    node = deep_stack.pop
    deep_stack = deep_stack.concat @play_hash[node].children
    plays << @play_hash[node].to_h
  end
  plays
end

.generate_digest_for_play_book(play_book) ⇒ Object



29
30
31
32
33
# File 'lib/snowy_owl/plays.rb', line 29

def generate_digest_for_play_book play_book
  @play_hash ||= {}
  candidate_plots = YAML.load_file(play_book)
  generate_full_path_digest(candidate_plots)
end

.generate_full_path_digest(candidate_plots) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/snowy_owl/plays.rb', line 46

def generate_full_path_digest(candidate_plots)
  pre_digest = nil
  candidate_plots.each do |plot|
    parent_digest = plot['parent']
    digest = plot['digest']
    plot['digest'] = SnowyOwl::Digest.digest((parent_digest || pre_digest).to_s + plot['plot_name']) if digest.nil?
    plot['parent'] = pre_digest if parent_digest.nil?
    pre_digest = plot['digest']
    node = create_node plot
    @starting_node = node if node.parent.nil?
  end
  candidate_plots
end