Class: Kettle::Family::ReleaseWaves

Inherits:
Object
  • Object
show all
Defined in:
lib/kettle/family/release_waves.rb

Instance Method Summary collapse

Constructor Details

#initialize(members:) ⇒ ReleaseWaves

Returns a new instance of ReleaseWaves.



6
7
8
# File 'lib/kettle/family/release_waves.rb', line 6

def initialize(members:)
  @members = members
end

Instance Method Details

#wavesObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/kettle/family/release_waves.rb', line 10

def waves
  by_name = members.to_h { |member| [member.name, member] }
  pending = by_name.keys
  completed = []
  [].tap do |planned_waves|
    until pending.empty?
      hard_ready = pending.select do |name|
        selected_hard_dependencies_for(by_name.fetch(name), by_name).all? { |dependency| completed.include?(dependency) }
      end
      raise Error, "cyclic release dependency order: #{pending.join(", ")}" if hard_ready.empty?

      wave_names = hard_ready.select do |name|
        selected_dependencies_for(by_name.fetch(name), by_name).all? { |dependency| completed.include?(dependency) }
      end
      wave_names = [hard_ready.first] if wave_names.empty?

      planned_waves << wave_names.map { |name| by_name.fetch(name) }
      completed.concat(wave_names)
      pending -= wave_names
    end
  end
end