shreyasbharath/cpp_dependency_graph

View on GitHub
lib/cpp_dependency_graph.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require_relative "cpp_dependency_graph/circle_packing_visualiser"
require_relative "cpp_dependency_graph/component_dependency_graph"
require_relative "cpp_dependency_graph/dir_tree"
require_relative "cpp_dependency_graph/graph_to_html_visualiser"
require_relative "cpp_dependency_graph/graph_to_svg_visualiser"
require_relative "cpp_dependency_graph/include_component_dependency_graph"
require_relative "cpp_dependency_graph/include_file_dependency_graph"
require_relative "cpp_dependency_graph/project"
require_relative "cpp_dependency_graph/version"
require_relative "cpp_dependency_graph/logging"

# Generates dependency graphs of a project in various output forms
module CppDependencyGraph
  include Logging

  def generate_project_graph(project_dir, format, output_file)
    logger.info "Resolving source directories in project..."
    project = Project.new(project_dir)
    logger.info "Resolving dependencies between components..."
    graph = ComponentDependencyGraph.new(project)
    logger.info "Generating graph..."
    deps = graph.all_links
    logger.info "Generating visualisation..."
    generate_visualisation(deps, format, output_file)
  end

  def generate_component_graph(project_dir, component, format, output_file)
    project = Project.new(project_dir)
    graph = ComponentDependencyGraph.new(project)
    deps = graph.links(component)
    generate_visualisation(deps, format, output_file)
  end

  def generate_file_include_graph(project_dir, file_name, format, output_file)
    project = Project.new(project_dir)
    graph = IncludeFileDependencyGraph.new(project)
    deps = graph.links(file_name)
    generate_visualisation(deps, format, output_file)
  end

  def generate_component_include_graph(project_dir, component_name, format, output_file)
    project = Project.new(project_dir)
    graph = IncludeComponentDependencyGraph.new(project)
    deps = graph.links(component_name)
    generate_visualisation(deps, format, output_file)
  end

  def generate_project_include_graph(project_dir, format, output_file)
    project = Project.new(project_dir)
    graph = IncludeComponentDependencyGraph.new(project)
    deps = graph.all_links
    generate_visualisation(deps, format, output_file)
  end

  def generate_enclosure_diagram(project_dir, output_file)
    dir_tree = DirTree.new(project_dir)
    tree = dir_tree.tree
    CirclePackingVisualiser.new.generate(tree, output_file)
  end

  def generate_cyclic_dependencies(project_dir, format, file)
    project = Project.new(project_dir)
    graph = ComponentDependencyGraph.new(project)
    deps = graph.all_cyclic_links
    generate_visualisation(deps, format, file)
  end

  def generate_visualisation(deps, format, file)
    case format
    when "svg"
      GraphToSvgVisualiser.new.generate(deps, file)
    when "html"
      GraphToHtmlVisualiser.new.generate(deps, file)
    when "json"
      File.write(file, JSON.pretty_generate(deps))
    end
  end

  def list_components(project_dir)
    logger.info "Resolving source directories in project..."
    project = Project.new(project_dir)
    project.source_components.each do |name, instance|
      logger.info "Component: #{name}, path: #{instance.path}"
    end
  end
end