Sha256: 3718e04e76a6198d63cce12b66fd8148755ad9c88662a21949fed92d6991ce62

Contents?: true

Size: 1.57 KB

Versions: 3

Compression:

Stored size: 1.57 KB

Contents

module FSM
  module Dot
    def self.included(includer)
      FSM::Machine.class_eval do 
        include(MachineInstanceMethods)
      end
      FSM::State.class_eval do 
        include(StateInstanceMethods)
      end
    end
    
    module MachineInstanceMethods
      # Convert this state machine to the dot format of graphviz
      def to_dot(options = {})
        s = self.states.map do |state|
          "  #{state.to_dot(options)};"
        end
        t = self.transitions.map do |transition|
          "  #{transition.to_dot(options)};"
        end
        "digraph FSM_#{@target_class.name} {\n#{s.join("\n")}\n\n#{t.join("\n")}\n}"
      end

      # 
      def draw_graph(options = {})
        format = options[:format] || :png
        extension = options[:extension] || format
        file_name = options[:outfile] || "#{@target_class.name.downcase}.#{extension}" 
        cmd = "dot -T#{format} -o#{file_name}"
        IO.popen cmd, 'w' do |io| 
          io.write to_dot
        end 
        raise 'dot failed' unless $?.success? 
      end      
    end
    
    module StateInstanceMethods
      def to_dot(options = {})
        if initial?
          attrs = "style=bold, label=\"#{self.name}\\n(initial)\""
        elsif final?  
          attrs = "style=bold"
        else
          attrs = ""
        end
        "#{self.name}[#{attrs}]"
      end
      
      
      # Is this state final?
      def final?
        @transitions.empty?
      end

      # Is this the initial state
      def initial?
        Machine[@target_class].initial_state_name == self.name
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
simplificator-fsm-0.3.9 lib/fsm/dot.rb
simplificator-fsm-0.3.8 lib/fsm/dot.rb
simplificator-fsm-0.3.7 lib/fsm/dot.rb