shreyasbharath/cpp_dependency_graph

View on GitHub
exe/cpp_dependency_graph

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

# frozen_string_literal: true

#--
# Copyright (c) 2018 Shreyas Balakrishna

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#++

require 'docopt'
require 'cpp_dependency_graph'

# require 'ruby-prof'

include CppDependencyGraph

# RubyProf.start

doc = <<DOCOPT
  Cpp Dependency Graph

  Usage:
    cpp_dependency_graph visualise_component --root_dir <argument> --component <component> [--output_file <file>] [--output_format <format>]
    cpp_dependency_graph visualise_project --root_dir <argument> [--output_file <file>] [--output_format <format>]
    cpp_dependency_graph visualise_component_includes --root_dir <argument> --component <component> [--output_file <file>] [--output_format <format>]
    cpp_dependency_graph visualise_header_includes --root_dir <argument> --header <header> [--output_file <file>] [--output_format <format>]
    cpp_dependency_graph visualise_project_includes --root_dir <argument> [--output_file <file>] [--output_format <format>]
    cpp_dependency_graph visualise_components --root_dir <argument> [--output_file <file>] [--output_format <format>]
    cpp_dependency_graph visualise_cyclic_deps --root_dir <argument> [--component <component>] [--output_file <file>] [--output_format <format>]
    cpp_dependency_graph list_components --root_dir <argument>
    cpp_dependency_graph -h | --help | -v | --version

  Options:
    -h --help                   show this help message and exit
    -v --version                show version and exit
    -r --root_dir dir           top level root directory of C/C++ project
    -o --output_file file       name of output file to be generated [default: deps.html]
    -f --output_format format   format of output file (svg, html, graphml, json) [default: html]
    --component component       component generate visualisation for (case sensitive!)
    --header file               header file to generate visualisation for (case sensitive!)
DOCOPT

begin
  args = Docopt.docopt(doc)

  if args['--version']
    puts VERSION
    Kernel.exit(0)
  end

  project_dir = args['--root_dir'].tr('\\', '/')

  unless File.directory?(project_dir)
    puts('Not a valid project source directory')
    Kernel.exit(1)
  end

  if args['visualise_component']
    generate_component_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
  elsif args['visualise_project']
    generate_project_graph(project_dir, args['--output_format'], args['--output_file'])
  elsif args['visualise_component_includes']
    generate_component_include_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
  elsif args['visualise_header_includes']
    generate_file_include_graph(project_dir, args['--header'], args['--output_format'], args['--output_file'])
  elsif args['visualise_project_includes']
    generate_project_include_graph(project_dir, args['--output_format'], args['--output_file'])
  elsif args['visualise_components']
    generate_enclosure_diagram(project_dir, args['--output_file'])
  elsif args['visualise_cyclic_deps']
    generate_cyclic_dependencies(project_dir, args['--output_format'], args['--output_file'])
  elsif args['list_components']
    list_components(project_dir)
  end
rescue Docopt::Exit => e
  puts e.message
end

# result = RubyProf.stop
# printer = RubyProf::CallTreePrinter.new(result)
# printer.print(path: '.', profile: 'cpp_dependency_graph')