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