StateMachines::Graphviz
This adds support for generating di-graphs based on the events, states, and transitions defined for a state machine using GraphViz.
Installation
Add this line to your application's Gemfile:
gem 'state_machines-graphviz' , group: :development
And then execute:
$ bundle
Or install it yourself as:
$ gem install state_machines-graphviz
Usage
The default output folder for the images is doc/state_machines
.
Examples
To generate a graph for a specific file / class:
rake state_machines:draw FILE=vehicle.rb CLASS=Vehicle
From a Rails app directory:
rake state_machines:draw CLASS=Vehicle
To save files to a specific path:
rake state_machines:draw FILE=vehicle.rb CLASS=Vehicle TARGET=files
To customize the image format / orientation:
rake state_machines:draw FILE=vehicle.rb CLASS=Vehicle FORMAT=jpg ORIENTATION=landscape
See http://rdoc.info/github/glejeune/Ruby-Graphviz/GraphViz/Constants for the list of supported image formats. If resolution is an issue, the svg format may offer better results.
To generate multiple state machine graphs:
rake state_machines:draw FILE=vehicle.rb,car.rb CLASS=Vehicle,Car
To use human state / event names:
rake state_machines:draw FILE=vehicle.rb CLASS=Vehicle HUMAN_NAMES=true
Note that this will generate a different file for every state machine defined
in the class. The generated files will use an output filename of the format
#{class_name}_#{machine_name}.#{format}
.
For examples of actual images generated using this task, see those under the examples folder.
Interactive graphs
Jean Bovet's Visual Automata Simulator is a great tool for "simulating, visualizing and transforming finite state automata and Turing Machines". It can help in the creation of states and events for your models. It is cross-platform, written in Java.
Contributing
- Fork it ( https://github.com/state-machines/state_machines-graphviz/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request