lib/railroady/diagram_graph.rb in railroady-1.5.3 vs lib/railroady/diagram_graph.rb in railroady-1.6.0

- old
+ new

@@ -1,13 +1,10 @@ -# RailRoady - RoR diagrams generator -# http://railroad.rubyforge.org -# -# Copyright 2007-2008 - Javier Smaldone (http://www.smaldone.com.ar) -# See COPYING for more details +# frozen_string_literal: true -# RailRoady diagram structure class DiagramGraph + attr_writer :diagram_type, :show_label, :alphabetize + def initialize @diagram_type = '' @show_label = false @alphabetize = false @nodes = [] @@ -20,27 +17,21 @@ def add_edge(edge) @edges << edge end - attr_writer :diagram_type - - attr_writer :show_label - - attr_writer :alphabetize - # Generate DOT graph def to_dot dot_header + @nodes.map { |n| dot_node n[0], n[1], n[2], n[3] }.join + @edges.map { |e| dot_edge e[0], e[1], e[2], e[3] }.join + dot_footer end # Generate XMI diagram (not yet implemented) def to_xmi - STDERR.print "Sorry. XMI output not yet implemented.\n\n" + $stderr.print "Sorry. XMI output not yet implemented.\n\n" '' end private @@ -60,72 +51,75 @@ # Build diagram label def dot_label "\t_diagram_info [shape=\"plaintext\", " \ "label=\"#{@diagram_type} diagram\\l" \ "Date: #{Time.now.strftime '%b %d %Y - %H:%M'}\\l" + - (defined?(ActiveRecord::Migrator) ? 'Migration version: ' \ - "#{Rails.logger.silence { ActiveRecord::Migrator.current_version } }\\l" : '') + + (if defined?(ActiveRecord::Migrator) + 'Migration version: ' \ + "#{Rails.logger.silence { ActiveRecord::Migrator.current_version }}\\l" + else + '' + end) + "Generated by #{APP_HUMAN_NAME} #{APP_VERSION}\\l" + 'http://railroady.prestonlee.com' \ "\\l\", fontsize=13]\n" end # Build a DOT graph node def dot_node(type, name, attributes = nil, custom_options = '') case type - when 'model' - options = 'shape=Mrecord, label="{' + name + '|' - options += attributes.sort_by { |s| @alphabetize ? s : nil }.join('\l') - options += '\l}"' - when 'model-brief' - options = '' - when 'class' - options = 'shape=record, label="{' + name + '|}"' - when 'class-brief' - options = 'shape=box' - when 'controller' - options = 'shape=Mrecord, label="{' + name + '|' - public_methods = attributes[:public].sort_by { |s| @alphabetize ? s : nil }.join('\l') - protected_methods = attributes[:protected].sort_by { |s| @alphabetize ? s : nil }.join('\l') - private_methods = attributes[:private].sort_by { |s| @alphabetize ? s : nil }.join('\l') - options += public_methods + '\l|' + protected_methods + '\l|' + - private_methods + '\l' - options += '}"' - when 'controller-brief' - options = '' - when 'module' - options = 'shape=box, style=dotted, label="' + name + '"' - when 'aasm' - # Return subgraph format - return "subgraph cluster_#{name.downcase} {\n\tlabel = #{quote(name)}\n\t#{attributes.join("\n ")}}" - end # case - options = [options, custom_options].compact.reject{|o| o.empty?}.join(', ') - return "\t#{quote(name)} [#{options}]\n" - end # dot_node + when 'model' + options = "shape=Mrecord, label=\"{#{name}|" + options += attributes.sort_by { |s| @alphabetize ? s : nil }.join('\l') + options += '\l}"' + when 'model-brief' + options = '' + when 'class' + options = "shape=record, label=\"{#{name}|}\"" + when 'class-brief' + options = 'shape=box' + when 'controller' + options = "shape=Mrecord, label=\"{#{name}|" + public_methods = attributes[:public].sort_by { |s| @alphabetize ? s : nil }.join('\l') + protected_methods = attributes[:protected].sort_by { |s| @alphabetize ? s : nil }.join('\l') + private_methods = attributes[:private].sort_by { |s| @alphabetize ? s : nil }.join('\l') + options += "#{public_methods}\\l|#{protected_methods}\\l|#{private_methods}\\l" + options += '}"' + when 'controller-brief' + options = '' + when 'module' + options = "shape=box, style=dotted, label=\"#{name}\"" + when 'aasm' + # Return subgraph format + return "subgraph cluster_#{name.downcase.gsub(/[^a-z0-9\-_]+/i, '_')} {\n\tlabel = #{quote(name)}\n\t#{attributes.join("\n ")}}" + end + options = [options, custom_options].compact.reject(&:empty?).join(', ') + "\t#{quote(name)} [#{options}]\n" + end # Build a DOT graph edge def dot_edge(type, from, to, name = '') options = name != '' ? "label=\"#{name}\", " : '' edge_color = '"#%02X%02X%02X"' % [rand(255), rand(255), rand(255)] suffix = ", dir=both color=#{edge_color}" case type - when 'one-one' - options += 'arrowtail=odot, arrowhead=dot' + suffix - when 'one-many' - options += 'arrowtail=odot, arrowhead=crow' + suffix - when 'many-many' - options += "arrowtail=crow, arrowhead=crow" + suffix - when 'belongs-to' - # following http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association - options += "arrowtail=none, arrowhead=normal" + suffix - when 'is-a' - options += 'arrowhead="none", arrowtail="onormal"' - when 'event' - options += 'fontsize=10' + when 'one-one' + options += "arrowtail=odot, arrowhead=dot#{suffix}" + when 'one-many' + options += "arrowtail=odot, arrowhead=crow#{suffix}" + when 'many-many' + options += "arrowtail=crow, arrowhead=crow#{suffix}" + when 'belongs-to' + # following http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association + options += "arrowtail=none, arrowhead=normal#{suffix}" + when 'is-a' + options += 'arrowhead="none", arrowtail="onormal"' + when 'event' + options += 'fontsize=10' end "\t#{quote(from)} -> #{quote(to)} [#{options}]\n" - end # dot_edge + end # Quotes a class name def quote(name) - '"' + name.to_s + '"' + "\"#{name}\"" end -end # class DiagramGraph +end