Class RDoc::Diagram
In: diagram.rb
Parent: Object

Draw a set of diagrams representing the modules and classes in the system. We draw one diagram for each file, and one for each toplevel class or module. This means there will be overlap. However, it also means that you‘ll get better context for objects.

To use, simply

  d = Diagram.new(info)   # pass in collection of top level infos
  d.draw

The results will be written to the dot subdirectory. The process also sets the diagram attribute in each object it graphs to the name of the file containing the image. This can be used by output generators to insert images.

Methods

draw   new  

Constants

FONT = "Arial"
DOT_PATH = "dot"

Public Class methods

Pass in the set of top level objects. The method also creates the subdirectory to hold the images

[Source]

    # File diagram.rb, line 36
36:     def initialize(info, options)
37:       @info = info
38:       @options = options
39:       @counter = 0
40:       File.makedirs(DOT_PATH)
41:     end

Public Instance methods

Draw the diagrams. We traverse the files, drawing a diagram for each. We also traverse each top-level class and module in that file drawing a diagram for these too.

[Source]

     # File diagram.rb, line 47
 47:     def draw
 48:       unless @options.quiet
 49:         $stderr.print "Diagrams: "
 50:         $stderr.flush
 51:       end
 52: 
 53:       @info.each_with_index do |i, file_count|
 54:         @done_modules = {}
 55:         @local_names = find_names(i)
 56:         @global_names = []
 57:         @global_graph = graph = DOT::DOTDigraph.new('name' => 'TopLevel',
 58:                                     'label' => i.file_absolute_name,
 59:                                     'fontname' => FONT,
 60:                                     'fontsize' => '8',
 61:                                     'bgcolor'  => 'lightcyan1',
 62:                                     'compound' => 'true')
 63:         
 64:         # it's a little hack %) i'm too lazy to create a separate class
 65:         # for default node
 66:         graph << DOT::DOTNode.new('name' => 'node',
 67:                                   'fontname' => FONT,
 68:                                   'color' => 'black',
 69:                                   'fontsize' => 8)
 70:         
 71:         i.modules.each do |mod|
 72:           draw_module(mod, graph, true, i.file_relative_name)
 73:         end
 74:         add_classes(i, graph, i.file_relative_name)
 75: 
 76:         i.diagram = convert_to_png("f_#{file_count}", graph, i.name)
 77:         
 78:         # now go through and document each top level class and
 79:         # module independently
 80:         i.modules.each_with_index do |mod, count|
 81:           @done_modules = {}
 82:           @local_names = find_names(mod)
 83:           @global_names = []
 84: 
 85:           @global_graph = graph = DOT::DOTDigraph.new('name' => 'TopLevel',
 86:                                       'label' => i.full_name,
 87:                                       'fontname' => FONT,
 88:                                       'fontsize' => '8',
 89:                                       'bgcolor'  => 'lightcyan1',
 90:                                       'compound' => 'true')
 91: 
 92:           graph << DOT::DOTNode.new('name' => 'node',
 93:                                     'fontname' => FONT,
 94:                                     'color' => 'black',
 95:                                     'fontsize' => 8)
 96:           draw_module(mod, graph, true)
 97:           mod.diagram = convert_to_png("m_#{file_count}_#{count}", 
 98:                                        graph, 
 99:                                        "Module: #{mod.name}")
100:         end
101:       end
102:       $stderr.puts unless @options.quiet
103:     end

[Validate]