Sha256: 5009bfd8e9f01d87c221d1144935c266821fb9b79b2787d56a7912fc714650c8

Contents?: true

Size: 1.45 KB

Versions: 3

Compression:

Stored size: 1.45 KB

Contents

require File.join(File.dirname(__FILE__),'../vizier')
require 'tempfile'

module StateFu
  class Plotter
    attr_reader :machine, :dot, :graph, :states, :events

    OUTPUT_HELPER = Module.new do

      def save!
        Tempfile.new(['state_fu_graph','.dot']) do |fh|
          fh.write( self )
        end.path
      end

      def save_as( filename )
        File.open(filename, 'w') { |fh| fh.write( self ) }
      end

      def save_png(filename)
        raise NotImplementedError
        # dot graph.dot -Tpng -O
      end

    end

    def output
      generate
    end

    def initialize( machine, options={} )
      raise RuntimeError, machine.class.to_s unless machine.is_a?(StateFu::Machine)
      @machine = machine
      @options = options.symbolize_keys!
      @states  = {}
      @events  = {}
      # generate
    end

    def generate
      @dot ||= generate_dot!.extend( OUTPUT_HELPER )
    end

    def generate_dot!
      @graph = Vizier::Graph.new(:state_machine) do |g|
        g.node :shape => 'doublecircle'
        machine.state_names.map.each do |s|
          @states[s] = g.add_node(s.to_s)
        end
        machine.events.map.each do |e|
          e.origins.map(&:name).each do |from|
            e.targets.map(&:name).each do |to|
              g.connect( @states[from], @states[to], :label => e.name.to_s )
            end
          end
          # @events[s] = g.add_node(s.to_s)
        end
      end
      @graph.generate!
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
davidlee-state-fu-0.10.0 lib/state_fu/plotter.rb
davidlee-state-fu-0.11.0 lib/state_fu/plotter.rb
davidlee-state-fu-0.3.1 lib/state_fu/plotter.rb