Class: AppDrone::DependencyChain
- Inherits:
-
Object
- Object
- AppDrone::DependencyChain
- Defined in:
- lib/app_drone/dependency_chain.rb
Class Method Summary collapse
- .check_dependencies!(drones) ⇒ Object
- .satisfaction_requirements(drones) ⇒ Object
- .satisfied?(drones) ⇒ Boolean
- .sort(drones) ⇒ Object
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
7 8 9 |
# File 'lib/app_drone/dependency_chain.rb', line 7 def satisfied?(drones) satisfaction_requirements(drones).empty? end |
.sort(drones) ⇒ Object
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 |