# Example usage of dependency graph: Organize the nodes into layers # depending on their dependencies. Works with an existing dependency graph, # e.g. created by chart module dependencies example.
- # Author
-
Peter Kofler
- # Copyright
-
Copyright © 2012, Peter Kofler.
- # License
# # === Steps #
# require 'javaclass/dependencies/yaml_serializer' #
# 1) load dependency graph # plugins = JavaClass::Dependencies::YamlSerializer.new
.load('plugin_dependencies') # components = plugins.to_a #
# @layerOfComponents = [] #
# 2) find modules without any dependencies, these are the first/bottom # first_elements = components.find_all { |c| c.dependencies.size == 0 }.sort # @layerOfComponents << first_elements # components = components - first_elements #
# def has_all_deps_satisfied?(component) # already_sorted_dependencies = @layerOfComponents.flatten # component.dependencies.keys.find { |dependency| # !already_sorted_dependencies.include?(dependency) # } == nil # end #
# while components.size > 0 # cycle = true #
# # 3) for each component, check if all dependencies are satisfied combined layers below # components.each do |component| #
# if has_all_deps_satisfied?(component) # components -= [component] #
# # 4) if yes, walk up the dependencies until highest/lowest possible # index = @layerOfComponents.size - 1 # while (component.dependencies.keys.find { |dependency| @layerOfComponents.include?(dependency) } == nil) # index = index -1 # end # index = index + 1 # take next #
# # and add to the layers # if index == @layerOfComponents.size # @layerOfComponents = [] # end # @layerOfComponents << component #
# puts “added #{component}” # cycle = false # break # end #
# end #
# if cycle # warn “cycle in #{components.join(', ')}, can't continue with layering” # break # end # end #
# 5) output the found layering # (1..@layerOfComponents.size).each do |i| # layer = @layerOfComponents.sort # puts “#{i} ” + layer.join(', ') # end #