class Bundler::Graph

Constants

GRAPH_NAME

Attributes

edge_options[R]
groups[R]
node_options[R]
output_file[R]
output_format[R]
relations[R]

Public Class Methods

new(env, output_file, show_version = false, show_requirements = false, output_format = "png", without = []) click to toggle source
# File lib/bundler/graph.rb, line 6
def initialize(env, output_file, show_version = false, show_requirements = false, output_format = "png", without = [])
  @env               = env
  @output_file       = output_file
  @show_version      = show_version
  @show_requirements = show_requirements
  @output_format     = output_format
  @without_groups    = without.map(&:to_sym)

  @groups            = []
  @relations         = Hash.new {|h, k| h[k] = Set.new}
  @node_options      = {}
  @edge_options      = {}

  _patching_gem_dependency_class
  _populate_relations
end

Public Instance Methods

viz() click to toggle source
# File lib/bundler/graph.rb, line 25
def viz
  GraphVizClient.new(self).run
end

Private Instance Methods

_groups() click to toggle source
# File lib/bundler/graph.rb, line 56
def _groups
  relations = Hash.new {|h, k| h[k] = Set.new}
  @env.current_dependencies.each do |dependency|
    dependency.groups.each do |group|
      next if @without_groups.include?(group)

      relations[group.to_s].add(dependency)
      @relations[group.to_s].add(dependency.name)

      @node_options[group.to_s] ||= _make_label(group, :node)
      @edge_options["#{group}_#{dependency.name}"] = _make_label(dependency, :edge)
    end
  end
  @groups = relations.keys
  relations
end
_make_label(symbol_or_string_or_dependency, element_type) click to toggle source
# File lib/bundler/graph.rb, line 73
def _make_label(symbol_or_string_or_dependency, element_type)
  case element_type.to_sym
  when :node
    if symbol_or_string_or_dependency.is_a?(Gem::Dependency)
      label = symbol_or_string_or_dependency.name.dup
      label << "\n#{symbol_or_string_or_dependency.to_spec.version.to_s}" if @show_version
    else
      label = symbol_or_string_or_dependency.to_s
    end
  when :edge
    label = nil
    if symbol_or_string_or_dependency.respond_to?(:requirements_list) && @show_requirements
      tmp = symbol_or_string_or_dependency.requirements_list.join(", ")
      label = tmp if tmp != ">= 0"
    end
  else
    raise ArgumentError, "2nd argument is invalid"
  end
  label.nil? ? {} : { :label => label }
end
_patching_gem_dependency_class() click to toggle source
# File lib/bundler/graph.rb, line 94
def _patching_gem_dependency_class
  # method borrow from rubygems/dependency.rb
  # redefinition of matching_specs will also redefine to_spec and to_specs
  Gem::Dependency.class_eval do
    def matching_specs platform_only = false
      matches = Bundler.load.specs.select { |spec|
        self.name == spec.name and
          requirement.satisfied_by? spec.version
      }

      if platform_only
        matches.reject! { |spec|
          not Gem::Platform.match spec.platform
        }
      end

      matches = matches.sort_by { |s| s.sort_obj } # HACK: shouldn't be needed
    end
  end
end
_populate_relations() click to toggle source
# File lib/bundler/graph.rb, line 31
def _populate_relations
  parent_dependencies = _groups.values.to_set.flatten
  while true
    if parent_dependencies.empty?
      break
    else
      tmp = Set.new
      parent_dependencies.each do |dependency|
        # if the dependency is a prerelease, allow to_spec to be non-nil
        dependency.prerelease = true

        child_dependencies = dependency.to_spec.runtime_dependencies.to_set
        @relations[dependency.name] += child_dependencies.map(&:name).to_set
        tmp += child_dependencies

        @node_options[dependency.name] = _make_label(dependency, :node)
        child_dependencies.each do |c_dependency|
          @edge_options["#{dependency.name}_#{c_dependency.name}"] = _make_label(c_dependency, :edge)
        end
      end
      parent_dependencies = tmp
    end
  end
end
matching_specs(platform_only = false) click to toggle source
# File lib/bundler/graph.rb, line 98
def matching_specs platform_only = false
  matches = Bundler.load.specs.select { |spec|
    self.name == spec.name and
      requirement.satisfied_by? spec.version
  }

  if platform_only
    matches.reject! { |spec|
      not Gem::Platform.match spec.platform
    }
  end

  matches = matches.sort_by { |s| s.sort_obj } # HACK: shouldn't be needed
end