class Pandan::Graph
Attributes
nodes[RW]
reverse[RW]
Public Class Methods
new(reverse)
click to toggle source
# File lib/pandan/graph.rb, line 24 def initialize(reverse) @nodes = {} @reverse = reverse end
Public Instance Methods
add_other_ld_flags_info(ld_flags_info)
click to toggle source
# File lib/pandan/graph.rb, line 40 def add_other_ld_flags_info(ld_flags_info) ld_flags_info.each do |target, ld_flags_per_config| node = node_for_target_display_name(target.display_name) ld_flags_per_config.each_value do |ld_flags| joined_flags = ld_flags.join(' ') joined_flags.match(/-l"(.*?)"/).captures.each { |library| add_as_neighbor(node, library) } joined_flags.match(/-framework "(.*?)"/).captures.each { |framework| add_as_neighbor(node, framework) } end end end
add_target_info(targets)
click to toggle source
# File lib/pandan/graph.rb, line 29 def add_target_info(targets) targets.each do |target| linked_libraries = find_linked_libraries(target) node = node_for_target_display_name(target.display_name) linked_libraries.each do |library_name| library_node = node_for_target_display_name(library_name) add_neighbor(node, library_node) end end end
resolve_dependencies(target)
click to toggle source
# File lib/pandan/graph.rb, line 51 def resolve_dependencies(target) resolved = [] target_node = nodes[target] raise "Target #{target} not found" if target_node.nil? resolve(target_node, resolved) resolved.delete(target_node) resolved end
Private Instance Methods
add_as_neighbor(node, item)
click to toggle source
# File lib/pandan/graph.rb, line 63 def add_as_neighbor(node, item) add_neighbor(node, node_for_target_display_name(item)) end
add_neighbor(source, destination)
click to toggle source
# File lib/pandan/graph.rb, line 76 def add_neighbor(source, destination) if reverse destination.add_neighbor(source) else source.add_neighbor(destination) end end
find_linked_libraries(target)
click to toggle source
# File lib/pandan/graph.rb, line 84 def find_linked_libraries(target) frameworks_build_phase = target.build_phases.find { |build_phase| build_phase.isa.eql? 'PBXFrameworksBuildPhase' } return [] unless frameworks_build_phase frameworks_build_phase.files.map { |file| file.display_name.gsub '.framework', '' } end
node_for_target_display_name(display_name)
click to toggle source
# File lib/pandan/graph.rb, line 67 def node_for_target_display_name(display_name) node = nodes[display_name] if node.nil? node = Node.new(display_name) nodes[display_name] = node end node end
resolve(node, resolved, resolving = [])
click to toggle source
# File lib/pandan/graph.rb, line 92 def resolve(node, resolved, resolving = []) resolving << node node.neighbors.each do |neighbor| next if resolved.include? neighbor raise "Found dependency cycle: #{node.name} -> #{neighbor.name}" if resolving.include? neighbor resolve(neighbor, resolved, resolving) end resolved << node resolving.delete(node) end