module GemDependenciesVisualizer
Constants
- VERSION
Public Class Methods
produce_gems_graph(gem_file_content, gem_file_lock_content, graph_name = nil, options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 4 def self.produce_gems_graph(gem_file_content, gem_file_lock_content, graph_name = nil, options = {}) if gem_file_lock_content.nil? puts 'Please insert both Gemfile and Gemfile.lock contents to proceed or just Gemfile.lock content.' else g = GraphViz::new( :G, :type => :digraph ) g[:rankdir] = rankdir(options) data = populate_gem_data gem_file_content, gem_file_lock_content, options populate_gem_graph g, data, graph_name, options end end
produce_gems_graph_from_gemspec(gemspec_content, gem_file_lock_content, graph_name = nil, options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 16 def self.produce_gems_graph_from_gemspec(gemspec_content, gem_file_lock_content, graph_name = nil, options = {}) if gem_file_lock_content.nil? puts 'Please insert both gemspec and Gemfile.lock contents to proceed or just Gemfile.lock content.' else g = GraphViz::new( :G, :type => :digraph ) g[:rankdir] = rankdir(options) data = populate_gem_data_from_gemspec gemspec_content, gem_file_lock_content, options populate_gem_graph g, data, graph_name, options end end
Private Class Methods
clear_gem_name_from_version(name)
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 160 def self.clear_gem_name_from_version(name) name.gsub(/ \(.*\)/, '').gsub(' ', '') end
collect_gems_from_gemfile(gem_file_content, options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 41 def self.collect_gems_from_gemfile(gem_file_content, options = {}) unless gem_file_content.nil? (gem_file_content.scan /.*gem ['"](\S*)['"]/).flatten.uniq.sort end end
collect_gems_from_gemfile_lock(gem_file_lock_content, options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 53 def self.collect_gems_from_gemfile_lock(gem_file_lock_content, options = {}) string_array = gem_file_lock_content.gsub("\r\n", "\n").split("\n") gem_list_index = 0 gem_list = {} string_array.each_with_index do |x, index| if /.*specs:.*/.match x gem_list_index = index + 1 continue = true if options[:keep_gem_version] key = string_array[gem_list_index].strip else key = clear_gem_name_from_version string_array[gem_list_index] end values = [] gem_list_index += 1 while continue if /^ [\S]*( \(.*\))?$/.match string_array[gem_list_index] gem_list[key] = values if options[:keep_gem_version] key = string_array[gem_list_index].strip else key = clear_gem_name_from_version string_array[gem_list_index] end values = [] elsif /^ [\S]*( \(.*\))?$/.match string_array[gem_list_index] if options[:keep_gem_version] value = string_array[gem_list_index].strip else value = clear_gem_name_from_version string_array[gem_list_index] end values << value else gem_list[key] = values continue = false end gem_list_index += 1 end end end gem_list end
collect_gems_from_gemspec_file(gemspec_file_content, options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 47 def self.collect_gems_from_gemspec_file(gemspec_file_content, options = {}) unless gemspec_file_content.nil? (gemspec_file_content.scan /.*spec\.(add.*dependency|name.*=) ['"](?<attribute>\S*)['"]/).flatten.uniq.sort end end
populate_gem_data(gem_file_content, gemfile_lock_content, options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 115 def self.populate_gem_data(gem_file_content, gemfile_lock_content, options = {}) gem_dependencies = collect_gems_from_gemfile_lock gemfile_lock_content, options gems = collect_gems_from_gemfile gem_file_content, options { :gems => gems, :gem_dependencies => gem_dependencies } end
populate_gem_data_from_gemspec(gemspec_file_content, gemfile_lock_content, options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 105 def self.populate_gem_data_from_gemspec(gemspec_file_content, gemfile_lock_content, options = {}) gem_dependencies = collect_gems_from_gemfile_lock gemfile_lock_content, options gems = collect_gems_from_gemspec_file gemspec_file_content, options { :gems => gems, :gem_dependencies => gem_dependencies } end
populate_gem_graph(graph, data, graph_name = nil, options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 125 def self.populate_gem_graph(graph, data, graph_name = nil, options = {}) unless data[:gems].empty? default_node = graph.add_nodes('Default', :label => "<<b>Default</b>>", :color => 'dodgerblue3') data[:gems].each do |gem| new_node = graph.add_nodes(gem, :shape => :msquare, :color => 'firebrick3') graph.add_edges(default_node, new_node, :color => 'dodgerblue3') end end data[:gem_dependencies].sort_by { |dependency_item| dependency_item[0] }.each do |dependency_item| graph_parent_node = graph.add_nodes(dependency_item[0], :shape => :msquare, :color => 'firebrick3') dependency_item[1].each do |child_gem| graph_child_node = graph.add_nodes(child_gem, :shape => :msquare) graph.add_edges(graph_parent_node, graph_child_node, :color => 'firebrick3') end end directory_name = options[:specific_directory].nil? ? 'app/assets/images/gem_dependencies_graphs' : "#{options[:specific_directory]}/gem_dependencies_graphs" full_path = nil directory_name.split('/').each do |namespace| if full_path.nil? full_path = namespace else full_path = [full_path, namespace].join('/') end FileUtils.mkdir_p(full_path) unless File.directory?(full_path) end graph.output(:png => "#{directory_name}/#{graph_name.nil? ? "graph_sample" : graph_name }.png" ) end
rankdir(options = {})
click to toggle source
# File lib/gem_dependencies_visualizer.rb, line 32 def self.rankdir(options = {}) case options[:graph_direction] when 'top-bottom' then 'TB' when 'bottom-top' then 'BT' when 'right-left' then 'RL' else 'LR' end end