Skip to content

Commit f0e69ed

Browse files
author
Robin Randhawa
committed
Introduce names for FiniteMachine instances
1 parent 8b1e421 commit f0e69ed

File tree

6 files changed

+34
-9
lines changed

6 files changed

+34
-9
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Change Log
22

3+
## [v0.14.1] - 2021-08-08
4+
5+
### Added
6+
* Add ability to name a FiniteMachine
7+
38
## [v0.14.0] - 2020-09-12
49

510
### Added

README.md

+18-1
Original file line numberDiff line numberDiff line change
@@ -710,14 +710,31 @@ fm.stop # callbacks are fired
710710

711711
### 3.7 Logging transitions
712712

713-
To help debug your state machine, **FiniteMachine** provides `:log_transitions` option.
713+
To help debug your state machine, **FiniteMachine** provides a `:log_transitions` option.
714714

715715
```ruby
716716
FiniteMachine.new(log_transitions: true) do
717717
...
718718
end
719719
```
720720

721+
A FiniteMachine instance can optionally be given a name:
722+
723+
```ruby
724+
fm = FiniteMachine.new(name: 'TrafficLights', log_transitions: true) do
725+
initial :green
726+
727+
event :slow, :green => :yellow
728+
event :stop, :yellow => :red
729+
event :ready, :red => :yellow
730+
event :go, :yellow => :green
731+
end
732+
```
733+
734+
The name will then appear in transition logs which helps disambiguate events relevant to different state machines.
735+
736+
Note that if no name is specified a UUID is automatically generated and used as the default name.
737+
721738
### 3.8 Conditional transitions
722739

723740
Each event takes an optional `:if` and `:unless` options which act as a predicate for the transition. The `:if` and `:unless` can take a symbol, a string, a Proc or an array. Use `:if` option when you want to specify when the transition **should** happen. If you want to specify when the transition **should not** happen then use `:unless` option.

lib/finite_machine/logger.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ def format_error(error)
3030
message.join
3131
end
3232

33-
def report_transition(name, from, to, *args)
34-
message = ["Transition: @event=#{name} "]
33+
def report_transition(fsm_name, event_name, from, to, *args)
34+
message = ["StateMachine: #{fsm_name} Transition: @event=#{event_name} "]
3535
unless args.empty?
3636
message << "@with=[#{args.join(',')}] "
3737
end

lib/finite_machine/state_machine.rb

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require "forwardable"
4+
require "securerandom"
45

56
require_relative "catchable"
67
require_relative "dsl"
@@ -95,6 +96,7 @@ def initialize(*args, &block)
9596
@events_map = EventsMap.new
9697
@env = Env.new(self, [])
9798
@dsl = DSL.new(self, options)
99+
@name = options.fetch(:name, SecureRandom.uuid)
98100

99101
env.target = args.pop unless args.empty?
100102
env.aliases << options[:alias_target] if options[:alias_target]
@@ -352,11 +354,12 @@ def trigger(event_name, *data, &block)
352354
def transition!(event_name, *data, &block)
353355
from_state = current
354356
to_state = events_map.move_to(event_name, from_state, *data)
357+
fsm_name = @name
355358

356359
block.call(from_state, to_state) if block
357360

358361
if log_transitions
359-
Logger.report_transition(event_name, from_state, to_state, *data)
362+
Logger.report_transition(fsm_name, event_name, from_state, to_state, *data)
360363
end
361364

362365
try_trigger(event_name) { transition_to!(to_state) }

spec/unit/log_transitions_spec.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
after { FiniteMachine.logger = ::Logger.new($stderr) }
77

88
it "logs transitions" do
9-
fsm = FiniteMachine.new log_transitions: true do
9+
fsm = FiniteMachine.new name: 'TrafficLights', log_transitions: true do
1010
initial :green
1111

1212
event :slow, :green => :yellow
@@ -15,10 +15,10 @@
1515

1616
fsm.slow
1717
output.rewind
18-
expect(output.read).to match(/Transition: @event=slow green -> yellow/)
18+
expect(output.read).to match(/StateMachine: TrafficLights Transition: @event=slow green -> yellow/)
1919

2020
fsm.stop(1, 2)
2121
output.rewind
22-
expect(output.read).to match(/Transition: @event=stop @with=\[1,2\] yellow -> red/)
22+
expect(output.read).to match(/StateMachine: TrafficLights Transition: @event=stop @with=\[1,2\] yellow -> red/)
2323
end
2424
end

spec/unit/logger_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
end
3030

3131
it "reports transition" do
32-
logger.report_transition(:go, :red, :green)
32+
logger.report_transition('TrafficLights', :go, :red, :green)
3333

34-
expect(log).to have_received(:info).with("Transition: @event=go red -> green")
34+
expect(log).to have_received(:info).with("StateMachine: TrafficLights Transition: @event=go red -> green")
3535
end
3636
end

0 commit comments

Comments
 (0)