class AasmDiagram

Diagram for Acts As State Machine

Public Class Methods

new(options) click to toggle source
Calls superclass method AppDiagram.new
# File lib/railroad/aasm_diagram.rb, line 14
def initialize(options)
  #options.exclude.map! {|e| e = "app/models/" + e}
  super options 
  @graph.diagram_type = 'Models'
  # Processed habtm associations
  @habtm = []
end

Public Instance Methods

generate() click to toggle source

Process model files

# File lib/railroad/aasm_diagram.rb, line 23
def generate
  STDERR.print "Generating AASM diagram\n" if @options.verbose
  files = Dir.glob("app/models/**/*.rb") 
  files += Dir.glob("vendor/plugins/**/app/models/*.rb") if @options.plugins_models
  files -= @options.exclude
  files.each do |f| 
    process_class extract_class_name(f).constantize
  end
end

Private Instance Methods

load_classes() click to toggle source

Load model classes

# File lib/railroad/aasm_diagram.rb, line 36
def load_classes
  begin
    disable_stdout
    files = Dir.glob("app/models/**/*.rb")
    files += Dir.glob("vendor/plugins/**/app/models/*.rb") if @options.plugins_models
    files -= @options.exclude                  
    files.each {|m| require m }
    enable_stdout
  rescue LoadError
    enable_stdout
    print_error "model classes"
    raise
  end
end
process_class(current_class) click to toggle source

Process a model class

# File lib/railroad/aasm_diagram.rb, line 52
def process_class(current_class)
  
  STDERR.print "\tProcessing #{current_class}\n" if @options.verbose
  
  # Only interested in acts_as_state_machine models.
  return unless current_class.respond_to?'states'
  
  node_attribs = []
  node_type = 'aasm'
  
  current_class.states.each do |state_name|
    state = current_class.read_inheritable_attribute(:states)[state_name]
    node_shape = (current_class.initial_state === state_name) ? ", peripheries = 2" : ""
    node_attribs << "#{current_class.name.downcase}_#{state_name} [label=#{state_name} #{node_shape}];"
  end
  @graph.add_node [node_type, current_class.name, node_attribs]
  
  current_class.read_inheritable_attribute(:transition_table).each do |event_name, event|
    event.each do |transition|
      @graph.add_edge [
        'event', 
        current_class.name.downcase + "_" + transition.from.to_s, 
        current_class.name.downcase + "_" + transition.to.to_s, 
        event_name.to_s
      ]
    end
  end
end