Skip to content

state-machines/state_machines-mermaid

Repository files navigation

StateMachines::Mermaid

CI Gem Version Supported Ruby

Mermaid diagram renderer for state_machines. Generate Mermaid state diagrams from your state machines.

Installation

Add this line to your application's Gemfile:

gem 'state_machines-mermaid'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install state_machines-mermaid

Usage

Basic Usage

require 'state_machines-mermaid'

class Order
  state_machine :status, initial: :pending do
    event :process do
      transition pending: :processing
    end
    
    event :ship do
      transition processing: :shipped
    end
    
    event :deliver do
      transition shipped: :delivered
    end
    
    event :cancel do
      transition [:pending, :processing] => :cancelled
    end
    
    state :delivered, :cancelled do
      def final?
        true
      end
    end
  end
end

# Generate Mermaid diagram
puts Order.state_machine(:status).draw

This generates:

stateDiagram-v2
  pending : pending
  processing : processing
  shipped : shipped
  delivered : delivered
  cancelled : cancelled
  pending --> processing : process
  processing --> shipped : ship
  shipped --> delivered : deliver
  pending --> cancelled : cancel
  processing --> cancelled : cancel
Loading

With Conditions

class Character
  state_machine :status, initial: :idle do
    event :attack do
      transition idle: :combat, if: :has_weapon?
    end
    
    event :rest do
      transition combat: :idle, unless: :in_danger?
    end
  end
end

# Generates transitions with conditions
puts Character.state_machine(:status).draw

Output includes conditions:

stateDiagram-v2
  idle : idle
  combat : combat
  idle --> combat : attack [if has_weapon?]
  combat --> idle : rest [unless in_danger?]
Loading

Show Callbacks

# Include callback information in the diagram
Character.state_machine(:status).draw(show_callbacks: true)

Output to File

File.open('state_diagram.mmd', 'w') do |file|
  Order.state_machine(:status).draw(io: file)
end

Integration with Mermaid Tools

The generated output is compatible with:

  • Mermaid Live Editor
  • GitHub Markdown (renders Mermaid diagrams natively)
  • Various documentation tools (GitLab, Notion, etc.)
  • Mermaid CLI for generating PNG/SVG files

Example: Complex State Machine

class Dragon
  state_machine :mood, initial: :sleeping do
    state :sleeping, :hunting, :hoarding, :rampaging
    
    event :wake_up do
      transition sleeping: :hunting, if: :hungry?
      transition sleeping: :hoarding, if: :treasure_nearby?
    end
    
    event :find_treasure do
      transition hunting: :hoarding
      transition hoarding: same  # Keep hoarding
    end
    
    event :enrage do
      transition any - :rampaging => :rampaging
    end
  end
end

puts Dragon.state_machine(:mood).draw

Features

  • Generates valid Mermaid state diagram syntax
  • Supports initial and final states
  • Shows transition conditions (if/unless)
  • Handles self-transitions (loopbacks)
  • Sanitizes state names for Mermaid compatibility
  • Optional callback visualization
  • Compatible with all state_machines features

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/state-machines/state_machines-mermaid.

License

The gem is available as open source under the terms of the MIT License.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages