Class: AppDrone::DependencyChain

Inherits:
Object
  • Object
show all
Defined in:
lib/app_drone/dependency_chain.rb

Class Method Summary collapse

Class Method Details

.check_dependencies!(drones) ⇒ Object



16
17
18
# File 'lib/app_drone/dependency_chain.rb', line 16

def check_dependencies!(drones)
  raise "Unsatisfied dependencies: #{satisfaction_requirements(drones)}" unless satisfied?(drones)
end

.satisfaction_requirements(drones) ⇒ Object



11
12
13
14
# File 'lib/app_drone/dependency_chain.rb', line 11

def satisfaction_requirements(drones)
  all_dependencies = drones.map(&:dependencies).flatten.uniq
  return all_dependencies - drones
end

.satisfied?(drones) ⇒ Boolean

Returns:

  • (Boolean)


7
8
9
# File 'lib/app_drone/dependency_chain.rb', line 7

def satisfied?(drones)
  satisfaction_requirements(drones).empty?
end

.sort(drones) ⇒ Object

Raises:

  • (ArgumentError)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/app_drone/dependency_chain.rb', line 20

def sort(drones)
  raise ArgumentError unless drones.is_a?(Array)
  check_dependencies!(drones)

  misplaced_drone = drones.reverse.find do |drone|
    # working from the bottom of the list upwards,
    # try to find a drone who is below one of their dependencies
    dependency_indices(drones,drone).any? { |dependency_index| drones.index(drone) < dependency_index }
  end

  if misplaced_drone
    # move it to where it belongs
    drones_sans_misplaced = drones - [misplaced_drone]
    drone_new_index = last_dependency_index(drones_sans_misplaced,misplaced_drone) + 1
    shuffled_drones = drones_sans_misplaced.insert(drone_new_index,misplaced_drone)

    # resolve recursively
    return sort(shuffled_drones)
  else
    return drones
  end
end