class StateMachines::Branch

Public Instance Methods

draw(graph, event, valid_states) click to toggle source

Draws a representation of this branch on the given graph. This will draw an edge between every state this branch matches from to either the configured to state or, if none specified, then a loopback to the from state.

For example, if the following from states are configured:

  • idling

  • first_gear

  • backing_up

…and the to state is parked, then the following edges will be created:

  • idling -> parked

  • first_gear -> parked

  • backing_up -> parked

Each edge will be labeled with the name of the event that would cause the transition.

# File lib/state_machines/graphviz/monkeypatch.rb, line 136
def draw(graph, event, valid_states)
  state_requirements.each do |state_requirement|
    # From states determined based on the known valid states
    from_states = state_requirement[:from].filter(valid_states)

    # If a to state is not specified, then it's a loopback and each from
    # state maps back to itself
    if state_requirement[:to].values.empty?
      loopback = true
    else
      to_state = state_requirement[:to].values.first
      to_state = to_state ? to_state.to_s : 'nil'
      loopback = false
    end

    # Generate an edge between each from and to state
    from_states.each do |from_state|
      from_state = from_state ? from_state.to_s : 'nil'
      graph.add_edges(from_state, loopback ? from_state : to_state, :label => event.to_s)
    end
  end

  true
end