lib/cpp_dependency_graph.rb
# 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